1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * hostapd / Client taxonomy
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2015 Google, Inc.
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker *
8*03f9172cSAndroid Build Coastguard Worker * Parse a series of IEs, as in Probe Request or (Re)Association Request frames,
9*03f9172cSAndroid Build Coastguard Worker * and render them to a descriptive string. The tag number of standard options
10*03f9172cSAndroid Build Coastguard Worker * is written to the string, while the vendor ID and subtag are written for
11*03f9172cSAndroid Build Coastguard Worker * vendor options.
12*03f9172cSAndroid Build Coastguard Worker *
13*03f9172cSAndroid Build Coastguard Worker * Example strings:
14*03f9172cSAndroid Build Coastguard Worker * 0,1,50,45,221(00904c,51)
15*03f9172cSAndroid Build Coastguard Worker * 0,1,33,36,48,45,221(00904c,51),221(0050f2,2)
16*03f9172cSAndroid Build Coastguard Worker */
17*03f9172cSAndroid Build Coastguard Worker
18*03f9172cSAndroid Build Coastguard Worker #include "utils/includes.h"
19*03f9172cSAndroid Build Coastguard Worker
20*03f9172cSAndroid Build Coastguard Worker #include "utils/common.h"
21*03f9172cSAndroid Build Coastguard Worker #include "common/wpa_ctrl.h"
22*03f9172cSAndroid Build Coastguard Worker #include "hostapd.h"
23*03f9172cSAndroid Build Coastguard Worker #include "sta_info.h"
24*03f9172cSAndroid Build Coastguard Worker #include "taxonomy.h"
25*03f9172cSAndroid Build Coastguard Worker
26*03f9172cSAndroid Build Coastguard Worker
27*03f9172cSAndroid Build Coastguard Worker /* Copy a string with no funny schtuff allowed; only alphanumerics. */
no_mischief_strncpy(char * dst,const char * src,size_t n)28*03f9172cSAndroid Build Coastguard Worker static void no_mischief_strncpy(char *dst, const char *src, size_t n)
29*03f9172cSAndroid Build Coastguard Worker {
30*03f9172cSAndroid Build Coastguard Worker size_t i;
31*03f9172cSAndroid Build Coastguard Worker
32*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < n; i++) {
33*03f9172cSAndroid Build Coastguard Worker unsigned char s = src[i];
34*03f9172cSAndroid Build Coastguard Worker int is_lower = s >= 'a' && s <= 'z';
35*03f9172cSAndroid Build Coastguard Worker int is_upper = s >= 'A' && s <= 'Z';
36*03f9172cSAndroid Build Coastguard Worker int is_digit = s >= '0' && s <= '9';
37*03f9172cSAndroid Build Coastguard Worker
38*03f9172cSAndroid Build Coastguard Worker if (is_lower || is_upper || is_digit) {
39*03f9172cSAndroid Build Coastguard Worker /* TODO: if any manufacturer uses Unicode within the
40*03f9172cSAndroid Build Coastguard Worker * WPS header, it will get mangled here. */
41*03f9172cSAndroid Build Coastguard Worker dst[i] = s;
42*03f9172cSAndroid Build Coastguard Worker } else {
43*03f9172cSAndroid Build Coastguard Worker /* Note that even spaces will be transformed to
44*03f9172cSAndroid Build Coastguard Worker * underscores, so 'Nexus 7' will turn into 'Nexus_7'.
45*03f9172cSAndroid Build Coastguard Worker * This is deliberate, to make the string easier to
46*03f9172cSAndroid Build Coastguard Worker * parse. */
47*03f9172cSAndroid Build Coastguard Worker dst[i] = '_';
48*03f9172cSAndroid Build Coastguard Worker }
49*03f9172cSAndroid Build Coastguard Worker }
50*03f9172cSAndroid Build Coastguard Worker }
51*03f9172cSAndroid Build Coastguard Worker
52*03f9172cSAndroid Build Coastguard Worker
get_wps_name(char * name,size_t name_len,const u8 * data,size_t data_len)53*03f9172cSAndroid Build Coastguard Worker static int get_wps_name(char *name, size_t name_len,
54*03f9172cSAndroid Build Coastguard Worker const u8 *data, size_t data_len)
55*03f9172cSAndroid Build Coastguard Worker {
56*03f9172cSAndroid Build Coastguard Worker /* Inside the WPS IE are a series of attributes, using two byte IDs
57*03f9172cSAndroid Build Coastguard Worker * and two byte lengths. We're looking for the model name, if
58*03f9172cSAndroid Build Coastguard Worker * present. */
59*03f9172cSAndroid Build Coastguard Worker while (data_len >= 4) {
60*03f9172cSAndroid Build Coastguard Worker u16 id, elen;
61*03f9172cSAndroid Build Coastguard Worker
62*03f9172cSAndroid Build Coastguard Worker id = WPA_GET_BE16(data);
63*03f9172cSAndroid Build Coastguard Worker elen = WPA_GET_BE16(data + 2);
64*03f9172cSAndroid Build Coastguard Worker data += 4;
65*03f9172cSAndroid Build Coastguard Worker data_len -= 4;
66*03f9172cSAndroid Build Coastguard Worker
67*03f9172cSAndroid Build Coastguard Worker if (elen > data_len)
68*03f9172cSAndroid Build Coastguard Worker return 0;
69*03f9172cSAndroid Build Coastguard Worker
70*03f9172cSAndroid Build Coastguard Worker if (id == 0x1023) {
71*03f9172cSAndroid Build Coastguard Worker /* Model name, like 'Nexus 7' */
72*03f9172cSAndroid Build Coastguard Worker size_t n = (elen < name_len) ? elen : name_len;
73*03f9172cSAndroid Build Coastguard Worker no_mischief_strncpy(name, (const char *) data, n);
74*03f9172cSAndroid Build Coastguard Worker return n;
75*03f9172cSAndroid Build Coastguard Worker }
76*03f9172cSAndroid Build Coastguard Worker
77*03f9172cSAndroid Build Coastguard Worker data += elen;
78*03f9172cSAndroid Build Coastguard Worker data_len -= elen;
79*03f9172cSAndroid Build Coastguard Worker }
80*03f9172cSAndroid Build Coastguard Worker
81*03f9172cSAndroid Build Coastguard Worker return 0;
82*03f9172cSAndroid Build Coastguard Worker }
83*03f9172cSAndroid Build Coastguard Worker
84*03f9172cSAndroid Build Coastguard Worker
ie_to_string(char * fstr,size_t fstr_len,const struct wpabuf * ies)85*03f9172cSAndroid Build Coastguard Worker static void ie_to_string(char *fstr, size_t fstr_len, const struct wpabuf *ies)
86*03f9172cSAndroid Build Coastguard Worker {
87*03f9172cSAndroid Build Coastguard Worker char *fpos = fstr;
88*03f9172cSAndroid Build Coastguard Worker char *fend = fstr + fstr_len;
89*03f9172cSAndroid Build Coastguard Worker char htcap[7 + 4 + 1]; /* ",htcap:" + %04hx + trailing NUL */
90*03f9172cSAndroid Build Coastguard Worker char htagg[7 + 2 + 1]; /* ",htagg:" + %02hx + trailing NUL */
91*03f9172cSAndroid Build Coastguard Worker char htmcs[7 + 8 + 1]; /* ",htmcs:" + %08x + trailing NUL */
92*03f9172cSAndroid Build Coastguard Worker char vhtcap[8 + 8 + 1]; /* ",vhtcap:" + %08x + trailing NUL */
93*03f9172cSAndroid Build Coastguard Worker char vhtrxmcs[10 + 8 + 1]; /* ",vhtrxmcs:" + %08x + trailing NUL */
94*03f9172cSAndroid Build Coastguard Worker char vhttxmcs[10 + 8 + 1]; /* ",vhttxmcs:" + %08x + trailing NUL */
95*03f9172cSAndroid Build Coastguard Worker #define MAX_EXTCAP 254
96*03f9172cSAndroid Build Coastguard Worker char extcap[8 + 2 * MAX_EXTCAP + 1]; /* ",extcap:" + hex + trailing NUL
97*03f9172cSAndroid Build Coastguard Worker */
98*03f9172cSAndroid Build Coastguard Worker char txpow[7 + 4 + 1]; /* ",txpow:" + %04hx + trailing NUL */
99*03f9172cSAndroid Build Coastguard Worker #define WPS_NAME_LEN 32
100*03f9172cSAndroid Build Coastguard Worker char wps[WPS_NAME_LEN + 5 + 1]; /* room to prepend ",wps:" + trailing
101*03f9172cSAndroid Build Coastguard Worker * NUL */
102*03f9172cSAndroid Build Coastguard Worker int num = 0;
103*03f9172cSAndroid Build Coastguard Worker const u8 *ie;
104*03f9172cSAndroid Build Coastguard Worker size_t ie_len;
105*03f9172cSAndroid Build Coastguard Worker int ret;
106*03f9172cSAndroid Build Coastguard Worker
107*03f9172cSAndroid Build Coastguard Worker os_memset(htcap, 0, sizeof(htcap));
108*03f9172cSAndroid Build Coastguard Worker os_memset(htagg, 0, sizeof(htagg));
109*03f9172cSAndroid Build Coastguard Worker os_memset(htmcs, 0, sizeof(htmcs));
110*03f9172cSAndroid Build Coastguard Worker os_memset(vhtcap, 0, sizeof(vhtcap));
111*03f9172cSAndroid Build Coastguard Worker os_memset(vhtrxmcs, 0, sizeof(vhtrxmcs));
112*03f9172cSAndroid Build Coastguard Worker os_memset(vhttxmcs, 0, sizeof(vhttxmcs));
113*03f9172cSAndroid Build Coastguard Worker os_memset(extcap, 0, sizeof(extcap));
114*03f9172cSAndroid Build Coastguard Worker os_memset(txpow, 0, sizeof(txpow));
115*03f9172cSAndroid Build Coastguard Worker os_memset(wps, 0, sizeof(wps));
116*03f9172cSAndroid Build Coastguard Worker *fpos = '\0';
117*03f9172cSAndroid Build Coastguard Worker
118*03f9172cSAndroid Build Coastguard Worker if (!ies)
119*03f9172cSAndroid Build Coastguard Worker return;
120*03f9172cSAndroid Build Coastguard Worker ie = wpabuf_head(ies);
121*03f9172cSAndroid Build Coastguard Worker ie_len = wpabuf_len(ies);
122*03f9172cSAndroid Build Coastguard Worker
123*03f9172cSAndroid Build Coastguard Worker while (ie_len >= 2) {
124*03f9172cSAndroid Build Coastguard Worker u8 id, elen;
125*03f9172cSAndroid Build Coastguard Worker char *sep = (num++ == 0) ? "" : ",";
126*03f9172cSAndroid Build Coastguard Worker
127*03f9172cSAndroid Build Coastguard Worker id = *ie++;
128*03f9172cSAndroid Build Coastguard Worker elen = *ie++;
129*03f9172cSAndroid Build Coastguard Worker ie_len -= 2;
130*03f9172cSAndroid Build Coastguard Worker
131*03f9172cSAndroid Build Coastguard Worker if (elen > ie_len)
132*03f9172cSAndroid Build Coastguard Worker break;
133*03f9172cSAndroid Build Coastguard Worker
134*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_VENDOR_SPECIFIC && elen >= 4) {
135*03f9172cSAndroid Build Coastguard Worker /* Vendor specific */
136*03f9172cSAndroid Build Coastguard Worker if (WPA_GET_BE32(ie) == WPS_IE_VENDOR_TYPE) {
137*03f9172cSAndroid Build Coastguard Worker /* WPS */
138*03f9172cSAndroid Build Coastguard Worker char model_name[WPS_NAME_LEN + 1];
139*03f9172cSAndroid Build Coastguard Worker const u8 *data = &ie[4];
140*03f9172cSAndroid Build Coastguard Worker size_t data_len = elen - 4;
141*03f9172cSAndroid Build Coastguard Worker
142*03f9172cSAndroid Build Coastguard Worker os_memset(model_name, 0, sizeof(model_name));
143*03f9172cSAndroid Build Coastguard Worker if (get_wps_name(model_name, WPS_NAME_LEN, data,
144*03f9172cSAndroid Build Coastguard Worker data_len)) {
145*03f9172cSAndroid Build Coastguard Worker os_snprintf(wps, sizeof(wps),
146*03f9172cSAndroid Build Coastguard Worker ",wps:%s", model_name);
147*03f9172cSAndroid Build Coastguard Worker }
148*03f9172cSAndroid Build Coastguard Worker }
149*03f9172cSAndroid Build Coastguard Worker
150*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(fpos, fend - fpos,
151*03f9172cSAndroid Build Coastguard Worker "%s%d(%02x%02x%02x,%d)",
152*03f9172cSAndroid Build Coastguard Worker sep, id, ie[0], ie[1], ie[2], ie[3]);
153*03f9172cSAndroid Build Coastguard Worker } else {
154*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_HT_CAP && elen >= 2) {
155*03f9172cSAndroid Build Coastguard Worker /* HT Capabilities (802.11n) */
156*03f9172cSAndroid Build Coastguard Worker os_snprintf(htcap, sizeof(htcap),
157*03f9172cSAndroid Build Coastguard Worker ",htcap:%04hx",
158*03f9172cSAndroid Build Coastguard Worker WPA_GET_LE16(ie));
159*03f9172cSAndroid Build Coastguard Worker }
160*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_HT_CAP && elen >= 3) {
161*03f9172cSAndroid Build Coastguard Worker /* HT Capabilities (802.11n), A-MPDU information
162*03f9172cSAndroid Build Coastguard Worker */
163*03f9172cSAndroid Build Coastguard Worker os_snprintf(htagg, sizeof(htagg),
164*03f9172cSAndroid Build Coastguard Worker ",htagg:%02hx", (u16) ie[2]);
165*03f9172cSAndroid Build Coastguard Worker }
166*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_HT_CAP && elen >= 7) {
167*03f9172cSAndroid Build Coastguard Worker /* HT Capabilities (802.11n), MCS information */
168*03f9172cSAndroid Build Coastguard Worker os_snprintf(htmcs, sizeof(htmcs),
169*03f9172cSAndroid Build Coastguard Worker ",htmcs:%08hx",
170*03f9172cSAndroid Build Coastguard Worker (u16) WPA_GET_LE32(ie + 3));
171*03f9172cSAndroid Build Coastguard Worker }
172*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_VHT_CAP && elen >= 4) {
173*03f9172cSAndroid Build Coastguard Worker /* VHT Capabilities (802.11ac) */
174*03f9172cSAndroid Build Coastguard Worker os_snprintf(vhtcap, sizeof(vhtcap),
175*03f9172cSAndroid Build Coastguard Worker ",vhtcap:%08x",
176*03f9172cSAndroid Build Coastguard Worker WPA_GET_LE32(ie));
177*03f9172cSAndroid Build Coastguard Worker }
178*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_VHT_CAP && elen >= 8) {
179*03f9172cSAndroid Build Coastguard Worker /* VHT Capabilities (802.11ac), RX MCS
180*03f9172cSAndroid Build Coastguard Worker * information */
181*03f9172cSAndroid Build Coastguard Worker os_snprintf(vhtrxmcs, sizeof(vhtrxmcs),
182*03f9172cSAndroid Build Coastguard Worker ",vhtrxmcs:%08x",
183*03f9172cSAndroid Build Coastguard Worker WPA_GET_LE32(ie + 4));
184*03f9172cSAndroid Build Coastguard Worker }
185*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_VHT_CAP && elen >= 12) {
186*03f9172cSAndroid Build Coastguard Worker /* VHT Capabilities (802.11ac), TX MCS
187*03f9172cSAndroid Build Coastguard Worker * information */
188*03f9172cSAndroid Build Coastguard Worker os_snprintf(vhttxmcs, sizeof(vhttxmcs),
189*03f9172cSAndroid Build Coastguard Worker ",vhttxmcs:%08x",
190*03f9172cSAndroid Build Coastguard Worker WPA_GET_LE32(ie + 8));
191*03f9172cSAndroid Build Coastguard Worker }
192*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_EXT_CAPAB) {
193*03f9172cSAndroid Build Coastguard Worker /* Extended Capabilities */
194*03f9172cSAndroid Build Coastguard Worker int i;
195*03f9172cSAndroid Build Coastguard Worker int len = (elen < MAX_EXTCAP) ? elen :
196*03f9172cSAndroid Build Coastguard Worker MAX_EXTCAP;
197*03f9172cSAndroid Build Coastguard Worker char *p = extcap;
198*03f9172cSAndroid Build Coastguard Worker
199*03f9172cSAndroid Build Coastguard Worker p += os_snprintf(extcap, sizeof(extcap),
200*03f9172cSAndroid Build Coastguard Worker ",extcap:");
201*03f9172cSAndroid Build Coastguard Worker for (i = 0; i < len; i++) {
202*03f9172cSAndroid Build Coastguard Worker int lim;
203*03f9172cSAndroid Build Coastguard Worker
204*03f9172cSAndroid Build Coastguard Worker lim = sizeof(extcap) -
205*03f9172cSAndroid Build Coastguard Worker os_strlen(extcap);
206*03f9172cSAndroid Build Coastguard Worker if (lim <= 0)
207*03f9172cSAndroid Build Coastguard Worker break;
208*03f9172cSAndroid Build Coastguard Worker p += os_snprintf(p, lim, "%02x",
209*03f9172cSAndroid Build Coastguard Worker *(ie + i));
210*03f9172cSAndroid Build Coastguard Worker }
211*03f9172cSAndroid Build Coastguard Worker }
212*03f9172cSAndroid Build Coastguard Worker if (id == WLAN_EID_PWR_CAPABILITY && elen == 2) {
213*03f9172cSAndroid Build Coastguard Worker /* TX Power */
214*03f9172cSAndroid Build Coastguard Worker os_snprintf(txpow, sizeof(txpow),
215*03f9172cSAndroid Build Coastguard Worker ",txpow:%04hx",
216*03f9172cSAndroid Build Coastguard Worker WPA_GET_LE16(ie));
217*03f9172cSAndroid Build Coastguard Worker }
218*03f9172cSAndroid Build Coastguard Worker
219*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(fpos, fend - fpos, "%s%d", sep, id);
220*03f9172cSAndroid Build Coastguard Worker }
221*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(fend - fpos, ret))
222*03f9172cSAndroid Build Coastguard Worker goto fail;
223*03f9172cSAndroid Build Coastguard Worker fpos += ret;
224*03f9172cSAndroid Build Coastguard Worker
225*03f9172cSAndroid Build Coastguard Worker ie += elen;
226*03f9172cSAndroid Build Coastguard Worker ie_len -= elen;
227*03f9172cSAndroid Build Coastguard Worker }
228*03f9172cSAndroid Build Coastguard Worker
229*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(fpos, fend - fpos, "%s%s%s%s%s%s%s%s%s",
230*03f9172cSAndroid Build Coastguard Worker htcap, htagg, htmcs, vhtcap, vhtrxmcs, vhttxmcs,
231*03f9172cSAndroid Build Coastguard Worker txpow, extcap, wps);
232*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(fend - fpos, ret)) {
233*03f9172cSAndroid Build Coastguard Worker fail:
234*03f9172cSAndroid Build Coastguard Worker fstr[0] = '\0';
235*03f9172cSAndroid Build Coastguard Worker }
236*03f9172cSAndroid Build Coastguard Worker }
237*03f9172cSAndroid Build Coastguard Worker
238*03f9172cSAndroid Build Coastguard Worker
retrieve_sta_taxonomy(const struct hostapd_data * hapd,struct sta_info * sta,char * buf,size_t buflen)239*03f9172cSAndroid Build Coastguard Worker int retrieve_sta_taxonomy(const struct hostapd_data *hapd,
240*03f9172cSAndroid Build Coastguard Worker struct sta_info *sta, char *buf, size_t buflen)
241*03f9172cSAndroid Build Coastguard Worker {
242*03f9172cSAndroid Build Coastguard Worker int ret;
243*03f9172cSAndroid Build Coastguard Worker char *pos, *end;
244*03f9172cSAndroid Build Coastguard Worker
245*03f9172cSAndroid Build Coastguard Worker if (!sta->probe_ie_taxonomy || !sta->assoc_ie_taxonomy)
246*03f9172cSAndroid Build Coastguard Worker return 0;
247*03f9172cSAndroid Build Coastguard Worker
248*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(buf, buflen, "wifi4|probe:");
249*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(buflen, ret))
250*03f9172cSAndroid Build Coastguard Worker return 0;
251*03f9172cSAndroid Build Coastguard Worker pos = buf + ret;
252*03f9172cSAndroid Build Coastguard Worker end = buf + buflen;
253*03f9172cSAndroid Build Coastguard Worker
254*03f9172cSAndroid Build Coastguard Worker ie_to_string(pos, end - pos, sta->probe_ie_taxonomy);
255*03f9172cSAndroid Build Coastguard Worker pos = os_strchr(pos, '\0');
256*03f9172cSAndroid Build Coastguard Worker if (pos >= end)
257*03f9172cSAndroid Build Coastguard Worker return 0;
258*03f9172cSAndroid Build Coastguard Worker ret = os_snprintf(pos, end - pos, "|assoc:");
259*03f9172cSAndroid Build Coastguard Worker if (os_snprintf_error(end - pos, ret))
260*03f9172cSAndroid Build Coastguard Worker return 0;
261*03f9172cSAndroid Build Coastguard Worker pos += ret;
262*03f9172cSAndroid Build Coastguard Worker ie_to_string(pos, end - pos, sta->assoc_ie_taxonomy);
263*03f9172cSAndroid Build Coastguard Worker pos = os_strchr(pos, '\0');
264*03f9172cSAndroid Build Coastguard Worker return pos - buf;
265*03f9172cSAndroid Build Coastguard Worker }
266*03f9172cSAndroid Build Coastguard Worker
267*03f9172cSAndroid Build Coastguard Worker
taxonomy_sta_info_probe_req(const struct hostapd_data * hapd,struct sta_info * sta,const u8 * ie,size_t ie_len)268*03f9172cSAndroid Build Coastguard Worker void taxonomy_sta_info_probe_req(const struct hostapd_data *hapd,
269*03f9172cSAndroid Build Coastguard Worker struct sta_info *sta,
270*03f9172cSAndroid Build Coastguard Worker const u8 *ie, size_t ie_len)
271*03f9172cSAndroid Build Coastguard Worker {
272*03f9172cSAndroid Build Coastguard Worker wpabuf_free(sta->probe_ie_taxonomy);
273*03f9172cSAndroid Build Coastguard Worker sta->probe_ie_taxonomy = wpabuf_alloc_copy(ie, ie_len);
274*03f9172cSAndroid Build Coastguard Worker }
275*03f9172cSAndroid Build Coastguard Worker
276*03f9172cSAndroid Build Coastguard Worker
taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data * hapd,struct hostapd_sta_info * info,const u8 * ie,size_t ie_len)277*03f9172cSAndroid Build Coastguard Worker void taxonomy_hostapd_sta_info_probe_req(const struct hostapd_data *hapd,
278*03f9172cSAndroid Build Coastguard Worker struct hostapd_sta_info *info,
279*03f9172cSAndroid Build Coastguard Worker const u8 *ie, size_t ie_len)
280*03f9172cSAndroid Build Coastguard Worker {
281*03f9172cSAndroid Build Coastguard Worker wpabuf_free(info->probe_ie_taxonomy);
282*03f9172cSAndroid Build Coastguard Worker info->probe_ie_taxonomy = wpabuf_alloc_copy(ie, ie_len);
283*03f9172cSAndroid Build Coastguard Worker }
284*03f9172cSAndroid Build Coastguard Worker
285*03f9172cSAndroid Build Coastguard Worker
taxonomy_sta_info_assoc_req(const struct hostapd_data * hapd,struct sta_info * sta,const u8 * ie,size_t ie_len)286*03f9172cSAndroid Build Coastguard Worker void taxonomy_sta_info_assoc_req(const struct hostapd_data *hapd,
287*03f9172cSAndroid Build Coastguard Worker struct sta_info *sta,
288*03f9172cSAndroid Build Coastguard Worker const u8 *ie, size_t ie_len)
289*03f9172cSAndroid Build Coastguard Worker {
290*03f9172cSAndroid Build Coastguard Worker wpabuf_free(sta->assoc_ie_taxonomy);
291*03f9172cSAndroid Build Coastguard Worker sta->assoc_ie_taxonomy = wpabuf_alloc_copy(ie, ie_len);
292*03f9172cSAndroid Build Coastguard Worker }
293