nl80211: Suppport multiple CSA counters
[mech_eap.git] / src / drivers / driver.h
index a52328c..262dc3f 100644 (file)
@@ -20,6 +20,7 @@
 #define WPA_SUPPLICANT_DRIVER_VERSION 4
 
 #include "common/defs.h"
+#include "common/ieee802_11_defs.h"
 #include "utils/list.h"
 
 #define HOSTAPD_CHAN_DISABLED 0x00000001
@@ -341,7 +342,7 @@ struct wpa_driver_scan_params {
         * is not needed anymore.
         */
        struct wpa_driver_scan_filter {
-               u8 ssid[32];
+               u8 ssid[SSID_MAX_LEN];
                size_t ssid_len;
        } *filter_ssids;
 
@@ -1211,6 +1212,10 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_HT_IBSS               0x0000001000000000ULL
 /** Driver supports IBSS with VHT datarates */
 #define WPA_DRIVER_FLAGS_VHT_IBSS              0x0000002000000000ULL
+/** Driver supports automatic band selection */
+#define WPA_DRIVER_FLAGS_SUPPORT_HW_MODE_ANY   0x0000004000000000ULL
+/** Driver supports simultaneous off-channel operations */
+#define WPA_DRIVER_FLAGS_OFFCHANNEL_SIMULTANEOUS       0x0000008000000000ULL
        u64 flags;
 
 #define WPA_DRIVER_SMPS_MODE_STATIC                    0x00000001
@@ -1294,6 +1299,16 @@ struct wpa_driver_capa {
  */
 #define WPA_DRIVER_FLAGS_TX_POWER_INSERTION            0x00000008
        u32 rrm_flags;
+
+       /* Driver concurrency capabilities */
+       unsigned int conc_capab;
+       /* Maximum number of concurrent channels on 2.4 GHz */
+       unsigned int max_conc_chan_2_4;
+       /* Maximum number of concurrent channels on 5 GHz */
+       unsigned int max_conc_chan_5_0;
+
+       /* Maximum number of supported CSA counters */
+       u16 max_csa_counters;
 };
 
 
@@ -1394,6 +1409,16 @@ enum wpa_driver_if_type {
         * WPA_IF_MESH - Mesh interface
         */
        WPA_IF_MESH,
+
+       /*
+        * WPA_IF_TDLS - TDLS offchannel interface (used for pref freq only)
+        */
+       WPA_IF_TDLS,
+
+       /*
+        * WPA_IF_IBSS - IBSS interface (used for pref freq only)
+        */
+       WPA_IF_IBSS,
 };
 
 struct wpa_init_params {
@@ -1534,8 +1559,8 @@ struct csa_settings {
        struct beacon_data beacon_csa;
        struct beacon_data beacon_after;
 
-       u16 counter_offset_beacon;
-       u16 counter_offset_presp;
+       u16 counter_offset_beacon[2];
+       u16 counter_offset_presp[2];
 };
 
 /* TDLS peer capabilities for send_tdls_mgmt() */
@@ -1599,6 +1624,7 @@ struct drv_acs_params {
        /* ACS channel list info */
        unsigned int ch_list_len;
        const u8 *ch_list;
+       const int *freq_list;
 };
 
 
@@ -1937,10 +1963,12 @@ struct wpa_driver_ops {
         * @data: IEEE 802.11 management frame with IEEE 802.11 header
         * @data_len: Size of the management frame
         * @noack: Do not wait for this frame to be acked (disable retries)
+        * @freq: Frequency (in MHz) to send the frame on, or 0 to let the
+        * driver decide
         * Returns: 0 on success, -1 on failure
         */
        int (*send_mlme)(void *priv, const u8 *data, size_t data_len,
-                        int noack);
+                        int noack, unsigned int freq);
 
        /**
         * update_ft_ies - Update FT (IEEE 802.11r) IEs
@@ -2344,7 +2372,8 @@ struct wpa_driver_ops {
         * Returns: 0 on success, -1 on failure
         */
        int (*sta_set_flags)(void *priv, const u8 *addr,
-                            int total_flags, int flags_or, int flags_and);
+                            unsigned int total_flags, unsigned int flags_or,
+                            unsigned int flags_and);
 
        /**
         * set_tx_queue_params - Set TX queue parameters
@@ -3381,6 +3410,40 @@ struct wpa_driver_ops {
         * indicates support for such offloading (WPA_DRIVER_FLAGS_ACS_OFFLOAD).
         */
        int (*do_acs)(void *priv, struct drv_acs_params *params);
+
+       /**
+        * set_band - Notify driver of band selection
+        * @priv: Private driver interface data
+        * @band: The selected band(s)
+        * Returns 0 on success, -1 on failure
+        */
+       int (*set_band)(void *priv, enum set_band band);
+
+       /**
+        * get_pref_freq_list - Get preferred frequency list for an interface
+        * @priv: Private driver interface data
+        * @if_type: Interface type
+        * @num: Number of channels
+        * @freq_list: Preferred channel frequency list encoded in MHz values
+        * Returns 0 on success, -1 on failure
+        *
+        * This command can be used to query the preferred frequency list from
+        * the driver specific to a particular interface type.
+        */
+       int (*get_pref_freq_list)(void *priv, enum wpa_driver_if_type if_type,
+                                 unsigned int *num, unsigned int *freq_list);
+
+       /**
+        * set_prob_oper_freq - Indicate probable P2P operating channel
+        * @priv: Private driver interface data
+        * @freq: Channel frequency in MHz
+        * Returns 0 on success, -1 on failure
+        *
+        * This command can be used to inform the driver of the operating
+        * frequency that an ongoing P2P group formation is likely to come up
+        * on. Local device is assuming P2P Client role.
+        */
+       int (*set_prob_oper_freq)(void *priv, unsigned int freq);
 };
 
 
@@ -4323,6 +4386,9 @@ union wpa_event_data {
         * @ssids: Scanned SSIDs (%NULL or zero-length SSID indicates wildcard
         *      SSID)
         * @num_ssids: Number of entries in ssids array
+        * @external_scan: Whether the scan info is for an external scan
+        * @nl_scan_event: 1 if the source of this scan event is a normal scan,
+        *      0 if the source of the scan event is a vendor scan
         */
        struct scan_info {
                int aborted;
@@ -4330,6 +4396,8 @@ union wpa_event_data {
                size_t num_freqs;
                struct wpa_driver_scan_ssid ssids[WPAS_MAX_SCAN_SSIDS];
                size_t num_ssids;
+               int external_scan;
+               int nl_scan_event;
        } scan_info;
 
        /**
@@ -4562,6 +4630,7 @@ union wpa_event_data {
         * @ch_width: Selected Channel width by driver. Driver may choose to
         *      change hostapd configured ACS channel width due driver internal
         *      channel restrictions.
+        * hw_mode: Selected band (used with hw_mode=any)
         */
        struct acs_selected_channels {
                u8 pri_channel;
@@ -4569,6 +4638,7 @@ union wpa_event_data {
                u8 vht_seg0_center_ch;
                u8 vht_seg1_center_ch;
                u16 ch_width;
+               enum hostapd_hw_mode hw_mode;
        } acs_selected_channels;
 };
 
@@ -4639,6 +4709,6 @@ wpa_get_wowlan_triggers(const char *wowlan_triggers,
                        const struct wpa_driver_capa *capa);
 
 /* NULL terminated array of linked in driver wrappers */
-extern struct wpa_driver_ops *wpa_drivers[];
+extern const struct wpa_driver_ops *const wpa_drivers[];
 
 #endif /* DRIVER_H */