wpa_supplicant_i.h revision 209158
1189251Ssam/* 2189251Ssam * wpa_supplicant - Internal definitions 3189251Ssam * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 4189251Ssam * 5189251Ssam * This program is free software; you can redistribute it and/or modify 6189251Ssam * it under the terms of the GNU General Public License version 2 as 7189251Ssam * published by the Free Software Foundation. 8189251Ssam * 9189251Ssam * Alternatively, this software may be distributed under the terms of BSD 10189251Ssam * license. 11189251Ssam * 12189251Ssam * See README and COPYING for more details. 13189251Ssam */ 14189251Ssam 15189251Ssam#ifndef WPA_SUPPLICANT_I_H 16189251Ssam#define WPA_SUPPLICANT_I_H 17189251Ssam 18189251Ssam#include "drivers/driver.h" 19189251Ssam 20189251Ssamextern const char *wpa_supplicant_version; 21189251Ssamextern const char *wpa_supplicant_license; 22189251Ssam#ifndef CONFIG_NO_STDOUT_DEBUG 23189251Ssamextern const char *wpa_supplicant_full_license1; 24189251Ssamextern const char *wpa_supplicant_full_license2; 25189251Ssamextern const char *wpa_supplicant_full_license3; 26189251Ssamextern const char *wpa_supplicant_full_license4; 27189251Ssamextern const char *wpa_supplicant_full_license5; 28189251Ssam#endif /* CONFIG_NO_STDOUT_DEBUG */ 29189251Ssam 30189251Ssamextern struct wpa_driver_ops *wpa_supplicant_drivers[]; 31189251Ssam 32189251Ssam 33189251Ssamstruct wpa_scan_result; 34189251Ssamstruct wpa_sm; 35189251Ssamstruct wpa_supplicant; 36189251Ssam 37189251Ssam/* 38189251Ssam * Forward declarations of private structures used within the ctrl_iface 39189251Ssam * backends. Other parts of wpa_supplicant do not have access to data stored in 40189251Ssam * these structures. 41189251Ssam */ 42189251Ssamstruct ctrl_iface_priv; 43189251Ssamstruct ctrl_iface_global_priv; 44189251Ssamstruct ctrl_iface_dbus_priv; 45189251Ssam 46189251Ssam/** 47189251Ssam * struct wpa_interface - Parameters for wpa_supplicant_add_iface() 48189251Ssam */ 49189251Ssamstruct wpa_interface { 50189251Ssam /** 51189251Ssam * confname - Configuration name (file or profile) name 52189251Ssam * 53189251Ssam * This can also be %NULL when a configuration file is not used. In 54189251Ssam * that case, ctrl_interface must be set to allow the interface to be 55189251Ssam * configured. 56189251Ssam */ 57189251Ssam const char *confname; 58189251Ssam 59189251Ssam /** 60189251Ssam * ctrl_interface - Control interface parameter 61189251Ssam * 62189251Ssam * If a configuration file is not used, this variable can be used to 63189251Ssam * set the ctrl_interface parameter that would have otherwise been read 64189251Ssam * from the configuration file. If both confname and ctrl_interface are 65189251Ssam * set, ctrl_interface is used to override the value from configuration 66189251Ssam * file. 67189251Ssam */ 68189251Ssam const char *ctrl_interface; 69189251Ssam 70189251Ssam /** 71189251Ssam * driver - Driver interface name, or %NULL to use the default driver 72189251Ssam */ 73189251Ssam const char *driver; 74189251Ssam 75189251Ssam /** 76189251Ssam * driver_param - Driver interface parameters 77189251Ssam * 78189251Ssam * If a configuration file is not used, this variable can be used to 79189251Ssam * set the driver_param parameters that would have otherwise been read 80189251Ssam * from the configuration file. If both confname and driver_param are 81189251Ssam * set, driver_param is used to override the value from configuration 82189251Ssam * file. 83189251Ssam */ 84189251Ssam const char *driver_param; 85189251Ssam 86189251Ssam /** 87189251Ssam * ifname - Interface name 88189251Ssam */ 89189251Ssam const char *ifname; 90189251Ssam 91189251Ssam /** 92189251Ssam * bridge_ifname - Optional bridge interface name 93189251Ssam * 94189251Ssam * If the driver interface (ifname) is included in a Linux bridge 95189251Ssam * device, the bridge interface may need to be used for receiving EAPOL 96189251Ssam * frames. This can be enabled by setting this variable to enable 97189251Ssam * receiving of EAPOL frames from an additional interface. 98189251Ssam */ 99189251Ssam const char *bridge_ifname; 100189251Ssam}; 101189251Ssam 102189251Ssam/** 103189251Ssam * struct wpa_params - Parameters for wpa_supplicant_init() 104189251Ssam */ 105189251Ssamstruct wpa_params { 106189251Ssam /** 107189251Ssam * daemonize - Run %wpa_supplicant in the background 108189251Ssam */ 109189251Ssam int daemonize; 110189251Ssam 111189251Ssam /** 112189251Ssam * wait_for_monitor - Wait for a monitor program before starting 113189251Ssam */ 114189251Ssam int wait_for_monitor; 115189251Ssam 116189251Ssam /** 117189251Ssam * pid_file - Path to a PID (process ID) file 118189251Ssam * 119189251Ssam * If this and daemonize are set, process ID of the background process 120189251Ssam * will be written to the specified file. 121189251Ssam */ 122189251Ssam char *pid_file; 123189251Ssam 124189251Ssam /** 125189251Ssam * wpa_debug_level - Debugging verbosity level (e.g., MSG_INFO) 126189251Ssam */ 127189251Ssam int wpa_debug_level; 128189251Ssam 129189251Ssam /** 130189251Ssam * wpa_debug_show_keys - Whether keying material is included in debug 131189251Ssam * 132189251Ssam * This parameter can be used to allow keying material to be included 133189251Ssam * in debug messages. This is a security risk and this option should 134189251Ssam * not be enabled in normal configuration. If needed during 135189251Ssam * development or while troubleshooting, this option can provide more 136189251Ssam * details for figuring out what is happening. 137189251Ssam */ 138189251Ssam int wpa_debug_show_keys; 139189251Ssam 140189251Ssam /** 141189251Ssam * wpa_debug_timestamp - Whether to include timestamp in debug messages 142189251Ssam */ 143189251Ssam int wpa_debug_timestamp; 144189251Ssam 145189251Ssam /** 146189251Ssam * ctrl_interface - Global ctrl_iface path/parameter 147189251Ssam */ 148189251Ssam char *ctrl_interface; 149189251Ssam 150189251Ssam /** 151189251Ssam * dbus_ctrl_interface - Enable the DBus control interface 152189251Ssam */ 153189251Ssam int dbus_ctrl_interface; 154189251Ssam 155189251Ssam /** 156189251Ssam * wpa_debug_file_path - Path of debug file or %NULL to use stdout 157189251Ssam */ 158189251Ssam const char *wpa_debug_file_path; 159189262Ssam 160189262Ssam /** 161189262Ssam * wpa_debug_syslog - Enable log output through syslog 162189262Ssam */ 163189262Ssam const char *wpa_debug_syslog; 164189251Ssam}; 165189251Ssam 166189251Ssam/** 167189251Ssam * struct wpa_global - Internal, global data for all %wpa_supplicant interfaces 168189251Ssam * 169189251Ssam * This structure is initialized by calling wpa_supplicant_init() when starting 170189251Ssam * %wpa_supplicant. 171189251Ssam */ 172189251Ssamstruct wpa_global { 173189251Ssam struct wpa_supplicant *ifaces; 174189251Ssam struct wpa_params params; 175189251Ssam struct ctrl_iface_global_priv *ctrl_iface; 176189251Ssam struct ctrl_iface_dbus_priv *dbus_ctrl_iface; 177189251Ssam void **drv_priv; 178189251Ssam size_t drv_count; 179189251Ssam}; 180189251Ssam 181189251Ssam 182189251Ssamstruct wpa_client_mlme { 183189251Ssam#ifdef CONFIG_CLIENT_MLME 184189251Ssam enum { 185189251Ssam IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, 186189251Ssam IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED, 187189251Ssam IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED 188189251Ssam } state; 189189251Ssam u8 prev_bssid[ETH_ALEN]; 190189251Ssam u8 ssid[32]; 191189251Ssam size_t ssid_len; 192189251Ssam u16 aid; 193189251Ssam u16 ap_capab, capab; 194189251Ssam u8 *extra_ie; /* to be added to the end of AssocReq */ 195189251Ssam size_t extra_ie_len; 196189251Ssam u8 *extra_probe_ie; /* to be added to the end of ProbeReq */ 197189251Ssam size_t extra_probe_ie_len; 198189251Ssam wpa_key_mgmt key_mgmt; 199189251Ssam 200189251Ssam /* The last AssocReq/Resp IEs */ 201189251Ssam u8 *assocreq_ies, *assocresp_ies; 202189251Ssam size_t assocreq_ies_len, assocresp_ies_len; 203189251Ssam 204189251Ssam int auth_tries, assoc_tries; 205189251Ssam 206189251Ssam unsigned int ssid_set:1; 207189251Ssam unsigned int bssid_set:1; 208189251Ssam unsigned int prev_bssid_set:1; 209189251Ssam unsigned int authenticated:1; 210189251Ssam unsigned int associated:1; 211189251Ssam unsigned int probereq_poll:1; 212189251Ssam unsigned int use_protection:1; 213189251Ssam unsigned int create_ibss:1; 214189251Ssam unsigned int mixed_cell:1; 215189251Ssam unsigned int wmm_enabled:1; 216189251Ssam 217189251Ssam struct os_time last_probe; 218189251Ssam 219189251Ssam#define IEEE80211_AUTH_ALG_OPEN BIT(0) 220189251Ssam#define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1) 221189251Ssam#define IEEE80211_AUTH_ALG_LEAP BIT(2) 222189251Ssam unsigned int auth_algs; /* bitfield of allowed auth algs */ 223189251Ssam int auth_alg; /* currently used IEEE 802.11 authentication algorithm */ 224189251Ssam int auth_transaction; 225189251Ssam 226189251Ssam struct os_time ibss_join_req; 227189251Ssam u8 *probe_resp; /* ProbeResp template for IBSS */ 228189251Ssam size_t probe_resp_len; 229189251Ssam u32 supp_rates_bits; 230189251Ssam 231189251Ssam int wmm_last_param_set; 232189251Ssam 233189251Ssam int sta_scanning; 234189251Ssam int scan_hw_mode_idx; 235189251Ssam int scan_channel_idx; 236189251Ssam enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state; 237189251Ssam struct os_time last_scan_completed; 238189251Ssam int scan_oper_channel; 239189251Ssam int scan_oper_freq; 240189251Ssam int scan_oper_phymode; 241189251Ssam u8 scan_ssid[32]; 242189251Ssam size_t scan_ssid_len; 243189251Ssam int scan_skip_11b; 244189251Ssam 245189251Ssam struct ieee80211_sta_bss *sta_bss_list; 246189251Ssam#define STA_HASH_SIZE 256 247189251Ssam#define STA_HASH(sta) (sta[5]) 248189251Ssam struct ieee80211_sta_bss *sta_bss_hash[STA_HASH_SIZE]; 249189251Ssam 250189251Ssam int cts_protect_erp_frames; 251189251Ssam 252189251Ssam int phymode; /* current mode; WPA_MODE_IEEE80211A, .. */ 253189251Ssam struct wpa_hw_modes *modes; 254189251Ssam size_t num_modes; 255189251Ssam unsigned int hw_modes; /* bitfield of allowed hardware modes; 256189251Ssam * (1 << MODE_*) */ 257189251Ssam int num_curr_rates; 258189251Ssam struct wpa_rate_data *curr_rates; 259189251Ssam int freq; /* The current frequency in MHz */ 260189251Ssam int channel; /* The current IEEE 802.11 channel number */ 261189251Ssam 262189251Ssam#ifdef CONFIG_IEEE80211R 263189251Ssam u8 current_md[6]; 264189251Ssam u8 *ft_ies; 265189251Ssam size_t ft_ies_len; 266189251Ssam#endif /* CONFIG_IEEE80211R */ 267189251Ssam 268189251Ssam#else /* CONFIG_CLIENT_MLME */ 269189251Ssam int dummy; /* to keep MSVC happy */ 270189251Ssam#endif /* CONFIG_CLIENT_MLME */ 271189251Ssam}; 272189251Ssam 273189251Ssam/** 274189251Ssam * struct wpa_supplicant - Internal data for wpa_supplicant interface 275189251Ssam * 276189251Ssam * This structure contains the internal data for core wpa_supplicant code. This 277189251Ssam * should be only used directly from the core code. However, a pointer to this 278189251Ssam * data is used from other files as an arbitrary context pointer in calls to 279189251Ssam * core functions. 280189251Ssam */ 281189251Ssamstruct wpa_supplicant { 282189251Ssam struct wpa_global *global; 283189251Ssam struct wpa_supplicant *next; 284189251Ssam struct l2_packet_data *l2; 285189251Ssam struct l2_packet_data *l2_br; 286189251Ssam unsigned char own_addr[ETH_ALEN]; 287189251Ssam char ifname[100]; 288189251Ssam#ifdef CONFIG_CTRL_IFACE_DBUS 289189251Ssam char *dbus_path; 290189251Ssam#endif /* CONFIG_CTRL_IFACE_DBUS */ 291189251Ssam char bridge_ifname[16]; 292189251Ssam 293189251Ssam char *confname; 294189251Ssam struct wpa_config *conf; 295189251Ssam int countermeasures; 296189251Ssam os_time_t last_michael_mic_error; 297189251Ssam u8 bssid[ETH_ALEN]; 298189251Ssam u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this 299189251Ssam * field contains the targer BSSID. */ 300189251Ssam int reassociate; /* reassociation requested */ 301189251Ssam int disconnected; /* all connections disabled; i.e., do no reassociate 302189251Ssam * before this has been cleared */ 303189251Ssam struct wpa_ssid *current_ssid; 304189251Ssam int ap_ies_from_associnfo; 305189251Ssam 306189251Ssam /* Selected configuration (based on Beacon/ProbeResp WPA IE) */ 307189251Ssam int pairwise_cipher; 308189251Ssam int group_cipher; 309189251Ssam int key_mgmt; 310189251Ssam int mgmt_group_cipher; 311189251Ssam 312189251Ssam void *drv_priv; /* private data used by driver_ops */ 313209158Srpaulo void *global_drv_priv; 314189251Ssam 315189251Ssam struct wpa_ssid *prev_scan_ssid; /* previously scanned SSID; 316189251Ssam * NULL = not yet initialized (start 317189251Ssam * with broadcast SSID) 318189251Ssam * BROADCAST_SSID_SCAN = broadcast 319189251Ssam * SSID was used in the previous scan 320189251Ssam */ 321189251Ssam#define BROADCAST_SSID_SCAN ((struct wpa_ssid *) 1) 322189251Ssam 323189251Ssam struct wpa_scan_results *scan_res; 324189251Ssam 325189251Ssam struct wpa_driver_ops *driver; 326189251Ssam int interface_removed; /* whether the network interface has been 327189251Ssam * removed */ 328189251Ssam struct wpa_sm *wpa; 329189251Ssam struct eapol_sm *eapol; 330189251Ssam 331189251Ssam struct ctrl_iface_priv *ctrl_iface; 332189251Ssam 333189251Ssam wpa_states wpa_state; 334209158Srpaulo int scanning; 335189251Ssam int new_connection; 336189251Ssam int reassociated_connection; 337189251Ssam 338189251Ssam int eapol_received; /* number of EAPOL packets received after the 339189251Ssam * previous association event */ 340189251Ssam 341189251Ssam struct scard_data *scard; 342189251Ssam 343189251Ssam unsigned char last_eapol_src[ETH_ALEN]; 344189251Ssam 345189251Ssam int keys_cleared; 346189251Ssam 347189251Ssam struct wpa_blacklist *blacklist; 348189251Ssam 349189251Ssam int scan_req; /* manual scan request; this forces a scan even if there 350189251Ssam * are no enabled networks in the configuration */ 351189251Ssam int scan_res_tried; /* whether ap_scan=1 mode has tried to fetch scan 352189251Ssam * results without a new scan request; this is used 353189251Ssam * to speed up the first association if the driver 354189251Ssam * has already available scan results. */ 355189251Ssam int scan_runs; /* number of scan runs since WPS was started */ 356189251Ssam 357189251Ssam struct wpa_client_mlme mlme; 358189251Ssam int use_client_mlme; 359189251Ssam int driver_4way_handshake; 360189251Ssam 361189251Ssam int pending_mic_error_report; 362189251Ssam int pending_mic_error_pairwise; 363189251Ssam int mic_errors_seen; /* Michael MIC errors with the current PTK */ 364189251Ssam 365189251Ssam struct wps_context *wps; 366189251Ssam int wps_success; /* WPS success event received */ 367189251Ssam int blacklist_cleared; 368209158Srpaulo 369209158Srpaulo struct wpabuf *pending_eapol_rx; 370209158Srpaulo struct os_time pending_eapol_rx_time; 371209158Srpaulo u8 pending_eapol_rx_src[ETH_ALEN]; 372189251Ssam}; 373189251Ssam 374189251Ssam 375189251Ssam/* wpa_supplicant.c */ 376189251Ssamint wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s); 377189251Ssam 378189251Ssamconst char * wpa_supplicant_state_txt(int state); 379189251Ssamint wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s); 380189251Ssamint wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s, 381189251Ssam struct wpa_scan_res *bss, 382189251Ssam struct wpa_ssid *ssid, 383189251Ssam u8 *wpa_ie, size_t *wpa_ie_len); 384189251Ssamvoid wpa_supplicant_associate(struct wpa_supplicant *wpa_s, 385189251Ssam struct wpa_scan_res *bss, 386189251Ssam struct wpa_ssid *ssid); 387189251Ssamvoid wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s, 388189251Ssam struct wpa_ssid *ssid); 389189251Ssamvoid wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s); 390189251Ssamint wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s); 391189251Ssamvoid wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr); 392189251Ssamvoid wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, 393189251Ssam int sec, int usec); 394189251Ssamvoid wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state); 395189251Ssamstruct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s); 396189251Ssamvoid wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s); 397189251Ssamvoid wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, 398189251Ssam int reason_code); 399189251Ssamvoid wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s, 400189251Ssam int reason_code); 401189251Ssam 402189251Ssamvoid wpa_show_license(void); 403189251Ssam 404189251Ssamstruct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, 405189251Ssam struct wpa_interface *iface); 406189251Ssamint wpa_supplicant_remove_iface(struct wpa_global *global, 407189251Ssam struct wpa_supplicant *wpa_s); 408189251Ssamstruct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global, 409189251Ssam const char *ifname); 410189251Ssamstruct wpa_global * wpa_supplicant_init(struct wpa_params *params); 411189251Ssamint wpa_supplicant_run(struct wpa_global *global); 412189251Ssamvoid wpa_supplicant_deinit(struct wpa_global *global); 413189251Ssam 414189251Ssamint wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s, 415189251Ssam struct wpa_ssid *ssid); 416189251Ssam 417189251Ssam/* scan.c */ 418209158Srpauloint wpa_supplicant_enabled_networks(struct wpa_config *conf); 419189251Ssamvoid wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec); 420189251Ssamvoid wpa_supplicant_cancel_scan(struct wpa_supplicant *wpa_s); 421209158Srpaulovoid wpa_supplicant_notify_scanning(struct wpa_supplicant *wpa_s, 422209158Srpaulo int scanning); 423189251Ssam 424189251Ssam/* events.c */ 425189251Ssamvoid wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s); 426189251Ssam 427189251Ssam/* driver_ops */ 428189251Ssamstatic inline void * wpa_drv_init(struct wpa_supplicant *wpa_s, 429189251Ssam const char *ifname) 430189251Ssam{ 431189251Ssam if (wpa_s->driver->init2) 432209158Srpaulo return wpa_s->driver->init2(wpa_s, ifname, 433209158Srpaulo wpa_s->global_drv_priv); 434189251Ssam if (wpa_s->driver->init) { 435189251Ssam return wpa_s->driver->init(wpa_s, ifname); 436189251Ssam } 437189251Ssam return NULL; 438189251Ssam} 439189251Ssam 440189251Ssamstatic inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s) 441189251Ssam{ 442189251Ssam if (wpa_s->driver->deinit) 443189251Ssam wpa_s->driver->deinit(wpa_s->drv_priv); 444189251Ssam} 445189251Ssam 446189251Ssamstatic inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s, 447189251Ssam const char *param) 448189251Ssam{ 449189251Ssam if (wpa_s->driver->set_param) 450189251Ssam return wpa_s->driver->set_param(wpa_s->drv_priv, param); 451189251Ssam return 0; 452189251Ssam} 453189251Ssam 454189251Ssamstatic inline int wpa_drv_set_drop_unencrypted(struct wpa_supplicant *wpa_s, 455189251Ssam int enabled) 456189251Ssam{ 457189251Ssam if (wpa_s->driver->set_drop_unencrypted) { 458189251Ssam return wpa_s->driver->set_drop_unencrypted(wpa_s->drv_priv, 459189251Ssam enabled); 460189251Ssam } 461189251Ssam return -1; 462189251Ssam} 463189251Ssam 464189251Ssamstatic inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s, 465189251Ssam int enabled) 466189251Ssam{ 467189251Ssam if (wpa_s->driver->set_countermeasures) { 468189251Ssam return wpa_s->driver->set_countermeasures(wpa_s->drv_priv, 469189251Ssam enabled); 470189251Ssam } 471189251Ssam return -1; 472189251Ssam} 473189251Ssam 474189251Ssamstatic inline int wpa_drv_set_auth_alg(struct wpa_supplicant *wpa_s, 475189251Ssam int auth_alg) 476189251Ssam{ 477189251Ssam if (wpa_s->driver->set_auth_alg) { 478189251Ssam return wpa_s->driver->set_auth_alg(wpa_s->drv_priv, 479189251Ssam auth_alg); 480189251Ssam } 481189251Ssam return -1; 482189251Ssam} 483189251Ssam 484189251Ssamstatic inline int wpa_drv_set_wpa(struct wpa_supplicant *wpa_s, int enabled) 485189251Ssam{ 486189251Ssam if (wpa_s->driver->set_wpa) { 487189251Ssam return wpa_s->driver->set_wpa(wpa_s->drv_priv, enabled); 488189251Ssam } 489189251Ssam return 0; 490189251Ssam} 491189251Ssam 492189251Ssamstatic inline int wpa_drv_set_mode(struct wpa_supplicant *wpa_s, int mode) 493189251Ssam{ 494189251Ssam if (wpa_s->driver->set_mode) { 495189251Ssam return wpa_s->driver->set_mode(wpa_s->drv_priv, mode); 496189251Ssam } 497189251Ssam return 0; 498189251Ssam} 499189251Ssam 500189251Ssamstatic inline int wpa_drv_associate(struct wpa_supplicant *wpa_s, 501189251Ssam struct wpa_driver_associate_params *params) 502189251Ssam{ 503189251Ssam if (wpa_s->driver->associate) { 504189251Ssam return wpa_s->driver->associate(wpa_s->drv_priv, params); 505189251Ssam } 506189251Ssam return -1; 507189251Ssam} 508189251Ssam 509189251Ssamstatic inline int wpa_drv_scan(struct wpa_supplicant *wpa_s, const u8 *ssid, 510189251Ssam size_t ssid_len) 511189251Ssam{ 512189251Ssam if (wpa_s->driver->scan) { 513189251Ssam return wpa_s->driver->scan(wpa_s->drv_priv, ssid, ssid_len); 514189251Ssam } 515189251Ssam return -1; 516189251Ssam} 517189251Ssam 518189251Ssamstatic inline int wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s, 519189251Ssam struct wpa_scan_result *results, 520189251Ssam size_t max_size) 521189251Ssam{ 522189251Ssam if (wpa_s->driver->get_scan_results) { 523189251Ssam return wpa_s->driver->get_scan_results(wpa_s->drv_priv, 524189251Ssam results, max_size); 525189251Ssam } 526189251Ssam return -1; 527189251Ssam} 528189251Ssam 529189251Ssamstatic inline struct wpa_scan_results * wpa_drv_get_scan_results2( 530189251Ssam struct wpa_supplicant *wpa_s) 531189251Ssam{ 532189251Ssam if (wpa_s->driver->get_scan_results2) 533189251Ssam return wpa_s->driver->get_scan_results2(wpa_s->drv_priv); 534189251Ssam return NULL; 535189251Ssam} 536189251Ssam 537189251Ssamstatic inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid) 538189251Ssam{ 539189251Ssam if (wpa_s->driver->get_bssid) { 540189251Ssam return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid); 541189251Ssam } 542189251Ssam return -1; 543189251Ssam} 544189251Ssam 545189251Ssamstatic inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid) 546189251Ssam{ 547189251Ssam if (wpa_s->driver->get_ssid) { 548189251Ssam return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid); 549189251Ssam } 550189251Ssam return -1; 551189251Ssam} 552189251Ssam 553189251Ssamstatic inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s, wpa_alg alg, 554189251Ssam const u8 *addr, int key_idx, int set_tx, 555189251Ssam const u8 *seq, size_t seq_len, 556189251Ssam const u8 *key, size_t key_len) 557189251Ssam{ 558189251Ssam if (wpa_s->driver->set_key) { 559189251Ssam wpa_s->keys_cleared = 0; 560189251Ssam return wpa_s->driver->set_key(wpa_s->drv_priv, alg, addr, 561189251Ssam key_idx, set_tx, seq, seq_len, 562189251Ssam key, key_len); 563189251Ssam } 564189251Ssam return -1; 565189251Ssam} 566189251Ssam 567189251Ssamstatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s, 568189251Ssam const u8 *addr, int reason_code) 569189251Ssam{ 570189251Ssam if (wpa_s->driver->deauthenticate) { 571189251Ssam return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr, 572189251Ssam reason_code); 573189251Ssam } 574189251Ssam return -1; 575189251Ssam} 576189251Ssam 577189251Ssamstatic inline int wpa_drv_disassociate(struct wpa_supplicant *wpa_s, 578189251Ssam const u8 *addr, int reason_code) 579189251Ssam{ 580189251Ssam if (wpa_s->driver->disassociate) { 581189251Ssam return wpa_s->driver->disassociate(wpa_s->drv_priv, addr, 582189251Ssam reason_code); 583189251Ssam } 584189251Ssam return -1; 585189251Ssam} 586189251Ssam 587189251Ssamstatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s, 588189251Ssam const u8 *bssid, const u8 *pmkid) 589189251Ssam{ 590189251Ssam if (wpa_s->driver->add_pmkid) { 591189251Ssam return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid); 592189251Ssam } 593189251Ssam return -1; 594189251Ssam} 595189251Ssam 596189251Ssamstatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s, 597189251Ssam const u8 *bssid, const u8 *pmkid) 598189251Ssam{ 599189251Ssam if (wpa_s->driver->remove_pmkid) { 600189251Ssam return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid, 601189251Ssam pmkid); 602189251Ssam } 603189251Ssam return -1; 604189251Ssam} 605189251Ssam 606189251Ssamstatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s) 607189251Ssam{ 608189251Ssam if (wpa_s->driver->flush_pmkid) { 609189251Ssam return wpa_s->driver->flush_pmkid(wpa_s->drv_priv); 610189251Ssam } 611189251Ssam return -1; 612189251Ssam} 613189251Ssam 614189251Ssamstatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s, 615189251Ssam struct wpa_driver_capa *capa) 616189251Ssam{ 617189251Ssam if (wpa_s->driver->get_capa) { 618189251Ssam return wpa_s->driver->get_capa(wpa_s->drv_priv, capa); 619189251Ssam } 620189251Ssam return -1; 621189251Ssam} 622189251Ssam 623189251Ssamstatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s) 624189251Ssam{ 625189251Ssam if (wpa_s->driver->poll) { 626189251Ssam wpa_s->driver->poll(wpa_s->drv_priv); 627189251Ssam } 628189251Ssam} 629189251Ssam 630189251Ssamstatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s) 631189251Ssam{ 632189251Ssam if (wpa_s->driver->get_ifname) { 633189251Ssam return wpa_s->driver->get_ifname(wpa_s->drv_priv); 634189251Ssam } 635189251Ssam return NULL; 636189251Ssam} 637189251Ssam 638189251Ssamstatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s) 639189251Ssam{ 640189251Ssam if (wpa_s->driver->get_mac_addr) { 641189251Ssam return wpa_s->driver->get_mac_addr(wpa_s->drv_priv); 642189251Ssam } 643189251Ssam return NULL; 644189251Ssam} 645189251Ssam 646189251Ssamstatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s, 647189251Ssam const u8 *dst, u16 proto, 648189251Ssam const u8 *data, size_t data_len) 649189251Ssam{ 650189251Ssam if (wpa_s->driver->send_eapol) 651189251Ssam return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto, 652189251Ssam data, data_len); 653189251Ssam return -1; 654189251Ssam} 655189251Ssam 656189251Ssamstatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s, 657189251Ssam int state) 658189251Ssam{ 659189251Ssam if (wpa_s->driver->set_operstate) 660189251Ssam return wpa_s->driver->set_operstate(wpa_s->drv_priv, state); 661189251Ssam return 0; 662189251Ssam} 663189251Ssam 664189251Ssamstatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s, 665189251Ssam const u8 *addr, int protect_type, 666189251Ssam int key_type) 667189251Ssam{ 668189251Ssam if (wpa_s->driver->mlme_setprotection) 669189251Ssam return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr, 670189251Ssam protect_type, 671189251Ssam key_type); 672189251Ssam return 0; 673189251Ssam} 674189251Ssam 675189251Ssamstatic inline struct wpa_hw_modes * 676189251Ssamwpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes, 677189251Ssam u16 *flags) 678189251Ssam{ 679189251Ssam if (wpa_s->driver->get_hw_feature_data) 680189251Ssam return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv, 681189251Ssam num_modes, flags); 682189251Ssam return NULL; 683189251Ssam} 684189251Ssam 685189251Ssamstatic inline int wpa_drv_set_channel(struct wpa_supplicant *wpa_s, 686189251Ssam wpa_hw_mode phymode, int chan, 687189251Ssam int freq) 688189251Ssam{ 689189251Ssam if (wpa_s->driver->set_channel) 690189251Ssam return wpa_s->driver->set_channel(wpa_s->drv_priv, phymode, 691189251Ssam chan, freq); 692189251Ssam return -1; 693189251Ssam} 694189251Ssam 695189251Ssamstatic inline int wpa_drv_set_ssid(struct wpa_supplicant *wpa_s, 696189251Ssam const u8 *ssid, size_t ssid_len) 697189251Ssam{ 698189251Ssam if (wpa_s->driver->set_ssid) { 699189251Ssam return wpa_s->driver->set_ssid(wpa_s->drv_priv, ssid, 700189251Ssam ssid_len); 701189251Ssam } 702189251Ssam return -1; 703189251Ssam} 704189251Ssam 705189251Ssamstatic inline int wpa_drv_set_bssid(struct wpa_supplicant *wpa_s, 706189251Ssam const u8 *bssid) 707189251Ssam{ 708189251Ssam if (wpa_s->driver->set_bssid) { 709189251Ssam return wpa_s->driver->set_bssid(wpa_s->drv_priv, bssid); 710189251Ssam } 711189251Ssam return -1; 712189251Ssam} 713189251Ssam 714189251Ssamstatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s, 715189251Ssam const char *alpha2) 716189251Ssam{ 717189251Ssam if (wpa_s->driver->set_country) 718189251Ssam return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2); 719189251Ssam return 0; 720189251Ssam} 721189251Ssam 722189251Ssamstatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s, 723189251Ssam const u8 *data, size_t data_len) 724189251Ssam{ 725189251Ssam if (wpa_s->driver->send_mlme) 726189251Ssam return wpa_s->driver->send_mlme(wpa_s->drv_priv, 727189251Ssam data, data_len); 728189251Ssam return -1; 729189251Ssam} 730189251Ssam 731189251Ssamstatic inline int wpa_drv_mlme_add_sta(struct wpa_supplicant *wpa_s, 732189251Ssam const u8 *addr, const u8 *supp_rates, 733189251Ssam size_t supp_rates_len) 734189251Ssam{ 735189251Ssam if (wpa_s->driver->mlme_add_sta) 736189251Ssam return wpa_s->driver->mlme_add_sta(wpa_s->drv_priv, addr, 737189251Ssam supp_rates, supp_rates_len); 738189251Ssam return -1; 739189251Ssam} 740189251Ssam 741189251Ssamstatic inline int wpa_drv_mlme_remove_sta(struct wpa_supplicant *wpa_s, 742189251Ssam const u8 *addr) 743189251Ssam{ 744189251Ssam if (wpa_s->driver->mlme_remove_sta) 745189251Ssam return wpa_s->driver->mlme_remove_sta(wpa_s->drv_priv, addr); 746189251Ssam return -1; 747189251Ssam} 748189251Ssam 749189251Ssamstatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s, 750189251Ssam const u8 *md, 751189251Ssam const u8 *ies, size_t ies_len) 752189251Ssam{ 753189251Ssam if (wpa_s->driver->update_ft_ies) 754189251Ssam return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md, 755189251Ssam ies, ies_len); 756189251Ssam return -1; 757189251Ssam} 758189251Ssam 759189251Ssamstatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s, 760189251Ssam u8 action, const u8 *target_ap, 761189251Ssam const u8 *ies, size_t ies_len) 762189251Ssam{ 763189251Ssam if (wpa_s->driver->send_ft_action) 764189251Ssam return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action, 765189251Ssam target_ap, ies, ies_len); 766189251Ssam return -1; 767189251Ssam} 768189251Ssam 769189251Ssamstatic inline int wpa_drv_set_probe_req_ie(struct wpa_supplicant *wpa_s, 770189251Ssam const u8 *ies, size_t ies_len) 771189251Ssam{ 772189251Ssam if (wpa_s->driver->set_probe_req_ie) 773189251Ssam return wpa_s->driver->set_probe_req_ie(wpa_s->drv_priv, ies, 774189251Ssam ies_len); 775189251Ssam return -1; 776189251Ssam} 777189251Ssam 778189251Ssam#endif /* WPA_SUPPLICANT_I_H */ 779