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