Add parameter for vendor specific elements into Beacon/Probe Response
The new vendor_elements parameter in hostapd.conf can be used to add new vendor specific element(s) into Beacon and Probe Response frames. Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
a462036a47
commit
b52f084cfa
5 changed files with 55 additions and 0 deletions
|
@ -2880,6 +2880,34 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
bss->hs20_operating_class = oper_class;
|
bss->hs20_operating_class = oper_class;
|
||||||
bss->hs20_operating_class_len = oper_class_len;
|
bss->hs20_operating_class_len = oper_class_len;
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
} else if (os_strcmp(buf, "vendor_elements") == 0) {
|
||||||
|
struct wpabuf *elems;
|
||||||
|
size_t len = os_strlen(pos);
|
||||||
|
if (len & 0x01) {
|
||||||
|
wpa_printf(MSG_ERROR, "Line %d: Invalid "
|
||||||
|
"vendor_elements '%s'", line, pos);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
len /= 2;
|
||||||
|
if (len == 0) {
|
||||||
|
wpabuf_free(bss->vendor_elements);
|
||||||
|
bss->vendor_elements = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
elems = wpabuf_alloc(len);
|
||||||
|
if (elems == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (hexstr2bin(pos, wpabuf_put(elems, len), len)) {
|
||||||
|
wpabuf_free(elems);
|
||||||
|
wpa_printf(MSG_ERROR, "Line %d: Invalid "
|
||||||
|
"vendor_elements '%s'", line, pos);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wpabuf_free(bss->vendor_elements);
|
||||||
|
bss->vendor_elements = elems;
|
||||||
} else {
|
} else {
|
||||||
wpa_printf(MSG_ERROR, "Line %d: unknown configuration "
|
wpa_printf(MSG_ERROR, "Line %d: unknown configuration "
|
||||||
"item '%s'", line, buf);
|
"item '%s'", line, buf);
|
||||||
|
|
|
@ -201,6 +201,13 @@ auth_algs=3
|
||||||
# requests for broadcast SSID
|
# requests for broadcast SSID
|
||||||
ignore_broadcast_ssid=0
|
ignore_broadcast_ssid=0
|
||||||
|
|
||||||
|
# Additional vendor specfic elements for Beacon and Probe Response frames
|
||||||
|
# This parameter can be used to add additional vendor specific element(s) into
|
||||||
|
# the end of the Beacon and Probe Response frames. The format for these
|
||||||
|
# element(s) is a hexdump of the raw information elements (id+len+payload for
|
||||||
|
# one or more elements)
|
||||||
|
#vendor_elements=dd0411223301
|
||||||
|
|
||||||
# TX queue parameters (EDCF / bursting)
|
# TX queue parameters (EDCF / bursting)
|
||||||
# tx_queue_<queue name>_<param>
|
# tx_queue_<queue name>_<param>
|
||||||
# queues: data0, data1, data2, data3, after_beacon, beacon
|
# queues: data0, data1, data2, data3, after_beacon, beacon
|
||||||
|
|
|
@ -513,6 +513,8 @@ static void hostapd_config_free_bss(struct hostapd_bss_config *conf)
|
||||||
os_free(conf->hs20_connection_capability);
|
os_free(conf->hs20_connection_capability);
|
||||||
os_free(conf->hs20_operating_class);
|
os_free(conf->hs20_operating_class);
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
|
||||||
|
wpabuf_free(conf->vendor_elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -444,6 +444,8 @@ struct hostapd_bss_config {
|
||||||
#ifdef CONFIG_RADIUS_TEST
|
#ifdef CONFIG_RADIUS_TEST
|
||||||
char *dump_msk_file;
|
char *dump_msk_file;
|
||||||
#endif /* CONFIG_RADIUS_TEST */
|
#endif /* CONFIG_RADIUS_TEST */
|
||||||
|
|
||||||
|
struct wpabuf *vendor_elements;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -206,6 +206,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
||||||
if (hapd->p2p_probe_resp_ie)
|
if (hapd->p2p_probe_resp_ie)
|
||||||
buflen += wpabuf_len(hapd->p2p_probe_resp_ie);
|
buflen += wpabuf_len(hapd->p2p_probe_resp_ie);
|
||||||
#endif /* CONFIG_P2P */
|
#endif /* CONFIG_P2P */
|
||||||
|
if (hapd->conf->vendor_elements)
|
||||||
|
buflen += wpabuf_len(hapd->conf->vendor_elements);
|
||||||
resp = os_zalloc(buflen);
|
resp = os_zalloc(buflen);
|
||||||
if (resp == NULL)
|
if (resp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -297,6 +299,12 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
|
||||||
pos = hostapd_eid_hs20_indication(hapd, pos);
|
pos = hostapd_eid_hs20_indication(hapd, pos);
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
|
||||||
|
if (hapd->conf->vendor_elements) {
|
||||||
|
os_memcpy(pos, wpabuf_head(hapd->conf->vendor_elements),
|
||||||
|
wpabuf_len(hapd->conf->vendor_elements));
|
||||||
|
pos += wpabuf_len(hapd->conf->vendor_elements);
|
||||||
|
}
|
||||||
|
|
||||||
*resp_len = pos - (u8 *) resp;
|
*resp_len = pos - (u8 *) resp;
|
||||||
return (u8 *) resp;
|
return (u8 *) resp;
|
||||||
}
|
}
|
||||||
|
@ -528,6 +536,8 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
if (hapd->p2p_beacon_ie)
|
if (hapd->p2p_beacon_ie)
|
||||||
tail_len += wpabuf_len(hapd->p2p_beacon_ie);
|
tail_len += wpabuf_len(hapd->p2p_beacon_ie);
|
||||||
#endif /* CONFIG_P2P */
|
#endif /* CONFIG_P2P */
|
||||||
|
if (hapd->conf->vendor_elements)
|
||||||
|
tail_len += wpabuf_len(hapd->conf->vendor_elements);
|
||||||
tailpos = tail = os_malloc(tail_len);
|
tailpos = tail = os_malloc(tail_len);
|
||||||
if (head == NULL || tail == NULL) {
|
if (head == NULL || tail == NULL) {
|
||||||
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
wpa_printf(MSG_ERROR, "Failed to set beacon data");
|
||||||
|
@ -638,6 +648,12 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
|
||||||
tailpos = hostapd_eid_hs20_indication(hapd, tailpos);
|
tailpos = hostapd_eid_hs20_indication(hapd, tailpos);
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
|
||||||
|
if (hapd->conf->vendor_elements) {
|
||||||
|
os_memcpy(tailpos, wpabuf_head(hapd->conf->vendor_elements),
|
||||||
|
wpabuf_len(hapd->conf->vendor_elements));
|
||||||
|
tailpos += wpabuf_len(hapd->conf->vendor_elements);
|
||||||
|
}
|
||||||
|
|
||||||
tail_len = tailpos > tail ? tailpos - tail : 0;
|
tail_len = tailpos > tail ? tailpos - tail : 0;
|
||||||
|
|
||||||
resp = hostapd_probe_resp_offloads(hapd, &resp_len);
|
resp = hostapd_probe_resp_offloads(hapd, &resp_len);
|
||||||
|
|
Loading…
Reference in a new issue