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