static void madwifi_raw_receive(void *ctx, const u8 *src_addr, const u8 *buf, size_t len) { struct madwifi_driver_data *drv = ctx; const struct ieee80211_mgmt *mgmt; const u8 *end, *ie; u16 fc; size_t ie_len; /* Send Probe Request information to WPS processing */ if (len < IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)) return; mgmt = (const struct ieee80211_mgmt *) buf; fc = le_to_host16(mgmt->frame_control); if (WLAN_FC_GET_TYPE(fc) != WLAN_FC_TYPE_MGMT || WLAN_FC_GET_STYPE(fc) != WLAN_FC_STYPE_PROBE_REQ) return; end = buf + len; ie = mgmt->u.probe_req.variable; ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)); hostapd_wps_probe_req_rx(drv->hapd, mgmt->sa, ie, ie_len); }
static void test_driver_scan(struct test_driver_data *drv, struct sockaddr_un *from, socklen_t fromlen, char *data) { char buf[512], *pos, *end; int ret; struct test_driver_bss *bss; u8 sa[ETH_ALEN]; u8 ie[512]; size_t ielen; /* data: optional [ ' ' | STA-addr | ' ' | IEs(hex) ] */ wpa_printf(MSG_DEBUG, "test_driver: SCAN"); if (*data) { if (*data != ' ' || hwaddr_aton(data + 1, sa)) { wpa_printf(MSG_DEBUG, "test_driver: Unexpected SCAN " "command format"); return; } data += 18; while (*data == ' ') data++; ielen = os_strlen(data) / 2; if (ielen > sizeof(ie)) ielen = sizeof(ie); if (hexstr2bin(data, ie, ielen) < 0) ielen = 0; wpa_printf(MSG_DEBUG, "test_driver: Scan from " MACSTR, MAC2STR(sa)); wpa_hexdump(MSG_MSGDUMP, "test_driver: scan IEs", ie, ielen); hostapd_wps_probe_req_rx(drv->hapd, sa, ie, ielen); } for (bss = drv->bss; bss; bss = bss->next) { pos = buf; end = buf + sizeof(buf); /* reply: SCANRESP BSSID SSID IEs */ ret = snprintf(pos, end - pos, "SCANRESP " MACSTR " ", MAC2STR(bss->bssid)); if (ret < 0 || ret >= end - pos) return; pos += ret; pos += wpa_snprintf_hex(pos, end - pos, bss->ssid, bss->ssid_len); ret = snprintf(pos, end - pos, " "); if (ret < 0 || ret >= end - pos) return; pos += ret; pos += wpa_snprintf_hex(pos, end - pos, bss->ie, bss->ielen); pos += wpa_snprintf_hex(pos, end - pos, bss->wps_probe_resp_ie, bss->wps_probe_resp_ie_len); if (bss->privacy) { ret = snprintf(pos, end - pos, " PRIVACY"); if (ret < 0 || ret >= end - pos) return; pos += ret; } sendto(drv->test_socket, buf, pos - buf, 0, (struct sockaddr *) from, fromlen); } }
void handle_probe_req(struct hostapd_data *hapd, struct ieee80211_mgmt *mgmt, size_t len) { struct ieee80211_mgmt *resp; struct ieee802_11_elems elems; char *ssid; u8 *pos, *epos, *ie; size_t ssid_len, ie_len; struct sta_info *sta = NULL; ie = mgmt->u.probe_req.variable; ie_len = len - (IEEE80211_HDRLEN + sizeof(mgmt->u.probe_req)); hostapd_wps_probe_req_rx(hapd, mgmt->sa, ie, ie_len); if (!hapd->iconf->send_probe_response) return; if (ieee802_11_parse_elems(ie, ie_len, &elems, 0) == ParseFailed) { wpa_printf(MSG_DEBUG, "Could not parse ProbeReq from " MACSTR, MAC2STR(mgmt->sa)); return; } ssid = NULL; ssid_len = 0; if ((!elems.ssid || !elems.supp_rates)) { wpa_printf(MSG_DEBUG, "STA " MACSTR " sent probe request " "without SSID or supported rates element", MAC2STR(mgmt->sa)); return; } if (hapd->conf->ignore_broadcast_ssid && elems.ssid_len == 0) { wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for " "broadcast SSID ignored", MAC2STR(mgmt->sa)); return; } sta = ap_get_sta(hapd, mgmt->sa); if (elems.ssid_len == 0 || (elems.ssid_len == hapd->conf->ssid.ssid_len && os_memcmp(elems.ssid, hapd->conf->ssid.ssid, elems.ssid_len) == 0)) { ssid = hapd->conf->ssid.ssid; ssid_len = hapd->conf->ssid.ssid_len; if (sta) sta->ssid_probe = &hapd->conf->ssid; } if (!ssid) { if (!(mgmt->da[0] & 0x01)) { char ssid_txt[33]; ieee802_11_print_ssid(ssid_txt, elems.ssid, elems.ssid_len); wpa_printf(MSG_MSGDUMP, "Probe Request from " MACSTR " for foreign SSID '%s'", MAC2STR(mgmt->sa), ssid_txt); } return; } /* TODO: verify that supp_rates contains at least one matching rate * with AP configuration */ #define MAX_PROBERESP_LEN 768 resp = os_zalloc(MAX_PROBERESP_LEN); if (resp == NULL) return; epos = ((u8 *) resp) + MAX_PROBERESP_LEN; resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, WLAN_FC_STYPE_PROBE_RESP); os_memcpy(resp->da, mgmt->sa, ETH_ALEN); os_memcpy(resp->sa, hapd->own_addr, ETH_ALEN); os_memcpy(resp->bssid, hapd->own_addr, ETH_ALEN); resp->u.probe_resp.beacon_int = host_to_le16(hapd->iconf->beacon_int); /* hardware or low-level driver will setup seq_ctrl and timestamp */ resp->u.probe_resp.capab_info = host_to_le16(hostapd_own_capab_info(hapd, sta, 1)); pos = resp->u.probe_resp.variable; *pos++ = WLAN_EID_SSID; *pos++ = ssid_len; os_memcpy(pos, ssid, ssid_len); pos += ssid_len; /* Supported rates */ pos = hostapd_eid_supp_rates(hapd, pos); /* DS Params */ pos = hostapd_eid_ds_params(hapd, pos); pos = hostapd_eid_country(hapd, pos, epos - pos); /* ERP Information element */ pos = hostapd_eid_erp_info(hapd, pos); /* Extended supported rates */ pos = hostapd_eid_ext_supp_rates(hapd, pos); pos = hostapd_eid_wpa(hapd, pos, epos - pos, sta); /* Wi-Fi Alliance WMM */ pos = hostapd_eid_wmm(hapd, pos); pos = hostapd_eid_ht_capabilities_info(hapd, pos); pos = hostapd_eid_ht_operation(hapd, pos); #ifdef CONFIG_WPS if (hapd->conf->wps_state && hapd->wps_probe_resp_ie) { os_memcpy(pos, hapd->wps_probe_resp_ie, hapd->wps_probe_resp_ie_len); pos += hapd->wps_probe_resp_ie_len; } #endif /* CONFIG_WPS */ if (hostapd_send_mgmt_frame(hapd, resp, pos - (u8 *) resp, 0) < 0) perror("handle_probe_req: send"); os_free(resp); wpa_printf(MSG_MSGDUMP, "STA " MACSTR " sent probe request for %s " "SSID", MAC2STR(mgmt->sa), elems.ssid_len == 0 ? "broadcast" : "our"); }