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   * @brief Wi-Fi Management API.
15   * @defgroup wifi_mgmt Wi-Fi Management
16   * @since 1.12
17   * @version 0.8.0
18   * @ingroup networking
19   * @{
20   */
21  
22  #ifndef ZEPHYR_INCLUDE_NET_WIFI_H_
23  #define ZEPHYR_INCLUDE_NET_WIFI_H_
24  
25  #include <zephyr/sys/util.h>  /* for ARRAY_SIZE */
26  
27  /** Length of the country code string */
28  #define WIFI_COUNTRY_CODE_LEN 2
29  
30  /** @cond INTERNAL_HIDDEN */
31  
32  #define WIFI_LISTEN_INTERVAL_MIN 0
33  #define WIFI_LISTEN_INTERVAL_MAX 65535
34  
35  /** @endcond */
36  
37  #ifdef __cplusplus
38  extern "C" {
39  #endif
40  
41  /** @brief IEEE 802.11 security types. */
42  enum wifi_security_type {
43  	/** No security. */
44  	WIFI_SECURITY_TYPE_NONE = 0,
45  	/** WPA2-PSK security. */
46  	WIFI_SECURITY_TYPE_PSK,
47  	/** WPA2-PSK-SHA256 security. */
48  	WIFI_SECURITY_TYPE_PSK_SHA256,
49  	/** WPA3-SAE security. */
50  	WIFI_SECURITY_TYPE_SAE,
51  	/** WPA3-SAE security with hunting-and-pecking loop. */
52  	WIFI_SECURITY_TYPE_SAE_HNP = WIFI_SECURITY_TYPE_SAE,
53  	/** WPA3-SAE security with hash-to-element. */
54  	WIFI_SECURITY_TYPE_SAE_H2E,
55  	/** WPA3-SAE security with both hunting-and-pecking loop and hash-to-element enabled. */
56  	WIFI_SECURITY_TYPE_SAE_AUTO,
57  	/** GB 15629.11-2003 WAPI security. */
58  	WIFI_SECURITY_TYPE_WAPI,
59  	/** EAP security - Enterprise. */
60  	WIFI_SECURITY_TYPE_EAP,
61  	/** EAP TLS security - Enterprise. */
62  	WIFI_SECURITY_TYPE_EAP_TLS = WIFI_SECURITY_TYPE_EAP,
63  	/** WEP security. */
64  	WIFI_SECURITY_TYPE_WEP,
65  	/** WPA-PSK security. */
66  	WIFI_SECURITY_TYPE_WPA_PSK,
67  	/** WPA/WPA2/WPA3 PSK security. */
68  	WIFI_SECURITY_TYPE_WPA_AUTO_PERSONAL,
69  	/** DPP security */
70  	WIFI_SECURITY_TYPE_DPP,
71  	/** EAP PEAP MSCHAPV2 security - Enterprise. */
72  	WIFI_SECURITY_TYPE_EAP_PEAP_MSCHAPV2,
73  	/** EAP PEAP GTC security - Enterprise. */
74  	WIFI_SECURITY_TYPE_EAP_PEAP_GTC,
75  	/** EAP TTLS MSCHAPV2 security - Enterprise. */
76  	WIFI_SECURITY_TYPE_EAP_TTLS_MSCHAPV2,
77  	/** EAP PEAP security - Enterprise. */
78  	WIFI_SECURITY_TYPE_EAP_PEAP_TLS,
79  	/** FT-PSK security */
80  	WIFI_SECURITY_TYPE_FT_PSK,
81  	/** FT-SAE security */
82  	WIFI_SECURITY_TYPE_FT_SAE,
83  	/** FT-EAP security */
84  	WIFI_SECURITY_TYPE_FT_EAP,
85  	/** FT-EAP-SHA384 security */
86  	WIFI_SECURITY_TYPE_FT_EAP_SHA384,
87  	/** SAE Extended key (uses group-dependent hashing) */
88  	WIFI_SECURITY_TYPE_SAE_EXT_KEY,
89  
90  	/** @cond INTERNAL_HIDDEN */
91  	__WIFI_SECURITY_TYPE_AFTER_LAST,
92  	WIFI_SECURITY_TYPE_MAX = __WIFI_SECURITY_TYPE_AFTER_LAST - 1,
93  	WIFI_SECURITY_TYPE_UNKNOWN
94  	/** @endcond */
95  };
96  
97  /** @brief EPA method Types. */
98  enum wifi_eap_type {
99  	/** No EPA  security. */
100  	WIFI_EAP_TYPE_NONE = 0,
101  	/** EPA GTC security, refer to rfc3748 chapter 5. */
102  	WIFI_EAP_TYPE_GTC = 6,
103  	/** EPA TLS security, refer to rfc5216. */
104  	WIFI_EAP_TYPE_TLS = 13,
105  	/** EPA TTLS security, refer to rfc5281. */
106  	WIFI_EAP_TYPE_TTLS = 21,
107  	/** EPA PEAP security, refer to draft-josefsson-pppext-eap-tls-eap-06.txt. */
108  	WIFI_EAP_TYPE_PEAP = 25,
109  	/** EPA MSCHAPV2 security, refer to draft-kamath-pppext-eap-mschapv2-00.txt. */
110  	WIFI_EAP_TYPE_MSCHAPV2 = 26,
111  };
112  
113  /** @brief WPA3 Enterprise security types.
114   *
115   * See Section#3 in WFA WPA3 specification v3.4:
116   * https://www.wi-fi.org/file/wpa3-specification for details.
117   */
118  enum wifi_wpa3_enterprise_type {
119  	/** No WPA3 enterprise, either WPA2 Enterprise or personal mode */
120  	WIFI_WPA3_ENTERPRISE_NA = 0,
121  	/** WPA3 enterprise Suite-B (PMFR + WPA3-Suite-B). */
122  	WIFI_WPA3_ENTERPRISE_SUITEB = 1,
123  	/** WPA3 enterprise Suite-B-192 (PMFR + WPA3-Suite-B-192). */
124  	WIFI_WPA3_ENTERPRISE_SUITEB_192,
125  	/** WPA3 enterprise only (PMFR + WPA2-ENT disabled). */
126  	WIFI_WPA3_ENTERPRISE_ONLY,
127  
128  	/** @cond INTERNAL_HIDDEN */
129  	__WIFI_WPA3_ENTERPRISE_AFTER_LAST,
130  	WIFI_WPA3_ENTERPRISE_MAX = __WIFI_WPA3_ENTERPRISE_AFTER_LAST - 1,
131  	WIFI_WPA3_ENTERPRISE_UNKNOWN
132  	/** @endcond */
133  };
134  
135  enum wifi_eap_tls_cipher_type {
136  	/** EAP TLS with NONE */
137  	WIFI_EAP_TLS_NONE,
138  	/** EAP TLS with ECDH & ECDSA with p384 */
139  	WIFI_EAP_TLS_ECC_P384,
140  	/** EAP TLS with ECDH & RSA with > 3K */
141  	WIFI_EAP_TLS_RSA_3K,
142  };
143  
144  /** @brief Group cipher and pairwise cipher types. */
145  enum wifi_cipher_type {
146  	/** AES in counter mode with CBC-MAC (CCMP-128). */
147  	WPA_CAPA_ENC_CCMP,
148  	/** 128-bit Galois/Counter Mode Protocol. */
149  	WPA_CAPA_ENC_GCMP,
150  	/** 256-bit Galois/Counter Mode Protocol. */
151  	WPA_CAPA_ENC_GCMP_256,
152  };
153  
154  /** @brief group mgmt cipher types. */
155  enum wifi_group_mgmt_cipher_type {
156  	/** 128-bit Broadcast/Multicast Integrity Protocol
157  	 * Cipher-based Message Authentication Code .
158  	 */
159  	WPA_CAPA_ENC_BIP,
160  	/** 128-bit Broadcast/Multicast Integrity Protocol
161  	 * Galois Message Authentication Code .
162  	 */
163  	WPA_CAPA_ENC_BIP_GMAC_128,
164  	/** 256-bit Broadcast/Multicast Integrity Protocol
165  	 * Galois Message Authentication Code .
166  	 */
167  	WPA_CAPA_ENC_BIP_GMAC_256,
168  };
169  
170  struct wifi_cipher_desc {
171  	/** Cipher capability. */
172  	unsigned int capa;
173  	/** Cipher name string. */
174  	char *name;
175  };
176  
177  struct wifi_eap_cipher_config {
178  	/** Key management type string. */
179  	char *key_mgmt;
180  	/** OpenSSL cipher string. */
181  	char *openssl_ciphers;
182  	/** Group cipher cipher string. */
183  	char *group_cipher;
184  	/** Pairwise_cipher cipher string. */
185  	char *pairwise_cipher;
186  	/** Group management cipher string. */
187  	char *group_mgmt_cipher;
188  	/** Used to confiure TLS features. */
189  	char *tls_flags;
190  };
191  
192  struct wifi_eap_config {
193  	/**  Security type. */
194  	enum wifi_security_type type;
195  	/** EAP method type of phase1. */
196  	enum wifi_eap_type eap_type_phase1;
197  	/** EAP method type of phase2. */
198  	enum wifi_eap_type eap_type_phase2;
199  	/** EAP method string. */
200  	char *method;
201  	/** Phase2 setting string. */
202  	char *phase2;
203  };
204  
205  /** Helper function to get user-friendly security type name. */
206  const char *wifi_security_txt(enum wifi_security_type security);
207  
208  /** Helper function to get user-friendly wpa3 enterprise security type name. */
209  const char *wifi_wpa3_enterprise_txt(enum wifi_wpa3_enterprise_type wpa3_ent);
210  
211  /** @brief IEEE 802.11w - Management frame protection. */
212  enum wifi_mfp_options {
213  	/** MFP disabled. */
214  	WIFI_MFP_DISABLE = 0,
215  	/** MFP optional. */
216  	WIFI_MFP_OPTIONAL,
217  	/** MFP required. */
218  	WIFI_MFP_REQUIRED,
219  
220  /** @cond INTERNAL_HIDDEN */
221  	__WIFI_MFP_AFTER_LAST,
222  	WIFI_MFP_MAX = __WIFI_MFP_AFTER_LAST - 1,
223  	WIFI_MFP_UNKNOWN
224  /** @endcond */
225  };
226  
227  /** Helper function to get user-friendly MFP name.*/
228  const char *wifi_mfp_txt(enum wifi_mfp_options mfp);
229  
230  /**
231   * @brief IEEE 802.11 operational frequency bands (not exhaustive).
232   */
233  enum wifi_frequency_bands {
234  	/** 2.4 GHz band. */
235  	WIFI_FREQ_BAND_2_4_GHZ = 0,
236  	/** 5 GHz band. */
237  	WIFI_FREQ_BAND_5_GHZ,
238  	/** 6 GHz band (Wi-Fi 6E, also extends to 7GHz). */
239  	WIFI_FREQ_BAND_6_GHZ,
240  
241  	/** Number of frequency bands available. */
242  	__WIFI_FREQ_BAND_AFTER_LAST,
243  	/** Highest frequency band available. */
244  	WIFI_FREQ_BAND_MAX = __WIFI_FREQ_BAND_AFTER_LAST - 1,
245  	/** Invalid frequency band */
246  	WIFI_FREQ_BAND_UNKNOWN
247  };
248  
249  /** Helper function to get user-friendly frequency band name. */
250  const char *wifi_band_txt(enum wifi_frequency_bands band);
251  
252  /**
253   * @brief IEEE 802.11 operational frequency bandwidths (not exhaustive).
254   */
255  enum wifi_frequency_bandwidths {
256  	/** 20 MHz. */
257  	WIFI_FREQ_BANDWIDTH_20MHZ = 1,
258  	/** 40 MHz. */
259  	WIFI_FREQ_BANDWIDTH_40MHZ,
260  	/** 80 MHz. */
261  	WIFI_FREQ_BANDWIDTH_80MHZ,
262  
263  	/** Number of frequency bandwidths available. */
264  	__WIFI_FREQ_BANDWIDTH_AFTER_LAST,
265  	/** Highest frequency bandwidth available. */
266  	WIFI_FREQ_BANDWIDTH_MAX = __WIFI_FREQ_BANDWIDTH_AFTER_LAST - 1,
267  	/** Invalid frequency bandwidth */
268  	WIFI_FREQ_BANDWIDTH_UNKNOWN
269  };
270  
271  const char *const wifi_bandwidth_txt(enum wifi_frequency_bandwidths bandwidth);
272  
273  /** Max SSID length */
274  #define WIFI_SSID_MAX_LEN 32
275  /** Minimum PSK length */
276  #define WIFI_PSK_MIN_LEN 8
277  /** Maximum PSK length */
278  #define WIFI_PSK_MAX_LEN 64
279  /** Max SAW password length */
280  #define WIFI_SAE_PSWD_MAX_LEN 128
281  /** MAC address length */
282  #define WIFI_MAC_ADDR_LEN 6
283  /** Max enterprise identity length */
284  #define WIFI_ENT_IDENTITY_MAX_LEN 64
285  /** Max enterprise password length */
286  #define WIFI_ENT_PSWD_MAX_LEN 128
287  
288  /** Minimum channel number */
289  #define WIFI_CHANNEL_MIN 1
290  /** Maximum channel number */
291  #define WIFI_CHANNEL_MAX 233
292  /** Any channel number */
293  #define WIFI_CHANNEL_ANY 255
294  
295  /** @brief Wi-Fi interface states.
296   *
297   * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc
298   */
299  enum wifi_iface_state {
300  	/** Interface is disconnected. */
301  	WIFI_STATE_DISCONNECTED = 0,
302  	/** Interface is disabled (administratively). */
303  	WIFI_STATE_INTERFACE_DISABLED,
304  	/** No enabled networks in the configuration. */
305  	WIFI_STATE_INACTIVE,
306  	/** Interface is scanning for networks. */
307  	WIFI_STATE_SCANNING,
308  	/** Authentication with a network is in progress. */
309  	WIFI_STATE_AUTHENTICATING,
310  	/** Association with a network is in progress. */
311  	WIFI_STATE_ASSOCIATING,
312  	/** Association with a network completed. */
313  	WIFI_STATE_ASSOCIATED,
314  	/** 4-way handshake with a network is in progress. */
315  	WIFI_STATE_4WAY_HANDSHAKE,
316  	/** Group Key exchange with a network is in progress. */
317  	WIFI_STATE_GROUP_HANDSHAKE,
318  	/** All authentication completed, ready to pass data. */
319  	WIFI_STATE_COMPLETED,
320  
321  /** @cond INTERNAL_HIDDEN */
322  	__WIFI_STATE_AFTER_LAST,
323  	WIFI_STATE_MAX = __WIFI_STATE_AFTER_LAST - 1,
324  	WIFI_STATE_UNKNOWN
325  /** @endcond */
326  };
327  
328  /* We rely on the strict order of the enum values, so, let's check it */
329  BUILD_ASSERT(WIFI_STATE_DISCONNECTED < WIFI_STATE_INTERFACE_DISABLED &&
330  	     WIFI_STATE_INTERFACE_DISABLED < WIFI_STATE_INACTIVE &&
331  	     WIFI_STATE_INACTIVE < WIFI_STATE_SCANNING &&
332  	     WIFI_STATE_SCANNING < WIFI_STATE_AUTHENTICATING &&
333  	     WIFI_STATE_AUTHENTICATING < WIFI_STATE_ASSOCIATING &&
334  	     WIFI_STATE_ASSOCIATING < WIFI_STATE_ASSOCIATED &&
335  	     WIFI_STATE_ASSOCIATED < WIFI_STATE_4WAY_HANDSHAKE &&
336  	     WIFI_STATE_4WAY_HANDSHAKE < WIFI_STATE_GROUP_HANDSHAKE &&
337  	     WIFI_STATE_GROUP_HANDSHAKE < WIFI_STATE_COMPLETED);
338  
339  
340  /** Helper function to get user-friendly interface state name. */
341  const char *wifi_state_txt(enum wifi_iface_state state);
342  
343  /** @brief Wi-Fi interface modes.
344   *
345   * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc
346   */
347  enum wifi_iface_mode {
348  	/** Infrastructure station mode. */
349  	WIFI_MODE_INFRA = 0,
350  	/** IBSS (ad-hoc) station mode. */
351  	WIFI_MODE_IBSS = 1,
352  	/** AP mode. */
353  	WIFI_MODE_AP = 2,
354  	/** P2P group owner mode. */
355  	WIFI_MODE_P2P_GO = 3,
356  	/** P2P group formation mode. */
357  	WIFI_MODE_P2P_GROUP_FORMATION = 4,
358  	/** 802.11s Mesh mode. */
359  	WIFI_MODE_MESH = 5,
360  
361  /** @cond INTERNAL_HIDDEN */
362  	__WIFI_MODE_AFTER_LAST,
363  	WIFI_MODE_MAX = __WIFI_MODE_AFTER_LAST - 1,
364  	WIFI_MODE_UNKNOWN
365  /** @endcond */
366  };
367  
368  /** Helper function to get user-friendly interface mode name. */
369  const char *wifi_mode_txt(enum wifi_iface_mode mode);
370  
371  /** @brief Wi-Fi link operating modes
372   *
373   * As per https://en.wikipedia.org/wiki/Wi-Fi#Versions_and_generations.
374   */
375  enum wifi_link_mode {
376  	/** 802.11 (legacy). */
377  	WIFI_0 = 0,
378  	/** 802.11b. */
379  	WIFI_1,
380  	/** 802.11a. */
381  	WIFI_2,
382  	/** 802.11g. */
383  	WIFI_3,
384  	/** 802.11n. */
385  	WIFI_4,
386  	/** 802.11ac. */
387  	WIFI_5,
388  	/** 802.11ax. */
389  	WIFI_6,
390  	/** 802.11ax 6GHz. */
391  	WIFI_6E,
392  	/** 802.11be. */
393  	WIFI_7,
394  
395  /** @cond INTERNAL_HIDDEN */
396  	__WIFI_LINK_MODE_AFTER_LAST,
397  	WIFI_LINK_MODE_MAX = __WIFI_LINK_MODE_AFTER_LAST - 1,
398  	WIFI_LINK_MODE_UNKNOWN
399  /** @endcond */
400  };
401  
402  /** Helper function to get user-friendly link mode name. */
403  const char *wifi_link_mode_txt(enum wifi_link_mode link_mode);
404  
405  /** @brief Wi-Fi scanning types. */
406  enum wifi_scan_type {
407  	/** Active scanning (default). */
408  	WIFI_SCAN_TYPE_ACTIVE = 0,
409  	/** Passive scanning. */
410  	WIFI_SCAN_TYPE_PASSIVE,
411  };
412  
413  /** @brief Wi-Fi power save states. */
414  enum wifi_ps {
415  	/** Power save disabled. */
416  	WIFI_PS_DISABLED = 0,
417  	/** Power save enabled. */
418  	WIFI_PS_ENABLED,
419  };
420  
421  /** Helper function to get user-friendly ps name. */
422  const char *wifi_ps_txt(enum wifi_ps ps_name);
423  
424  /** @brief Wi-Fi power save modes. */
425  enum wifi_ps_mode {
426  	/** Legacy power save mode. */
427  	WIFI_PS_MODE_LEGACY = 0,
428  	/* This has to be configured before connecting to the AP,
429  	 * as support for ADDTS action frames is not available.
430  	 */
431  	/** WMM power save mode. */
432  	WIFI_PS_MODE_WMM,
433  };
434  
435  /** Helper function to get user-friendly ps mode name. */
436  const char *wifi_ps_mode_txt(enum wifi_ps_mode ps_mode);
437  
438  /** Network interface index min value */
439  #define WIFI_INTERFACE_INDEX_MIN 1
440  /** Network interface index max value */
441  #define WIFI_INTERFACE_INDEX_MAX 255
442  
443  /** @brief Wifi operational mode */
444  enum wifi_operational_modes {
445  	/** STA mode setting enable */
446  	WIFI_STA_MODE = BIT(0),
447  	/** Monitor mode setting enable */
448  	WIFI_MONITOR_MODE = BIT(1),
449  	/** TX injection mode setting enable */
450  	WIFI_TX_INJECTION_MODE = BIT(2),
451  	/** Promiscuous mode setting enable */
452  	WIFI_PROMISCUOUS_MODE = BIT(3),
453  	/** AP mode setting enable */
454  	WIFI_AP_MODE = BIT(4),
455  	/** Softap mode setting enable */
456  	WIFI_SOFTAP_MODE = BIT(5),
457  };
458  
459  /** @brief Mode filter settings */
460  enum wifi_filter {
461  	/** Support management, data and control packet sniffing */
462  	WIFI_PACKET_FILTER_ALL = BIT(0),
463  	/** Support only sniffing of management packets */
464  	WIFI_PACKET_FILTER_MGMT = BIT(1),
465  	/** Support only sniffing of data packets */
466  	WIFI_PACKET_FILTER_DATA = BIT(2),
467  	/** Support only sniffing of control packets */
468  	WIFI_PACKET_FILTER_CTRL = BIT(3),
469  };
470  
471  /** @brief Wi-Fi Target Wake Time (TWT) operations. */
472  enum wifi_twt_operation {
473  	/** TWT setup operation */
474  	WIFI_TWT_SETUP = 0,
475  	/** TWT teardown operation */
476  	WIFI_TWT_TEARDOWN,
477  };
478  
479  /** Helper function to get user-friendly twt operation name. */
480  const char *wifi_twt_operation_txt(enum wifi_twt_operation twt_operation);
481  
482  /** @brief Wi-Fi Target Wake Time (TWT) negotiation types. */
483  enum wifi_twt_negotiation_type {
484  	/** TWT individual negotiation */
485  	WIFI_TWT_INDIVIDUAL = 0,
486  	/** TWT broadcast negotiation */
487  	WIFI_TWT_BROADCAST,
488  	/** TWT wake TBTT negotiation */
489  	WIFI_TWT_WAKE_TBTT
490  };
491  
492  /** Helper function to get user-friendly twt negotiation type name. */
493  const char *wifi_twt_negotiation_type_txt(enum wifi_twt_negotiation_type twt_negotiation);
494  
495  /** @brief Wi-Fi Target Wake Time (TWT) setup commands. */
496  enum wifi_twt_setup_cmd {
497  	/** TWT setup request */
498  	WIFI_TWT_SETUP_CMD_REQUEST = 0,
499  	/** TWT setup suggest (parameters can be changed by AP) */
500  	WIFI_TWT_SETUP_CMD_SUGGEST,
501  	/** TWT setup demand (parameters can not be changed by AP) */
502  	WIFI_TWT_SETUP_CMD_DEMAND,
503  	/** TWT setup grouping (grouping of TWT flows) */
504  	WIFI_TWT_SETUP_CMD_GROUPING,
505  	/** TWT setup accept (parameters accepted by AP) */
506  	WIFI_TWT_SETUP_CMD_ACCEPT,
507  	/** TWT setup alternate (alternate parameters suggested by AP) */
508  	WIFI_TWT_SETUP_CMD_ALTERNATE,
509  	/** TWT setup dictate (parameters dictated by AP) */
510  	WIFI_TWT_SETUP_CMD_DICTATE,
511  	/** TWT setup reject (parameters rejected by AP) */
512  	WIFI_TWT_SETUP_CMD_REJECT,
513  };
514  
515  /** Helper function to get user-friendly twt setup cmd name. */
516  const char *wifi_twt_setup_cmd_txt(enum wifi_twt_setup_cmd twt_setup);
517  
518  /** @brief Wi-Fi Target Wake Time (TWT) negotiation status. */
519  enum wifi_twt_setup_resp_status {
520  	/** TWT response received for TWT request */
521  	WIFI_TWT_RESP_RECEIVED = 0,
522  	/** TWT response not received for TWT request */
523  	WIFI_TWT_RESP_NOT_RECEIVED,
524  };
525  
526  /** @brief Target Wake Time (TWT) error codes. */
527  enum wifi_twt_fail_reason {
528  	/** Unspecified error */
529  	WIFI_TWT_FAIL_UNSPECIFIED,
530  	/** Command execution failed */
531  	WIFI_TWT_FAIL_CMD_EXEC_FAIL,
532  	/** Operation not supported */
533  	WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED,
534  	/** Unable to get interface status */
535  	WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS,
536  	/** Device not connected to AP */
537  	WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED,
538  	/** Peer not HE (802.11ax/Wi-Fi 6) capable */
539  	WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB,
540  	/** Peer not TWT capable */
541  	WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB,
542  	/** A TWT flow is already in progress */
543  	WIFI_TWT_FAIL_OPERATION_IN_PROGRESS,
544  	/** Invalid negotiated flow id */
545  	WIFI_TWT_FAIL_INVALID_FLOW_ID,
546  	/** IP address not assigned or configured */
547  	WIFI_TWT_FAIL_IP_NOT_ASSIGNED,
548  	/** Flow already exists */
549  	WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS,
550  };
551  
552  /** @brief Wi-Fi Target Wake Time (TWT) teradown status. */
553  enum wifi_twt_teardown_status {
554  	/** TWT teardown success */
555  	WIFI_TWT_TEARDOWN_SUCCESS = 0,
556  	/** TWT teardown failure */
557  	WIFI_TWT_TEARDOWN_FAILED,
558  };
559  
560  /** @cond INTERNAL_HIDDEN */
561  static const char * const wifi_twt_err_code_tbl[] = {
562  	[WIFI_TWT_FAIL_UNSPECIFIED] = "Unspecified",
563  	[WIFI_TWT_FAIL_CMD_EXEC_FAIL] = "Command Execution failed",
564  	[WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED] =
565  		"Operation not supported",
566  	[WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS] =
567  		"Unable to get iface status",
568  	[WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED] =
569  		"Device not connected",
570  	[WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB] = "Peer not HE capable",
571  	[WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB] = "Peer not TWT capable",
572  	[WIFI_TWT_FAIL_OPERATION_IN_PROGRESS] =
573  		"Operation already in progress",
574  	[WIFI_TWT_FAIL_INVALID_FLOW_ID] =
575  		"Invalid negotiated flow id",
576  	[WIFI_TWT_FAIL_IP_NOT_ASSIGNED] =
577  		"IP address not assigned",
578  	[WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS] =
579  		"Flow already exists",
580  };
581  /** @endcond */
582  
583  /** Helper function to get user-friendly TWT error code name. */
wifi_twt_get_err_code_str(int16_t err_no)584  static inline const char *wifi_twt_get_err_code_str(int16_t err_no)
585  {
586  	if ((err_no) < (int16_t)ARRAY_SIZE(wifi_twt_err_code_tbl)) {
587  		return wifi_twt_err_code_tbl[err_no];
588  	}
589  
590  	return "<unknown>";
591  }
592  
593  /** @brief Wi-Fi power save parameters. */
594  enum wifi_ps_param_type {
595  	/** Power save state. */
596  	WIFI_PS_PARAM_STATE,
597  	/** Power save listen interval (units: (short) beacon intervals). */
598  	WIFI_PS_PARAM_LISTEN_INTERVAL,
599  	/** Power save wakeup mode. */
600  	WIFI_PS_PARAM_WAKEUP_MODE,
601  	/** Power save mode. */
602  	WIFI_PS_PARAM_MODE,
603  	/** Power save exit strategy. */
604  	WIFI_PS_PARAM_EXIT_STRATEGY,
605  	/** Power save timeout. */
606  	WIFI_PS_PARAM_TIMEOUT,
607  };
608  
609  /** @brief Wi-Fi power save modes. */
610  enum wifi_ps_wakeup_mode {
611  	/** DTIM based wakeup. */
612  	WIFI_PS_WAKEUP_MODE_DTIM = 0,
613  	/** Listen interval based wakeup. */
614  	WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL,
615  };
616  
617  /** Helper function to get user-friendly ps wakeup mode name. */
618  const char *wifi_ps_wakeup_mode_txt(enum wifi_ps_wakeup_mode ps_wakeup_mode);
619  
620  /**
621   * @brief Wi-Fi power save exit strategy
622   */
623  enum wifi_ps_exit_strategy {
624  	/** PS-Poll frame based */
625  	WIFI_PS_EXIT_CUSTOM_ALGO = 0,
626  	/** QoS NULL frame based */
627  	WIFI_PS_EXIT_EVERY_TIM,
628  
629  /** @cond INTERNAL_HIDDEN */
630  	WIFI_PS_EXIT_LAST,
631  	WIFI_PS_EXIT_MAX = WIFI_PS_EXIT_LAST - 1,
632  /** @endcond */
633  };
634  
635  /** Helper function to get user-friendly ps exit strategy name. */
636  const char *wifi_ps_exit_strategy_txt(enum wifi_ps_exit_strategy ps_exit_strategy);
637  
638  /** @brief Wi-Fi power save error codes. */
639  enum wifi_config_ps_param_fail_reason {
640  	/** Unspecified error */
641  	WIFI_PS_PARAM_FAIL_UNSPECIFIED,
642  	/** Command execution failed */
643  	WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL,
644  	/** Parameter not supported */
645  	WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED,
646  	/** Unable to get interface status */
647  	WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS,
648  	/** Device not connected to AP */
649  	WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED,
650  	/** Device already connected to AP */
651  	WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED,
652  	/** Listen interval out of range */
653  	WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID,
654  	/** Invalid exit strategy */
655  	WIFI_PS_PARAM_FAIL_INVALID_EXIT_STRATEGY,
656  };
657  
658  /** @cond INTERNAL_HIDDEN */
659  static const char * const wifi_ps_param_config_err_code_tbl[] = {
660  	[WIFI_PS_PARAM_FAIL_UNSPECIFIED] = "Unspecified",
661  	[WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL] = "Command Execution failed",
662  	[WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED] =
663  		"Operation not supported",
664  	[WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS] =
665  		"Unable to get iface status",
666  	[WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED] =
667  		"Cannot set parameters while device not connected",
668  	[WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED] =
669  		"Cannot set parameters while device connected",
670  	[WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID] =
671  		"Parameter out of range",
672  };
673  /** @endcond */
674  
675  /** IEEE 802.11v BTM (BSS transition management) Query reasons.
676   * Refer to IEEE Std 802.11v-2011 - Table 7-43x-Transition and Transition Query reasons table.
677   */
678  enum wifi_btm_query_reason {
679  	/** Unspecified. */
680  	WIFI_BTM_QUERY_REASON_UNSPECIFIED = 0,
681  	/** Low RSSI. */
682  	WIFI_BTM_QUERY_REASON_LOW_RSSI = 16,
683  	/** Leaving ESS. */
684  	WIFI_BTM_QUERY_REASON_LEAVING_ESS = 20,
685  };
686  
687  /** Helper function to get user-friendly power save error code name. */
wifi_ps_get_config_err_code_str(int16_t err_no)688  static inline const char *wifi_ps_get_config_err_code_str(int16_t err_no)
689  {
690  	if ((err_no) < (int16_t)ARRAY_SIZE(wifi_ps_param_config_err_code_tbl)) {
691  		return wifi_ps_param_config_err_code_tbl[err_no];
692  	}
693  
694  	return "<unknown>";
695  }
696  
697  /** @brief Wi-Fi AP mode configuration parameter */
698  enum wifi_ap_config_param {
699  	/** Used for AP mode configuration parameter ap_max_inactivity */
700  	WIFI_AP_CONFIG_PARAM_MAX_INACTIVITY = BIT(0),
701  	/** Used for AP mode configuration parameter max_num_sta */
702  	WIFI_AP_CONFIG_PARAM_MAX_NUM_STA = BIT(1),
703  	/** Used for AP mode configuration parameter bandwidth */
704  	WIFI_AP_CONFIG_PARAM_BANDWIDTH = BIT(2),
705  	/** Used for AP mode configuration parameter ht_capab */
706  	WIFI_AP_CONFIG_PARAM_HT_CAPAB = BIT(3),
707  	/** Used for AP mode configuration parameter vht_capab */
708  	WIFI_AP_CONFIG_PARAM_VHT_CAPAB = BIT(4),
709  };
710  
711  #ifdef __cplusplus
712  }
713  #endif
714  
715  /**
716   * @}
717   */
718  #endif /* ZEPHYR_INCLUDE_NET_WIFI_H_ */
719