/* * Copyright (c) 2018 Texas Instruments, Incorporated * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief IEEE 802.11 protocol and general Wi-Fi definitions. */ /** * @defgroup wifi_mgmt Wi-Fi Management * Wi-Fi Management API. * @ingroup networking * @{ */ #ifndef ZEPHYR_INCLUDE_NET_WIFI_H_ #define ZEPHYR_INCLUDE_NET_WIFI_H_ #include /* for ARRAY_SIZE */ #define WIFI_COUNTRY_CODE_LEN 2 #define WIFI_LISTEN_INTERVAL_MIN 0 #define WIFI_LISTEN_INTERVAL_MAX 65535 #ifdef __cplusplus extern "C" { #endif /** IEEE 802.11 security types. */ enum wifi_security_type { /** No security. */ WIFI_SECURITY_TYPE_NONE = 0, /** WPA2-PSK security. */ WIFI_SECURITY_TYPE_PSK, /** WPA2-PSK-SHA256 security. */ WIFI_SECURITY_TYPE_PSK_SHA256, /** WPA3-SAE security. */ WIFI_SECURITY_TYPE_SAE, /** GB 15629.11-2003 WAPI security. */ WIFI_SECURITY_TYPE_WAPI, /** EAP security - Enterprise. */ WIFI_SECURITY_TYPE_EAP, /** WEP security. */ WIFI_SECURITY_TYPE_WEP, /** WPA-PSK security. */ WIFI_SECURITY_TYPE_WPA_PSK, __WIFI_SECURITY_TYPE_AFTER_LAST, WIFI_SECURITY_TYPE_MAX = __WIFI_SECURITY_TYPE_AFTER_LAST - 1, WIFI_SECURITY_TYPE_UNKNOWN }; /** Helper function to get user-friendly security type name. */ const char * const wifi_security_txt(enum wifi_security_type security); /** IEEE 802.11w - Management frame protection. */ enum wifi_mfp_options { /** MFP disabled. */ WIFI_MFP_DISABLE = 0, /** MFP optional. */ WIFI_MFP_OPTIONAL, /** MFP required. */ WIFI_MFP_REQUIRED, __WIFI_MFP_AFTER_LAST, WIFI_MFP_MAX = __WIFI_MFP_AFTER_LAST - 1, WIFI_MFP_UNKNOWN }; /** Helper function to get user-friendly MFP name.*/ const char * const wifi_mfp_txt(enum wifi_mfp_options mfp); /** * @brief IEEE 802.11 operational frequency bands (not exhaustive). */ enum wifi_frequency_bands { /** 2.4 GHz band. */ WIFI_FREQ_BAND_2_4_GHZ = 0, /** 5 GHz band. */ WIFI_FREQ_BAND_5_GHZ, /** 6 GHz band (Wi-Fi 6E, also extends to 7GHz). */ WIFI_FREQ_BAND_6_GHZ, /** Number of frequency bands available. */ __WIFI_FREQ_BAND_AFTER_LAST, /** Highest frequency band available. */ WIFI_FREQ_BAND_MAX = __WIFI_FREQ_BAND_AFTER_LAST - 1, /** Invalid frequency band */ WIFI_FREQ_BAND_UNKNOWN }; /** Helper function to get user-friendly frequency band name. */ const char * const wifi_band_txt(enum wifi_frequency_bands band); #define WIFI_SSID_MAX_LEN 32 #define WIFI_PSK_MIN_LEN 8 #define WIFI_PSK_MAX_LEN 64 #define WIFI_SAE_PSWD_MAX_LEN 128 #define WIFI_MAC_ADDR_LEN 6 #define WIFI_CHANNEL_MIN 1 #define WIFI_CHANNEL_MAX 233 #define WIFI_CHANNEL_ANY 255 /** Wi-Fi interface states. * * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc */ enum wifi_iface_state { /** Interface is disconnected. */ WIFI_STATE_DISCONNECTED = 0, /** Interface is disabled (administratively). */ WIFI_STATE_INTERFACE_DISABLED, /** No enabled networks in the configuration. */ WIFI_STATE_INACTIVE, /** Interface is scanning for networks. */ WIFI_STATE_SCANNING, /** Authentication with a network is in progress. */ WIFI_STATE_AUTHENTICATING, /** Association with a network is in progress. */ WIFI_STATE_ASSOCIATING, /** Association with a network completed. */ WIFI_STATE_ASSOCIATED, /** 4-way handshake with a network is in progress. */ WIFI_STATE_4WAY_HANDSHAKE, /** Group Key exchange with a network is in progress. */ WIFI_STATE_GROUP_HANDSHAKE, /** All authentication completed, ready to pass data. */ WIFI_STATE_COMPLETED, __WIFI_STATE_AFTER_LAST, WIFI_STATE_MAX = __WIFI_STATE_AFTER_LAST - 1, WIFI_STATE_UNKNOWN }; /** Helper function to get user-friendly interface state name. */ const char * const wifi_state_txt(enum wifi_iface_state state); /** Wi-Fi interface modes. * * Based on https://w1.fi/wpa_supplicant/devel/defs_8h.html#a4aeb27c1e4abd046df3064ea9756f0bc */ enum wifi_iface_mode { /** Infrastructure station mode. */ WIFI_MODE_INFRA = 0, /** IBSS (ad-hoc) station mode. */ WIFI_MODE_IBSS = 1, /** AP mode. */ WIFI_MODE_AP = 2, /** P2P group owner mode. */ WIFI_MODE_P2P_GO = 3, /** P2P group formation mode. */ WIFI_MODE_P2P_GROUP_FORMATION = 4, /** 802.11s Mesh mode. */ WIFI_MODE_MESH = 5, __WIFI_MODE_AFTER_LAST, WIFI_MODE_MAX = __WIFI_MODE_AFTER_LAST - 1, WIFI_MODE_UNKNOWN }; /** Helper function to get user-friendly interface mode name. */ const char * const wifi_mode_txt(enum wifi_iface_mode mode); /** Wi-Fi link operating modes * * As per https://en.wikipedia.org/wiki/Wi-Fi#Versions_and_generations. */ enum wifi_link_mode { /** 802.11 (legacy). */ WIFI_0 = 0, /** 802.11b. */ WIFI_1, /** 802.11a. */ WIFI_2, /** 802.11g. */ WIFI_3, /** 802.11n. */ WIFI_4, /** 802.11ac. */ WIFI_5, /** 802.11ax. */ WIFI_6, /** 802.11ax 6GHz. */ WIFI_6E, /** 802.11be. */ WIFI_7, __WIFI_LINK_MODE_AFTER_LAST, WIFI_LINK_MODE_MAX = __WIFI_LINK_MODE_AFTER_LAST - 1, WIFI_LINK_MODE_UNKNOWN }; /** Helper function to get user-friendly link mode name. */ const char * const wifi_link_mode_txt(enum wifi_link_mode link_mode); /** Wi-Fi scanning types. */ enum wifi_scan_type { /** Active scanning (default). */ WIFI_SCAN_TYPE_ACTIVE = 0, /** Passive scanning. */ WIFI_SCAN_TYPE_PASSIVE, }; /** Wi-Fi power save states. */ enum wifi_ps { /** Power save disabled. */ WIFI_PS_DISABLED = 0, /** Power save enabled. */ WIFI_PS_ENABLED, }; /** Helper function to get user-friendly ps name. */ const char * const wifi_ps_txt(enum wifi_ps ps_name); /** Wi-Fi power save modes. */ enum wifi_ps_mode { /** Legacy power save mode. */ WIFI_PS_MODE_LEGACY = 0, /* This has to be configured before connecting to the AP, * as support for ADDTS action frames is not available. */ /** WMM power save mode. */ WIFI_PS_MODE_WMM, }; /** Helper function to get user-friendly ps mode name. */ const char * const wifi_ps_mode_txt(enum wifi_ps_mode ps_mode); /* Interface index Min and Max values */ #define WIFI_INTERFACE_INDEX_MIN 1 #define WIFI_INTERFACE_INDEX_MAX 255 /** Wifi operational mode */ enum wifi_operational_modes { /** STA mode setting enable */ WIFI_STA_MODE = BIT(0), /** Monitor mode setting enable */ WIFI_MONITOR_MODE = BIT(1), /** TX injection mode setting enable */ WIFI_TX_INJECTION_MODE = BIT(2), /** Promiscuous mode setting enable */ WIFI_PROMISCUOUS_MODE = BIT(3), /** AP mode setting enable */ WIFI_AP_MODE = BIT(4), /** Softap mode setting enable */ WIFI_SOFTAP_MODE = BIT(5), }; /** Mode filter settings */ enum wifi_filter { /** Support management, data and control packet sniffing */ WIFI_PACKET_FILTER_ALL = BIT(0), /** Support only sniffing of management packets */ WIFI_PACKET_FILTER_MGMT = BIT(1), /** Support only sniffing of data packets */ WIFI_PACKET_FILTER_DATA = BIT(2), /** Support only sniffing of control packets */ WIFI_PACKET_FILTER_CTRL = BIT(3), }; /** Wi-Fi Target Wake Time (TWT) operations. */ enum wifi_twt_operation { /** TWT setup operation */ WIFI_TWT_SETUP = 0, /** TWT teardown operation */ WIFI_TWT_TEARDOWN, }; /** Helper function to get user-friendly twt operation name. */ const char * const wifi_twt_operation_txt(enum wifi_twt_operation twt_operation); /** Wi-Fi Target Wake Time (TWT) negotiation types. */ enum wifi_twt_negotiation_type { /** TWT individual negotiation */ WIFI_TWT_INDIVIDUAL = 0, /** TWT broadcast negotiation */ WIFI_TWT_BROADCAST, /** TWT wake TBTT negotiation */ WIFI_TWT_WAKE_TBTT }; /** Helper function to get user-friendly twt negotiation type name. */ const char * const wifi_twt_negotiation_type_txt(enum wifi_twt_negotiation_type twt_negotiation); /** Wi-Fi Target Wake Time (TWT) setup commands. */ enum wifi_twt_setup_cmd { /** TWT setup request */ WIFI_TWT_SETUP_CMD_REQUEST = 0, /** TWT setup suggest (parameters can be changed by AP) */ WIFI_TWT_SETUP_CMD_SUGGEST, /** TWT setup demand (parameters can not be changed by AP) */ WIFI_TWT_SETUP_CMD_DEMAND, /** TWT setup grouping (grouping of TWT flows) */ WIFI_TWT_SETUP_CMD_GROUPING, /** TWT setup accept (parameters accepted by AP) */ WIFI_TWT_SETUP_CMD_ACCEPT, /** TWT setup alternate (alternate parameters suggested by AP) */ WIFI_TWT_SETUP_CMD_ALTERNATE, /** TWT setup dictate (parameters dictated by AP) */ WIFI_TWT_SETUP_CMD_DICTATE, /** TWT setup reject (parameters rejected by AP) */ WIFI_TWT_SETUP_CMD_REJECT, }; /** Helper function to get user-friendly twt setup cmd name. */ const char * const wifi_twt_setup_cmd_txt(enum wifi_twt_setup_cmd twt_setup); /** Wi-Fi Target Wake Time (TWT) negotiation status. */ enum wifi_twt_setup_resp_status { /** TWT response received for TWT request */ WIFI_TWT_RESP_RECEIVED = 0, /** TWT response not received for TWT request */ WIFI_TWT_RESP_NOT_RECEIVED, }; /** Target Wake Time (TWT) error codes. */ enum wifi_twt_fail_reason { /** Unspecified error */ WIFI_TWT_FAIL_UNSPECIFIED, /** Command execution failed */ WIFI_TWT_FAIL_CMD_EXEC_FAIL, /** Operation not supported */ WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED, /** Unable to get interface status */ WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS, /** Device not connected to AP */ WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED, /** Peer not HE (802.11ax/Wi-Fi 6) capable */ WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB, /** Peer not TWT capable */ WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB, /** A TWT flow is already in progress */ WIFI_TWT_FAIL_OPERATION_IN_PROGRESS, /** Invalid negotiated flow id */ WIFI_TWT_FAIL_INVALID_FLOW_ID, /** IP address not assigned or configured */ WIFI_TWT_FAIL_IP_NOT_ASSIGNED, /** Flow already exists */ WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS, }; /** @cond INTERNAL_HIDDEN */ static const char * const wifi_twt_err_code_tbl[] = { [WIFI_TWT_FAIL_UNSPECIFIED] = "Unspecified", [WIFI_TWT_FAIL_CMD_EXEC_FAIL] = "Command Execution failed", [WIFI_TWT_FAIL_OPERATION_NOT_SUPPORTED] = "Operation not supported", [WIFI_TWT_FAIL_UNABLE_TO_GET_IFACE_STATUS] = "Unable to get iface status", [WIFI_TWT_FAIL_DEVICE_NOT_CONNECTED] = "Device not connected", [WIFI_TWT_FAIL_PEER_NOT_HE_CAPAB] = "Peer not HE capable", [WIFI_TWT_FAIL_PEER_NOT_TWT_CAPAB] = "Peer not TWT capable", [WIFI_TWT_FAIL_OPERATION_IN_PROGRESS] = "Operation already in progress", [WIFI_TWT_FAIL_INVALID_FLOW_ID] = "Invalid negotiated flow id", [WIFI_TWT_FAIL_IP_NOT_ASSIGNED] = "IP address not assigned", [WIFI_TWT_FAIL_FLOW_ALREADY_EXISTS] = "Flow already exists", }; /** @endcond */ /** Helper function to get user-friendly TWT error code name. */ static inline const char *wifi_twt_get_err_code_str(int16_t err_no) { if ((err_no) < (int16_t)ARRAY_SIZE(wifi_twt_err_code_tbl)) { return wifi_twt_err_code_tbl[err_no]; } return ""; } /** Wi-Fi power save parameters. */ enum wifi_ps_param_type { /** Power save state. */ WIFI_PS_PARAM_STATE, /** Power save listen interval. */ WIFI_PS_PARAM_LISTEN_INTERVAL, /** Power save wakeup mode. */ WIFI_PS_PARAM_WAKEUP_MODE, /** Power save mode. */ WIFI_PS_PARAM_MODE, /** Power save timeout. */ WIFI_PS_PARAM_TIMEOUT, }; /** Wi-Fi power save modes. */ enum wifi_ps_wakeup_mode { /** DTIM based wakeup. */ WIFI_PS_WAKEUP_MODE_DTIM = 0, /** Listen interval based wakeup. */ WIFI_PS_WAKEUP_MODE_LISTEN_INTERVAL, }; /** Helper function to get user-friendly ps wakeup mode name. */ const char * const wifi_ps_wakeup_mode_txt(enum wifi_ps_wakeup_mode ps_wakeup_mode); /** Wi-Fi power save error codes. */ enum wifi_config_ps_param_fail_reason { /** Unspecified error */ WIFI_PS_PARAM_FAIL_UNSPECIFIED, /** Command execution failed */ WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL, /** Parameter not supported */ WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED, /** Unable to get interface status */ WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS, /** Device not connected to AP */ WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED, /** Device already connected to AP */ WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED, /** Listen interval out of range */ WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID, }; /** @cond INTERNAL_HIDDEN */ static const char * const wifi_ps_param_config_err_code_tbl[] = { [WIFI_PS_PARAM_FAIL_UNSPECIFIED] = "Unspecified", [WIFI_PS_PARAM_FAIL_CMD_EXEC_FAIL] = "Command Execution failed", [WIFI_PS_PARAM_FAIL_OPERATION_NOT_SUPPORTED] = "Operation not supported", [WIFI_PS_PARAM_FAIL_UNABLE_TO_GET_IFACE_STATUS] = "Unable to get iface status", [WIFI_PS_PARAM_FAIL_DEVICE_NOT_CONNECTED] = "Cannot set parameters while device not connected", [WIFI_PS_PARAM_FAIL_DEVICE_CONNECTED] = "Cannot set parameters while device connected", [WIFI_PS_PARAM_LISTEN_INTERVAL_RANGE_INVALID] = "Parameter out of range", }; /** @endcond */ /** Helper function to get user-friendly power save error code name. */ static inline const char *wifi_ps_get_config_err_code_str(int16_t err_no) { if ((err_no) < (int16_t)ARRAY_SIZE(wifi_ps_param_config_err_code_tbl)) { return wifi_ps_param_config_err_code_tbl[err_no]; } return ""; } #ifdef __cplusplus } #endif /** * @} */ #endif /* ZEPHYR_INCLUDE_NET_WIFI_H_ */