Parcourir la source

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>
Bala Krishna Bhamidipati il y a 9 ans
Parent
commit
a911227061
6 fichiers modifiés avec 48 ajouts et 0 suppressions
  1. 30 0
      hostapd/config_file.c
  2. 7 0
      hostapd/hostapd.conf
  3. 1 0
      src/ap/ap_config.c
  4. 1 0
      src/ap/ap_config.h
  5. 1 0
      src/ap/ap_drv_ops.c
  6. 8 0
      src/ap/ieee802_11.c

+ 30 - 0
hostapd/config_file.c

@@ -3379,6 +3379,36 @@ static int hostapd_config_fill(struct hostapd_config *conf,
 
 		wpabuf_free(bss->vendor_elements);
 		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) {
 		bss->sae_anti_clogging_threshold = atoi(pos);
 	} else if (os_strcmp(buf, "sae_groups") == 0) {

+ 7 - 0
hostapd/hostapd.conf

@@ -283,6 +283,13 @@ ignore_broadcast_ssid=0
 # one or more elements)
 #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_<queue name>_<param>
 # queues: data0, data1, data2, data3, after_beacon, beacon

+ 1 - 0
src/ap/ap_config.c

@@ -567,6 +567,7 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
 #endif /* CONFIG_HS20 */
 
 	wpabuf_free(conf->vendor_elements);
+	wpabuf_free(conf->assocresp_elements);
 
 	os_free(conf->sae_groups);
 

+ 1 - 0
src/ap/ap_config.h

@@ -557,6 +557,7 @@ struct hostapd_bss_config {
 #endif /* CONFIG_RADIUS_TEST */
 
 	struct wpabuf *vendor_elements;
+	struct wpabuf *assocresp_elements;
 
 	unsigned int sae_anti_clogging_threshold;
 	int *sae_groups;

+ 1 - 0
src/ap/ap_drv_ops.c

@@ -179,6 +179,7 @@ int hostapd_build_ap_extra_ies(struct hostapd_data *hapd,
 
 	add_buf(&beacon, hapd->conf->vendor_elements);
 	add_buf(&proberesp, hapd->conf->vendor_elements);
+	add_buf(&assocresp, hapd->conf->assocresp_elements);
 
 	*beacon_ret = beacon;
 	*proberesp_ret = proberesp;

+ 8 - 0
src/ap/ieee802_11.c

@@ -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);
 
+	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;
 
 	if (hostapd_drv_send_mlme(hapd, reply, send_len, 0) < 0) {