blob: f9df6d91fc9a43d0b2e1467c70a99cdddd6bbc0a [file] [log] [blame]
Frank Liu7e890d62017-03-02 17:17:53 +08001/*
bings059c4a02019-12-31 18:24:21 +08002 * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
Frank Liu7e890d62017-03-02 17:17:53 +08003 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/**
20 * DOC: wlan_tdls_main.h
21 *
22 * TDLS core function declaration
23 */
24
25#if !defined(_WLAN_TDLS_MAIN_H_)
26#define _WLAN_TDLS_MAIN_H_
27
28#include <qdf_trace.h>
29#include <qdf_list.h>
30#include <wlan_objmgr_psoc_obj.h>
31#include <wlan_objmgr_pdev_obj.h>
32#include <wlan_objmgr_vdev_obj.h>
33#include <wlan_objmgr_peer_obj.h>
34#include <wlan_tdls_public_structs.h>
35#include <scheduler_api.h>
Kabilan Kannanb4c693d2017-03-27 23:42:04 -070036#include "wlan_serialization_api.h"
Bala Venkatesh0f745452019-03-29 11:16:22 +053037#include <wlan_utility.h>
38
Frank Liu7e890d62017-03-02 17:17:53 +080039
40/* Bit mask flag for tdls_option to FW */
41#define ENA_TDLS_OFFCHAN (1 << 0) /* TDLS Off Channel support */
42#define ENA_TDLS_BUFFER_STA (1 << 1) /* TDLS Buffer STA support */
43#define ENA_TDLS_SLEEP_STA (1 << 2) /* TDLS Sleep STA support */
44
Frank Liuc3aad432017-03-13 21:30:21 +080045#define BW_20_OFFSET_BIT 0
46#define BW_40_OFFSET_BIT 1
47#define BW_80_OFFSET_BIT 2
48#define BW_160_OFFSET_BIT 3
49
50#define TDLS_SEC_OFFCHAN_OFFSET_0 0
51#define TDLS_SEC_OFFCHAN_OFFSET_40PLUS 40
52#define TDLS_SEC_OFFCHAN_OFFSET_40MINUS (-40)
53#define TDLS_SEC_OFFCHAN_OFFSET_80 80
54#define TDLS_SEC_OFFCHAN_OFFSET_160 160
Frank Liu57d308c2017-03-16 19:28:51 +080055/*
56 * Before UpdateTimer expires, we want to timeout discovery response
57 * should not be more than 2000.
58 */
59#define TDLS_DISCOVERY_TIMEOUT_BEFORE_UPDATE 1000
Kabilan Kannanb4c693d2017-03-27 23:42:04 -070060#define TDLS_SCAN_REJECT_MAX 5
61
Nirav Shah0bbf3362018-06-23 14:43:23 +053062#define tdls_debug(params...) \
63 QDF_TRACE_DEBUG(QDF_MODULE_ID_TDLS, params)
gaurank kathpaliab3645e72018-12-08 08:13:38 +080064#define tdls_debug_rl(params...) \
65 QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_TDLS, params)
66
Nirav Shah0bbf3362018-06-23 14:43:23 +053067#define tdls_notice(params...) \
68 QDF_TRACE_INFO(QDF_MODULE_ID_TDLS, params)
69#define tdls_warn(params...) \
70 QDF_TRACE_WARN(QDF_MODULE_ID_TDLS, params)
71#define tdls_err(params...) \
72 QDF_TRACE_ERROR(QDF_MODULE_ID_TDLS, params)
73#define tdls_alert(params...) \
74 QDF_TRACE_FATAL(QDF_MODULE_ID_TDLS, params)
Frank Liu7e890d62017-03-02 17:17:53 +080075
Nirav Shahe1734922018-07-24 16:33:11 +053076#define tdls_nofl_debug(params...) \
77 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_TDLS, params)
78#define tdls_nofl_notice(params...) \
79 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_TDLS, params)
80#define tdls_nofl_warn(params...) \
81 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_TDLS, params)
82#define tdls_nofl_err(params...) \
83 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_TDLS, params)
84#define tdls_nofl_alert(params...) \
85 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_TDLS, params)
86
Kabilan Kannanf3f11a72017-03-26 18:52:47 -070087#define TDLS_IS_LINK_CONNECTED(peer) \
Frank Liu7e890d62017-03-02 17:17:53 +080088 ((TDLS_LINK_CONNECTED == (peer)->link_status) || \
89 (TDLS_LINK_TEARING == (peer)->link_status))
90
91#define SET_BIT(value, mask) ((value) |= (1 << (mask)))
92#define CLEAR_BIT(value, mask) ((value) &= ~(1 << (mask)))
93#define CHECK_BIT(value, mask) ((value) & (1 << (mask)))
94/**
95 * struct tdls_conn_info - TDLS connection record
96 * @session_id: session id
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +053097 * @valid_entry: valid entry(set to true upon peer create resp from firmware)
Frank Liu7e890d62017-03-02 17:17:53 +080098 * @peer_mac: peer address
Bala Venkatesh2a773822019-02-04 19:52:27 +053099 * @index: index to store array offset.
Frank Liu7e890d62017-03-02 17:17:53 +0800100 */
101struct tdls_conn_info {
102 uint8_t session_id;
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +0530103 bool valid_entry;
Bala Venkatesh2a773822019-02-04 19:52:27 +0530104 uint8_t index;
Frank Liu7e890d62017-03-02 17:17:53 +0800105 struct qdf_mac_addr peer_mac;
106};
107
108/**
109 * enum tdls_nss_transition_state - TDLS NSS transition states
110 * @TDLS_NSS_TRANSITION_UNKNOWN: default state
111 * @TDLS_NSS_TRANSITION_2x2_to_1x1: transition from 2x2 to 1x1 stream
112 * @TDLS_NSS_TRANSITION_1x1_to_2x2: transition from 1x1 to 2x2 stream
113 */
114enum tdls_nss_transition_state {
115 TDLS_NSS_TRANSITION_S_UNKNOWN = 0,
116 TDLS_NSS_TRANSITION_S_2x2_to_1x1,
117 TDLS_NSS_TRANSITION_S_1x1_to_2x2,
118};
119
120/**
Frank Liu7e890d62017-03-02 17:17:53 +0800121 * struct tdls_conn_tracker_mac_table - connection tracker peer table
122 * @mac_address: peer mac address
123 * @tx_packet_cnt: number of tx pkts
124 * @rx_packet_cnt: number of rx pkts
125 * @peer_timestamp_ms: time stamp of latest peer traffic
126 */
127struct tdls_conn_tracker_mac_table {
128 struct qdf_mac_addr mac_address;
129 uint32_t tx_packet_cnt;
130 uint32_t rx_packet_cnt;
131 uint32_t peer_timestamp_ms;
132};
133
134/**
135 * struct tdls_set_state_db - to record set tdls state command, we need to
136 * set correct tdls state to firmware:
137 * 1. enable tdls in firmware before tdls connection;
138 * 2. disable tdls if concurrency happen, before disable tdls, all active peer
139 * should be deleted in firmware.
140 *
141 * @set_state_cnt: tdls set state count
142 * @vdev_id: vdev id of last set state command
143 */
144struct tdls_set_state_info {
145 uint8_t set_state_cnt;
146 uint8_t vdev_id;
147};
148
149/**
150 * struct tdls_psoc_priv_ctx - tdls context
151 * @soc: objmgr psoc
152 * @tdls_current_mode: current tdls mode
Kabilan Kannan03429f42017-02-28 20:28:54 -0800153 * @tdls_last_mode: last tdls mode
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700154 * @scan_reject_count: number of times scan rejected due to TDLS
Kabilan Kannan03429f42017-02-28 20:28:54 -0800155 * @tdls_source_bitmap: bit map to set/reset TDLS by different sources
Frank Liu7e890d62017-03-02 17:17:53 +0800156 * @tdls_conn_info: this tdls_conn_info can be removed and we can use peer type
157 * of peer object to get the active tdls peers
158 * @tdls_configs: tdls user configure
159 * @max_num_tdls_sta: maximum TDLS station number allowed upon runtime condition
160 * @connected_peer_count: tdls peer connected count
161 * @tdls_off_channel: tdls off channel number
162 * @tdls_channel_offset: tdls channel offset
163 * @tdls_fw_off_chan_mode: tdls fw off channel mode
164 * @enable_tdls_connection_tracker: enable tdls connection tracker
165 * @tdls_external_peer_count: external tdls peer count
166 * @tdls_nss_switch_in_progress: tdls antenna switch in progress
167 * @tdls_nss_teardown_complete: tdls tear down complete
Wu Gao9e982ef2020-07-08 15:28:10 +0800168 * @tdls_disable_in_progress: tdls is disable in progress
Frank Liu7e890d62017-03-02 17:17:53 +0800169 * @tdls_nss_transition_mode: tdls nss transition mode
170 * @tdls_teardown_peers_cnt: tdls tear down peer count
Frank Liu7e890d62017-03-02 17:17:53 +0800171 * @set_state_info: set tdls state info
Frank Liu7e890d62017-03-02 17:17:53 +0800172 * @tdls_event_cb: tdls event callback
173 * @tdls_evt_cb_data: tdls event user data
Jeff Johnson31dade32018-03-01 15:31:35 -0800174 * @tdls_peer_context: userdata for register/deregister TDLS peer
175 * @tdls_reg_peer: register tdls peer with datapath
Frank Liu7e890d62017-03-02 17:17:53 +0800176 * @tx_q_ack: queue for tx frames waiting for ack
177 * @tdls_con_cap: tdls concurrency support
Frank Liuc3aad432017-03-13 21:30:21 +0800178 * @tdls_send_mgmt_req: store eWNI_SME_TDLS_SEND_MGMT_REQ value
179 * @tdls_add_sta_req: store eWNI_SME_TDLS_ADD_STA_REQ value
180 * @tdls_del_sta_req: store eWNI_SME_TDLS_DEL_STA_REQ value
181 * @tdls_update_peer_state: store WMA_UPDATE_TDLS_PEER_STATE value
Kabilan Kannance5880e2017-04-17 21:53:42 -0700182 * @tdls_del_all_peers:store eWNI_SME_DEL_ALL_TDLS_PEERS
Kabilan Kannan7c0093d2017-04-26 13:26:47 -0700183 * @tdls_update_dp_vdev_flags store CDP_UPDATE_TDLS_FLAGS
Kabilan Kannan00619ab2017-03-20 01:59:24 -0700184 * @tdls_idle_peer_data: provide information about idle peer
185 * @tdls_ct_spinlock: connection tracker spin lock
Wu Gao9e982ef2020-07-08 15:28:10 +0800186 * @is_prevent_suspend: prevent suspend or not
187 * @is_drv_supported: platform supports drv or not, enable/disable tdls wow
188 * based on this flag.
189 * @wake_lock: wake lock
190 * @runtime_lock: runtime lock
Arun Kumar Khandavalli43fdd252019-04-24 18:34:18 +0530191 * @tdls_osif_init_cb: Callback to initialize the tdls private
192 * @tdls_osif_deinit_cb: Callback to deinitialize the tdls private
Frank Liu7e890d62017-03-02 17:17:53 +0800193 */
194struct tdls_soc_priv_obj {
195 struct wlan_objmgr_psoc *soc;
Frank Liuc3aad432017-03-13 21:30:21 +0800196 enum tdls_feature_mode tdls_current_mode;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800197 enum tdls_feature_mode tdls_last_mode;
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700198 int scan_reject_count;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800199 unsigned long tdls_source_bitmap;
Frank Liu7e890d62017-03-02 17:17:53 +0800200 struct tdls_conn_info tdls_conn_info[WLAN_TDLS_STA_MAX_NUM];
201 struct tdls_user_config tdls_configs;
202 uint16_t max_num_tdls_sta;
203 uint16_t connected_peer_count;
204 uint8_t tdls_off_channel;
205 uint16_t tdls_channel_offset;
206 int32_t tdls_fw_off_chan_mode;
207 bool enable_tdls_connection_tracker;
208 uint8_t tdls_external_peer_count;
209 bool tdls_nss_switch_in_progress;
210 bool tdls_nss_teardown_complete;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800211 bool tdls_disable_in_progress;
Frank Liu7e890d62017-03-02 17:17:53 +0800212 enum tdls_nss_transition_state tdls_nss_transition_mode;
213 int32_t tdls_teardown_peers_cnt;
214 struct tdls_set_state_info set_state_info;
Kabilan Kannanf3f11a72017-03-26 18:52:47 -0700215 tdls_rx_callback tdls_rx_cb;
216 void *tdls_rx_cb_data;
217 tdls_wmm_check tdls_wmm_cb;
218 void *tdls_wmm_cb_data;
Frank Liu7e890d62017-03-02 17:17:53 +0800219 tdls_evt_callback tdls_event_cb;
220 void *tdls_evt_cb_data;
Jeff Johnson31dade32018-03-01 15:31:35 -0800221 void *tdls_peer_context;
222 tdls_register_peer_callback tdls_reg_peer;
Kabilan Kannan7c0093d2017-04-26 13:26:47 -0700223 tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update;
Frank Liu7e890d62017-03-02 17:17:53 +0800224 qdf_list_t tx_q_ack;
225 enum tdls_conc_cap tdls_con_cap;
Frank Liuc3aad432017-03-13 21:30:21 +0800226 uint16_t tdls_send_mgmt_req;
227 uint16_t tdls_add_sta_req;
228 uint16_t tdls_del_sta_req;
229 uint16_t tdls_update_peer_state;
Kabilan Kannance5880e2017-04-17 21:53:42 -0700230 uint16_t tdls_del_all_peers;
Kabilan Kannan7c0093d2017-04-26 13:26:47 -0700231 uint32_t tdls_update_dp_vdev_flags;
Kabilan Kannan00619ab2017-03-20 01:59:24 -0700232 qdf_spinlock_t tdls_ct_spinlock;
Wu Gao9e982ef2020-07-08 15:28:10 +0800233#ifdef TDLS_WOW_ENABLED
234 bool is_prevent_suspend;
235 bool is_drv_supported;
236 qdf_wake_lock_t wake_lock;
237 qdf_runtime_lock_t runtime_lock;
238#endif
Arun Kumar Khandavalli43fdd252019-04-24 18:34:18 +0530239 tdls_vdev_init_cb tdls_osif_init_cb;
240 tdls_vdev_deinit_cb tdls_osif_deinit_cb;
Frank Liu7e890d62017-03-02 17:17:53 +0800241};
242
243/**
244 * struct tdls_vdev_priv_obj - tdls private vdev object
245 * @vdev: vdev objmgr object
246 * @peer_list: tdls peer list on this vdev
247 * @peer_update_timer: connection tracker timer
248 * @peer_dicovery_timer: peer discovery timer
249 * @threshold_config: threshold config
250 * @discovery_peer_cnt: discovery peer count
251 * @discovery_sent_cnt: discovery sent count
Frank Liu7e890d62017-03-02 17:17:53 +0800252 * @curr_candidate: current candidate
253 * @ct_peer_table: linear mac address table for counting the packets
254 * @valid_mac_entries: number of valid mac entry in @ct_peer_mac_table
255 * @magic: magic
256 * @tx_queue: tx frame queue
257 */
258struct tdls_vdev_priv_obj {
259 struct wlan_objmgr_vdev *vdev;
260 qdf_list_t peer_list[WLAN_TDLS_PEER_LIST_SIZE];
261 qdf_mc_timer_t peer_update_timer;
262 qdf_mc_timer_t peer_discovery_timer;
263 struct tdls_config_params threshold_config;
264 int32_t discovery_peer_cnt;
265 uint32_t discovery_sent_cnt;
Frank Liu7e890d62017-03-02 17:17:53 +0800266 struct tdls_peer *curr_candidate;
267 struct tdls_conn_tracker_mac_table
268 ct_peer_table[WLAN_TDLS_CT_TABLE_SIZE];
269 uint8_t valid_mac_entries;
270 uint32_t magic;
Kabilan Kannance5880e2017-04-17 21:53:42 -0700271 uint8_t session_id;
Frank Liu7e890d62017-03-02 17:17:53 +0800272 qdf_list_t tx_queue;
273};
274
275/**
Frank Liuc3aad432017-03-13 21:30:21 +0800276 * struct tdls_peer_mlme_info - tdls peer mlme info
277 **/
278struct tdls_peer_mlme_info {
279};
280
281/**
Frank Liu7e890d62017-03-02 17:17:53 +0800282 * struct tdls_peer - tdls peer data
283 * @node: node
284 * @vdev_priv: tdls vdev priv obj
285 * @peer_mac: peer mac address
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +0530286 * @valid_entry: entry valid or not (set to true when peer create resp is
287 * received from FW)
Frank Liu7e890d62017-03-02 17:17:53 +0800288 * @rssi: rssi
289 * @tdls_support: tdls support
290 * @link_status: tdls link status
Frank Liu7e890d62017-03-02 17:17:53 +0800291 * @is_responder: is responder
292 * @discovery_processed: dicovery processed
293 * @discovery_attempt: discovery attempt
294 * @tx_pkt: tx packet
295 * @rx_pkt: rx packet
296 * @uapsd_queues: uapsd queues
297 * @max_sp: max sp
298 * @buf_sta_capable: is buffer sta
299 * @off_channel_capable: is offchannel supported flag
300 * @supported_channels_len: supported channels length
301 * @supported_channels: supported channels
302 * @supported_oper_classes_len: supported operation classes length
303 * @supported_oper_classes: supported operation classes
304 * @is_forced_peer: is forced peer
305 * @op_class_for_pref_off_chan: op class for preferred off channel
306 * @pref_off_chan_num: preferred off channel number
Frank Liu7e890d62017-03-02 17:17:53 +0800307 * @peer_idle_timer: time to check idle traffic in tdls peers
308 * @is_peer_idle_timer_initialised: Flag to check idle timer init
309 * @spatial_streams: Number of TX/RX spatial streams for TDLS
310 * @reason: reason
311 * @state_change_notification: state change notification
312 * @qos: QOS capability of TDLS link
313 */
314struct tdls_peer {
315 qdf_list_node_t node;
316 struct tdls_vdev_priv_obj *vdev_priv;
317 struct qdf_mac_addr peer_mac;
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +0530318 bool valid_entry;
Frank Liu7e890d62017-03-02 17:17:53 +0800319 int8_t rssi;
320 enum tdls_peer_capab tdls_support;
Frank Liuc3aad432017-03-13 21:30:21 +0800321 enum tdls_link_state link_status;
Frank Liu7e890d62017-03-02 17:17:53 +0800322 uint8_t is_responder;
323 uint8_t discovery_processed;
324 uint16_t discovery_attempt;
325 uint16_t tx_pkt;
326 uint16_t rx_pkt;
327 uint8_t uapsd_queues;
328 uint8_t max_sp;
329 uint8_t buf_sta_capable;
330 uint8_t off_channel_capable;
331 uint8_t supported_channels_len;
332 uint8_t supported_channels[WLAN_MAC_MAX_SUPP_CHANNELS];
333 uint8_t supported_oper_classes_len;
334 uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES];
335 bool is_forced_peer;
336 uint8_t op_class_for_pref_off_chan;
337 uint8_t pref_off_chan_num;
Frank Liu7e890d62017-03-02 17:17:53 +0800338 qdf_mc_timer_t peer_idle_timer;
339 bool is_peer_idle_timer_initialised;
340 uint8_t spatial_streams;
Frank Liuc3aad432017-03-13 21:30:21 +0800341 enum tdls_link_state_reason reason;
Frank Liu7e890d62017-03-02 17:17:53 +0800342 tdls_state_change_callback state_change_notification;
343 uint8_t qos;
Frank Liuc3aad432017-03-13 21:30:21 +0800344 struct tdls_peer_mlme_info *tdls_info;
Frank Liu7e890d62017-03-02 17:17:53 +0800345};
346
347/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800348 * struct tdls_os_if_event - TDLS os event info
349 * @type: type of event
350 * @info: pointer to event information
351 */
352struct tdls_os_if_event {
353 uint32_t type;
354 void *info;
355};
356
357/**
358 * enum tdls_os_if_notification - TDLS notification from OS IF
359 * @TDLS_NOTIFY_STA_SESSION_INCREMENT: sta session count incremented
360 * @TDLS_NOTIFY_STA_SESSION_DECREMENT: sta session count decremented
361 */
362enum tdls_os_if_notification {
363 TDLS_NOTIFY_STA_SESSION_INCREMENT,
364 TDLS_NOTIFY_STA_SESSION_DECREMENT
365};
366/**
Frank Liu7e890d62017-03-02 17:17:53 +0800367 * wlan_vdev_get_tdls_soc_obj - private API to get tdls soc object from vdev
368 * @vdev: vdev object
369 *
370 * Return: tdls soc object
371 */
372static inline struct tdls_soc_priv_obj *
373wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev *vdev)
374{
Frank Liuc3aad432017-03-13 21:30:21 +0800375 struct wlan_objmgr_psoc *psoc;
376 struct tdls_soc_priv_obj *soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800377
Frank Liuc3aad432017-03-13 21:30:21 +0800378 if (!vdev) {
379 tdls_err("NULL vdev");
380 return NULL;
381 }
382
Frank Liuc3aad432017-03-13 21:30:21 +0800383 psoc = wlan_vdev_get_psoc(vdev);
Frank Liuc3aad432017-03-13 21:30:21 +0800384 if (!psoc) {
385 tdls_err("can't get psoc");
386 return NULL;
387 }
388
Frank Liuc3aad432017-03-13 21:30:21 +0800389 soc_obj = (struct tdls_soc_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800390 wlan_objmgr_psoc_get_comp_private_obj(psoc,
391 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800392
393 return soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800394}
395
396/**
397 * wlan_psoc_get_tdls_soc_obj - private API to get tdls soc object from psoc
398 * @psoc: psoc object
399 *
400 * Return: tdls soc object
401 */
402static inline struct tdls_soc_priv_obj *
403wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc *psoc)
404{
Frank Liuc3aad432017-03-13 21:30:21 +0800405 struct tdls_soc_priv_obj *soc_obj;
406 if (!psoc) {
407 tdls_err("NULL psoc");
408 return NULL;
409 }
Frank Liuc3aad432017-03-13 21:30:21 +0800410 soc_obj = (struct tdls_soc_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800411 wlan_objmgr_psoc_get_comp_private_obj(psoc,
412 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800413
414 return soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800415}
416
417/**
418 * wlan_vdev_get_tdls_vdev_obj - private API to get tdls vdev object from vdev
419 * @vdev: vdev object
420 *
421 * Return: tdls vdev object
422 */
423static inline struct tdls_vdev_priv_obj *
424wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev *vdev)
425{
Frank Liuc3aad432017-03-13 21:30:21 +0800426 struct tdls_vdev_priv_obj *vdev_obj;
427
428 if (!vdev) {
429 tdls_err("NULL vdev");
430 return NULL;
431 }
432
Frank Liuc3aad432017-03-13 21:30:21 +0800433 vdev_obj = (struct tdls_vdev_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800434 wlan_objmgr_vdev_get_comp_private_obj(vdev,
435 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800436
437 return vdev_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800438}
439
440/**
441 * tdls_set_link_status - tdls set link status
442 * @vdev: vdev object
443 * @mac: mac address of tdls peer
Frank Liuc3aad432017-03-13 21:30:21 +0800444 * @link_state: tdls link state
Frank Liu7e890d62017-03-02 17:17:53 +0800445 * @link_reason: reason
446 */
447void tdls_set_link_status(struct tdls_vdev_priv_obj *vdev,
448 const uint8_t *mac,
Frank Liuc3aad432017-03-13 21:30:21 +0800449 enum tdls_link_state link_state,
450 enum tdls_link_state_reason link_reason);
Frank Liu7e890d62017-03-02 17:17:53 +0800451/**
452 * tdls_psoc_obj_create_notification() - tdls psoc create notification handler
453 * @psoc: psoc object
454 * @arg_list: Argument list
455 *
456 * Return: QDF_STATUS
457 */
458QDF_STATUS tdls_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc,
459 void *arg_list);
460
461/**
462 * tdls_psoc_obj_destroy_notification() - tdls psoc destroy notification handler
463 * @psoc: psoc object
464 * @arg_list: Argument list
465 *
466 * Return: QDF_STATUS
467 */
468QDF_STATUS tdls_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc,
469 void *arg_list);
470
471/**
472 * tdls_vdev_obj_create_notification() - tdls vdev create notification handler
473 * @vdev: vdev object
474 * @arg_list: Argument list
475 *
476 * Return: QDF_STATUS
477 */
478QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
479 void *arg_list);
480
481/**
482 * tdls_vdev_obj_destroy_notification() - tdls vdev destroy notification handler
483 * @vdev: vdev object
484 * @arg_list: Argument list
485 *
486 * Return: QDF_STATUS
487 */
488QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
489 void *arg_list);
490
491/**
492 * tdls_process_cmd() - tdls main command process function
493 * @msg: scheduler msg
494 *
495 * Return: QDF_STATUS
496 */
497QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg);
498
499/**
500 * tdls_process_evt() - tdls main event process function
501 * @msg: scheduler msg
502 *
503 * Return: QDF_STATUS
504 */
505QDF_STATUS tdls_process_evt(struct scheduler_msg *msg);
Kabilan Kannan712cbfe2017-03-27 17:20:33 -0700506
507/**
508 * tdls_timer_restart() - restart TDLS timer
509 * @vdev: VDEV object manager
510 * @timer: timer to restart
511 * @expiration_time: new expiration time to set for the timer
512 *
513 * Return: Void
514 */
515void tdls_timer_restart(struct wlan_objmgr_vdev *vdev,
516 qdf_mc_timer_t *timer,
517 uint32_t expiration_time);
518
519/**
520 * wlan_hdd_tdls_timers_stop() - stop all the tdls timers running
521 * @tdls_vdev: TDLS vdev
522 *
523 * Return: none
524 */
525void tdls_timers_stop(struct tdls_vdev_priv_obj *tdls_vdev);
526
Kabilan Kannan00619ab2017-03-20 01:59:24 -0700527/**
528 * tdls_get_vdev_objects() - Get TDLS private objects
529 * @vdev: VDEV object manager
530 * @tdls_vdev_obj: tdls vdev object
531 * @tdls_soc_obj: tdls soc object
532 *
533 * Return: QDF_STATUS
534 */
535QDF_STATUS tdls_get_vdev_objects(struct wlan_objmgr_vdev *vdev,
536 struct tdls_vdev_priv_obj **tdls_vdev_obj,
537 struct tdls_soc_priv_obj **tdls_soc_obj);
538
Kabilan Kannan03429f42017-02-28 20:28:54 -0800539/**
540 * cds_set_tdls_ct_mode() - Set the tdls connection tracker mode
541 * @hdd_ctx: hdd context
542 *
543 * This routine is called to set the tdls connection tracker operation status
544 *
545 * Return: NONE
546 */
547void tdls_set_ct_mode(struct wlan_objmgr_psoc *psoc);
548
549/**
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700550 * tdls_set_operation_mode() - set tdls operating mode
551 * @tdls_set_mode: tdls mode set params
552 *
553 * Return: QDF_STATUS
554 */
555QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode);
556
557/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800558 * tdls_notify_sta_connect() - Update tdls state for every
559 * connect event.
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700560 * @notify: sta connect params
Kabilan Kannan03429f42017-02-28 20:28:54 -0800561 *
562 * After every connect event in the system, check whether TDLS
563 * can be enabled in the system. If TDLS can be enabled, update the
564 * TDLS state as needed.
565 *
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700566 * Return: QDF_STATUS
Kabilan Kannan03429f42017-02-28 20:28:54 -0800567 */
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700568QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify);
Kabilan Kannan03429f42017-02-28 20:28:54 -0800569
570/**
571 * tdls_notify_sta_disconnect() - Update tdls state for every
572 * disconnect event.
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700573 * @notify: sta disconnect params
Kabilan Kannan03429f42017-02-28 20:28:54 -0800574 *
575 * After every disconnect event in the system, check whether TDLS
576 * can be disabled/enabled in the system and update the
577 * TDLS state as needed.
578 *
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700579 * Return: QDF_STATUS
Kabilan Kannan03429f42017-02-28 20:28:54 -0800580 */
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700581QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify);
Kabilan Kannan03429f42017-02-28 20:28:54 -0800582
583/**
Kabilan Kannan52eb3c72017-06-06 19:40:03 -0700584 * tdls_notify_reset_adapter() - notify reset adapter
Frank Liuaf02af52018-10-24 15:08:00 +0800585 * @vdev: vdev object
Kabilan Kannan52eb3c72017-06-06 19:40:03 -0700586 *
587 * Notify TDLS about the adapter reset
588 *
589 * Return: None
590 */
591void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev);
592
593/**
Kabilan Kannan952df192017-05-15 20:28:05 -0700594 * tdls_peers_deleted_notification() - peer delete notification
Frank Liuaf02af52018-10-24 15:08:00 +0800595 * @psoc: soc object
596 * @vdev_id: vdev id
Kabilan Kannan952df192017-05-15 20:28:05 -0700597 *
598 * Legacy lim layer will delete tdls peers for roaming and heart beat failures
599 * and notify the component about the delete event to update the tdls.
600 * state.
601 *
Jingxiang Gea551f692018-07-13 15:16:03 +0800602 * Return: QDF_STATUS
Kabilan Kannan952df192017-05-15 20:28:05 -0700603 */
Frank Liuaf02af52018-10-24 15:08:00 +0800604QDF_STATUS tdls_peers_deleted_notification(struct wlan_objmgr_psoc *psoc,
605 uint8_t vdev_id);
Kabilan Kannan952df192017-05-15 20:28:05 -0700606
607/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800608 * tdls_notify_decrement_session() - Notify the session decrement
609 * @psoc: psoc object manager
610 *
611 * Policy manager notify TDLS about session decrement
612 *
613 * Return: None
614 */
615void tdls_notify_decrement_session(struct wlan_objmgr_psoc *psoc);
616
617/**
Bala Venkatesh10a46e92018-09-06 14:38:13 +0530618 * tdls_send_update_to_fw - update tdls status info
619 * @tdls_vdev_obj: tdls vdev private object.
620 * @tdls_prohibited: indicates whether tdls is prohibited.
621 * @tdls_chan_swit_prohibited: indicates whether tdls channel switch
622 * is prohibited.
623 * @sta_connect_event: indicate sta connect or disconnect event
624 * @session_id: session id
625 *
626 * Normally an AP does not influence TDLS connection between STAs
627 * associated to it. But AP may set bits for TDLS Prohibited or
628 * TDLS Channel Switch Prohibited in Extended Capability IE in
629 * Assoc/Re-assoc response to STA. So after STA is connected to
630 * an AP, call this function to update TDLS status as per those
631 * bits set in Ext Cap IE in received Assoc/Re-assoc response
632 * from AP.
633 *
634 * Return: None.
635 */
636void tdls_send_update_to_fw(struct tdls_vdev_priv_obj *tdls_vdev_obj,
637 struct tdls_soc_priv_obj *tdls_soc_obj,
638 bool tdls_prohibited,
639 bool tdls_chan_swit_prohibited,
640 bool sta_connect_event,
641 uint8_t session_id);
642
643/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800644 * tdls_notify_increment_session() - Notify the session increment
645 * @psoc: psoc object manager
646 *
647 * Policy manager notify TDLS about session increment
648 *
649 * Return: None
650 */
651void tdls_notify_increment_session(struct wlan_objmgr_psoc *psoc);
652
653/**
654 * tdls_check_is_tdls_allowed() - check is tdls allowed or not
655 * @vdev: vdev object
656 *
657 * Function determines the whether TDLS allowed in the system
658 *
659 * Return: true or false
660 */
661bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev);
662
663/**
664 * tdls_get_vdev() - Get tdls specific vdev object manager
665 * @psoc: wlan psoc object manager
666 * @dbg_id: debug id
667 *
668 * If TDLS possible, return the corresponding vdev
669 * to enable TDLS in the system.
670 *
671 * Return: vdev manager pointer or NULL.
672 */
673struct wlan_objmgr_vdev *tdls_get_vdev(struct wlan_objmgr_psoc *psoc,
674 wlan_objmgr_ref_dbgid dbg_id);
675
676/**
677 * tdls_process_policy_mgr_notification() - process policy manager notification
678 * @psoc: soc object manager
679 *
680 * Return: QDF_STATUS
681 */
682QDF_STATUS
683tdls_process_policy_mgr_notification(struct wlan_objmgr_psoc *psoc);
684
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700685/**
Bala Venkateshc8bbb002018-12-18 19:55:48 +0530686 * tdls_process_decrement_active_session() - process policy manager decrement
687 * sessions.
688 * @psoc: soc object manager
689 *
690 * Return: QDF_STATUS
691 */
692QDF_STATUS
693tdls_process_decrement_active_session(struct wlan_objmgr_psoc *psoc);
694/**
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700695 * tdls_scan_complete_event_handler() - scan complete event handler for tdls
696 * @vdev: vdev object
697 * @event: scan event
698 * @arg: tdls soc object
699 *
700 * Return: None
701 */
702void tdls_scan_complete_event_handler(struct wlan_objmgr_vdev *vdev,
703 struct scan_event *event,
704 void *arg);
705
706/**
707 * tdls_scan_callback() - callback for TDLS scan operation
708 * @soc: tdls soc pvt object
709 *
710 * Return: QDF_STATUS
711 */
712QDF_STATUS tdls_scan_callback(struct tdls_soc_priv_obj *tdls_soc);
713
714/**
715 * wlan_hdd_tdls_scan_done_callback() - callback for tdls scan done event
716 * @tdls_soc: tdls soc object
717 *
718 * Return: Void
719 */
720void tdls_scan_done_callback(struct tdls_soc_priv_obj *tdls_soc);
721
722/**
723 * tdls_scan_serialization_comp_info_cb() - callback for scan start
Varun Reddy Yeturucccf0992017-08-10 13:37:08 -0700724 * @vdev: VDEV on which the scan command is being processed
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700725 * @comp_info: serialize rules info
726 *
727 * Return: negative = caller should stop and return error code immediately
728 * 1 = caller can continue to scan
729 */
Varun Reddy Yeturucccf0992017-08-10 13:37:08 -0700730void tdls_scan_serialization_comp_info_cb(struct wlan_objmgr_vdev *vdev,
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700731 union wlan_serialization_rules_info *comp_info);
732
Kabilan Kannance5880e2017-04-17 21:53:42 -0700733/**
734 * tdls_set_offchan_mode() - update tdls status info
735 * @psoc: soc object
736 * @param: channel switch params
737 *
738 * send message to WMI to set TDLS off channel in f/w
739 *
740 * Return: QDF_STATUS.
741 */
742QDF_STATUS tdls_set_offchan_mode(struct wlan_objmgr_psoc *psoc,
743 struct tdls_channel_switch_params *param);
744
Bala Venkatesha82fdd9562018-10-11 14:34:37 +0530745/**
746 * tdls_delete_all_peers_indication() - update tdls status info
Frank Liuaf02af52018-10-24 15:08:00 +0800747 * @psoc: soc object
748 * @vdev_id: vdev id
Bala Venkatesha82fdd9562018-10-11 14:34:37 +0530749 *
750 * Notify tdls component to cleanup all peers
751 *
752 * Return: QDF_STATUS.
753 */
754
Frank Liuaf02af52018-10-24 15:08:00 +0800755QDF_STATUS tdls_delete_all_peers_indication(struct wlan_objmgr_psoc *psoc,
756 uint8_t vdev_id);
Bala Venkatesh36c69752019-08-20 18:32:03 +0530757
758/**
759 * tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and
760 * channel.
761 * @soc_obj: tdls soc object.
762 * @channel: Channel number.
763 * @bw_offset: Bandwidth offset.
bings059c4a02019-12-31 18:24:21 +0800764 * @reg_bw_offset: enum offset_t type bandwidth
Bala Venkatesh36c69752019-08-20 18:32:03 +0530765 *
766 * To return the opclas.
767 *
768 * Return: opclass
769 */
770uint8_t tdls_get_opclass_from_bandwidth(struct tdls_soc_priv_obj *soc_obj,
bings059c4a02019-12-31 18:24:21 +0800771 uint8_t channel, uint8_t bw_offset,
772 uint8_t *reg_bw_offset);
Frank Liu7e890d62017-03-02 17:17:53 +0800773#endif