void ap_list_process_beacon(struct hostapd_iface *iface, struct ieee80211_mgmt *mgmt, struct ieee802_11_elems *elems, struct hostapd_frame_info *fi) { struct ap_info *ap; int new_ap = 0; size_t len; if (iface->conf->ap_table_max_size < 1) return; ap = ap_get_ap(iface, mgmt->bssid); if (!ap) { ap = ap_ap_add(iface, mgmt->bssid); if (!ap) { printf("Failed to allocate AP information entry\n"); return; } new_ap = 1; } ap->beacon_int = le_to_host16(mgmt->u.beacon.beacon_int); ap->capability = le_to_host16(mgmt->u.beacon.capab_info); if (elems->ssid) { len = elems->ssid_len; if (len >= sizeof(ap->ssid)) len = sizeof(ap->ssid) - 1; memcpy(ap->ssid, elems->ssid, len); ap->ssid[len] = '\0'; ap->ssid_len = len; } memset(ap->supported_rates, 0, WLAN_SUPP_RATES_MAX); len = 0; if (elems->supp_rates) { len = elems->supp_rates_len; if (len > WLAN_SUPP_RATES_MAX) len = WLAN_SUPP_RATES_MAX; memcpy(ap->supported_rates, elems->supp_rates, len); } if (elems->ext_supp_rates) { int len2; if (len + elems->ext_supp_rates_len > WLAN_SUPP_RATES_MAX) len2 = WLAN_SUPP_RATES_MAX - len; else len2 = elems->ext_supp_rates_len; memcpy(ap->supported_rates + len, elems->ext_supp_rates, len2); } ap->wpa = elems->wpa_ie != NULL; if (elems->erp_info && elems->erp_info_len == 1) ap->erp = elems->erp_info[0]; else ap->erp = -1; if (elems->ds_params && elems->ds_params_len == 1) ap->channel = elems->ds_params[0]; else if (fi) ap->channel = fi->channel; ap->num_beacons++; time(&ap->last_beacon); if (fi) { ap->phytype = fi->phytype; ap->ssi_signal = fi->ssi_signal; ap->datarate = fi->datarate; } if (new_ap) { if (iface->conf->passive_scan_interval > 0) ap_list_new_ap(iface, ap); } else if (ap != iface->ap_list) { /* move AP entry into the beginning of the list so that the * oldest entry is always in the end of the list */ ap_ap_list_del(iface, ap); ap_ap_list_add(iface, ap); } if (!iface->olbc && ap_list_beacon_olbc(iface, ap)) { struct hostapd_data *hapd = iface->bss[0]; iface->olbc = 1; HOSTAPD_DEBUG(HOSTAPD_DEBUG_MINIMAL, "OLBC AP detected: " MACSTR " - enable " "protection\n", MAC2STR(ap->addr)); ieee802_11_set_beacons(hapd->iface); } }
void ap_list_process_beacon(struct hostapd_iface *iface, const struct ieee80211_mgmt *mgmt, struct ieee802_11_elems *elems, struct hostapd_frame_info *fi) { struct ap_info *ap; struct os_time now; int new_ap = 0; size_t len; int set_beacon = 0; if (iface->conf->ap_table_max_size < 1) return; ap = ap_get_ap(iface, mgmt->bssid); if (!ap) { ap = ap_ap_add(iface, mgmt->bssid); if (!ap) { printf("Failed to allocate AP information entry\n"); return; } new_ap = 1; } ap->beacon_int = le_to_host16(mgmt->u.beacon.beacon_int); ap->capability = le_to_host16(mgmt->u.beacon.capab_info); if (elems->ssid) { len = elems->ssid_len; if (len >= sizeof(ap->ssid)) len = sizeof(ap->ssid) - 1; os_memcpy(ap->ssid, elems->ssid, len); ap->ssid[len] = '\0'; ap->ssid_len = len; } os_memset(ap->supported_rates, 0, WLAN_SUPP_RATES_MAX); len = 0; if (elems->supp_rates) { len = elems->supp_rates_len; if (len > WLAN_SUPP_RATES_MAX) len = WLAN_SUPP_RATES_MAX; os_memcpy(ap->supported_rates, elems->supp_rates, len); } if (elems->ext_supp_rates) { int len2; if (len + elems->ext_supp_rates_len > WLAN_SUPP_RATES_MAX) len2 = WLAN_SUPP_RATES_MAX - len; else len2 = elems->ext_supp_rates_len; if(len >= sizeof(ap->supported_rates) ) { } else { os_memcpy(ap->supported_rates + len, elems->ext_supp_rates, len2); } } ap->wpa = elems->wpa_ie != NULL; if (elems->erp_info && elems->erp_info_len == 1) ap->erp = elems->erp_info[0]; else ap->erp = -1; if (elems->ds_params && elems->ds_params_len == 1) ap->channel = elems->ds_params[0]; else if (fi) ap->channel = fi->channel; if (elems->ht_capabilities) ap->ht_support = 1; else ap->ht_support = 0; ap->num_beacons++; os_get_time(&now); ap->last_beacon = now.sec; if (fi) ap->datarate = fi->datarate; if (!new_ap && ap != iface->ap_list) { /* move AP entry into the beginning of the list so that the * oldest entry is always in the end of the list */ ap_ap_list_del(iface, ap); ap_ap_list_add(iface, ap); } if (!iface->olbc && ap_list_beacon_olbc(iface, ap)) { iface->olbc = 1; wpa_printf(MSG_DEBUG, "OLBC AP detected: " MACSTR " - enable " "protection", MAC2STR(ap->addr)); set_beacon++; } #ifdef CONFIG_IEEE80211N if (!iface->olbc_ht && !ap->ht_support) { iface->olbc_ht = 1; hostapd_ht_operation_update(iface); wpa_printf(MSG_DEBUG, "OLBC HT AP detected: " MACSTR " - enable protection", MAC2STR(ap->addr)); set_beacon++; } #endif /* CONFIG_IEEE80211N */ if (set_beacon) ieee802_11_update_beacons(iface); }
void ap_list_process_beacon(struct hostapd_iface *iface, const struct ieee80211_mgmt *mgmt, struct ieee802_11_elems *elems, struct hostapd_frame_info *fi) { struct ap_info *ap; int new_ap = 0; int set_beacon = 0; if (iface->conf->ap_table_max_size < 1) return; ap = ap_get_ap(iface, mgmt->bssid); if (!ap) { ap = ap_ap_add(iface, mgmt->bssid); if (!ap) { wpa_printf(MSG_INFO, "Failed to allocate AP information entry"); return; } new_ap = 1; } merge_byte_arrays(ap->supported_rates, WLAN_SUPP_RATES_MAX, elems->supp_rates, elems->supp_rates_len, elems->ext_supp_rates, elems->ext_supp_rates_len); if (elems->erp_info) ap->erp = elems->erp_info[0]; else ap->erp = -1; if (elems->ds_params) ap->channel = elems->ds_params[0]; else if (elems->ht_operation) ap->channel = elems->ht_operation[0]; else if (fi) ap->channel = fi->channel; if (elems->ht_capabilities) ap->ht_support = 1; else ap->ht_support = 0; os_get_reltime(&ap->last_beacon); if (!new_ap && ap != iface->ap_list) { /* move AP entry into the beginning of the list so that the * oldest entry is always in the end of the list */ ap_ap_list_del(iface, ap); ap_ap_list_add(iface, ap); } if (!iface->olbc && ap_list_beacon_olbc(iface, ap)) { iface->olbc = 1; wpa_printf(MSG_DEBUG, "OLBC AP detected: " MACSTR " (channel %d) - enable protection", MAC2STR(ap->addr), ap->channel); set_beacon++; } #ifdef CONFIG_IEEE80211N if (!iface->olbc_ht && !ap->ht_support && (ap->channel == 0 || ap->channel == iface->conf->channel || ap->channel == iface->conf->channel + iface->conf->secondary_channel * 4)) { iface->olbc_ht = 1; hostapd_ht_operation_update(iface); wpa_printf(MSG_DEBUG, "OLBC HT AP detected: " MACSTR " (channel %d) - enable protection", MAC2STR(ap->addr), ap->channel); set_beacon++; } #endif /* CONFIG_IEEE80211N */ if (set_beacon) ieee802_11_update_beacons(iface); }