$search
00001 /* 00002 * wpa_supplicant - Internal definitions 00003 * Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi> 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License version 2 as 00007 * published by the Free Software Foundation. 00008 * 00009 * Alternatively, this software may be distributed under the terms of BSD 00010 * license. 00011 * 00012 * See README and COPYING for more details. 00013 */ 00014 00015 #ifndef WPA_SUPPLICANT_I_H 00016 #define WPA_SUPPLICANT_I_H 00017 00018 #include "utils/list.h" 00019 #include "common/defs.h" 00020 00021 extern const char *wpa_supplicant_version; 00022 extern const char *wpa_supplicant_license; 00023 #ifndef CONFIG_NO_STDOUT_DEBUG 00024 extern const char *wpa_supplicant_full_license1; 00025 extern const char *wpa_supplicant_full_license2; 00026 extern const char *wpa_supplicant_full_license3; 00027 extern const char *wpa_supplicant_full_license4; 00028 extern const char *wpa_supplicant_full_license5; 00029 #endif /* CONFIG_NO_STDOUT_DEBUG */ 00030 00031 struct wpa_sm; 00032 struct wpa_supplicant; 00033 struct ibss_rsn; 00034 struct scan_info; 00035 struct wpa_bss; 00036 struct wpa_scan_results; 00037 struct ros_interface; 00038 00039 /* 00040 * Forward declarations of private structures used within the ctrl_iface 00041 * backends. Other parts of wpa_supplicant do not have access to data stored in 00042 * these structures. 00043 */ 00044 struct ctrl_iface_priv; 00045 struct ctrl_iface_global_priv; 00046 struct wpas_dbus_priv; 00047 00051 struct wpa_interface { 00059 const char *confname; 00060 00070 const char *ctrl_interface; 00071 00075 const char *driver; 00076 00086 const char *driver_param; 00087 00091 const char *ifname; 00092 00101 const char *bridge_ifname; 00102 }; 00103 00107 struct wpa_params { 00111 int daemonize; 00112 00116 int wait_for_monitor; 00117 00124 char *pid_file; 00125 00129 int wpa_debug_level; 00130 00140 int wpa_debug_show_keys; 00141 00145 int wpa_debug_timestamp; 00146 00150 char *ctrl_interface; 00151 00155 int dbus_ctrl_interface; 00156 00160 const char *wpa_debug_file_path; 00161 00165 int wpa_debug_syslog; 00166 00174 char *override_driver; 00175 00183 char *override_ctrl_interface; 00184 }; 00185 00192 struct wpa_global { 00193 struct wpa_supplicant *ifaces; 00194 struct wpa_params params; 00195 struct ctrl_iface_global_priv *ctrl_iface; 00196 struct wpas_dbus_priv *dbus; 00197 void **drv_priv; 00198 size_t drv_count; 00199 struct os_time suspend_time; 00200 }; 00201 00202 00203 struct wpa_client_mlme { 00204 #ifdef CONFIG_CLIENT_MLME 00205 enum { 00206 IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, 00207 IEEE80211_ASSOCIATE, IEEE80211_ASSOCIATED, 00208 IEEE80211_IBSS_SEARCH, IEEE80211_IBSS_JOINED 00209 } state; 00210 u8 prev_bssid[ETH_ALEN]; 00211 u8 ssid[32]; 00212 size_t ssid_len; 00213 u16 aid; 00214 u16 ap_capab, capab; 00215 u8 *extra_ie; /* to be added to the end of AssocReq */ 00216 size_t extra_ie_len; 00217 u8 *extra_probe_ie; /* to be added to the end of ProbeReq */ 00218 size_t extra_probe_ie_len; 00219 enum wpa_key_mgmt key_mgmt; 00220 00221 /* The last AssocReq/Resp IEs */ 00222 u8 *assocreq_ies, *assocresp_ies; 00223 size_t assocreq_ies_len, assocresp_ies_len; 00224 00225 int auth_tries, assoc_tries; 00226 00227 unsigned int ssid_set:1; 00228 unsigned int bssid_set:1; 00229 unsigned int prev_bssid_set:1; 00230 unsigned int authenticated:1; 00231 unsigned int associated:1; 00232 unsigned int probereq_poll:1; 00233 unsigned int use_protection:1; 00234 unsigned int create_ibss:1; 00235 unsigned int mixed_cell:1; 00236 unsigned int wmm_enabled:1; 00237 00238 struct os_time last_probe; 00239 00240 unsigned int auth_algs; /* bitfield of allowed auth algs 00241 * (WPA_AUTH_ALG_*) */ 00242 int auth_alg; /* currently used IEEE 802.11 authentication algorithm */ 00243 int auth_transaction; 00244 00245 struct os_time ibss_join_req; 00246 u8 *probe_resp; /* ProbeResp template for IBSS */ 00247 size_t probe_resp_len; 00248 u32 supp_rates_bits; 00249 00250 int wmm_last_param_set; 00251 00252 int sta_scanning; 00253 int scan_hw_mode_idx; 00254 int scan_channel_idx; 00255 enum { SCAN_SET_CHANNEL, SCAN_SEND_PROBE } scan_state; 00256 struct os_time last_scan_completed; 00257 int scan_oper_channel; 00258 int scan_oper_freq; 00259 int scan_oper_phymode; 00260 u8 scan_ssid[32]; 00261 size_t scan_ssid_len; 00262 int scan_skip_11b; 00263 int *scan_freqs; 00264 00265 struct ieee80211_sta_bss *sta_bss_list; 00266 #define STA_HASH_SIZE 256 00267 #define STA_HASH(sta) (sta[5]) 00268 struct ieee80211_sta_bss *sta_bss_hash[STA_HASH_SIZE]; 00269 00270 int cts_protect_erp_frames; 00271 00272 enum hostapd_hw_mode phymode; /* current mode */ 00273 struct hostapd_hw_modes *modes; 00274 size_t num_modes; 00275 unsigned int hw_modes; /* bitfield of allowed hardware modes; 00276 * (1 << HOSTAPD_MODE_*) */ 00277 int num_curr_rates; 00278 int *curr_rates; 00279 int freq; /* The current frequency in MHz */ 00280 int channel; /* The current IEEE 802.11 channel number */ 00281 00282 #ifdef CONFIG_IEEE80211R 00283 u8 current_md[6]; 00284 u8 *ft_ies; 00285 size_t ft_ies_len; 00286 #endif /* CONFIG_IEEE80211R */ 00287 00288 void (*public_action_cb)(void *ctx, const u8 *buf, size_t len, 00289 int freq); 00290 void *public_action_cb_ctx; 00291 00292 #else /* CONFIG_CLIENT_MLME */ 00293 int dummy; /* to keep MSVC happy */ 00294 #endif /* CONFIG_CLIENT_MLME */ 00295 }; 00296 00305 struct wpa_supplicant { 00306 struct wpa_global *global; 00307 struct wpa_supplicant *next; 00308 struct l2_packet_data *l2; 00309 struct l2_packet_data *l2_br; 00310 unsigned char own_addr[ETH_ALEN]; 00311 char ifname[100]; 00312 #ifdef CONFIG_CTRL_IFACE_DBUS 00313 char *dbus_path; 00314 #endif /* CONFIG_CTRL_IFACE_DBUS */ 00315 #ifdef CONFIG_CTRL_IFACE_DBUS_NEW 00316 char *dbus_new_path; 00317 #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */ 00318 char bridge_ifname[16]; 00319 00320 char *confname; 00321 struct wpa_config *conf; 00322 int countermeasures; 00323 os_time_t last_michael_mic_error; 00324 u8 bssid[ETH_ALEN]; 00325 u8 pending_bssid[ETH_ALEN]; /* If wpa_state == WPA_ASSOCIATING, this 00326 * field contains the targer BSSID. */ 00327 int reassociate; /* reassociation requested */ 00328 int disconnected; /* all connections disabled; i.e., do no reassociate 00329 * before this has been cleared */ 00330 struct wpa_ssid *current_ssid; 00331 struct wpa_bss *current_bss; 00332 int ap_ies_from_associnfo; 00333 unsigned int assoc_freq; 00334 00335 /* Selected configuration (based on Beacon/ProbeResp WPA IE) */ 00336 int pairwise_cipher; 00337 int group_cipher; 00338 int key_mgmt; 00339 int mgmt_group_cipher; 00340 00341 void *drv_priv; /* private data used by driver_ops */ 00342 void *global_drv_priv; 00343 00344 struct wpa_ssid *prev_scan_ssid; /* previously scanned SSID; 00345 * NULL = not yet initialized (start 00346 * with wildcard SSID) 00347 * WILDCARD_SSID_SCAN = wildcard 00348 * SSID was used in the previous scan 00349 */ 00350 #define WILDCARD_SSID_SCAN ((struct wpa_ssid *) 1) 00351 00352 void (*scan_res_handler)(struct wpa_supplicant *wpa_s, 00353 struct wpa_scan_results *scan_res); 00354 struct dl_list bss; /* struct wpa_bss::list */ 00355 struct dl_list bss_id; /* struct wpa_bss::list_id */ 00356 size_t num_bss; 00357 unsigned int bss_update_idx; 00358 unsigned int bss_next_id; 00359 00360 struct wpa_driver_ops *driver; 00361 int interface_removed; /* whether the network interface has been 00362 * removed */ 00363 struct wpa_sm *wpa; 00364 struct eapol_sm *eapol; 00365 00366 struct ctrl_iface_priv *ctrl_iface; 00367 00368 enum wpa_states wpa_state; 00369 int scanning; 00370 int new_connection; 00371 int reassociated_connection; 00372 int more_bss_to_try; 00373 00374 int eapol_received; /* number of EAPOL packets received after the 00375 * previous association event */ 00376 00377 struct scard_data *scard; 00378 00379 unsigned char last_eapol_src[ETH_ALEN]; 00380 00381 int keys_cleared; 00382 00383 struct wpa_blacklist *blacklist; 00384 00385 int scan_req; /* manual scan request; this forces a scan even if there 00386 * are no enabled networks in the configuration */ 00387 int scan_res_tried; /* whether ap_scan=1 mode has tried to fetch scan 00388 * results without a new scan request; this is used 00389 * to speed up the first association if the driver 00390 * has already available scan results. */ 00391 int scan_runs; /* number of scan runs since WPS was started */ 00392 00393 struct wpa_client_mlme mlme; 00394 unsigned int drv_flags; 00395 int max_scan_ssids; 00396 unsigned int max_remain_on_chan; 00397 00398 int pending_mic_error_report; 00399 int pending_mic_error_pairwise; 00400 int mic_errors_seen; /* Michael MIC errors with the current PTK */ 00401 00402 struct wps_context *wps; 00403 int wps_success; /* WPS success event received */ 00404 struct wps_er *wps_er; 00405 int blacklist_cleared; 00406 00407 struct wpabuf *pending_eapol_rx; 00408 struct os_time pending_eapol_rx_time; 00409 u8 pending_eapol_rx_src[ETH_ALEN]; 00410 00411 struct ibss_rsn *ibss_rsn; 00412 00413 #ifdef CONFIG_SME 00414 struct { 00415 u8 ssid[32]; 00416 size_t ssid_len; 00417 int freq; 00418 u8 assoc_req_ie[80]; 00419 size_t assoc_req_ie_len; 00420 int mfp; 00421 int ft_used; 00422 u8 mobility_domain[2]; 00423 u8 *ft_ies; 00424 size_t ft_ies_len; 00425 u8 prev_bssid[ETH_ALEN]; 00426 int prev_bssid_set; 00427 int auth_alg; 00428 } sme; 00429 #endif /* CONFIG_SME */ 00430 00431 #ifdef CONFIG_AP 00432 struct hostapd_iface *ap_iface; 00433 void (*ap_configured_cb)(void *ctx, void *data); 00434 void *ap_configured_cb_ctx; 00435 void *ap_configured_cb_data; 00436 #endif /* CONFIG_AP */ 00437 00438 struct wpa_ssid *bgscan_ssid; 00439 const struct bgscan_ops *bgscan; 00440 void *bgscan_priv; 00441 00442 int connect_without_scan; 00443 00444 int after_wps; 00445 unsigned int wps_freq; 00446 00447 struct ros_interface *ros_api; 00448 }; 00449 00450 00451 /* wpa_supplicant.c */ 00452 int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); 00453 00454 int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s); 00455 00456 const char * wpa_supplicant_state_txt(enum wpa_states state); 00457 int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s); 00458 int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s, 00459 struct wpa_bss *bss, struct wpa_ssid *ssid, 00460 u8 *wpa_ie, size_t *wpa_ie_len); 00461 void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, 00462 struct wpa_bss *bss, 00463 struct wpa_ssid *ssid); 00464 void wpa_supplicant_set_non_wpa_policy(struct wpa_supplicant *wpa_s, 00465 struct wpa_ssid *ssid); 00466 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s); 00467 void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr); 00468 void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s, 00469 int sec, int usec); 00470 void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, 00471 enum wpa_states state); 00472 struct wpa_ssid * wpa_supplicant_get_ssid(struct wpa_supplicant *wpa_s); 00473 void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s); 00474 void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, 00475 int reason_code); 00476 void wpa_supplicant_disassociate(struct wpa_supplicant *wpa_s, 00477 int reason_code); 00478 00479 void wpa_supplicant_enable_network(struct wpa_supplicant *wpa_s, 00480 struct wpa_ssid *ssid); 00481 void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s, 00482 struct wpa_ssid *ssid); 00483 void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s, 00484 struct wpa_ssid *ssid); 00485 int wpa_supplicant_set_ap_scan(struct wpa_supplicant *wpa_s, 00486 int ap_scan); 00487 int wpa_supplicant_set_debug_params(struct wpa_global *global, 00488 int debug_level, int debug_timestamp, 00489 int debug_show_keys); 00490 00491 void wpa_show_license(void); 00492 00493 struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global, 00494 struct wpa_interface *iface); 00495 int wpa_supplicant_remove_iface(struct wpa_global *global, 00496 struct wpa_supplicant *wpa_s); 00497 struct wpa_supplicant * wpa_supplicant_get_iface(struct wpa_global *global, 00498 const char *ifname); 00499 struct wpa_global * wpa_supplicant_init(struct wpa_params *params); 00500 int wpa_supplicant_run(struct wpa_global *global); 00501 void wpa_supplicant_deinit(struct wpa_global *global); 00502 00503 int wpa_supplicant_scard_init(struct wpa_supplicant *wpa_s, 00504 struct wpa_ssid *ssid); 00505 void wpa_supplicant_terminate_proc(struct wpa_global *global); 00506 void wpa_supplicant_rx_eapol(void *ctx, const u8 *src_addr, 00507 const u8 *buf, size_t len); 00508 enum wpa_key_mgmt key_mgmt2driver(int key_mgmt); 00509 enum wpa_cipher cipher_suite2driver(int cipher); 00510 00511 /* events.c */ 00512 void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s); 00513 void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, 00514 struct wpa_bss *selected, 00515 struct wpa_ssid *ssid); 00516 00517 /* eap_register.c */ 00518 int eap_register_methods(void); 00519 00520 #endif /* WPA_SUPPLICANT_I_H */