@@ -580,6 +580,19 @@ static enum ssid_match_result ssid_match(struct hostapd_data *hapd,
}
+void sta_track_del(struct hostapd_sta_info *info)
+{
+#ifdef CONFIG_TAXONOMY
+ if (info->probe_ie_taxonomy) {
+ os_free((void *)info->probe_ie_taxonomy);
+ info->probe_ie_taxonomy = NULL;
+ }
+#endif /* CONFIG_TAXONOMY */
+
+ os_free(info);
+}
+
+
void sta_track_expire(struct hostapd_iface *iface, int force)
{
struct os_reltime now;
@@ -602,7 +615,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);
}
}
@@ -675,6 +688,23 @@ sta_track_seen_on(struct hostapd_iface *iface, const u8 *addr,
return NULL;
}
+#ifdef CONFIG_TAXONOMY
+void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr,
+ const u8 **probe_ie_taxonomy, size_t *probe_ie_taxonomy_len)
+{
+ struct hostapd_sta_info *info = sta_track_get(iface, addr);
+ if (!info) {
+ *probe_ie_taxonomy = NULL;
+ *probe_ie_taxonomy_len = 0;
+ return;
+ }
+
+ *probe_ie_taxonomy = info->probe_ie_taxonomy;
+ info->probe_ie_taxonomy = NULL;
+ *probe_ie_taxonomy_len = info->probe_ie_taxonomy_len;
+ info->probe_ie_taxonomy_len = 0;
+}
+#endif /* CONFIG_TAXONOMY */
void handle_probe_req(struct hostapd_data *hapd,
const struct ieee80211_mgmt *mgmt, size_t len,
@@ -787,9 +817,15 @@ void handle_probe_req(struct hostapd_data *hapd,
#ifdef CONFIG_TAXONOMY
{
- struct sta_info *sta = ap_get_sta(hapd, mgmt->sa);
- if (sta) {
- hostapd_taxonomy_probe_req(hapd, sta, ie, ie_len);
+ 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 */
@@ -22,9 +22,14 @@ 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);
+#ifdef CONFIG_TAXONOMY
+void sta_track_claim_taxonomy_info(struct hostapd_iface *iface, const u8 *addr,
+ const u8 **probe_ie_taxonomy, size_t *probe_ie_taxonomy_len);
+#endif /* CONFIG_TAXONOMY */
#endif /* BEACON_H */
@@ -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);
}
}
@@ -311,6 +311,10 @@ struct hostapd_sta_info {
struct dl_list list;
u8 addr[ETH_ALEN];
struct os_reltime last_seen;
+#ifdef CONFIG_TAXONOMY
+ const u8 *probe_ie_taxonomy;
+ size_t probe_ie_taxonomy_len;
+#endif /* CONFIG_TAXONOMY */
};
/**
@@ -2254,7 +2254,7 @@ static void handle_assoc(struct hostapd_data *hapd,
sta->timeout_next = STA_NULLFUNC;
#ifdef CONFIG_TAXONOMY
- hostapd_taxonomy_assoc_req(hapd, sta, pos, left);
+ taxonomy_sta_info_assoc_req(hapd, sta, pos, left);
#endif /* CONFIG_TAXONOMY */
fail:
@@ -673,6 +673,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, &sta->probe_ie_taxonomy_len);
+#endif /* CONFIG_TAXONOMY */
+
return sta;
}
@@ -271,7 +271,7 @@ int retrieve_sta_taxonomy(const struct hostapd_data *hapd,
return 0;
}
-void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
+void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd,
struct sta_info *sta, const u8 *ie, size_t ie_len)
{
if (sta->probe_ie_taxonomy) {
@@ -284,7 +284,20 @@ void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
sta->probe_ie_taxonomy_len = ie_len;
}
-void hostapd_taxonomy_assoc_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)
+{
+ if (info->probe_ie_taxonomy) {
+ os_free(info->probe_ie_taxonomy);
+ info->probe_ie_taxonomy = NULL;
+ info->probe_ie_taxonomy_len = 0;
+ }
+ info->probe_ie_taxonomy = os_malloc(ie_len);
+ os_memcpy(info->probe_ie_taxonomy, ie, ie_len);
+ info->probe_ie_taxonomy_len = ie_len;
+}
+
+void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd,
struct sta_info *sta, const u8 *ie, size_t ie_len)
{
if (sta->assoc_ie_taxonomy) {
@@ -9,9 +9,11 @@
#ifndef TAXONOMY_H
#define TAXONOMY_H
-void hostapd_taxonomy_probe_req(const struct hostapd_data *hapd,
+void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd,
struct sta_info *sta, const u8 *ie, size_t ie_len);
-void hostapd_taxonomy_assoc_req(const struct hostapd_data *hapd,
+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);
int retrieve_sta_taxonomy(const struct hostapd_data *hapd,
struct sta_info *sta, char *buf, size_t buflen);