diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 38182aebe..233320d2e 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -600,7 +600,7 @@ void sta_track_expire(struct hostapd_iface *iface, int force) MAC2STR(info->addr)); dl_list_del(&info->list); iface->num_sta_seen--; - os_free(info); + sta_track_del(info); } } @@ -676,6 +676,23 @@ sta_track_seen_on(struct hostapd_iface *iface, const u8 *addr, } +#ifdef CONFIG_TAXONOMY +void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr, + struct wpabuf **probe_ie_taxonomy) +{ + struct hostapd_sta_info *info; + + info = sta_track_get(iface, addr); + if (!info) + return; + + wpabuf_free(*probe_ie_taxonomy); + *probe_ie_taxonomy = info->probe_ie_taxonomy; + info->probe_ie_taxonomy = NULL; +} +#endif /* CONFIG_TAXONOMY */ + + void handle_probe_req(struct hostapd_data *hapd, const struct ieee80211_mgmt *mgmt, size_t len, int ssi_signal) @@ -787,9 +804,16 @@ void handle_probe_req(struct hostapd_data *hapd, #ifdef CONFIG_TAXONOMY { - struct sta_info *sta = ap_get_sta(hapd, mgmt->sa); - if (sta) + struct sta_info *sta; + struct hostapd_sta_info *info; + + if ((sta = ap_get_sta(hapd, mgmt->sa)) != NULL) { taxonomy_sta_info_probe_req(hapd, sta, ie, ie_len); + } else if ((info = sta_track_get(hapd->iface, + mgmt->sa)) != NULL) { + taxonomy_hostapd_sta_info_probe_req(hapd, info, + ie, ie_len); + } } #endif /* CONFIG_TAXONOMY */ @@ -961,6 +985,16 @@ static u8 * hostapd_probe_resp_offloads(struct hostapd_data *hapd, #endif /* NEED_AP_MLME */ +void sta_track_del(struct hostapd_sta_info *info) +{ +#ifdef CONFIG_TAXONOMY + wpabuf_free(info->probe_ie_taxonomy); + info->probe_ie_taxonomy = NULL; +#endif /* CONFIG_TAXONOMY */ + os_free(info); +} + + int ieee802_11_build_ap_params(struct hostapd_data *hapd, struct wpa_driver_ap_params *params) { diff --git a/src/ap/beacon.h b/src/ap/beacon.h index d98f42e81..fc711815c 100644 --- a/src/ap/beacon.h +++ b/src/ap/beacon.h @@ -22,9 +22,12 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, struct wpa_driver_ap_params *params); void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params); void sta_track_add(struct hostapd_iface *iface, const u8 *addr); +void sta_track_del(struct hostapd_sta_info *info); void sta_track_expire(struct hostapd_iface *iface, int force); struct hostapd_data * sta_track_seen_on(struct hostapd_iface *iface, const u8 *addr, const char *ifname); +void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr, + struct wpabuf **probe_ie_taxonomy); #endif /* BEACON_H */ diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 5e83fbc44..9fafc7f45 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -374,7 +374,7 @@ static void sta_track_deinit(struct hostapd_iface *iface) list))) { dl_list_del(&info->list); iface->num_sta_seen--; - os_free(info); + sta_track_del(info); } } diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index f58c965f5..dec46f692 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -311,6 +311,9 @@ struct hostapd_sta_info { struct dl_list list; u8 addr[ETH_ALEN]; struct os_reltime last_seen; +#ifdef CONFIG_TAXONOMY + struct wpabuf *probe_ie_taxonomy; +#endif /* CONFIG_TAXONOMY */ }; /** diff --git a/src/ap/sta_info.c b/src/ap/sta_info.c index d9aa8e315..f12d4088b 100644 --- a/src/ap/sta_info.c +++ b/src/ap/sta_info.c @@ -667,6 +667,11 @@ struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr) sta->last_seq_ctrl = WLAN_INVALID_MGMT_SEQ; dl_list_init(&sta->ip6addr); +#ifdef CONFIG_TAXONOMY + sta_track_claim_taxonomy_info(hapd->iface, addr, + &sta->probe_ie_taxonomy); +#endif /* CONFIG_TAXONOMY */ + return sta; } diff --git a/src/ap/taxonomy.c b/src/ap/taxonomy.c index e533a1072..cea8b726f 100644 --- a/src/ap/taxonomy.c +++ b/src/ap/taxonomy.c @@ -273,6 +273,15 @@ void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd, } +void taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data *hapd, + struct hostapd_sta_info *info, + const u8 *ie, size_t ie_len) +{ + wpabuf_free(info->probe_ie_taxonomy); + info->probe_ie_taxonomy = wpabuf_alloc_copy(ie, ie_len); +} + + void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd, struct sta_info *sta, const u8 *ie, size_t ie_len) diff --git a/src/ap/taxonomy.h b/src/ap/taxonomy.h index 9c85ee246..80f245c77 100644 --- a/src/ap/taxonomy.h +++ b/src/ap/taxonomy.h @@ -12,6 +12,9 @@ void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd, struct sta_info *sta, const u8 *ie, size_t ie_len); +void taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data *hapd, + struct hostapd_sta_info *sta, + const u8 *ie, size_t ie_len); void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd, struct sta_info *sta, const u8 *ie, size_t ie_len);