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