Add parameter for vendor specific elements into Beacon/Probe Response
authorJouni Malinen <jouni@qca.qualcomm.com>
Mon, 27 Aug 2012 13:20:10 +0000 (16:20 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 27 Aug 2012 13:20:10 +0000 (16:20 +0300)
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>

hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.c
src/ap/ap_config.h
src/ap/beacon.c

index 0c644fc..85a1fc6 100644 (file)
@@ -2880,6 +2880,34 @@ static int hostapd_config_fill(struct hostapd_config *conf,
                        bss->hs20_operating_class = oper_class;
                        bss->hs20_operating_class_len = oper_class_len;
 #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 {
                        wpa_printf(MSG_ERROR, "Line %d: unknown configuration "
                                   "item '%s'", line, buf);
index d27cc47..5a2c2ea 100644 (file)
@@ -201,6 +201,13 @@ auth_algs=3
 #     requests for broadcast SSID
 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_<queue name>_<param>
 # queues: data0, data1, data2, data3, after_beacon, beacon
index 0b22875..31e1c19 100644 (file)
@@ -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_operating_class);
 #endif /* CONFIG_HS20 */
+
+       wpabuf_free(conf->vendor_elements);
 }
 
 
index ce9690d..f5e4a6a 100644 (file)
@@ -444,6 +444,8 @@ struct hostapd_bss_config {
 #ifdef CONFIG_RADIUS_TEST
        char *dump_msk_file;
 #endif /* CONFIG_RADIUS_TEST */
+
+       struct wpabuf *vendor_elements;
 };
 
 
index ca3f054..2f813f3 100644 (file)
@@ -206,6 +206,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
        if (hapd->p2p_probe_resp_ie)
                buflen += wpabuf_len(hapd->p2p_probe_resp_ie);
 #endif /* CONFIG_P2P */
+       if (hapd->conf->vendor_elements)
+               buflen += wpabuf_len(hapd->conf->vendor_elements);
        resp = os_zalloc(buflen);
        if (resp == NULL)
                return NULL;
@@ -297,6 +299,12 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
        pos = hostapd_eid_hs20_indication(hapd, pos);
 #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;
        return (u8 *) resp;
 }
@@ -528,6 +536,8 @@ void ieee802_11_set_beacon(struct hostapd_data *hapd)
        if (hapd->p2p_beacon_ie)
                tail_len += wpabuf_len(hapd->p2p_beacon_ie);
 #endif /* CONFIG_P2P */
+       if (hapd->conf->vendor_elements)
+               tail_len += wpabuf_len(hapd->conf->vendor_elements);
        tailpos = tail = os_malloc(tail_len);
        if (head == NULL || tail == NULL) {
                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);
 #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;
 
        resp = hostapd_probe_resp_offloads(hapd, &resp_len);