1 /* 2 * hostapd / Initialization and configuration 3 * Copyright (c) 2002-2009, Jouni Malinen <j@w1.fi> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * Alternatively, this software may be distributed under the terms of BSD 10 * license. 11 * 12 * See README and COPYING for more details. 13 */ 14 15 #include "utils/includes.h" 16 17 #include "utils/common.h" 18 #include "utils/eloop.h" 19 #include "common/ieee802_11_defs.h" 20 #include "radius/radius_client.h" 21 #include "drivers/driver.h" 22 #include "hostapd.h" 23 #include "authsrv.h" 24 #include "sta_info.h" 25 #include "accounting.h" 26 #include "ap_list.h" 27 #include "beacon.h" 28 #include "iapp.h" 29 #include "ieee802_1x.h" 30 #include "ieee802_11_auth.h" 31 #include "vlan_init.h" 32 #include "wpa_auth.h" 33 #include "wps_hostapd.h" 34 #include "hw_features.h" 35 #include "wpa_auth_glue.h" 36 #include "ap_drv_ops.h" 37 #include "ap_config.h" 38 39 40 static int hostapd_flush_old_stations(struct hostapd_data *hapd); 41 static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd); 42 43 extern int wpa_debug_level; 44 45 46 int hostapd_reload_config(struct hostapd_iface *iface) 47 { 48 struct hostapd_data *hapd = iface->bss[0]; 49 struct hostapd_config *newconf, *oldconf; 50 size_t j; 51 52 if (iface->config_read_cb == NULL) 53 return -1; 54 newconf = iface->config_read_cb(iface->config_fname); 55 if (newconf == NULL) 56 return -1; 57 58 /* 59 * Deauthenticate all stations since the new configuration may not 60 * allow them to use the BSS anymore. 61 */ 62 for (j = 0; j < iface->num_bss; j++) 63 hostapd_flush_old_stations(iface->bss[j]); 64 65 #ifndef CONFIG_NO_RADIUS 66 /* TODO: update dynamic data based on changed configuration 67 * items (e.g., open/close sockets, etc.) */ 68 radius_client_flush(hapd->radius, 0); 69 #endif /* CONFIG_NO_RADIUS */ 70 71 oldconf = hapd->iconf; 72 hapd->iconf = newconf; 73 hapd->conf = &newconf->bss[0]; 74 iface->conf = newconf; 75 76 if (hostapd_setup_wpa_psk(hapd->conf)) { 77 wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK " 78 "after reloading configuration"); 79 } 80 81 if (hapd->conf->ieee802_1x || hapd->conf->wpa) 82 hapd->drv.set_drv_ieee8021x(hapd, hapd->conf->iface, 1); 83 else 84 hapd->drv.set_drv_ieee8021x(hapd, hapd->conf->iface, 0); 85 86 if (hapd->conf->wpa && hapd->wpa_auth == NULL) 87 hostapd_setup_wpa(hapd); 88 else if (hapd->conf->wpa) { 89 const u8 *wpa_ie; 90 size_t wpa_ie_len; 91 hostapd_reconfig_wpa(hapd); 92 wpa_ie = wpa_auth_get_wpa_ie(hapd->wpa_auth, &wpa_ie_len); 93 if (hostapd_set_generic_elem(hapd, wpa_ie, wpa_ie_len)) 94 wpa_printf(MSG_ERROR, "Failed to configure WPA IE for " 95 "the kernel driver."); 96 } else if (hapd->wpa_auth) { 97 wpa_deinit(hapd->wpa_auth); 98 hapd->wpa_auth = NULL; 99 hostapd_set_privacy(hapd, 0); 100 hostapd_setup_encryption(hapd->conf->iface, hapd); 101 hostapd_set_generic_elem(hapd, (u8 *) "", 0); 102 } 103 104 ieee802_11_set_beacon(hapd); 105 hostapd_update_wps(hapd); 106 107 if (hapd->conf->ssid.ssid_set && 108 hostapd_set_ssid(hapd, (u8 *) hapd->conf->ssid.ssid, 109 hapd->conf->ssid.ssid_len)) { 110 wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver"); 111 /* try to continue */ 112 } 113 114 hostapd_config_free(oldconf); 115 116 wpa_printf(MSG_DEBUG, "Reconfigured interface %s", hapd->conf->iface); 117 118 return 0; 119 } 120 121 122 static void hostapd_broadcast_key_clear_iface(struct hostapd_data *hapd, 123 char *ifname) 124 { 125 int i; 126 127 for (i = 0; i < NUM_WEP_KEYS; i++) { 128 if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL, i, 129 i == 0 ? 1 : 0, NULL, 0, NULL, 0)) { 130 wpa_printf(MSG_DEBUG, "Failed to clear default " 131 "encryption keys (ifname=%s keyidx=%d)", 132 ifname, i); 133 } 134 } 135 #ifdef CONFIG_IEEE80211W 136 if (hapd->conf->ieee80211w) { 137 for (i = NUM_WEP_KEYS; i < NUM_WEP_KEYS + 2; i++) { 138 if (hapd->drv.set_key(ifname, hapd, WPA_ALG_NONE, NULL, 139 i, i == 0 ? 1 : 0, NULL, 0, 140 NULL, 0)) { 141 wpa_printf(MSG_DEBUG, "Failed to clear " 142 "default mgmt encryption keys " 143 "(ifname=%s keyidx=%d)", ifname, i); 144 } 145 } 146 } 147 #endif /* CONFIG_IEEE80211W */ 148 } 149 150 151 static int hostapd_broadcast_wep_clear(struct hostapd_data *hapd) 152 { 153 hostapd_broadcast_key_clear_iface(hapd, hapd->conf->iface); 154 return 0; 155 } 156 157 158 static int hostapd_broadcast_wep_set(struct hostapd_data *hapd) 159 { 160 int errors = 0, idx; 161 struct hostapd_ssid *ssid = &hapd->conf->ssid; 162 163 idx = ssid->wep.idx; 164 if (ssid->wep.default_len && 165 hapd->drv.set_key(hapd->conf->iface, 166 hapd, WPA_ALG_WEP, NULL, idx, 167 idx == ssid->wep.idx, 168 NULL, 0, ssid->wep.key[idx], 169 ssid->wep.len[idx])) { 170 wpa_printf(MSG_WARNING, "Could not set WEP encryption."); 171 errors++; 172 } 173 174 if (ssid->dyn_vlan_keys) { 175 size_t i; 176 for (i = 0; i <= ssid->max_dyn_vlan_keys; i++) { 177 const char *ifname; 178 struct hostapd_wep_keys *key = ssid->dyn_vlan_keys[i]; 179 if (key == NULL) 180 continue; 181 ifname = hostapd_get_vlan_id_ifname(hapd->conf->vlan, 182 i); 183 if (ifname == NULL) 184 continue; 185 186 idx = key->idx; 187 if (hapd->drv.set_key(ifname, hapd, WPA_ALG_WEP, NULL, 188 idx, idx == key->idx, NULL, 0, 189 key->key[idx], key->len[idx])) { 190 wpa_printf(MSG_WARNING, "Could not set " 191 "dynamic VLAN WEP encryption."); 192 errors++; 193 } 194 } 195 } 196 197 return errors; 198 } 199 200 /** 201 * hostapd_cleanup - Per-BSS cleanup (deinitialization) 202 * @hapd: Pointer to BSS data 203 * 204 * This function is used to free all per-BSS data structures and resources. 205 * This gets called in a loop for each BSS between calls to 206 * hostapd_cleanup_iface_pre() and hostapd_cleanup_iface() when an interface 207 * is deinitialized. Most of the modules that are initialized in 208 * hostapd_setup_bss() are deinitialized here. 209 */ 210 static void hostapd_cleanup(struct hostapd_data *hapd) 211 { 212 if (hapd->iface->ctrl_iface_deinit) 213 hapd->iface->ctrl_iface_deinit(hapd); 214 215 iapp_deinit(hapd->iapp); 216 hapd->iapp = NULL; 217 accounting_deinit(hapd); 218 hostapd_deinit_wpa(hapd); 219 vlan_deinit(hapd); 220 hostapd_acl_deinit(hapd); 221 #ifndef CONFIG_NO_RADIUS 222 radius_client_deinit(hapd->radius); 223 hapd->radius = NULL; 224 #endif /* CONFIG_NO_RADIUS */ 225 226 hostapd_deinit_wps(hapd); 227 228 authsrv_deinit(hapd); 229 230 if (hapd->interface_added && 231 hostapd_if_remove(hapd, WPA_IF_AP_BSS, hapd->conf->iface)) { 232 wpa_printf(MSG_WARNING, "Failed to remove BSS interface %s", 233 hapd->conf->iface); 234 } 235 236 os_free(hapd->probereq_cb); 237 hapd->probereq_cb = NULL; 238 } 239 240 241 /** 242 * hostapd_cleanup_iface_pre - Preliminary per-interface cleanup 243 * @iface: Pointer to interface data 244 * 245 * This function is called before per-BSS data structures are deinitialized 246 * with hostapd_cleanup(). 247 */ 248 static void hostapd_cleanup_iface_pre(struct hostapd_iface *iface) 249 { 250 } 251 252 253 /** 254 * hostapd_cleanup_iface - Complete per-interface cleanup 255 * @iface: Pointer to interface data 256 * 257 * This function is called after per-BSS data structures are deinitialized 258 * with hostapd_cleanup(). 259 */ 260 static void hostapd_cleanup_iface(struct hostapd_iface *iface) 261 { 262 hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); 263 iface->hw_features = NULL; 264 os_free(iface->current_rates); 265 iface->current_rates = NULL; 266 ap_list_deinit(iface); 267 hostapd_config_free(iface->conf); 268 iface->conf = NULL; 269 270 os_free(iface->config_fname); 271 os_free(iface->bss); 272 os_free(iface); 273 } 274 275 276 static int hostapd_setup_encryption(char *iface, struct hostapd_data *hapd) 277 { 278 int i; 279 280 hostapd_broadcast_wep_set(hapd); 281 282 if (hapd->conf->ssid.wep.default_len) { 283 hostapd_set_privacy(hapd, 1); 284 return 0; 285 } 286 287 for (i = 0; i < 4; i++) { 288 if (hapd->conf->ssid.wep.key[i] && 289 hapd->drv.set_key(iface, hapd, WPA_ALG_WEP, NULL, i, 290 i == hapd->conf->ssid.wep.idx, NULL, 0, 291 hapd->conf->ssid.wep.key[i], 292 hapd->conf->ssid.wep.len[i])) { 293 wpa_printf(MSG_WARNING, "Could not set WEP " 294 "encryption."); 295 return -1; 296 } 297 if (hapd->conf->ssid.wep.key[i] && 298 i == hapd->conf->ssid.wep.idx) 299 hostapd_set_privacy(hapd, 1); 300 } 301 302 return 0; 303 } 304 305 306 static int hostapd_flush_old_stations(struct hostapd_data *hapd) 307 { 308 int ret = 0; 309 310 if (hostapd_drv_none(hapd) || hapd->drv_priv == NULL) 311 return 0; 312 313 wpa_printf(MSG_DEBUG, "Flushing old station entries"); 314 if (hostapd_flush(hapd)) { 315 wpa_printf(MSG_WARNING, "Could not connect to kernel driver."); 316 ret = -1; 317 } 318 wpa_printf(MSG_DEBUG, "Deauthenticate all stations"); 319 320 /* New Prism2.5/3 STA firmware versions seem to have issues with this 321 * broadcast deauth frame. This gets the firmware in odd state where 322 * nothing works correctly, so let's skip sending this for the hostap 323 * driver. */ 324 if (hapd->driver && os_strcmp(hapd->driver->name, "hostap") != 0) { 325 u8 addr[ETH_ALEN]; 326 os_memset(addr, 0xff, ETH_ALEN); 327 hapd->drv.sta_deauth(hapd, addr, 328 WLAN_REASON_PREV_AUTH_NOT_VALID); 329 } 330 331 return ret; 332 } 333 334 335 /** 336 * hostapd_validate_bssid_configuration - Validate BSSID configuration 337 * @iface: Pointer to interface data 338 * Returns: 0 on success, -1 on failure 339 * 340 * This function is used to validate that the configured BSSIDs are valid. 341 */ 342 static int hostapd_validate_bssid_configuration(struct hostapd_iface *iface) 343 { 344 u8 mask[ETH_ALEN] = { 0 }; 345 struct hostapd_data *hapd = iface->bss[0]; 346 unsigned int i = iface->conf->num_bss, bits = 0, j; 347 int res; 348 int auto_addr = 0; 349 350 if (hostapd_drv_none(hapd)) 351 return 0; 352 353 /* Generate BSSID mask that is large enough to cover the BSSIDs. */ 354 355 /* Determine the bits necessary to cover the number of BSSIDs. */ 356 for (i--; i; i >>= 1) 357 bits++; 358 359 /* Determine the bits necessary to any configured BSSIDs, 360 if they are higher than the number of BSSIDs. */ 361 for (j = 0; j < iface->conf->num_bss; j++) { 362 if (hostapd_mac_comp_empty(iface->conf->bss[j].bssid) == 0) { 363 if (j) 364 auto_addr++; 365 continue; 366 } 367 368 for (i = 0; i < ETH_ALEN; i++) { 369 mask[i] |= 370 iface->conf->bss[j].bssid[i] ^ 371 hapd->own_addr[i]; 372 } 373 } 374 375 if (!auto_addr) 376 goto skip_mask_ext; 377 378 for (i = 0; i < ETH_ALEN && mask[i] == 0; i++) 379 ; 380 j = 0; 381 if (i < ETH_ALEN) { 382 j = (5 - i) * 8; 383 384 while (mask[i] != 0) { 385 mask[i] >>= 1; 386 j++; 387 } 388 } 389 390 if (bits < j) 391 bits = j; 392 393 if (bits > 40) { 394 wpa_printf(MSG_ERROR, "Too many bits in the BSSID mask (%u)", 395 bits); 396 return -1; 397 } 398 399 os_memset(mask, 0xff, ETH_ALEN); 400 j = bits / 8; 401 for (i = 5; i > 5 - j; i--) 402 mask[i] = 0; 403 j = bits % 8; 404 while (j--) 405 mask[i] <<= 1; 406 407 skip_mask_ext: 408 wpa_printf(MSG_DEBUG, "BSS count %lu, BSSID mask " MACSTR " (%d bits)", 409 (unsigned long) iface->conf->num_bss, MAC2STR(mask), bits); 410 411 res = hostapd_valid_bss_mask(hapd, hapd->own_addr, mask); 412 if (res == 0) 413 return 0; 414 415 if (res < 0) { 416 wpa_printf(MSG_ERROR, "Driver did not accept BSSID mask " 417 MACSTR " for start address " MACSTR ".", 418 MAC2STR(mask), MAC2STR(hapd->own_addr)); 419 return -1; 420 } 421 422 if (!auto_addr) 423 return 0; 424 425 for (i = 0; i < ETH_ALEN; i++) { 426 if ((hapd->own_addr[i] & mask[i]) != hapd->own_addr[i]) { 427 wpa_printf(MSG_ERROR, "Invalid BSSID mask " MACSTR 428 " for start address " MACSTR ".", 429 MAC2STR(mask), MAC2STR(hapd->own_addr)); 430 wpa_printf(MSG_ERROR, "Start address must be the " 431 "first address in the block (i.e., addr " 432 "AND mask == addr)."); 433 return -1; 434 } 435 } 436 437 return 0; 438 } 439 440 441 static int mac_in_conf(struct hostapd_config *conf, const void *a) 442 { 443 size_t i; 444 445 for (i = 0; i < conf->num_bss; i++) { 446 if (hostapd_mac_comp(conf->bss[i].bssid, a) == 0) { 447 return 1; 448 } 449 } 450 451 return 0; 452 } 453 454 455 456 457 /** 458 * hostapd_setup_bss - Per-BSS setup (initialization) 459 * @hapd: Pointer to BSS data 460 * @first: Whether this BSS is the first BSS of an interface 461 * 462 * This function is used to initialize all per-BSS data structures and 463 * resources. This gets called in a loop for each BSS when an interface is 464 * initialized. Most of the modules that are initialized here will be 465 * deinitialized in hostapd_cleanup(). 466 */ 467 static int hostapd_setup_bss(struct hostapd_data *hapd, int first) 468 { 469 struct hostapd_bss_config *conf = hapd->conf; 470 u8 ssid[HOSTAPD_MAX_SSID_LEN + 1]; 471 int ssid_len, set_ssid; 472 char force_ifname[IFNAMSIZ]; 473 u8 if_addr[ETH_ALEN]; 474 475 if (!first) { 476 if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) { 477 /* Allocate the next available BSSID. */ 478 do { 479 inc_byte_array(hapd->own_addr, ETH_ALEN); 480 } while (mac_in_conf(hapd->iconf, hapd->own_addr)); 481 } else { 482 /* Allocate the configured BSSID. */ 483 os_memcpy(hapd->own_addr, hapd->conf->bssid, ETH_ALEN); 484 485 if (hostapd_mac_comp(hapd->own_addr, 486 hapd->iface->bss[0]->own_addr) == 487 0) { 488 wpa_printf(MSG_ERROR, "BSS '%s' may not have " 489 "BSSID set to the MAC address of " 490 "the radio", hapd->conf->iface); 491 return -1; 492 } 493 } 494 495 hapd->interface_added = 1; 496 if (hostapd_if_add(hapd->iface->bss[0], WPA_IF_AP_BSS, 497 hapd->conf->iface, hapd->own_addr, hapd, 498 &hapd->drv_priv, force_ifname, if_addr)) { 499 wpa_printf(MSG_ERROR, "Failed to add BSS (BSSID=" 500 MACSTR ")", MAC2STR(hapd->own_addr)); 501 return -1; 502 } 503 } 504 505 hostapd_flush_old_stations(hapd); 506 hostapd_set_privacy(hapd, 0); 507 508 hostapd_broadcast_wep_clear(hapd); 509 if (hostapd_setup_encryption(hapd->conf->iface, hapd)) 510 return -1; 511 512 /* 513 * Fetch the SSID from the system and use it or, 514 * if one was specified in the config file, verify they 515 * match. 516 */ 517 ssid_len = hostapd_get_ssid(hapd, ssid, sizeof(ssid)); 518 if (ssid_len < 0) { 519 wpa_printf(MSG_ERROR, "Could not read SSID from system"); 520 return -1; 521 } 522 if (conf->ssid.ssid_set) { 523 /* 524 * If SSID is specified in the config file and it differs 525 * from what is being used then force installation of the 526 * new SSID. 527 */ 528 set_ssid = (conf->ssid.ssid_len != (size_t) ssid_len || 529 os_memcmp(conf->ssid.ssid, ssid, ssid_len) != 0); 530 } else { 531 /* 532 * No SSID in the config file; just use the one we got 533 * from the system. 534 */ 535 set_ssid = 0; 536 conf->ssid.ssid_len = ssid_len; 537 os_memcpy(conf->ssid.ssid, ssid, conf->ssid.ssid_len); 538 conf->ssid.ssid[conf->ssid.ssid_len] = '\0'; 539 } 540 541 if (!hostapd_drv_none(hapd)) { 542 wpa_printf(MSG_ERROR, "Using interface %s with hwaddr " MACSTR 543 " and ssid '%s'", 544 hapd->conf->iface, MAC2STR(hapd->own_addr), 545 hapd->conf->ssid.ssid); 546 } 547 548 if (hostapd_setup_wpa_psk(conf)) { 549 wpa_printf(MSG_ERROR, "WPA-PSK setup failed."); 550 return -1; 551 } 552 553 /* Set SSID for the kernel driver (to be used in beacon and probe 554 * response frames) */ 555 if (set_ssid && hostapd_set_ssid(hapd, (u8 *) conf->ssid.ssid, 556 conf->ssid.ssid_len)) { 557 wpa_printf(MSG_ERROR, "Could not set SSID for kernel driver"); 558 return -1; 559 } 560 561 if (wpa_debug_level == MSG_MSGDUMP) 562 conf->radius->msg_dumps = 1; 563 #ifndef CONFIG_NO_RADIUS 564 hapd->radius = radius_client_init(hapd, conf->radius); 565 if (hapd->radius == NULL) { 566 wpa_printf(MSG_ERROR, "RADIUS client initialization failed."); 567 return -1; 568 } 569 #endif /* CONFIG_NO_RADIUS */ 570 571 if (hostapd_acl_init(hapd)) { 572 wpa_printf(MSG_ERROR, "ACL initialization failed."); 573 return -1; 574 } 575 if (hostapd_init_wps(hapd, conf)) 576 return -1; 577 578 if (authsrv_init(hapd) < 0) 579 return -1; 580 581 if (ieee802_1x_init(hapd)) { 582 wpa_printf(MSG_ERROR, "IEEE 802.1X initialization failed."); 583 return -1; 584 } 585 586 if (hapd->conf->wpa && hostapd_setup_wpa(hapd)) 587 return -1; 588 589 if (accounting_init(hapd)) { 590 wpa_printf(MSG_ERROR, "Accounting initialization failed."); 591 return -1; 592 } 593 594 if (hapd->conf->ieee802_11f && 595 (hapd->iapp = iapp_init(hapd, hapd->conf->iapp_iface)) == NULL) { 596 wpa_printf(MSG_ERROR, "IEEE 802.11F (IAPP) initialization " 597 "failed."); 598 return -1; 599 } 600 601 if (hapd->iface->ctrl_iface_init && 602 hapd->iface->ctrl_iface_init(hapd)) { 603 wpa_printf(MSG_ERROR, "Failed to setup control interface"); 604 return -1; 605 } 606 607 if (!hostapd_drv_none(hapd) && vlan_init(hapd)) { 608 wpa_printf(MSG_ERROR, "VLAN initialization failed."); 609 return -1; 610 } 611 612 ieee802_11_set_beacon(hapd); 613 614 return 0; 615 } 616 617 618 static void hostapd_tx_queue_params(struct hostapd_iface *iface) 619 { 620 struct hostapd_data *hapd = iface->bss[0]; 621 int i; 622 struct hostapd_tx_queue_params *p; 623 624 for (i = 0; i < NUM_TX_QUEUES; i++) { 625 p = &iface->conf->tx_queue[i]; 626 627 if (!p->configured) 628 continue; 629 630 if (hostapd_set_tx_queue_params(hapd, i, p->aifs, p->cwmin, 631 p->cwmax, p->burst)) { 632 wpa_printf(MSG_DEBUG, "Failed to set TX queue " 633 "parameters for queue %d.", i); 634 /* Continue anyway */ 635 } 636 } 637 } 638 639 640 static int setup_interface(struct hostapd_iface *iface) 641 { 642 struct hostapd_data *hapd = iface->bss[0]; 643 size_t i; 644 char country[4]; 645 646 /* 647 * Make sure that all BSSes get configured with a pointer to the same 648 * driver interface. 649 */ 650 for (i = 1; i < iface->num_bss; i++) { 651 iface->bss[i]->driver = hapd->driver; 652 iface->bss[i]->drv_priv = hapd->drv_priv; 653 } 654 655 if (hostapd_validate_bssid_configuration(iface)) 656 return -1; 657 658 if (hapd->iconf->country[0] && hapd->iconf->country[1]) { 659 os_memcpy(country, hapd->iconf->country, 3); 660 country[3] = '\0'; 661 if (hostapd_set_country(hapd, country) < 0) { 662 wpa_printf(MSG_ERROR, "Failed to set country code"); 663 return -1; 664 } 665 } 666 667 if (hostapd_get_hw_features(iface)) { 668 /* Not all drivers support this yet, so continue without hw 669 * feature data. */ 670 } else { 671 int ret = hostapd_select_hw_mode(iface); 672 if (ret < 0) { 673 wpa_printf(MSG_ERROR, "Could not select hw_mode and " 674 "channel. (%d)", ret); 675 return -1; 676 } 677 ret = hostapd_check_ht_capab(iface); 678 if (ret < 0) 679 return -1; 680 if (ret == 1) { 681 wpa_printf(MSG_DEBUG, "Interface initialization will " 682 "be completed in a callback"); 683 return 0; 684 } 685 } 686 return hostapd_setup_interface_complete(iface, 0); 687 } 688 689 690 int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err) 691 { 692 struct hostapd_data *hapd = iface->bss[0]; 693 size_t j; 694 u8 *prev_addr; 695 696 if (err) { 697 wpa_printf(MSG_ERROR, "Interface initialization failed"); 698 eloop_terminate(); 699 return -1; 700 } 701 702 wpa_printf(MSG_DEBUG, "Completing interface initialization"); 703 if (hapd->iconf->channel) { 704 iface->freq = hostapd_hw_get_freq(hapd, hapd->iconf->channel); 705 wpa_printf(MSG_DEBUG, "Mode: %s Channel: %d " 706 "Frequency: %d MHz", 707 hostapd_hw_mode_txt(hapd->iconf->hw_mode), 708 hapd->iconf->channel, iface->freq); 709 710 if (hostapd_set_freq(hapd, hapd->iconf->hw_mode, iface->freq, 711 hapd->iconf->channel, 712 hapd->iconf->ieee80211n, 713 hapd->iconf->secondary_channel)) { 714 wpa_printf(MSG_ERROR, "Could not set channel for " 715 "kernel driver"); 716 return -1; 717 } 718 } 719 720 if (hapd->iconf->rts_threshold > -1 && 721 hostapd_set_rts(hapd, hapd->iconf->rts_threshold)) { 722 wpa_printf(MSG_ERROR, "Could not set RTS threshold for " 723 "kernel driver"); 724 return -1; 725 } 726 727 if (hapd->iconf->fragm_threshold > -1 && 728 hostapd_set_frag(hapd, hapd->iconf->fragm_threshold)) { 729 wpa_printf(MSG_ERROR, "Could not set fragmentation threshold " 730 "for kernel driver"); 731 return -1; 732 } 733 734 prev_addr = hapd->own_addr; 735 736 for (j = 0; j < iface->num_bss; j++) { 737 hapd = iface->bss[j]; 738 if (j) 739 os_memcpy(hapd->own_addr, prev_addr, ETH_ALEN); 740 if (hostapd_setup_bss(hapd, j == 0)) 741 return -1; 742 if (hostapd_mac_comp_empty(hapd->conf->bssid) == 0) 743 prev_addr = hapd->own_addr; 744 } 745 746 hostapd_tx_queue_params(iface); 747 748 ap_list_init(iface); 749 750 if (hostapd_driver_commit(hapd) < 0) { 751 wpa_printf(MSG_ERROR, "%s: Failed to commit driver " 752 "configuration", __func__); 753 return -1; 754 } 755 756 wpa_printf(MSG_DEBUG, "%s: Setup of interface done.", 757 iface->bss[0]->conf->iface); 758 759 return 0; 760 } 761 762 763 /** 764 * hostapd_setup_interface - Setup of an interface 765 * @iface: Pointer to interface data. 766 * Returns: 0 on success, -1 on failure 767 * 768 * Initializes the driver interface, validates the configuration, 769 * and sets driver parameters based on the configuration. 770 * Flushes old stations, sets the channel, encryption, 771 * beacons, and WDS links based on the configuration. 772 */ 773 int hostapd_setup_interface(struct hostapd_iface *iface) 774 { 775 int ret; 776 777 ret = setup_interface(iface); 778 if (ret) { 779 wpa_printf(MSG_ERROR, "%s: Unable to setup interface.", 780 iface->bss[0]->conf->iface); 781 return -1; 782 } 783 784 return 0; 785 } 786 787 788 /** 789 * hostapd_alloc_bss_data - Allocate and initialize per-BSS data 790 * @hapd_iface: Pointer to interface data 791 * @conf: Pointer to per-interface configuration 792 * @bss: Pointer to per-BSS configuration for this BSS 793 * Returns: Pointer to allocated BSS data 794 * 795 * This function is used to allocate per-BSS data structure. This data will be 796 * freed after hostapd_cleanup() is called for it during interface 797 * deinitialization. 798 */ 799 struct hostapd_data * 800 hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface, 801 struct hostapd_config *conf, 802 struct hostapd_bss_config *bss) 803 { 804 struct hostapd_data *hapd; 805 806 hapd = os_zalloc(sizeof(*hapd)); 807 if (hapd == NULL) 808 return NULL; 809 810 hostapd_set_driver_ops(&hapd->drv); 811 hapd->new_assoc_sta_cb = hostapd_new_assoc_sta; 812 hapd->iconf = conf; 813 hapd->conf = bss; 814 hapd->iface = hapd_iface; 815 hapd->driver = hapd->iconf->driver; 816 817 return hapd; 818 } 819 820 821 void hostapd_interface_deinit(struct hostapd_iface *iface) 822 { 823 size_t j; 824 825 if (iface == NULL) 826 return; 827 828 hostapd_cleanup_iface_pre(iface); 829 for (j = 0; j < iface->num_bss; j++) { 830 struct hostapd_data *hapd = iface->bss[j]; 831 hostapd_free_stas(hapd); 832 hostapd_flush_old_stations(hapd); 833 hostapd_cleanup(hapd); 834 } 835 } 836 837 838 void hostapd_interface_free(struct hostapd_iface *iface) 839 { 840 size_t j; 841 for (j = 0; j < iface->num_bss; j++) 842 os_free(iface->bss[j]); 843 hostapd_cleanup_iface(iface); 844 } 845 846 847 /** 848 * hostapd_new_assoc_sta - Notify that a new station associated with the AP 849 * @hapd: Pointer to BSS data 850 * @sta: Pointer to the associated STA data 851 * @reassoc: 1 to indicate this was a re-association; 0 = first association 852 * 853 * This function will be called whenever a station associates with the AP. It 854 * can be called from ieee802_11.c for drivers that export MLME to hostapd and 855 * from drv_callbacks.c based on driver events for drivers that take care of 856 * management frames (IEEE 802.11 authentication and association) internally. 857 */ 858 void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, 859 int reassoc) 860 { 861 if (hapd->tkip_countermeasures) { 862 hapd->drv.sta_deauth(hapd, sta->addr, 863 WLAN_REASON_MICHAEL_MIC_FAILURE); 864 return; 865 } 866 867 hostapd_prune_associations(hapd, sta->addr); 868 869 /* IEEE 802.11F (IAPP) */ 870 if (hapd->conf->ieee802_11f) 871 iapp_new_station(hapd->iapp, sta); 872 873 /* Start accounting here, if IEEE 802.1X and WPA are not used. 874 * IEEE 802.1X/WPA code will start accounting after the station has 875 * been authorized. */ 876 if (!hapd->conf->ieee802_1x && !hapd->conf->wpa) 877 accounting_sta_start(hapd, sta); 878 879 /* Start IEEE 802.1X authentication process for new stations */ 880 ieee802_1x_new_station(hapd, sta); 881 if (reassoc) { 882 if (sta->auth_alg != WLAN_AUTH_FT && 883 !(sta->flags & (WLAN_STA_WPS | WLAN_STA_MAYBE_WPS))) 884 wpa_auth_sm_event(sta->wpa_sm, WPA_REAUTH); 885 } else 886 wpa_auth_sta_associated(hapd->wpa_auth, sta->wpa_sm); 887 } 888