]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - src/drivers/driver.h
nl80211: Add support to probe specific mesh link by injecting frames
[thirdparty/hostap.git] / src / drivers / driver.h
index 9922962ea1fa35926ed6f3a71e8e2f64f3663dfd..6210fc2d989b5628f2f0c257a5362368f807a753 100644 (file)
 #define HOSTAPD_CHAN_VHT_130_30 0x04000000
 #define HOSTAPD_CHAN_VHT_150_10 0x08000000
 
+/* Allowed bandwidth mask */
+enum hostapd_chan_width_attr {
+       HOSTAPD_CHAN_WIDTH_10   = BIT(0),
+       HOSTAPD_CHAN_WIDTH_20   = BIT(1),
+       HOSTAPD_CHAN_WIDTH_40P  = BIT(2),
+       HOSTAPD_CHAN_WIDTH_40M  = BIT(3),
+       HOSTAPD_CHAN_WIDTH_80   = BIT(4),
+       HOSTAPD_CHAN_WIDTH_160  = BIT(5),
+};
+
 /* Filter gratuitous ARP */
 #define WPA_DATA_FRAME_FILTER_FLAG_ARP BIT(0)
 /* Filter unsolicited Neighbor Advertisement */
@@ -110,6 +120,13 @@ struct hostapd_channel_data {
         */
        int flag;
 
+       /**
+        * allowed_bw - Allowed channel width bitmask
+        *
+        * See enum hostapd_chan_width_attr.
+        */
+       u32 allowed_bw;
+
        /**
         * max_tx_power - Regulatory transmit power limit in dBm
         */
@@ -141,27 +158,19 @@ struct hostapd_channel_data {
        unsigned int dfs_cac_ms;
 };
 
-#define HE_MAX_NUM_SS          8
-#define HE_MAX_PHY_CAPAB_SIZE  3
-
-/**
- * struct he_ppe_threshold - IEEE 802.11ax HE PPE Threshold
- */
-struct he_ppe_threshold {
-       u32 numss_m1;
-       u32 ru_count;
-       u32 ppet16_ppet8_ru3_ru0[HE_MAX_NUM_SS];
-};
+#define HE_MAX_MAC_CAPAB_SIZE  6
+#define HE_MAX_PHY_CAPAB_SIZE  11
+#define HE_MAX_MCS_CAPAB_SIZE  12
 
 /**
  * struct he_capabilities - IEEE 802.11ax HE capabilities
  */
 struct he_capabilities {
        u8 he_supported;
-       u32 phy_cap[HE_MAX_PHY_CAPAB_SIZE];
-       u32 mac_cap;
-       u32 mcs;
-       struct he_ppe_threshold ppet;
+       u8 phy_cap[HE_MAX_PHY_CAPAB_SIZE];
+       u8 mac_cap[HE_MAX_MAC_CAPAB_SIZE];
+       u8 mcs[HE_MAX_MCS_CAPAB_SIZE];
+       u8 ppet[25];
 };
 
 #define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
@@ -567,6 +576,18 @@ struct wpa_driver_scan_params {
         */
        s8 relative_adjust_rssi;
 
+       /**
+        * oce_scan
+        *
+        * Enable the following OCE scan features: (WFA OCE TechSpec v1.0)
+        * - Accept broadcast Probe Response frame.
+        * - Probe Request frame deferral and suppression.
+        * - Max Channel Time - driver fills FILS request params IE with
+        *   Maximum Channel Time.
+        * - Send 1st Probe Request frame in rate of minimum 5.5 Mbps.
+        */
+       unsigned int oce_scan:1;
+
        /*
         * NOTE: Whenever adding new parameters here, please make sure
         * wpa_scan_clone_params() and wpa_scan_free_params() get updated with
@@ -669,6 +690,11 @@ struct hostapd_freq_params {
         */
        int vht_enabled;
 
+       /**
+        * he_enabled - Whether HE is enabled
+        */
+       int he_enabled;
+
        /**
         * center_freq1 - Segment 0 center frequency in MHz
         *
@@ -902,10 +928,10 @@ struct wpa_driver_associate_params {
         * passphrase - RSN passphrase for PSK
         *
         * This value is made available only for WPA/WPA2-Personal (PSK) and
-        * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE. This is
-        * the 8..63 character ASCII passphrase, if available. Please note that
-        * this can be %NULL if passphrase was not used to generate the PSK. In
-        * that case, the psk field must be used to fetch the PSK.
+        * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
+        * is the 8..63 character ASCII passphrase, if available. Please note
+        * that this can be %NULL if passphrase was not used to generate the
+        * PSK. In that case, the psk field must be used to fetch the PSK.
         */
        const char *passphrase;
 
@@ -913,9 +939,9 @@ struct wpa_driver_associate_params {
         * psk - RSN PSK (alternative for passphrase for PSK)
         *
         * This value is made available only for WPA/WPA2-Personal (PSK) and
-        * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE. This is
-        * the 32-octet (256-bit) PSK, if available. The driver wrapper should
-        * be prepared to handle %NULL value as an error.
+        * only for drivers that set WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK. This
+        * is the 32-octet (256-bit) PSK, if available. The driver wrapper
+        * should be prepared to handle %NULL value as an error.
         */
        const u8 *psk;
 
@@ -1093,6 +1119,11 @@ enum hide_ssid {
        HIDDEN_SSID_ZERO_CONTENTS
 };
 
+enum ch_switch_state {
+       CH_SW_STARTED,
+       CH_SW_FINISHED
+};
+
 struct wowlan_triggers {
        u8 any;
        u8 disconnect;
@@ -1355,6 +1386,23 @@ struct wpa_driver_ap_params {
         * service).
         */
        int multicast_to_unicast;
+
+       /**
+        * ftm_responder - Whether FTM responder is enabled
+        */
+       int ftm_responder;
+
+       /**
+        * lci - Binary data, the content of an LCI report IE with type 8 as
+        * defined in IEEE Std 802.11-2016, 9.4.2.22.10
+        */
+       const struct wpabuf *lci;
+
+       /**
+        * civic - Binary data, the content of a measurement report IE with
+        * type 11 as defined in IEEE Std 802.11-2016, 9.4.2.22.13
+        */
+       const struct wpabuf *civic;
 };
 
 struct wpa_driver_mesh_bss_params {
@@ -1412,6 +1460,7 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_CAPA_KEY_MGMT_FILS_SHA384    0x00002000
 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA256 0x00004000
 #define WPA_DRIVER_CAPA_KEY_MGMT_FT_FILS_SHA384 0x00008000
+#define WPA_DRIVER_CAPA_KEY_MGMT_SAE           0x00010000
        /** Bitfield of supported key management suites */
        unsigned int key_mgmt;
 
@@ -1445,7 +1494,7 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_DFS_OFFLOAD                   0x00000004
 /** Driver takes care of RSN 4-way handshake internally; PMK is configured with
  * struct wpa_driver_ops::set_key using alg = WPA_ALG_PMK */
-#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE 0x00000008
+#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_8021X          0x00000008
 /** Driver is for a wired Ethernet interface */
 #define WPA_DRIVER_FLAGS_WIRED         0x00000010
 /** Driver provides separate commands for authentication and association (SME in
@@ -1565,6 +1614,12 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_OCE_STA_CFON          0x0020000000000000ULL
 /** Driver supports MFP-optional in the connect command */
 #define WPA_DRIVER_FLAGS_MFP_OPTIONAL          0x0040000000000000ULL
+/** Driver is a self-managed regulatory device */
+#define WPA_DRIVER_FLAGS_SELF_MANAGED_REGULATORY       0x0080000000000000ULL
+/** Driver supports FTM responder functionality */
+#define WPA_DRIVER_FLAGS_FTM_RESPONDER         0x0100000000000000ULL
+/** Driver support 4-way handshake offload for WPA-Personal */
+#define WPA_DRIVER_FLAGS_4WAY_HANDSHAKE_PSK    0x0200000000000000ULL
        u64 flags;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
@@ -1699,6 +1754,7 @@ struct hostapd_data;
 struct hostap_sta_driver_data {
        unsigned long rx_packets, tx_packets;
        unsigned long long rx_bytes, tx_bytes;
+       unsigned long long rx_airtime, tx_airtime;
        int bytes_64bit; /* whether 64-bit byte counters are supported */
        unsigned long current_tx_rate;
        unsigned long current_rx_rate;
@@ -1708,6 +1764,8 @@ struct hostap_sta_driver_data {
        unsigned long tx_retry_failed;
        unsigned long tx_retry_count;
        s8 last_ack_rssi;
+       unsigned long backlog_packets;
+       unsigned long backlog_bytes;
        s8 signal;
        u8 rx_vhtmcs;
        u8 tx_vhtmcs;
@@ -1728,6 +1786,8 @@ struct hostapd_sta_add_params {
        const struct ieee80211_vht_capabilities *vht_capabilities;
        int vht_opmode_enabled;
        u8 vht_opmode;
+       const struct ieee80211_he_capabilities *he_capab;
+       size_t he_capab_len;
        u32 flags; /* bitmask of WPA_STA_* flags */
        u32 flags_mask; /* unset bits in flags */
 #ifdef CONFIG_MESH
@@ -1888,19 +1948,21 @@ enum smps_mode {
        SMPS_INVALID,
 };
 
-/* enum chan_width - Channel width definitions */
-enum chan_width {
-       CHAN_WIDTH_20_NOHT,
-       CHAN_WIDTH_20,
-       CHAN_WIDTH_40,
-       CHAN_WIDTH_80,
-       CHAN_WIDTH_80P80,
-       CHAN_WIDTH_160,
-       CHAN_WIDTH_UNKNOWN
-};
+#define WPA_INVALID_NOISE 9999
 
 /**
  * struct wpa_signal_info - Information about channel signal quality
+ * @frequency: control frequency
+ * @above_threshold: true if the above threshold was crossed
+ *     (relevant for a CQM event)
+ * @current_signal: in dBm
+ * @avg_signal: in dBm
+ * @avg_beacon_signal: in dBm
+ * @current_noise: %WPA_INVALID_NOISE if not supported
+ * @current_txrate: current TX rate
+ * @chanwidth: channel width
+ * @center_frq1: center frequency for the first segment
+ * @center_frq2: center frequency for the second segment (if relevant)
  */
 struct wpa_signal_info {
        u32 frequency;
@@ -1915,6 +1977,26 @@ struct wpa_signal_info {
        int center_frq2;
 };
 
+/**
+ * struct wpa_channel_info - Information about the current channel
+ * @frequency: Center frequency of the primary 20 MHz channel
+ * @chanwidth: Width of the current operating channel
+ * @sec_channel: Location of the secondary 20 MHz channel (either +1 or -1).
+ *     This field is only filled in when using a 40 MHz channel.
+ * @center_frq1: Center frequency of frequency segment 0
+ * @center_frq2: Center frequency of frequency segment 1 (for 80+80 channels)
+ * @seg1_idx: Frequency segment 1 index when using a 80+80 channel. This is
+ *     derived from center_frq2 for convenience.
+ */
+struct wpa_channel_info {
+       u32 frequency;
+       enum chan_width chanwidth;
+       int sec_channel;
+       int center_frq1;
+       int center_frq2;
+       u8 seg1_idx;
+};
+
 /**
  * struct beacon_data - Beacon data
  * @head: Head portion of Beacon frame (before TIM IE)
@@ -2081,17 +2163,19 @@ enum wpa_drv_update_connect_params_mask {
  *     use %WLAN_STATUS_UNSPECIFIED_FAILURE if wpa_supplicant cannot give
  *     the real status code for failures. Used only for the request interface
  *     from user space to the driver.
+ * @pmkid: Generated PMKID as part of external auth exchange (e.g., SAE).
  */
 struct external_auth {
        enum {
                EXT_AUTH_START,
                EXT_AUTH_ABORT,
        } action;
-       u8 bssid[ETH_ALEN];
-       u8 ssid[SSID_MAX_LEN];
+       const u8 *bssid;
+       const u8 *ssid;
        size_t ssid_len;
        unsigned int key_mgmt_suite;
        u16 status;
+       const u8 *pmkid;
 };
 
 /**
@@ -2260,7 +2344,7 @@ struct wpa_driver_ops {
         *
         * Returns: 0 on success, -1 on failure
         */
-       int (*deauthenticate)(void *priv, const u8 *addr, int reason_code);
+       int (*deauthenticate)(void *priv, const u8 *addr, u16 reason_code);
 
        /**
         * associate - Request driver to associate
@@ -2729,7 +2813,7 @@ struct wpa_driver_ops {
         * a Deauthentication frame to be sent to it.
         */
        int (*sta_deauth)(void *priv, const u8 *own_addr, const u8 *addr,
-                         int reason);
+                         u16 reason);
 
        /**
         * sta_disassoc - Disassociate a station (AP only)
@@ -2743,7 +2827,7 @@ struct wpa_driver_ops {
         * a Disassociation frame to be sent to it.
         */
        int (*sta_disassoc)(void *priv, const u8 *own_addr, const u8 *addr,
-                           int reason);
+                           u16 reason);
 
        /**
         * sta_remove - Remove a station entry (AP only)
@@ -2860,6 +2944,16 @@ struct wpa_driver_ops {
                             unsigned int total_flags, unsigned int flags_or,
                             unsigned int flags_and);
 
+       /**
+        * sta_set_airtime_weight - Set station airtime weight (AP only)
+        * @priv: Private driver interface data
+        * @addr: Station address
+        * @weight: New weight for station airtime assignment
+        * Returns: 0 on success, -1 on failure
+        */
+       int (*sta_set_airtime_weight)(void *priv, const u8 *addr,
+                                     unsigned int weight);
+
        /**
         * set_tx_queue_params - Set TX queue parameters
         * @priv: Private driver interface data
@@ -3350,6 +3444,14 @@ struct wpa_driver_ops {
         */
        int (*signal_poll)(void *priv, struct wpa_signal_info *signal_info);
 
+       /**
+        * channel_info - Get parameters of the current operating channel
+        * @priv: Private driver interface data
+        * @channel_info: Channel info structure
+        * Returns: 0 on success, negative (<0) on failure
+        */
+       int (*channel_info)(void *priv, struct wpa_channel_info *channel_info);
+
        /**
         * set_authmode - Set authentication algorithm(s) for static WEP
         * @priv: Private driver interface data
@@ -3631,7 +3733,7 @@ struct wpa_driver_ops {
        /**
         * status - Get driver interface status information
         * @priv: Private driver interface data
-        * @buf: Buffer for printing tou the status information
+        * @buf: Buffer for printing the status information
         * @buflen: Maximum length of the buffer
         * Returns: Length of written status information or -1 on failure
         */
@@ -3754,6 +3856,14 @@ struct wpa_driver_ops {
         */
        int (*set_transmit_next_pn)(void *priv, struct transmit_sa *sa);
 
+       /**
+        * set_receive_lowest_pn - Set receive lowest PN
+        * @priv: Private driver interface data
+        * @sa: secure association
+        * Returns: 0 on success, -1 on failure (or if not supported)
+        */
+       int (*set_receive_lowest_pn)(void *priv, struct receive_sa *sa);
+
        /**
         * create_receive_sc - create secure channel for receiving
         * @priv: Private driver interface data
@@ -3881,6 +3991,18 @@ struct wpa_driver_ops {
         */
        int (*leave_mesh)(void *priv);
 
+       /**
+        * probe_mesh_link - Inject a frame over direct mesh link to a given
+        *      peer skipping the next_hop lookup from mpath table.
+        * @priv: Private driver interface data
+        * @addr: Peer MAC address
+        * @eth: Ethernet frame to be sent
+        * @len: Ethernet frame lengtn in bytes
+        * Returns 0 on success, -1 on failure
+        */
+       int (*probe_mesh_link)(void *priv, const u8 *addr, const u8 *eth,
+                              size_t len);
+
        /**
         * do_acs - Automatically select channel
         * @priv: Private driver interface data
@@ -4065,6 +4187,15 @@ struct wpa_driver_ops {
         */
        int (*send_external_auth_status)(void *priv,
                                         struct external_auth *params);
+
+       /**
+        * set_4addr_mode - Set 4-address mode
+        * @priv: Private driver interface data
+        * @bridge_ifname: Bridge interface name
+        * @val: 0 - disable 4addr mode, 1 - enable 4addr mode
+        * Returns: 0 on success, < 0 on failure
+        */
+       int (*set_4addr_mode)(void *priv, const char *bridge_ifname, int val);
 };
 
 /**
@@ -4438,6 +4569,15 @@ enum wpa_event_type {
         * */
        EVENT_CH_SWITCH,
 
+       /**
+        * EVENT_CH_SWITCH_STARTED - AP or GO started to switch channels
+        *
+        * This is a pre-switch event indicating the shortly following switch
+        * of operating channels.
+        *
+        * Described in wpa_event_data.ch_switch
+        */
+       EVENT_CH_SWITCH_STARTED,
        /**
         * EVENT_WNM - Request WNM operation
         *
@@ -5507,6 +5647,8 @@ const char * event_to_string(enum wpa_event_type event);
 /* Convert chan_width to a string for logging and control interfaces */
 const char * channel_width_to_string(enum chan_width width);
 
+int channel_width_to_int(enum chan_width width);
+
 int ht_supported(const struct hostapd_hw_modes *mode);
 int vht_supported(const struct hostapd_hw_modes *mode);