xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/wlan_cfg80211.h (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 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: declares driver functions interfacing with linux kernel
22  */
23 
24 
25 #ifndef _WLAN_CFG80211_H_
26 #define _WLAN_CFG80211_H_
27 
28 #include <linux/version.h>
29 #include <linux/netdevice.h>
30 #include <net/netlink.h>
31 #include <net/cfg80211.h>
32 #include <qca_vendor.h>
33 #include <qdf_nbuf.h>
34 #include "qal_devcfg.h"
35 #include "wlan_osif_features.h"
36 
37 #define osif_alert(params...) \
38 	QDF_TRACE_FATAL(QDF_MODULE_ID_OS_IF, params)
39 #define osif_err(params...) \
40 	QDF_TRACE_ERROR(QDF_MODULE_ID_OS_IF, params)
41 #define osif_warn(params...) \
42 	QDF_TRACE_WARN(QDF_MODULE_ID_OS_IF, params)
43 #define osif_notice(params...) \
44 	QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params)
45 #define osif_info(params...) \
46 	QDF_TRACE_INFO(QDF_MODULE_ID_OS_IF, params)
47 #define osif_debug(params...) \
48 	QDF_TRACE_DEBUG(QDF_MODULE_ID_OS_IF, params)
49 #define osif_rl_debug(params...) \
50 	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_OS_IF, params)
51 #define osif_err_rl(params...) \
52 	QDF_TRACE_ERROR_RL(QDF_MODULE_ID_OS_IF, params)
53 
54 #define osif_nofl_alert(params...) \
55 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_OS_IF, params)
56 #define osif_nofl_err(params...) \
57 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_OS_IF, params)
58 #define osif_nofl_warn(params...) \
59 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_OS_IF, params)
60 #define osif_nofl_info(params...) \
61 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_OS_IF, params)
62 #define osif_nofl_debug(params...) \
63 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_OS_IF, params)
64 
65 #define osif_enter_dev(dev) \
66 	QDF_TRACE_ENTER(QDF_MODULE_ID_OS_IF, "enter(%s)", (dev)->name)
67 
68 /**
69  * enum qca_nl80211_vendor_subcmds_index - vendor sub commands index
70  *
71  * @QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX: Avoid frequency
72  * @QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX: Nan
73  * @QCA_NL80211_VENDOR_SUBCMD_STATS_EXT_INDEX: Ext stats
74  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX: Ext scan start
75  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX: Ext scan stop
76  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX: Ext scan get
77  *	capability
78  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX: Ext scan get
79  *	cached results
80  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX: Ext scan
81  *	results available
82  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX: Ext scan full
83  *	scan result
84  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX: Ext scan event
85  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX: Ext scan hot list
86  *	AP found
87  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX: Ext scan set
88  *	bssid hotlist
89  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX: Ext scan reset
90  *	bssid hotlist
91  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX: Ext scan
92  *	significant change
93  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX: Ext scan
94  *	set significant change
95  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX: Ext scan
96  *	reset significant change
97  * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET_INDEX: Set stats
98  * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET_INDEX: Get stats
99  * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR_INDEX: Clear stats
100  * @QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX: Radio stats
101  * @QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX: Iface stats
102  * @QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX: Peer info stats
103  * @QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX: MAC layer counters
104  * @QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX: Ext tdls state change
105  * @QCA_NL80211_VENDOR_SUBCMD_DO_ACS_INDEX: ACS command
106  * @QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX: Pass Roam and Auth info
107  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX: hotlist ap lost
108  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX:
109  *	pno network found index
110  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX:
111  *	passpoint match found index
112  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX:
113  *	set ssid hotlist index
114  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX:
115  *	reset ssid hotlist index
116  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX:
117  *	hotlist ssid found index
118  * @QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX:
119  *	hotlist ssid lost index
120  * @QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX
121  *	dcc stats event index
122  * @QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX: vendor scan index
123  * @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX:
124  *	vendor scan complete event  index
125  * @QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX:
126  *	update gateway parameters index
127  * @QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP_INDEX:
128  *	update aps info which has interop issues events index
129  * @QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX: TSF response events index
130  * @QCA_NL80211_VENDOR_SUBCMD_P2P_LO_EVENT_INDEX:
131  *      P2P listen offload index
132  * @QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX: SAP
133  *      conditional channel switch index
134  * @QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX: NUD DEBUG Stats index
135  * @QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX: hang event reason index
136  * @QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX: MAC mode info index
137  * @QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX: NAN Extended index
138  * @QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING_INDEX: Beacon reporting index
139  * @QCA_NL80211_VENDOR_SUBCMD_REQUEST_SAR_LIMITS_INDEX: Request SAR limit index
140  * @QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO_INDEX: Update STA info index
141  * @QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX: Update SSID index
142  * @QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX: Wifi FW stats index
143  * @QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX:
144  *	MBSSID TX VDEV status index
145  * @QCA_NL80211_VENDOR_SUBCMD_THERMAL_INDEX: Report thermal event index
146  * @QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX: TWT config index
147  * @QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX: CFR data event index
148  * @QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX: Driver Ready after SSR index
149  * @QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX: SCS rule config index
150  * @QCA_NL80211_VENDOR_SUBCMD_SR_INDEX: SR Event index
151  */
152 
153 enum qca_nl80211_vendor_subcmds_index {
154 	QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY_INDEX = 0,
155 
156 	QCA_NL80211_VENDOR_SUBCMD_NAN_INDEX,
157 
158 #ifdef WLAN_FEATURE_STATS_EXT
159 	QCA_NL80211_VENDOR_SUBCMD_STATS_EXT_INDEX,
160 #endif /* WLAN_FEATURE_STATS_EXT */
161 
162 #ifdef FEATURE_WLAN_EXTSCAN
163 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_START_INDEX,
164 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_STOP_INDEX,
165 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX,
166 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CACHED_RESULTS_INDEX,
167 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
168 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX,
169 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
170 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_FOUND_INDEX,
171 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_BSSID_HOTLIST_INDEX,
172 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_BSSID_HOTLIST_INDEX,
173 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX,
174 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SIGNIFICANT_CHANGE_INDEX,
175 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SIGNIFICANT_CHANGE_INDEX,
176 #endif /* FEATURE_WLAN_EXTSCAN */
177 
178 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
179 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_SET_INDEX,
180 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_GET_INDEX,
181 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_CLR_INDEX,
182 	QCA_NL80211_VENDOR_SUBCMD_LL_RADIO_STATS_INDEX,
183 	QCA_NL80211_VENDOR_SUBCMD_LL_IFACE_STATS_INDEX,
184 	QCA_NL80211_VENDOR_SUBCMD_LL_PEER_INFO_STATS_INDEX,
185 	QCA_NL80211_VENDOR_SUBCMD_LL_STATS_EXT_INDEX,
186 #endif /* WLAN_FEATURE_LINK_LAYER_STATS */
187 
188 	QCA_NL80211_VENDOR_SUBCMD_TDLS_STATE_CHANGE_INDEX,
189 	QCA_NL80211_VENDOR_SUBCMD_DO_ACS_INDEX,
190 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
191 	QCA_NL80211_VENDOR_SUBCMD_KEY_MGMT_ROAM_AUTH_INDEX,
192 #endif
193 	/* DFS */
194 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_STARTED_INDEX,
195 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_FINISHED_INDEX,
196 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_ABORTED_INDEX,
197 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_CAC_NOP_FINISHED_INDEX,
198 	QCA_NL80211_VENDOR_SUBCMD_DFS_OFFLOAD_RADAR_DETECTED_INDEX,
199 #ifdef FEATURE_WLAN_EXTSCAN
200 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_AP_LOST_INDEX,
201 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX,
202 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX,
203 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SET_SSID_HOTLIST_INDEX,
204 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_RESET_SSID_HOTLIST_INDEX,
205 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_FOUND_INDEX,
206 	QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_HOTLIST_SSID_LOST_INDEX,
207 #endif /* FEATURE_WLAN_EXTSCAN */
208 	QCA_NL80211_VENDOR_SUBCMD_GET_WIFI_CONFIGURATION_INDEX,
209 	QCA_NL80211_VENDOR_SUBCMD_MONITOR_RSSI_INDEX,
210 #ifdef WLAN_FEATURE_MEMDUMP
211 	QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_MEMORY_DUMP_INDEX,
212 #endif /* WLAN_FEATURE_MEMDUMP */
213 	/* OCB events */
214 	QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX,
215 	QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX,
216 	QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX,
217 	QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX,
218 	QCA_NL80211_VENDOR_SUBCMD_INTEROP_ISSUES_AP_INDEX,
219 #ifdef WLAN_FEATURE_TSF
220 	QCA_NL80211_VENDOR_SUBCMD_TSF_INDEX,
221 #endif
222 	QCA_NL80211_VENDOR_SUBCMD_NDP_INDEX,
223 	QCA_NL80211_VENDOR_SUBCMD_P2P_LO_EVENT_INDEX,
224 	QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX,
225 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_EXTERNAL_ACS_CONFIG,
226 	QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX,
227 	QCA_NL80211_VENDOR_SUBCMD_NUD_STATS_GET_INDEX,
228 	QCA_NL80211_VENDOR_SUBCMD_HANG_REASON_INDEX,
229 	QCA_NL80211_VENDOR_SUBCMD_WLAN_MAC_INFO_INDEX,
230 	QCA_NL80211_VENDOR_SUBCMD_NAN_EXT_INDEX,
231 	QCA_NL80211_VENDOR_SUBCMD_THROUGHPUT_CHANGE_EVENT_INDEX,
232 	QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES_INDEX,
233 	QCA_NL80211_VENDOR_SUBCMD_PEER_STATS_CACHE_FLUSH_INDEX,
234 	QCA_NL80211_VENDOR_SUBCMD_BEACON_REPORTING_INDEX,
235 	QCA_NL80211_VENDOR_SUBCMD_ROAM_INDEX,
236 	QCA_NL80211_VENDOR_SUBCMD_OEM_DATA_INDEX,
237 	QCA_NL80211_VENDOR_SUBCMD_REQUEST_SAR_LIMITS_INDEX,
238 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO_INDEX,
239 	QCA_NL80211_VENDOR_SUBCMD_MEDIUM_ASSESS_INDEX,
240 	QCA_NL80211_VENDOR_SUBCMD_UPDATE_SSID_INDEX,
241 	QCA_NL80211_VENDOR_SUBCMD_WIFI_FW_STATS_INDEX,
242 	QCA_NL80211_VENDOR_SUBCMD_MBSSID_TX_VDEV_STATUS_INDEX,
243 	QCA_NL80211_VENDOR_SUBCMD_THERMAL_INDEX,
244 #ifdef WLAN_SUPPORT_TWT
245 	QCA_NL80211_VENDOR_SUBCMD_CONFIG_TWT_INDEX,
246 #endif
247 #ifdef WLAN_CFR_ENABLE
248 	QCA_NL80211_VENDOR_SUBCMD_PEER_CFR_CAPTURE_CFG_INDEX,
249 #endif
250 #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
251 	QCA_NL80211_VENDOR_SUBCMD_DIAG_EVENT_INDEX,
252 #endif
253 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
254 	QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX,
255 #endif
256 	QCA_NL80211_VENDOR_SUBCMD_MCC_QUOTA_INDEX,
257 	QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING_INDEX,
258 	QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX,
259 	QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX,
260 #ifdef WLAN_SUPPORT_SCS
261 	QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX,
262 #endif
263 #ifdef WLAN_FEATURE_SR
264 	QCA_NL80211_VENDOR_SUBCMD_SR_INDEX,
265 #endif
266 };
267 
268 #if !defined(SUPPORT_WDEV_CFG80211_VENDOR_EVENT_ALLOC) && \
269 	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) && \
270 	!defined(WITH_BACKPORTS)
271 
272 static inline struct sk_buff *
273 backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy,
274 				       struct wireless_dev *wdev,
275 				       int approxlen,
276 				       int event_idx, gfp_t gfp)
277 {
278 	struct sk_buff *skb;
279 
280 	skb = cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp);
281 
282 	if (skb && wdev) {
283 		struct nlattr *attr;
284 		u32 ifindex = wdev->netdev->ifindex;
285 
286 		nla_nest_cancel(skb, ((void **)skb->cb)[2]);
287 		if (nla_put_u32(skb, NL80211_ATTR_IFINDEX, ifindex))
288 			goto nla_fail;
289 
290 		attr = nla_nest_start(skb, NL80211_ATTR_VENDOR_DATA);
291 		((void **)skb->cb)[2] = attr;
292 	}
293 
294 	return skb;
295 
296 nla_fail:
297 	kfree_skb(skb);
298 
299 	return NULL;
300 }
301 
302 #define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc
303 #endif
304 
305 /* For kernel version >= 5.2, driver needs to provide policy */
306 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0))
307 #define vendor_command_policy(__policy, __maxattr) \
308 	.policy = __policy,                        \
309 	.maxattr = __maxattr
310 #define VENDOR_NLA_POLICY_NESTED(__policy) \
311 	NLA_POLICY_NESTED(__policy)
312 #else
313 #define vendor_command_policy(__policy, __maxattr)
314 #define VENDOR_NLA_POLICY_NESTED(__policy) {.type = NLA_NESTED}
315 #endif /*End of (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0) */
316 
317 /* For kernel version <= 4.20, driver needs to provide policy */
318 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0))
319 #define VENDOR_NLA_POLICY_MAC_ADDR NLA_POLICY_ETH_ADDR
320 #define VENDOR_NLA_POLICY_IPV4_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV4_ADDR_SIZE)
321 #define VENDOR_NLA_POLICY_IPV6_ADDR NLA_POLICY_EXACT_LEN(QDF_IPV6_ADDR_SIZE)
322 #else
323 #define VENDOR_NLA_POLICY_MAC_ADDR \
324 	{.type = NLA_UNSPEC, .len = QDF_MAC_ADDR_SIZE}
325 #define NLA_EXACT_LEN NLA_UNSPEC
326 #define VENDOR_NLA_POLICY_IPV4_ADDR \
327 	{.type = NLA_EXACT_LEN, .len = QDF_IPV4_ADDR_SIZE}
328 #define VENDOR_NLA_POLICY_IPV6_ADDR \
329 	{.type = NLA_EXACT_LEN, .len = QDF_IPV6_ADDR_SIZE}
330 #endif /*End of (LINUX_VERSION_CODE <= KERNEL_VERSION(4, 20, 0) */
331 
332 #if defined(NBUF_MEMORY_DEBUG) && defined(NETLINK_BUF_TRACK)
333 #define wlan_cfg80211_vendor_free_skb(skb) \
334 	qdf_nbuf_free(skb)
335 
336 #define wlan_cfg80211_vendor_event(skb, gfp) \
337 { \
338 	qdf_nbuf_count_dec(skb); \
339 	qdf_net_buf_debug_release_skb(skb); \
340 	cfg80211_vendor_event(skb, gfp); \
341 }
342 
343 #define wlan_cfg80211_vendor_cmd_reply(skb) \
344 { \
345 	qdf_nbuf_count_dec(skb); \
346 	qdf_net_buf_debug_release_skb(skb); \
347 	cfg80211_vendor_cmd_reply(skb); \
348 }
349 
350 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response(qdf_nbuf_t skb)
351 {
352 	qdf_nbuf_count_dec(skb);
353 	qdf_net_buf_debug_release_skb(skb);
354 	return qal_devcfg_send_response(skb);
355 }
356 
357 static inline struct sk_buff *
358 __cfg80211_vendor_cmd_alloc_reply_skb(struct wiphy *wiphy, int len,
359 				      const char *func, uint32_t line)
360 {
361 	struct sk_buff *skb;
362 
363 	skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len);
364 	if (skb) {
365 		qdf_nbuf_count_inc(skb);
366 		qdf_net_buf_debug_acquire_skb(skb, func, line);
367 	}
368 	return skb;
369 }
370 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
371 	__cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len, __func__, __LINE__)
372 
373 static inline struct sk_buff *
374 __cfg80211_vendor_event_alloc(struct wiphy *wiphy,
375 			      struct wireless_dev *wdev,
376 			      int approxlen,
377 			      int event_idx,
378 			      gfp_t gfp,
379 			      const char *func,
380 			      uint32_t line)
381 {
382 	struct sk_buff *skb;
383 
384 	skb = cfg80211_vendor_event_alloc(wiphy, wdev,
385 					  approxlen,
386 					  event_idx,
387 					  gfp);
388 	if (skb) {
389 		qdf_nbuf_count_inc(skb);
390 		qdf_net_buf_debug_acquire_skb(skb, func, line);
391 	}
392 	return skb;
393 }
394 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
395 	__cfg80211_vendor_event_alloc(wiphy, wdev, len, \
396 				      idx, gfp, \
397 				      __func__, __LINE__)
398 #else /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
399 #define wlan_cfg80211_vendor_free_skb(skb) \
400 	kfree_skb(skb)
401 
402 #define wlan_cfg80211_vendor_event(skb, gfp) \
403 	cfg80211_vendor_event(skb, gfp)
404 
405 #define wlan_cfg80211_vendor_cmd_reply(skb) \
406 	cfg80211_vendor_cmd_reply(skb)
407 
408 #define wlan_cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len) \
409 	cfg80211_vendor_cmd_alloc_reply_skb(wiphy, len)
410 
411 #define wlan_cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp) \
412 	cfg80211_vendor_event_alloc(wiphy, wdev, len, idx, gfp)
413 
414 static inline QDF_STATUS wlan_cfg80211_qal_devcfg_send_response( qdf_nbuf_t skb)
415 {
416 	return qal_devcfg_send_response(skb);
417 }
418 #endif /* NBUF_MEMORY_DEBUG && NETLINK_BUF_TRACK */
419 
420 #undef nla_parse
421 #undef nla_parse_nested
422 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
423 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
424 					  int maxtype,
425 					  const struct nlattr *head,
426 					  int len,
427 					  const struct nla_policy *policy)
428 {
429 	return nla_parse(tb, maxtype, head, len, policy);
430 }
431 
432 static inline int
433 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
434 			       int maxtype,
435 			       const struct nlattr *nla,
436 			       const struct nla_policy *policy)
437 {
438 	return nla_parse_nested(tb, maxtype, nla, policy);
439 }
440 #else
441 static inline int wlan_cfg80211_nla_parse(struct nlattr **tb,
442 					  int maxtype,
443 					  const struct nlattr *head,
444 					  int len,
445 					  const struct nla_policy *policy)
446 {
447 	return nla_parse(tb, maxtype, head, len, policy, NULL);
448 }
449 
450 static inline int
451 wlan_cfg80211_nla_parse_nested(struct nlattr *tb[],
452 			       int maxtype,
453 			       const struct nlattr *nla,
454 			       const struct nla_policy *policy)
455 {
456 	return nla_parse_nested(tb, maxtype, nla, policy, NULL);
457 }
458 #endif
459 #define nla_parse(...) (obsolete, use wlan_cfg80211_nla_parse)
460 #define nla_parse_nested(...) (obsolete, use wlan_cfg80211_nla_parse_nested)
461 
462 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
463 static inline int
464 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
465 {
466 	return nla_put_u64(skb, attrtype, value);
467 }
468 #else
469 static inline int
470 wlan_cfg80211_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value)
471 {
472 	return nla_put_u64_64bit(skb, attrtype, value, NL80211_ATTR_PAD);
473 }
474 #endif
475 
476 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 11, 0))
477 static inline ssize_t
478 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize)
479 {
480 	return nla_strlcpy(dst, nla, dstsize);
481 }
482 #else
483 static inline ssize_t
484 wlan_cfg80211_nla_strscpy(char *dst, const struct nlattr *nla, size_t dstsize)
485 {
486 	return nla_strscpy(dst, nla, dstsize);
487 }
488 #endif
489 
490 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
491 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev)
492 {
493 	return cfg80211_register_netdevice(dev);
494 }
495 #else
496 static inline int wlan_cfg80211_register_netdevice(struct net_device *dev)
497 {
498 	return register_netdevice(dev);
499 }
500 #endif
501 
502 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
503 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev)
504 {
505 	cfg80211_unregister_netdevice(dev);
506 }
507 #else
508 static inline void wlan_cfg80211_unregister_netdevice(struct net_device *dev)
509 {
510 	unregister_netdevice(dev);
511 }
512 #endif
513 
514 #ifdef CFG80211_SINGLE_NETDEV_MULTI_LINK_SUPPORT
515 static inline
516 void wlan_cfg80211_ch_switch_notify(struct net_device *dev,
517 				    struct cfg80211_chan_def *chandef,
518 				    unsigned int link_id)
519 {
520 	cfg80211_ch_switch_notify(dev, chandef, link_id);
521 }
522 #else
523 static inline
524 void wlan_cfg80211_ch_switch_notify(struct net_device *dev,
525 				    struct cfg80211_chan_def *chandef,
526 				    unsigned int link_id)
527 {
528 	cfg80211_ch_switch_notify(dev, chandef);
529 }
530 #endif
531 
532 #endif
533