TDLS: Add peer as a STA during link setup
[mech_eap.git] / src / drivers / driver.h
index 40f1d0e..5d61481 100644 (file)
@@ -60,6 +60,8 @@ struct hostapd_channel_data {
        u8 max_tx_power;
 };
 
+#define HOSTAPD_MODE_FLAG_HT_INFO_KNOWN BIT(0)
+
 /**
  * struct hostapd_hw_modes - Supported hardware mode information
  */
@@ -103,6 +105,8 @@ struct hostapd_hw_modes {
         * a_mpdu_params - A-MPDU (IEEE 802.11n) parameters
         */
        u8 a_mpdu_params;
+
+       unsigned int flags; /* HOSTAPD_MODE_FLAG_* */
 };
 
 
@@ -195,7 +199,7 @@ struct wpa_interface_info {
        const char *drv_name;
 };
 
-#define WPAS_MAX_SCAN_SSIDS 4
+#define WPAS_MAX_SCAN_SSIDS 16
 
 /**
  * struct wpa_driver_scan_params - Scan parameters
@@ -264,6 +268,15 @@ struct wpa_driver_scan_params {
         * num_filter_ssids - Number of entries in filter_ssids array
         */
        size_t num_filter_ssids;
+
+       /**
+        * p2p_probe - Used to disable CCK (802.11b) rates for P2P probes
+        *
+        * When set, the driver is expected to remove rates 1, 2, 5.5, and 11
+        * Mbps from the support rates element(s) in the Probe Request frames
+        * and not to transmit the frames at any of those rates.
+        */
+       u8 p2p_probe;
 };
 
 /**
@@ -282,6 +295,12 @@ struct wpa_driver_auth_params {
        size_t wep_key_len[4];
        int wep_tx_keyidx;
        int local_state_change;
+
+       /**
+        * p2p - Whether this connection is a P2P group
+        */
+       int p2p;
+
 };
 
 enum wps_mode {
@@ -345,6 +364,11 @@ struct wpa_driver_associate_params {
        size_t wpa_ie_len;
 
        /**
+        * wpa_proto - Bitfield of WPA_PROTO_* values to indicate WPA/WPA2
+        */
+       unsigned int wpa_proto;
+
+       /**
         * pairwise_suite - Selected pairwise cipher suite
         *
         * This is usually ignored if @wpa_ie is used.
@@ -494,6 +518,162 @@ struct wpa_driver_associate_params {
        int uapsd;
 };
 
+enum hide_ssid {
+       NO_SSID_HIDING,
+       HIDDEN_SSID_ZERO_LEN,
+       HIDDEN_SSID_ZERO_CONTENTS
+};
+
+struct wpa_driver_ap_params {
+       /**
+        * head - Beacon head from IEEE 802.11 header to IEs before TIM IE
+        */
+       const u8 *head;
+
+       /**
+        * head_len - Length of the head buffer in octets
+        */
+       size_t head_len;
+
+       /**
+        * tail - Beacon tail following TIM IE
+        */
+       const u8 *tail;
+
+       /**
+        * tail_len - Length of the tail buffer in octets
+        */
+       size_t tail_len;
+
+       /**
+        * dtim_period - DTIM period
+        */
+       int dtim_period;
+
+       /**
+        * beacon_int - Beacon interval
+        */
+       int beacon_int;
+
+       /**
+        * ssid - The SSID to use in Beacon/Probe Response frames
+        */
+       const u8 *ssid;
+
+       /**
+        * ssid_len - Length of the SSID (1..32)
+        */
+       size_t ssid_len;
+
+       /**
+        * hide_ssid - Whether to hide the SSID
+        */
+       enum hide_ssid hide_ssid;
+
+       /**
+        * pairwise_ciphers - WPA_CIPHER_* bitfield
+        */
+       unsigned int pairwise_ciphers;
+
+       /**
+        * group_cipher - WPA_CIPHER_*
+        */
+       unsigned int group_cipher;
+
+       /**
+        * key_mgmt_suites - WPA_KEY_MGMT_* bitfield
+        */
+       unsigned int key_mgmt_suites;
+
+       /**
+        * auth_algs - WPA_AUTH_ALG_* bitfield
+        */
+       unsigned int auth_algs;
+
+       /**
+        * wpa_version - WPA_PROTO_* bitfield
+        */
+       unsigned int wpa_version;
+
+       /**
+        * privacy - Whether privacy is used in the BSS
+        */
+       int privacy;
+
+       /**
+        * beacon_ies - WPS/P2P IE(s) for Beacon frames
+        *
+        * This is used to add IEs like WPS IE and P2P IE by drivers that do
+        * not use the full Beacon template.
+        */
+       const struct wpabuf *beacon_ies;
+
+       /**
+        * proberesp_ies - P2P/WPS IE(s) for Probe Response frames
+        *
+        * This is used to add IEs like WPS IE and P2P IE by drivers that
+        * reply to Probe Request frames internally.
+        */
+       const struct wpabuf *proberesp_ies;
+
+       /**
+        * assocresp_ies - WPS IE(s) for (Re)Association Response frames
+        *
+        * This is used to add IEs like WPS IE by drivers that reply to
+        * (Re)Association Request frames internally.
+        */
+       const struct wpabuf *assocresp_ies;
+
+       /**
+        * isolate - Whether to isolate frames between associated stations
+        *
+        * If this is non-zero, the AP is requested to disable forwarding of
+        * frames between association stations.
+        */
+       int isolate;
+
+       /**
+        * cts_protect - Whether CTS protection is enabled
+        */
+       int cts_protect;
+
+       /**
+        * preamble - Whether short preamble is enabled
+        */
+       int preamble;
+
+       /**
+        * short_slot_time - Whether short slot time is enabled
+        *
+        * 0 = short slot time disable, 1 = short slot time enabled, -1 = do
+        * not set (e.g., when 802.11g mode is not in use)
+        */
+       int short_slot_time;
+
+       /**
+        * ht_opmode - HT operation mode or -1 if HT not in use
+        */
+       int ht_opmode;
+
+       /**
+        * interworking - Whether Interworking is enabled
+        */
+       int interworking;
+
+       /**
+        * hessid - Homogeneous ESS identifier or %NULL if not set
+        */
+       const u8 *hessid;
+
+       /**
+        * access_network_type - Access Network Type (0..15)
+        *
+        * This is used for filtering Probe Request frames when Interworking is
+        * enabled.
+        */
+       u8 access_network_type;
+};
+
 /**
  * struct wpa_driver_capa - Driver capability information
  */
@@ -522,7 +702,7 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_DRIVER_IE     0x00000001
 /* Driver needs static WEP key setup after association command */
 #define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC 0x00000002
-#define WPA_DRIVER_FLAGS_USER_SPACE_MLME 0x00000004
+/* unused: 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
@@ -561,9 +741,22 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS_SANE_ERROR_CODES              0x00004000
 /* Driver supports off-channel TX */
 #define WPA_DRIVER_FLAGS_OFFCHANNEL_TX                 0x00008000
+/* Driver indicates TX status events for EAPOL Data frames */
+#define WPA_DRIVER_FLAGS_EAPOL_TX_STATUS               0x00010000
+/* Driver indicates TX status events for Deauth/Disassoc frames */
+#define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS              0x00020000
+/* Driver supports roaming (BSS selection) in firmware */
+#define WPA_DRIVER_FLAGS_BSS_SELECTION                 0x00040000
+/* Driver supports operating as a TDLS peer */
+#define WPA_DRIVER_FLAGS_TDLS_SUPPORT                  0x00080000
+/* Driver requires external TDLS setup/teardown/discovery */
+#define WPA_DRIVER_FLAGS_TDLS_EXTERNAL_SETUP           0x00100000
        unsigned int flags;
 
        int max_scan_ssids;
+       int max_sched_scan_ssids;
+       int sched_scan_supported;
+       int max_match_sets;
 
        /**
         * max_remain_on_chan - Maximum remain-on-channel duration in msec
@@ -600,6 +793,8 @@ struct hostapd_sta_add_params {
        size_t supp_rates_len;
        u16 listen_interval;
        const struct ieee80211_ht_capabilities *ht_capabilities;
+       u32 flags; /* bitmask of WPA_STA_* flags */
+       int set; /* Set STA parameters instead of add */
 };
 
 struct hostapd_freq_params {
@@ -651,6 +846,7 @@ enum wpa_driver_if_type {
 };
 
 struct wpa_init_params {
+       void *global_priv;
        const u8 *bssid;
        const char *ifname;
        const u8 *ssid;
@@ -676,12 +872,14 @@ struct wpa_bss_params {
        int wpa_pairwise;
        int wpa_key_mgmt;
        int rsn_preauth;
+       enum mfp_options ieee80211w;
 };
 
 #define WPA_STA_AUTHORIZED BIT(0)
 #define WPA_STA_WMM BIT(1)
 #define WPA_STA_SHORT_PREAMBLE BIT(2)
 #define WPA_STA_MFP BIT(3)
+#define WPA_STA_TDLS_PEER BIT(4)
 
 /**
  * struct p2p_params - P2P parameters for driver-based P2P management
@@ -705,6 +903,17 @@ enum tdls_oper {
 };
 
 /**
+ * struct wpa_signal_info - Information about channel signal quality
+ */
+struct wpa_signal_info {
+       u32 frequency;
+       int above_threshold;
+       int current_signal;
+       int current_noise;
+       int current_txrate;
+};
+
+/**
  * struct wpa_driver_ops - Driver interface API definition
  *
  * This structure defines the API that each driver interface needs to implement
@@ -1057,93 +1266,21 @@ struct wpa_driver_ops {
         * flags: Variable for returning hardware feature flags
         * Returns: Pointer to allocated hardware data on success or %NULL on
         * failure. Caller is responsible for freeing this.
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to %wpa_supplicant or hostapd.
         */
        struct hostapd_hw_modes * (*get_hw_feature_data)(void *priv,
                                                         u16 *num_modes,
                                                         u16 *flags);
 
        /**
-        * set_channel - Set channel
-        * @priv: Private driver interface data
-        * @phymode: HOSTAPD_MODE_IEEE80211B, ..
-        * @chan: IEEE 802.11 channel number
-        * @freq: Frequency of the channel in MHz
-        * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant.
-        */
-       int (*set_channel)(void *priv, enum hostapd_hw_mode phymode, int chan,
-                          int freq);
-
-       /**
-        * set_ssid - Set SSID
-        * @priv: Private driver interface data
-        * @ssid: SSID
-        * @ssid_len: SSID length
-        * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant.
-        */
-       int (*set_ssid)(void *priv, const u8 *ssid, size_t ssid_len);
-
-       /**
-        * set_bssid - Set BSSID
-        * @priv: Private driver interface data
-        * @bssid: BSSID
-        * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant.
-        */
-       int (*set_bssid)(void *priv, const u8 *bssid);
-
-       /**
         * send_mlme - Send management frame from MLME
         * @priv: Private driver interface data
         * @data: IEEE 802.11 management frame with IEEE 802.11 header
         * @data_len: Size of the management frame
         * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant.
         */
        int (*send_mlme)(void *priv, const u8 *data, size_t data_len);
 
        /**
-        * mlme_add_sta - Add a STA entry into the driver/netstack
-        * @priv: Private driver interface data
-        * @addr: MAC address of the STA (e.g., BSSID of the AP)
-        * @supp_rates: Supported rate set (from (Re)AssocResp); in IEEE 802.11
-        * format (one octet per rate, 1 = 0.5 Mbps)
-        * @supp_rates_len: Number of entries in supp_rates
-        * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant. When the MLME code
-        * completes association with an AP, this function is called to
-        * configure the driver/netstack with a STA entry for data frame
-        * processing (TX rate control, encryption/decryption).
-        */
-       int (*mlme_add_sta)(void *priv, const u8 *addr, const u8 *supp_rates,
-                           size_t supp_rates_len);
-
-       /**
-        * mlme_remove_sta - Remove a STA entry from the driver/netstack
-        * @priv: Private driver interface data
-        * @addr: MAC address of the STA (e.g., BSSID of the AP)
-        * Returns: 0 on success, -1 on failure
-        *
-        * This function is only needed for drivers that export MLME
-        * (management frame processing) to wpa_supplicant.
-        */
-       int (*mlme_remove_sta)(void *priv, const u8 *addr);
-
-       /**
         * update_ft_ies - Update FT (IEEE 802.11r) IEs
         * @priv: Private driver interface data
         * @md: Mobility domain (2 octets) (also included inside ies)
@@ -1270,24 +1407,25 @@ struct wpa_driver_ops {
                            struct wpa_driver_auth_params *params);
 
        /**
-        * set_beacon - Set Beacon frame template
+        * set_ap - Set Beacon and Probe Response information for AP mode
         * @priv: Private driver interface data
-        * @head: Beacon head from IEEE 802.11 header to IEs before TIM IE
-        * @head_len: Length of the head buffer in octets
-        * @tail: Beacon tail following TIM IE
-        * @tail_len: Length of the tail buffer in octets
-        * @dtim_period: DTIM period
-        * @beacon_int: Beacon interval
-        * Returns: 0 on success, -1 on failure
+        * @params: Parameters to use in AP mode
         *
-        * This function is used to configure Beacon template for the driver in
+        * This function is used to configure Beacon template and/or extra IEs
+        * to add for Beacon and Probe Response frames for the driver in
         * AP mode. The driver is responsible for building the full Beacon
         * frame by concatenating the head part with TIM IE generated by the
-        * driver/firmware and finishing with the tail part.
+        * driver/firmware and finishing with the tail part. Depending on the
+        * driver architectue, this can be done either by using the full
+        * template or the set of additional IEs (e.g., WPS and P2P IE).
+        * Similarly, Probe Response processing depends on the driver design.
+        * If the driver (or firmware) takes care of replying to Probe Request
+        * frames, the extra IEs provided here needs to be added to the Probe
+        * Response frames.
+        *
+        * Returns: 0 on success, -1 on failure
         */
-       int (*set_beacon)(void *priv, const u8 *head, size_t head_len,
-                         const u8 *tail, size_t tail_len, int dtim_period,
-                         int beacon_int);
+       int (*set_ap)(void *priv, struct wpa_driver_ap_params *params);
 
        /**
         * hapd_init - Initialize driver interface (hostapd only)
@@ -1296,7 +1434,7 @@ struct wpa_driver_ops {
         * Returns: Pointer to private data, %NULL on failure
         *
         * This function is used instead of init() or init2() when the driver
-        * wrapper is used withh hostapd.
+        * wrapper is used with hostapd.
         */
        void * (*hapd_init)(struct hostapd_data *hapd,
                            struct wpa_init_params *params);
@@ -1316,8 +1454,10 @@ struct wpa_driver_ops {
         * This is an optional function to configure the kernel driver to
         * enable/disable IEEE 802.1X support and set WPA/WPA2 parameters. This
         * can be left undefined (set to %NULL) if IEEE 802.1X support is
-        * always enabled and the driver uses set_beacon() to set WPA/RSN IE
+        * always enabled and the driver uses set_ap() to set WPA/RSN IE
         * for Beacon frames.
+        *
+        * DEPRECATED - use set_ap() instead
         */
        int (*set_ieee8021x)(void *priv, struct wpa_bss_params *params);
 
@@ -1329,7 +1469,9 @@ struct wpa_driver_ops {
         *
         * This is an optional function to configure privacy field in the
         * kernel driver for Beacon frames. This can be left undefined (set to
-        * %NULL) if the driver uses the Beacon template from set_beacon().
+        * %NULL) if the driver uses the Beacon template from set_ap().
+        *
+        * DEPRECATED - use set_ap() instead
         */
        int (*set_privacy)(void *priv, int enabled);
 
@@ -1371,7 +1513,9 @@ struct wpa_driver_ops {
         * This is an optional function to add information elements in the
         * kernel driver for Beacon and Probe Response frames. This can be left
         * undefined (set to %NULL) if the driver uses the Beacon template from
-        * set_beacon().
+        * set_ap().
+        *
+        * DEPRECATED - use set_ap() instead
         */
        int (*set_generic_elem)(void *priv, const u8 *elem, size_t elem_len);
 
@@ -1393,12 +1537,13 @@ struct wpa_driver_ops {
         * @data_len: Length of the EAPOL packet in octets
         * @encrypt: Whether the frame should be encrypted
         * @own_addr: Source MAC address
+        * @flags: WPA_STA_* flags for the destination station
         *
         * Returns: 0 on success, -1 on failure
         */
        int (*hapd_send_eapol)(void *priv, const u8 *addr, const u8 *data,
                               size_t data_len, int encrypt,
-                              const u8 *own_addr);
+                              const u8 *own_addr, u32 flags);
 
        /**
         * sta_deauth - Deauthenticate a station (AP only)
@@ -1444,8 +1589,7 @@ struct wpa_driver_ops {
         * Returns: Length of the SSID on success, -1 on failure
         *
         * This function need not be implemented if the driver uses Beacon
-        * template from set_beacon() and does not reply to Probe Request
-        * frames.
+        * template from set_ap() and does not reply to Probe Request frames.
         */
        int (*hapd_get_ssid)(void *priv, u8 *buf, int len);
 
@@ -1455,6 +1599,8 @@ struct wpa_driver_ops {
         * @buf: SSID
         * @len: Length of the SSID in octets
         * Returns: 0 on success, -1 on failure
+        *
+        * DEPRECATED - use set_ap() instead
         */
        int (*hapd_set_ssid)(void *priv, const u8 *buf, int len);
 
@@ -1478,6 +1624,9 @@ struct wpa_driver_ops {
         * This function is used to add a station entry to the driver once the
         * station has completed association. This is only used if the driver
         * does not take care of association processing.
+        *
+        * With TDLS, this function is also used to add or set (params->set 1)
+        * TDLS peer entries.
         */
        int (*sta_add)(void *priv, struct hostapd_sta_add_params *params);
 
@@ -1545,30 +1694,6 @@ struct wpa_driver_ops {
                             int mode);
 
        /**
-        * set_cts_protect - Set CTS protection mode (AP only)
-        * @priv: Private driver interface data
-        * @value: Whether CTS protection is enabled
-        * Returns: 0 on success, -1 on failure
-        */
-       int (*set_cts_protect)(void *priv, int value);
-
-       /**
-        * set_preamble - Set preamble mode (AP only)
-        * @priv: Private driver interface data
-        * @value: Whether short preamble is enabled
-        * Returns: 0 on success, -1 on failure
-        */
-       int (*set_preamble)(void *priv, int value);
-
-       /**
-        * set_short_slot_time - Set short slot time (AP only)
-        * @priv: Private driver interface data
-        * @value: Whether short slot time is enabled
-        * Returns: 0 on success, -1 on failure
-        */
-       int (*set_short_slot_time)(void *priv, int value);
-
-       /**
         * set_tx_queue_params - Set TX queue parameters
         * @priv: Private driver interface data
         * @queue: Queue number (0 = VO, 1 = VI, 2 = BE, 3 = BK)
@@ -1686,19 +1811,6 @@ struct wpa_driver_ops {
        int (*set_radius_acl_expire)(void *priv, const u8 *mac);
 
        /**
-        * set_ht_params - Set HT parameters (AP only)
-        * @priv: Private driver interface data
-        * @ht_capab: HT Capabilities IE
-        * @ht_capab_len: Length of ht_capab in octets
-        * @ht_oper: HT Operation IE
-        * @ht_oper_len: Length of ht_oper in octets
-        * Returns: 0 on success, -1 on failure
-        */
-       int (*set_ht_params)(void *priv,
-                            const u8 *ht_capab, size_t ht_capab_len,
-                            const u8 *ht_oper, size_t ht_oper_len);
-
-       /**
         * set_ap_wps_ie - Add WPS IE(s) into Beacon/Probe Response frames (AP)
         * @priv: Private driver interface data
         * @beacon: WPS IE(s) for Beacon frames or %NULL to remove extra IE(s)
@@ -1710,7 +1822,7 @@ struct wpa_driver_ops {
         *
         * This is an optional function to add WPS IE in the kernel driver for
         * Beacon and Probe Response frames. This can be left undefined (set
-        * to %NULL) if the driver uses the Beacon template from set_beacon()
+        * to %NULL) if the driver uses the Beacon template from set_ap()
         * and does not process Probe Request frames. If the driver takes care
         * of (Re)Association frame processing, the assocresp buffer includes
         * WPS IE(s) that need to be added to (Re)Association Response frames
@@ -1723,6 +1835,8 @@ struct wpa_driver_ops {
         * also used to provide Probe Response IEs for P2P Listen state
         * operations for drivers that generate the Probe Response frames
         * internally.
+        *
+        * DEPRECATED - use set_ap() instead
         */
        int (*set_ap_wps_ie)(void *priv, const struct wpabuf *beacon,
                             const struct wpabuf *proberesp,
@@ -1967,11 +2081,6 @@ struct wpa_driver_ops {
        int (*ampdu)(void *priv, int ampdu);
 
        /**
-        * set_intra_bss - Enables/Disables intra BSS bridging
-        */
-       int (*set_intra_bss)(void *priv, int enabled);
-
-       /**
         * get_radio_name - Get physical radio name for the device
         * @priv: Private driver interface data
         * Returns: Radio name or %NULL if not known
@@ -2209,7 +2318,7 @@ struct wpa_driver_ops {
         * @status_code: Status Code or Reason Code to use (if needed)
         * @buf: TDLS IEs to add to the message
         * @len: Length of buf in octets
-        * Returns: 0 on success, -1 on failure
+        * Returns: 0 on success, negative (<0) on failure
         *
         * This optional function can be used to send packet to driver which is
         * responsible for receiving and sending all TDLS packets.
@@ -2218,7 +2327,154 @@ struct wpa_driver_ops {
                              u8 dialog_token, u16 status_code,
                              const u8 *buf, size_t len);
 
+       /**
+        * tdls_oper - Ask the driver to perform high-level TDLS operations
+        * @priv: Private driver interface data
+        * @oper: TDLS high-level operation. See %enum tdls_oper
+        * @peer: Destination (peer) MAC address
+        * Returns: 0 on success, negative (<0) on failure
+        *
+        * This optional function can be used to send high-level TDLS commands
+        * to the driver.
+        */
        int (*tdls_oper)(void *priv, enum tdls_oper oper, const u8 *peer);
+
+       /**
+        * signal_poll - Get current connection information
+        * @priv: Private driver interface data
+        * @signal_info: Connection info structure
+         */
+       int (*signal_poll)(void *priv, struct wpa_signal_info *signal_info);
+
+       /**
+        * set_authmode - Set authentication algorithm(s) for static WEP
+        * @priv: Private driver interface data
+        * @authmode: 1=Open System, 2=Shared Key, 3=both
+        * Returns: 0 on success, -1 on failure
+        *
+        * This function can be used to set authentication algorithms for AP
+        * mode when static WEP is used. If the driver uses user space MLME/SME
+        * implementation, there is no need to implement this function.
+        *
+        * DEPRECATED - use set_ap() instead
+        */
+       int (*set_authmode)(void *priv, int authmode);
+
+       /**
+        * set_rekey_info - Set rekey information
+        * @priv: Private driver interface data
+        * @kek: Current KEK
+        * @kck: Current KCK
+        * @replay_ctr: Current EAPOL-Key Replay Counter
+        *
+        * This optional function can be used to provide information for the
+        * driver/firmware to process EAPOL-Key frames in Group Key Handshake
+        * while the host (including wpa_supplicant) is sleeping.
+        */
+       void (*set_rekey_info)(void *priv, const u8 *kek, const u8 *kck,
+                              const u8 *replay_ctr);
+
+       /**
+        * sta_assoc - Station association indication
+        * @priv: Private driver interface data
+        * @own_addr: Source address and BSSID for association frame
+        * @addr: MAC address of the station to associate
+        * @reassoc: flag to indicate re-association
+        * @status: association response status code
+        * @ie: assoc response ie buffer
+        * @len: ie buffer length
+        * Returns: 0 on success, -1 on failure
+        *
+        * This function indicates the driver to send (Re)Association
+        * Response frame to the station.
+        */
+        int (*sta_assoc)(void *priv, const u8 *own_addr, const u8 *addr,
+                         int reassoc, u16 status, const u8 *ie, size_t len);
+
+       /**
+        * sta_auth - Station authentication indication
+        * @priv: Private driver interface data
+        * @own_addr: Source address and BSSID for authentication frame
+        * @addr: MAC address of the station to associate
+        * @seq: authentication sequence number
+        * @status: authentication response status code
+        * @ie: authentication frame ie buffer
+        * @len: ie buffer length
+        *
+        * This function indicates the driver to send Authentication frame
+        * to the station.
+        */
+        int (*sta_auth)(void *priv, const u8 *own_addr, const u8 *addr,
+                        u16 seq, u16 status, const u8 *ie, size_t len);
+
+       /**
+        * add_tspec - Add traffic stream
+        * @priv: Private driver interface data
+        * @addr: MAC address of the station to associate
+        * @tspec_ie: tspec ie buffer
+        * @tspec_ielen: tspec ie length
+        * Returns: 0 on success, -1 on failure
+        *
+        * This function adds the traffic steam for the station
+        * and fills the medium_time in tspec_ie.
+        */
+        int (*add_tspec)(void *priv, const u8 *addr, u8 *tspec_ie,
+                         size_t tspec_ielen);
+
+       /**
+        * add_sta_node - Add a station node in the driver
+        * @priv: Private driver interface data
+        * @addr: MAC address of the station to add
+        * @auth_alg: authentication algorithm used by the station
+        * Returns: 0 on success, -1 on failure
+        *
+        * This function adds the station node in the driver, when
+        * the station gets added by FT-over-DS.
+        */
+       int (*add_sta_node)(void *priv, const u8 *addr, u16 auth_alg);
+
+       /**
+        * sched_scan - Request the driver to initiate scheduled scan
+        * @priv: Private driver interface data
+        * @params: Scan parameters
+        * @interval: Interval between scan cycles in milliseconds
+        * Returns: 0 on success, -1 on failure
+        *
+        * This operation should be used for scheduled scan offload to
+        * the hardware. Every time scan results are available, the
+        * driver should report scan results event for wpa_supplicant
+        * which will eventually request the results with
+        * wpa_driver_get_scan_results2(). This operation is optional
+        * and if not provided or if it returns -1, we fall back to
+        * normal host-scheduled scans.
+        */
+       int (*sched_scan)(void *priv, struct wpa_driver_scan_params *params,
+                         u32 interval);
+
+       /**
+        * stop_sched_scan - Request the driver to stop a scheduled scan
+        * @priv: Private driver interface data
+        * Returns: 0 on success, -1 on failure
+        *
+        * This should cause the scheduled scan to be stopped and
+        * results should stop being sent. Must be supported if
+        * sched_scan is supported.
+        */
+       int (*stop_sched_scan)(void *priv);
+
+       /**
+        * poll_client - Probe (null data or such) the given station
+        * @priv: Private driver interface data
+        * @own_addr: MAC address of sending interface
+        * @addr: MAC address of the station to probe
+        * @qos: Indicates whether station is QoS station
+        *
+        * This function is used to verify whether an associated station is
+        * still present. This function does not need to be implemented if the
+        * driver provides such inactivity polling mechanism.
+        */
+       void (*poll_client)(void *priv, const u8 *own_addr,
+                           const u8 *addr, int qos);
 };
 
 
@@ -2621,7 +2877,30 @@ enum wpa_event_type {
        /**
         * EVENT_IBSS_PEER_LOST - IBSS peer not reachable anymore
         */
-       EVENT_IBSS_PEER_LOST
+       EVENT_IBSS_PEER_LOST,
+
+       /**
+        * EVENT_DRIVER_GTK_REKEY - Device/driver did GTK rekey
+        *
+        * This event carries the new replay counter to notify wpa_supplicant
+        * of the current EAPOL-Key Replay Counter in case the driver/firmware
+        * completed Group Key Handshake while the host (including
+        * wpa_supplicant was sleeping).
+        */
+       EVENT_DRIVER_GTK_REKEY,
+
+       /**
+        * EVENT_SCHED_SCAN_STOPPED - Scheduled scan was stopped
+        */
+       EVENT_SCHED_SCAN_STOPPED,
+
+       /**
+        * EVENT_DRIVER_CLIENT_POLL_OK - Station responded to poll
+        *
+        * This event indicates that the station responded to the poll
+        * initiated with @poll_client.
+        */
+       EVENT_DRIVER_CLIENT_POLL_OK
 };
 
 
@@ -2845,7 +3124,9 @@ union wpa_event_data {
         */
        struct auth_info {
                u8 peer[ETH_ALEN];
+               u8 bssid[ETH_ALEN];
                u16 auth_type;
+               u16 auth_transaction;
                u16 status_code;
                const u8 *ies;
                size_t ies_len;
@@ -2913,8 +3194,9 @@ union wpa_event_data {
         * struct rx_from_unknown - Data for EVENT_RX_FROM_UNKNOWN events
         */
        struct rx_from_unknown {
-               const u8 *frame;
-               size_t len;
+               const u8 *bssid;
+               const u8 *addr;
+               int wds;
        } rx_from_unknown;
 
        /**
@@ -3022,6 +3304,18 @@ union wpa_event_data {
                const u8 *sa;
 
                /**
+                * da - Destination address of the received Probe Request frame
+                *      or %NULL if not available
+                */
+               const u8 *da;
+
+               /**
+                * bssid - BSSID of the received Probe Request frame or %NULL
+                *      if not available
+                */
+               const u8 *bssid;
+
+               /**
                 * ie - IEs from the Probe Request body
                 */
                const u8 *ie;
@@ -3049,15 +3343,9 @@ union wpa_event_data {
        } eapol_rx;
 
        /**
-        * struct signal_change - Data for EVENT_SIGNAL_CHANGE events
+        * signal_change - Data for EVENT_SIGNAL_CHANGE events
         */
-       struct signal_change {
-               u32 frequency;
-               int above_threshold;
-               int current_signal;
-               int current_noise;
-               int current_txrate;
-       } signal_change;
+       struct wpa_signal_info signal_change;
 
        /**
         * struct best_channel - Data for EVENT_BEST_CHANNEL events
@@ -3159,6 +3447,22 @@ union wpa_event_data {
        struct ibss_peer_lost {
                u8 peer[ETH_ALEN];
        } ibss_peer_lost;
+
+       /**
+        * struct driver_gtk_rekey - Data for EVENT_DRIVER_GTK_REKEY
+        */
+       struct driver_gtk_rekey {
+               const u8 *bssid;
+               const u8 *replay_ctr;
+       } driver_gtk_rekey;
+
+       /**
+        * struct client_poll - Data for EVENT_DRIVER_CLIENT_POLL_OK events
+        * @addr: station address
+        */
+       struct client_poll {
+               u8 addr[ETH_ALEN];
+       } client_poll;
 };
 
 /**
@@ -3211,4 +3515,17 @@ static inline void drv_event_eapol_rx(void *ctx, const u8 *src, const u8 *data,
        wpa_supplicant_event(ctx, EVENT_EAPOL_RX, &event);
 }
 
+static inline void wpa_scan_results_free(struct wpa_scan_results *res)
+{
+       size_t i;
+
+       if (res == NULL)
+               return;
+
+       for (i = 0; i < res->num; i++)
+               os_free(res->res[i]);
+       os_free(res->res);
+       os_free(res);
+}
+
 #endif /* DRIVER_H */