1 /*
2 * Copyright (c) 2018 Texas Instruments, Incorporated
3 * Copyright (c) 2023 Nordic Semiconductor ASA
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 /**
9 * @file
10 * @brief IEEE 802.11 protocol and general Wi-Fi definitions.
11 */
12
13 /**
14 * @defgroup wifi_mgmt Wi-Fi Management
15 * Wi-Fi Management API.
16 * @ingroup networking
17 * @{
18 */
19
20 #ifndef ZEPHYR_INCLUDE_NET_WIFI_H_
21 #define ZEPHYR_INCLUDE_NET_WIFI_H_
22
23 #include <zephyr/sys/util.h> /* for ARRAY_SIZE */
24
25 #define WIFI_COUNTRY_CODE_LEN 2
26
27 #define WIFI_LISTEN_INTERVAL_MIN 0
28 #define WIFI_LISTEN_INTERVAL_MAX 65535
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 /** IEEE 802.11 security types. */
35 enum wifi_security_type {
36 /** No security. */
37 WIFI_SECURITY_TYPE_NONE = 0,
38 /** WPA2-PSK security. */
39 WIFI_SECURITY_TYPE_PSK,
40 /** WPA2-PSK-SHA256 security. */
41 WIFI_SECURITY_TYPE_PSK_SHA256,
42 /** WPA3-SAE security. */
43 WIFI_SECURITY_TYPE_SAE,
44 /** GB 15629.11-2003 WAPI security. */
45 WIFI_SECURITY_TYPE_WAPI,
46 /** EAP security - Enterprise. */
47 WIFI_SECURITY_TYPE_EAP,
48 /** WEP security. */
49 WIFI_SECURITY_TYPE_WEP,
50 /** WPA-PSK security. */
51 WIFI_SECURITY_TYPE_WPA_PSK,
52
53 __WIFI_SECURITY_TYPE_AFTER_LAST,
54 WIFI_SECURITY_TYPE_MAX = __WIFI_SECURITY_TYPE_AFTER_LAST - 1,
55 WIFI_SECURITY_TYPE_UNKNOWN
56 };
57
58 /** Helper function to get user-friendly security type name. */
59 const char * const wifi_security_txt(enum wifi_security_type security);
60
61 /** IEEE 802.11w - Management frame protection. */
62 enum wifi_mfp_options {
63 /** MFP disabled. */
64 WIFI_MFP_DISABLE = 0,
65 /** MFP optional. */
66 WIFI_MFP_OPTIONAL,
67 /** MFP required. */
68 WIFI_MFP_REQUIRED,
69
70 __WIFI_MFP_AFTER_LAST,
71 WIFI_MFP_MAX = __WIFI_MFP_AFTER_LAST - 1,
72 WIFI_MFP_UNKNOWN
73 };
74
75 /** Helper function to get user-friendly MFP name.*/
76 const char * const wifi_mfp_txt(enum wifi_mfp_options mfp);
77
78 /**
79 * @brief IEEE 802.11 operational frequency bands (not exhaustive).
80 */
81 enum wifi_frequency_bands {
82 /** 2.4 GHz band. */
83 WIFI_FREQ_BAND_2_4_GHZ = 0,
84 /** 5 GHz band. */
85 WIFI_FREQ_BAND_5_GHZ,
86 /** 6 GHz band (Wi-Fi 6E, also extends to 7GHz). */
87 WIFI_FREQ_BAND_6_GHZ,
88
89 /** Number of frequency bands available. */
90 __WIFI_FREQ_BAND_AFTER_LAST,
91 /** Highest frequency band available. */
92 WIFI_FREQ_BAND_MAX = __WIFI_FREQ_BAND_AFTER_LAST - 1,
93 /** Invalid frequency band */
94 WIFI_FREQ_BAND_UNKNOWN
95 };
96
97 /** Helper function to get user-friendly frequency band name. */
98 const char * const wifi_band_txt(enum wifi_frequency_bands band);
99
100 #define WIFI_SSID_MAX_LEN 32
101 #define WIFI_PSK_MIN_LEN 8
102 #define WIFI_PSK_MAX_LEN 64
103 #define WIFI_SAE_PSWD_MAX_LEN 128
104 #define WIFI_MAC_ADDR_LEN 6
105
106 #define WIFI_CHANNEL_MIN 1
107 #define WIFI_CHANNEL_MAX 233
108 #define WIFI_CHANNEL_ANY 255
109
110 /** Wi-Fi interface states.
111 *
112 * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc
113 */
114 enum wifi_iface_state {
115 /** Interface is disconnected. */
116 WIFI_STATE_DISCONNECTED = 0,
117 /** Interface is disabled (administratively). */
118 WIFI_STATE_INTERFACE_DISABLED,
119 /** No enabled networks in the configuration. */
120 WIFI_STATE_INACTIVE,
121 /** Interface is scanning for networks. */
122 WIFI_STATE_SCANNING,
123 /** Authentication with a network is in progress. */
124 WIFI_STATE_AUTHENTICATING,
125 /** Association with a network is in progress. */
126 WIFI_STATE_ASSOCIATING,
127 /** Association with a network completed. */
128 WIFI_STATE_ASSOCIATED,
129 /** 4-way handshake with a network is in progress. */
130 WIFI_STATE_4WAY_HANDSHAKE,
131 /** Group Key exchange with a network is in progress. */
132 WIFI_STATE_GROUP_HANDSHAKE,
133 /** All authentication completed, ready to pass data. */
134 WIFI_STATE_COMPLETED,
135
136 __WIFI_STATE_AFTER_LAST,
137 WIFI_STATE_MAX = __WIFI_STATE_AFTER_LAST - 1,
138 WIFI_STATE_UNKNOWN
139 };
140
141 /** Helper function to get user-friendly interface state name. */
142 const char * const wifi_state_txt(enum wifi_iface_state state);
143
144 /** Wi-Fi interface modes.
145 *
146 * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc
147 */
148 enum wifi_iface_mode {
149 /** Infrastructure station mode. */
150 WIFI_MODE_INFRA = 0,
151 /** IBSS (ad-hoc) station mode. */
152 WIFI_MODE_IBSS = 1,
153 /** AP mode. */
154 WIFI_MODE_AP = 2,
155 /** P2P group owner mode. */
156 WIFI_MODE_P2P_GO = 3,
157 /** P2P group formation mode. */
158 WIFI_MODE_P2P_GROUP_FORMATION = 4,
159 /** 802.11s Mesh mode. */
160 WIFI_MODE_MESH = 5,
161
162 __WIFI_MODE_AFTER_LAST,
163 WIFI_MODE_MAX = __WIFI_MODE_AFTER_LAST - 1,
164 WIFI_MODE_UNKNOWN
165 };
166
167 /** Helper function to get user-friendly interface mode name. */
168 const char * const wifi_mode_txt(enum wifi_iface_mode mode);
169
170 /** Wi-Fi link operating modes
171 *
172 * As per https://en.wikipedia.org/wiki/Wi-Fi#Versions_and_generations.
173 */
174 enum wifi_link_mode {
175 /** 802.11 (legacy). */
176 WIFI_0 = 0,
177 /** 802.11b. */
178 WIFI_1,
179 /** 802.11a. */
180 WIFI_2,
181 /** 802.11g. */
182 WIFI_3,
183 /** 802.11n. */
184 WIFI_4,
185 /** 802.11ac. */
186 WIFI_5,
187 /** 802.11ax. */
188 WIFI_6,
189 /** 802.11ax 6GHz. */
190 WIFI_6E,
191 /** 802.11be. */
192 WIFI_7,
193
194 __WIFI_LINK_MODE_AFTER_LAST,
195 WIFI_LINK_MODE_MAX = __WIFI_LINK_MODE_AFTER_LAST - 1,
196 WIFI_LINK_MODE_UNKNOWN
197 };
198
199 /** Helper function to get user-friendly link mode name. */
200 const char * const wifi_link_mode_txt(enum wifi_link_mode link_mode);
201
202 /** Wi-Fi scanning types. */
203 enum wifi_scan_type {
204 /** Active scanning (default). */
205 WIFI_SCAN_TYPE_ACTIVE = 0,
206 /** Passive scanning. */
207 WIFI_SCAN_TYPE_PASSIVE,
208 };
209
210 /** Wi-Fi power save states. */
211 enum wifi_ps {
212 /** Power save disabled. */
213 WIFI_PS_DISABLED = 0,
214 /** Power save enabled. */
215 WIFI_PS_ENABLED,
216 };
217
218 /** Helper function to get user-friendly ps name. */
219 const char * const wifi_ps_txt(enum wifi_ps ps_name);
220
221 /** Wi-Fi power save modes. */
222 enum wifi_ps_mode {
223 /** Legacy power save mode. */
224 WIFI_PS_MODE_LEGACY = 0,
225 /* This has to be configured before connecting to the AP,
226 * as support for ADDTS action frames is not available.
227 */
228 /** WMM power save mode. */
229 WIFI_PS_MODE_WMM,
230 };
231
232 /** Helper function to get user-friendly ps mode name. */
233 const char * const wifi_ps_mode_txt(enum wifi_ps_mode ps_mode);
234
235 /* Interface index Min and Max values */
236 #define WIFI_INTERFACE_INDEX_MIN 1
237 #define WIFI_INTERFACE_INDEX_MAX 255
238
239 /** Wifi operational mode */
240 enum wifi_operational_modes {
241 /** STA mode setting enable */
242 WIFI_STA_MODE = BIT(0),
243 /** Monitor mode setting enable */
244 WIFI_MONITOR_MODE = BIT(1),
245 /** TX injection mode setting enable */
246 WIFI_TX_INJECTION_MODE = BIT(2),
247 /** Promiscuous mode setting enable */
248 WIFI_PROMISCUOUS_MODE = BIT(3),
249 /** AP mode setting enable */
250 WIFI_AP_MODE = BIT(4),
251 /** Softap mode setting enable */
252 WIFI_SOFTAP_MODE = BIT(5),
253 };
254
255 /** Mode filter settings */
256 enum wifi_filter {
257 /** Support management, data and control packet sniffing */
258 WIFI_PACKET_FILTER_ALL = BIT(0),
259 /** Support only sniffing of management packets */
260 WIFI_PACKET_FILTER_MGMT = BIT(1),
261 /** Support only sniffing of data packets */
262 WIFI_PACKET_FILTER_DATA = BIT(2),
263 /** Support only sniffing of control packets */
264 WIFI_PACKET_FILTER_CTRL = BIT(3),
265 };
266
267 /** Wi-Fi Target Wake Time (TWT) operations. */
268 enum wifi_twt_operation {
269 /** TWT setup operation */
270 WIFI_TWT_SETUP = 0,
271 /** TWT teardown operation */
272 WIFI_TWT_TEARDOWN,
273 };
274
275 /** Helper function to get user-friendly twt operation name. */
276 const char * const wifi_twt_operation_txt(enum wifi_twt_operation twt_operation);
277
278 /** Wi-Fi Target Wake Time (TWT) negotiation types. */
279 enum wifi_twt_negotiation_type {
280 /** TWT individual negotiation */
281 WIFI_TWT_INDIVIDUAL = 0,
282 /** TWT broadcast negotiation */
283 WIFI_TWT_BROADCAST,
284 /** TWT wake TBTT negotiation */
285 WIFI_TWT_WAKE_TBTT
286 };
287
288 /** Helper function to get user-friendly twt negotiation type name. */
289 const char * const wifi_twt_negotiation_type_txt(enum wifi_twt_negotiation_type twt_negotiation);
290
291 /** Wi-Fi Target Wake Time (TWT) setup commands. */
292 enum wifi_twt_setup_cmd {
293 /** TWT setup request */
294 WIFI_TWT_SETUP_CMD_REQUEST = 0,
295 /** TWT setup suggest (parameters can be changed by AP) */
296 WIFI_TWT_SETUP_CMD_SUGGEST,
297 /** TWT setup demand (parameters can not be changed by AP) */
298 WIFI_TWT_SETUP_CMD_DEMAND,
299 /** TWT setup grouping (grouping of TWT flows) */
300 WIFI_TWT_SETUP_CMD_GROUPING,
301 /** TWT setup accept (parameters accepted by AP) */
302 WIFI_TWT_SETUP_CMD_ACCEPT,
303 /** TWT setup alternate (alternate parameters suggested by AP) */
304 WIFI_TWT_SETUP_CMD_ALTERNATE,
305 /** TWT setup dictate (parameters dictated by AP) */
306 WIFI_TWT_SETUP_CMD_DICTATE,
307 /** TWT setup reject (parameters rejected by AP) */
308 WIFI_TWT_SETUP_CMD_REJECT,
309 };
310
311 /** Helper function to get user-friendly twt setup cmd name. */
312 const char * const wifi_twt_setup_cmd_txt(enum wifi_twt_setup_cmd twt_setup);
313
314 /** Wi-Fi Target Wake Time (TWT) negotiation status. */
315 enum wifi_twt_setup_resp_status {
316 /** TWT response received for TWT request */
317 WIFI_TWT_RESP_RECEIVED = 0,
318 /** TWT response not received for TWT request */
319 WIFI_TWT_RESP_NOT_RECEIVED,
320 };
321
322 /** Target Wake Time (TWT) error codes. */
323 enum wifi_twt_fail_reason {
324 /** Unspecified error */
325 WIFI_TWT_FAIL_UNSPECIFIED,
326 /** Command execution failed */
327 WIFI_TWT_FAIL_CMD_EXEC_FAIL,
328 /** Operation not supported */
329 WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED,
330 /** Unable to get interface status */
331 WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS,
332 /** Device not connected to AP */
333 WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED,
334 /** Peer not HE (802.11ax/Wi-Fi 6) capable */
335 WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB,
336 /** Peer not TWT capable */
337 WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB,
338 /** A TWT flow is already in progress */
339 WIFI_TWT_FAIL_OPERATION_IN_PROGRESS,
340 /** Invalid negotiated flow id */
341 WIFI_TWT_FAIL_INVALID_FLOW_ID,
342 /** IP address not assigned or configured */
343 WIFI_TWT_FAIL_IP_NOT_ASSIGNED,
344 /** Flow already exists */
345 WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS,
346 };
347
348 /** @cond INTERNAL_HIDDEN */
349 static const char * const wifi_twt_err_code_tbl[] = {
350 [WIFI_TWT_FAIL_UNSPECIFIED] = "Unspecified",
351 [WIFI_TWT_FAIL_CMD_EXEC_FAIL] = "Command Execution failed",
352 [WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED] =
353 "Operation not supported",
354 [WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS] =
355 "Unable to get iface status",
356 [WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED] =
357 "Device not connected",
358 [WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB] = "Peer not HE capable",
359 [WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB] = "Peer not TWT capable",
360 [WIFI_TWT_FAIL_OPERATION_IN_PROGRESS] =
361 "Operation already in progress",
362 [WIFI_TWT_FAIL_INVALID_FLOW_ID] =
363 "Invalid negotiated flow id",
364 [WIFI_TWT_FAIL_IP_NOT_ASSIGNED] =
365 "IP address not assigned",
366 [WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS] =
367 "Flow already exists",
368 };
369 /** @endcond */
370
371 /** Helper function to get user-friendly TWT error code name. */
wifi_twt_get_err_code_str(int16_t err_no)372 static inline const char *wifi_twt_get_err_code_str(int16_t err_no)
373 {
374 if ((err_no) < (int16_t)ARRAY_SIZE(wifi_twt_err_code_tbl)) {
375 return wifi_twt_err_code_tbl[err_no];
376 }
377
378 return "<unknown>";
379 }
380
381 /** Wi-Fi power save parameters. */
382 enum wifi_ps_param_type {
383 /** Power save state. */
384 WIFI_PS_PARAM_STATE,
385 /** Power save listen interval. */
386 WIFI_PS_PARAM_LISTEN_INTERVAL,
387 /** Power save wakeup mode. */
388 WIFI_PS_PARAM_WAKEUP_MODE,
389 /** Power save mode. */
390 WIFI_PS_PARAM_MODE,
391 /** Power save timeout. */
392 WIFI_PS_PARAM_TIMEOUT,
393 };
394
395 /** Wi-Fi power save modes. */
396 enum wifi_ps_wakeup_mode {
397 /** DTIM based wakeup. */
398 WIFI_PS_WAKEUP_MODE_DTIM = 0,
399 /** Listen interval based wakeup. */
400 WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL,
401 };
402
403 /** Helper function to get user-friendly ps wakeup mode name. */
404 const char * const wifi_ps_wakeup_mode_txt(enum wifi_ps_wakeup_mode ps_wakeup_mode);
405
406 /** Wi-Fi power save error codes. */
407 enum wifi_config_ps_param_fail_reason {
408 /** Unspecified error */
409 WIFI_PS_PARAM_FAIL_UNSPECIFIED,
410 /** Command execution failed */
411 WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL,
412 /** Parameter not supported */
413 WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED,
414 /** Unable to get interface status */
415 WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS,
416 /** Device not connected to AP */
417 WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED,
418 /** Device already connected to AP */
419 WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED,
420 /** Listen interval out of range */
421 WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID,
422 };
423
424 /** @cond INTERNAL_HIDDEN */
425 static const char * const wifi_ps_param_config_err_code_tbl[] = {
426 [WIFI_PS_PARAM_FAIL_UNSPECIFIED] = "Unspecified",
427 [WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL] = "Command Execution failed",
428 [WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED] =
429 "Operation not supported",
430 [WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS] =
431 "Unable to get iface status",
432 [WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED] =
433 "Cannot set parameters while device not connected",
434 [WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED] =
435 "Cannot set parameters while device connected",
436 [WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID] =
437 "Parameter out of range",
438 };
439 /** @endcond */
440
441 /** Helper function to get user-friendly power save error code name. */
wifi_ps_get_config_err_code_str(int16_t err_no)442 static inline const char *wifi_ps_get_config_err_code_str(int16_t err_no)
443 {
444 if ((err_no) < (int16_t)ARRAY_SIZE(wifi_ps_param_config_err_code_tbl)) {
445 return wifi_ps_param_config_err_code_tbl[err_no];
446 }
447
448 return "<unknown>";
449 }
450
451 #ifdef __cplusplus
452 }
453 #endif
454
455 /**
456 * @}
457 */
458 #endif /* ZEPHYR_INCLUDE_NET_WIFI_H_ */
459