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