1 /* 2 * hostapd / Initialization and configuration 3 * Copyright (c) 2002-2014, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #ifndef HOSTAPD_H 10 #define HOSTAPD_H 11 12 #include "common/defs.h" 13 #include "utils/list.h" 14 #include "ap_config.h" 15 #include "drivers/driver.h" 16 17 struct wpa_ctrl_dst; 18 struct radius_server_data; 19 struct upnp_wps_device_sm; 20 struct hostapd_data; 21 struct sta_info; 22 struct ieee80211_ht_capabilities; 23 struct full_dynamic_vlan; 24 enum wps_event; 25 union wps_event_data; 26 #ifdef CONFIG_MESH 27 struct mesh_conf; 28 #endif /* CONFIG_MESH */ 29 30 struct hostapd_iface; 31 32 struct hapd_interfaces { 33 int (*reload_config)(struct hostapd_iface *iface); 34 struct hostapd_config * (*config_read_cb)(const char *config_fname); 35 int (*ctrl_iface_init)(struct hostapd_data *hapd); 36 void (*ctrl_iface_deinit)(struct hostapd_data *hapd); 37 int (*for_each_interface)(struct hapd_interfaces *interfaces, 38 int (*cb)(struct hostapd_iface *iface, 39 void *ctx), void *ctx); 40 int (*driver_init)(struct hostapd_iface *iface); 41 42 size_t count; 43 int global_ctrl_sock; 44 struct dl_list global_ctrl_dst; 45 char *global_iface_path; 46 char *global_iface_name; 47 #ifndef CONFIG_NATIVE_WINDOWS 48 gid_t ctrl_iface_group; 49 #endif /* CONFIG_NATIVE_WINDOWS */ 50 struct hostapd_iface **iface; 51 52 size_t terminate_on_error; 53 #ifndef CONFIG_NO_VLAN 54 struct dynamic_iface *vlan_priv; 55 #endif /* CONFIG_NO_VLAN */ 56 int eloop_initialized; 57 }; 58 59 enum hostapd_chan_status { 60 HOSTAPD_CHAN_VALID = 0, /* channel is ready */ 61 HOSTAPD_CHAN_INVALID = 1, /* no usable channel found */ 62 HOSTAPD_CHAN_ACS = 2, /* ACS work being performed */ 63 }; 64 65 struct hostapd_probereq_cb { 66 int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, 67 const u8 *ie, size_t ie_len, int ssi_signal); 68 void *ctx; 69 }; 70 71 #define HOSTAPD_RATE_BASIC 0x00000001 72 73 struct hostapd_rate_data { 74 int rate; /* rate in 100 kbps */ 75 int flags; /* HOSTAPD_RATE_ flags */ 76 }; 77 78 struct hostapd_frame_info { 79 u32 channel; 80 u32 datarate; 81 int ssi_signal; /* dBm */ 82 }; 83 84 enum wps_status { 85 WPS_STATUS_SUCCESS = 1, 86 WPS_STATUS_FAILURE 87 }; 88 89 enum pbc_status { 90 WPS_PBC_STATUS_DISABLE, 91 WPS_PBC_STATUS_ACTIVE, 92 WPS_PBC_STATUS_TIMEOUT, 93 WPS_PBC_STATUS_OVERLAP 94 }; 95 96 struct wps_stat { 97 enum wps_status status; 98 enum wps_error_indication failure_reason; 99 enum pbc_status pbc_status; 100 u8 peer_addr[ETH_ALEN]; 101 }; 102 103 struct hostapd_neighbor_entry { 104 struct dl_list list; 105 u8 bssid[ETH_ALEN]; 106 struct wpa_ssid_value ssid; 107 struct wpabuf *nr; 108 struct wpabuf *lci; 109 struct wpabuf *civic; 110 /* LCI update time */ 111 struct os_time lci_date; 112 }; 113 114 /** 115 * struct hostapd_data - hostapd per-BSS data structure 116 */ 117 struct hostapd_data { 118 struct hostapd_iface *iface; 119 struct hostapd_config *iconf; 120 struct hostapd_bss_config *conf; 121 int interface_added; /* virtual interface added for this BSS */ 122 unsigned int started:1; 123 unsigned int disabled:1; 124 unsigned int reenable_beacon:1; 125 126 u8 own_addr[ETH_ALEN]; 127 128 int num_sta; /* number of entries in sta_list */ 129 struct sta_info *sta_list; /* STA info list head */ 130 #define STA_HASH_SIZE 256 131 #define STA_HASH(sta) (sta[5]) 132 struct sta_info *sta_hash[STA_HASH_SIZE]; 133 134 /* 135 * Bitfield for indicating which AIDs are allocated. Only AID values 136 * 1-2007 are used and as such, the bit at index 0 corresponds to AID 137 * 1. 138 */ 139 #define AID_WORDS ((2008 + 31) / 32) 140 u32 sta_aid[AID_WORDS]; 141 142 const struct wpa_driver_ops *driver; 143 void *drv_priv; 144 145 void (*new_assoc_sta_cb)(struct hostapd_data *hapd, 146 struct sta_info *sta, int reassoc); 147 148 void *msg_ctx; /* ctx for wpa_msg() calls */ 149 void *msg_ctx_parent; /* parent interface ctx for wpa_msg() calls */ 150 151 struct radius_client_data *radius; 152 u64 acct_session_id; 153 struct radius_das_data *radius_das; 154 155 struct iapp_data *iapp; 156 157 struct hostapd_cached_radius_acl *acl_cache; 158 struct hostapd_acl_query_data *acl_queries; 159 160 struct wpa_authenticator *wpa_auth; 161 struct eapol_authenticator *eapol_auth; 162 163 struct rsn_preauth_interface *preauth_iface; 164 struct os_reltime michael_mic_failure; 165 int michael_mic_failures; 166 int tkip_countermeasures; 167 168 int ctrl_sock; 169 struct dl_list ctrl_dst; 170 171 void *ssl_ctx; 172 void *eap_sim_db_priv; 173 struct radius_server_data *radius_srv; 174 struct dl_list erp_keys; /* struct eap_server_erp_key */ 175 176 int parameter_set_count; 177 178 /* Time Advertisement */ 179 u8 time_update_counter; 180 struct wpabuf *time_adv; 181 182 #ifdef CONFIG_FULL_DYNAMIC_VLAN 183 struct full_dynamic_vlan *full_dynamic_vlan; 184 #endif /* CONFIG_FULL_DYNAMIC_VLAN */ 185 186 struct l2_packet_data *l2; 187 struct wps_context *wps; 188 189 int beacon_set_done; 190 struct wpabuf *wps_beacon_ie; 191 struct wpabuf *wps_probe_resp_ie; 192 #ifdef CONFIG_WPS 193 unsigned int ap_pin_failures; 194 unsigned int ap_pin_failures_consecutive; 195 struct upnp_wps_device_sm *wps_upnp; 196 unsigned int ap_pin_lockout_time; 197 198 struct wps_stat wps_stats; 199 #endif /* CONFIG_WPS */ 200 201 struct hostapd_probereq_cb *probereq_cb; 202 size_t num_probereq_cb; 203 204 void (*public_action_cb)(void *ctx, const u8 *buf, size_t len, 205 int freq); 206 void *public_action_cb_ctx; 207 void (*public_action_cb2)(void *ctx, const u8 *buf, size_t len, 208 int freq); 209 void *public_action_cb2_ctx; 210 211 int (*vendor_action_cb)(void *ctx, const u8 *buf, size_t len, 212 int freq); 213 void *vendor_action_cb_ctx; 214 215 void (*wps_reg_success_cb)(void *ctx, const u8 *mac_addr, 216 const u8 *uuid_e); 217 void *wps_reg_success_cb_ctx; 218 219 void (*wps_event_cb)(void *ctx, enum wps_event event, 220 union wps_event_data *data); 221 void *wps_event_cb_ctx; 222 223 void (*sta_authorized_cb)(void *ctx, const u8 *mac_addr, 224 int authorized, const u8 *p2p_dev_addr); 225 void *sta_authorized_cb_ctx; 226 227 void (*setup_complete_cb)(void *ctx); 228 void *setup_complete_cb_ctx; 229 230 void (*new_psk_cb)(void *ctx, const u8 *mac_addr, 231 const u8 *p2p_dev_addr, const u8 *psk, 232 size_t psk_len); 233 void *new_psk_cb_ctx; 234 235 /* channel switch parameters */ 236 struct hostapd_freq_params cs_freq_params; 237 u8 cs_count; 238 int cs_block_tx; 239 unsigned int cs_c_off_beacon; 240 unsigned int cs_c_off_proberesp; 241 int csa_in_progress; 242 unsigned int cs_c_off_ecsa_beacon; 243 unsigned int cs_c_off_ecsa_proberesp; 244 245 /* BSS Load */ 246 unsigned int bss_load_update_timeout; 247 248 #ifdef CONFIG_P2P 249 struct p2p_data *p2p; 250 struct p2p_group *p2p_group; 251 struct wpabuf *p2p_beacon_ie; 252 struct wpabuf *p2p_probe_resp_ie; 253 254 /* Number of non-P2P association stations */ 255 int num_sta_no_p2p; 256 257 /* Periodic NoA (used only when no non-P2P clients in the group) */ 258 int noa_enabled; 259 int noa_start; 260 int noa_duration; 261 #endif /* CONFIG_P2P */ 262 #ifdef CONFIG_INTERWORKING 263 size_t gas_frag_limit; 264 #endif /* CONFIG_INTERWORKING */ 265 #ifdef CONFIG_PROXYARP 266 struct l2_packet_data *sock_dhcp; 267 struct l2_packet_data *sock_ndisc; 268 #endif /* CONFIG_PROXYARP */ 269 #ifdef CONFIG_MESH 270 int num_plinks; 271 int max_plinks; 272 void (*mesh_sta_free_cb)(struct hostapd_data *hapd, 273 struct sta_info *sta); 274 struct wpabuf *mesh_pending_auth; 275 struct os_reltime mesh_pending_auth_time; 276 u8 mesh_required_peer[ETH_ALEN]; 277 #endif /* CONFIG_MESH */ 278 279 #ifdef CONFIG_SQLITE 280 struct hostapd_eap_user tmp_eap_user; 281 #endif /* CONFIG_SQLITE */ 282 283 #ifdef CONFIG_SAE 284 /** Key used for generating SAE anti-clogging tokens */ 285 u8 sae_token_key[8]; 286 struct os_reltime last_sae_token_key_update; 287 int dot11RSNASAERetransPeriod; /* msec */ 288 #endif /* CONFIG_SAE */ 289 290 #ifdef CONFIG_TESTING_OPTIONS 291 unsigned int ext_mgmt_frame_handling:1; 292 unsigned int ext_eapol_frame_io:1; 293 294 struct l2_packet_data *l2_test; 295 #endif /* CONFIG_TESTING_OPTIONS */ 296 297 #ifdef CONFIG_MBO 298 unsigned int mbo_assoc_disallow; 299 #endif /* CONFIG_MBO */ 300 301 struct dl_list nr_db; 302 303 u8 lci_req_token; 304 u8 range_req_token; 305 unsigned int lci_req_active:1; 306 unsigned int range_req_active:1; 307 }; 308 309 310 struct hostapd_sta_info { 311 struct dl_list list; 312 u8 addr[ETH_ALEN]; 313 struct os_reltime last_seen; 314 #ifdef CONFIG_TAXONOMY 315 struct wpabuf *probe_ie_taxonomy; 316 #endif /* CONFIG_TAXONOMY */ 317 }; 318 319 /** 320 * struct hostapd_iface - hostapd per-interface data structure 321 */ 322 struct hostapd_iface { 323 struct hapd_interfaces *interfaces; 324 void *owner; 325 char *config_fname; 326 struct hostapd_config *conf; 327 char phy[16]; /* Name of the PHY (radio) */ 328 329 enum hostapd_iface_state { 330 HAPD_IFACE_UNINITIALIZED, 331 HAPD_IFACE_DISABLED, 332 HAPD_IFACE_COUNTRY_UPDATE, 333 HAPD_IFACE_ACS, 334 HAPD_IFACE_HT_SCAN, 335 HAPD_IFACE_DFS, 336 HAPD_IFACE_ENABLED 337 } state; 338 339 #ifdef CONFIG_MESH 340 struct mesh_conf *mconf; 341 #endif /* CONFIG_MESH */ 342 343 size_t num_bss; 344 struct hostapd_data **bss; 345 346 unsigned int wait_channel_update:1; 347 unsigned int cac_started:1; 348 #ifdef CONFIG_FST 349 struct fst_iface *fst; 350 const struct wpabuf *fst_ies; 351 #endif /* CONFIG_FST */ 352 353 /* 354 * When set, indicates that the driver will handle the AP 355 * teardown: delete global keys, station keys, and stations. 356 */ 357 unsigned int driver_ap_teardown:1; 358 359 /* 360 * When set, indicates that this interface is part of list of 361 * interfaces that need to be started together (synchronously). 362 */ 363 unsigned int need_to_start_in_sync:1; 364 365 /* Ready to start but waiting for other interfaces to become ready. */ 366 unsigned int ready_to_start_in_sync:1; 367 368 int num_ap; /* number of entries in ap_list */ 369 struct ap_info *ap_list; /* AP info list head */ 370 struct ap_info *ap_hash[STA_HASH_SIZE]; 371 372 u64 drv_flags; 373 374 /* SMPS modes supported by the driver (WPA_DRIVER_SMPS_MODE_*) */ 375 unsigned int smps_modes; 376 377 /* 378 * A bitmap of supported protocols for probe response offload. See 379 * struct wpa_driver_capa in driver.h 380 */ 381 unsigned int probe_resp_offloads; 382 383 /* extended capabilities supported by the driver */ 384 const u8 *extended_capa, *extended_capa_mask; 385 unsigned int extended_capa_len; 386 387 unsigned int drv_max_acl_mac_addrs; 388 389 struct hostapd_hw_modes *hw_features; 390 int num_hw_features; 391 struct hostapd_hw_modes *current_mode; 392 /* Rates that are currently used (i.e., filtered copy of 393 * current_mode->channels */ 394 int num_rates; 395 struct hostapd_rate_data *current_rates; 396 int *basic_rates; 397 int freq; 398 399 u16 hw_flags; 400 401 /* Number of associated Non-ERP stations (i.e., stations using 802.11b 402 * in 802.11g BSS) */ 403 int num_sta_non_erp; 404 405 /* Number of associated stations that do not support Short Slot Time */ 406 int num_sta_no_short_slot_time; 407 408 /* Number of associated stations that do not support Short Preamble */ 409 int num_sta_no_short_preamble; 410 411 int olbc; /* Overlapping Legacy BSS Condition */ 412 413 /* Number of HT associated stations that do not support greenfield */ 414 int num_sta_ht_no_gf; 415 416 /* Number of associated non-HT stations */ 417 int num_sta_no_ht; 418 419 /* Number of HT associated stations 20 MHz */ 420 int num_sta_ht_20mhz; 421 422 /* Number of HT40 intolerant stations */ 423 int num_sta_ht40_intolerant; 424 425 /* Overlapping BSS information */ 426 int olbc_ht; 427 428 u16 ht_op_mode; 429 430 /* surveying helpers */ 431 432 /* number of channels surveyed */ 433 unsigned int chans_surveyed; 434 435 /* lowest observed noise floor in dBm */ 436 s8 lowest_nf; 437 438 /* channel utilization calculation */ 439 u64 last_channel_time; 440 u64 last_channel_time_busy; 441 u8 channel_utilization; 442 443 /* eCSA IE will be added only if operating class is specified */ 444 u8 cs_oper_class; 445 446 unsigned int dfs_cac_ms; 447 struct os_reltime dfs_cac_start; 448 449 /* Latched with the actual secondary channel information and will be 450 * used while juggling between HT20 and HT40 modes. */ 451 int secondary_ch; 452 453 #ifdef CONFIG_ACS 454 unsigned int acs_num_completed_scans; 455 #endif /* CONFIG_ACS */ 456 457 void (*scan_cb)(struct hostapd_iface *iface); 458 int num_ht40_scan_tries; 459 460 struct dl_list sta_seen; /* struct hostapd_sta_info */ 461 unsigned int num_sta_seen; 462 }; 463 464 /* hostapd.c */ 465 int hostapd_for_each_interface(struct hapd_interfaces *interfaces, 466 int (*cb)(struct hostapd_iface *iface, 467 void *ctx), void *ctx); 468 int hostapd_reload_config(struct hostapd_iface *iface); 469 struct hostapd_data * 470 hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, 471 struct hostapd_config *conf, 472 struct hostapd_bss_config *bss); 473 int hostapd_setup_interface(struct hostapd_iface *iface); 474 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err); 475 void hostapd_interface_deinit(struct hostapd_iface *iface); 476 void hostapd_interface_free(struct hostapd_iface *iface); 477 struct hostapd_iface * hostapd_alloc_iface(void); 478 struct hostapd_iface * hostapd_init(struct hapd_interfaces *interfaces, 479 const char *config_file); 480 struct hostapd_iface * 481 hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy, 482 const char *config_fname, int debug); 483 void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, 484 int reassoc); 485 void hostapd_interface_deinit_free(struct hostapd_iface *iface); 486 int hostapd_enable_iface(struct hostapd_iface *hapd_iface); 487 int hostapd_reload_iface(struct hostapd_iface *hapd_iface); 488 int hostapd_disable_iface(struct hostapd_iface *hapd_iface); 489 int hostapd_add_iface(struct hapd_interfaces *ifaces, char *buf); 490 int hostapd_remove_iface(struct hapd_interfaces *ifaces, char *buf); 491 void hostapd_channel_list_updated(struct hostapd_iface *iface, int initiator); 492 void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s); 493 const char * hostapd_state_text(enum hostapd_iface_state s); 494 int hostapd_csa_in_progress(struct hostapd_iface *iface); 495 int hostapd_switch_channel(struct hostapd_data *hapd, 496 struct csa_settings *settings); 497 void 498 hostapd_switch_channel_fallback(struct hostapd_iface *iface, 499 const struct hostapd_freq_params *freq_params); 500 void hostapd_cleanup_cs_params(struct hostapd_data *hapd); 501 void hostapd_periodic_iface(struct hostapd_iface *iface); 502 503 /* utils.c */ 504 int hostapd_register_probereq_cb(struct hostapd_data *hapd, 505 int (*cb)(void *ctx, const u8 *sa, 506 const u8 *da, const u8 *bssid, 507 const u8 *ie, size_t ie_len, 508 int ssi_signal), 509 void *ctx); 510 void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr); 511 512 /* drv_callbacks.c (TODO: move to somewhere else?) */ 513 int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, 514 const u8 *ie, size_t ielen, int reassoc); 515 void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr); 516 void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr); 517 void hostapd_event_connect_failed_reason(struct hostapd_data *hapd, 518 const u8 *addr, int reason_code); 519 int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, 520 const u8 *bssid, const u8 *ie, size_t ie_len, 521 int ssi_signal); 522 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht, 523 int offset, int width, int cf1, int cf2); 524 struct survey_results; 525 void hostapd_event_get_survey(struct hostapd_iface *iface, 526 struct survey_results *survey_results); 527 void hostapd_acs_channel_selected(struct hostapd_data *hapd, 528 struct acs_selected_channels *acs_res); 529 530 const struct hostapd_eap_user * 531 hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity, 532 size_t identity_len, int phase2); 533 534 struct hostapd_data * hostapd_get_iface(struct hapd_interfaces *interfaces, 535 const char *ifname); 536 537 #ifdef CONFIG_FST 538 void fst_hostapd_fill_iface_obj(struct hostapd_data *hapd, 539 struct fst_wpa_obj *iface_obj); 540 #endif /* CONFIG_FST */ 541 542 #endif /* HOSTAPD_H */ 543