1 /*
2 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /**
19 * DOC : lim_mlo.h
20 *
21 * WLAN Host Device Driver file for 802.11be (Extremely High Throughput)
22 * support.
23 *
24 */
25
26 #if !defined(LIM_MLO_H)
27 #define LIM_MLO_H
28
29 #include "ani_global.h"
30 #include "lim_session.h"
31 #include <wlan_mlo_mgr_public_structs.h>
32
33 #ifdef WLAN_FEATURE_11BE_MLO
34
35 /**
36 * lim_update_partner_link_info - Update partner link information
37 *
38 * This function is triggered from mlo mgr
39 *
40 * @vdev: vdev pointer
41 *
42 * Return: QDF_STATUS_SUCCESS on successful update link info else failure.
43 */
44 QDF_STATUS lim_partner_link_info_change(struct wlan_objmgr_vdev *vdev);
45
46 /**
47 * lim_mlo_free_vdev_ref() - release vdev reference
48 * @vdev: vdev obj
49 *
50 * Return: void
51 */
52 void lim_mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev);
53
54 /**
55 * pe_find_partner_session_by_link_id() - Get partner session by link id
56 * @session: pe session
57 * @link_id: link id
58 *
59 * Return: partner session
60 */
61 struct pe_session *pe_find_partner_session_by_link_id(
62 struct pe_session *session, uint8_t link_id);
63
64 /**
65 * lim_get_mlo_vdev_list() - Get mlo vdev list
66 * @session: pe session
67 * @vdev_count: vdev count
68 * @wlan_vdev_list: vdev list
69 *
70 * Return: void
71 */
72 void lim_get_mlo_vdev_list(struct pe_session *session, uint16_t *vdev_count,
73 struct wlan_objmgr_vdev **wlan_vdev_list);
74
75 /**
76 * lim_mlo_roam_peer_disconn_del - trigger mlo to delete partner peer
77 * This API is only for MLO STA roam.
78 * @vdev: vdev pointer
79 *
80 * Return: void
81 */
82 void lim_mlo_roam_peer_disconn_del(struct wlan_objmgr_vdev *vdev);
83
84 /**
85 * lim_mlo_notify_peer_disconn - trigger mlo to delete partner peer
86 * @pe_session: pe session
87 * @sta_ds: Pointer to internal STA Datastructure
88 *
89 * Return: void
90 */
91 void lim_mlo_notify_peer_disconn(struct pe_session *pe_session,
92 tpDphHashNode sta_ds);
93
94 /**
95 * lim_mlo_sta_notify_peer_disconn - trigger mlo to delete partner peer
96 * This API is only for MLO STA.
97 * @pe_session: pe session
98 *
99 * Return: void
100 */
101 void lim_mlo_sta_notify_peer_disconn(struct pe_session *pe_session);
102
103 /**
104 * lim_mlo_cleanup_partner_peer() - cleanup given peer which is partner peer
105 * of mlo connection.
106 *
107 * This function is triggered from mlo mgr.
108 *
109 * @peer: pointer to peer to be cleanup
110 *
111 * Return: void
112 */
113 void lim_mlo_cleanup_partner_peer(struct wlan_objmgr_peer *peer);
114
115 /**
116 * lim_mlo_set_mld_mac_peer() - set mld mac
117 * @sta_ds: Pointer to internal STA Datastructure
118 * @peer_mld_addr: peer mld mac addr
119 *
120 * Return: void
121 */
122 void lim_mlo_set_mld_mac_peer(tpDphHashNode sta_ds,
123 uint8_t peer_mld_addr[QDF_MAC_ADDR_SIZE]);
124
125 /**
126 * lim_is_mlo_conn() - whether it is mlo connection
127 * @session: pe session
128 * @sta_ds: Pointer to internal STA Datastructure
129 *
130 * Return: true if it is mlo connection
131 */
132 bool lim_is_mlo_conn(struct pe_session *session, tpDphHashNode sta_ds);
133
134 /**
135 * lim_is_mlo_recv_assoc() - whether it received assoc frame or not
136 * @sta_ds: Pointer to internal STA Datastructure
137 *
138 * Return: true if this peer corresponding link received assoc frame
139 */
140 bool lim_is_mlo_recv_assoc(tpDphHashNode sta_ds);
141
142 /**
143 * lim_set_mlo_recv_assoc() - set received assoc frame flag
144 * @sta_ds: Pointer to internal STA Datastructure
145 * @mlo_recv_assoc_frm: true if it received assoc frame
146 *
147 * Return: void
148 */
149 void lim_set_mlo_recv_assoc(tpDphHashNode sta_ds, bool mlo_recv_assoc_frm);
150
151 /**
152 * lim_mlo_proc_assoc_req_frm() - process assoc frame for mlo partner link
153 *
154 * This function is triggered by mlo mgr
155 *
156 * @vdev: pointer to vdev
157 * @ml_peer: pointer to ml_peer
158 * @link_addr: link addr
159 * @frm_buf: assoc req buffer
160 *
161 * This function is called from mlo mgr.
162 *
163 * Return: QDF_STATUS
164 */
165 QDF_STATUS lim_mlo_proc_assoc_req_frm(struct wlan_objmgr_vdev *vdev,
166 struct wlan_mlo_peer_context *ml_peer,
167 struct qdf_mac_addr *link_addr,
168 qdf_nbuf_t buf);
169
170 /**
171 * lim_mlo_ap_sta_assoc_suc() - process add sta rsp for mlo connection
172 * @peer: pointer to peer to handle add sta response
173 *
174 * This function is triggered from mlo mgr.
175 *
176 * Return: void
177 */
178 void lim_mlo_ap_sta_assoc_suc(struct wlan_objmgr_peer *peer);
179
180 /**
181 * lim_ap_mlo_sta_peer_ind() - Indicate mlo mgr after receiving sta rsp
182 *
183 * @mac: pointer to mac_context
184 * @pe_session: pe session
185 * @sta_ds: Pointer to internal STA Datastructure
186 * @add_sta_rsp_status: add sta rsp status
187 *
188 * Return: void
189 */
190 void lim_ap_mlo_sta_peer_ind(struct mac_context *mac,
191 struct pe_session *pe_session,
192 tpDphHashNode sta,
193 bool add_sta_rsp_status);
194
195 /**
196 * lim_mlo_partner_auth_type: update auth type from partner
197 * @session: pe session
198 * @partner_peer_idx: aid
199 * @auth_type: auth type to update
200 *
201 * Return: true if auth type is gotten successfully
202 */
203 bool lim_mlo_partner_auth_type(struct pe_session *session,
204 uint16_t partner_peer_idx,
205 tAniAuthType *auth_type);
206
207 /**
208 * lim_mlo_ap_sta_assoc_fail() - process add sta rsp fail for mlo connection
209 * @peer: pointer to peer to handle add sta response
210 *
211 * This function is triggered from mlo mgr.
212 *
213 * Return: void
214 */
215 void lim_mlo_ap_sta_assoc_fail(struct wlan_objmgr_peer *peer);
216
217 /**
218 * lim_mlo_delete_link_peer() - notify mlo mgr peer obj is deleted
219 * @pe_session: pe session
220 * @sta_ds: Pointer to internal STA Datastructure
221 *
222 * Return: void
223 */
224 void lim_mlo_delete_link_peer(struct pe_session *pe_session,
225 tpDphHashNode sta_ds);
226
227 /**
228 * lim_mlo_assoc_ind_upper_layer() - indicate assoc confirm to upper layer
229 * for mlo partner link
230 * @mac: pointer to mac_context
231 * @pe_session: pe session
232 * @mlo_info: mlo partner information
233 *
234 * Return: QDF_STATUS
235 */
236 QDF_STATUS lim_mlo_assoc_ind_upper_layer(struct mac_context *mac,
237 struct pe_session *pe_session,
238 struct mlo_partner_info *mlo_info);
239 void lim_mlo_save_mlo_info(tpDphHashNode sta_ds,
240 struct mlo_partner_info *mlo_info);
241
242 /**
243 * lim_add_frag_ie_for_sta_profile() - add frag IE if STA prof len more than 255
244 * @data: sta profile ie data
245 * @len: the length of the data
246 *
247 * Return: QDF_STATUS
248 */
249 QDF_STATUS lim_add_frag_ie_for_sta_profile(uint8_t *data, uint16_t *len);
250
251 /**
252 * lim_fill_complete_mlo_ie() - fill mlo ie to target buffer
253 * @session: pointer to pe_session
254 * @total_len: the total bytes to fill target buffer
255 * @target: the buffer to fill data
256 *
257 * It also will insert the frag IE WLAN_ELEMID_FRAGMENT if the ML IE's length
258 * more than 255 bytes.
259 *
260 * Return: QDF_STATUS
261 */
262 QDF_STATUS lim_fill_complete_mlo_ie(struct pe_session *session,
263 uint16_t total_len, uint8_t *target);
264
265 /**
266 * lim_caculate_mlo_ie_length() - calculate the ML IE length
267 * @mlo_ie: the pointer to wlan_mlo_ie
268 *
269 * It tries to add the len of frag IE WLAN_ELEMID_FRAGMENT if the ML IE
270 * length more than 255 bytes.
271 *
272 * Return: QDF_STATUS
273 */
274 uint16_t lim_caculate_mlo_ie_length(struct wlan_mlo_ie *mlo_ie);
275
276 /**
277 * lim_fill_assoc_req_mlo_ie() - Prepare ML IE for assoc req frame
278 * @mac_ctx: pointer to mac_context
279 * @session: pointer to pe_session
280 * @frm: pointer to tDot11fAssocRequest
281 *
282 * Return: the actual ML IE length
283 */
284 uint16_t
285 lim_fill_assoc_req_mlo_ie(struct mac_context *mac_ctx,
286 struct pe_session *session,
287 tDot11fAssocRequest *frm);
288
289 /**
290 * lim_send_assoc_rsq_mgmt_frame_mlo() - Prepare ML IE for assoc rsq frame
291 * @mac_ctx: pointer to mac_context
292 * @session: pointer to pe_session
293 * @sta: pointer to tpDphHashNode
294 * @frm: pointer to tDot11fAssocRequest
295 *
296 * Return: the actual ML IE length
297 */
298 uint16_t
299 lim_send_assoc_rsp_mgmt_frame_mlo(struct mac_context *mac_ctx,
300 struct pe_session *session,
301 tpDphHashNode sta,
302 tDot11fAssocResponse *frm);
303
304 /**
305 * lim_send_bcn_frame_mlo() - Prepare ML IE for beacon frame
306 * @mac_ctx: pointer to mac_context
307 * @session: pointer to pe_session
308 *
309 * Return: the actual ML IE length
310 */
311 uint16_t
312 lim_send_bcn_frame_mlo(struct mac_context *mac_ctx, struct pe_session *session);
313
314 /**
315 * lim_send_probe_req_frame_mlo() - Prepare ML IE for probe req frame
316 * @mac_ctx: pointer to mac_context
317 * @session: pointer to pe_session
318 *
319 * Return: the actual ML IE length
320 */
321 uint16_t
322 lim_send_probe_req_frame_mlo(struct mac_context *mac_ctx,
323 struct pe_session *session);
324
325 /**
326 * lim_send_tdls_mgmt_frame_mlo() - Prepare ML IE for tdls mgmt frame
327 * @mac_ctx: pointer to mac_context
328 * @session: pointer to pe_session
329 *
330 * Return: the actual ML IE length
331 */
332 uint16_t lim_send_tdls_mgmt_frame_mlo(struct mac_context *mac_ctx,
333 struct pe_session *session);
334
335 /**
336 * lim_get_frame_mlo_ie_len() - get ML IE length
337 * @session: pointer to pe_session
338 *
339 * Return: the actual ML IE length
340 */
341 uint16_t lim_get_frame_mlo_ie_len(struct pe_session *session);
342
343 /**
344 * lim_store_mlo_ie_raw_info() - store the ML IE raw info
345 * @ie: pointer the ML IE
346 * @sta_prof_ie: pointer to the first per STA prof
347 * @total_len: the length of ML IE
348 * @mlo_ie: the pointer to wlan_mlo_ie
349 *
350 * Return: QDF_STATUS
351 */
352 QDF_STATUS lim_store_mlo_ie_raw_info(uint8_t *ie, uint8_t *sta_prof_ie,
353 uint32_t total_len,
354 struct wlan_mlo_ie *mlo_ie);
355
356 /**
357 * lim_is_ml_peer_state_disconn() - Check if ML peer state is
358 * ML_PEER_DISCONN_INITIATED
359 * @mac_ctx: pointer to mac_context
360 * @session: pointer to pe_session
361 * @mac_addr: peer mac address
362 *
363 * Return: True if state is ML_PEER_DISCONN_INITIATED, else False
364 */
365 bool lim_is_ml_peer_state_disconn(struct mac_context *mac_ctx,
366 struct pe_session *session,
367 uint8_t *mac_addr);
368
369 bool lim_is_emlsr_band_supported(struct pe_session *session);
370
371 /**
372 * lim_cu_info_from_rnr_per_link_id() - get the cu info from rnr per link id
373 * @rnr: rnr element
374 * @linkid: link id
375 * @bpcc: pointer to save BSS parameters change count
376 * @aui: pointer to save all updates included flag
377 *
378 * Return: QDF_STATUS
379 */
380 QDF_STATUS lim_cu_info_from_rnr_per_link_id(const uint8_t *rnr,
381 uint8_t linkid, uint8_t *bpcc,
382 uint8_t *aui);
383
384 /**
385 * lim_get_bpcc_from_mlo_ie() - get the bpcc from mlo_ie info
386 * @bcn: the pointer to tSchBeaconStruct
387 * @bpcc: pbcc pointer to save the fetched value
388 *
389 * Return: QDF_STATUS
390 */
391 QDF_STATUS lim_get_bpcc_from_mlo_ie(tSchBeaconStruct *bcn,
392 uint8_t *bpcc);
393
394 /**
395 * lim_check_cu_happens() - check whether cu happens
396 * @vdev: vdev object
397 * @new_bpcc: the new bpcc
398 *
399 * Return: bool
400 */
401 bool lim_check_cu_happens(struct wlan_objmgr_vdev *vdev, uint8_t new_bpcc);
402 #else
lim_mlo_roam_peer_disconn_del(struct wlan_objmgr_vdev * vdev)403 static inline void lim_mlo_roam_peer_disconn_del(struct wlan_objmgr_vdev *vdev)
404 {
405 }
lim_mlo_notify_peer_disconn(struct pe_session * pe_session,tpDphHashNode sta_ds)406 static inline void lim_mlo_notify_peer_disconn(struct pe_session *pe_session,
407 tpDphHashNode sta_ds)
408 {
409 }
410
lim_mlo_sta_notify_peer_disconn(struct pe_session * pe_session)411 static inline void lim_mlo_sta_notify_peer_disconn(
412 struct pe_session *pe_session)
413 {
414 }
415
lim_mlo_set_mld_mac_peer(tpDphHashNode sta_ds,uint8_t peer_mld_addr[QDF_MAC_ADDR_SIZE])416 static inline void lim_mlo_set_mld_mac_peer(
417 tpDphHashNode sta_ds,
418 uint8_t peer_mld_addr[QDF_MAC_ADDR_SIZE])
419 {
420 }
421
lim_mlo_cleanup_partner_peer(struct vdev_mlme_obj * vdev_mlme,struct wlan_objmgr_peer * peer)422 static inline void lim_mlo_cleanup_partner_peer(struct vdev_mlme_obj *vdev_mlme,
423 struct wlan_objmgr_peer *peer)
424 {
425 }
426
lim_is_mlo_conn(struct pe_session * session,tpDphHashNode sta_ds)427 static inline bool lim_is_mlo_conn(struct pe_session *session,
428 tpDphHashNode sta_ds)
429 {
430 return false;
431 }
432
lim_is_mlo_recv_assoc(tpDphHashNode sta_ds)433 static inline bool lim_is_mlo_recv_assoc(tpDphHashNode sta_ds)
434 {
435 return false;
436 }
437
lim_set_mlo_recv_assoc(tpDphHashNode sta_ds,bool mlo_recv_assoc_frm)438 static inline void lim_set_mlo_recv_assoc(tpDphHashNode sta_ds,
439 bool mlo_recv_assoc_frm)
440 {
441 }
442
lim_mlo_partner_auth_type(struct pe_session * session,uint16_t partner_peer_idx,tAniAuthType * auth_type)443 static inline bool lim_mlo_partner_auth_type(struct pe_session *session,
444 uint16_t partner_peer_idx,
445 tAniAuthType *auth_type)
446 {
447 return false;
448 }
449
lim_ap_mlo_sta_peer_ind(struct mac_context * mac,struct pe_session * pe_session,tpDphHashNode sta,bool add_sta_rsp_status)450 static inline void lim_ap_mlo_sta_peer_ind(struct mac_context *mac,
451 struct pe_session *pe_session,
452 tpDphHashNode sta,
453 bool add_sta_rsp_status)
454 {
455 }
456
lim_mlo_delete_link_peer(struct pe_session * pe_session,tpDphHashNode sta_ds)457 static inline void lim_mlo_delete_link_peer(struct pe_session *pe_session,
458 tpDphHashNode sta_ds)
459 {
460 }
461
lim_mlo_assoc_ind_upper_layer(struct mac_context * mac,struct pe_session * pe_session,struct mlo_partner_info * mlo_info)462 static inline QDF_STATUS lim_mlo_assoc_ind_upper_layer(
463 struct mac_context *mac,
464 struct pe_session *pe_session,
465 struct mlo_partner_info *mlo_info)
466 {
467 return QDF_STATUS_SUCCESS;
468 }
469
lim_mlo_save_mlo_info(tpDphHashNode sta_ds,struct mlo_partner_info * mlo_info)470 static inline void lim_mlo_save_mlo_info(tpDphHashNode sta_ds,
471 struct mlo_partner_info *mlo_info)
472 {
473 }
474
475 static inline
lim_add_frag_ie_for_sta_profile(uint8_t * data,uint16_t * len)476 QDF_STATUS lim_add_frag_ie_for_sta_profile(uint8_t *data, uint16_t *len)
477 {
478 return QDF_STATUS_SUCCESS;
479 }
480
481 static inline
lim_fill_complete_mlo_ie(struct pe_session * session,uint16_t total_len,uint8_t * target)482 QDF_STATUS lim_fill_complete_mlo_ie(struct pe_session *session,
483 uint16_t total_len, uint8_t *target)
484 {
485 return QDF_STATUS_SUCCESS;
486 }
487
488 static inline uint16_t
lim_fill_assoc_req_mlo_ie(struct mac_context * mac_ctx,struct pe_session * session,tDot11fAssocRequest * frm)489 lim_fill_assoc_req_mlo_ie(struct mac_context *mac_ctx,
490 struct pe_session *session,
491 tDot11fAssocRequest *frm)
492 {
493 return 0;
494 }
495
496 static inline uint16_t
lim_send_assoc_rsp_mgmt_frame_mlo(struct mac_context * mac_ctx,struct pe_session * session,tpDphHashNode sta,tDot11fAssocResponse * frm)497 lim_send_assoc_rsp_mgmt_frame_mlo(struct mac_context *mac_ctx,
498 struct pe_session *session,
499 tpDphHashNode sta,
500 tDot11fAssocResponse *frm)
501 {
502 return 0;
503 }
504
505 static inline uint16_t
lim_send_probe_req_frame_mlo(struct mac_context * mac_ctx,struct pe_session * session)506 lim_send_probe_req_frame_mlo(struct mac_context *mac_ctx,
507 struct pe_session *session)
508 {
509 return 0;
510 }
511
512 static inline uint16_t
lim_send_bcn_frame_mlo(struct mac_context * mac_ctx,struct pe_session * session)513 lim_send_bcn_frame_mlo(struct mac_context *mac_ctx, struct pe_session *session)
514 {
515 return 0;
516 }
517
518 static inline uint16_t
lim_send_tdls_mgmt_frame_mlo(struct mac_context * mac_ctx,struct pe_session * session)519 lim_send_tdls_mgmt_frame_mlo(struct mac_context *mac_ctx,
520 struct pe_session *session)
521 {
522 return 0;
523 }
524
525 static inline
lim_get_frame_mlo_ie_len(struct pe_session * session)526 uint16_t lim_get_frame_mlo_ie_len(struct pe_session *session)
527 {
528 return 0;
529 }
530
531 static inline
lim_is_ml_peer_state_disconn(struct mac_context * mac_ctx,struct pe_session * session,uint8_t * mac_addr)532 bool lim_is_ml_peer_state_disconn(struct mac_context *mac_ctx,
533 struct pe_session *session,
534 uint8_t *mac_addr)
535 {
536 return false;
537 }
538
539 static inline
lim_is_emlsr_band_supported(struct pe_session * session)540 bool lim_is_emlsr_band_supported(struct pe_session *session)
541 {
542 return false;
543 }
544
545 static inline
lim_cu_info_from_rnr_per_link_id(const uint8_t * rnr,uint8_t linkid,uint8_t * bpcc,uint8_t * aui)546 QDF_STATUS lim_cu_info_from_rnr_per_link_id(const uint8_t *rnr, uint8_t linkid,
547 uint8_t *bpcc, uint8_t *aui)
548 {
549 return QDF_STATUS_E_INVAL;
550 }
551
552 static inline
lim_get_bpcc_from_mlo_ie(tSchBeaconStruct * bcn,uint8_t * bpcc)553 QDF_STATUS lim_get_bpcc_from_mlo_ie(tSchBeaconStruct *bcn,
554 uint8_t *bpcc)
555 {
556 return QDF_STATUS_E_INVAL;
557 }
558
559 static inline
lim_check_cu_happens(struct wlan_objmgr_vdev * vdev,uint8_t nbpcc)560 bool lim_check_cu_happens(struct wlan_objmgr_vdev *vdev, uint8_t nbpcc)
561 {
562 return true;
563 }
564 #endif
565 #endif
566