xref: /freebsd/contrib/wpa/wpa_supplicant/wpa_supplicant_i.h (revision 2aef0ff7d9bb3f1013e7439eb37d46e70f55a3b7)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * wpa_supplicant - Internal definitions
339beb93cSSam Leffler  * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
539beb93cSSam Leffler  * This program is free software; you can redistribute it and/or modify
639beb93cSSam Leffler  * it under the terms of the GNU General Public License version 2 as
739beb93cSSam Leffler  * published by the Free Software Foundation.
839beb93cSSam Leffler  *
939beb93cSSam Leffler  * Alternatively, this software may be distributed under the terms of BSD
1039beb93cSSam Leffler  * license.
1139beb93cSSam Leffler  *
1239beb93cSSam Leffler  * See README and COPYING for more details.
1339beb93cSSam Leffler  */
1439beb93cSSam Leffler 
1539beb93cSSam Leffler #ifndef WPA_SUPPLICANT_I_H
1639beb93cSSam Leffler #define WPA_SUPPLICANT_I_H
1739beb93cSSam Leffler 
1839beb93cSSam Leffler #include "drivers/driver.h"
1939beb93cSSam Leffler 
2039beb93cSSam Leffler extern const char *wpa_supplicant_version;
2139beb93cSSam Leffler extern const char *wpa_supplicant_license;
2239beb93cSSam Leffler #ifndef CONFIG_NO_STDOUT_DEBUG
2339beb93cSSam Leffler extern const char *wpa_supplicant_full_license1;
2439beb93cSSam Leffler extern const char *wpa_supplicant_full_license2;
2539beb93cSSam Leffler extern const char *wpa_supplicant_full_license3;
2639beb93cSSam Leffler extern const char *wpa_supplicant_full_license4;
2739beb93cSSam Leffler extern const char *wpa_supplicant_full_license5;
2839beb93cSSam Leffler #endif /* CONFIG_NO_STDOUT_DEBUG */
2939beb93cSSam Leffler 
3039beb93cSSam Leffler extern struct wpa_driver_ops *wpa_supplicant_drivers[];
3139beb93cSSam Leffler 
3239beb93cSSam Leffler 
3339beb93cSSam Leffler struct wpa_scan_result;
3439beb93cSSam Leffler struct wpa_sm;
3539beb93cSSam Leffler struct wpa_supplicant;
3639beb93cSSam Leffler 
3739beb93cSSam Leffler /*
3839beb93cSSam Leffler  * Forward declarations of private structures used within the ctrl_iface
3939beb93cSSam Leffler  * backends. Other parts of wpa_supplicant do not have access to data stored in
4039beb93cSSam Leffler  * these structures.
4139beb93cSSam Leffler  */
4239beb93cSSam Leffler struct ctrl_iface_priv;
4339beb93cSSam Leffler struct ctrl_iface_global_priv;
4439beb93cSSam Leffler struct ctrl_iface_dbus_priv;
4539beb93cSSam Leffler 
4639beb93cSSam Leffler /**
4739beb93cSSam Leffler  * struct wpa_interface - Parameters for wpa_supplicant_add_iface()
4839beb93cSSam Leffler  */
4939beb93cSSam Leffler struct wpa_interface {
5039beb93cSSam Leffler 	/**
5139beb93cSSam Leffler 	 * confname - Configuration name (file or profile) name
5239beb93cSSam Leffler 	 *
5339beb93cSSam Leffler 	 * This can also be %NULL when a configuration file is not used. In
5439beb93cSSam Leffler 	 * that case, ctrl_interface must be set to allow the interface to be
5539beb93cSSam Leffler 	 * configured.
5639beb93cSSam Leffler 	 */
5739beb93cSSam Leffler 	const char *confname;
5839beb93cSSam Leffler 
5939beb93cSSam Leffler 	/**
6039beb93cSSam Leffler 	 * ctrl_interface - Control interface parameter
6139beb93cSSam Leffler 	 *
6239beb93cSSam Leffler 	 * If a configuration file is not used, this variable can be used to
6339beb93cSSam Leffler 	 * set the ctrl_interface parameter that would have otherwise been read
6439beb93cSSam Leffler 	 * from the configuration file. If both confname and ctrl_interface are
6539beb93cSSam Leffler 	 * set, ctrl_interface is used to override the value from configuration
6639beb93cSSam Leffler 	 * file.
6739beb93cSSam Leffler 	 */
6839beb93cSSam Leffler 	const char *ctrl_interface;
6939beb93cSSam Leffler 
7039beb93cSSam Leffler 	/**
7139beb93cSSam Leffler 	 * driver - Driver interface name, or %NULL to use the default driver
7239beb93cSSam Leffler 	 */
7339beb93cSSam Leffler 	const char *driver;
7439beb93cSSam Leffler 
7539beb93cSSam Leffler 	/**
7639beb93cSSam Leffler 	 * driver_param - Driver interface parameters
7739beb93cSSam Leffler 	 *
7839beb93cSSam Leffler 	 * If a configuration file is not used, this variable can be used to
7939beb93cSSam Leffler 	 * set the driver_param parameters that would have otherwise been read
8039beb93cSSam Leffler 	 * from the configuration file. If both confname and driver_param are
8139beb93cSSam Leffler 	 * set, driver_param is used to override the value from configuration
8239beb93cSSam Leffler 	 * file.
8339beb93cSSam Leffler 	 */
8439beb93cSSam Leffler 	const char *driver_param;
8539beb93cSSam Leffler 
8639beb93cSSam Leffler 	/**
8739beb93cSSam Leffler 	 * ifname - Interface name
8839beb93cSSam Leffler 	 */
8939beb93cSSam Leffler 	const char *ifname;
9039beb93cSSam Leffler 
9139beb93cSSam Leffler 	/**
9239beb93cSSam Leffler 	 * bridge_ifname - Optional bridge interface name
9339beb93cSSam Leffler 	 *
9439beb93cSSam Leffler 	 * If the driver interface (ifname) is included in a Linux bridge
9539beb93cSSam Leffler 	 * device, the bridge interface may need to be used for receiving EAPOL
9639beb93cSSam Leffler 	 * frames. This can be enabled by setting this variable to enable
9739beb93cSSam Leffler 	 * receiving of EAPOL frames from an additional interface.
9839beb93cSSam Leffler 	 */
9939beb93cSSam Leffler 	const char *bridge_ifname;
10039beb93cSSam Leffler };
10139beb93cSSam Leffler 
10239beb93cSSam Leffler /**
10339beb93cSSam Leffler  * struct wpa_params - Parameters for wpa_supplicant_init()
10439beb93cSSam Leffler  */
10539beb93cSSam Leffler struct wpa_params {
10639beb93cSSam Leffler 	/**
10739beb93cSSam Leffler 	 * daemonize - Run %wpa_supplicant in the background
10839beb93cSSam Leffler 	 */
10939beb93cSSam Leffler 	int daemonize;
11039beb93cSSam Leffler 
11139beb93cSSam Leffler 	/**
11239beb93cSSam Leffler 	 * wait_for_monitor - Wait for a monitor program before starting
11339beb93cSSam Leffler 	 */
11439beb93cSSam Leffler 	int wait_for_monitor;
11539beb93cSSam Leffler 
11639beb93cSSam Leffler 	/**
11739beb93cSSam Leffler 	 * pid_file - Path to a PID (process ID) file
11839beb93cSSam Leffler 	 *
11939beb93cSSam Leffler 	 * If this and daemonize are set, process ID of the background process
12039beb93cSSam Leffler 	 * will be written to the specified file.
12139beb93cSSam Leffler 	 */
12239beb93cSSam Leffler 	char *pid_file;
12339beb93cSSam Leffler 
12439beb93cSSam Leffler 	/**
12539beb93cSSam Leffler 	 * wpa_debug_level - Debugging verbosity level (e.g., MSG_INFO)
12639beb93cSSam Leffler 	 */
12739beb93cSSam Leffler 	int wpa_debug_level;
12839beb93cSSam Leffler 
12939beb93cSSam Leffler 	/**
13039beb93cSSam Leffler 	 * wpa_debug_show_keys - Whether keying material is included in debug
13139beb93cSSam Leffler 	 *
13239beb93cSSam Leffler 	 * This parameter can be used to allow keying material to be included
13339beb93cSSam Leffler 	 * in debug messages. This is a security risk and this option should
13439beb93cSSam Leffler 	 * not be enabled in normal configuration. If needed during
13539beb93cSSam Leffler 	 * development or while troubleshooting, this option can provide more
13639beb93cSSam Leffler 	 * details for figuring out what is happening.
13739beb93cSSam Leffler 	 */
13839beb93cSSam Leffler 	int wpa_debug_show_keys;
13939beb93cSSam Leffler 
14039beb93cSSam Leffler 	/**
14139beb93cSSam Leffler 	 * wpa_debug_timestamp - Whether to include timestamp in debug messages
14239beb93cSSam Leffler 	 */
14339beb93cSSam Leffler 	int wpa_debug_timestamp;
14439beb93cSSam Leffler 
14539beb93cSSam Leffler 	/**
14639beb93cSSam Leffler 	 * ctrl_interface - Global ctrl_iface path/parameter
14739beb93cSSam Leffler 	 */
14839beb93cSSam Leffler 	char *ctrl_interface;
14939beb93cSSam Leffler 
15039beb93cSSam Leffler 	/**
15139beb93cSSam Leffler 	 * dbus_ctrl_interface - Enable the DBus control interface
15239beb93cSSam Leffler 	 */
15339beb93cSSam Leffler 	int dbus_ctrl_interface;
15439beb93cSSam Leffler 
15539beb93cSSam Leffler 	/**
15639beb93cSSam Leffler 	 * wpa_debug_file_path - Path of debug file or %NULL to use stdout
15739beb93cSSam Leffler 	 */
15839beb93cSSam Leffler 	const char *wpa_debug_file_path;
1592aef0ff7SSam Leffler 
1602aef0ff7SSam Leffler 	/**
1612aef0ff7SSam Leffler 	 * wpa_debug_syslog - Enable log output through syslog
1622aef0ff7SSam Leffler 	 */
1632aef0ff7SSam Leffler 	const char *wpa_debug_syslog;
16439beb93cSSam Leffler };
16539beb93cSSam Leffler 
16639beb93cSSam Leffler /**
16739beb93cSSam Leffler  * struct wpa_global - Internal, global data for all %wpa_supplicant interfaces
16839beb93cSSam Leffler  *
16939beb93cSSam Leffler  * This structure is initialized by calling wpa_supplicant_init() when starting
17039beb93cSSam Leffler  * %wpa_supplicant.
17139beb93cSSam Leffler  */
17239beb93cSSam Leffler struct wpa_global {
17339beb93cSSam Leffler 	struct wpa_supplicant *ifaces;
17439beb93cSSam Leffler 	struct wpa_params params;
17539beb93cSSam Leffler 	struct ctrl_iface_global_priv *ctrl_iface;
17639beb93cSSam Leffler 	struct ctrl_iface_dbus_priv *dbus_ctrl_iface;
17739beb93cSSam Leffler 	void **drv_priv;
17839beb93cSSam Leffler 	size_t drv_count;
17939beb93cSSam Leffler };
18039beb93cSSam Leffler 
18139beb93cSSam Leffler 
18239beb93cSSam Leffler struct wpa_client_mlme {
18339beb93cSSam Leffler #ifdef CONFIG_CLIENT_MLME
18439beb93cSSam Leffler 	enum {
18539beb93cSSam Leffler 		IEEE80211_DISABLED, IEEE80211_AUTHENTICATE,
18639beb93cSSam Leffler 		IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED,
18739beb93cSSam Leffler 		IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED
18839beb93cSSam Leffler 	} state;
18939beb93cSSam Leffler 	u8 prev_bssid[ETH_ALEN];
19039beb93cSSam Leffler 	u8 ssid[32];
19139beb93cSSam Leffler 	size_t ssid_len;
19239beb93cSSam Leffler 	u16 aid;
19339beb93cSSam Leffler 	u16 ap_capab, capab;
19439beb93cSSam Leffler 	u8 *extra_ie; /* to be added to the end of AssocReq */
19539beb93cSSam Leffler 	size_t extra_ie_len;
19639beb93cSSam Leffler 	u8 *extra_probe_ie; /* to be added to the end of ProbeReq */
19739beb93cSSam Leffler 	size_t extra_probe_ie_len;
19839beb93cSSam Leffler 	wpa_key_mgmt key_mgmt;
19939beb93cSSam Leffler 
20039beb93cSSam Leffler 	/* The last AssocReq/Resp IEs */
20139beb93cSSam Leffler 	u8 *assocreq_ies, *assocresp_ies;
20239beb93cSSam Leffler 	size_t assocreq_ies_len, assocresp_ies_len;
20339beb93cSSam Leffler 
20439beb93cSSam Leffler 	int auth_tries, assoc_tries;
20539beb93cSSam Leffler 
20639beb93cSSam Leffler 	unsigned int ssid_set:1;
20739beb93cSSam Leffler 	unsigned int bssid_set:1;
20839beb93cSSam Leffler 	unsigned int prev_bssid_set:1;
20939beb93cSSam Leffler 	unsigned int authenticated:1;
21039beb93cSSam Leffler 	unsigned int associated:1;
21139beb93cSSam Leffler 	unsigned int probereq_poll:1;
21239beb93cSSam Leffler 	unsigned int use_protection:1;
21339beb93cSSam Leffler 	unsigned int create_ibss:1;
21439beb93cSSam Leffler 	unsigned int mixed_cell:1;
21539beb93cSSam Leffler 	unsigned int wmm_enabled:1;
21639beb93cSSam Leffler 
21739beb93cSSam Leffler 	struct os_time last_probe;
21839beb93cSSam Leffler 
21939beb93cSSam Leffler #define IEEE80211_AUTH_ALG_OPEN BIT(0)
22039beb93cSSam Leffler #define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1)
22139beb93cSSam Leffler #define IEEE80211_AUTH_ALG_LEAP BIT(2)
22239beb93cSSam Leffler 	unsigned int auth_algs; /* bitfield of allowed auth algs */
22339beb93cSSam Leffler 	int auth_alg; /* currently used IEEE 802.11 authentication algorithm */
22439beb93cSSam Leffler 	int auth_transaction;
22539beb93cSSam Leffler 
22639beb93cSSam Leffler 	struct os_time ibss_join_req;
22739beb93cSSam Leffler 	u8 *probe_resp; /* ProbeResp template for IBSS */
22839beb93cSSam Leffler 	size_t probe_resp_len;
22939beb93cSSam Leffler 	u32 supp_rates_bits;
23039beb93cSSam Leffler 
23139beb93cSSam Leffler 	int wmm_last_param_set;
23239beb93cSSam Leffler 
23339beb93cSSam Leffler 	int sta_scanning;
23439beb93cSSam Leffler 	int scan_hw_mode_idx;
23539beb93cSSam Leffler 	int scan_channel_idx;
23639beb93cSSam Leffler 	enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state;
23739beb93cSSam Leffler 	struct os_time last_scan_completed;
23839beb93cSSam Leffler 	int scan_oper_channel;
23939beb93cSSam Leffler 	int scan_oper_freq;
24039beb93cSSam Leffler 	int scan_oper_phymode;
24139beb93cSSam Leffler 	u8 scan_ssid[32];
24239beb93cSSam Leffler 	size_t scan_ssid_len;
24339beb93cSSam Leffler 	int scan_skip_11b;
24439beb93cSSam Leffler 
24539beb93cSSam Leffler 	struct ieee80211_sta_bss *sta_bss_list;
24639beb93cSSam Leffler #define STA_HASH_SIZE 256
24739beb93cSSam Leffler #define STA_HASH(sta) (sta[5])
24839beb93cSSam Leffler 	struct ieee80211_sta_bss *sta_bss_hash[STA_HASH_SIZE];
24939beb93cSSam Leffler 
25039beb93cSSam Leffler 	int cts_protect_erp_frames;
25139beb93cSSam Leffler 
25239beb93cSSam Leffler 	int phymode; /* current mode; WPA_MODE_IEEE80211A, .. */
25339beb93cSSam Leffler 	struct wpa_hw_modes *modes;
25439beb93cSSam Leffler 	size_t num_modes;
25539beb93cSSam Leffler 	unsigned int hw_modes; /* bitfield of allowed hardware modes;
25639beb93cSSam Leffler 				* (1 << MODE_*) */
25739beb93cSSam Leffler 	int num_curr_rates;
25839beb93cSSam Leffler 	struct wpa_rate_data *curr_rates;
25939beb93cSSam Leffler 	int freq; /* The current frequency in MHz */
26039beb93cSSam Leffler 	int channel; /* The current IEEE 802.11 channel number */
26139beb93cSSam Leffler 
26239beb93cSSam Leffler #ifdef CONFIG_IEEE80211R
26339beb93cSSam Leffler 	u8 current_md[6];
26439beb93cSSam Leffler 	u8 *ft_ies;
26539beb93cSSam Leffler 	size_t ft_ies_len;
26639beb93cSSam Leffler #endif /* CONFIG_IEEE80211R */
26739beb93cSSam Leffler 
26839beb93cSSam Leffler #else /* CONFIG_CLIENT_MLME */
26939beb93cSSam Leffler 	int dummy; /* to keep MSVC happy */
27039beb93cSSam Leffler #endif /* CONFIG_CLIENT_MLME */
27139beb93cSSam Leffler };
27239beb93cSSam Leffler 
27339beb93cSSam Leffler /**
27439beb93cSSam Leffler  * struct wpa_supplicant - Internal data for wpa_supplicant interface
27539beb93cSSam Leffler  *
27639beb93cSSam Leffler  * This structure contains the internal data for core wpa_supplicant code. This
27739beb93cSSam Leffler  * should be only used directly from the core code. However, a pointer to this
27839beb93cSSam Leffler  * data is used from other files as an arbitrary context pointer in calls to
27939beb93cSSam Leffler  * core functions.
28039beb93cSSam Leffler  */
28139beb93cSSam Leffler struct wpa_supplicant {
28239beb93cSSam Leffler 	struct wpa_global *global;
28339beb93cSSam Leffler 	struct wpa_supplicant *next;
28439beb93cSSam Leffler 	struct l2_packet_data *l2;
28539beb93cSSam Leffler 	struct l2_packet_data *l2_br;
28639beb93cSSam Leffler 	unsigned char own_addr[ETH_ALEN];
28739beb93cSSam Leffler 	char ifname[100];
28839beb93cSSam Leffler #ifdef CONFIG_CTRL_IFACE_DBUS
28939beb93cSSam Leffler 	char *dbus_path;
29039beb93cSSam Leffler #endif /* CONFIG_CTRL_IFACE_DBUS */
29139beb93cSSam Leffler 	char bridge_ifname[16];
29239beb93cSSam Leffler 
29339beb93cSSam Leffler 	char *confname;
29439beb93cSSam Leffler 	struct wpa_config *conf;
29539beb93cSSam Leffler 	int countermeasures;
29639beb93cSSam Leffler 	os_time_t last_michael_mic_error;
29739beb93cSSam Leffler 	u8 bssid[ETH_ALEN];
29839beb93cSSam Leffler 	u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this
29939beb93cSSam Leffler 				     * field contains the targer BSSID. */
30039beb93cSSam Leffler 	int reassociate; /* reassociation requested */
30139beb93cSSam Leffler 	int disconnected; /* all connections disabled; i.e., do no reassociate
30239beb93cSSam Leffler 			   * before this has been cleared */
30339beb93cSSam Leffler 	struct wpa_ssid *current_ssid;
30439beb93cSSam Leffler 	int ap_ies_from_associnfo;
30539beb93cSSam Leffler 
30639beb93cSSam Leffler 	/* Selected configuration (based on Beacon/ProbeResp WPA IE) */
30739beb93cSSam Leffler 	int pairwise_cipher;
30839beb93cSSam Leffler 	int group_cipher;
30939beb93cSSam Leffler 	int key_mgmt;
31039beb93cSSam Leffler 	int mgmt_group_cipher;
31139beb93cSSam Leffler 
31239beb93cSSam Leffler 	void *drv_priv; /* private data used by driver_ops */
31339beb93cSSam Leffler 
31439beb93cSSam Leffler 	struct wpa_ssid *prev_scan_ssid; /* previously scanned SSID;
31539beb93cSSam Leffler 					  * NULL = not yet initialized (start
31639beb93cSSam Leffler 					  * with broadcast SSID)
31739beb93cSSam Leffler 					  * BROADCAST_SSID_SCAN = broadcast
31839beb93cSSam Leffler 					  * SSID was used in the previous scan
31939beb93cSSam Leffler 					  */
32039beb93cSSam Leffler #define BROADCAST_SSID_SCAN ((struct wpa_ssid *) 1)
32139beb93cSSam Leffler 
32239beb93cSSam Leffler 	struct wpa_scan_results *scan_res;
32339beb93cSSam Leffler 
32439beb93cSSam Leffler 	struct wpa_driver_ops *driver;
32539beb93cSSam Leffler 	int interface_removed; /* whether the network interface has been
32639beb93cSSam Leffler 				* removed */
32739beb93cSSam Leffler 	struct wpa_sm *wpa;
32839beb93cSSam Leffler 	struct eapol_sm *eapol;
32939beb93cSSam Leffler 
33039beb93cSSam Leffler 	struct ctrl_iface_priv *ctrl_iface;
33139beb93cSSam Leffler 
33239beb93cSSam Leffler 	wpa_states wpa_state;
33339beb93cSSam Leffler 	int new_connection;
33439beb93cSSam Leffler 	int reassociated_connection;
33539beb93cSSam Leffler 
33639beb93cSSam Leffler 	int eapol_received; /* number of EAPOL packets received after the
33739beb93cSSam Leffler 			     * previous association event */
33839beb93cSSam Leffler 
33939beb93cSSam Leffler 	struct scard_data *scard;
34039beb93cSSam Leffler 
34139beb93cSSam Leffler 	unsigned char last_eapol_src[ETH_ALEN];
34239beb93cSSam Leffler 
34339beb93cSSam Leffler 	int keys_cleared;
34439beb93cSSam Leffler 
34539beb93cSSam Leffler 	struct wpa_blacklist *blacklist;
34639beb93cSSam Leffler 
34739beb93cSSam Leffler 	int scan_req; /* manual scan request; this forces a scan even if there
34839beb93cSSam Leffler 		       * are no enabled networks in the configuration */
34939beb93cSSam Leffler 	int scan_res_tried; /* whether ap_scan=1 mode has tried to fetch scan
35039beb93cSSam Leffler 			     * results without a new scan request; this is used
35139beb93cSSam Leffler 			     * to speed up the first association if the driver
35239beb93cSSam Leffler 			     * has already available scan results. */
35339beb93cSSam Leffler 	int scan_runs; /* number of scan runs since WPS was started */
35439beb93cSSam Leffler 
35539beb93cSSam Leffler 	struct wpa_client_mlme mlme;
35639beb93cSSam Leffler 	int use_client_mlme;
35739beb93cSSam Leffler 	int driver_4way_handshake;
35839beb93cSSam Leffler 
35939beb93cSSam Leffler 	int pending_mic_error_report;
36039beb93cSSam Leffler 	int pending_mic_error_pairwise;
36139beb93cSSam Leffler 	int mic_errors_seen; /* Michael MIC errors with the current PTK */
36239beb93cSSam Leffler 
36339beb93cSSam Leffler 	struct wps_context *wps;
36439beb93cSSam Leffler 	int wps_success; /* WPS success event received */
36539beb93cSSam Leffler 	int blacklist_cleared;
36639beb93cSSam Leffler };
36739beb93cSSam Leffler 
36839beb93cSSam Leffler 
36939beb93cSSam Leffler /* wpa_supplicant.c */
37039beb93cSSam Leffler int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s);
37139beb93cSSam Leffler 
37239beb93cSSam Leffler const char * wpa_supplicant_state_txt(int state);
37339beb93cSSam Leffler int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s);
37439beb93cSSam Leffler int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
37539beb93cSSam Leffler 			      struct wpa_scan_res *bss,
37639beb93cSSam Leffler 			      struct wpa_ssid *ssid,
37739beb93cSSam Leffler 			      u8 *wpa_ie, size_t *wpa_ie_len);
37839beb93cSSam Leffler void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
37939beb93cSSam Leffler 			      struct wpa_scan_res *bss,
38039beb93cSSam Leffler 			      struct wpa_ssid *ssid);
38139beb93cSSam Leffler void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s,
38239beb93cSSam Leffler 				       struct wpa_ssid *ssid);
38339beb93cSSam Leffler void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s);
38439beb93cSSam Leffler int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s);
38539beb93cSSam Leffler void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr);
38639beb93cSSam Leffler void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
38739beb93cSSam Leffler 				     int sec, int usec);
38839beb93cSSam Leffler void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state);
38939beb93cSSam Leffler struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s);
39039beb93cSSam Leffler void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s);
39139beb93cSSam Leffler void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s,
39239beb93cSSam Leffler 				   int reason_code);
39339beb93cSSam Leffler void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s,
39439beb93cSSam Leffler 				 int reason_code);
39539beb93cSSam Leffler 
39639beb93cSSam Leffler void wpa_show_license(void);
39739beb93cSSam Leffler 
39839beb93cSSam Leffler struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
39939beb93cSSam Leffler 						 struct wpa_interface *iface);
40039beb93cSSam Leffler int wpa_supplicant_remove_iface(struct wpa_global *global,
40139beb93cSSam Leffler 				struct wpa_supplicant *wpa_s);
40239beb93cSSam Leffler struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global,
40339beb93cSSam Leffler 						 const char *ifname);
40439beb93cSSam Leffler struct wpa_global * wpa_supplicant_init(struct wpa_params *params);
40539beb93cSSam Leffler int wpa_supplicant_run(struct wpa_global *global);
40639beb93cSSam Leffler void wpa_supplicant_deinit(struct wpa_global *global);
40739beb93cSSam Leffler 
40839beb93cSSam Leffler int wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s,
40939beb93cSSam Leffler 			      struct wpa_ssid *ssid);
41039beb93cSSam Leffler 
41139beb93cSSam Leffler /* scan.c */
41239beb93cSSam Leffler void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec);
41339beb93cSSam Leffler void wpa_supplicant_cancel_scan(struct wpa_supplicant *wpa_s);
41439beb93cSSam Leffler 
41539beb93cSSam Leffler /* events.c */
41639beb93cSSam Leffler void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s);
41739beb93cSSam Leffler 
41839beb93cSSam Leffler /* driver_ops */
41939beb93cSSam Leffler static inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
42039beb93cSSam Leffler 				  const char *ifname)
42139beb93cSSam Leffler {
42239beb93cSSam Leffler 	if (wpa_s->driver->init2)
42339beb93cSSam Leffler 		return wpa_s->driver->init2(wpa_s, ifname, wpa_s->global);
42439beb93cSSam Leffler 	if (wpa_s->driver->init) {
42539beb93cSSam Leffler 		return wpa_s->driver->init(wpa_s, ifname);
42639beb93cSSam Leffler 	}
42739beb93cSSam Leffler 	return NULL;
42839beb93cSSam Leffler }
42939beb93cSSam Leffler 
43039beb93cSSam Leffler static inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
43139beb93cSSam Leffler {
43239beb93cSSam Leffler 	if (wpa_s->driver->deinit)
43339beb93cSSam Leffler 		wpa_s->driver->deinit(wpa_s->drv_priv);
43439beb93cSSam Leffler }
43539beb93cSSam Leffler 
43639beb93cSSam Leffler static inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
43739beb93cSSam Leffler 				    const char *param)
43839beb93cSSam Leffler {
43939beb93cSSam Leffler 	if (wpa_s->driver->set_param)
44039beb93cSSam Leffler 		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
44139beb93cSSam Leffler 	return 0;
44239beb93cSSam Leffler }
44339beb93cSSam Leffler 
44439beb93cSSam Leffler static inline int wpa_drv_set_drop_unencrypted(struct wpa_supplicant *wpa_s,
44539beb93cSSam Leffler 					       int enabled)
44639beb93cSSam Leffler {
44739beb93cSSam Leffler 	if (wpa_s->driver->set_drop_unencrypted) {
44839beb93cSSam Leffler 		return wpa_s->driver->set_drop_unencrypted(wpa_s->drv_priv,
44939beb93cSSam Leffler 							   enabled);
45039beb93cSSam Leffler 	}
45139beb93cSSam Leffler 	return -1;
45239beb93cSSam Leffler }
45339beb93cSSam Leffler 
45439beb93cSSam Leffler static inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
45539beb93cSSam Leffler 					      int enabled)
45639beb93cSSam Leffler {
45739beb93cSSam Leffler 	if (wpa_s->driver->set_countermeasures) {
45839beb93cSSam Leffler 		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
45939beb93cSSam Leffler 							  enabled);
46039beb93cSSam Leffler 	}
46139beb93cSSam Leffler 	return -1;
46239beb93cSSam Leffler }
46339beb93cSSam Leffler 
46439beb93cSSam Leffler static inline int wpa_drv_set_auth_alg(struct wpa_supplicant *wpa_s,
46539beb93cSSam Leffler 				       int auth_alg)
46639beb93cSSam Leffler {
46739beb93cSSam Leffler 	if (wpa_s->driver->set_auth_alg) {
46839beb93cSSam Leffler 		return wpa_s->driver->set_auth_alg(wpa_s->drv_priv,
46939beb93cSSam Leffler 						   auth_alg);
47039beb93cSSam Leffler 	}
47139beb93cSSam Leffler 	return -1;
47239beb93cSSam Leffler }
47339beb93cSSam Leffler 
47439beb93cSSam Leffler static inline int wpa_drv_set_wpa(struct wpa_supplicant *wpa_s, int enabled)
47539beb93cSSam Leffler {
47639beb93cSSam Leffler 	if (wpa_s->driver->set_wpa) {
47739beb93cSSam Leffler 		return wpa_s->driver->set_wpa(wpa_s->drv_priv, enabled);
47839beb93cSSam Leffler 	}
47939beb93cSSam Leffler 	return 0;
48039beb93cSSam Leffler }
48139beb93cSSam Leffler 
48239beb93cSSam Leffler static inline int wpa_drv_set_mode(struct wpa_supplicant *wpa_s, int mode)
48339beb93cSSam Leffler {
48439beb93cSSam Leffler 	if (wpa_s->driver->set_mode) {
48539beb93cSSam Leffler 		return wpa_s->driver->set_mode(wpa_s->drv_priv, mode);
48639beb93cSSam Leffler 	}
48739beb93cSSam Leffler 	return 0;
48839beb93cSSam Leffler }
48939beb93cSSam Leffler 
49039beb93cSSam Leffler static inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
49139beb93cSSam Leffler 				    struct wpa_driver_associate_params *params)
49239beb93cSSam Leffler {
49339beb93cSSam Leffler 	if (wpa_s->driver->associate) {
49439beb93cSSam Leffler 		return wpa_s->driver->associate(wpa_s->drv_priv, params);
49539beb93cSSam Leffler 	}
49639beb93cSSam Leffler 	return -1;
49739beb93cSSam Leffler }
49839beb93cSSam Leffler 
49939beb93cSSam Leffler static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s, const u8 *ssid,
50039beb93cSSam Leffler 			       size_t ssid_len)
50139beb93cSSam Leffler {
50239beb93cSSam Leffler 	if (wpa_s->driver->scan) {
50339beb93cSSam Leffler 		return wpa_s->driver->scan(wpa_s->drv_priv, ssid, ssid_len);
50439beb93cSSam Leffler 	}
50539beb93cSSam Leffler 	return -1;
50639beb93cSSam Leffler }
50739beb93cSSam Leffler 
50839beb93cSSam Leffler static inline int wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s,
50939beb93cSSam Leffler 					   struct wpa_scan_result *results,
51039beb93cSSam Leffler 					   size_t max_size)
51139beb93cSSam Leffler {
51239beb93cSSam Leffler 	if (wpa_s->driver->get_scan_results) {
51339beb93cSSam Leffler 		return wpa_s->driver->get_scan_results(wpa_s->drv_priv,
51439beb93cSSam Leffler 						       results, max_size);
51539beb93cSSam Leffler 	}
51639beb93cSSam Leffler 	return -1;
51739beb93cSSam Leffler }
51839beb93cSSam Leffler 
51939beb93cSSam Leffler static inline struct wpa_scan_results * wpa_drv_get_scan_results2(
52039beb93cSSam Leffler 	struct wpa_supplicant *wpa_s)
52139beb93cSSam Leffler {
52239beb93cSSam Leffler 	if (wpa_s->driver->get_scan_results2)
52339beb93cSSam Leffler 		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
52439beb93cSSam Leffler 	return NULL;
52539beb93cSSam Leffler }
52639beb93cSSam Leffler 
52739beb93cSSam Leffler static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
52839beb93cSSam Leffler {
52939beb93cSSam Leffler 	if (wpa_s->driver->get_bssid) {
53039beb93cSSam Leffler 		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
53139beb93cSSam Leffler 	}
53239beb93cSSam Leffler 	return -1;
53339beb93cSSam Leffler }
53439beb93cSSam Leffler 
53539beb93cSSam Leffler static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
53639beb93cSSam Leffler {
53739beb93cSSam Leffler 	if (wpa_s->driver->get_ssid) {
53839beb93cSSam Leffler 		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
53939beb93cSSam Leffler 	}
54039beb93cSSam Leffler 	return -1;
54139beb93cSSam Leffler }
54239beb93cSSam Leffler 
54339beb93cSSam Leffler static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s, wpa_alg alg,
54439beb93cSSam Leffler 				   const u8 *addr, int key_idx, int set_tx,
54539beb93cSSam Leffler 				   const u8 *seq, size_t seq_len,
54639beb93cSSam Leffler 				   const u8 *key, size_t key_len)
54739beb93cSSam Leffler {
54839beb93cSSam Leffler 	if (wpa_s->driver->set_key) {
54939beb93cSSam Leffler 		wpa_s->keys_cleared = 0;
55039beb93cSSam Leffler 		return wpa_s->driver->set_key(wpa_s->drv_priv, alg, addr,
55139beb93cSSam Leffler 					      key_idx, set_tx, seq, seq_len,
55239beb93cSSam Leffler 					      key, key_len);
55339beb93cSSam Leffler 	}
55439beb93cSSam Leffler 	return -1;
55539beb93cSSam Leffler }
55639beb93cSSam Leffler 
55739beb93cSSam Leffler static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
55839beb93cSSam Leffler 					 const u8 *addr, int reason_code)
55939beb93cSSam Leffler {
56039beb93cSSam Leffler 	if (wpa_s->driver->deauthenticate) {
56139beb93cSSam Leffler 		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
56239beb93cSSam Leffler 						     reason_code);
56339beb93cSSam Leffler 	}
56439beb93cSSam Leffler 	return -1;
56539beb93cSSam Leffler }
56639beb93cSSam Leffler 
56739beb93cSSam Leffler static inline int wpa_drv_disassociate(struct wpa_supplicant *wpa_s,
56839beb93cSSam Leffler 				       const u8 *addr, int reason_code)
56939beb93cSSam Leffler {
57039beb93cSSam Leffler 	if (wpa_s->driver->disassociate) {
57139beb93cSSam Leffler 		return wpa_s->driver->disassociate(wpa_s->drv_priv, addr,
57239beb93cSSam Leffler 						   reason_code);
57339beb93cSSam Leffler 	}
57439beb93cSSam Leffler 	return -1;
57539beb93cSSam Leffler }
57639beb93cSSam Leffler 
57739beb93cSSam Leffler static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
57839beb93cSSam Leffler 				    const u8 *bssid, const u8 *pmkid)
57939beb93cSSam Leffler {
58039beb93cSSam Leffler 	if (wpa_s->driver->add_pmkid) {
58139beb93cSSam Leffler 		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
58239beb93cSSam Leffler 	}
58339beb93cSSam Leffler 	return -1;
58439beb93cSSam Leffler }
58539beb93cSSam Leffler 
58639beb93cSSam Leffler static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
58739beb93cSSam Leffler 				       const u8 *bssid, const u8 *pmkid)
58839beb93cSSam Leffler {
58939beb93cSSam Leffler 	if (wpa_s->driver->remove_pmkid) {
59039beb93cSSam Leffler 		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
59139beb93cSSam Leffler 						   pmkid);
59239beb93cSSam Leffler 	}
59339beb93cSSam Leffler 	return -1;
59439beb93cSSam Leffler }
59539beb93cSSam Leffler 
59639beb93cSSam Leffler static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
59739beb93cSSam Leffler {
59839beb93cSSam Leffler 	if (wpa_s->driver->flush_pmkid) {
59939beb93cSSam Leffler 		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
60039beb93cSSam Leffler 	}
60139beb93cSSam Leffler 	return -1;
60239beb93cSSam Leffler }
60339beb93cSSam Leffler 
60439beb93cSSam Leffler static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
60539beb93cSSam Leffler 				   struct wpa_driver_capa *capa)
60639beb93cSSam Leffler {
60739beb93cSSam Leffler 	if (wpa_s->driver->get_capa) {
60839beb93cSSam Leffler 		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
60939beb93cSSam Leffler 	}
61039beb93cSSam Leffler 	return -1;
61139beb93cSSam Leffler }
61239beb93cSSam Leffler 
61339beb93cSSam Leffler static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
61439beb93cSSam Leffler {
61539beb93cSSam Leffler 	if (wpa_s->driver->poll) {
61639beb93cSSam Leffler 		wpa_s->driver->poll(wpa_s->drv_priv);
61739beb93cSSam Leffler 	}
61839beb93cSSam Leffler }
61939beb93cSSam Leffler 
62039beb93cSSam Leffler static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
62139beb93cSSam Leffler {
62239beb93cSSam Leffler 	if (wpa_s->driver->get_ifname) {
62339beb93cSSam Leffler 		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
62439beb93cSSam Leffler 	}
62539beb93cSSam Leffler 	return NULL;
62639beb93cSSam Leffler }
62739beb93cSSam Leffler 
62839beb93cSSam Leffler static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
62939beb93cSSam Leffler {
63039beb93cSSam Leffler 	if (wpa_s->driver->get_mac_addr) {
63139beb93cSSam Leffler 		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
63239beb93cSSam Leffler 	}
63339beb93cSSam Leffler 	return NULL;
63439beb93cSSam Leffler }
63539beb93cSSam Leffler 
63639beb93cSSam Leffler static inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
63739beb93cSSam Leffler 				     const u8 *dst, u16 proto,
63839beb93cSSam Leffler 				     const u8 *data, size_t data_len)
63939beb93cSSam Leffler {
64039beb93cSSam Leffler 	if (wpa_s->driver->send_eapol)
64139beb93cSSam Leffler 		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
64239beb93cSSam Leffler 						 data, data_len);
64339beb93cSSam Leffler 	return -1;
64439beb93cSSam Leffler }
64539beb93cSSam Leffler 
64639beb93cSSam Leffler static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
64739beb93cSSam Leffler 					int state)
64839beb93cSSam Leffler {
64939beb93cSSam Leffler 	if (wpa_s->driver->set_operstate)
65039beb93cSSam Leffler 		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
65139beb93cSSam Leffler 	return 0;
65239beb93cSSam Leffler }
65339beb93cSSam Leffler 
65439beb93cSSam Leffler static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
65539beb93cSSam Leffler 					     const u8 *addr, int protect_type,
65639beb93cSSam Leffler 					     int key_type)
65739beb93cSSam Leffler {
65839beb93cSSam Leffler 	if (wpa_s->driver->mlme_setprotection)
65939beb93cSSam Leffler 		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
66039beb93cSSam Leffler 							 protect_type,
66139beb93cSSam Leffler 							 key_type);
66239beb93cSSam Leffler 	return 0;
66339beb93cSSam Leffler }
66439beb93cSSam Leffler 
66539beb93cSSam Leffler static inline struct wpa_hw_modes *
66639beb93cSSam Leffler wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
66739beb93cSSam Leffler 			    u16 *flags)
66839beb93cSSam Leffler {
66939beb93cSSam Leffler 	if (wpa_s->driver->get_hw_feature_data)
67039beb93cSSam Leffler 		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
67139beb93cSSam Leffler 							  num_modes, flags);
67239beb93cSSam Leffler 	return NULL;
67339beb93cSSam Leffler }
67439beb93cSSam Leffler 
67539beb93cSSam Leffler static inline int wpa_drv_set_channel(struct wpa_supplicant *wpa_s,
67639beb93cSSam Leffler 				      wpa_hw_mode phymode, int chan,
67739beb93cSSam Leffler 				      int freq)
67839beb93cSSam Leffler {
67939beb93cSSam Leffler 	if (wpa_s->driver->set_channel)
68039beb93cSSam Leffler 		return wpa_s->driver->set_channel(wpa_s->drv_priv, phymode,
68139beb93cSSam Leffler 						  chan, freq);
68239beb93cSSam Leffler 	return -1;
68339beb93cSSam Leffler }
68439beb93cSSam Leffler 
68539beb93cSSam Leffler static inline int wpa_drv_set_ssid(struct wpa_supplicant *wpa_s,
68639beb93cSSam Leffler 				   const u8 *ssid, size_t ssid_len)
68739beb93cSSam Leffler {
68839beb93cSSam Leffler 	if (wpa_s->driver->set_ssid) {
68939beb93cSSam Leffler 		return wpa_s->driver->set_ssid(wpa_s->drv_priv, ssid,
69039beb93cSSam Leffler 					       ssid_len);
69139beb93cSSam Leffler 	}
69239beb93cSSam Leffler 	return -1;
69339beb93cSSam Leffler }
69439beb93cSSam Leffler 
69539beb93cSSam Leffler static inline int wpa_drv_set_bssid(struct wpa_supplicant *wpa_s,
69639beb93cSSam Leffler 				    const u8 *bssid)
69739beb93cSSam Leffler {
69839beb93cSSam Leffler 	if (wpa_s->driver->set_bssid) {
69939beb93cSSam Leffler 		return wpa_s->driver->set_bssid(wpa_s->drv_priv, bssid);
70039beb93cSSam Leffler 	}
70139beb93cSSam Leffler 	return -1;
70239beb93cSSam Leffler }
70339beb93cSSam Leffler 
70439beb93cSSam Leffler static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
70539beb93cSSam Leffler 				      const char *alpha2)
70639beb93cSSam Leffler {
70739beb93cSSam Leffler 	if (wpa_s->driver->set_country)
70839beb93cSSam Leffler 		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
70939beb93cSSam Leffler 	return 0;
71039beb93cSSam Leffler }
71139beb93cSSam Leffler 
71239beb93cSSam Leffler static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
71339beb93cSSam Leffler 				    const u8 *data, size_t data_len)
71439beb93cSSam Leffler {
71539beb93cSSam Leffler 	if (wpa_s->driver->send_mlme)
71639beb93cSSam Leffler 		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
71739beb93cSSam Leffler 						data, data_len);
71839beb93cSSam Leffler 	return -1;
71939beb93cSSam Leffler }
72039beb93cSSam Leffler 
72139beb93cSSam Leffler static inline int wpa_drv_mlme_add_sta(struct wpa_supplicant *wpa_s,
72239beb93cSSam Leffler 				       const u8 *addr, const u8 *supp_rates,
72339beb93cSSam Leffler 				       size_t supp_rates_len)
72439beb93cSSam Leffler {
72539beb93cSSam Leffler 	if (wpa_s->driver->mlme_add_sta)
72639beb93cSSam Leffler 		return wpa_s->driver->mlme_add_sta(wpa_s->drv_priv, addr,
72739beb93cSSam Leffler 						   supp_rates, supp_rates_len);
72839beb93cSSam Leffler 	return -1;
72939beb93cSSam Leffler }
73039beb93cSSam Leffler 
73139beb93cSSam Leffler static inline int wpa_drv_mlme_remove_sta(struct wpa_supplicant *wpa_s,
73239beb93cSSam Leffler 					  const u8 *addr)
73339beb93cSSam Leffler {
73439beb93cSSam Leffler 	if (wpa_s->driver->mlme_remove_sta)
73539beb93cSSam Leffler 		return wpa_s->driver->mlme_remove_sta(wpa_s->drv_priv, addr);
73639beb93cSSam Leffler 	return -1;
73739beb93cSSam Leffler }
73839beb93cSSam Leffler 
73939beb93cSSam Leffler static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
74039beb93cSSam Leffler 					const u8 *md,
74139beb93cSSam Leffler 					const u8 *ies, size_t ies_len)
74239beb93cSSam Leffler {
74339beb93cSSam Leffler 	if (wpa_s->driver->update_ft_ies)
74439beb93cSSam Leffler 		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
74539beb93cSSam Leffler 						    ies, ies_len);
74639beb93cSSam Leffler 	return -1;
74739beb93cSSam Leffler }
74839beb93cSSam Leffler 
74939beb93cSSam Leffler static inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
75039beb93cSSam Leffler 					 u8 action, const u8 *target_ap,
75139beb93cSSam Leffler 					 const u8 *ies, size_t ies_len)
75239beb93cSSam Leffler {
75339beb93cSSam Leffler 	if (wpa_s->driver->send_ft_action)
75439beb93cSSam Leffler 		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
75539beb93cSSam Leffler 						     target_ap, ies, ies_len);
75639beb93cSSam Leffler 	return -1;
75739beb93cSSam Leffler }
75839beb93cSSam Leffler 
75939beb93cSSam Leffler static inline int wpa_drv_set_probe_req_ie(struct wpa_supplicant *wpa_s,
76039beb93cSSam Leffler 					   const u8 *ies, size_t ies_len)
76139beb93cSSam Leffler {
76239beb93cSSam Leffler 	if (wpa_s->driver->set_probe_req_ie)
76339beb93cSSam Leffler 		return wpa_s->driver->set_probe_req_ie(wpa_s->drv_priv, ies,
76439beb93cSSam Leffler 						       ies_len);
76539beb93cSSam Leffler 	return -1;
76639beb93cSSam Leffler }
76739beb93cSSam Leffler 
76839beb93cSSam Leffler #endif /* WPA_SUPPLICANT_I_H */
769