wpa_supplicant_i.h revision 209158
1/* 2 * wpa_supplicant - Internal definitions 3 * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15#ifndef WPA_SUPPLICANT_I_H 16#define WPA_SUPPLICANT_I_H 17 18#include "drivers/driver.h" 19 20extern const char *wpa_supplicant_version; 21extern const char *wpa_supplicant_license; 22#ifndef CONFIG_NO_STDOUT_DEBUG 23extern const char *wpa_supplicant_full_license1; 24extern const char *wpa_supplicant_full_license2; 25extern const char *wpa_supplicant_full_license3; 26extern const char *wpa_supplicant_full_license4; 27extern const char *wpa_supplicant_full_license5; 28#endif /* CONFIG_NO_STDOUT_DEBUG */ 29 30extern struct wpa_driver_ops *wpa_supplicant_drivers[]; 31 32 33struct wpa_scan_result; 34struct wpa_sm; 35struct wpa_supplicant; 36 37/* 38 * Forward declarations of private structures used within the ctrl_iface 39 * backends. Other parts of wpa_supplicant do not have access to data stored in 40 * these structures. 41 */ 42struct ctrl_iface_priv; 43struct ctrl_iface_global_priv; 44struct ctrl_iface_dbus_priv; 45 46/** 47 * struct wpa_interface - Parameters for wpa_supplicant_add_iface() 48 */ 49struct wpa_interface { 50 /** 51 * confname - Configuration name (file or profile) name 52 * 53 * This can also be %NULL when a configuration file is not used. In 54 * that case, ctrl_interface must be set to allow the interface to be 55 * configured. 56 */ 57 const char *confname; 58 59 /** 60 * ctrl_interface - Control interface parameter 61 * 62 * If a configuration file is not used, this variable can be used to 63 * set the ctrl_interface parameter that would have otherwise been read 64 * from the configuration file. If both confname and ctrl_interface are 65 * set, ctrl_interface is used to override the value from configuration 66 * file. 67 */ 68 const char *ctrl_interface; 69 70 /** 71 * driver - Driver interface name, or %NULL to use the default driver 72 */ 73 const char *driver; 74 75 /** 76 * driver_param - Driver interface parameters 77 * 78 * If a configuration file is not used, this variable can be used to 79 * set the driver_param parameters that would have otherwise been read 80 * from the configuration file. If both confname and driver_param are 81 * set, driver_param is used to override the value from configuration 82 * file. 83 */ 84 const char *driver_param; 85 86 /** 87 * ifname - Interface name 88 */ 89 const char *ifname; 90 91 /** 92 * bridge_ifname - Optional bridge interface name 93 * 94 * If the driver interface (ifname) is included in a Linux bridge 95 * device, the bridge interface may need to be used for receiving EAPOL 96 * frames. This can be enabled by setting this variable to enable 97 * receiving of EAPOL frames from an additional interface. 98 */ 99 const char *bridge_ifname; 100}; 101 102/** 103 * struct wpa_params - Parameters for wpa_supplicant_init() 104 */ 105struct wpa_params { 106 /** 107 * daemonize - Run %wpa_supplicant in the background 108 */ 109 int daemonize; 110 111 /** 112 * wait_for_monitor - Wait for a monitor program before starting 113 */ 114 int wait_for_monitor; 115 116 /** 117 * pid_file - Path to a PID (process ID) file 118 * 119 * If this and daemonize are set, process ID of the background process 120 * will be written to the specified file. 121 */ 122 char *pid_file; 123 124 /** 125 * wpa_debug_level - Debugging verbosity level (e.g., MSG_INFO) 126 */ 127 int wpa_debug_level; 128 129 /** 130 * wpa_debug_show_keys - Whether keying material is included in debug 131 * 132 * This parameter can be used to allow keying material to be included 133 * in debug messages. This is a security risk and this option should 134 * not be enabled in normal configuration. If needed during 135 * development or while troubleshooting, this option can provide more 136 * details for figuring out what is happening. 137 */ 138 int wpa_debug_show_keys; 139 140 /** 141 * wpa_debug_timestamp - Whether to include timestamp in debug messages 142 */ 143 int wpa_debug_timestamp; 144 145 /** 146 * ctrl_interface - Global ctrl_iface path/parameter 147 */ 148 char *ctrl_interface; 149 150 /** 151 * dbus_ctrl_interface - Enable the DBus control interface 152 */ 153 int dbus_ctrl_interface; 154 155 /** 156 * wpa_debug_file_path - Path of debug file or %NULL to use stdout 157 */ 158 const char *wpa_debug_file_path; 159 160 /** 161 * wpa_debug_syslog - Enable log output through syslog 162 */ 163 const char *wpa_debug_syslog; 164}; 165 166/** 167 * struct wpa_global - Internal, global data for all %wpa_supplicant interfaces 168 * 169 * This structure is initialized by calling wpa_supplicant_init() when starting 170 * %wpa_supplicant. 171 */ 172struct wpa_global { 173 struct wpa_supplicant *ifaces; 174 struct wpa_params params; 175 struct ctrl_iface_global_priv *ctrl_iface; 176 struct ctrl_iface_dbus_priv *dbus_ctrl_iface; 177 void **drv_priv; 178 size_t drv_count; 179}; 180 181 182struct wpa_client_mlme { 183#ifdef CONFIG_CLIENT_MLME 184 enum { 185 IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, 186 IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED, 187 IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED 188 } state; 189 u8 prev_bssid[ETH_ALEN]; 190 u8 ssid[32]; 191 size_t ssid_len; 192 u16 aid; 193 u16 ap_capab, capab; 194 u8 *extra_ie; /* to be added to the end of AssocReq */ 195 size_t extra_ie_len; 196 u8 *extra_probe_ie; /* to be added to the end of ProbeReq */ 197 size_t extra_probe_ie_len; 198 wpa_key_mgmt key_mgmt; 199 200 /* The last AssocReq/Resp IEs */ 201 u8 *assocreq_ies, *assocresp_ies; 202 size_t assocreq_ies_len, assocresp_ies_len; 203 204 int auth_tries, assoc_tries; 205 206 unsigned int ssid_set:1; 207 unsigned int bssid_set:1; 208 unsigned int prev_bssid_set:1; 209 unsigned int authenticated:1; 210 unsigned int associated:1; 211 unsigned int probereq_poll:1; 212 unsigned int use_protection:1; 213 unsigned int create_ibss:1; 214 unsigned int mixed_cell:1; 215 unsigned int wmm_enabled:1; 216 217 struct os_time last_probe; 218 219#define IEEE80211_AUTH_ALG_OPEN BIT(0) 220#define IEEE80211_AUTH_ALG_SHARED_KEY BIT(1) 221#define IEEE80211_AUTH_ALG_LEAP BIT(2) 222 unsigned int auth_algs; /* bitfield of allowed auth algs */ 223 int auth_alg; /* currently used IEEE 802.11 authentication algorithm */ 224 int auth_transaction; 225 226 struct os_time ibss_join_req; 227 u8 *probe_resp; /* ProbeResp template for IBSS */ 228 size_t probe_resp_len; 229 u32 supp_rates_bits; 230 231 int wmm_last_param_set; 232 233 int sta_scanning; 234 int scan_hw_mode_idx; 235 int scan_channel_idx; 236 enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state; 237 struct os_time last_scan_completed; 238 int scan_oper_channel; 239 int scan_oper_freq; 240 int scan_oper_phymode; 241 u8 scan_ssid[32]; 242 size_t scan_ssid_len; 243 int scan_skip_11b; 244 245 struct ieee80211_sta_bss *sta_bss_list; 246#define STA_HASH_SIZE 256 247#define STA_HASH(sta) (sta[5]) 248 struct ieee80211_sta_bss *sta_bss_hash[STA_HASH_SIZE]; 249 250 int cts_protect_erp_frames; 251 252 int phymode; /* current mode; WPA_MODE_IEEE80211A, .. */ 253 struct wpa_hw_modes *modes; 254 size_t num_modes; 255 unsigned int hw_modes; /* bitfield of allowed hardware modes; 256 * (1 << MODE_*) */ 257 int num_curr_rates; 258 struct wpa_rate_data *curr_rates; 259 int freq; /* The current frequency in MHz */ 260 int channel; /* The current IEEE 802.11 channel number */ 261 262#ifdef CONFIG_IEEE80211R 263 u8 current_md[6]; 264 u8 *ft_ies; 265 size_t ft_ies_len; 266#endif /* CONFIG_IEEE80211R */ 267 268#else /* CONFIG_CLIENT_MLME */ 269 int dummy; /* to keep MSVC happy */ 270#endif /* CONFIG_CLIENT_MLME */ 271}; 272 273/** 274 * struct wpa_supplicant - Internal data for wpa_supplicant interface 275 * 276 * This structure contains the internal data for core wpa_supplicant code. This 277 * should be only used directly from the core code. However, a pointer to this 278 * data is used from other files as an arbitrary context pointer in calls to 279 * core functions. 280 */ 281struct wpa_supplicant { 282 struct wpa_global *global; 283 struct wpa_supplicant *next; 284 struct l2_packet_data *l2; 285 struct l2_packet_data *l2_br; 286 unsigned char own_addr[ETH_ALEN]; 287 char ifname[100]; 288#ifdef CONFIG_CTRL_IFACE_DBUS 289 char *dbus_path; 290#endif /* CONFIG_CTRL_IFACE_DBUS */ 291 char bridge_ifname[16]; 292 293 char *confname; 294 struct wpa_config *conf; 295 int countermeasures; 296 os_time_t last_michael_mic_error; 297 u8 bssid[ETH_ALEN]; 298 u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this 299 * field contains the targer BSSID. */ 300 int reassociate; /* reassociation requested */ 301 int disconnected; /* all connections disabled; i.e., do no reassociate 302 * before this has been cleared */ 303 struct wpa_ssid *current_ssid; 304 int ap_ies_from_associnfo; 305 306 /* Selected configuration (based on Beacon/ProbeResp WPA IE) */ 307 int pairwise_cipher; 308 int group_cipher; 309 int key_mgmt; 310 int mgmt_group_cipher; 311 312 void *drv_priv; /* private data used by driver_ops */ 313 void *global_drv_priv; 314 315 struct wpa_ssid *prev_scan_ssid; /* previously scanned SSID; 316 * NULL = not yet initialized (start 317 * with broadcast SSID) 318 * BROADCAST_SSID_SCAN = broadcast 319 * SSID was used in the previous scan 320 */ 321#define BROADCAST_SSID_SCAN ((struct wpa_ssid *) 1) 322 323 struct wpa_scan_results *scan_res; 324 325 struct wpa_driver_ops *driver; 326 int interface_removed; /* whether the network interface has been 327 * removed */ 328 struct wpa_sm *wpa; 329 struct eapol_sm *eapol; 330 331 struct ctrl_iface_priv *ctrl_iface; 332 333 wpa_states wpa_state; 334 int scanning; 335 int new_connection; 336 int reassociated_connection; 337 338 int eapol_received; /* number of EAPOL packets received after the 339 * previous association event */ 340 341 struct scard_data *scard; 342 343 unsigned char last_eapol_src[ETH_ALEN]; 344 345 int keys_cleared; 346 347 struct wpa_blacklist *blacklist; 348 349 int scan_req; /* manual scan request; this forces a scan even if there 350 * are no enabled networks in the configuration */ 351 int scan_res_tried; /* whether ap_scan=1 mode has tried to fetch scan 352 * results without a new scan request; this is used 353 * to speed up the first association if the driver 354 * has already available scan results. */ 355 int scan_runs; /* number of scan runs since WPS was started */ 356 357 struct wpa_client_mlme mlme; 358 int use_client_mlme; 359 int driver_4way_handshake; 360 361 int pending_mic_error_report; 362 int pending_mic_error_pairwise; 363 int mic_errors_seen; /* Michael MIC errors with the current PTK */ 364 365 struct wps_context *wps; 366 int wps_success; /* WPS success event received */ 367 int blacklist_cleared; 368 369 struct wpabuf *pending_eapol_rx; 370 struct os_time pending_eapol_rx_time; 371 u8 pending_eapol_rx_src[ETH_ALEN]; 372}; 373 374 375/* wpa_supplicant.c */ 376int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s); 377 378const char * wpa_supplicant_state_txt(int state); 379int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s); 380int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s, 381 struct wpa_scan_res *bss, 382 struct wpa_ssid *ssid, 383 u8 *wpa_ie, size_t *wpa_ie_len); 384void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, 385 struct wpa_scan_res *bss, 386 struct wpa_ssid *ssid); 387void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s, 388 struct wpa_ssid *ssid); 389void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s); 390int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s); 391void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr); 392void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, 393 int sec, int usec); 394void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, wpa_states state); 395struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s); 396void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s); 397void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, 398 int reason_code); 399void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s, 400 int reason_code); 401 402void wpa_show_license(void); 403 404struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, 405 struct wpa_interface *iface); 406int wpa_supplicant_remove_iface(struct wpa_global *global, 407 struct wpa_supplicant *wpa_s); 408struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global, 409 const char *ifname); 410struct wpa_global * wpa_supplicant_init(struct wpa_params *params); 411int wpa_supplicant_run(struct wpa_global *global); 412void wpa_supplicant_deinit(struct wpa_global *global); 413 414int wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s, 415 struct wpa_ssid *ssid); 416 417/* scan.c */ 418int wpa_supplicant_enabled_networks(struct wpa_config *conf); 419void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec); 420void wpa_supplicant_cancel_scan(struct wpa_supplicant *wpa_s); 421void wpa_supplicant_notify_scanning(struct wpa_supplicant *wpa_s, 422 int scanning); 423 424/* events.c */ 425void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s); 426 427/* driver_ops */ 428static inline void * wpa_drv_init(struct wpa_supplicant *wpa_s, 429 const char *ifname) 430{ 431 if (wpa_s->driver->init2) 432 return wpa_s->driver->init2(wpa_s, ifname, 433 wpa_s->global_drv_priv); 434 if (wpa_s->driver->init) { 435 return wpa_s->driver->init(wpa_s, ifname); 436 } 437 return NULL; 438} 439 440static inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s) 441{ 442 if (wpa_s->driver->deinit) 443 wpa_s->driver->deinit(wpa_s->drv_priv); 444} 445 446static inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s, 447 const char *param) 448{ 449 if (wpa_s->driver->set_param) 450 return wpa_s->driver->set_param(wpa_s->drv_priv, param); 451 return 0; 452} 453 454static inline int wpa_drv_set_drop_unencrypted(struct wpa_supplicant *wpa_s, 455 int enabled) 456{ 457 if (wpa_s->driver->set_drop_unencrypted) { 458 return wpa_s->driver->set_drop_unencrypted(wpa_s->drv_priv, 459 enabled); 460 } 461 return -1; 462} 463 464static inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s, 465 int enabled) 466{ 467 if (wpa_s->driver->set_countermeasures) { 468 return wpa_s->driver->set_countermeasures(wpa_s->drv_priv, 469 enabled); 470 } 471 return -1; 472} 473 474static inline int wpa_drv_set_auth_alg(struct wpa_supplicant *wpa_s, 475 int auth_alg) 476{ 477 if (wpa_s->driver->set_auth_alg) { 478 return wpa_s->driver->set_auth_alg(wpa_s->drv_priv, 479 auth_alg); 480 } 481 return -1; 482} 483 484static inline int wpa_drv_set_wpa(struct wpa_supplicant *wpa_s, int enabled) 485{ 486 if (wpa_s->driver->set_wpa) { 487 return wpa_s->driver->set_wpa(wpa_s->drv_priv, enabled); 488 } 489 return 0; 490} 491 492static inline int wpa_drv_set_mode(struct wpa_supplicant *wpa_s, int mode) 493{ 494 if (wpa_s->driver->set_mode) { 495 return wpa_s->driver->set_mode(wpa_s->drv_priv, mode); 496 } 497 return 0; 498} 499 500static inline int wpa_drv_associate(struct wpa_supplicant *wpa_s, 501 struct wpa_driver_associate_params *params) 502{ 503 if (wpa_s->driver->associate) { 504 return wpa_s->driver->associate(wpa_s->drv_priv, params); 505 } 506 return -1; 507} 508 509static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s, const u8 *ssid, 510 size_t ssid_len) 511{ 512 if (wpa_s->driver->scan) { 513 return wpa_s->driver->scan(wpa_s->drv_priv, ssid, ssid_len); 514 } 515 return -1; 516} 517 518static inline int wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s, 519 struct wpa_scan_result *results, 520 size_t max_size) 521{ 522 if (wpa_s->driver->get_scan_results) { 523 return wpa_s->driver->get_scan_results(wpa_s->drv_priv, 524 results, max_size); 525 } 526 return -1; 527} 528 529static inline struct wpa_scan_results * wpa_drv_get_scan_results2( 530 struct wpa_supplicant *wpa_s) 531{ 532 if (wpa_s->driver->get_scan_results2) 533 return wpa_s->driver->get_scan_results2(wpa_s->drv_priv); 534 return NULL; 535} 536 537static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid) 538{ 539 if (wpa_s->driver->get_bssid) { 540 return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid); 541 } 542 return -1; 543} 544 545static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid) 546{ 547 if (wpa_s->driver->get_ssid) { 548 return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid); 549 } 550 return -1; 551} 552 553static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s, wpa_alg alg, 554 const u8 *addr, int key_idx, int set_tx, 555 const u8 *seq, size_t seq_len, 556 const u8 *key, size_t key_len) 557{ 558 if (wpa_s->driver->set_key) { 559 wpa_s->keys_cleared = 0; 560 return wpa_s->driver->set_key(wpa_s->drv_priv, alg, addr, 561 key_idx, set_tx, seq, seq_len, 562 key, key_len); 563 } 564 return -1; 565} 566 567static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s, 568 const u8 *addr, int reason_code) 569{ 570 if (wpa_s->driver->deauthenticate) { 571 return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr, 572 reason_code); 573 } 574 return -1; 575} 576 577static inline int wpa_drv_disassociate(struct wpa_supplicant *wpa_s, 578 const u8 *addr, int reason_code) 579{ 580 if (wpa_s->driver->disassociate) { 581 return wpa_s->driver->disassociate(wpa_s->drv_priv, addr, 582 reason_code); 583 } 584 return -1; 585} 586 587static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s, 588 const u8 *bssid, const u8 *pmkid) 589{ 590 if (wpa_s->driver->add_pmkid) { 591 return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid); 592 } 593 return -1; 594} 595 596static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s, 597 const u8 *bssid, const u8 *pmkid) 598{ 599 if (wpa_s->driver->remove_pmkid) { 600 return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid, 601 pmkid); 602 } 603 return -1; 604} 605 606static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s) 607{ 608 if (wpa_s->driver->flush_pmkid) { 609 return wpa_s->driver->flush_pmkid(wpa_s->drv_priv); 610 } 611 return -1; 612} 613 614static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s, 615 struct wpa_driver_capa *capa) 616{ 617 if (wpa_s->driver->get_capa) { 618 return wpa_s->driver->get_capa(wpa_s->drv_priv, capa); 619 } 620 return -1; 621} 622 623static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s) 624{ 625 if (wpa_s->driver->poll) { 626 wpa_s->driver->poll(wpa_s->drv_priv); 627 } 628} 629 630static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s) 631{ 632 if (wpa_s->driver->get_ifname) { 633 return wpa_s->driver->get_ifname(wpa_s->drv_priv); 634 } 635 return NULL; 636} 637 638static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s) 639{ 640 if (wpa_s->driver->get_mac_addr) { 641 return wpa_s->driver->get_mac_addr(wpa_s->drv_priv); 642 } 643 return NULL; 644} 645 646static inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s, 647 const u8 *dst, u16 proto, 648 const u8 *data, size_t data_len) 649{ 650 if (wpa_s->driver->send_eapol) 651 return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto, 652 data, data_len); 653 return -1; 654} 655 656static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s, 657 int state) 658{ 659 if (wpa_s->driver->set_operstate) 660 return wpa_s->driver->set_operstate(wpa_s->drv_priv, state); 661 return 0; 662} 663 664static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s, 665 const u8 *addr, int protect_type, 666 int key_type) 667{ 668 if (wpa_s->driver->mlme_setprotection) 669 return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr, 670 protect_type, 671 key_type); 672 return 0; 673} 674 675static inline struct wpa_hw_modes * 676wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes, 677 u16 *flags) 678{ 679 if (wpa_s->driver->get_hw_feature_data) 680 return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv, 681 num_modes, flags); 682 return NULL; 683} 684 685static inline int wpa_drv_set_channel(struct wpa_supplicant *wpa_s, 686 wpa_hw_mode phymode, int chan, 687 int freq) 688{ 689 if (wpa_s->driver->set_channel) 690 return wpa_s->driver->set_channel(wpa_s->drv_priv, phymode, 691 chan, freq); 692 return -1; 693} 694 695static inline int wpa_drv_set_ssid(struct wpa_supplicant *wpa_s, 696 const u8 *ssid, size_t ssid_len) 697{ 698 if (wpa_s->driver->set_ssid) { 699 return wpa_s->driver->set_ssid(wpa_s->drv_priv, ssid, 700 ssid_len); 701 } 702 return -1; 703} 704 705static inline int wpa_drv_set_bssid(struct wpa_supplicant *wpa_s, 706 const u8 *bssid) 707{ 708 if (wpa_s->driver->set_bssid) { 709 return wpa_s->driver->set_bssid(wpa_s->drv_priv, bssid); 710 } 711 return -1; 712} 713 714static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s, 715 const char *alpha2) 716{ 717 if (wpa_s->driver->set_country) 718 return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2); 719 return 0; 720} 721 722static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s, 723 const u8 *data, size_t data_len) 724{ 725 if (wpa_s->driver->send_mlme) 726 return wpa_s->driver->send_mlme(wpa_s->drv_priv, 727 data, data_len); 728 return -1; 729} 730 731static inline int wpa_drv_mlme_add_sta(struct wpa_supplicant *wpa_s, 732 const u8 *addr, const u8 *supp_rates, 733 size_t supp_rates_len) 734{ 735 if (wpa_s->driver->mlme_add_sta) 736 return wpa_s->driver->mlme_add_sta(wpa_s->drv_priv, addr, 737 supp_rates, supp_rates_len); 738 return -1; 739} 740 741static inline int wpa_drv_mlme_remove_sta(struct wpa_supplicant *wpa_s, 742 const u8 *addr) 743{ 744 if (wpa_s->driver->mlme_remove_sta) 745 return wpa_s->driver->mlme_remove_sta(wpa_s->drv_priv, addr); 746 return -1; 747} 748 749static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s, 750 const u8 *md, 751 const u8 *ies, size_t ies_len) 752{ 753 if (wpa_s->driver->update_ft_ies) 754 return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md, 755 ies, ies_len); 756 return -1; 757} 758 759static inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s, 760 u8 action, const u8 *target_ap, 761 const u8 *ies, size_t ies_len) 762{ 763 if (wpa_s->driver->send_ft_action) 764 return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action, 765 target_ap, ies, ies_len); 766 return -1; 767} 768 769static inline int wpa_drv_set_probe_req_ie(struct wpa_supplicant *wpa_s, 770 const u8 *ies, size_t ies_len) 771{ 772 if (wpa_s->driver->set_probe_req_ie) 773 return wpa_s->driver->set_probe_req_ie(wpa_s->drv_priv, ies, 774 ies_len); 775 return -1; 776} 777 778#endif /* WPA_SUPPLICANT_I_H */ 779