1 /* 2 * Copyright (c) 2017-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 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: wlan_tdls_main.h 22 * 23 * TDLS core function declaration 24 */ 25 26 #if !defined(_WLAN_TDLS_MAIN_H_) 27 #define _WLAN_TDLS_MAIN_H_ 28 29 #include <qdf_trace.h> 30 #include <qdf_list.h> 31 #include <wlan_objmgr_psoc_obj.h> 32 #include <wlan_objmgr_pdev_obj.h> 33 #include <wlan_objmgr_vdev_obj.h> 34 #include <wlan_objmgr_peer_obj.h> 35 #include <wlan_tdls_public_structs.h> 36 #include <scheduler_api.h> 37 #include "wlan_serialization_api.h" 38 #include <wlan_utility.h> 39 40 41 /* Bit mask flag for tdls_option to FW */ 42 #define ENA_TDLS_OFFCHAN (1 << 0) /* TDLS Off Channel support */ 43 #define ENA_TDLS_BUFFER_STA (1 << 1) /* TDLS Buffer STA support */ 44 #define ENA_TDLS_SLEEP_STA (1 << 2) /* TDLS Sleep STA support */ 45 46 #define BW_20_OFFSET_BIT 0 47 #define BW_40_OFFSET_BIT 1 48 #define BW_80_OFFSET_BIT 2 49 #define BW_160_OFFSET_BIT 3 50 51 #define TDLS_SEC_OFFCHAN_OFFSET_0 0 52 #define TDLS_SEC_OFFCHAN_OFFSET_40PLUS 40 53 #define TDLS_SEC_OFFCHAN_OFFSET_40MINUS (-40) 54 #define TDLS_SEC_OFFCHAN_OFFSET_80 80 55 #define TDLS_SEC_OFFCHAN_OFFSET_160 160 56 /* 57 * Before UpdateTimer expires, we want to timeout discovery response 58 * should not be more than 2000. 59 */ 60 #define TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE 1000 61 #define TDLS_SCAN_REJECT_MAX 5 62 #define TDLS_MAX_CONNECTED_PEERS_TO_ALLOW_SCAN 1 63 64 #define tdls_debug(params...) \ 65 QDF_TRACE_DEBUG(QDF_MODULE_ID_TDLS, params) 66 #define tdls_debug_rl(params...) \ 67 QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_TDLS, params) 68 69 #define tdls_notice(params...) \ 70 QDF_TRACE_INFO(QDF_MODULE_ID_TDLS, params) 71 #define tdls_warn(params...) \ 72 QDF_TRACE_WARN(QDF_MODULE_ID_TDLS, params) 73 #define tdls_err(params...) \ 74 QDF_TRACE_ERROR(QDF_MODULE_ID_TDLS, params) 75 #define tdls_alert(params...) \ 76 QDF_TRACE_FATAL(QDF_MODULE_ID_TDLS, params) 77 78 #define tdls_nofl_debug(params...) \ 79 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_TDLS, params) 80 #define tdls_nofl_notice(params...) \ 81 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_TDLS, params) 82 #define tdls_nofl_warn(params...) \ 83 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_TDLS, params) 84 #define tdls_nofl_err(params...) \ 85 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_TDLS, params) 86 #define tdls_nofl_alert(params...) \ 87 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_TDLS, params) 88 89 #define TDLS_IS_LINK_CONNECTED(peer) \ 90 ((TDLS_LINK_CONNECTED == (peer)->link_status) || \ 91 (TDLS_LINK_TEARING == (peer)->link_status)) 92 93 #define SET_BIT(value, mask) ((value) |= (1 << (mask))) 94 #define CLEAR_BIT(value, mask) ((value) &= ~(1 << (mask))) 95 #define CHECK_BIT(value, mask) ((value) & (1 << (mask))) 96 /** 97 * struct tdls_conn_info - TDLS connection record 98 * @session_id: session id 99 * @valid_entry: valid entry(set to true upon peer create resp from firmware) 100 * @peer_mac: peer address 101 * @index: index to store array offset. 102 */ 103 struct tdls_conn_info { 104 uint8_t session_id; 105 bool valid_entry; 106 uint8_t index; 107 struct qdf_mac_addr peer_mac; 108 }; 109 110 /** 111 * enum tdls_nss_transition_state - TDLS NSS transition states 112 * @TDLS_NSS_TRANSITION_S_UNKNOWN: default state 113 * @TDLS_NSS_TRANSITION_S_2x2_to_1x1: transition from 2x2 to 1x1 stream 114 * @TDLS_NSS_TRANSITION_S_1x1_to_2x2: transition from 1x1 to 2x2 stream 115 */ 116 enum tdls_nss_transition_state { 117 TDLS_NSS_TRANSITION_S_UNKNOWN = 0, 118 TDLS_NSS_TRANSITION_S_2x2_to_1x1, 119 TDLS_NSS_TRANSITION_S_1x1_to_2x2, 120 }; 121 122 /** 123 * struct tdls_conn_tracker_mac_table - connection tracker peer table 124 * @mac_address: peer mac address 125 * @tx_packet_cnt: number of tx pkts 126 * @rx_packet_cnt: number of rx pkts 127 * @peer_timestamp_ms: time stamp of latest peer traffic 128 */ 129 struct tdls_conn_tracker_mac_table { 130 struct qdf_mac_addr mac_address; 131 uint32_t tx_packet_cnt; 132 uint32_t rx_packet_cnt; 133 uint32_t peer_timestamp_ms; 134 }; 135 136 /** 137 * struct tdls_set_state_info - vdev id state info 138 * @vdev_id: vdev id of last set state command 139 */ 140 struct tdls_set_state_info { 141 uint8_t vdev_id; 142 }; 143 144 /** 145 * struct tdls_soc_priv_obj - tdls soc private context 146 * @soc: objmgr psoc 147 * @tdls_current_mode: current tdls mode 148 * @tdls_last_mode: last tdls mode 149 * @scan_reject_count: number of times scan rejected due to TDLS 150 * @tdls_source_bitmap: bit map to set/reset TDLS by different sources 151 * @tdls_conn_info: this tdls_conn_info can be removed and we can use peer type 152 * of peer object to get the active tdls peers 153 * @tdls_configs: tdls user configure 154 * @max_num_tdls_sta: maximum TDLS station number allowed upon runtime condition 155 * @connected_peer_count: tdls peer connected count 156 * @tdls_off_channel: tdls off channel number 157 * @tdls_channel_offset: tdls channel offset 158 * @tdls_fw_off_chan_mode: tdls fw off channel mode 159 * @enable_tdls_connection_tracker: enable tdls connection tracker 160 * @tdls_external_peer_count: external tdls peer count 161 * @tdls_nss_switch_in_progress: tdls antenna switch in progress 162 * @tdls_nss_teardown_complete: tdls tear down complete 163 * @tdls_nss_transition_mode: tdls nss transition mode 164 * @tdls_teardown_peers_cnt: tdls tear down peer count 165 * @set_state_info: set tdls state info 166 * @tdls_rx_cb: TDLS RX callback 167 * @tdls_rx_cb_data: TDLS RX callback context 168 * @tdls_wmm_cb: TDLS WMM check callback 169 * @tdls_wmm_cb_data: TDLS WMM check callback context 170 * @tdls_event_cb: tdls event callback 171 * @tdls_evt_cb_data: tdls event user data 172 * @tdls_peer_context: userdata for register/deregister TDLS peer 173 * @tdls_reg_peer: register tdls peer with datapath 174 * @tdls_dp_vdev_update: notify datapath of vdev updates 175 * @tx_q_ack: queue for tx frames waiting for ack 176 * @tdls_con_cap: tdls concurrency support 177 * @tdls_send_mgmt_req: store eWNI_SME_TDLS_SEND_MGMT_REQ value 178 * @tdls_add_sta_req: store eWNI_SME_TDLS_ADD_STA_REQ value 179 * @tdls_del_sta_req: store eWNI_SME_TDLS_DEL_STA_REQ value 180 * @tdls_update_peer_state: store WMA_UPDATE_TDLS_PEER_STATE value 181 * @tdls_del_all_peers:store eWNI_SME_DEL_ALL_TDLS_PEERS 182 * @tdls_update_dp_vdev_flags: store CDP_UPDATE_TDLS_FLAGS 183 * @tdls_idle_peer_data: provide information about idle peer 184 * @tdls_ct_spinlock: connection tracker spin lock 185 * @is_prevent_suspend: prevent suspend or not 186 * @is_drv_supported: platform supports drv or not, enable/disable tdls wow 187 * based on this flag. 188 * @wake_lock: wake lock 189 * @runtime_lock: runtime lock 190 * @fw_tdls_mlo_capable: is fw tdls mlo capable 191 * @tdls_osif_init_cb: Callback to initialize the tdls private 192 * @tdls_osif_deinit_cb: Callback to deinitialize the tdls private 193 * @tdls_osif_update_cb: Callback for updating osif params 194 * @fw_tdls_11ax_capability: bool for tdls 11ax fw capability 195 * @fw_tdls_6g_capability: bool for tdls 6g fw capability 196 * @bss_sta_power: bss sta power 197 * @bss_sta_power_type: bss sta power type 198 * @timer_cnt: used for mlo tdls to monitor discovery response 199 * @fw_tdls_wideband_capability: bool for tdls wideband fw capability 200 * @is_user_tdls_enable: bool to check whether TDLS enable through userspace 201 */ 202 struct tdls_soc_priv_obj { 203 struct wlan_objmgr_psoc *soc; 204 enum tdls_feature_mode tdls_current_mode; 205 enum tdls_feature_mode tdls_last_mode; 206 int scan_reject_count; 207 unsigned long tdls_source_bitmap; 208 struct tdls_conn_info tdls_conn_info[WLAN_TDLS_STA_MAX_NUM]; 209 struct tdls_user_config tdls_configs; 210 uint16_t max_num_tdls_sta; 211 uint16_t connected_peer_count; 212 uint8_t tdls_off_channel; 213 uint16_t tdls_channel_offset; 214 int32_t tdls_fw_off_chan_mode; 215 bool enable_tdls_connection_tracker; 216 uint8_t tdls_external_peer_count; 217 bool tdls_nss_switch_in_progress; 218 bool tdls_nss_teardown_complete; 219 enum tdls_nss_transition_state tdls_nss_transition_mode; 220 int32_t tdls_teardown_peers_cnt; 221 struct tdls_set_state_info set_state_info; 222 tdls_rx_callback tdls_rx_cb; 223 void *tdls_rx_cb_data; 224 tdls_wmm_check tdls_wmm_cb; 225 void *tdls_wmm_cb_data; 226 tdls_evt_callback tdls_event_cb; 227 void *tdls_evt_cb_data; 228 void *tdls_peer_context; 229 tdls_register_peer_callback tdls_reg_peer; 230 tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update; 231 qdf_list_t tx_q_ack; 232 enum tdls_conc_cap tdls_con_cap; 233 uint16_t tdls_send_mgmt_req; 234 uint16_t tdls_add_sta_req; 235 uint16_t tdls_del_sta_req; 236 uint16_t tdls_update_peer_state; 237 uint16_t tdls_del_all_peers; 238 uint32_t tdls_update_dp_vdev_flags; 239 qdf_spinlock_t tdls_ct_spinlock; 240 #ifdef TDLS_WOW_ENABLED 241 bool is_prevent_suspend; 242 bool is_drv_supported; 243 qdf_wake_lock_t wake_lock; 244 qdf_runtime_lock_t runtime_lock; 245 #endif 246 #ifdef WLAN_FEATURE_11BE_MLO 247 bool fw_tdls_mlo_capable; 248 #endif 249 tdls_vdev_init_cb tdls_osif_init_cb; 250 tdls_vdev_deinit_cb tdls_osif_deinit_cb; 251 struct tdls_osif_cb tdls_osif_update_cb; 252 #ifdef WLAN_FEATURE_11AX 253 bool fw_tdls_11ax_capability; 254 bool fw_tdls_6g_capability; 255 uint8_t bss_sta_power; 256 uint8_t bss_sta_power_type; 257 #endif 258 qdf_atomic_t timer_cnt; 259 bool fw_tdls_wideband_capability; 260 bool is_user_tdls_enable; 261 }; 262 263 /** 264 * struct tdls_vdev_priv_obj - tdls private vdev object 265 * @vdev: vdev objmgr object 266 * @peer_list: tdls peer list on this vdev 267 * @peer_update_timer: connection tracker timer 268 * @peer_discovery_timer: peer discovery timer 269 * @threshold_config: threshold config 270 * @discovery_peer_cnt: discovery peer count 271 * @discovery_sent_cnt: discovery sent count 272 * @curr_candidate: current candidate 273 * @ct_peer_table: linear mac address table for counting the packets 274 * @valid_mac_entries: number of valid mac entry in @ct_peer_mac_table 275 * @rx_mgmt: the pointer of rx mgmt info 276 * @link_score: select tdls vdev per the score 277 * @magic: magic 278 * @session_id: vdev ID 279 * @tx_queue: tx frame queue 280 * @tdls_teardown_comp: tdls teardown completion 281 */ 282 struct tdls_vdev_priv_obj { 283 struct wlan_objmgr_vdev *vdev; 284 qdf_list_t peer_list[WLAN_TDLS_PEER_LIST_SIZE]; 285 qdf_mc_timer_t peer_update_timer; 286 qdf_mc_timer_t peer_discovery_timer; 287 struct tdls_config_params threshold_config; 288 int32_t discovery_peer_cnt; 289 uint32_t discovery_sent_cnt; 290 struct tdls_peer *curr_candidate; 291 struct tdls_conn_tracker_mac_table 292 ct_peer_table[WLAN_TDLS_CT_TABLE_SIZE]; 293 uint8_t valid_mac_entries; 294 struct tdls_rx_mgmt_frame *rx_mgmt; 295 uint32_t link_score; 296 uint32_t magic; 297 uint8_t session_id; 298 qdf_list_t tx_queue; 299 qdf_event_t tdls_teardown_comp; 300 }; 301 302 /** 303 * struct tdls_peer_mlme_info - tdls peer mlme info 304 **/ 305 struct tdls_peer_mlme_info { 306 }; 307 308 /** 309 * struct tdls_peer - tdls peer data 310 * @node: node 311 * @vdev_priv: tdls vdev priv obj 312 * @peer_mac: peer mac address 313 * @valid_entry: entry valid or not (set to true when peer create resp is 314 * received from FW) 315 * @rssi: rssi 316 * @tdls_support: tdls support 317 * @link_status: tdls link status 318 * @is_responder: is responder 319 * @discovery_processed: discovery processed 320 * @discovery_attempt: discovery attempt 321 * @tx_pkt: tx packet 322 * @rx_pkt: rx packet 323 * @uapsd_queues: uapsd queues 324 * @max_sp: max sp 325 * @buf_sta_capable: is buffer sta 326 * @off_channel_capable: is offchannel supported flag 327 * @supported_channels_len: supported channels length 328 * @supported_chan_freq: supported channel frequency 329 * @supported_oper_classes_len: supported operation classes length 330 * @supported_oper_classes: supported operation classes 331 * @is_forced_peer: is forced peer 332 * @op_class_for_pref_off_chan: op class for preferred off channel 333 * @pref_off_chan_freq: preferred off channel frequency 334 * @pref_off_chan_width: preferred off channel width 335 * @peer_idle_timer: time to check idle traffic in tdls peers 336 * @is_peer_idle_timer_initialised: Flag to check idle timer init 337 * @spatial_streams: Number of TX/RX spatial streams for TDLS 338 * @reason: reason 339 * @state_change_notification: state change notification 340 * @qos: QOS capability of TDLS link 341 * @tdls_info: MLME info 342 */ 343 struct tdls_peer { 344 qdf_list_node_t node; 345 struct tdls_vdev_priv_obj *vdev_priv; 346 struct qdf_mac_addr peer_mac; 347 bool valid_entry; 348 int8_t rssi; 349 enum tdls_peer_capab tdls_support; 350 enum tdls_link_state link_status; 351 uint8_t is_responder; 352 uint8_t discovery_processed; 353 uint16_t discovery_attempt; 354 uint16_t tx_pkt; 355 uint16_t rx_pkt; 356 uint8_t uapsd_queues; 357 uint8_t max_sp; 358 uint8_t buf_sta_capable; 359 uint8_t off_channel_capable; 360 uint8_t supported_channels_len; 361 qdf_freq_t supported_chan_freq[WLAN_MAC_MAX_SUPP_CHANNELS]; 362 uint8_t supported_oper_classes_len; 363 uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES]; 364 bool is_forced_peer; 365 uint8_t op_class_for_pref_off_chan; 366 qdf_freq_t pref_off_chan_freq; 367 uint8_t pref_off_chan_width; 368 qdf_mc_timer_t peer_idle_timer; 369 bool is_peer_idle_timer_initialised; 370 uint8_t spatial_streams; 371 enum tdls_link_state_reason reason; 372 tdls_state_change_callback state_change_notification; 373 uint8_t qos; 374 struct tdls_peer_mlme_info *tdls_info; 375 }; 376 377 /** 378 * struct tdls_os_if_event - TDLS os event info 379 * @type: type of event 380 * @info: pointer to event information 381 */ 382 struct tdls_os_if_event { 383 uint32_t type; 384 void *info; 385 }; 386 387 /** 388 * enum tdls_os_if_notification - TDLS notification from OS IF 389 * @TDLS_NOTIFY_STA_SESSION_INCREMENT: sta session count incremented 390 * @TDLS_NOTIFY_STA_SESSION_DECREMENT: sta session count decremented 391 */ 392 enum tdls_os_if_notification { 393 TDLS_NOTIFY_STA_SESSION_INCREMENT, 394 TDLS_NOTIFY_STA_SESSION_DECREMENT 395 }; 396 /** 397 * wlan_vdev_get_tdls_soc_obj - private API to get tdls soc object from vdev 398 * @vdev: vdev object 399 * 400 * Return: tdls soc object 401 */ 402 static inline struct tdls_soc_priv_obj * wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev * vdev)403 wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev *vdev) 404 { 405 struct wlan_objmgr_psoc *psoc; 406 struct tdls_soc_priv_obj *soc_obj; 407 408 if (!vdev) { 409 tdls_err("NULL vdev"); 410 return NULL; 411 } 412 413 psoc = wlan_vdev_get_psoc(vdev); 414 if (!psoc) { 415 tdls_err("can't get psoc"); 416 return NULL; 417 } 418 419 soc_obj = (struct tdls_soc_priv_obj *) 420 wlan_objmgr_psoc_get_comp_private_obj(psoc, 421 WLAN_UMAC_COMP_TDLS); 422 423 return soc_obj; 424 } 425 426 /** 427 * wlan_psoc_get_tdls_soc_obj - private API to get tdls soc object from psoc 428 * @psoc: psoc object 429 * 430 * Return: tdls soc object 431 */ 432 static inline struct tdls_soc_priv_obj * wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc * psoc)433 wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc *psoc) 434 { 435 struct tdls_soc_priv_obj *soc_obj; 436 if (!psoc) { 437 tdls_err("NULL psoc"); 438 return NULL; 439 } 440 soc_obj = (struct tdls_soc_priv_obj *) 441 wlan_objmgr_psoc_get_comp_private_obj(psoc, 442 WLAN_UMAC_COMP_TDLS); 443 444 return soc_obj; 445 } 446 447 /** 448 * wlan_vdev_get_tdls_vdev_obj - private API to get tdls vdev object from vdev 449 * @vdev: vdev object 450 * 451 * Return: tdls vdev object 452 */ 453 static inline struct tdls_vdev_priv_obj * wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev * vdev)454 wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev *vdev) 455 { 456 struct tdls_vdev_priv_obj *vdev_obj; 457 458 if (!vdev) { 459 tdls_err("NULL vdev"); 460 return NULL; 461 } 462 463 vdev_obj = (struct tdls_vdev_priv_obj *) 464 wlan_objmgr_vdev_get_comp_private_obj(vdev, 465 WLAN_UMAC_COMP_TDLS); 466 467 return vdev_obj; 468 } 469 470 /** 471 * tdls_set_link_status - tdls set link status 472 * @vdev: vdev object 473 * @mac: mac address of tdls peer 474 * @link_state: tdls link state 475 * @link_reason: reason 476 * 477 * Return: None 478 */ 479 void tdls_set_link_status(struct tdls_vdev_priv_obj *vdev, 480 const uint8_t *mac, 481 enum tdls_link_state link_state, 482 enum tdls_link_state_reason link_reason); 483 /** 484 * tdls_psoc_obj_create_notification() - tdls psoc create notification handler 485 * @psoc: psoc object 486 * @arg_list: Argument list 487 * 488 * Return: QDF_STATUS 489 */ 490 QDF_STATUS tdls_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc, 491 void *arg_list); 492 493 /** 494 * tdls_psoc_obj_destroy_notification() - tdls psoc destroy notification handler 495 * @psoc: psoc object 496 * @arg_list: Argument list 497 * 498 * Return: QDF_STATUS 499 */ 500 QDF_STATUS tdls_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc, 501 void *arg_list); 502 503 /** 504 * tdls_vdev_obj_create_notification() - tdls vdev create notification handler 505 * @vdev: vdev object 506 * @arg_list: Argument list 507 * 508 * Return: QDF_STATUS 509 */ 510 QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, 511 void *arg_list); 512 513 /** 514 * tdls_vdev_obj_destroy_notification() - tdls vdev destroy notification handler 515 * @vdev: vdev object 516 * @arg_list: Argument list 517 * 518 * Return: QDF_STATUS 519 */ 520 QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev, 521 void *arg_list); 522 523 /** 524 * tdls_process_cmd() - tdls main command process function 525 * @msg: scheduler msg 526 * 527 * Return: QDF_STATUS 528 */ 529 QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg); 530 531 /** 532 * tdls_process_evt() - tdls main event process function 533 * @msg: scheduler msg 534 * 535 * Return: QDF_STATUS 536 */ 537 QDF_STATUS tdls_process_evt(struct scheduler_msg *msg); 538 539 /** 540 * tdls_timer_restart() - restart TDLS timer 541 * @vdev: VDEV object manager 542 * @timer: timer to restart 543 * @expiration_time: new expiration time to set for the timer 544 * 545 * Return: Void 546 */ 547 void tdls_timer_restart(struct wlan_objmgr_vdev *vdev, 548 qdf_mc_timer_t *timer, 549 uint32_t expiration_time); 550 551 /** 552 * tdls_timers_stop() - stop all the tdls timers running 553 * @tdls_vdev: TDLS vdev 554 * 555 * Return: none 556 */ 557 void tdls_timers_stop(struct tdls_vdev_priv_obj *tdls_vdev); 558 559 /** 560 * tdls_get_vdev_objects() - Get TDLS private objects 561 * @vdev: VDEV object manager 562 * @tdls_vdev_obj: tdls vdev object 563 * @tdls_soc_obj: tdls soc object 564 * 565 * Return: QDF_STATUS 566 */ 567 QDF_STATUS tdls_get_vdev_objects(struct wlan_objmgr_vdev *vdev, 568 struct tdls_vdev_priv_obj **tdls_vdev_obj, 569 struct tdls_soc_priv_obj **tdls_soc_obj); 570 571 /** 572 * tdls_set_ct_mode() - Set the tdls connection tracker mode 573 * @psoc: objmgr psoc object 574 * @vdev: Pointer to vdev object 575 * 576 * This routine is called to set the tdls connection tracker operation status 577 * 578 * Return: NONE 579 */ 580 void tdls_set_ct_mode(struct wlan_objmgr_psoc *psoc, 581 struct wlan_objmgr_vdev *vdev); 582 583 /** 584 * tdls_set_user_tdls_enable()- Set the tdls enable from userspace 585 * @vdev: Pointer to vdev object 586 * @is_user_tdls_enable: true if tdls is enable from userspace 587 * 588 * return: NONE 589 */ 590 void tdls_set_user_tdls_enable(struct wlan_objmgr_vdev *vdev, 591 bool is_user_tdls_enable); 592 /** 593 * tdls_set_operation_mode() - set tdls operating mode 594 * @tdls_set_mode: tdls mode set params 595 * 596 * Return: QDF_STATUS 597 */ 598 QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode); 599 600 /** 601 * tdls_notify_sta_connect() - Update tdls state for every 602 * connect event. 603 * @notify: sta connect params 604 * 605 * After every connect event in the system, check whether TDLS 606 * can be enabled in the system. If TDLS can be enabled, update the 607 * TDLS state as needed. 608 * 609 * Return: QDF_STATUS 610 */ 611 QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify); 612 613 /** 614 * tdls_process_enable_for_vdev() - Enable TDLS in firmware and activate the 615 * connection tracker 616 * @vdev: Pointer to vdev object 617 * 618 * Return: void 619 */ 620 void tdls_process_enable_for_vdev(struct wlan_objmgr_vdev *vdev); 621 622 #ifdef WLAN_FEATURE_11BE_MLO 623 /** 624 * tdls_process_enable_disable_for_ml_vdev() - Enable TDLS in firmware & active 625 * connection tracker for all the ML vdevs belonging to same MLD as the 626 * given vdev 627 * @vdev: Pointer to vdev object 628 * @is_enable: Flag to indicate if operation is enable TDLS or disable TDLS 629 * 630 * Return: None 631 */ 632 void tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev *vdev, 633 bool is_enable); 634 #else 635 static inline tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev * vdev,bool is_enable)636 void tdls_process_enable_disable_for_ml_vdev(struct wlan_objmgr_vdev *vdev, 637 bool is_enable) 638 {} 639 #endif 640 641 /** 642 * tdls_notify_sta_disconnect() - Update tdls state for every 643 * disconnect event. 644 * @notify: sta disconnect params 645 * 646 * After every disconnect event in the system, check whether TDLS 647 * can be disabled/enabled in the system and update the 648 * TDLS state as needed. 649 * 650 * Return: QDF_STATUS 651 */ 652 QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify); 653 654 /** 655 * tdls_notify_reset_adapter() - notify reset adapter 656 * @vdev: vdev object 657 * 658 * Notify TDLS about the adapter reset 659 * 660 * Return: None 661 */ 662 void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev); 663 664 /** 665 * tdls_peers_deleted_notification() - peer delete notification 666 * @psoc: soc object 667 * @vdev_id: vdev id 668 * 669 * Legacy lim layer will delete tdls peers for roaming and heart beat failures 670 * and notify the component about the delete event to update the tdls. 671 * state. 672 * 673 * Return: QDF_STATUS 674 */ 675 QDF_STATUS tdls_peers_deleted_notification(struct wlan_objmgr_psoc *psoc, 676 uint8_t vdev_id); 677 678 /** 679 * tdls_notify_decrement_session() - Notify the session decrement 680 * @psoc: psoc object manager 681 * 682 * Policy manager notify TDLS about session decrement 683 * 684 * Return: None 685 */ 686 void tdls_notify_decrement_session(struct wlan_objmgr_psoc *psoc); 687 688 /** 689 * tdls_send_update_to_fw - update tdls status info 690 * @tdls_vdev_obj: tdls vdev private object. 691 * @tdls_soc_obj: TDLS soc private object 692 * @tdls_prohibited: indicates whether tdls is prohibited. 693 * @tdls_chan_swit_prohibited: indicates whether tdls channel switch 694 * is prohibited. 695 * @sta_connect_event: indicate sta connect or disconnect event 696 * @session_id: session id 697 * 698 * Normally an AP does not influence TDLS connection between STAs 699 * associated to it. But AP may set bits for TDLS Prohibited or 700 * TDLS Channel Switch Prohibited in Extended Capability IE in 701 * Assoc/Re-assoc response to STA. So after STA is connected to 702 * an AP, call this function to update TDLS status as per those 703 * bits set in Ext Cap IE in received Assoc/Re-assoc response 704 * from AP. 705 * 706 * Return: void 707 */ 708 void tdls_send_update_to_fw(struct tdls_vdev_priv_obj *tdls_vdev_obj, 709 struct tdls_soc_priv_obj *tdls_soc_obj, 710 bool tdls_prohibited, 711 bool tdls_chan_swit_prohibited, 712 bool sta_connect_event, 713 uint8_t session_id); 714 715 /** 716 * tdls_notify_increment_session() - Notify the session increment 717 * @psoc: psoc object manager 718 * 719 * Policy manager notify TDLS about session increment 720 * 721 * Return: None 722 */ 723 void tdls_notify_increment_session(struct wlan_objmgr_psoc *psoc); 724 725 /** 726 * tdls_get_6g_pwr_for_power_type() - get power for a 6g freq for particular 727 * power type 728 * @vdev: vdev object 729 * @freq: 6g freq 730 * @pwr_typ: power type 731 * 732 * Function that gets power for a 6g freq for particular power type 733 * 734 * Return: true or false 735 */ 736 uint32_t tdls_get_6g_pwr_for_power_type(struct wlan_objmgr_vdev *vdev, 737 qdf_freq_t freq, 738 enum supported_6g_pwr_types pwr_typ); 739 740 /** 741 * tdls_is_6g_freq_allowed() - check is tdls 6ghz allowed or not 742 * @vdev: vdev object 743 * @freq: 6g freq 744 * 745 * Function determines the whether TDLS on 6ghz is allowed in the system 746 * 747 * Return: true or false 748 */ 749 bool tdls_is_6g_freq_allowed(struct wlan_objmgr_vdev *vdev, qdf_freq_t freq); 750 751 /** 752 * tdls_check_is_user_tdls_enable() - Check is tdls enabled or not 753 * @tdls_soc_obj: TDLS soc object 754 * 755 * Return: true or false 756 */ 757 bool tdls_check_is_user_tdls_enable(struct tdls_soc_priv_obj *tdls_soc_obj); 758 759 /** 760 * tdls_check_is_tdls_allowed() - check is tdls allowed or not 761 * @vdev: vdev object 762 * 763 * Function determines the whether TDLS allowed in the system 764 * 765 * Return: true or false 766 */ 767 bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev); 768 769 /** 770 * tdls_get_vdev() - Get tdls specific vdev object manager 771 * @psoc: wlan psoc object manager 772 * @dbg_id: debug id 773 * 774 * If TDLS possible, return the corresponding vdev 775 * to enable TDLS in the system. 776 * 777 * Return: vdev manager pointer or NULL. 778 */ 779 struct wlan_objmgr_vdev *tdls_get_vdev(struct wlan_objmgr_psoc *psoc, 780 wlan_objmgr_ref_dbgid dbg_id); 781 782 /** 783 * tdls_process_policy_mgr_notification() - process policy manager notification 784 * @psoc: soc object manager 785 * 786 * Return: QDF_STATUS 787 */ 788 QDF_STATUS 789 tdls_process_policy_mgr_notification(struct wlan_objmgr_psoc *psoc); 790 791 /** 792 * tdls_process_decrement_active_session() - process policy manager decrement 793 * sessions. 794 * @psoc: soc object manager 795 * 796 * Return: QDF_STATUS 797 */ 798 QDF_STATUS 799 tdls_process_decrement_active_session(struct wlan_objmgr_psoc *psoc); 800 801 /** 802 * wlan_tdls_get_mlo_vdev() - get mlo vdev for tdls 803 * @vdev: vdev object 804 * @index: index of vdev in mlo list 805 * @dbg_id: debug id 806 * 807 * Return: vdev pointer 808 */ 809 struct wlan_objmgr_vdev *wlan_tdls_get_mlo_vdev(struct wlan_objmgr_vdev *vdev, 810 uint8_t index, 811 wlan_objmgr_ref_dbgid dbg_id); 812 813 /** 814 * wlan_tdls_release_mlo_vdev() - release mlo vdev for tdls 815 * @vdev: vdev object 816 * @dbg_id: debug id 817 * 818 * Return: void 819 */ 820 void wlan_tdls_release_mlo_vdev(struct wlan_objmgr_vdev *vdev, 821 wlan_objmgr_ref_dbgid dbg_id); 822 823 /** 824 * tdls_scan_complete_event_handler() - scan complete event handler for tdls 825 * @vdev: vdev object 826 * @event: scan event 827 * @arg: tdls soc object 828 * 829 * Return: None 830 */ 831 void tdls_scan_complete_event_handler(struct wlan_objmgr_vdev *vdev, 832 struct scan_event *event, 833 void *arg); 834 835 /** 836 * tdls_set_link_unforce() - set link unforce 837 * @vdev: vdev object 838 * 839 * Return: void 840 */ 841 void tdls_set_link_unforce(struct wlan_objmgr_vdev *vdev); 842 843 /** 844 * tdls_scan_callback() - callback for TDLS scan operation 845 * @tdls_soc: tdls soc pvt object 846 * 847 * Return: QDF_STATUS 848 */ 849 QDF_STATUS tdls_scan_callback(struct tdls_soc_priv_obj *tdls_soc); 850 851 /** 852 * tdls_scan_done_callback() - callback for tdls scan done event 853 * @tdls_soc: tdls soc object 854 * 855 * Return: Void 856 */ 857 void tdls_scan_done_callback(struct tdls_soc_priv_obj *tdls_soc); 858 859 /** 860 * tdls_scan_serialization_comp_info_cb() - callback for scan start 861 * @vdev: VDEV on which the scan command is being processed 862 * @comp_info: serialize rules info 863 * @cmd: the serialization command 864 * 865 * Return: Void 866 */ 867 void tdls_scan_serialization_comp_info_cb(struct wlan_objmgr_vdev *vdev, 868 union wlan_serialization_rules_info *comp_info, 869 struct wlan_serialization_command *cmd); 870 /** 871 * tdls_check_and_indicate_delete_all_peers() - Check if delete all peers is 872 * allowed for the vdev based on current concurrency. 873 * @psoc: soc object 874 * @vdev_id: vdev id 875 * 876 * Notify tdls component to cleanup all peers based on current concurrency 877 * combination. 878 * 879 * Return: QDF_STATUS 880 */ 881 QDF_STATUS 882 tdls_check_and_indicate_delete_all_peers(struct wlan_objmgr_psoc *psoc, 883 uint8_t vdev_id); 884 885 /** 886 * tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and 887 * channel. 888 * @vdev: Pointer to vdev 889 * @freq: Channel frequency. 890 * @bw_offset: Bandwidth offset. 891 * @reg_bw_offset: enum offset_t type bandwidth 892 * 893 * To return the opclas. 894 * 895 * Return: opclass 896 */ 897 uint8_t tdls_get_opclass_from_bandwidth(struct wlan_objmgr_vdev *vdev, 898 qdf_freq_t freq, uint8_t bw_offset, 899 uint8_t *reg_bw_offset); 900 901 #ifdef WLAN_FEATURE_TDLS_CONCURRENCIES 902 /** 903 * tdls_handle_start_bss() - Handle start BSS event to act on concurrent 904 * session offchannel mode 905 * @psoc: Pointer to PSOC object 906 * 907 * Return: None 908 */ 909 QDF_STATUS tdls_handle_start_bss(struct wlan_objmgr_psoc *psoc); 910 911 /** 912 * tdls_is_concurrency_allowed() - Is TDLS allowed with the current concurrency 913 * @psoc: Pointer to PSOC 914 * 915 * Return: True or False 916 */ 917 bool tdls_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc); 918 #else 919 static inline tdls_handle_start_bss(struct wlan_objmgr_psoc * psoc)920 QDF_STATUS tdls_handle_start_bss(struct wlan_objmgr_psoc *psoc) 921 { 922 return QDF_STATUS_SUCCESS; 923 } 924 925 static inline bool tdls_is_concurrency_allowed(struct wlan_objmgr_psoc * psoc)926 tdls_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc) 927 { 928 return false; 929 } 930 931 #endif /* WLAN_FEATURE_TDLS_CONCURRENCIES */ 932 #endif 933