blob: 12ee0ea7deaea2db46640fb94798f4ed522dc68a [file] [log] [blame]
Frank Liu7e890d62017-03-02 17:17:53 +08001/*
Jeff Johnsondfabe9e2018-12-28 22:40:41 -08002 * Copyright (c) 2017-2019 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
168 * @tdls_nss_transition_mode: tdls nss transition mode
169 * @tdls_teardown_peers_cnt: tdls tear down peer count
Frank Liu7e890d62017-03-02 17:17:53 +0800170 * @set_state_info: set tdls state info
Frank Liu7e890d62017-03-02 17:17:53 +0800171 * @tdls_event_cb: tdls event callback
172 * @tdls_evt_cb_data: tdls event user data
Jeff Johnson31dade32018-03-01 15:31:35 -0800173 * @tdls_peer_context: userdata for register/deregister TDLS peer
174 * @tdls_reg_peer: register tdls peer with datapath
175 * @tdls_dereg_peer: deregister tdls peer from 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
Arun Kumar Khandavalli43fdd252019-04-24 18:34:18 +0530186 * @tdls_osif_init_cb: Callback to initialize the tdls private
187 * @tdls_osif_deinit_cb: Callback to deinitialize the tdls private
Frank Liu7e890d62017-03-02 17:17:53 +0800188 */
189struct tdls_soc_priv_obj {
190 struct wlan_objmgr_psoc *soc;
Frank Liuc3aad432017-03-13 21:30:21 +0800191 enum tdls_feature_mode tdls_current_mode;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800192 enum tdls_feature_mode tdls_last_mode;
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700193 int scan_reject_count;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800194 unsigned long tdls_source_bitmap;
Frank Liu7e890d62017-03-02 17:17:53 +0800195 struct tdls_conn_info tdls_conn_info[WLAN_TDLS_STA_MAX_NUM];
196 struct tdls_user_config tdls_configs;
197 uint16_t max_num_tdls_sta;
198 uint16_t connected_peer_count;
199 uint8_t tdls_off_channel;
200 uint16_t tdls_channel_offset;
201 int32_t tdls_fw_off_chan_mode;
202 bool enable_tdls_connection_tracker;
203 uint8_t tdls_external_peer_count;
204 bool tdls_nss_switch_in_progress;
205 bool tdls_nss_teardown_complete;
Kabilan Kannan03429f42017-02-28 20:28:54 -0800206 bool tdls_disable_in_progress;
Frank Liu7e890d62017-03-02 17:17:53 +0800207 enum tdls_nss_transition_state tdls_nss_transition_mode;
208 int32_t tdls_teardown_peers_cnt;
209 struct tdls_set_state_info set_state_info;
Kabilan Kannanf3f11a72017-03-26 18:52:47 -0700210 tdls_rx_callback tdls_rx_cb;
211 void *tdls_rx_cb_data;
212 tdls_wmm_check tdls_wmm_cb;
213 void *tdls_wmm_cb_data;
Frank Liu7e890d62017-03-02 17:17:53 +0800214 tdls_evt_callback tdls_event_cb;
215 void *tdls_evt_cb_data;
Jeff Johnson31dade32018-03-01 15:31:35 -0800216 void *tdls_peer_context;
217 tdls_register_peer_callback tdls_reg_peer;
218 tdls_deregister_peer_callback tdls_dereg_peer;
Kabilan Kannan7c0093d2017-04-26 13:26:47 -0700219 tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update;
Frank Liu7e890d62017-03-02 17:17:53 +0800220 qdf_list_t tx_q_ack;
221 enum tdls_conc_cap tdls_con_cap;
Frank Liuc3aad432017-03-13 21:30:21 +0800222 uint16_t tdls_send_mgmt_req;
223 uint16_t tdls_add_sta_req;
224 uint16_t tdls_del_sta_req;
225 uint16_t tdls_update_peer_state;
Kabilan Kannance5880e2017-04-17 21:53:42 -0700226 uint16_t tdls_del_all_peers;
Kabilan Kannan7c0093d2017-04-26 13:26:47 -0700227 uint32_t tdls_update_dp_vdev_flags;
Kabilan Kannan00619ab2017-03-20 01:59:24 -0700228 qdf_spinlock_t tdls_ct_spinlock;
Arun Kumar Khandavalli43fdd252019-04-24 18:34:18 +0530229 tdls_vdev_init_cb tdls_osif_init_cb;
230 tdls_vdev_deinit_cb tdls_osif_deinit_cb;
Frank Liu7e890d62017-03-02 17:17:53 +0800231};
232
233/**
234 * struct tdls_vdev_priv_obj - tdls private vdev object
235 * @vdev: vdev objmgr object
236 * @peer_list: tdls peer list on this vdev
237 * @peer_update_timer: connection tracker timer
238 * @peer_dicovery_timer: peer discovery timer
239 * @threshold_config: threshold config
240 * @discovery_peer_cnt: discovery peer count
241 * @discovery_sent_cnt: discovery sent count
Frank Liu7e890d62017-03-02 17:17:53 +0800242 * @curr_candidate: current candidate
243 * @ct_peer_table: linear mac address table for counting the packets
244 * @valid_mac_entries: number of valid mac entry in @ct_peer_mac_table
245 * @magic: magic
246 * @tx_queue: tx frame queue
247 */
248struct tdls_vdev_priv_obj {
249 struct wlan_objmgr_vdev *vdev;
250 qdf_list_t peer_list[WLAN_TDLS_PEER_LIST_SIZE];
251 qdf_mc_timer_t peer_update_timer;
252 qdf_mc_timer_t peer_discovery_timer;
253 struct tdls_config_params threshold_config;
254 int32_t discovery_peer_cnt;
255 uint32_t discovery_sent_cnt;
Frank Liu7e890d62017-03-02 17:17:53 +0800256 struct tdls_peer *curr_candidate;
257 struct tdls_conn_tracker_mac_table
258 ct_peer_table[WLAN_TDLS_CT_TABLE_SIZE];
259 uint8_t valid_mac_entries;
260 uint32_t magic;
Kabilan Kannance5880e2017-04-17 21:53:42 -0700261 uint8_t session_id;
Frank Liu7e890d62017-03-02 17:17:53 +0800262 qdf_list_t tx_queue;
263};
264
265/**
Frank Liuc3aad432017-03-13 21:30:21 +0800266 * struct tdls_peer_mlme_info - tdls peer mlme info
267 **/
268struct tdls_peer_mlme_info {
269};
270
271/**
Frank Liu7e890d62017-03-02 17:17:53 +0800272 * struct tdls_peer - tdls peer data
273 * @node: node
274 * @vdev_priv: tdls vdev priv obj
275 * @peer_mac: peer mac address
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +0530276 * @valid_entry: entry valid or not (set to true when peer create resp is
277 * received from FW)
Frank Liu7e890d62017-03-02 17:17:53 +0800278 * @rssi: rssi
279 * @tdls_support: tdls support
280 * @link_status: tdls link status
Frank Liu7e890d62017-03-02 17:17:53 +0800281 * @is_responder: is responder
282 * @discovery_processed: dicovery processed
283 * @discovery_attempt: discovery attempt
284 * @tx_pkt: tx packet
285 * @rx_pkt: rx packet
286 * @uapsd_queues: uapsd queues
287 * @max_sp: max sp
288 * @buf_sta_capable: is buffer sta
289 * @off_channel_capable: is offchannel supported flag
290 * @supported_channels_len: supported channels length
291 * @supported_channels: supported channels
292 * @supported_oper_classes_len: supported operation classes length
293 * @supported_oper_classes: supported operation classes
294 * @is_forced_peer: is forced peer
295 * @op_class_for_pref_off_chan: op class for preferred off channel
296 * @pref_off_chan_num: preferred off channel number
Frank Liu7e890d62017-03-02 17:17:53 +0800297 * @peer_idle_timer: time to check idle traffic in tdls peers
298 * @is_peer_idle_timer_initialised: Flag to check idle timer init
299 * @spatial_streams: Number of TX/RX spatial streams for TDLS
300 * @reason: reason
301 * @state_change_notification: state change notification
302 * @qos: QOS capability of TDLS link
303 */
304struct tdls_peer {
305 qdf_list_node_t node;
306 struct tdls_vdev_priv_obj *vdev_priv;
307 struct qdf_mac_addr peer_mac;
Yeshwanth Sriram Guntuka4ac15842019-07-16 15:47:21 +0530308 bool valid_entry;
Frank Liu7e890d62017-03-02 17:17:53 +0800309 int8_t rssi;
310 enum tdls_peer_capab tdls_support;
Frank Liuc3aad432017-03-13 21:30:21 +0800311 enum tdls_link_state link_status;
Frank Liu7e890d62017-03-02 17:17:53 +0800312 uint8_t is_responder;
313 uint8_t discovery_processed;
314 uint16_t discovery_attempt;
315 uint16_t tx_pkt;
316 uint16_t rx_pkt;
317 uint8_t uapsd_queues;
318 uint8_t max_sp;
319 uint8_t buf_sta_capable;
320 uint8_t off_channel_capable;
321 uint8_t supported_channels_len;
322 uint8_t supported_channels[WLAN_MAC_MAX_SUPP_CHANNELS];
323 uint8_t supported_oper_classes_len;
324 uint8_t supported_oper_classes[WLAN_MAX_SUPP_OPER_CLASSES];
325 bool is_forced_peer;
326 uint8_t op_class_for_pref_off_chan;
327 uint8_t pref_off_chan_num;
Frank Liu7e890d62017-03-02 17:17:53 +0800328 qdf_mc_timer_t peer_idle_timer;
329 bool is_peer_idle_timer_initialised;
330 uint8_t spatial_streams;
Frank Liuc3aad432017-03-13 21:30:21 +0800331 enum tdls_link_state_reason reason;
Frank Liu7e890d62017-03-02 17:17:53 +0800332 tdls_state_change_callback state_change_notification;
333 uint8_t qos;
Frank Liuc3aad432017-03-13 21:30:21 +0800334 struct tdls_peer_mlme_info *tdls_info;
Frank Liu7e890d62017-03-02 17:17:53 +0800335};
336
337/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800338 * struct tdls_os_if_event - TDLS os event info
339 * @type: type of event
340 * @info: pointer to event information
341 */
342struct tdls_os_if_event {
343 uint32_t type;
344 void *info;
345};
346
347/**
348 * enum tdls_os_if_notification - TDLS notification from OS IF
349 * @TDLS_NOTIFY_STA_SESSION_INCREMENT: sta session count incremented
350 * @TDLS_NOTIFY_STA_SESSION_DECREMENT: sta session count decremented
351 */
352enum tdls_os_if_notification {
353 TDLS_NOTIFY_STA_SESSION_INCREMENT,
354 TDLS_NOTIFY_STA_SESSION_DECREMENT
355};
356/**
Frank Liu7e890d62017-03-02 17:17:53 +0800357 * wlan_vdev_get_tdls_soc_obj - private API to get tdls soc object from vdev
358 * @vdev: vdev object
359 *
360 * Return: tdls soc object
361 */
362static inline struct tdls_soc_priv_obj *
363wlan_vdev_get_tdls_soc_obj(struct wlan_objmgr_vdev *vdev)
364{
Frank Liuc3aad432017-03-13 21:30:21 +0800365 struct wlan_objmgr_psoc *psoc;
366 struct tdls_soc_priv_obj *soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800367
Frank Liuc3aad432017-03-13 21:30:21 +0800368 if (!vdev) {
369 tdls_err("NULL vdev");
370 return NULL;
371 }
372
Frank Liuc3aad432017-03-13 21:30:21 +0800373 psoc = wlan_vdev_get_psoc(vdev);
Frank Liuc3aad432017-03-13 21:30:21 +0800374 if (!psoc) {
375 tdls_err("can't get psoc");
376 return NULL;
377 }
378
Frank Liuc3aad432017-03-13 21:30:21 +0800379 soc_obj = (struct tdls_soc_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800380 wlan_objmgr_psoc_get_comp_private_obj(psoc,
381 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800382
383 return soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800384}
385
386/**
387 * wlan_psoc_get_tdls_soc_obj - private API to get tdls soc object from psoc
388 * @psoc: psoc object
389 *
390 * Return: tdls soc object
391 */
392static inline struct tdls_soc_priv_obj *
393wlan_psoc_get_tdls_soc_obj(struct wlan_objmgr_psoc *psoc)
394{
Frank Liuc3aad432017-03-13 21:30:21 +0800395 struct tdls_soc_priv_obj *soc_obj;
396 if (!psoc) {
397 tdls_err("NULL psoc");
398 return NULL;
399 }
Frank Liuc3aad432017-03-13 21:30:21 +0800400 soc_obj = (struct tdls_soc_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800401 wlan_objmgr_psoc_get_comp_private_obj(psoc,
402 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800403
404 return soc_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800405}
406
407/**
408 * wlan_vdev_get_tdls_vdev_obj - private API to get tdls vdev object from vdev
409 * @vdev: vdev object
410 *
411 * Return: tdls vdev object
412 */
413static inline struct tdls_vdev_priv_obj *
414wlan_vdev_get_tdls_vdev_obj(struct wlan_objmgr_vdev *vdev)
415{
Frank Liuc3aad432017-03-13 21:30:21 +0800416 struct tdls_vdev_priv_obj *vdev_obj;
417
418 if (!vdev) {
419 tdls_err("NULL vdev");
420 return NULL;
421 }
422
Frank Liuc3aad432017-03-13 21:30:21 +0800423 vdev_obj = (struct tdls_vdev_priv_obj *)
Frank Liu7e890d62017-03-02 17:17:53 +0800424 wlan_objmgr_vdev_get_comp_private_obj(vdev,
425 WLAN_UMAC_COMP_TDLS);
Frank Liuc3aad432017-03-13 21:30:21 +0800426
427 return vdev_obj;
Frank Liu7e890d62017-03-02 17:17:53 +0800428}
429
430/**
431 * tdls_set_link_status - tdls set link status
432 * @vdev: vdev object
433 * @mac: mac address of tdls peer
Frank Liuc3aad432017-03-13 21:30:21 +0800434 * @link_state: tdls link state
Frank Liu7e890d62017-03-02 17:17:53 +0800435 * @link_reason: reason
436 */
437void tdls_set_link_status(struct tdls_vdev_priv_obj *vdev,
438 const uint8_t *mac,
Frank Liuc3aad432017-03-13 21:30:21 +0800439 enum tdls_link_state link_state,
440 enum tdls_link_state_reason link_reason);
Frank Liu7e890d62017-03-02 17:17:53 +0800441/**
442 * tdls_psoc_obj_create_notification() - tdls psoc create notification handler
443 * @psoc: psoc object
444 * @arg_list: Argument list
445 *
446 * Return: QDF_STATUS
447 */
448QDF_STATUS tdls_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc,
449 void *arg_list);
450
451/**
452 * tdls_psoc_obj_destroy_notification() - tdls psoc destroy notification handler
453 * @psoc: psoc object
454 * @arg_list: Argument list
455 *
456 * Return: QDF_STATUS
457 */
458QDF_STATUS tdls_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc,
459 void *arg_list);
460
461/**
462 * tdls_vdev_obj_create_notification() - tdls vdev create notification handler
463 * @vdev: vdev object
464 * @arg_list: Argument list
465 *
466 * Return: QDF_STATUS
467 */
468QDF_STATUS tdls_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev,
469 void *arg_list);
470
471/**
472 * tdls_vdev_obj_destroy_notification() - tdls vdev destroy notification handler
473 * @vdev: vdev object
474 * @arg_list: Argument list
475 *
476 * Return: QDF_STATUS
477 */
478QDF_STATUS tdls_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev,
479 void *arg_list);
480
481/**
482 * tdls_process_cmd() - tdls main command process function
483 * @msg: scheduler msg
484 *
485 * Return: QDF_STATUS
486 */
487QDF_STATUS tdls_process_cmd(struct scheduler_msg *msg);
488
489/**
490 * tdls_process_evt() - tdls main event process function
491 * @msg: scheduler msg
492 *
493 * Return: QDF_STATUS
494 */
495QDF_STATUS tdls_process_evt(struct scheduler_msg *msg);
Kabilan Kannan712cbfe2017-03-27 17:20:33 -0700496
497/**
498 * tdls_timer_restart() - restart TDLS timer
499 * @vdev: VDEV object manager
500 * @timer: timer to restart
501 * @expiration_time: new expiration time to set for the timer
502 *
503 * Return: Void
504 */
505void tdls_timer_restart(struct wlan_objmgr_vdev *vdev,
506 qdf_mc_timer_t *timer,
507 uint32_t expiration_time);
508
509/**
510 * wlan_hdd_tdls_timers_stop() - stop all the tdls timers running
511 * @tdls_vdev: TDLS vdev
512 *
513 * Return: none
514 */
515void tdls_timers_stop(struct tdls_vdev_priv_obj *tdls_vdev);
516
Kabilan Kannan00619ab2017-03-20 01:59:24 -0700517/**
518 * tdls_get_vdev_objects() - Get TDLS private objects
519 * @vdev: VDEV object manager
520 * @tdls_vdev_obj: tdls vdev object
521 * @tdls_soc_obj: tdls soc object
522 *
523 * Return: QDF_STATUS
524 */
525QDF_STATUS tdls_get_vdev_objects(struct wlan_objmgr_vdev *vdev,
526 struct tdls_vdev_priv_obj **tdls_vdev_obj,
527 struct tdls_soc_priv_obj **tdls_soc_obj);
528
Kabilan Kannan03429f42017-02-28 20:28:54 -0800529/**
530 * cds_set_tdls_ct_mode() - Set the tdls connection tracker mode
531 * @hdd_ctx: hdd context
532 *
533 * This routine is called to set the tdls connection tracker operation status
534 *
535 * Return: NONE
536 */
537void tdls_set_ct_mode(struct wlan_objmgr_psoc *psoc);
538
539/**
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700540 * tdls_set_operation_mode() - set tdls operating mode
541 * @tdls_set_mode: tdls mode set params
542 *
543 * Return: QDF_STATUS
544 */
545QDF_STATUS tdls_set_operation_mode(struct tdls_set_mode_params *tdls_set_mode);
546
547/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800548 * tdls_notify_sta_connect() - Update tdls state for every
549 * connect event.
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700550 * @notify: sta connect params
Kabilan Kannan03429f42017-02-28 20:28:54 -0800551 *
552 * After every connect event in the system, check whether TDLS
553 * can be enabled in the system. If TDLS can be enabled, update the
554 * TDLS state as needed.
555 *
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700556 * Return: QDF_STATUS
Kabilan Kannan03429f42017-02-28 20:28:54 -0800557 */
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700558QDF_STATUS tdls_notify_sta_connect(struct tdls_sta_notify_params *notify);
Kabilan Kannan03429f42017-02-28 20:28:54 -0800559
560/**
561 * tdls_notify_sta_disconnect() - Update tdls state for every
562 * disconnect event.
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700563 * @notify: sta disconnect params
Kabilan Kannan03429f42017-02-28 20:28:54 -0800564 *
565 * After every disconnect event in the system, check whether TDLS
566 * can be disabled/enabled in the system and update the
567 * TDLS state as needed.
568 *
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700569 * Return: QDF_STATUS
Kabilan Kannan03429f42017-02-28 20:28:54 -0800570 */
Kabilan Kannan53f502c2017-04-14 23:36:42 -0700571QDF_STATUS tdls_notify_sta_disconnect(struct tdls_sta_notify_params *notify);
Kabilan Kannan03429f42017-02-28 20:28:54 -0800572
573/**
Kabilan Kannan52eb3c72017-06-06 19:40:03 -0700574 * tdls_notify_reset_adapter() - notify reset adapter
Frank Liuaf02af52018-10-24 15:08:00 +0800575 * @vdev: vdev object
Kabilan Kannan52eb3c72017-06-06 19:40:03 -0700576 *
577 * Notify TDLS about the adapter reset
578 *
579 * Return: None
580 */
581void tdls_notify_reset_adapter(struct wlan_objmgr_vdev *vdev);
582
583/**
Kabilan Kannan952df192017-05-15 20:28:05 -0700584 * tdls_peers_deleted_notification() - peer delete notification
Frank Liuaf02af52018-10-24 15:08:00 +0800585 * @psoc: soc object
586 * @vdev_id: vdev id
Kabilan Kannan952df192017-05-15 20:28:05 -0700587 *
588 * Legacy lim layer will delete tdls peers for roaming and heart beat failures
589 * and notify the component about the delete event to update the tdls.
590 * state.
591 *
Jingxiang Gea551f692018-07-13 15:16:03 +0800592 * Return: QDF_STATUS
Kabilan Kannan952df192017-05-15 20:28:05 -0700593 */
Frank Liuaf02af52018-10-24 15:08:00 +0800594QDF_STATUS tdls_peers_deleted_notification(struct wlan_objmgr_psoc *psoc,
595 uint8_t vdev_id);
Kabilan Kannan952df192017-05-15 20:28:05 -0700596
597/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800598 * tdls_notify_decrement_session() - Notify the session decrement
599 * @psoc: psoc object manager
600 *
601 * Policy manager notify TDLS about session decrement
602 *
603 * Return: None
604 */
605void tdls_notify_decrement_session(struct wlan_objmgr_psoc *psoc);
606
607/**
Bala Venkatesh10a46e92018-09-06 14:38:13 +0530608 * tdls_send_update_to_fw - update tdls status info
609 * @tdls_vdev_obj: tdls vdev private object.
610 * @tdls_prohibited: indicates whether tdls is prohibited.
611 * @tdls_chan_swit_prohibited: indicates whether tdls channel switch
612 * is prohibited.
613 * @sta_connect_event: indicate sta connect or disconnect event
614 * @session_id: session id
615 *
616 * Normally an AP does not influence TDLS connection between STAs
617 * associated to it. But AP may set bits for TDLS Prohibited or
618 * TDLS Channel Switch Prohibited in Extended Capability IE in
619 * Assoc/Re-assoc response to STA. So after STA is connected to
620 * an AP, call this function to update TDLS status as per those
621 * bits set in Ext Cap IE in received Assoc/Re-assoc response
622 * from AP.
623 *
624 * Return: None.
625 */
626void tdls_send_update_to_fw(struct tdls_vdev_priv_obj *tdls_vdev_obj,
627 struct tdls_soc_priv_obj *tdls_soc_obj,
628 bool tdls_prohibited,
629 bool tdls_chan_swit_prohibited,
630 bool sta_connect_event,
631 uint8_t session_id);
632
633/**
Kabilan Kannan03429f42017-02-28 20:28:54 -0800634 * tdls_notify_increment_session() - Notify the session increment
635 * @psoc: psoc object manager
636 *
637 * Policy manager notify TDLS about session increment
638 *
639 * Return: None
640 */
641void tdls_notify_increment_session(struct wlan_objmgr_psoc *psoc);
642
643/**
644 * tdls_check_is_tdls_allowed() - check is tdls allowed or not
645 * @vdev: vdev object
646 *
647 * Function determines the whether TDLS allowed in the system
648 *
649 * Return: true or false
650 */
651bool tdls_check_is_tdls_allowed(struct wlan_objmgr_vdev *vdev);
652
653/**
654 * tdls_get_vdev() - Get tdls specific vdev object manager
655 * @psoc: wlan psoc object manager
656 * @dbg_id: debug id
657 *
658 * If TDLS possible, return the corresponding vdev
659 * to enable TDLS in the system.
660 *
661 * Return: vdev manager pointer or NULL.
662 */
663struct wlan_objmgr_vdev *tdls_get_vdev(struct wlan_objmgr_psoc *psoc,
664 wlan_objmgr_ref_dbgid dbg_id);
665
666/**
667 * tdls_process_policy_mgr_notification() - process policy manager notification
668 * @psoc: soc object manager
669 *
670 * Return: QDF_STATUS
671 */
672QDF_STATUS
673tdls_process_policy_mgr_notification(struct wlan_objmgr_psoc *psoc);
674
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700675/**
Bala Venkateshc8bbb002018-12-18 19:55:48 +0530676 * tdls_process_decrement_active_session() - process policy manager decrement
677 * sessions.
678 * @psoc: soc object manager
679 *
680 * Return: QDF_STATUS
681 */
682QDF_STATUS
683tdls_process_decrement_active_session(struct wlan_objmgr_psoc *psoc);
684/**
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700685 * tdls_scan_complete_event_handler() - scan complete event handler for tdls
686 * @vdev: vdev object
687 * @event: scan event
688 * @arg: tdls soc object
689 *
690 * Return: None
691 */
692void tdls_scan_complete_event_handler(struct wlan_objmgr_vdev *vdev,
693 struct scan_event *event,
694 void *arg);
695
696/**
697 * tdls_scan_callback() - callback for TDLS scan operation
698 * @soc: tdls soc pvt object
699 *
700 * Return: QDF_STATUS
701 */
702QDF_STATUS tdls_scan_callback(struct tdls_soc_priv_obj *tdls_soc);
703
704/**
705 * wlan_hdd_tdls_scan_done_callback() - callback for tdls scan done event
706 * @tdls_soc: tdls soc object
707 *
708 * Return: Void
709 */
710void tdls_scan_done_callback(struct tdls_soc_priv_obj *tdls_soc);
711
712/**
713 * tdls_scan_serialization_comp_info_cb() - callback for scan start
Varun Reddy Yeturucccf0992017-08-10 13:37:08 -0700714 * @vdev: VDEV on which the scan command is being processed
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700715 * @comp_info: serialize rules info
716 *
717 * Return: negative = caller should stop and return error code immediately
718 * 1 = caller can continue to scan
719 */
Varun Reddy Yeturucccf0992017-08-10 13:37:08 -0700720void tdls_scan_serialization_comp_info_cb(struct wlan_objmgr_vdev *vdev,
Kabilan Kannanb4c693d2017-03-27 23:42:04 -0700721 union wlan_serialization_rules_info *comp_info);
722
Kabilan Kannance5880e2017-04-17 21:53:42 -0700723/**
724 * tdls_set_offchan_mode() - update tdls status info
725 * @psoc: soc object
726 * @param: channel switch params
727 *
728 * send message to WMI to set TDLS off channel in f/w
729 *
730 * Return: QDF_STATUS.
731 */
732QDF_STATUS tdls_set_offchan_mode(struct wlan_objmgr_psoc *psoc,
733 struct tdls_channel_switch_params *param);
734
Bala Venkatesha82fdd9562018-10-11 14:34:37 +0530735/**
736 * tdls_delete_all_peers_indication() - update tdls status info
Frank Liuaf02af52018-10-24 15:08:00 +0800737 * @psoc: soc object
738 * @vdev_id: vdev id
Bala Venkatesha82fdd9562018-10-11 14:34:37 +0530739 *
740 * Notify tdls component to cleanup all peers
741 *
742 * Return: QDF_STATUS.
743 */
744
Frank Liuaf02af52018-10-24 15:08:00 +0800745QDF_STATUS tdls_delete_all_peers_indication(struct wlan_objmgr_psoc *psoc,
746 uint8_t vdev_id);
Bala Venkatesh36c69752019-08-20 18:32:03 +0530747
748/**
749 * tdls_get_opclass_from_bandwidth() - Return opclass for corresponding BW and
750 * channel.
751 * @soc_obj: tdls soc object.
752 * @channel: Channel number.
753 * @bw_offset: Bandwidth offset.
754 *
755 * To return the opclas.
756 *
757 * Return: opclass
758 */
759uint8_t tdls_get_opclass_from_bandwidth(struct tdls_soc_priv_obj *soc_obj,
760 uint8_t channel, uint8_t bw_offset);
Frank Liu7e890d62017-03-02 17:17:53 +0800761#endif