1 /*
2 * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2024 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 #ifndef __HDD_TDLS_H
21 #define __HDD_TDLS_H
22 /**
23 * DOC: wlan_hdd_tdls.h
24 * WLAN Host Device Driver TDLS include file
25 */
26
27 #include "qca_vendor.h"
28
29 struct hdd_context;
30
31 #ifdef FEATURE_WLAN_TDLS
32
33 extern const struct nla_policy
34 wlan_hdd_tdls_mode_configuration_policy
35 [QCA_WLAN_VENDOR_ATTR_TDLS_CONFIG_MAX + 1];
36
37 extern const struct nla_policy
38 wlan_hdd_tdls_disc_rsp_policy
39 [QCA_WLAN_VENDOR_ATTR_TDLS_DISC_RSP_EXT_MAX + 1];
40
41 #define FEATURE_TDLS_VENDOR_COMMANDS \
42 { \
43 .info.vendor_id = QCA_NL80211_VENDOR_ID, \
44 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_CONFIGURE_TDLS, \
45 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
46 WIPHY_VENDOR_CMD_NEED_NETDEV | \
47 WIPHY_VENDOR_CMD_NEED_RUNNING, \
48 .doit = wlan_hdd_cfg80211_configure_tdls_mode, \
49 vendor_command_policy(wlan_hdd_tdls_mode_configuration_policy, \
50 QCA_WLAN_VENDOR_ATTR_TDLS_CONFIG_MAX) \
51 }, \
52 { \
53 .info.vendor_id = QCA_NL80211_VENDOR_ID, \
54 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TDLS_ENABLE, \
55 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
56 WIPHY_VENDOR_CMD_NEED_NETDEV | \
57 WIPHY_VENDOR_CMD_NEED_RUNNING, \
58 .doit = wlan_hdd_cfg80211_exttdls_enable, \
59 vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) \
60 }, \
61 { \
62 .info.vendor_id = QCA_NL80211_VENDOR_ID, \
63 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TDLS_DISABLE, \
64 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
65 WIPHY_VENDOR_CMD_NEED_NETDEV | \
66 WIPHY_VENDOR_CMD_NEED_RUNNING, \
67 .doit = wlan_hdd_cfg80211_exttdls_disable, \
68 vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) \
69 }, \
70 { \
71 .info.vendor_id = QCA_NL80211_VENDOR_ID, \
72 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TDLS_GET_STATUS, \
73 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
74 WIPHY_VENDOR_CMD_NEED_NETDEV, \
75 .doit = wlan_hdd_cfg80211_exttdls_get_status, \
76 vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) \
77 }, \
78 { \
79 .info.vendor_id = QCA_NL80211_VENDOR_ID, \
80 .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_TDLS_DISC_RSP_EXT, \
81 .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
82 WIPHY_VENDOR_CMD_NEED_NETDEV, \
83 .doit = wlan_hdd_cfg80211_exttdls_set_link_id, \
84 vendor_command_policy(wlan_hdd_tdls_disc_rsp_policy, \
85 QCA_WLAN_VENDOR_ATTR_TDLS_DISC_RSP_EXT_TX_LINK) \
86 },
87
88 /* Bit mask flag for tdls_option to FW */
89 #define ENA_TDLS_OFFCHAN (1 << 0) /* TDLS Off Channel support */
90 #define ENA_TDLS_BUFFER_STA (1 << 1) /* TDLS Buffer STA support */
91 #define ENA_TDLS_SLEEP_STA (1 << 2) /* TDLS Sleep STA support */
92
93 int wlan_hdd_tdls_get_all_peers(struct hdd_adapter *adapter, char *buf,
94 int buflen);
95
96 int wlan_hdd_cfg80211_exttdls_enable(struct wiphy *wiphy,
97 struct wireless_dev *wdev,
98 const void *data,
99 int data_len);
100
101 int wlan_hdd_cfg80211_exttdls_disable(struct wiphy *wiphy,
102 struct wireless_dev *wdev,
103 const void *data,
104 int data_len);
105
106 int wlan_hdd_cfg80211_exttdls_get_status(struct wiphy *wiphy,
107 struct wireless_dev *wdev,
108 const void *data,
109 int data_len);
110
111 /**
112 * wlan_hdd_cfg80211_exttdls_set_link_id() - set link id
113 * @wiphy: pointer to wireless wiphy structure.
114 * @wdev: pointer to wireless_dev structure.
115 * @data: Pointer to the data to be passed via vendor interface
116 * @data_len:Length of the data to be passed
117 *
118 * Return: Return the Success or Failure code.
119 */
120 int
121 wlan_hdd_cfg80211_exttdls_set_link_id(struct wiphy *wiphy,
122 struct wireless_dev *wdev,
123 const void *data,
124 int data_len);
125
126 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
127 int wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy,
128 struct net_device *dev,
129 const uint8_t *peer,
130 enum nl80211_tdls_operation oper);
131 #else
132 int wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy,
133 struct net_device *dev,
134 uint8_t *peer,
135 enum nl80211_tdls_operation oper);
136 #endif
137
138 #ifdef TDLS_MGMT_VERSION5
139 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
140 struct net_device *dev, const uint8_t *peer,
141 uint8_t action_code, uint8_t dialog_token,
142 uint16_t status_code, uint32_t peer_capability,
143 bool initiator, const uint8_t *buf,
144 size_t len, int link_id);
145 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0))
146 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
147 struct net_device *dev, const u8 *peer,
148 int link_id, u8 action_code,
149 u8 dialog_token, u16 status_code,
150 u32 peer_capability, bool initiator,
151 const u8 *buf, size_t len);
152 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0))
153 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
154 struct net_device *dev, const uint8_t *peer,
155 uint8_t action_code, uint8_t dialog_token,
156 uint16_t status_code, uint32_t peer_capability,
157 bool initiator, const uint8_t *buf,
158 size_t len);
159 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
160 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
161 struct net_device *dev, const uint8_t *peer,
162 uint8_t action_code, uint8_t dialog_token,
163 uint16_t status_code, uint32_t peer_capability,
164 const uint8_t *buf, size_t len);
165 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0)) || defined(TDLS_MGMT_VERSION2)
166 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
167 struct net_device *dev, uint8_t *peer,
168 uint8_t action_code, uint8_t dialog_token,
169 uint16_t status_code, uint32_t peer_capability,
170 const uint8_t *buf, size_t len);
171 #else
172 int wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
173 struct net_device *dev, uint8_t *peer,
174 uint8_t action_code, uint8_t dialog_token,
175 uint16_t status_code, const uint8_t *buf,
176 size_t len);
177 #endif
178
179 /**
180 * hdd_set_tdls_offchannel() - set tdls off-channel number
181 * @hdd_ctx: Pointer to the HDD context
182 * @adapter: Pointer to the HDD adapter
183 * @offchannel: tdls off-channel number
184 *
185 * This function sets tdls off-channel number
186 *
187 * Return: 0 on success; negative errno otherwise
188 */
189 int hdd_set_tdls_offchannel(struct hdd_context *hdd_ctx,
190 struct hdd_adapter *adapter,
191 int offchannel);
192
193 /**
194 * hdd_get_tdls_connected_peer_count() - Gets connected TDLS peer count.
195 * @link_info: Pointer to link_info in hdd adapter
196 *
197 * This function return number of connected peer.
198 *
199 * Return: void
200 */
201 uint16_t
202 hdd_get_tdls_connected_peer_count(struct wlan_hdd_link_info *link_info);
203
204 /**
205 * hdd_check_and_set_tdls_conn_params() - Sets and Overwrite netdev params if
206 * stations is connected in 11A, 11B and 11G mode.
207 * @vdev: Pointer to vdev objmgr
208 *
209 * This function updates the netdev params such as enabling checksum/tso
210 * if the feature "disable checksum/tso for 11abg connections" is enabled via
211 * INI. if INI is enabled then 11abg sta link will be created by disabling
212 * checksum/tso which are needed to be enabled for better throughput
213 * for TDLS connected in 11AX, 11AC, 11N mode
214 *
215 * Return: void
216 */
217 void hdd_check_and_set_tdls_conn_params(struct wlan_objmgr_vdev *vdev);
218
219 /**
220 * hdd_check_and_set_tdls_disconn_params() - Overwrite netdev params if BSS
221 * STA link is 11A, 11B and 11G mode
222 * when TDLS is disconnected
223 * @vdev: Pointer to vdev objmgr
224 *
225 * During TDLS connection if STA-BSS link is in 11a, 11b, 11g mode, then
226 * legacy netdev features such as checksum/tso are enabled. This function will
227 * take care of disabling them during TDLS disconnection if the feature
228 * "disable checksum/tso for 11abg connections" is enabled via INI.
229 *
230 * Return: void
231 */
232 void hdd_check_and_set_tdls_disconn_params(struct wlan_objmgr_vdev *vdev);
233
234 /**
235 * hdd_set_tdls_secoffchanneloffset() - set secondary tdls off-channel offset
236 * @hdd_ctx: Pointer to the HDD context
237 * @adapter: Pointer to the HDD adapter
238 * @offchanoffset: tdls off-channel offset
239 *
240 * This function sets secondary tdls off-channel offset
241 *
242 * Return: 0 on success; negative errno otherwise
243 */
244 int hdd_set_tdls_secoffchanneloffset(struct hdd_context *hdd_ctx,
245 struct hdd_adapter *adapter,
246 int offchanoffset);
247
248 /**
249 * hdd_set_tdls_offchannelmode() - set tdls off-channel mode
250 * @hdd_ctx: Pointer to the HDD context
251 * @adapter: Pointer to the HDD adapter
252 * @offchanmode: tdls off-channel mode
253 * 1-Enable Channel Switch
254 * 2-Disable Channel Switch
255 *
256 * This function sets tdls off-channel mode
257 *
258 * Return: 0 on success; negative errno otherwise
259 */
260 int hdd_set_tdls_offchannelmode(struct hdd_context *hdd_ctx,
261 struct hdd_adapter *adapter,
262 int offchanmode);
263 int hdd_set_tdls_scan_type(struct hdd_context *hdd_ctx, int val);
264
265 /**
266 * wlan_hdd_tdls_antenna_switch() - Dynamic TDLS antenna switch 1x1 <-> 2x2
267 * antenna mode in standalone station
268 * @link_info: Pointer to link_info in hdd adapter
269 * @mode: enum antenna_mode
270 *
271 * Return: 0 if success else non zero
272 */
273 int wlan_hdd_tdls_antenna_switch(struct wlan_hdd_link_info *link_info,
274 uint32_t mode);
275
276 /**
277 * wlan_hdd_cfg80211_configure_tdls_mode() - configure tdls mode
278 * @wiphy: pointer to wireless wiphy structure.
279 * @wdev: pointer to wireless_dev structure.
280 * @data: Pointer to the data to be passed via vendor interface
281 * @data_len:Length of the data to be passed
282 *
283 * Return: Return the Success or Failure code.
284 */
285 int wlan_hdd_cfg80211_configure_tdls_mode(struct wiphy *wiphy,
286 struct wireless_dev *wdev,
287 const void *data,
288 int data_len);
289
290 QDF_STATUS hdd_tdls_register_peer(void *userdata, uint32_t vdev_id,
291 const uint8_t *mac, uint8_t qos);
292
293 /**
294 * hdd_init_tdls_config() - initialize tdls config
295 * @tdls_cfg: pointer to tdls_start_params structure
296 *
297 * Return: none
298 */
299 void hdd_init_tdls_config(struct tdls_start_params *tdls_cfg);
300
301 /**
302 * hdd_config_tdls_with_band_switch() - configure tdls when band changes
303 * Disable tdls offchmode if only one of
304 * bands is supported
305 * Enable tdls offchmode if all band enable
306 * @hdd_ctx: Pointer to the HDD context
307 *
308 * Return: none
309 */
310 void hdd_config_tdls_with_band_switch(struct hdd_context *hdd_ctx);
311 #else
312
313 #define FEATURE_TDLS_VENDOR_COMMANDS
314
315 static inline int
wlan_hdd_tdls_antenna_switch(struct wlan_hdd_link_info * link_info,uint32_t mode)316 wlan_hdd_tdls_antenna_switch(struct wlan_hdd_link_info *link_info,
317 uint32_t mode)
318 {
319 return 0;
320 }
321
wlan_hdd_cfg80211_configure_tdls_mode(struct wiphy * wiphy,struct wireless_dev * wdev,const void * data,int data_len)322 static inline int wlan_hdd_cfg80211_configure_tdls_mode(struct wiphy *wiphy,
323 struct wireless_dev *wdev,
324 const void *data,
325 int data_len)
326 {
327 return 0;
328 }
329
330 static inline
hdd_tdls_register_peer(void * userdata,uint32_t vdev_id,const uint8_t * mac,uint8_t qos)331 QDF_STATUS hdd_tdls_register_peer(void *userdata, uint32_t vdev_id,
332 const uint8_t *mac, uint8_t qos)
333 {
334 return QDF_STATUS_SUCCESS;
335 }
336
hdd_init_tdls_config(struct tdls_start_params * tdls_cfg)337 static inline void hdd_init_tdls_config(struct tdls_start_params *tdls_cfg)
338 {
339 }
340
hdd_config_tdls_with_band_switch(struct hdd_context * hdd_ctx)341 static inline void hdd_config_tdls_with_band_switch(struct hdd_context *hdd_ctx)
342 {
343 }
344
345 static inline uint16_t
hdd_get_tdls_connected_peer_count(struct wlan_hdd_link_info * link_info)346 hdd_get_tdls_connected_peer_count(struct wlan_hdd_link_info *link_info)
347 {
348 return 0;
349 }
350
351 static inline void
hdd_check_and_set_tdls_conn_params(struct wlan_objmgr_vdev * vdev)352 hdd_check_and_set_tdls_conn_params(struct wlan_objmgr_vdev *vdev)
353 {
354 }
355
356 static inline void
hdd_check_and_set_tdls_disconn_params(struct wlan_objmgr_vdev * vdev)357 hdd_check_and_set_tdls_disconn_params(struct wlan_objmgr_vdev *vdev)
358 {
359 }
360 #endif /* End of FEATURE_WLAN_TDLS */
361 #endif /* __HDD_TDLS_H */
362