blob: a0840a2319a0c7c8fabc7e032b15fecaf6ffd07a [file] [log] [blame]
/*
* 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
* @brief Wi-Fi Management API.
* @ingroup networking
* @{
*/
#ifndef ZEPHYR_INCLUDE_NET_WIFI_H_
#define ZEPHYR_INCLUDE_NET_WIFI_H_
#include <zephyr/sys/util.h> /* 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 *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 *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 *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
};
/* We rely on the strict order of the enum values, so, let's check it */
BUILD_ASSERT(WIFI_STATE_DISCONNECTED < WIFI_STATE_INTERFACE_DISABLED &&
WIFI_STATE_INTERFACE_DISABLED < WIFI_STATE_INACTIVE &&
WIFI_STATE_INACTIVE < WIFI_STATE_SCANNING &&
WIFI_STATE_SCANNING < WIFI_STATE_AUTHENTICATING &&
WIFI_STATE_AUTHENTICATING < WIFI_STATE_ASSOCIATING &&
WIFI_STATE_ASSOCIATING < WIFI_STATE_ASSOCIATED &&
WIFI_STATE_ASSOCIATED < WIFI_STATE_4WAY_HANDSHAKE &&
WIFI_STATE_4WAY_HANDSHAKE < WIFI_STATE_GROUP_HANDSHAKE &&
WIFI_STATE_GROUP_HANDSHAKE < WIFI_STATE_COMPLETED);
/** Helper function to get user-friendly interface state name. */
const char *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 *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 *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 *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 *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 *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 *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 *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,
};
/** Wi-Fi Target Wake Time (TWT) teradown status. */
enum wifi_twt_teardown_status {
/** TWT teardown success */
WIFI_TWT_TEARDOWN_SUCCESS = 0,
/** TWT teardown failure */
WIFI_TWT_TEARDOWN_FAILED,
};
/** @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 "<unknown>";
}
/** 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 *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 "<unknown>";
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
#endif /* ZEPHYR_INCLUDE_NET_WIFI_H_ */