Add assocresp_elements parameter for hostapd
This new parameter allows hostapd to add Vendor Specific elements into (Re)Association Response frames similarly to the way vendor_elements parameter can be used for Beacon and Probe Response frames. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
49fe2ada20
commit
a911227061
6 changed files with 48 additions and 0 deletions
|
@ -3379,6 +3379,36 @@ static int hostapd_config_fill(struct hostapd_config *conf,
|
||||||
|
|
||||||
wpabuf_free(bss->vendor_elements);
|
wpabuf_free(bss->vendor_elements);
|
||||||
bss->vendor_elements = elems;
|
bss->vendor_elements = elems;
|
||||||
|
} else if (os_strcmp(buf, "assocresp_elements") == 0) {
|
||||||
|
struct wpabuf *elems;
|
||||||
|
size_t len = os_strlen(pos);
|
||||||
|
if (len & 0x01) {
|
||||||
|
wpa_printf(MSG_ERROR,
|
||||||
|
"Line %d: Invalid assocresp_elements '%s'",
|
||||||
|
line, pos);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
len /= 2;
|
||||||
|
if (len == 0) {
|
||||||
|
wpabuf_free(bss->assocresp_elements);
|
||||||
|
bss->assocresp_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 assocresp_elements '%s'",
|
||||||
|
line, pos);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
wpabuf_free(bss->assocresp_elements);
|
||||||
|
bss->assocresp_elements = elems;
|
||||||
} else if (os_strcmp(buf, "sae_anti_clogging_threshold") == 0) {
|
} else if (os_strcmp(buf, "sae_anti_clogging_threshold") == 0) {
|
||||||
bss->sae_anti_clogging_threshold = atoi(pos);
|
bss->sae_anti_clogging_threshold = atoi(pos);
|
||||||
} else if (os_strcmp(buf, "sae_groups") == 0) {
|
} else if (os_strcmp(buf, "sae_groups") == 0) {
|
||||||
|
|
|
@ -283,6 +283,13 @@ ignore_broadcast_ssid=0
|
||||||
# one or more elements)
|
# one or more elements)
|
||||||
#vendor_elements=dd0411223301
|
#vendor_elements=dd0411223301
|
||||||
|
|
||||||
|
# Additional vendor specific elements for (Re)Association Response frames
|
||||||
|
# This parameter can be used to add additional vendor specific element(s) into
|
||||||
|
# the end of the (Re)Association Response frames. The format for these
|
||||||
|
# element(s) is a hexdump of the raw information elements (id+len+payload for
|
||||||
|
# one or more elements)
|
||||||
|
#assocresp_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
|
||||||
|
|
|
@ -567,6 +567,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
|
||||||
#endif /* CONFIG_HS20 */
|
#endif /* CONFIG_HS20 */
|
||||||
|
|
||||||
wpabuf_free(conf->vendor_elements);
|
wpabuf_free(conf->vendor_elements);
|
||||||
|
wpabuf_free(conf->assocresp_elements);
|
||||||
|
|
||||||
os_free(conf->sae_groups);
|
os_free(conf->sae_groups);
|
||||||
|
|
||||||
|
|
|
@ -557,6 +557,7 @@ struct hostapd_bss_config {
|
||||||
#endif /* CONFIG_RADIUS_TEST */
|
#endif /* CONFIG_RADIUS_TEST */
|
||||||
|
|
||||||
struct wpabuf *vendor_elements;
|
struct wpabuf *vendor_elements;
|
||||||
|
struct wpabuf *assocresp_elements;
|
||||||
|
|
||||||
unsigned int sae_anti_clogging_threshold;
|
unsigned int sae_anti_clogging_threshold;
|
||||||
int *sae_groups;
|
int *sae_groups;
|
||||||
|
|
|
@ -179,6 +179,7 @@ int hostapd_build_ap_extra_ies(struct hostapd_data *hapd,
|
||||||
|
|
||||||
add_buf(&beacon, hapd->conf->vendor_elements);
|
add_buf(&beacon, hapd->conf->vendor_elements);
|
||||||
add_buf(&proberesp, hapd->conf->vendor_elements);
|
add_buf(&proberesp, hapd->conf->vendor_elements);
|
||||||
|
add_buf(&assocresp, hapd->conf->assocresp_elements);
|
||||||
|
|
||||||
*beacon_ret = beacon;
|
*beacon_ret = beacon;
|
||||||
*proberesp_ret = proberesp;
|
*proberesp_ret = proberesp;
|
||||||
|
|
|
@ -1960,6 +1960,14 @@ static u16 send_assoc_resp(struct hostapd_data *hapd, struct sta_info *sta,
|
||||||
|
|
||||||
p = hostapd_eid_mbo(hapd, p, buf + sizeof(buf) - p);
|
p = hostapd_eid_mbo(hapd, p, buf + sizeof(buf) - p);
|
||||||
|
|
||||||
|
if (hapd->conf->assocresp_elements &&
|
||||||
|
(size_t) (buf + sizeof(buf) - p) >=
|
||||||
|
wpabuf_len(hapd->conf->assocresp_elements)) {
|
||||||
|
os_memcpy(p, wpabuf_head(hapd->conf->assocresp_elements),
|
||||||
|
wpabuf_len(hapd->conf->assocresp_elements));
|
||||||
|
p += wpabuf_len(hapd->conf->assocresp_elements);
|
||||||
|
}
|
||||||
|
|
||||||
send_len += p - reply->u.assoc_resp.variable;
|
send_len += p - reply->u.assoc_resp.variable;
|
||||||
|
|
||||||
if (hostapd_drv_send_mlme(hapd, reply, send_len, 0) < 0) {
|
if (hostapd_drv_send_mlme(hapd, reply, send_len, 0) < 0) {
|
||||||
|
|
Loading…
Reference in a new issue