1 /* 2 * hostapd / Callback functions for driver wrappers 3 * Copyright (c) 2002-2009, Jouni Malinen <j (at) 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 "radius/radius.h" 13 #include "drivers/driver.h" 14 #include "common/ieee802_11_defs.h" 15 #include "common/ieee802_11_common.h" 16 #include "common/wpa_ctrl.h" 17 #include "crypto/random.h" 18 #include "p2p/p2p.h" 19 #include "wps/wps.h" 20 #include "wnm_ap.h" 21 #include "hostapd.h" 22 #include "ieee802_11.h" 23 #include "sta_info.h" 24 #include "accounting.h" 25 #include "tkip_countermeasures.h" 26 #include "ieee802_1x.h" 27 #include "wpa_auth.h" 28 #include "wps_hostapd.h" 29 #include "ap_drv_ops.h" 30 #include "ap_config.h" 31 #include "hw_features.h" 32 33 34 int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, 35 const u8 *req_ies, size_t req_ies_len, int reassoc) 36 { 37 struct sta_info *sta; 38 int new_assoc, res; 39 struct ieee802_11_elems elems; 40 const u8 *ie; 41 size_t ielen; 42 #ifdef CONFIG_IEEE80211R 43 u8 buf[sizeof(struct ieee80211_mgmt) + 1024]; 44 u8 *p = buf; 45 #endif /* CONFIG_IEEE80211R */ 46 u16 reason = WLAN_REASON_UNSPECIFIED; 47 u16 status = WLAN_STATUS_SUCCESS; 48 49 if (addr == NULL) { 50 /* 51 * This could potentially happen with unexpected event from the 52 * driver wrapper. This was seen at least in one case where the 53 * driver ended up being set to station mode while hostapd was 54 * running, so better make sure we stop processing such an 55 * event here. 56 */ 57 wpa_printf(MSG_DEBUG, "hostapd_notif_assoc: Skip event with " 58 "no address"); 59 return -1; 60 } 61 random_add_randomness(addr, ETH_ALEN); 62 63 hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211, 64 HOSTAPD_LEVEL_INFO, "associated"); 65 66 ieee802_11_parse_elems(req_ies, req_ies_len, &elems, 0); 67 if (elems.wps_ie) { 68 ie = elems.wps_ie - 2; 69 ielen = elems.wps_ie_len + 2; 70 wpa_printf(MSG_DEBUG, "STA included WPS IE in (Re)AssocReq"); 71 } else if (elems.rsn_ie) { 72 ie = elems.rsn_ie - 2; 73 ielen = elems.rsn_ie_len + 2; 74 wpa_printf(MSG_DEBUG, "STA included RSN IE in (Re)AssocReq"); 75 } else if (elems.wpa_ie) { 76 ie = elems.wpa_ie - 2; 77 ielen = elems.wpa_ie_len + 2; 78 wpa_printf(MSG_DEBUG, "STA included WPA IE in (Re)AssocReq"); 79 } else { 80 ie = NULL; 81 ielen = 0; 82 wpa_printf(MSG_DEBUG, "STA did not include WPS/RSN/WPA IE in " 83 "(Re)AssocReq"); 84 } 85 86 sta = ap_get_sta(hapd, addr); 87 if (sta) { 88 accounting_sta_stop(hapd, sta); 89 90 /* 91 * Make sure that the previously registered inactivity timer 92 * will not remove the STA immediately. 93 */ 94 sta->timeout_next = STA_NULLFUNC; 95 } else { 96 sta = ap_sta_add(hapd, addr); 97 if (sta == NULL) { 98 hostapd_drv_sta_disassoc(hapd, addr, 99 WLAN_REASON_DISASSOC_AP_BUSY); 100 return -1; 101 } 102 } 103 sta->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS | WLAN_STA_WPS2); 104 105 #ifdef CONFIG_P2P 106 if (elems.p2p) { 107 wpabuf_free(sta->p2p_ie); 108 sta->p2p_ie = ieee802_11_vendor_ie_concat(req_ies, req_ies_len, 109 P2P_IE_VENDOR_TYPE); 110 } 111 #endif /* CONFIG_P2P */ 112 113 #ifdef CONFIG_HS20 114 wpabuf_free(sta->hs20_ie); 115 if (elems.hs20 && elems.hs20_len > 4) { 116 sta->hs20_ie = wpabuf_alloc_copy(elems.hs20 + 4, 117 elems.hs20_len - 4); 118 } else 119 sta->hs20_ie = NULL; 120 #endif /* CONFIG_HS20 */ 121 122 if (hapd->conf->wpa) { 123 if (ie == NULL || ielen == 0) { 124 #ifdef CONFIG_WPS 125 if (hapd->conf->wps_state) { 126 wpa_printf(MSG_DEBUG, "STA did not include " 127 "WPA/RSN IE in (Re)Association " 128 "Request - possible WPS use"); 129 sta->flags |= WLAN_STA_MAYBE_WPS; 130 goto skip_wpa_check; 131 } 132 #endif /* CONFIG_WPS */ 133 134 wpa_printf(MSG_DEBUG, "No WPA/RSN IE from STA"); 135 return -1; 136 } 137 #ifdef CONFIG_WPS 138 if (hapd->conf->wps_state && ie[0] == 0xdd && ie[1] >= 4 && 139 os_memcmp(ie + 2, "\x00\x50\xf2\x04", 4) == 0) { 140 struct wpabuf *wps; 141 sta->flags |= WLAN_STA_WPS; 142 wps = ieee802_11_vendor_ie_concat(ie, ielen, 143 WPS_IE_VENDOR_TYPE); 144 if (wps) { 145 if (wps_is_20(wps)) { 146 wpa_printf(MSG_DEBUG, "WPS: STA " 147 "supports WPS 2.0"); 148 sta->flags |= WLAN_STA_WPS2; 149 } 150 wpabuf_free(wps); 151 } 152 goto skip_wpa_check; 153 } 154 #endif /* CONFIG_WPS */ 155 156 if (sta->wpa_sm == NULL) 157 sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, 158 sta->addr); 159 if (sta->wpa_sm == NULL) { 160 wpa_printf(MSG_ERROR, "Failed to initialize WPA state " 161 "machine"); 162 return -1; 163 } 164 res = wpa_validate_wpa_ie(hapd->wpa_auth, sta->wpa_sm, 165 ie, ielen, 166 elems.mdie, elems.mdie_len); 167 if (res != WPA_IE_OK) { 168 wpa_printf(MSG_DEBUG, "WPA/RSN information element " 169 "rejected? (res %u)", res); 170 wpa_hexdump(MSG_DEBUG, "IE", ie, ielen); 171 if (res == WPA_INVALID_GROUP) { 172 reason = WLAN_REASON_GROUP_CIPHER_NOT_VALID; 173 status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; 174 } else if (res == WPA_INVALID_PAIRWISE) { 175 reason = WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID; 176 status = WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID; 177 } else if (res == WPA_INVALID_AKMP) { 178 reason = WLAN_REASON_AKMP_NOT_VALID; 179 status = WLAN_STATUS_AKMP_NOT_VALID; 180 } 181 #ifdef CONFIG_IEEE80211W 182 else if (res == WPA_MGMT_FRAME_PROTECTION_VIOLATION) { 183 reason = WLAN_REASON_INVALID_IE; 184 status = WLAN_STATUS_INVALID_IE; 185 } else if (res == WPA_INVALID_MGMT_GROUP_CIPHER) { 186 reason = WLAN_REASON_GROUP_CIPHER_NOT_VALID; 187 status = WLAN_STATUS_GROUP_CIPHER_NOT_VALID; 188 } 189 #endif /* CONFIG_IEEE80211W */ 190 else { 191 reason = WLAN_REASON_INVALID_IE; 192 status = WLAN_STATUS_INVALID_IE; 193 } 194 goto fail; 195 } 196 #ifdef CONFIG_IEEE80211W 197 if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out && 198 sta->sa_query_count > 0) 199 ap_check_sa_query_timeout(hapd, sta); 200 if ((sta->flags & WLAN_STA_MFP) && !sta->sa_query_timed_out && 201 (sta->auth_alg != WLAN_AUTH_FT)) { 202 /* 203 * STA has already been associated with MFP and SA 204 * Query timeout has not been reached. Reject the 205 * association attempt temporarily and start SA Query, 206 * if one is not pending. 207 */ 208 209 if (sta->sa_query_count == 0) 210 ap_sta_start_sa_query(hapd, sta); 211 212 #ifdef CONFIG_IEEE80211R 213 status = WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY; 214 215 p = hostapd_eid_assoc_comeback_time(hapd, sta, p); 216 217 hostapd_sta_assoc(hapd, addr, reassoc, status, buf, 218 p - buf); 219 #endif /* CONFIG_IEEE80211R */ 220 return 0; 221 } 222 223 if (wpa_auth_uses_mfp(sta->wpa_sm)) 224 sta->flags |= WLAN_STA_MFP; 225 else 226 sta->flags &= ~WLAN_STA_MFP; 227 #endif /* CONFIG_IEEE80211W */ 228 229 #ifdef CONFIG_IEEE80211R 230 if (sta->auth_alg == WLAN_AUTH_FT) { 231 status = wpa_ft_validate_reassoc(sta->wpa_sm, req_ies, 232 req_ies_len); 233 if (status != WLAN_STATUS_SUCCESS) { 234 if (status == WLAN_STATUS_INVALID_PMKID) 235 reason = WLAN_REASON_INVALID_IE; 236 if (status == WLAN_STATUS_INVALID_MDIE) 237 reason = WLAN_REASON_INVALID_IE; 238 if (status == WLAN_STATUS_INVALID_FTIE) 239 reason = WLAN_REASON_INVALID_IE; 240 goto fail; 241 } 242 } 243 #endif /* CONFIG_IEEE80211R */ 244 } else if (hapd->conf->wps_state) { 245 #ifdef CONFIG_WPS 246 struct wpabuf *wps; 247 if (req_ies) 248 wps = ieee802_11_vendor_ie_concat(req_ies, req_ies_len, 249 WPS_IE_VENDOR_TYPE); 250 else 251 wps = NULL; 252 #ifdef CONFIG_WPS_STRICT 253 if (wps && wps_validate_assoc_req(wps) < 0) { 254 reason = WLAN_REASON_INVALID_IE; 255 status = WLAN_STATUS_INVALID_IE; 256 wpabuf_free(wps); 257 goto fail; 258 } 259 #endif /* CONFIG_WPS_STRICT */ 260 if (wps) { 261 sta->flags |= WLAN_STA_WPS; 262 if (wps_is_20(wps)) { 263 wpa_printf(MSG_DEBUG, "WPS: STA supports " 264 "WPS 2.0"); 265 sta->flags |= WLAN_STA_WPS2; 266 } 267 } else 268 sta->flags |= WLAN_STA_MAYBE_WPS; 269 wpabuf_free(wps); 270 #endif /* CONFIG_WPS */ 271 } 272 #ifdef CONFIG_WPS 273 skip_wpa_check: 274 #endif /* CONFIG_WPS */ 275 276 #ifdef CONFIG_IEEE80211R 277 p = wpa_sm_write_assoc_resp_ies(sta->wpa_sm, buf, sizeof(buf), 278 sta->auth_alg, req_ies, req_ies_len); 279 280 hostapd_sta_assoc(hapd, addr, reassoc, status, buf, p - buf); 281 #else /* CONFIG_IEEE80211R */ 282 /* Keep compiler silent about unused variables */ 283 if (status) { 284 } 285 #endif /* CONFIG_IEEE80211R */ 286 287 new_assoc = (sta->flags & WLAN_STA_ASSOC) == 0; 288 sta->flags |= WLAN_STA_AUTH | WLAN_STA_ASSOC; 289 290 if (reassoc && (sta->auth_alg == WLAN_AUTH_FT)) 291 wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC_FT); 292 else 293 wpa_auth_sm_event(sta->wpa_sm, WPA_ASSOC); 294 295 hostapd_new_assoc_sta(hapd, sta, !new_assoc); 296 297 ieee802_1x_notify_port_enabled(sta->eapol_sm, 1); 298 299 #ifdef CONFIG_P2P 300 if (req_ies) { 301 p2p_group_notif_assoc(hapd->p2p_group, sta->addr, 302 req_ies, req_ies_len); 303 } 304 #endif /* CONFIG_P2P */ 305 306 return 0; 307 308 fail: 309 #ifdef CONFIG_IEEE80211R 310 hostapd_sta_assoc(hapd, addr, reassoc, status, buf, p - buf); 311 #endif /* CONFIG_IEEE80211R */ 312 hostapd_drv_sta_disassoc(hapd, sta->addr, reason); 313 ap_free_sta(hapd, sta); 314 return -1; 315 } 316 317 318 void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr) 319 { 320 struct sta_info *sta; 321 322 if (addr == NULL) { 323 /* 324 * This could potentially happen with unexpected event from the 325 * driver wrapper. This was seen at least in one case where the 326 * driver ended up reporting a station mode event while hostapd 327 * was running, so better make sure we stop processing such an 328 * event here. 329 */ 330 wpa_printf(MSG_DEBUG, "hostapd_notif_disassoc: Skip event " 331 "with no address"); 332 return; 333 } 334 335 hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211, 336 HOSTAPD_LEVEL_INFO, "disassociated"); 337 338 sta = ap_get_sta(hapd, addr); 339 if (sta == NULL) { 340 wpa_printf(MSG_DEBUG, "Disassociation notification for " 341 "unknown STA " MACSTR, MAC2STR(addr)); 342 return; 343 } 344 345 ap_sta_set_authorized(hapd, sta, 0); 346 sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC); 347 wpa_auth_sm_event(sta->wpa_sm, WPA_DISASSOC); 348 sta->acct_terminate_cause = RADIUS_ACCT_TERMINATE_CAUSE_USER_REQUEST; 349 ieee802_1x_notify_port_enabled(sta->eapol_sm, 0); 350 ap_free_sta(hapd, sta); 351 } 352 353 354 void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr) 355 { 356 struct sta_info *sta = ap_get_sta(hapd, addr); 357 358 if (!sta || !hapd->conf->disassoc_low_ack) 359 return; 360 361 hostapd_logger(hapd, addr, HOSTAPD_MODULE_IEEE80211, 362 HOSTAPD_LEVEL_INFO, "disconnected due to excessive " 363 "missing ACKs"); 364 hostapd_drv_sta_disassoc(hapd, addr, WLAN_REASON_DISASSOC_LOW_ACK); 365 if (sta) 366 ap_sta_disassociate(hapd, sta, WLAN_REASON_DISASSOC_LOW_ACK); 367 } 368 369 370 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht, 371 int offset) 372 { 373 #ifdef NEED_AP_MLME 374 int channel; 375 376 hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, 377 HOSTAPD_LEVEL_INFO, "driver had channel switch: " 378 "freq=%d, ht=%d, offset=%d", freq, ht, offset); 379 380 hapd->iface->freq = freq; 381 382 channel = hostapd_hw_get_channel(hapd, freq); 383 if (!channel) { 384 hostapd_logger(hapd, NULL, HOSTAPD_MODULE_IEEE80211, 385 HOSTAPD_LEVEL_WARNING, "driver switched to " 386 "bad channel!"); 387 return; 388 } 389 390 hapd->iconf->channel = channel; 391 hapd->iconf->ieee80211n = ht; 392 hapd->iconf->secondary_channel = offset; 393 #endif /* NEED_AP_MLME */ 394 } 395 396 397 void hostapd_event_connect_failed_reason(struct hostapd_data *hapd, 398 const u8 *addr, int reason_code) 399 { 400 switch (reason_code) { 401 case MAX_CLIENT_REACHED: 402 wpa_msg(hapd->msg_ctx, MSG_INFO, AP_REJECTED_MAX_STA MACSTR, 403 MAC2STR(addr)); 404 break; 405 case BLOCKED_CLIENT: 406 wpa_msg(hapd->msg_ctx, MSG_INFO, AP_REJECTED_BLOCKED_STA MACSTR, 407 MAC2STR(addr)); 408 break; 409 } 410 } 411 412 413 int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, 414 const u8 *bssid, const u8 *ie, size_t ie_len, 415 int ssi_signal) 416 { 417 size_t i; 418 int ret = 0; 419 420 if (sa == NULL || ie == NULL) 421 return -1; 422 423 random_add_randomness(sa, ETH_ALEN); 424 for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) { 425 if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, 426 sa, da, bssid, ie, ie_len, 427 ssi_signal) > 0) { 428 ret = 1; 429 break; 430 } 431 } 432 return ret; 433 } 434 435 436 #ifdef HOSTAPD 437 438 #ifdef CONFIG_IEEE80211R 439 static void hostapd_notify_auth_ft_finish(void *ctx, const u8 *dst, 440 const u8 *bssid, 441 u16 auth_transaction, u16 status, 442 const u8 *ies, size_t ies_len) 443 { 444 struct hostapd_data *hapd = ctx; 445 struct sta_info *sta; 446 447 sta = ap_get_sta(hapd, dst); 448 if (sta == NULL) 449 return; 450 451 hostapd_logger(hapd, dst, HOSTAPD_MODULE_IEEE80211, 452 HOSTAPD_LEVEL_DEBUG, "authentication OK (FT)"); 453 sta->flags |= WLAN_STA_AUTH; 454 455 hostapd_sta_auth(hapd, dst, auth_transaction, status, ies, ies_len); 456 } 457 #endif /* CONFIG_IEEE80211R */ 458 459 460 static void hostapd_notif_auth(struct hostapd_data *hapd, 461 struct auth_info *rx_auth) 462 { 463 struct sta_info *sta; 464 u16 status = WLAN_STATUS_SUCCESS; 465 u8 resp_ies[2 + WLAN_AUTH_CHALLENGE_LEN]; 466 size_t resp_ies_len = 0; 467 468 sta = ap_get_sta(hapd, rx_auth->peer); 469 if (!sta) { 470 sta = ap_sta_add(hapd, rx_auth->peer); 471 if (sta == NULL) { 472 status = WLAN_STATUS_UNSPECIFIED_FAILURE; 473 goto fail; 474 } 475 } 476 sta->flags &= ~WLAN_STA_PREAUTH; 477 ieee802_1x_notify_pre_auth(sta->eapol_sm, 0); 478 #ifdef CONFIG_IEEE80211R 479 if (rx_auth->auth_type == WLAN_AUTH_FT && hapd->wpa_auth) { 480 sta->auth_alg = WLAN_AUTH_FT; 481 if (sta->wpa_sm == NULL) 482 sta->wpa_sm = wpa_auth_sta_init(hapd->wpa_auth, 483 sta->addr); 484 if (sta->wpa_sm == NULL) { 485 wpa_printf(MSG_DEBUG, "FT: Failed to initialize WPA " 486 "state machine"); 487 status = WLAN_STATUS_UNSPECIFIED_FAILURE; 488 goto fail; 489 } 490 wpa_ft_process_auth(sta->wpa_sm, rx_auth->bssid, 491 rx_auth->auth_transaction, rx_auth->ies, 492 rx_auth->ies_len, 493 hostapd_notify_auth_ft_finish, hapd); 494 return; 495 } 496 #endif /* CONFIG_IEEE80211R */ 497 fail: 498 hostapd_sta_auth(hapd, rx_auth->peer, rx_auth->auth_transaction + 1, 499 status, resp_ies, resp_ies_len); 500 } 501 502 503 static void hostapd_action_rx(struct hostapd_data *hapd, 504 struct rx_action *action) 505 { 506 struct sta_info *sta; 507 508 wpa_printf(MSG_DEBUG, "RX_ACTION cat %d action plen %d", 509 action->category, (int) action->len); 510 511 sta = ap_get_sta(hapd, action->sa); 512 if (sta == NULL) { 513 wpa_printf(MSG_DEBUG, "%s: station not found", __func__); 514 return; 515 } 516 #ifdef CONFIG_IEEE80211R 517 if (action->category == WLAN_ACTION_FT) { 518 wpa_printf(MSG_DEBUG, "%s: FT_ACTION length %d", 519 __func__, (int) action->len); 520 wpa_ft_action_rx(sta->wpa_sm, action->data, action->len); 521 } 522 #endif /* CONFIG_IEEE80211R */ 523 #ifdef CONFIG_IEEE80211W 524 if (action->category == WLAN_ACTION_SA_QUERY && action->len >= 4) { 525 wpa_printf(MSG_DEBUG, "%s: SA_QUERY_ACTION length %d", 526 __func__, (int) action->len); 527 ieee802_11_sa_query_action(hapd, action->sa, 528 *(action->data + 1), 529 action->data + 2); 530 } 531 #endif /* CONFIG_IEEE80211W */ 532 #ifdef CONFIG_WNM 533 if (action->category == WLAN_ACTION_WNM) { 534 wpa_printf(MSG_DEBUG, "%s: WNM_ACTION length %d", 535 __func__, (int) action->len); 536 ieee802_11_rx_wnm_action_ap(hapd, action); 537 } 538 #endif /* CONFIG_WNM */ 539 } 540 541 542 #ifdef NEED_AP_MLME 543 544 #define HAPD_BROADCAST ((struct hostapd_data *) -1) 545 546 static struct hostapd_data * get_hapd_bssid(struct hostapd_iface *iface, 547 const u8 *bssid) 548 { 549 size_t i; 550 551 if (bssid == NULL) 552 return NULL; 553 if (bssid[0] == 0xff && bssid[1] == 0xff && bssid[2] == 0xff && 554 bssid[3] == 0xff && bssid[4] == 0xff && bssid[5] == 0xff) 555 return HAPD_BROADCAST; 556 557 for (i = 0; i < iface->num_bss; i++) { 558 if (os_memcmp(bssid, iface->bss[i]->own_addr, ETH_ALEN) == 0) 559 return iface->bss[i]; 560 } 561 562 return NULL; 563 } 564 565 566 static void hostapd_rx_from_unknown_sta(struct hostapd_data *hapd, 567 const u8 *bssid, const u8 *addr, 568 int wds) 569 { 570 hapd = get_hapd_bssid(hapd->iface, bssid); 571 if (hapd == NULL || hapd == HAPD_BROADCAST) 572 return; 573 574 ieee802_11_rx_from_unknown(hapd, addr, wds); 575 } 576 577 578 static void hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt) 579 { 580 struct hostapd_iface *iface = hapd->iface; 581 const struct ieee80211_hdr *hdr; 582 const u8 *bssid; 583 struct hostapd_frame_info fi; 584 585 hdr = (const struct ieee80211_hdr *) rx_mgmt->frame; 586 bssid = get_hdr_bssid(hdr, rx_mgmt->frame_len); 587 if (bssid == NULL) 588 return; 589 590 hapd = get_hapd_bssid(iface, bssid); 591 if (hapd == NULL) { 592 u16 fc; 593 fc = le_to_host16(hdr->frame_control); 594 595 /* 596 * Drop frames to unknown BSSIDs except for Beacon frames which 597 * could be used to update neighbor information. 598 */ 599 if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT && 600 WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_BEACON) 601 hapd = iface->bss[0]; 602 else 603 return; 604 } 605 606 os_memset(&fi, 0, sizeof(fi)); 607 fi.datarate = rx_mgmt->datarate; 608 fi.ssi_signal = rx_mgmt->ssi_signal; 609 610 if (hapd == HAPD_BROADCAST) { 611 size_t i; 612 for (i = 0; i < iface->num_bss; i++) 613 ieee802_11_mgmt(iface->bss[i], rx_mgmt->frame, 614 rx_mgmt->frame_len, &fi); 615 } else 616 ieee802_11_mgmt(hapd, rx_mgmt->frame, rx_mgmt->frame_len, &fi); 617 618 random_add_randomness(&fi, sizeof(fi)); 619 } 620 621 622 static void hostapd_rx_action(struct hostapd_data *hapd, 623 struct rx_action *rx_action) 624 { 625 struct rx_mgmt rx_mgmt; 626 u8 *buf; 627 struct ieee80211_hdr *hdr; 628 629 wpa_printf(MSG_DEBUG, "EVENT_RX_ACTION DA=" MACSTR " SA=" MACSTR 630 " BSSID=" MACSTR " category=%u", 631 MAC2STR(rx_action->da), MAC2STR(rx_action->sa), 632 MAC2STR(rx_action->bssid), rx_action->category); 633 wpa_hexdump(MSG_MSGDUMP, "Received action frame contents", 634 rx_action->data, rx_action->len); 635 636 buf = os_zalloc(24 + 1 + rx_action->len); 637 if (buf == NULL) 638 return; 639 hdr = (struct ieee80211_hdr *) buf; 640 hdr->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, 641 WLAN_FC_STYPE_ACTION); 642 if (rx_action->category == WLAN_ACTION_SA_QUERY) { 643 /* 644 * Assume frame was protected; it would have been dropped if 645 * not. 646 */ 647 hdr->frame_control |= host_to_le16(WLAN_FC_ISWEP); 648 } 649 os_memcpy(hdr->addr1, rx_action->da, ETH_ALEN); 650 os_memcpy(hdr->addr2, rx_action->sa, ETH_ALEN); 651 os_memcpy(hdr->addr3, rx_action->bssid, ETH_ALEN); 652 buf[24] = rx_action->category; 653 os_memcpy(buf + 24 + 1, rx_action->data, rx_action->len); 654 os_memset(&rx_mgmt, 0, sizeof(rx_mgmt)); 655 rx_mgmt.frame = buf; 656 rx_mgmt.frame_len = 24 + 1 + rx_action->len; 657 hostapd_mgmt_rx(hapd, &rx_mgmt); 658 os_free(buf); 659 } 660 661 662 static void hostapd_mgmt_tx_cb(struct hostapd_data *hapd, const u8 *buf, 663 size_t len, u16 stype, int ok) 664 { 665 struct ieee80211_hdr *hdr; 666 hdr = (struct ieee80211_hdr *) buf; 667 hapd = get_hapd_bssid(hapd->iface, get_hdr_bssid(hdr, len)); 668 if (hapd == NULL || hapd == HAPD_BROADCAST) 669 return; 670 ieee802_11_mgmt_cb(hapd, buf, len, stype, ok); 671 } 672 673 #endif /* NEED_AP_MLME */ 674 675 676 static int hostapd_event_new_sta(struct hostapd_data *hapd, const u8 *addr) 677 { 678 struct sta_info *sta = ap_get_sta(hapd, addr); 679 if (sta) 680 return 0; 681 682 wpa_printf(MSG_DEBUG, "Data frame from unknown STA " MACSTR 683 " - adding a new STA", MAC2STR(addr)); 684 sta = ap_sta_add(hapd, addr); 685 if (sta) { 686 hostapd_new_assoc_sta(hapd, sta, 0); 687 } else { 688 wpa_printf(MSG_DEBUG, "Failed to add STA entry for " MACSTR, 689 MAC2STR(addr)); 690 return -1; 691 } 692 693 return 0; 694 } 695 696 697 static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8 *src, 698 const u8 *data, size_t data_len) 699 { 700 struct hostapd_iface *iface = hapd->iface; 701 struct sta_info *sta; 702 size_t j; 703 704 for (j = 0; j < iface->num_bss; j++) { 705 if ((sta = ap_get_sta(iface->bss[j], src))) { 706 if (sta->flags & WLAN_STA_ASSOC) { 707 hapd = iface->bss[j]; 708 break; 709 } 710 } 711 } 712 713 ieee802_1x_receive(hapd, src, data, data_len); 714 } 715 716 717 void wpa_supplicant_event(void *ctx, enum wpa_event_type event, 718 union wpa_event_data *data) 719 { 720 struct hostapd_data *hapd = ctx; 721 #ifndef CONFIG_NO_STDOUT_DEBUG 722 int level = MSG_DEBUG; 723 724 if (event == EVENT_RX_MGMT && data->rx_mgmt.frame && 725 data->rx_mgmt.frame_len >= 24) { 726 const struct ieee80211_hdr *hdr; 727 u16 fc; 728 hdr = (const struct ieee80211_hdr *) data->rx_mgmt.frame; 729 fc = le_to_host16(hdr->frame_control); 730 if (WLAN_FC_GET_TYPE(fc) == WLAN_FC_TYPE_MGMT && 731 WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_BEACON) 732 level = MSG_EXCESSIVE; 733 } 734 735 wpa_dbg(hapd->msg_ctx, level, "Event %s (%d) received", 736 event_to_string(event), event); 737 #endif /* CONFIG_NO_STDOUT_DEBUG */ 738 739 switch (event) { 740 case EVENT_MICHAEL_MIC_FAILURE: 741 michael_mic_failure(hapd, data->michael_mic_failure.src, 1); 742 break; 743 case EVENT_SCAN_RESULTS: 744 if (hapd->iface->scan_cb) 745 hapd->iface->scan_cb(hapd->iface); 746 break; 747 #ifdef CONFIG_IEEE80211R 748 case EVENT_FT_RRB_RX: 749 wpa_ft_rrb_rx(hapd->wpa_auth, data->ft_rrb_rx.src, 750 data->ft_rrb_rx.data, data->ft_rrb_rx.data_len); 751 break; 752 #endif /* CONFIG_IEEE80211R */ 753 case EVENT_WPS_BUTTON_PUSHED: 754 hostapd_wps_button_pushed(hapd, NULL); 755 break; 756 #ifdef NEED_AP_MLME 757 case EVENT_TX_STATUS: 758 switch (data->tx_status.type) { 759 case WLAN_FC_TYPE_MGMT: 760 hostapd_mgmt_tx_cb(hapd, data->tx_status.data, 761 data->tx_status.data_len, 762 data->tx_status.stype, 763 data->tx_status.ack); 764 break; 765 case WLAN_FC_TYPE_DATA: 766 hostapd_tx_status(hapd, data->tx_status.dst, 767 data->tx_status.data, 768 data->tx_status.data_len, 769 data->tx_status.ack); 770 break; 771 } 772 break; 773 case EVENT_EAPOL_TX_STATUS: 774 hostapd_eapol_tx_status(hapd, data->eapol_tx_status.dst, 775 data->eapol_tx_status.data, 776 data->eapol_tx_status.data_len, 777 data->eapol_tx_status.ack); 778 break; 779 case EVENT_DRIVER_CLIENT_POLL_OK: 780 hostapd_client_poll_ok(hapd, data->client_poll.addr); 781 break; 782 case EVENT_RX_FROM_UNKNOWN: 783 hostapd_rx_from_unknown_sta(hapd, data->rx_from_unknown.bssid, 784 data->rx_from_unknown.addr, 785 data->rx_from_unknown.wds); 786 break; 787 case EVENT_RX_MGMT: 788 hostapd_mgmt_rx(hapd, &data->rx_mgmt); 789 break; 790 #endif /* NEED_AP_MLME */ 791 case EVENT_RX_PROBE_REQ: 792 if (data->rx_probe_req.sa == NULL || 793 data->rx_probe_req.ie == NULL) 794 break; 795 hostapd_probe_req_rx(hapd, data->rx_probe_req.sa, 796 data->rx_probe_req.da, 797 data->rx_probe_req.bssid, 798 data->rx_probe_req.ie, 799 data->rx_probe_req.ie_len, 800 data->rx_probe_req.ssi_signal); 801 break; 802 case EVENT_NEW_STA: 803 hostapd_event_new_sta(hapd, data->new_sta.addr); 804 break; 805 case EVENT_EAPOL_RX: 806 hostapd_event_eapol_rx(hapd, data->eapol_rx.src, 807 data->eapol_rx.data, 808 data->eapol_rx.data_len); 809 break; 810 case EVENT_ASSOC: 811 hostapd_notif_assoc(hapd, data->assoc_info.addr, 812 data->assoc_info.req_ies, 813 data->assoc_info.req_ies_len, 814 data->assoc_info.reassoc); 815 break; 816 case EVENT_DISASSOC: 817 if (data) 818 hostapd_notif_disassoc(hapd, data->disassoc_info.addr); 819 break; 820 case EVENT_DEAUTH: 821 if (data) 822 hostapd_notif_disassoc(hapd, data->deauth_info.addr); 823 break; 824 case EVENT_STATION_LOW_ACK: 825 if (!data) 826 break; 827 hostapd_event_sta_low_ack(hapd, data->low_ack.addr); 828 break; 829 case EVENT_RX_ACTION: 830 if (data->rx_action.da == NULL || data->rx_action.sa == NULL || 831 data->rx_action.bssid == NULL) 832 break; 833 #ifdef NEED_AP_MLME 834 hostapd_rx_action(hapd, &data->rx_action); 835 #endif /* NEED_AP_MLME */ 836 hostapd_action_rx(hapd, &data->rx_action); 837 break; 838 case EVENT_AUTH: 839 hostapd_notif_auth(hapd, &data->auth); 840 break; 841 case EVENT_CH_SWITCH: 842 if (!data) 843 break; 844 hostapd_event_ch_switch(hapd, data->ch_switch.freq, 845 data->ch_switch.ht_enabled, 846 data->ch_switch.ch_offset); 847 break; 848 case EVENT_CONNECT_FAILED_REASON: 849 if (!data) 850 break; 851 hostapd_event_connect_failed_reason( 852 hapd, data->connect_failed_reason.addr, 853 data->connect_failed_reason.code); 854 break; 855 default: 856 wpa_printf(MSG_DEBUG, "Unknown event %d", event); 857 break; 858 } 859 } 860 861 #endif /* HOSTAPD */ 862