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#include "utils/includes.h" 10 11#include "utils/common.h" 12#include "utils/eloop.h" 13#include "common/ieee802_11_defs.h" 14#include "common/wpa_ctrl.h" 15#include "radius/radius_client.h" 16#include "radius/radius_das.h" 17#include "eap_server/tncs.h" 18#include "hostapd.h" 19#include "authsrv.h" 20#include "sta_info.h" 21#include "accounting.h" 22#include "ap_list.h" 23#include "beacon.h" 24#include "iapp.h" 25#include "ieee802_1x.h" 26#include "ieee802_11_auth.h" 27#include "vlan_init.h" 28#include "wpa_auth.h" 29#include "wps_hostapd.h" 30#include "hw_features.h" 31#include "wpa_auth_glue.h" 32#include "ap_drv_ops.h" 33#include "ap_config.h" 34#include "p2p_hostapd.h" 35#include "gas_serv.h" 36#include "dfs.h" 37#include "ieee802_11.h" 38 39 40static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason); 41static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd); 42static int hostapd_broadcast_wep_clear(struct hostapd_data *hapd); 43static int setup_interface2(struct hostapd_iface *iface); 44static void channel_list_update_timeout(void *eloop_ctx, void *timeout_ctx); 45 46 47int hostapd_for_each_interface(struct hapd_interfaces *interfaces, 48 int (*cb)(struct hostapd_iface *iface, 49 void *ctx), void *ctx) 50{ 51 size_t i; 52 int ret; 53 54 for (i = 0; i < interfaces->count; i++) { 55 ret = cb(interfaces->iface[i], ctx); 56 if (ret) 57 return ret; 58 } 59 60 return 0; 61} 62 63 64static void hostapd_reload_bss(struct hostapd_data *hapd) 65{ 66 struct hostapd_ssid *ssid; 67 68#ifndef CONFIG_NO_RADIUS 69 radius_client_reconfig(hapd->radius, hapd->conf->radius); 70#endif /* CONFIG_NO_RADIUS */ 71 72 ssid = &hapd->conf->ssid; 73 if (!ssid->wpa_psk_set && ssid->wpa_psk && !ssid->wpa_psk->next && 74 ssid->wpa_passphrase_set && ssid->wpa_passphrase) { 75 /* 76 * Force PSK to be derived again since SSID or passphrase may 77 * have changed. 78 */ 79 os_free(ssid->wpa_psk); 80 ssid->wpa_psk = NULL; 81 } 82 if (hostapd_setup_wpa_psk(hapd->conf)) { 83 wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK " 84 "after reloading configuration"); 85 } 86 87 if (hapd->conf->ieee802_1x || hapd->conf->wpa) 88 hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 1); 89 else 90 hostapd_set_drv_ieee8021x(hapd, hapd->conf->iface, 0); 91 92 if ((hapd->conf->wpa || hapd->conf->osen) && hapd->wpa_auth == NULL) { 93 hostapd_setup_wpa(hapd); 94 if (hapd->wpa_auth) 95 wpa_init_keys(hapd->wpa_auth); 96 } else if (hapd->conf->wpa) { 97 const u8 *wpa_ie; 98 size_t wpa_ie_len; 99 hostapd_reconfig_wpa(hapd); 100 wpa_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &wpa_ie_len); 101 if (hostapd_set_generic_elem(hapd, wpa_ie, wpa_ie_len)) 102 wpa_printf(MSG_ERROR, "Failed to configure WPA IE for " 103 "the kernel driver."); 104 } else if (hapd->wpa_auth) { 105 wpa_deinit(hapd->wpa_auth); 106 hapd->wpa_auth = NULL; 107 hostapd_set_privacy(hapd, 0); 108 hostapd_setup_encryption(hapd->conf->iface, hapd); 109 hostapd_set_generic_elem(hapd, (u8 *) "", 0); 110 } 111 112 ieee802_11_set_beacon(hapd); 113 hostapd_update_wps(hapd); 114 115 if (hapd->conf->ssid.ssid_set && 116 hostapd_set_ssid(hapd, hapd->conf->ssid.ssid, 117 hapd->conf->ssid.ssid_len)) { 118 wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver"); 119 /* try to continue */ 120 } 121 wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface); 122} 123 124 125static void hostapd_clear_old(struct hostapd_iface *iface) 126{ 127 size_t j; 128 129 /* 130 * Deauthenticate all stations since the new configuration may not 131 * allow them to use the BSS anymore. 132 */ 133 for (j = 0; j < iface->num_bss; j++) { 134 hostapd_flush_old_stations(iface->bss[j], 135 WLAN_REASON_PREV_AUTH_NOT_VALID); 136 hostapd_broadcast_wep_clear(iface->bss[j]); 137 138#ifndef CONFIG_NO_RADIUS 139 /* TODO: update dynamic data based on changed configuration 140 * items (e.g., open/close sockets, etc.) */ 141 radius_client_flush(iface->bss[j]->radius, 0); 142#endif /* CONFIG_NO_RADIUS */ 143 } 144} 145 146 147int hostapd_reload_config(struct hostapd_iface *iface) 148{ 149 struct hostapd_data *hapd = iface->bss[0]; 150 struct hostapd_config *newconf, *oldconf; 151 size_t j; 152 153 if (iface->config_fname == NULL) { 154 /* Only in-memory config in use - assume it has been updated */ 155 hostapd_clear_old(iface); 156 for (j = 0; j < iface->num_bss; j++) 157 hostapd_reload_bss(iface->bss[j]); 158 return 0; 159 } 160 161 if (iface->interfaces == NULL || 162 iface->interfaces->config_read_cb == NULL) 163 return -1; 164 newconf = iface->interfaces->config_read_cb(iface->config_fname); 165 if (newconf == NULL) 166 return -1; 167 168 hostapd_clear_old(iface); 169 170 oldconf = hapd->iconf; 171 iface->conf = newconf; 172 173 for (j = 0; j < iface->num_bss; j++) { 174 hapd = iface->bss[j]; 175 hapd->iconf = newconf; 176 hapd->iconf->channel = oldconf->channel; 177 hapd->iconf->secondary_channel = oldconf->secondary_channel; 178 hapd->iconf->ieee80211n = oldconf->ieee80211n; 179 hapd->iconf->ieee80211ac = oldconf->ieee80211ac; 180 hapd->iconf->ht_capab = oldconf->ht_capab; 181 hapd->iconf->vht_capab = oldconf->vht_capab; 182 hapd->iconf->vht_oper_chwidth = oldconf->vht_oper_chwidth; 183 hapd->iconf->vht_oper_centr_freq_seg0_idx = 184 oldconf->vht_oper_centr_freq_seg0_idx; 185 hapd->iconf->vht_oper_centr_freq_seg1_idx = 186 oldconf->vht_oper_centr_freq_seg1_idx; 187 hapd->conf = newconf->bss[j]; 188 hostapd_reload_bss(hapd); 189 } 190 191 hostapd_config_free(oldconf); 192 193 194 return 0; 195} 196 197 198static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd, 199 char *ifname) 200{ 201 int i; 202 203 for (i = 0; i < NUM_WEP_KEYS; i++) { 204 if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, NULL, i, 205 0, NULL, 0, NULL, 0)) { 206 wpa_printf(MSG_DEBUG, "Failed to clear default " 207 "encryption keys (ifname=%s keyidx=%d)", 208 ifname, i); 209 } 210 } 211#ifdef CONFIG_IEEE80211W 212 if (hapd->conf->ieee80211w) { 213 for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) { 214 if (hostapd_drv_set_key(ifname, hapd, WPA_ALG_NONE, 215 NULL, i, 0, NULL, 216 0, NULL, 0)) { 217 wpa_printf(MSG_DEBUG, "Failed to clear " 218 "default mgmt encryption keys " 219 "(ifname=%s keyidx=%d)", ifname, i); 220 } 221 } 222 } 223#endif /* CONFIG_IEEE80211W */ 224} 225 226 227static int hostapd_broadcast_wep_clear(struct hostapd_data *hapd) 228{ 229 hostapd_broadcast_key_clear_iface(hapd, hapd->conf->iface); 230 return 0; 231} 232 233 234static int hostapd_broadcast_wep_set(struct hostapd_data *hapd) 235{ 236 int errors = 0, idx; 237 struct hostapd_ssid *ssid = &hapd->conf->ssid; 238 239 idx = ssid->wep.idx; 240 if (ssid->wep.default_len && 241 hostapd_drv_set_key(hapd->conf->iface, 242 hapd, WPA_ALG_WEP, broadcast_ether_addr, idx, 243 1, NULL, 0, ssid->wep.key[idx], 244 ssid->wep.len[idx])) { 245 wpa_printf(MSG_WARNING, "Could not set WEP encryption."); 246 errors++; 247 } 248 249 return errors; 250} 251 252 253static void hostapd_free_hapd_data(struct hostapd_data *hapd) 254{ 255 if (!hapd->started) { 256 wpa_printf(MSG_ERROR, "%s: Interface %s wasn't started", 257 __func__, hapd->conf->iface); 258 return; 259 } 260 hapd->started = 0; 261 262 wpa_printf(MSG_DEBUG, "%s(%s)", __func__, hapd->conf->iface); 263 iapp_deinit(hapd->iapp); 264 hapd->iapp = NULL; 265 accounting_deinit(hapd); 266 hostapd_deinit_wpa(hapd); 267 vlan_deinit(hapd); 268 hostapd_acl_deinit(hapd); 269#ifndef CONFIG_NO_RADIUS 270 radius_client_deinit(hapd->radius); 271 hapd->radius = NULL; 272 radius_das_deinit(hapd->radius_das); 273 hapd->radius_das = NULL; 274#endif /* CONFIG_NO_RADIUS */ 275 276 hostapd_deinit_wps(hapd); 277 278 authsrv_deinit(hapd); 279 280 if (hapd->interface_added) { 281 hapd->interface_added = 0; 282 if (hostapd_if_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface)) { 283 wpa_printf(MSG_WARNING, 284 "Failed to remove BSS interface %s", 285 hapd->conf->iface); 286 hapd->interface_added = 1; 287 } else { 288 /* 289 * Since this was a dynamically added interface, the 290 * driver wrapper may have removed its internal instance 291 * and hapd->drv_priv is not valid anymore. 292 */ 293 hapd->drv_priv = NULL; 294 } 295 } 296 297 os_free(hapd->probereq_cb); 298 hapd->probereq_cb = NULL; 299 300#ifdef CONFIG_P2P 301 wpabuf_free(hapd->p2p_beacon_ie); 302 hapd->p2p_beacon_ie = NULL; 303 wpabuf_free(hapd->p2p_probe_resp_ie); 304 hapd->p2p_probe_resp_ie = NULL; 305#endif /* CONFIG_P2P */ 306 307 wpabuf_free(hapd->time_adv); 308 309#ifdef CONFIG_INTERWORKING 310 gas_serv_deinit(hapd); 311#endif /* CONFIG_INTERWORKING */ 312 313#ifdef CONFIG_SQLITE 314 bin_clear_free(hapd->tmp_eap_user.identity, 315 hapd->tmp_eap_user.identity_len); 316 bin_clear_free(hapd->tmp_eap_user.password, 317 hapd->tmp_eap_user.password_len); 318#endif /* CONFIG_SQLITE */ 319} 320 321 322/** 323 * hostapd_cleanup - Per-BSS cleanup (deinitialization) 324 * @hapd: Pointer to BSS data 325 * 326 * This function is used to free all per-BSS data structures and resources. 327 * Most of the modules that are initialized in hostapd_setup_bss() are 328 * deinitialized here. 329 */ 330static void hostapd_cleanup(struct hostapd_data *hapd) 331{ 332 wpa_printf(MSG_DEBUG, "%s(hapd=%p (%s))", __func__, hapd, 333 hapd->conf->iface); 334 if (hapd->iface->interfaces && 335 hapd->iface->interfaces->ctrl_iface_deinit) 336 hapd->iface->interfaces->ctrl_iface_deinit(hapd); 337 hostapd_free_hapd_data(hapd); 338} 339 340 341static void hostapd_cleanup_iface_partial(struct hostapd_iface *iface) 342{ 343 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); 344 hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); 345 iface->hw_features = NULL; 346 os_free(iface->current_rates); 347 iface->current_rates = NULL; 348 os_free(iface->basic_rates); 349 iface->basic_rates = NULL; 350 ap_list_deinit(iface); 351} 352 353 354/** 355 * hostapd_cleanup_iface - Complete per-interface cleanup 356 * @iface: Pointer to interface data 357 * 358 * This function is called after per-BSS data structures are deinitialized 359 * with hostapd_cleanup(). 360 */ 361static void hostapd_cleanup_iface(struct hostapd_iface *iface) 362{ 363 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); 364 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); 365 366 hostapd_cleanup_iface_partial(iface); 367 hostapd_config_free(iface->conf); 368 iface->conf = NULL; 369 370 os_free(iface->config_fname); 371 os_free(iface->bss); 372 wpa_printf(MSG_DEBUG, "%s: free iface=%p", __func__, iface); 373 os_free(iface); 374} 375 376 377static void hostapd_clear_wep(struct hostapd_data *hapd) 378{ 379 if (hapd->drv_priv && !hapd->iface->driver_ap_teardown) { 380 hostapd_set_privacy(hapd, 0); 381 hostapd_broadcast_wep_clear(hapd); 382 } 383} 384 385 386static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd) 387{ 388 int i; 389 390 hostapd_broadcast_wep_set(hapd); 391 392 if (hapd->conf->ssid.wep.default_len) { 393 hostapd_set_privacy(hapd, 1); 394 return 0; 395 } 396 397 /* 398 * When IEEE 802.1X is not enabled, the driver may need to know how to 399 * set authentication algorithms for static WEP. 400 */ 401 hostapd_drv_set_authmode(hapd, hapd->conf->auth_algs); 402 403 for (i = 0; i < 4; i++) { 404 if (hapd->conf->ssid.wep.key[i] && 405 hostapd_drv_set_key(iface, hapd, WPA_ALG_WEP, NULL, i, 406 i == hapd->conf->ssid.wep.idx, NULL, 0, 407 hapd->conf->ssid.wep.key[i], 408 hapd->conf->ssid.wep.len[i])) { 409 wpa_printf(MSG_WARNING, "Could not set WEP " 410 "encryption."); 411 return -1; 412 } 413 if (hapd->conf->ssid.wep.key[i] && 414 i == hapd->conf->ssid.wep.idx) 415 hostapd_set_privacy(hapd, 1); 416 } 417 418 return 0; 419} 420 421 422static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason) 423{ 424 int ret = 0; 425 u8 addr[ETH_ALEN]; 426 427 if (hostapd_drv_none(hapd) || hapd->drv_priv == NULL) 428 return 0; 429 430 if (!hapd->iface->driver_ap_teardown) { 431 wpa_dbg(hapd->msg_ctx, MSG_DEBUG, 432 "Flushing old station entries"); 433 434 if (hostapd_flush(hapd)) { 435 wpa_msg(hapd->msg_ctx, MSG_WARNING, 436 "Could not connect to kernel driver"); 437 ret = -1; 438 } 439 } 440 wpa_dbg(hapd->msg_ctx, MSG_DEBUG, "Deauthenticate all stations"); 441 os_memset(addr, 0xff, ETH_ALEN); 442 hostapd_drv_sta_deauth(hapd, addr, reason); 443 hostapd_free_stas(hapd); 444 445 return ret; 446} 447 448 449static void hostapd_bss_deinit_no_free(struct hostapd_data *hapd) 450{ 451 hostapd_free_stas(hapd); 452 hostapd_flush_old_stations(hapd, WLAN_REASON_DEAUTH_LEAVING); 453 hostapd_clear_wep(hapd); 454} 455 456 457/** 458 * hostapd_validate_bssid_configuration - Validate BSSID configuration 459 * @iface: Pointer to interface data 460 * Returns: 0 on success, -1 on failure 461 * 462 * This function is used to validate that the configured BSSIDs are valid. 463 */ 464static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface) 465{ 466 u8 mask[ETH_ALEN] = { 0 }; 467 struct hostapd_data *hapd = iface->bss[0]; 468 unsigned int i = iface->conf->num_bss, bits = 0, j; 469 int auto_addr = 0; 470 471 if (hostapd_drv_none(hapd)) 472 return 0; 473 474 /* Generate BSSID mask that is large enough to cover the BSSIDs. */ 475 476 /* Determine the bits necessary to cover the number of BSSIDs. */ 477 for (i--; i; i >>= 1) 478 bits++; 479 480 /* Determine the bits necessary to any configured BSSIDs, 481 if they are higher than the number of BSSIDs. */ 482 for (j = 0; j < iface->conf->num_bss; j++) { 483 if (hostapd_mac_comp_empty(iface->conf->bss[j]->bssid) == 0) { 484 if (j) 485 auto_addr++; 486 continue; 487 } 488 489 for (i = 0; i < ETH_ALEN; i++) { 490 mask[i] |= 491 iface->conf->bss[j]->bssid[i] ^ 492 hapd->own_addr[i]; 493 } 494 } 495 496 if (!auto_addr) 497 goto skip_mask_ext; 498 499 for (i = 0; i < ETH_ALEN && mask[i] == 0; i++) 500 ; 501 j = 0; 502 if (i < ETH_ALEN) { 503 j = (5 - i) * 8; 504 505 while (mask[i] != 0) { 506 mask[i] >>= 1; 507 j++; 508 } 509 } 510 511 if (bits < j) 512 bits = j; 513 514 if (bits > 40) { 515 wpa_printf(MSG_ERROR, "Too many bits in the BSSID mask (%u)", 516 bits); 517 return -1; 518 } 519 520 os_memset(mask, 0xff, ETH_ALEN); 521 j = bits / 8; 522 for (i = 5; i > 5 - j; i--) 523 mask[i] = 0; 524 j = bits % 8; 525 while (j--) 526 mask[i] <<= 1; 527 528skip_mask_ext: 529 wpa_printf(MSG_DEBUG, "BSS count %lu, BSSID mask " MACSTR " (%d bits)", 530 (unsigned long) iface->conf->num_bss, MAC2STR(mask), bits); 531 532 if (!auto_addr) 533 return 0; 534 535 for (i = 0; i < ETH_ALEN; i++) { 536 if ((hapd->own_addr[i] & mask[i]) != hapd->own_addr[i]) { 537 wpa_printf(MSG_ERROR, "Invalid BSSID mask " MACSTR 538 " for start address " MACSTR ".", 539 MAC2STR(mask), MAC2STR(hapd->own_addr)); 540 wpa_printf(MSG_ERROR, "Start address must be the " 541 "first address in the block (i.e., addr " 542 "AND mask == addr)."); 543 return -1; 544 } 545 } 546 547 return 0; 548} 549 550 551static int mac_in_conf(struct hostapd_config *conf, const void *a) 552{ 553 size_t i; 554 555 for (i = 0; i < conf->num_bss; i++) { 556 if (hostapd_mac_comp(conf->bss[i]->bssid, a) == 0) { 557 return 1; 558 } 559 } 560 561 return 0; 562} 563 564 565#ifndef CONFIG_NO_RADIUS 566 567static int hostapd_das_nas_mismatch(struct hostapd_data *hapd, 568 struct radius_das_attrs *attr) 569{ 570 if (attr->nas_identifier && 571 (!hapd->conf->nas_identifier || 572 os_strlen(hapd->conf->nas_identifier) != 573 attr->nas_identifier_len || 574 os_memcmp(hapd->conf->nas_identifier, attr->nas_identifier, 575 attr->nas_identifier_len) != 0)) { 576 wpa_printf(MSG_DEBUG, "RADIUS DAS: NAS-Identifier mismatch"); 577 return 1; 578 } 579 580 if (attr->nas_ip_addr && 581 (hapd->conf->own_ip_addr.af != AF_INET || 582 os_memcmp(&hapd->conf->own_ip_addr.u.v4, attr->nas_ip_addr, 4) != 583 0)) { 584 wpa_printf(MSG_DEBUG, "RADIUS DAS: NAS-IP-Address mismatch"); 585 return 1; 586 } 587 588#ifdef CONFIG_IPV6 589 if (attr->nas_ipv6_addr && 590 (hapd->conf->own_ip_addr.af != AF_INET6 || 591 os_memcmp(&hapd->conf->own_ip_addr.u.v6, attr->nas_ipv6_addr, 16) 592 != 0)) { 593 wpa_printf(MSG_DEBUG, "RADIUS DAS: NAS-IPv6-Address mismatch"); 594 return 1; 595 } 596#endif /* CONFIG_IPV6 */ 597 598 return 0; 599} 600 601 602static struct sta_info * hostapd_das_find_sta(struct hostapd_data *hapd, 603 struct radius_das_attrs *attr) 604{ 605 struct sta_info *sta = NULL; 606 char buf[128]; 607 608 if (attr->sta_addr) 609 sta = ap_get_sta(hapd, attr->sta_addr); 610 611 if (sta == NULL && attr->acct_session_id && 612 attr->acct_session_id_len == 17) { 613 for (sta = hapd->sta_list; sta; sta = sta->next) { 614 os_snprintf(buf, sizeof(buf), "%08X-%08X", 615 sta->acct_session_id_hi, 616 sta->acct_session_id_lo); 617 if (os_memcmp(attr->acct_session_id, buf, 17) == 0) 618 break; 619 } 620 } 621 622 if (sta == NULL && attr->cui) { 623 for (sta = hapd->sta_list; sta; sta = sta->next) { 624 struct wpabuf *cui; 625 cui = ieee802_1x_get_radius_cui(sta->eapol_sm); 626 if (cui && wpabuf_len(cui) == attr->cui_len && 627 os_memcmp(wpabuf_head(cui), attr->cui, 628 attr->cui_len) == 0) 629 break; 630 } 631 } 632 633 if (sta == NULL && attr->user_name) { 634 for (sta = hapd->sta_list; sta; sta = sta->next) { 635 u8 *identity; 636 size_t identity_len; 637 identity = ieee802_1x_get_identity(sta->eapol_sm, 638 &identity_len); 639 if (identity && 640 identity_len == attr->user_name_len && 641 os_memcmp(identity, attr->user_name, identity_len) 642 == 0) 643 break; 644 } 645 } 646 647 return sta; 648} 649 650 651static enum radius_das_res 652hostapd_das_disconnect(void *ctx, struct radius_das_attrs *attr) 653{ 654 struct hostapd_data *hapd = ctx; 655 struct sta_info *sta; 656 657 if (hostapd_das_nas_mismatch(hapd, attr)) 658 return RADIUS_DAS_NAS_MISMATCH; 659 660 sta = hostapd_das_find_sta(hapd, attr); 661 if (sta == NULL) 662 return RADIUS_DAS_SESSION_NOT_FOUND; 663 664 wpa_auth_pmksa_remove(hapd->wpa_auth, sta->addr); 665 666 hostapd_drv_sta_deauth(hapd, sta->addr, 667 WLAN_REASON_PREV_AUTH_NOT_VALID); 668 ap_sta_deauthenticate(hapd, sta, WLAN_REASON_PREV_AUTH_NOT_VALID); 669 670 return RADIUS_DAS_SUCCESS; 671} 672 673#endif /* CONFIG_NO_RADIUS */ 674 675 676/** 677 * hostapd_setup_bss - Per-BSS setup (initialization) 678 * @hapd: Pointer to BSS data 679 * @first: Whether this BSS is the first BSS of an interface; -1 = not first, 680 * but interface may exist 681 * 682 * This function is used to initialize all per-BSS data structures and 683 * resources. This gets called in a loop for each BSS when an interface is 684 * initialized. Most of the modules that are initialized here will be 685 * deinitialized in hostapd_cleanup(). 686 */ 687static int hostapd_setup_bss(struct hostapd_data *hapd, int first) 688{ 689 struct hostapd_bss_config *conf = hapd->conf; 690 u8 ssid[HOSTAPD_MAX_SSID_LEN + 1]; 691 int ssid_len, set_ssid; 692 char force_ifname[IFNAMSIZ]; 693 u8 if_addr[ETH_ALEN]; 694 695 wpa_printf(MSG_DEBUG, "%s(hapd=%p (%s), first=%d)", 696 __func__, hapd, conf->iface, first); 697 698#ifdef EAP_SERVER_TNC 699 if (conf->tnc && tncs_global_init() < 0) { 700 wpa_printf(MSG_ERROR, "Failed to initialize TNCS"); 701 return -1; 702 } 703#endif /* EAP_SERVER_TNC */ 704 705 if (hapd->started) { 706 wpa_printf(MSG_ERROR, "%s: Interface %s was already started", 707 __func__, conf->iface); 708 return -1; 709 } 710 hapd->started = 1; 711 712 if (!first || first == -1) { 713 if (hostapd_mac_comp_empty(conf->bssid) == 0) { 714 /* Allocate the next available BSSID. */ 715 do { 716 inc_byte_array(hapd->own_addr, ETH_ALEN); 717 } while (mac_in_conf(hapd->iconf, hapd->own_addr)); 718 } else { 719 /* Allocate the configured BSSID. */ 720 os_memcpy(hapd->own_addr, conf->bssid, ETH_ALEN); 721 722 if (hostapd_mac_comp(hapd->own_addr, 723 hapd->iface->bss[0]->own_addr) == 724 0) { 725 wpa_printf(MSG_ERROR, "BSS '%s' may not have " 726 "BSSID set to the MAC address of " 727 "the radio", conf->iface); 728 return -1; 729 } 730 } 731 732 hapd->interface_added = 1; 733 if (hostapd_if_add(hapd->iface->bss[0], WPA_IF_AP_BSS, 734 conf->iface, hapd->own_addr, hapd, 735 &hapd->drv_priv, force_ifname, if_addr, 736 conf->bridge[0] ? conf->bridge : NULL, 737 first == -1)) { 738 wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID=" 739 MACSTR ")", MAC2STR(hapd->own_addr)); 740 hapd->interface_added = 0; 741 return -1; 742 } 743 } 744 745 if (conf->wmm_enabled < 0) 746 conf->wmm_enabled = hapd->iconf->ieee80211n; 747 748 hostapd_flush_old_stations(hapd, WLAN_REASON_PREV_AUTH_NOT_VALID); 749 hostapd_set_privacy(hapd, 0); 750 751 hostapd_broadcast_wep_clear(hapd); 752 if (hostapd_setup_encryption(conf->iface, hapd)) 753 return -1; 754 755 /* 756 * Fetch the SSID from the system and use it or, 757 * if one was specified in the config file, verify they 758 * match. 759 */ 760 ssid_len = hostapd_get_ssid(hapd, ssid, sizeof(ssid)); 761 if (ssid_len < 0) { 762 wpa_printf(MSG_ERROR, "Could not read SSID from system"); 763 return -1; 764 } 765 if (conf->ssid.ssid_set) { 766 /* 767 * If SSID is specified in the config file and it differs 768 * from what is being used then force installation of the 769 * new SSID. 770 */ 771 set_ssid = (conf->ssid.ssid_len != (size_t) ssid_len || 772 os_memcmp(conf->ssid.ssid, ssid, ssid_len) != 0); 773 } else { 774 /* 775 * No SSID in the config file; just use the one we got 776 * from the system. 777 */ 778 set_ssid = 0; 779 conf->ssid.ssid_len = ssid_len; 780 os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len); 781 } 782 783 if (!hostapd_drv_none(hapd)) { 784 wpa_printf(MSG_ERROR, "Using interface %s with hwaddr " MACSTR 785 " and ssid \"%s\"", 786 conf->iface, MAC2STR(hapd->own_addr), 787 wpa_ssid_txt(conf->ssid.ssid, conf->ssid.ssid_len)); 788 } 789 790 if (hostapd_setup_wpa_psk(conf)) { 791 wpa_printf(MSG_ERROR, "WPA-PSK setup failed."); 792 return -1; 793 } 794 795 /* Set SSID for the kernel driver (to be used in beacon and probe 796 * response frames) */ 797 if (set_ssid && hostapd_set_ssid(hapd, conf->ssid.ssid, 798 conf->ssid.ssid_len)) { 799 wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver"); 800 return -1; 801 } 802 803 if (wpa_debug_level <= MSG_MSGDUMP) 804 conf->radius->msg_dumps = 1; 805#ifndef CONFIG_NO_RADIUS 806 hapd->radius = radius_client_init(hapd, conf->radius); 807 if (hapd->radius == NULL) { 808 wpa_printf(MSG_ERROR, "RADIUS client initialization failed."); 809 return -1; 810 } 811 812 if (conf->radius_das_port) { 813 struct radius_das_conf das_conf; 814 os_memset(&das_conf, 0, sizeof(das_conf)); 815 das_conf.port = conf->radius_das_port; 816 das_conf.shared_secret = conf->radius_das_shared_secret; 817 das_conf.shared_secret_len = 818 conf->radius_das_shared_secret_len; 819 das_conf.client_addr = &conf->radius_das_client_addr; 820 das_conf.time_window = conf->radius_das_time_window; 821 das_conf.require_event_timestamp = 822 conf->radius_das_require_event_timestamp; 823 das_conf.ctx = hapd; 824 das_conf.disconnect = hostapd_das_disconnect; 825 hapd->radius_das = radius_das_init(&das_conf); 826 if (hapd->radius_das == NULL) { 827 wpa_printf(MSG_ERROR, "RADIUS DAS initialization " 828 "failed."); 829 return -1; 830 } 831 } 832#endif /* CONFIG_NO_RADIUS */ 833 834 if (hostapd_acl_init(hapd)) { 835 wpa_printf(MSG_ERROR, "ACL initialization failed."); 836 return -1; 837 } 838 if (hostapd_init_wps(hapd, conf)) 839 return -1; 840 841 if (authsrv_init(hapd) < 0) 842 return -1; 843 844 if (ieee802_1x_init(hapd)) { 845 wpa_printf(MSG_ERROR, "IEEE 802.1X initialization failed."); 846 return -1; 847 } 848 849 if ((conf->wpa || conf->osen) && hostapd_setup_wpa(hapd)) 850 return -1; 851 852 if (accounting_init(hapd)) { 853 wpa_printf(MSG_ERROR, "Accounting initialization failed."); 854 return -1; 855 } 856 857 if (conf->ieee802_11f && 858 (hapd->iapp = iapp_init(hapd, conf->iapp_iface)) == NULL) { 859 wpa_printf(MSG_ERROR, "IEEE 802.11F (IAPP) initialization " 860 "failed."); 861 return -1; 862 } 863 864#ifdef CONFIG_INTERWORKING 865 if (gas_serv_init(hapd)) { 866 wpa_printf(MSG_ERROR, "GAS server initialization failed"); 867 return -1; 868 } 869 870 if (conf->qos_map_set_len && 871 hostapd_drv_set_qos_map(hapd, conf->qos_map_set, 872 conf->qos_map_set_len)) { 873 wpa_printf(MSG_ERROR, "Failed to initialize QoS Map"); 874 return -1; 875 } 876#endif /* CONFIG_INTERWORKING */ 877 878 if (!hostapd_drv_none(hapd) && vlan_init(hapd)) { 879 wpa_printf(MSG_ERROR, "VLAN initialization failed."); 880 return -1; 881 } 882 883 if (!conf->start_disabled && ieee802_11_set_beacon(hapd) < 0) 884 return -1; 885 886 if (hapd->wpa_auth && wpa_init_keys(hapd->wpa_auth) < 0) 887 return -1; 888 889 if (hapd->driver && hapd->driver->set_operstate) 890 hapd->driver->set_operstate(hapd->drv_priv, 1); 891 892 return 0; 893} 894 895 896static void hostapd_tx_queue_params(struct hostapd_iface *iface) 897{ 898 struct hostapd_data *hapd = iface->bss[0]; 899 int i; 900 struct hostapd_tx_queue_params *p; 901 902 for (i = 0; i < NUM_TX_QUEUES; i++) { 903 p = &iface->conf->tx_queue[i]; 904 905 if (hostapd_set_tx_queue_params(hapd, i, p->aifs, p->cwmin, 906 p->cwmax, p->burst)) { 907 wpa_printf(MSG_DEBUG, "Failed to set TX queue " 908 "parameters for queue %d.", i); 909 /* Continue anyway */ 910 } 911 } 912} 913 914 915static int hostapd_set_acl_list(struct hostapd_data *hapd, 916 struct mac_acl_entry *mac_acl, 917 int n_entries, u8 accept_acl) 918{ 919 struct hostapd_acl_params *acl_params; 920 int i, err; 921 922 acl_params = os_zalloc(sizeof(*acl_params) + 923 (n_entries * sizeof(acl_params->mac_acl[0]))); 924 if (!acl_params) 925 return -ENOMEM; 926 927 for (i = 0; i < n_entries; i++) 928 os_memcpy(acl_params->mac_acl[i].addr, mac_acl[i].addr, 929 ETH_ALEN); 930 931 acl_params->acl_policy = accept_acl; 932 acl_params->num_mac_acl = n_entries; 933 934 err = hostapd_drv_set_acl(hapd, acl_params); 935 936 os_free(acl_params); 937 938 return err; 939} 940 941 942static void hostapd_set_acl(struct hostapd_data *hapd) 943{ 944 struct hostapd_config *conf = hapd->iconf; 945 int err; 946 u8 accept_acl; 947 948 if (hapd->iface->drv_max_acl_mac_addrs == 0) 949 return; 950 951 if (conf->bss[0]->macaddr_acl == DENY_UNLESS_ACCEPTED) { 952 accept_acl = 1; 953 err = hostapd_set_acl_list(hapd, conf->bss[0]->accept_mac, 954 conf->bss[0]->num_accept_mac, 955 accept_acl); 956 if (err) { 957 wpa_printf(MSG_DEBUG, "Failed to set accept acl"); 958 return; 959 } 960 } else if (conf->bss[0]->macaddr_acl == ACCEPT_UNLESS_DENIED) { 961 accept_acl = 0; 962 err = hostapd_set_acl_list(hapd, conf->bss[0]->deny_mac, 963 conf->bss[0]->num_deny_mac, 964 accept_acl); 965 if (err) { 966 wpa_printf(MSG_DEBUG, "Failed to set deny acl"); 967 return; 968 } 969 } 970} 971 972 973static int start_ctrl_iface_bss(struct hostapd_data *hapd) 974{ 975 if (!hapd->iface->interfaces || 976 !hapd->iface->interfaces->ctrl_iface_init) 977 return 0; 978 979 if (hapd->iface->interfaces->ctrl_iface_init(hapd)) { 980 wpa_printf(MSG_ERROR, 981 "Failed to setup control interface for %s", 982 hapd->conf->iface); 983 return -1; 984 } 985 986 return 0; 987} 988 989 990static int start_ctrl_iface(struct hostapd_iface *iface) 991{ 992 size_t i; 993 994 if (!iface->interfaces || !iface->interfaces->ctrl_iface_init) 995 return 0; 996 997 for (i = 0; i < iface->num_bss; i++) { 998 struct hostapd_data *hapd = iface->bss[i]; 999 if (iface->interfaces->ctrl_iface_init(hapd)) { 1000 wpa_printf(MSG_ERROR, 1001 "Failed to setup control interface for %s", 1002 hapd->conf->iface); 1003 return -1; 1004 } 1005 } 1006 1007 return 0; 1008} 1009 1010 1011static void channel_list_update_timeout(void *eloop_ctx, void *timeout_ctx) 1012{ 1013 struct hostapd_iface *iface = eloop_ctx; 1014 1015 if (!iface->wait_channel_update) { 1016 wpa_printf(MSG_INFO, "Channel list update timeout, but interface was not waiting for it"); 1017 return; 1018 } 1019 1020 /* 1021 * It is possible that the existing channel list is acceptable, so try 1022 * to proceed. 1023 */ 1024 wpa_printf(MSG_DEBUG, "Channel list update timeout - try to continue anyway"); 1025 setup_interface2(iface); 1026} 1027 1028 1029void hostapd_channel_list_updated(struct hostapd_iface *iface, int initiator) 1030{ 1031 if (!iface->wait_channel_update || initiator != REGDOM_SET_BY_USER) 1032 return; 1033 1034 wpa_printf(MSG_DEBUG, "Channel list updated - continue setup"); 1035 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); 1036 setup_interface2(iface); 1037} 1038 1039 1040static int setup_interface(struct hostapd_iface *iface) 1041{ 1042 struct hostapd_data *hapd = iface->bss[0]; 1043 size_t i; 1044 1045 /* 1046 * It is possible that setup_interface() is called after the interface 1047 * was disabled etc., in which case driver_ap_teardown is possibly set 1048 * to 1. Clear it here so any other key/station deletion, which is not 1049 * part of a teardown flow, would also call the relevant driver 1050 * callbacks. 1051 */ 1052 iface->driver_ap_teardown = 0; 1053 1054 if (!iface->phy[0]) { 1055 const char *phy = hostapd_drv_get_radio_name(hapd); 1056 if (phy) { 1057 wpa_printf(MSG_DEBUG, "phy: %s", phy); 1058 os_strlcpy(iface->phy, phy, sizeof(iface->phy)); 1059 } 1060 } 1061 1062 /* 1063 * Make sure that all BSSes get configured with a pointer to the same 1064 * driver interface. 1065 */ 1066 for (i = 1; i < iface->num_bss; i++) { 1067 iface->bss[i]->driver = hapd->driver; 1068 iface->bss[i]->drv_priv = hapd->drv_priv; 1069 } 1070 1071 if (hostapd_validate_bssid_configuration(iface)) 1072 return -1; 1073 1074 /* 1075 * Initialize control interfaces early to allow external monitoring of 1076 * channel setup operations that may take considerable amount of time 1077 * especially for DFS cases. 1078 */ 1079 if (start_ctrl_iface(iface)) 1080 return -1; 1081 1082 if (hapd->iconf->country[0] && hapd->iconf->country[1]) { 1083 char country[4], previous_country[4]; 1084 1085 hostapd_set_state(iface, HAPD_IFACE_COUNTRY_UPDATE); 1086 if (hostapd_get_country(hapd, previous_country) < 0) 1087 previous_country[0] = '\0'; 1088 1089 os_memcpy(country, hapd->iconf->country, 3); 1090 country[3] = '\0'; 1091 if (hostapd_set_country(hapd, country) < 0) { 1092 wpa_printf(MSG_ERROR, "Failed to set country code"); 1093 return -1; 1094 } 1095 1096 wpa_printf(MSG_DEBUG, "Previous country code %s, new country code %s", 1097 previous_country, country); 1098 1099 if (os_strncmp(previous_country, country, 2) != 0) { 1100 wpa_printf(MSG_DEBUG, "Continue interface setup after channel list update"); 1101 iface->wait_channel_update = 1; 1102 eloop_register_timeout(5, 0, 1103 channel_list_update_timeout, 1104 iface, NULL); 1105 return 0; 1106 } 1107 } 1108 1109 return setup_interface2(iface); 1110} 1111 1112 1113static int setup_interface2(struct hostapd_iface *iface) 1114{ 1115 iface->wait_channel_update = 0; 1116 1117 if (hostapd_get_hw_features(iface)) { 1118 /* Not all drivers support this yet, so continue without hw 1119 * feature data. */ 1120 } else { 1121 int ret = hostapd_select_hw_mode(iface); 1122 if (ret < 0) { 1123 wpa_printf(MSG_ERROR, "Could not select hw_mode and " 1124 "channel. (%d)", ret); 1125 goto fail; 1126 } 1127 if (ret == 1) { 1128 wpa_printf(MSG_DEBUG, "Interface initialization will be completed in a callback (ACS)"); 1129 return 0; 1130 } 1131 ret = hostapd_check_ht_capab(iface); 1132 if (ret < 0) 1133 goto fail; 1134 if (ret == 1) { 1135 wpa_printf(MSG_DEBUG, "Interface initialization will " 1136 "be completed in a callback"); 1137 return 0; 1138 } 1139 1140 if (iface->conf->ieee80211h) 1141 wpa_printf(MSG_DEBUG, "DFS support is enabled"); 1142 } 1143 return hostapd_setup_interface_complete(iface, 0); 1144 1145fail: 1146 hostapd_set_state(iface, HAPD_IFACE_DISABLED); 1147 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); 1148 if (iface->interfaces && iface->interfaces->terminate_on_error) 1149 eloop_terminate(); 1150 return -1; 1151} 1152 1153 1154/** 1155 * hostapd_setup_interface_complete - Complete interface setup 1156 * 1157 * This function is called when previous steps in the interface setup has been 1158 * completed. This can also start operations, e.g., DFS, that will require 1159 * additional processing before interface is ready to be enabled. Such 1160 * operations will call this function from eloop callbacks when finished. 1161 */ 1162int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err) 1163{ 1164 struct hostapd_data *hapd = iface->bss[0]; 1165 size_t j; 1166 u8 *prev_addr; 1167 1168 if (err) 1169 goto fail; 1170 1171 wpa_printf(MSG_DEBUG, "Completing interface initialization"); 1172 if (iface->conf->channel) { 1173#ifdef NEED_AP_MLME 1174 int res; 1175#endif /* NEED_AP_MLME */ 1176 1177 iface->freq = hostapd_hw_get_freq(hapd, iface->conf->channel); 1178 wpa_printf(MSG_DEBUG, "Mode: %s Channel: %d " 1179 "Frequency: %d MHz", 1180 hostapd_hw_mode_txt(iface->conf->hw_mode), 1181 iface->conf->channel, iface->freq); 1182 1183#ifdef NEED_AP_MLME 1184 /* Handle DFS only if it is not offloaded to the driver */ 1185 if (!(iface->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD)) { 1186 /* Check DFS */ 1187 res = hostapd_handle_dfs(iface); 1188 if (res <= 0) { 1189 if (res < 0) 1190 goto fail; 1191 return res; 1192 } 1193 } 1194#endif /* NEED_AP_MLME */ 1195 1196 if (hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq, 1197 hapd->iconf->channel, 1198 hapd->iconf->ieee80211n, 1199 hapd->iconf->ieee80211ac, 1200 hapd->iconf->secondary_channel, 1201 hapd->iconf->vht_oper_chwidth, 1202 hapd->iconf->vht_oper_centr_freq_seg0_idx, 1203 hapd->iconf->vht_oper_centr_freq_seg1_idx)) { 1204 wpa_printf(MSG_ERROR, "Could not set channel for " 1205 "kernel driver"); 1206 goto fail; 1207 } 1208 } 1209 1210 if (iface->current_mode) { 1211 if (hostapd_prepare_rates(iface, iface->current_mode)) { 1212 wpa_printf(MSG_ERROR, "Failed to prepare rates " 1213 "table."); 1214 hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, 1215 HOSTAPD_LEVEL_WARNING, 1216 "Failed to prepare rates table."); 1217 goto fail; 1218 } 1219 } 1220 1221 if (hapd->iconf->rts_threshold > -1 && 1222 hostapd_set_rts(hapd, hapd->iconf->rts_threshold)) { 1223 wpa_printf(MSG_ERROR, "Could not set RTS threshold for " 1224 "kernel driver"); 1225 goto fail; 1226 } 1227 1228 if (hapd->iconf->fragm_threshold > -1 && 1229 hostapd_set_frag(hapd, hapd->iconf->fragm_threshold)) { 1230 wpa_printf(MSG_ERROR, "Could not set fragmentation threshold " 1231 "for kernel driver"); 1232 goto fail; 1233 } 1234 1235 prev_addr = hapd->own_addr; 1236 1237 for (j = 0; j < iface->num_bss; j++) { 1238 hapd = iface->bss[j]; 1239 if (j) 1240 os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN); 1241 if (hostapd_setup_bss(hapd, j == 0)) { 1242 do { 1243 hapd = iface->bss[j]; 1244 hostapd_bss_deinit_no_free(hapd); 1245 hostapd_free_hapd_data(hapd); 1246 } while (j-- > 0); 1247 goto fail; 1248 } 1249 if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) 1250 prev_addr = hapd->own_addr; 1251 } 1252 hapd = iface->bss[0]; 1253 1254 hostapd_tx_queue_params(iface); 1255 1256 ap_list_init(iface); 1257 1258 hostapd_set_acl(hapd); 1259 1260 if (hostapd_driver_commit(hapd) < 0) { 1261 wpa_printf(MSG_ERROR, "%s: Failed to commit driver " 1262 "configuration", __func__); 1263 goto fail; 1264 } 1265 1266 /* 1267 * WPS UPnP module can be initialized only when the "upnp_iface" is up. 1268 * If "interface" and "upnp_iface" are the same (e.g., non-bridge 1269 * mode), the interface is up only after driver_commit, so initialize 1270 * WPS after driver_commit. 1271 */ 1272 for (j = 0; j < iface->num_bss; j++) { 1273 if (hostapd_init_wps_complete(iface->bss[j])) 1274 goto fail; 1275 } 1276 1277 hostapd_set_state(iface, HAPD_IFACE_ENABLED); 1278 wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_ENABLED); 1279 if (hapd->setup_complete_cb) 1280 hapd->setup_complete_cb(hapd->setup_complete_cb_ctx); 1281 1282 wpa_printf(MSG_DEBUG, "%s: Setup of interface done.", 1283 iface->bss[0]->conf->iface); 1284 if (iface->interfaces && iface->interfaces->terminate_on_error > 0) 1285 iface->interfaces->terminate_on_error--; 1286 1287 return 0; 1288 1289fail: 1290 wpa_printf(MSG_ERROR, "Interface initialization failed"); 1291 hostapd_set_state(iface, HAPD_IFACE_DISABLED); 1292 wpa_msg(hapd->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); 1293 if (iface->interfaces && iface->interfaces->terminate_on_error) 1294 eloop_terminate(); 1295 return -1; 1296} 1297 1298 1299/** 1300 * hostapd_setup_interface - Setup of an interface 1301 * @iface: Pointer to interface data. 1302 * Returns: 0 on success, -1 on failure 1303 * 1304 * Initializes the driver interface, validates the configuration, 1305 * and sets driver parameters based on the configuration. 1306 * Flushes old stations, sets the channel, encryption, 1307 * beacons, and WDS links based on the configuration. 1308 * 1309 * If interface setup requires more time, e.g., to perform HT co-ex scans, ACS, 1310 * or DFS operations, this function returns 0 before such operations have been 1311 * completed. The pending operations are registered into eloop and will be 1312 * completed from eloop callbacks. Those callbacks end up calling 1313 * hostapd_setup_interface_complete() once setup has been completed. 1314 */ 1315int hostapd_setup_interface(struct hostapd_iface *iface) 1316{ 1317 int ret; 1318 1319 ret = setup_interface(iface); 1320 if (ret) { 1321 wpa_printf(MSG_ERROR, "%s: Unable to setup interface.", 1322 iface->bss[0]->conf->iface); 1323 return -1; 1324 } 1325 1326 return 0; 1327} 1328 1329 1330/** 1331 * hostapd_alloc_bss_data - Allocate and initialize per-BSS data 1332 * @hapd_iface: Pointer to interface data 1333 * @conf: Pointer to per-interface configuration 1334 * @bss: Pointer to per-BSS configuration for this BSS 1335 * Returns: Pointer to allocated BSS data 1336 * 1337 * This function is used to allocate per-BSS data structure. This data will be 1338 * freed after hostapd_cleanup() is called for it during interface 1339 * deinitialization. 1340 */ 1341struct hostapd_data * 1342hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, 1343 struct hostapd_config *conf, 1344 struct hostapd_bss_config *bss) 1345{ 1346 struct hostapd_data *hapd; 1347 1348 hapd = os_zalloc(sizeof(*hapd)); 1349 if (hapd == NULL) 1350 return NULL; 1351 1352 hapd->new_assoc_sta_cb = hostapd_new_assoc_sta; 1353 hapd->iconf = conf; 1354 hapd->conf = bss; 1355 hapd->iface = hapd_iface; 1356 hapd->driver = hapd->iconf->driver; 1357 hapd->ctrl_sock = -1; 1358 1359 return hapd; 1360} 1361 1362 1363static void hostapd_bss_deinit(struct hostapd_data *hapd) 1364{ 1365 wpa_printf(MSG_DEBUG, "%s: deinit bss %s", __func__, 1366 hapd->conf->iface); 1367 hostapd_bss_deinit_no_free(hapd); 1368 hostapd_cleanup(hapd); 1369} 1370 1371 1372void hostapd_interface_deinit(struct hostapd_iface *iface) 1373{ 1374 int j; 1375 1376 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); 1377 if (iface == NULL) 1378 return; 1379 1380#ifdef CONFIG_IEEE80211N 1381#ifdef NEED_AP_MLME 1382 hostapd_stop_setup_timers(iface); 1383 eloop_cancel_timeout(ap_ht2040_timeout, iface, NULL); 1384#endif /* NEED_AP_MLME */ 1385#endif /* CONFIG_IEEE80211N */ 1386 eloop_cancel_timeout(channel_list_update_timeout, iface, NULL); 1387 iface->wait_channel_update = 0; 1388 1389 for (j = iface->num_bss - 1; j >= 0; j--) 1390 hostapd_bss_deinit(iface->bss[j]); 1391} 1392 1393 1394void hostapd_interface_free(struct hostapd_iface *iface) 1395{ 1396 size_t j; 1397 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); 1398 for (j = 0; j < iface->num_bss; j++) { 1399 wpa_printf(MSG_DEBUG, "%s: free hapd %p", 1400 __func__, iface->bss[j]); 1401 os_free(iface->bss[j]); 1402 } 1403 hostapd_cleanup_iface(iface); 1404} 1405 1406 1407/** 1408 * hostapd_init - Allocate and initialize per-interface data 1409 * @config_file: Path to the configuration file 1410 * Returns: Pointer to the allocated interface data or %NULL on failure 1411 * 1412 * This function is used to allocate main data structures for per-interface 1413 * data. The allocated data buffer will be freed by calling 1414 * hostapd_cleanup_iface(). 1415 */ 1416struct hostapd_iface * hostapd_init(struct hapd_interfaces *interfaces, 1417 const char *config_file) 1418{ 1419 struct hostapd_iface *hapd_iface = NULL; 1420 struct hostapd_config *conf = NULL; 1421 struct hostapd_data *hapd; 1422 size_t i; 1423 1424 hapd_iface = os_zalloc(sizeof(*hapd_iface)); 1425 if (hapd_iface == NULL) 1426 goto fail; 1427 1428 hapd_iface->config_fname = os_strdup(config_file); 1429 if (hapd_iface->config_fname == NULL) 1430 goto fail; 1431 1432 conf = interfaces->config_read_cb(hapd_iface->config_fname); 1433 if (conf == NULL) 1434 goto fail; 1435 hapd_iface->conf = conf; 1436 1437 hapd_iface->num_bss = conf->num_bss; 1438 hapd_iface->bss = os_calloc(conf->num_bss, 1439 sizeof(struct hostapd_data *)); 1440 if (hapd_iface->bss == NULL) 1441 goto fail; 1442 1443 for (i = 0; i < conf->num_bss; i++) { 1444 hapd = hapd_iface->bss[i] = 1445 hostapd_alloc_bss_data(hapd_iface, conf, 1446 conf->bss[i]); 1447 if (hapd == NULL) 1448 goto fail; 1449 hapd->msg_ctx = hapd; 1450 } 1451 1452 return hapd_iface; 1453 1454fail: 1455 wpa_printf(MSG_ERROR, "Failed to set up interface with %s", 1456 config_file); 1457 if (conf) 1458 hostapd_config_free(conf); 1459 if (hapd_iface) { 1460 os_free(hapd_iface->config_fname); 1461 os_free(hapd_iface->bss); 1462 wpa_printf(MSG_DEBUG, "%s: free iface %p", 1463 __func__, hapd_iface); 1464 os_free(hapd_iface); 1465 } 1466 return NULL; 1467} 1468 1469 1470static int ifname_in_use(struct hapd_interfaces *interfaces, const char *ifname) 1471{ 1472 size_t i, j; 1473 1474 for (i = 0; i < interfaces->count; i++) { 1475 struct hostapd_iface *iface = interfaces->iface[i]; 1476 for (j = 0; j < iface->num_bss; j++) { 1477 struct hostapd_data *hapd = iface->bss[j]; 1478 if (os_strcmp(ifname, hapd->conf->iface) == 0) 1479 return 1; 1480 } 1481 } 1482 1483 return 0; 1484} 1485 1486 1487/** 1488 * hostapd_interface_init_bss - Read configuration file and init BSS data 1489 * 1490 * This function is used to parse configuration file for a BSS. This BSS is 1491 * added to an existing interface sharing the same radio (if any) or a new 1492 * interface is created if this is the first interface on a radio. This 1493 * allocate memory for the BSS. No actual driver operations are started. 1494 * 1495 * This is similar to hostapd_interface_init(), but for a case where the 1496 * configuration is used to add a single BSS instead of all BSSes for a radio. 1497 */ 1498struct hostapd_iface * 1499hostapd_interface_init_bss(struct hapd_interfaces *interfaces, const char *phy, 1500 const char *config_fname, int debug) 1501{ 1502 struct hostapd_iface *new_iface = NULL, *iface = NULL; 1503 struct hostapd_data *hapd; 1504 int k; 1505 size_t i, bss_idx; 1506 1507 if (!phy || !*phy) 1508 return NULL; 1509 1510 for (i = 0; i < interfaces->count; i++) { 1511 if (os_strcmp(interfaces->iface[i]->phy, phy) == 0) { 1512 iface = interfaces->iface[i]; 1513 break; 1514 } 1515 } 1516 1517 wpa_printf(MSG_INFO, "Configuration file: %s (phy %s)%s", 1518 config_fname, phy, iface ? "" : " --> new PHY"); 1519 if (iface) { 1520 struct hostapd_config *conf; 1521 struct hostapd_bss_config **tmp_conf; 1522 struct hostapd_data **tmp_bss; 1523 struct hostapd_bss_config *bss; 1524 const char *ifname; 1525 1526 /* Add new BSS to existing iface */ 1527 conf = interfaces->config_read_cb(config_fname); 1528 if (conf == NULL) 1529 return NULL; 1530 if (conf->num_bss > 1) { 1531 wpa_printf(MSG_ERROR, "Multiple BSSes specified in BSS-config"); 1532 hostapd_config_free(conf); 1533 return NULL; 1534 } 1535 1536 ifname = conf->bss[0]->iface; 1537 if (ifname[0] != '\0' && ifname_in_use(interfaces, ifname)) { 1538 wpa_printf(MSG_ERROR, 1539 "Interface name %s already in use", ifname); 1540 hostapd_config_free(conf); 1541 return NULL; 1542 } 1543 1544 tmp_conf = os_realloc_array( 1545 iface->conf->bss, iface->conf->num_bss + 1, 1546 sizeof(struct hostapd_bss_config *)); 1547 tmp_bss = os_realloc_array(iface->bss, iface->num_bss + 1, 1548 sizeof(struct hostapd_data *)); 1549 if (tmp_bss) 1550 iface->bss = tmp_bss; 1551 if (tmp_conf) { 1552 iface->conf->bss = tmp_conf; 1553 iface->conf->last_bss = tmp_conf[0]; 1554 } 1555 if (tmp_bss == NULL || tmp_conf == NULL) { 1556 hostapd_config_free(conf); 1557 return NULL; 1558 } 1559 bss = iface->conf->bss[iface->conf->num_bss] = conf->bss[0]; 1560 iface->conf->num_bss++; 1561 1562 hapd = hostapd_alloc_bss_data(iface, iface->conf, bss); 1563 if (hapd == NULL) { 1564 iface->conf->num_bss--; 1565 hostapd_config_free(conf); 1566 return NULL; 1567 } 1568 iface->conf->last_bss = bss; 1569 iface->bss[iface->num_bss] = hapd; 1570 hapd->msg_ctx = hapd; 1571 1572 bss_idx = iface->num_bss++; 1573 conf->num_bss--; 1574 conf->bss[0] = NULL; 1575 hostapd_config_free(conf); 1576 } else { 1577 /* Add a new iface with the first BSS */ 1578 new_iface = iface = hostapd_init(interfaces, config_fname); 1579 if (!iface) 1580 return NULL; 1581 os_strlcpy(iface->phy, phy, sizeof(iface->phy)); 1582 iface->interfaces = interfaces; 1583 bss_idx = 0; 1584 } 1585 1586 for (k = 0; k < debug; k++) { 1587 if (iface->bss[bss_idx]->conf->logger_stdout_level > 0) 1588 iface->bss[bss_idx]->conf->logger_stdout_level--; 1589 } 1590 1591 if (iface->conf->bss[bss_idx]->iface[0] == '\0' && 1592 !hostapd_drv_none(iface->bss[bss_idx])) { 1593 wpa_printf(MSG_ERROR, "Interface name not specified in %s", 1594 config_fname); 1595 if (new_iface) 1596 hostapd_interface_deinit_free(new_iface); 1597 return NULL; 1598 } 1599 1600 return iface; 1601} 1602 1603 1604void hostapd_interface_deinit_free(struct hostapd_iface *iface) 1605{ 1606 const struct wpa_driver_ops *driver; 1607 void *drv_priv; 1608 1609 wpa_printf(MSG_DEBUG, "%s(%p)", __func__, iface); 1610 if (iface == NULL) 1611 return; 1612 wpa_printf(MSG_DEBUG, "%s: num_bss=%u conf->num_bss=%u", 1613 __func__, (unsigned int) iface->num_bss, 1614 (unsigned int) iface->conf->num_bss); 1615 driver = iface->bss[0]->driver; 1616 drv_priv = iface->bss[0]->drv_priv; 1617 hostapd_interface_deinit(iface); 1618 wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit", 1619 __func__, driver, drv_priv); 1620 if (driver && driver->hapd_deinit && drv_priv) { 1621 driver->hapd_deinit(drv_priv); 1622 iface->bss[0]->drv_priv = NULL; 1623 } 1624 hostapd_interface_free(iface); 1625} 1626 1627 1628static void hostapd_deinit_driver(const struct wpa_driver_ops *driver, 1629 void *drv_priv, 1630 struct hostapd_iface *hapd_iface) 1631{ 1632 size_t j; 1633 1634 wpa_printf(MSG_DEBUG, "%s: driver=%p drv_priv=%p -> hapd_deinit", 1635 __func__, driver, drv_priv); 1636 if (driver && driver->hapd_deinit && drv_priv) { 1637 driver->hapd_deinit(drv_priv); 1638 for (j = 0; j < hapd_iface->num_bss; j++) { 1639 wpa_printf(MSG_DEBUG, "%s:bss[%d]->drv_priv=%p", 1640 __func__, (int) j, 1641 hapd_iface->bss[j]->drv_priv); 1642 if (hapd_iface->bss[j]->drv_priv == drv_priv) 1643 hapd_iface->bss[j]->drv_priv = NULL; 1644 } 1645 } 1646} 1647 1648 1649int hostapd_enable_iface(struct hostapd_iface *hapd_iface) 1650{ 1651 size_t j; 1652 1653 if (hapd_iface->bss[0]->drv_priv != NULL) { 1654 wpa_printf(MSG_ERROR, "Interface %s already enabled", 1655 hapd_iface->conf->bss[0]->iface); 1656 return -1; 1657 } 1658 1659 wpa_printf(MSG_DEBUG, "Enable interface %s", 1660 hapd_iface->conf->bss[0]->iface); 1661 1662 for (j = 0; j < hapd_iface->num_bss; j++) 1663 hostapd_set_security_params(hapd_iface->conf->bss[j], 1); 1664 if (hostapd_config_check(hapd_iface->conf, 1) < 0) { 1665 wpa_printf(MSG_INFO, "Invalid configuration - cannot enable"); 1666 return -1; 1667 } 1668 1669 if (hapd_iface->interfaces == NULL || 1670 hapd_iface->interfaces->driver_init == NULL || 1671 hapd_iface->interfaces->driver_init(hapd_iface)) 1672 return -1; 1673 1674 if (hostapd_setup_interface(hapd_iface)) { 1675 hostapd_deinit_driver(hapd_iface->bss[0]->driver, 1676 hapd_iface->bss[0]->drv_priv, 1677 hapd_iface); 1678 return -1; 1679 } 1680 1681 return 0; 1682} 1683 1684 1685int hostapd_reload_iface(struct hostapd_iface *hapd_iface) 1686{ 1687 size_t j; 1688 1689 wpa_printf(MSG_DEBUG, "Reload interface %s", 1690 hapd_iface->conf->bss[0]->iface); 1691 for (j = 0; j < hapd_iface->num_bss; j++) 1692 hostapd_set_security_params(hapd_iface->conf->bss[j], 1); 1693 if (hostapd_config_check(hapd_iface->conf, 1) < 0) { 1694 wpa_printf(MSG_ERROR, "Updated configuration is invalid"); 1695 return -1; 1696 } 1697 hostapd_clear_old(hapd_iface); 1698 for (j = 0; j < hapd_iface->num_bss; j++) 1699 hostapd_reload_bss(hapd_iface->bss[j]); 1700 1701 return 0; 1702} 1703 1704 1705int hostapd_disable_iface(struct hostapd_iface *hapd_iface) 1706{ 1707 size_t j; 1708 const struct wpa_driver_ops *driver; 1709 void *drv_priv; 1710 1711 if (hapd_iface == NULL) 1712 return -1; 1713 1714 if (hapd_iface->bss[0]->drv_priv == NULL) { 1715 wpa_printf(MSG_INFO, "Interface %s already disabled", 1716 hapd_iface->conf->bss[0]->iface); 1717 return -1; 1718 } 1719 1720 wpa_msg(hapd_iface->bss[0]->msg_ctx, MSG_INFO, AP_EVENT_DISABLED); 1721 driver = hapd_iface->bss[0]->driver; 1722 drv_priv = hapd_iface->bss[0]->drv_priv; 1723 1724 hapd_iface->driver_ap_teardown = 1725 !!(hapd_iface->drv_flags & 1726 WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT); 1727 1728 /* same as hostapd_interface_deinit without deinitializing ctrl-iface */ 1729 for (j = 0; j < hapd_iface->num_bss; j++) { 1730 struct hostapd_data *hapd = hapd_iface->bss[j]; 1731 hostapd_bss_deinit_no_free(hapd); 1732 hostapd_free_hapd_data(hapd); 1733 } 1734 1735 hostapd_deinit_driver(driver, drv_priv, hapd_iface); 1736 1737 /* From hostapd_cleanup_iface: These were initialized in 1738 * hostapd_setup_interface and hostapd_setup_interface_complete 1739 */ 1740 hostapd_cleanup_iface_partial(hapd_iface); 1741 1742 wpa_printf(MSG_DEBUG, "Interface %s disabled", 1743 hapd_iface->bss[0]->conf->iface); 1744 hostapd_set_state(hapd_iface, HAPD_IFACE_DISABLED); 1745 return 0; 1746} 1747 1748 1749static struct hostapd_iface * 1750hostapd_iface_alloc(struct hapd_interfaces *interfaces) 1751{ 1752 struct hostapd_iface **iface, *hapd_iface; 1753 1754 iface = os_realloc_array(interfaces->iface, interfaces->count + 1, 1755 sizeof(struct hostapd_iface *)); 1756 if (iface == NULL) 1757 return NULL; 1758 interfaces->iface = iface; 1759 hapd_iface = interfaces->iface[interfaces->count] = 1760 os_zalloc(sizeof(*hapd_iface)); 1761 if (hapd_iface == NULL) { 1762 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory for " 1763 "the interface", __func__); 1764 return NULL; 1765 } 1766 interfaces->count++; 1767 hapd_iface->interfaces = interfaces; 1768 1769 return hapd_iface; 1770} 1771 1772 1773static struct hostapd_config * 1774hostapd_config_alloc(struct hapd_interfaces *interfaces, const char *ifname, 1775 const char *ctrl_iface) 1776{ 1777 struct hostapd_bss_config *bss; 1778 struct hostapd_config *conf; 1779 1780 /* Allocates memory for bss and conf */ 1781 conf = hostapd_config_defaults(); 1782 if (conf == NULL) { 1783 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory for " 1784 "configuration", __func__); 1785 return NULL; 1786 } 1787 1788 conf->driver = wpa_drivers[0]; 1789 if (conf->driver == NULL) { 1790 wpa_printf(MSG_ERROR, "No driver wrappers registered!"); 1791 hostapd_config_free(conf); 1792 return NULL; 1793 } 1794 1795 bss = conf->last_bss = conf->bss[0]; 1796 1797 os_strlcpy(bss->iface, ifname, sizeof(bss->iface)); 1798 bss->ctrl_interface = os_strdup(ctrl_iface); 1799 if (bss->ctrl_interface == NULL) { 1800 hostapd_config_free(conf); 1801 return NULL; 1802 } 1803 1804 /* Reading configuration file skipped, will be done in SET! 1805 * From reading the configuration till the end has to be done in 1806 * SET 1807 */ 1808 return conf; 1809} 1810 1811 1812static struct hostapd_iface * hostapd_data_alloc( 1813 struct hapd_interfaces *interfaces, struct hostapd_config *conf) 1814{ 1815 size_t i; 1816 struct hostapd_iface *hapd_iface = 1817 interfaces->iface[interfaces->count - 1]; 1818 struct hostapd_data *hapd; 1819 1820 hapd_iface->conf = conf; 1821 hapd_iface->num_bss = conf->num_bss; 1822 1823 hapd_iface->bss = os_zalloc(conf->num_bss * 1824 sizeof(struct hostapd_data *)); 1825 if (hapd_iface->bss == NULL) 1826 return NULL; 1827 1828 for (i = 0; i < conf->num_bss; i++) { 1829 hapd = hapd_iface->bss[i] = 1830 hostapd_alloc_bss_data(hapd_iface, conf, conf->bss[i]); 1831 if (hapd == NULL) 1832 return NULL; 1833 hapd->msg_ctx = hapd; 1834 } 1835 1836 hapd_iface->interfaces = interfaces; 1837 1838 return hapd_iface; 1839} 1840 1841 1842int hostapd_add_iface(struct hapd_interfaces *interfaces, char *buf) 1843{ 1844 struct hostapd_config *conf = NULL; 1845 struct hostapd_iface *hapd_iface = NULL, *new_iface = NULL; 1846 struct hostapd_data *hapd; 1847 char *ptr; 1848 size_t i, j; 1849 const char *conf_file = NULL, *phy_name = NULL; 1850 1851 if (os_strncmp(buf, "bss_config=", 11) == 0) { 1852 char *pos; 1853 phy_name = buf + 11; 1854 pos = os_strchr(phy_name, ':'); 1855 if (!pos) 1856 return -1; 1857 *pos++ = '\0'; 1858 conf_file = pos; 1859 if (!os_strlen(conf_file)) 1860 return -1; 1861 1862 hapd_iface = hostapd_interface_init_bss(interfaces, phy_name, 1863 conf_file, 0); 1864 if (!hapd_iface) 1865 return -1; 1866 for (j = 0; j < interfaces->count; j++) { 1867 if (interfaces->iface[j] == hapd_iface) 1868 break; 1869 } 1870 if (j == interfaces->count) { 1871 struct hostapd_iface **tmp; 1872 tmp = os_realloc_array(interfaces->iface, 1873 interfaces->count + 1, 1874 sizeof(struct hostapd_iface *)); 1875 if (!tmp) { 1876 hostapd_interface_deinit_free(hapd_iface); 1877 return -1; 1878 } 1879 interfaces->iface = tmp; 1880 interfaces->iface[interfaces->count++] = hapd_iface; 1881 new_iface = hapd_iface; 1882 } 1883 1884 if (new_iface) { 1885 if (interfaces->driver_init(hapd_iface) || 1886 hostapd_setup_interface(hapd_iface)) { 1887 interfaces->count--; 1888 goto fail; 1889 } 1890 } else { 1891 /* Assign new BSS with bss[0]'s driver info */ 1892 hapd = hapd_iface->bss[hapd_iface->num_bss - 1]; 1893 hapd->driver = hapd_iface->bss[0]->driver; 1894 hapd->drv_priv = hapd_iface->bss[0]->drv_priv; 1895 os_memcpy(hapd->own_addr, hapd_iface->bss[0]->own_addr, 1896 ETH_ALEN); 1897 1898 if (start_ctrl_iface_bss(hapd) < 0 || 1899 (hapd_iface->state == HAPD_IFACE_ENABLED && 1900 hostapd_setup_bss(hapd, -1))) { 1901 hostapd_cleanup(hapd); 1902 hapd_iface->bss[hapd_iface->num_bss - 1] = NULL; 1903 hapd_iface->conf->num_bss--; 1904 hapd_iface->num_bss--; 1905 wpa_printf(MSG_DEBUG, "%s: free hapd %p %s", 1906 __func__, hapd, hapd->conf->iface); 1907 os_free(hapd); 1908 return -1; 1909 } 1910 } 1911 return 0; 1912 } 1913 1914 ptr = os_strchr(buf, ' '); 1915 if (ptr == NULL) 1916 return -1; 1917 *ptr++ = '\0'; 1918 1919 if (os_strncmp(ptr, "config=", 7) == 0) 1920 conf_file = ptr + 7; 1921 1922 for (i = 0; i < interfaces->count; i++) { 1923 if (!os_strcmp(interfaces->iface[i]->conf->bss[0]->iface, 1924 buf)) { 1925 wpa_printf(MSG_INFO, "Cannot add interface - it " 1926 "already exists"); 1927 return -1; 1928 } 1929 } 1930 1931 hapd_iface = hostapd_iface_alloc(interfaces); 1932 if (hapd_iface == NULL) { 1933 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory " 1934 "for interface", __func__); 1935 goto fail; 1936 } 1937 1938 if (conf_file && interfaces->config_read_cb) { 1939 conf = interfaces->config_read_cb(conf_file); 1940 if (conf && conf->bss) 1941 os_strlcpy(conf->bss[0]->iface, buf, 1942 sizeof(conf->bss[0]->iface)); 1943 } else 1944 conf = hostapd_config_alloc(interfaces, buf, ptr); 1945 if (conf == NULL || conf->bss == NULL) { 1946 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory " 1947 "for configuration", __func__); 1948 goto fail; 1949 } 1950 1951 hapd_iface = hostapd_data_alloc(interfaces, conf); 1952 if (hapd_iface == NULL) { 1953 wpa_printf(MSG_ERROR, "%s: Failed to allocate memory " 1954 "for hostapd", __func__); 1955 goto fail; 1956 } 1957 1958 if (start_ctrl_iface(hapd_iface) < 0) 1959 goto fail; 1960 1961 wpa_printf(MSG_INFO, "Add interface '%s'", conf->bss[0]->iface); 1962 1963 return 0; 1964 1965fail: 1966 if (conf) 1967 hostapd_config_free(conf); 1968 if (hapd_iface) { 1969 if (hapd_iface->bss) { 1970 for (i = 0; i < hapd_iface->num_bss; i++) { 1971 hapd = hapd_iface->bss[i]; 1972 if (!hapd) 1973 continue; 1974 if (hapd_iface->interfaces && 1975 hapd_iface->interfaces->ctrl_iface_deinit) 1976 hapd_iface->interfaces-> 1977 ctrl_iface_deinit(hapd); 1978 wpa_printf(MSG_DEBUG, "%s: free hapd %p (%s)", 1979 __func__, hapd_iface->bss[i], 1980 hapd->conf->iface); 1981 os_free(hapd); 1982 hapd_iface->bss[i] = NULL; 1983 } 1984 os_free(hapd_iface->bss); 1985 } 1986 wpa_printf(MSG_DEBUG, "%s: free iface %p", 1987 __func__, hapd_iface); 1988 os_free(hapd_iface); 1989 } 1990 return -1; 1991} 1992 1993 1994static int hostapd_remove_bss(struct hostapd_iface *iface, unsigned int idx) 1995{ 1996 size_t i; 1997 1998 wpa_printf(MSG_INFO, "Remove BSS '%s'", iface->conf->bss[idx]->iface); 1999 2000 /* Remove hostapd_data only if it has already been initialized */ 2001 if (idx < iface->num_bss) { 2002 struct hostapd_data *hapd = iface->bss[idx]; 2003 2004 hostapd_bss_deinit(hapd); 2005 wpa_printf(MSG_DEBUG, "%s: free hapd %p (%s)", 2006 __func__, hapd, hapd->conf->iface); 2007 hostapd_config_free_bss(hapd->conf); 2008 os_free(hapd); 2009 2010 iface->num_bss--; 2011 2012 for (i = idx; i < iface->num_bss; i++) 2013 iface->bss[i] = iface->bss[i + 1]; 2014 } else { 2015 hostapd_config_free_bss(iface->conf->bss[idx]); 2016 iface->conf->bss[idx] = NULL; 2017 } 2018 2019 iface->conf->num_bss--; 2020 for (i = idx; i < iface->conf->num_bss; i++) 2021 iface->conf->bss[i] = iface->conf->bss[i + 1]; 2022 2023 return 0; 2024} 2025 2026 2027int hostapd_remove_iface(struct hapd_interfaces *interfaces, char *buf) 2028{ 2029 struct hostapd_iface *hapd_iface; 2030 size_t i, j, k = 0; 2031 2032 for (i = 0; i < interfaces->count; i++) { 2033 hapd_iface = interfaces->iface[i]; 2034 if (hapd_iface == NULL) 2035 return -1; 2036 if (!os_strcmp(hapd_iface->conf->bss[0]->iface, buf)) { 2037 wpa_printf(MSG_INFO, "Remove interface '%s'", buf); 2038 hapd_iface->driver_ap_teardown = 2039 !!(hapd_iface->drv_flags & 2040 WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT); 2041 2042 hostapd_interface_deinit_free(hapd_iface); 2043 k = i; 2044 while (k < (interfaces->count - 1)) { 2045 interfaces->iface[k] = 2046 interfaces->iface[k + 1]; 2047 k++; 2048 } 2049 interfaces->count--; 2050 return 0; 2051 } 2052 2053 for (j = 0; j < hapd_iface->conf->num_bss; j++) { 2054 if (!os_strcmp(hapd_iface->conf->bss[j]->iface, buf)) { 2055 hapd_iface->driver_ap_teardown = 2056 !(hapd_iface->drv_flags & 2057 WPA_DRIVER_FLAGS_AP_TEARDOWN_SUPPORT); 2058 return hostapd_remove_bss(hapd_iface, j); 2059 } 2060 } 2061 } 2062 return -1; 2063} 2064 2065 2066/** 2067 * hostapd_new_assoc_sta - Notify that a new station associated with the AP 2068 * @hapd: Pointer to BSS data 2069 * @sta: Pointer to the associated STA data 2070 * @reassoc: 1 to indicate this was a re-association; 0 = first association 2071 * 2072 * This function will be called whenever a station associates with the AP. It 2073 * can be called from ieee802_11.c for drivers that export MLME to hostapd and 2074 * from drv_callbacks.c based on driver events for drivers that take care of 2075 * management frames (IEEE 802.11 authentication and association) internally. 2076 */ 2077void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, 2078 int reassoc) 2079{ 2080 if (hapd->tkip_countermeasures) { 2081 hostapd_drv_sta_deauth(hapd, sta->addr, 2082 WLAN_REASON_MICHAEL_MIC_FAILURE); 2083 return; 2084 } 2085 2086 hostapd_prune_associations(hapd, sta->addr); 2087 2088 /* IEEE 802.11F (IAPP) */ 2089 if (hapd->conf->ieee802_11f) 2090 iapp_new_station(hapd->iapp, sta); 2091 2092#ifdef CONFIG_P2P 2093 if (sta->p2p_ie == NULL && !sta->no_p2p_set) { 2094 sta->no_p2p_set = 1; 2095 hapd->num_sta_no_p2p++; 2096 if (hapd->num_sta_no_p2p == 1) 2097 hostapd_p2p_non_p2p_sta_connected(hapd); 2098 } 2099#endif /* CONFIG_P2P */ 2100 2101 /* Start accounting here, if IEEE 802.1X and WPA are not used. 2102 * IEEE 802.1X/WPA code will start accounting after the station has 2103 * been authorized. */ 2104 if (!hapd->conf->ieee802_1x && !hapd->conf->wpa && !hapd->conf->osen) { 2105 ap_sta_set_authorized(hapd, sta, 1); 2106 os_get_reltime(&sta->connected_time); 2107 accounting_sta_start(hapd, sta); 2108 } 2109 2110 /* Start IEEE 802.1X authentication process for new stations */ 2111 ieee802_1x_new_station(hapd, sta); 2112 if (reassoc) { 2113 if (sta->auth_alg != WLAN_AUTH_FT && 2114 !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) 2115 wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH); 2116 } else 2117 wpa_auth_sta_associated(hapd->wpa_auth, sta->wpa_sm); 2118 2119 if (!(hapd->iface->drv_flags & WPA_DRIVER_FLAGS_INACTIVITY_TIMER)) { 2120 wpa_printf(MSG_DEBUG, "%s: reschedule ap_handle_timer timeout " 2121 "for " MACSTR " (%d seconds - ap_max_inactivity)", 2122 __func__, MAC2STR(sta->addr), 2123 hapd->conf->ap_max_inactivity); 2124 eloop_cancel_timeout(ap_handle_timer, hapd, sta); 2125 eloop_register_timeout(hapd->conf->ap_max_inactivity, 0, 2126 ap_handle_timer, hapd, sta); 2127 } 2128} 2129 2130 2131const char * hostapd_state_text(enum hostapd_iface_state s) 2132{ 2133 switch (s) { 2134 case HAPD_IFACE_UNINITIALIZED: 2135 return "UNINITIALIZED"; 2136 case HAPD_IFACE_DISABLED: 2137 return "DISABLED"; 2138 case HAPD_IFACE_COUNTRY_UPDATE: 2139 return "COUNTRY_UPDATE"; 2140 case HAPD_IFACE_ACS: 2141 return "ACS"; 2142 case HAPD_IFACE_HT_SCAN: 2143 return "HT_SCAN"; 2144 case HAPD_IFACE_DFS: 2145 return "DFS"; 2146 case HAPD_IFACE_ENABLED: 2147 return "ENABLED"; 2148 } 2149 2150 return "UNKNOWN"; 2151} 2152 2153 2154void hostapd_set_state(struct hostapd_iface *iface, enum hostapd_iface_state s) 2155{ 2156 wpa_printf(MSG_INFO, "%s: interface state %s->%s", 2157 iface->conf->bss[0]->iface, hostapd_state_text(iface->state), 2158 hostapd_state_text(s)); 2159 iface->state = s; 2160} 2161 2162 2163#ifdef NEED_AP_MLME 2164 2165static void free_beacon_data(struct beacon_data *beacon) 2166{ 2167 os_free(beacon->head); 2168 beacon->head = NULL; 2169 os_free(beacon->tail); 2170 beacon->tail = NULL; 2171 os_free(beacon->probe_resp); 2172 beacon->probe_resp = NULL; 2173 os_free(beacon->beacon_ies); 2174 beacon->beacon_ies = NULL; 2175 os_free(beacon->proberesp_ies); 2176 beacon->proberesp_ies = NULL; 2177 os_free(beacon->assocresp_ies); 2178 beacon->assocresp_ies = NULL; 2179} 2180 2181 2182static int hostapd_build_beacon_data(struct hostapd_data *hapd, 2183 struct beacon_data *beacon) 2184{ 2185 struct wpabuf *beacon_extra, *proberesp_extra, *assocresp_extra; 2186 struct wpa_driver_ap_params params; 2187 int ret; 2188 2189 os_memset(beacon, 0, sizeof(*beacon)); 2190 ret = ieee802_11_build_ap_params(hapd, ¶ms); 2191 if (ret < 0) 2192 return ret; 2193 2194 ret = hostapd_build_ap_extra_ies(hapd, &beacon_extra, 2195 &proberesp_extra, 2196 &assocresp_extra); 2197 if (ret) 2198 goto free_ap_params; 2199 2200 ret = -1; 2201 beacon->head = os_malloc(params.head_len); 2202 if (!beacon->head) 2203 goto free_ap_extra_ies; 2204 2205 os_memcpy(beacon->head, params.head, params.head_len); 2206 beacon->head_len = params.head_len; 2207 2208 beacon->tail = os_malloc(params.tail_len); 2209 if (!beacon->tail) 2210 goto free_beacon; 2211 2212 os_memcpy(beacon->tail, params.tail, params.tail_len); 2213 beacon->tail_len = params.tail_len; 2214 2215 if (params.proberesp != NULL) { 2216 beacon->probe_resp = os_malloc(params.proberesp_len); 2217 if (!beacon->probe_resp) 2218 goto free_beacon; 2219 2220 os_memcpy(beacon->probe_resp, params.proberesp, 2221 params.proberesp_len); 2222 beacon->probe_resp_len = params.proberesp_len; 2223 } 2224 2225 /* copy the extra ies */ 2226 if (beacon_extra) { 2227 beacon->beacon_ies = os_malloc(wpabuf_len(beacon_extra)); 2228 if (!beacon->beacon_ies) 2229 goto free_beacon; 2230 2231 os_memcpy(beacon->beacon_ies, 2232 beacon_extra->buf, wpabuf_len(beacon_extra)); 2233 beacon->beacon_ies_len = wpabuf_len(beacon_extra); 2234 } 2235 2236 if (proberesp_extra) { 2237 beacon->proberesp_ies = 2238 os_malloc(wpabuf_len(proberesp_extra)); 2239 if (!beacon->proberesp_ies) 2240 goto free_beacon; 2241 2242 os_memcpy(beacon->proberesp_ies, proberesp_extra->buf, 2243 wpabuf_len(proberesp_extra)); 2244 beacon->proberesp_ies_len = wpabuf_len(proberesp_extra); 2245 } 2246 2247 if (assocresp_extra) { 2248 beacon->assocresp_ies = 2249 os_malloc(wpabuf_len(assocresp_extra)); 2250 if (!beacon->assocresp_ies) 2251 goto free_beacon; 2252 2253 os_memcpy(beacon->assocresp_ies, assocresp_extra->buf, 2254 wpabuf_len(assocresp_extra)); 2255 beacon->assocresp_ies_len = wpabuf_len(assocresp_extra); 2256 } 2257 2258 ret = 0; 2259free_beacon: 2260 /* if the function fails, the caller should not free beacon data */ 2261 if (ret) 2262 free_beacon_data(beacon); 2263 2264free_ap_extra_ies: 2265 hostapd_free_ap_extra_ies(hapd, beacon_extra, proberesp_extra, 2266 assocresp_extra); 2267free_ap_params: 2268 ieee802_11_free_ap_params(¶ms); 2269 return ret; 2270} 2271 2272 2273/* 2274 * TODO: This flow currently supports only changing frequency within the 2275 * same hw_mode. Any other changes to MAC parameters or provided settings (even 2276 * width) are not supported. 2277 */ 2278static int hostapd_change_config_freq(struct hostapd_data *hapd, 2279 struct hostapd_config *conf, 2280 struct hostapd_freq_params *params, 2281 struct hostapd_freq_params *old_params) 2282{ 2283 int channel; 2284 2285 if (!params->channel) { 2286 /* check if the new channel is supported by hw */ 2287 params->channel = hostapd_hw_get_channel(hapd, params->freq); 2288 } 2289 2290 channel = params->channel; 2291 if (!channel) 2292 return -1; 2293 2294 /* if a pointer to old_params is provided we save previous state */ 2295 if (old_params) { 2296 old_params->channel = conf->channel; 2297 old_params->ht_enabled = conf->ieee80211n; 2298 old_params->sec_channel_offset = conf->secondary_channel; 2299 } 2300 2301 conf->channel = channel; 2302 conf->ieee80211n = params->ht_enabled; 2303 conf->secondary_channel = params->sec_channel_offset; 2304 2305 /* TODO: maybe call here hostapd_config_check here? */ 2306 2307 return 0; 2308} 2309 2310 2311static int hostapd_fill_csa_settings(struct hostapd_data *hapd, 2312 struct csa_settings *settings) 2313{ 2314 struct hostapd_iface *iface = hapd->iface; 2315 struct hostapd_freq_params old_freq; 2316 int ret; 2317 2318 os_memset(&old_freq, 0, sizeof(old_freq)); 2319 if (!iface || !iface->freq || hapd->csa_in_progress) 2320 return -1; 2321 2322 ret = hostapd_change_config_freq(iface->bss[0], iface->conf, 2323 &settings->freq_params, 2324 &old_freq); 2325 if (ret) 2326 return ret; 2327 2328 ret = hostapd_build_beacon_data(hapd, &settings->beacon_after); 2329 2330 /* change back the configuration */ 2331 hostapd_change_config_freq(iface->bss[0], iface->conf, 2332 &old_freq, NULL); 2333 2334 if (ret) 2335 return ret; 2336 2337 /* set channel switch parameters for csa ie */ 2338 hapd->cs_freq_params = settings->freq_params; 2339 hapd->cs_count = settings->cs_count; 2340 hapd->cs_block_tx = settings->block_tx; 2341 2342 ret = hostapd_build_beacon_data(hapd, &settings->beacon_csa); 2343 if (ret) { 2344 free_beacon_data(&settings->beacon_after); 2345 return ret; 2346 } 2347 2348 settings->counter_offset_beacon = hapd->cs_c_off_beacon; 2349 settings->counter_offset_presp = hapd->cs_c_off_proberesp; 2350 2351 return 0; 2352} 2353 2354 2355void hostapd_cleanup_cs_params(struct hostapd_data *hapd) 2356{ 2357 os_memset(&hapd->cs_freq_params, 0, sizeof(hapd->cs_freq_params)); 2358 hapd->cs_count = 0; 2359 hapd->cs_block_tx = 0; 2360 hapd->cs_c_off_beacon = 0; 2361 hapd->cs_c_off_proberesp = 0; 2362 hapd->csa_in_progress = 0; 2363} 2364 2365 2366int hostapd_switch_channel(struct hostapd_data *hapd, 2367 struct csa_settings *settings) 2368{ 2369 int ret; 2370 ret = hostapd_fill_csa_settings(hapd, settings); 2371 if (ret) 2372 return ret; 2373 2374 ret = hostapd_drv_switch_channel(hapd, settings); 2375 free_beacon_data(&settings->beacon_csa); 2376 free_beacon_data(&settings->beacon_after); 2377 2378 if (ret) { 2379 /* if we failed, clean cs parameters */ 2380 hostapd_cleanup_cs_params(hapd); 2381 return ret; 2382 } 2383 2384 hapd->csa_in_progress = 1; 2385 return 0; 2386} 2387 2388 2389void 2390hostapd_switch_channel_fallback(struct hostapd_iface *iface, 2391 const struct hostapd_freq_params *freq_params) 2392{ 2393 int vht_seg0_idx = 0, vht_seg1_idx = 0, vht_bw = VHT_CHANWIDTH_USE_HT; 2394 unsigned int i; 2395 2396 wpa_printf(MSG_DEBUG, "Restarting all CSA-related BSSes"); 2397 2398 if (freq_params->center_freq1) 2399 vht_seg0_idx = 36 + (freq_params->center_freq1 - 5180) / 5; 2400 if (freq_params->center_freq2) 2401 vht_seg1_idx = 36 + (freq_params->center_freq2 - 5180) / 5; 2402 2403 switch (freq_params->bandwidth) { 2404 case 0: 2405 case 20: 2406 case 40: 2407 vht_bw = VHT_CHANWIDTH_USE_HT; 2408 break; 2409 case 80: 2410 if (freq_params->center_freq2) 2411 vht_bw = VHT_CHANWIDTH_80P80MHZ; 2412 else 2413 vht_bw = VHT_CHANWIDTH_80MHZ; 2414 break; 2415 case 160: 2416 vht_bw = VHT_CHANWIDTH_160MHZ; 2417 break; 2418 default: 2419 wpa_printf(MSG_WARNING, "Unknown CSA bandwidth: %d", 2420 freq_params->bandwidth); 2421 break; 2422 } 2423 2424 iface->freq = freq_params->freq; 2425 iface->conf->channel = freq_params->channel; 2426 iface->conf->secondary_channel = freq_params->sec_channel_offset; 2427 iface->conf->vht_oper_centr_freq_seg0_idx = vht_seg0_idx; 2428 iface->conf->vht_oper_centr_freq_seg1_idx = vht_seg1_idx; 2429 iface->conf->vht_oper_chwidth = vht_bw; 2430 iface->conf->ieee80211n = freq_params->ht_enabled; 2431 iface->conf->ieee80211ac = freq_params->vht_enabled; 2432 2433 /* 2434 * cs_params must not be cleared earlier because the freq_params 2435 * argument may actually point to one of these. 2436 */ 2437 for (i = 0; i < iface->num_bss; i++) 2438 hostapd_cleanup_cs_params(iface->bss[i]); 2439 2440 hostapd_disable_iface(iface); 2441 hostapd_enable_iface(iface); 2442} 2443 2444#endif /* NEED_AP_MLME */ 2445