1 /*
2  * Copyright (c) 2012-2017, 2020 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: os_if_wifi_pos.h
22  * This file provide declaration of wifi_pos's os_if APIs
23  */
24 #ifndef _OS_IF_WIFI_POS_H_
25 #define _OS_IF_WIFI_POS_H_
26 
27 #include "qdf_types.h"
28 #include "qdf_status.h"
29 #include <wlan_objmgr_cmn.h>
30 #include "wifi_pos_public_struct.h"
31 #include "wlan_cfg80211.h"
32 
33 /* forward declaration */
34 struct wifi_pos_ch_info;
35 struct wlan_objmgr_psoc;
36 struct wifi_pos_driver_caps;
37 
38 #ifdef WIFI_POS_CONVERGED
39 #define FEATURE_WIFI_POS_11AZ_AUTH_EVENTS                              \
40 [QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX] = {                 \
41 	.vendor_id = QCA_NL80211_VENDOR_ID,                            \
42 	.subcmd = QCA_NL80211_VENDOR_SUBCMD_PASN,                      \
43 },
44 
45 /**
46  * os_if_wifi_pos_register_nl() - abstraction API to register callback with GENL
47  * socket.
48  *
49  * Return: status of operation
50  */
51 int os_if_wifi_pos_register_nl(void);
52 
53 /**
54  * os_if_wifi_pos_deregister_nl() - abstraction API to deregister callback with
55  * GENL socket.
56  *
57  * Return: status of operation
58  */
59 int os_if_wifi_pos_deregister_nl(void);
60 
61 /**
62  * os_if_wifi_pos_send_peer_status() - Function to send peer status to a
63  * registered application
64  * @peer_mac: MAC address of peer
65  * @peer_status: ePeerConnected or ePeerDisconnected
66  * @peer_timing_meas_cap: 0: RTT/RTT2, 1: RTT3. Default is 0
67  * @session_id: SME session id, i.e. vdev_id
68  * @chan_info: operating channel information
69  * @dev_mode: dev mode for which indication is sent
70  *
71  * Return: none
72  */
73 void os_if_wifi_pos_send_peer_status(struct qdf_mac_addr *peer_mac,
74 				uint8_t peer_status,
75 				uint8_t peer_timing_meas_cap,
76 				uint8_t session_id,
77 				struct wifi_pos_ch_info *chan_info,
78 				enum QDF_OPMODE dev_mode);
79 
80 /**
81  * os_if_wifi_pos_populate_caps() - populate oem capabilities
82  * @psoc: psoc object
83  * @caps: pointer to populate the capabilities
84  *
85  * Return: error code
86  */
87 int os_if_wifi_pos_populate_caps(struct wlan_objmgr_psoc *psoc,
88 				struct wifi_pos_driver_caps *caps);
89 #else
90 #define FEATURE_WIFI_POS_11AZ_AUTH_EVENTS
91 
os_if_wifi_pos_register_nl(void)92 static inline int os_if_wifi_pos_register_nl(void)
93 {
94 	return 0;
95 }
96 
os_if_wifi_pos_deregister_nl(void)97 static inline int os_if_wifi_pos_deregister_nl(void)
98 {
99 	return 0;
100 }
101 
os_if_wifi_pos_send_peer_status(struct qdf_mac_addr * peer_mac,uint8_t peer_status,uint8_t peer_timing_meas_cap,uint8_t session_id,struct wifi_pos_ch_info * chan_info,enum QDF_OPMODE dev_mode)102 static inline void os_if_wifi_pos_send_peer_status(
103 		struct qdf_mac_addr *peer_mac,
104 		uint8_t peer_status,
105 		uint8_t peer_timing_meas_cap,
106 		uint8_t session_id,
107 		struct wifi_pos_ch_info *chan_info,
108 		enum QDF_OPMODE dev_mode)
109 {
110 }
111 
os_if_wifi_pos_populate_caps(struct wlan_objmgr_psoc * psoc,struct wifi_pos_driver_caps * caps)112 static inline int os_if_wifi_pos_populate_caps(struct wlan_objmgr_psoc *psoc,
113 					struct wifi_pos_driver_caps *caps)
114 {
115 	return 0;
116 }
117 #endif
118 
119 #ifdef CNSS_GENL
120 /**
121  * enum cld80211_vendor_sub_cmds
122  * @CLD80211_VENDOR_SUB_CMD_INVALID: invalid cmd type
123  * @CLD80211_VENDOR_SUB_CMD_REGISTRATION: app registration
124  * @CLD80211_VENDOR_SUB_CMD_SET_CAPS: set driver capabilities
125  * @CLD80211_VENDOR_SUB_CMD_GET_CAPS: get driver capabilities
126  * @CLD80211_VENDOR_SUB_CMD_GET_CH_INFO: get channel info
127  * @CLD80211_VENDOR_SUB_CMD_OEM_DATA: oem data req/rsp
128  * @CLD80211_VENDOR_SUB_CMD_OEM_ERROR: oem error rsp
129  * @CLD80211_VENDOR_SUB_CMD_PEER_STATUS_IND: peer status indication
130  * @CLD80211_VENDOR_SUB_CMD__AFTER_LAST: internal marker
131  * @CLD80211_VENDOR_SUB_CMD_MAX: Max cld80211 vendor sub cmds
132  */
133 enum cld80211_vendor_sub_cmds {
134 	CLD80211_VENDOR_SUB_CMD_INVALID = 0,
135 	CLD80211_VENDOR_SUB_CMD_REGISTRATION = 1,
136 	CLD80211_VENDOR_SUB_CMD_SET_CAPS = 2,
137 	CLD80211_VENDOR_SUB_CMD_GET_CAPS = 3,
138 	CLD80211_VENDOR_SUB_CMD_GET_CH_INFO = 4,
139 	CLD80211_VENDOR_SUB_CMD_OEM_DATA = 5,
140 	CLD80211_VENDOR_SUB_CMD_OEM_ERROR = 6,
141 	CLD80211_VENDOR_SUB_CMD_PEER_STATUS_IND = 7,
142 	/* keep last */
143 	CLD80211_VENDOR_SUB_CMD__AFTER_LAST,
144 	CLD80211_VENDOR_SUB_CMD_MAX =
145 		CLD80211_VENDOR_SUB_CMD__AFTER_LAST - 1
146 };
147 
148 /**
149  * enum cld80211_sub_attr_cap_rsp - Capability response sub attribute
150  * @CLD80211_SUB_ATTR_CAPS_INVALID: Invalid capability
151  * @CLD80211_SUB_ATTR_CAPS_OEM_TARGET_SIGNATURE: OEM target signature
152  * @CLD80211_SUB_ATTR_CAPS_OEM_TARGET_TYPE: OEM target type
153  * @CLD80211_SUB_ATTR_CAPS_OEM_FW_VERSION: OEM firmware version
154  * @CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_MAJOR: Driver version major
155  * @CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_MINOR: Driver version minor
156  * @CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_PATCH: Driver version patch
157  * @CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_BUILD: Driver version build
158  * @CLD80211_SUB_ATTR_CAPS_ALLOWED_DWELL_TIME_MIN: Allowed dwell time min
159  * @CLD80211_SUB_ATTR_CAPS_ALLOWED_DWELL_TIME_MAX: Allowed dwell time max
160  * @CLD80211_SUB_ATTR_CAPS_CURRENT_DWELL_TIME_MIN: Current dwell time min
161  * @CLD80211_SUB_ATTR_CAPS_CURRENT_DWELL_TIME_MAX: Current dwell time max
162  * @CLD80211_SUB_ATTR_CAPS_SUPPORTED_BANDS: Supported bands
163  * @CLD80211_SUB_ATTR_CAPS_USER_DEFINED_CAPS: User defined capabilities
164  * @CLD80211_SUB_ATTR_CAPS_AFTER_LAST: internal marker
165  * @CLD80211_SUB_ATTR_CAPS_MAX: Max number for CAP sub attribute
166  *
167  */
168 enum cld80211_sub_attr_cap_rsp {
169 	CLD80211_SUB_ATTR_CAPS_INVALID = 0,
170 	CLD80211_SUB_ATTR_CAPS_OEM_TARGET_SIGNATURE = 1,
171 	CLD80211_SUB_ATTR_CAPS_OEM_TARGET_TYPE = 2,
172 	CLD80211_SUB_ATTR_CAPS_OEM_FW_VERSION = 3,
173 	CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_MAJOR = 4,
174 	CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_MINOR = 5,
175 	CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_PATCH = 6,
176 	CLD80211_SUB_ATTR_CAPS_DRIVER_VERSION_BUILD = 7,
177 	CLD80211_SUB_ATTR_CAPS_ALLOWED_DWELL_TIME_MIN = 8,
178 	CLD80211_SUB_ATTR_CAPS_ALLOWED_DWELL_TIME_MAX = 9,
179 	CLD80211_SUB_ATTR_CAPS_CURRENT_DWELL_TIME_MIN = 10,
180 	CLD80211_SUB_ATTR_CAPS_CURRENT_DWELL_TIME_MAX = 11,
181 	CLD80211_SUB_ATTR_CAPS_SUPPORTED_BANDS = 12,
182 	CLD80211_SUB_ATTR_CAPS_USER_DEFINED_CAPS = 13,
183 
184 	/* keep last */
185 	CLD80211_SUB_ATTR_CAPS_AFTER_LAST,
186 	CLD80211_SUB_ATTR_CAPS_MAX =
187 		CLD80211_SUB_ATTR_CAPS_AFTER_LAST - 1
188 };
189 
190 /**
191  * enum cld80211_sub_attr_channel_rsp - Chan info response sub attribute
192  * @CLD80211_SUB_ATTR_CH_RESP_INVALID: Invalid channel resp
193  * @CLD80211_SUB_ATTR_CH_MORE_DATA: More date sub attr for frag response
194  * @CLD80211_SUB_ATTR_CHANNEL_NUM_CHAN: Number of channels in response
195  * @CLD80211_SUB_ATTR_CH_LIST: Channel list nesting
196  * @CLD80211_SUB_ATTR_CH_CHAN_ID: Channel number
197  * @CLD80211_SUB_ATTR_CH_MHZ: Channel frequency
198  * @CLD80211_SUB_ATTR_CH_BAND_CF_1: Center frequency 1
199  * @CLD80211_SUB_ATTR_CH_BAND_CF_2: Center frequency 2
200  * @CLD80211_SUB_ATTR_CH_INFO: channel info
201  * @CLD80211_SUB_ATTR_CH_REG_INFO_1: regulatory info field 1
202  * @CLD80211_SUB_ATTR_CH_REG_INFO_2: regulatory info field 2
203  * @CLD80211_SUB_ATTR_CH_AFTER_LAST: internal marker
204  * @CLD80211_SUB_ATTR_CH_MAX: Max number for CHAN Info sub attribute
205  *
206  */
207 enum cld80211_sub_attr_channel_rsp {
208 	CLD80211_SUB_ATTR_CH_RESP_INVALID = 0,
209 	CLD80211_SUB_ATTR_CH_MORE_DATA = 1,
210 	CLD80211_SUB_ATTR_CHANNEL_NUM_CHAN = 2,
211 	CLD80211_SUB_ATTR_CH_LIST = 3,
212 	/* CH_* belongs to CH_LIST */
213 	CLD80211_SUB_ATTR_CH_CHAN_ID = 4,
214 	CLD80211_SUB_ATTR_CH_MHZ = 5,
215 	CLD80211_SUB_ATTR_CH_BAND_CF_1 = 6,
216 	CLD80211_SUB_ATTR_CH_BAND_CF_2 = 7,
217 	CLD80211_SUB_ATTR_CH_INFO = 8,
218 	CLD80211_SUB_ATTR_CH_REG_INFO_1 = 9,
219 	CLD80211_SUB_ATTR_CH_REG_INFO_2 = 10,
220 
221 	/* keep last */
222 	CLD80211_SUB_ATTR_CH_AFTER_LAST,
223 	CLD80211_SUB_ATTR_CH_MAX =
224 		CLD80211_SUB_ATTR_CH_AFTER_LAST - 1
225 
226 };
227 
228 /**
229  * enum cld80211_sub_attr_oem_data_req - OEM data req sub attribute
230  * @CLD80211_SUB_ATTR_MSG_OEM_DATA_INVALID: Invalid OEM data request
231  * @CLD80211_SUB_ATTR_MSG_OEM_DATA_FW: Data to Firmware
232  * @CLD80211_SUB_ATTR_MSG_OEM_DATA_DRIVER: Data to driver
233  * @CLD80211_SUB_ATTR_MSG_OEM_DATA_REQ_AFTER_LAST: internal marker
234  * @CLD80211_SUB_ATTR_MSG_OEM_DATA_REQ_MAX: Max number for OEM data req sub
235  * attribute
236  *
237  * OEM data request sub attributes are NLA attributes in NLA type OEM data
238  * request.
239  *
240  */
241 enum cld80211_sub_attr_oem_data_req {
242 	CLD80211_SUB_ATTR_MSG_OEM_DATA_INVALID = 0,
243 	CLD80211_SUB_ATTR_MSG_OEM_DATA_FW = 1,
244 	CLD80211_SUB_ATTR_MSG_OEM_DATA_DRIVER = 2,
245 
246 	/* keep last */
247 	CLD80211_SUB_ATTR_MSG_OEM_DATA_REQ_AFTER_LAST,
248 	CLD80211_SUB_ATTR_MSG_OEM_DATA_REQ_MAX =
249 		CLD80211_SUB_ATTR_MSG_OEM_DATA_REQ_AFTER_LAST - 1
250 };
251 
252 /**
253  * enum cld80211_sub_attr_oem_data_resp - OEM message sub attribute
254  * @CLD80211_SUB_ATTR_OEM_DATA_INVALID: Invalid oem data resp
255  * @CLD80211_SUB_ATTR_OEM_MORE_DATA: more date sub attribute
256  * @CLD80211_SUB_ATTR_BINARY_DATA: Binary data sub attribute
257  * @CLD80211_SUB_ATTR_OEM_DATA_RESP_AFTER_LAST: internal marker
258  * @CLD80211_SUB_ATTR_OEM_DATA_RESP_MAX: Max number for OEM data resp
259  * sub attribute
260  *
261  * OEM message sub attributes are interface between apps and driver to
262  * process NLA type request and response messages.
263  *
264  */
265 enum cld80211_sub_attr_oem_data_resp {
266 	CLD80211_SUB_ATTR_OEM_DATA_INVALID = 0,
267 	CLD80211_SUB_ATTR_OEM_MORE_DATA = 1,
268 	CLD80211_SUB_ATTR_BINARY_DATA = 2,
269 
270 	/* keep last */
271 	CLD80211_SUB_ATTR_OEM_DATA_RESP_AFTER_LAST,
272 	CLD80211_SUB_ATTR_OEM_DATA_RESP_MAX =
273 		CLD80211_SUB_ATTR_OEM_DATA_RESP_AFTER_LAST - 1
274 };
275 
276 /**
277  * enum cld80211_sub_attr_peer_info - peer info sub attribute
278  * @CLD80211_SUB_ATTR_PEER_INVALID: Invalid peer info
279  * @CLD80211_SUB_ATTR_PEER_MAC_ADDR: peer mac address
280  * @CLD80211_SUB_ATTR_PEER_STATUS: peer status
281  * @CLD80211_SUB_ATTR_PEER_VDEV_ID: peer vdevid
282  * @CLD80211_SUB_ATTR_PEER_CAPABILITY: peer capabilities
283  * @CLD80211_SUB_ATTR_PEER_RESERVED: reserved bytes
284  * @CLD80211_SUB_ATTR_PEER_CHAN_INFO: peer channel info
285  * @CLD80211_SUB_ATTR_PEER_AFTER_LAST: internal marker
286  * @CLD80211_SUB_ATTR_PEER_MAX: Max number for peer sub attribute
287  *
288  */
289 enum cld80211_sub_attr_peer_info {
290 	CLD80211_SUB_ATTR_PEER_INVALID = 0,
291 	CLD80211_SUB_ATTR_PEER_MAC_ADDR = 1,
292 	CLD80211_SUB_ATTR_PEER_STATUS = 2,
293 	CLD80211_SUB_ATTR_PEER_VDEV_ID = 3,
294 	CLD80211_SUB_ATTR_PEER_CAPABILITY = 4,
295 	CLD80211_SUB_ATTR_PEER_RESERVED = 5,
296 	CLD80211_SUB_ATTR_PEER_CHAN_INFO = 6,
297 
298 	/* keep last */
299 	CLD80211_SUB_ATTR_PEER_AFTER_LAST,
300 	CLD80211_SUB_ATTR_PEER_MAX =
301 		CLD80211_SUB_ATTR_PEER_AFTER_LAST - 1
302 };
303 #endif
304 
305 #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
306 /**
307  * os_if_wifi_pos_initiate_pasn_auth() - Initiate PASN authentication from
308  * userspace
309  * @vdev: Vdev object pointer
310  * @pasn_peer: PASN Peer list
311  * @num_pasn_peers: number of PASN peers
312  * @is_initiate_pasn: Initiate pasn or initiate flush keys
313  *
314  * Return: QDF_STATUS
315  */
316 QDF_STATUS os_if_wifi_pos_initiate_pasn_auth(struct wlan_objmgr_vdev *vdev,
317 					     struct wlan_pasn_request *pasn_peer,
318 					     uint8_t num_pasn_peers,
319 					     bool is_initiate_pasn);
320 #else
321 static inline
os_if_wifi_pos_initiate_pasn_auth(struct wlan_objmgr_vdev * vdev,struct wlan_pasn_request * pasn_peer,uint8_t num_pasn_peers,bool is_initiate_pasn)322 QDF_STATUS os_if_wifi_pos_initiate_pasn_auth(struct wlan_objmgr_vdev *vdev,
323 					     struct wlan_pasn_request *pasn_peer,
324 					     uint8_t num_pasn_peers,
325 					     bool is_initiate_pasn)
326 {
327 	return QDF_STATUS_E_NOSUPPORT;
328 }
329 #endif /* WLAN_FEATURE_RTT_11AZ_SUPPORT */
330 #endif /* _OS_IF_WIFI_POS_H_ */
331