]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
WFD: Allow WFD_SUBELEM_SET/GET all to be used with full IE buffer
authorJouni Malinen <jouni@qca.qualcomm.com>
Fri, 5 Dec 2014 13:22:33 +0000 (15:22 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 5 Dec 2014 13:22:33 +0000 (15:22 +0200)
This extends the previously used WFD_SUBELEM_SET/GET <subelem id> design
to allow special "all" value to be used as an id to indicate that all
WFD subelements are to be set/get. This uses similar interface as was
previously added over D-Bus.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
wpa_supplicant/wifi_display.c

index 5c06e42abba9a6fa128c3bbbff0c815afc2b7b8a..c363b21b92b160b5a6a12b41a9ec1cce94bf951c 100644 (file)
@@ -233,15 +233,31 @@ int wifi_display_subelem_set(struct wpa_global *global, char *cmd)
        if (pos == NULL)
                return -1;
        *pos++ = '\0';
-       subelem = atoi(cmd);
-       if (subelem < 0 || subelem >= MAX_WFD_SUBELEMS)
-               return -1;
 
        len = os_strlen(pos);
        if (len & 1)
                return -1;
        len /= 2;
 
+       if (os_strcmp(cmd, "all") == 0) {
+               int res;
+
+               e = wpabuf_alloc(len);
+               if (e == NULL)
+                       return -1;
+               if (hexstr2bin(pos, wpabuf_put(e, len), len) < 0) {
+                       wpabuf_free(e);
+                       return -1;
+               }
+               res = wifi_display_subelem_set_from_ies(global, e);
+               wpabuf_free(e);
+               return res;
+       }
+
+       subelem = atoi(cmd);
+       if (subelem < 0 || subelem >= MAX_WFD_SUBELEMS)
+               return -1;
+
        if (len == 0) {
                /* Clear subelement */
                e = NULL;
@@ -325,6 +341,19 @@ int wifi_display_subelem_get(struct wpa_global *global, char *cmd,
 {
        int subelem;
 
+       if (os_strcmp(cmd, "all") == 0) {
+               struct wpabuf *ie;
+               int res;
+
+               ie = wifi_display_get_wfd_ie(global);
+               if (ie == NULL)
+                       return 0;
+               res = wpa_snprintf_hex(buf, buflen, wpabuf_head(ie),
+                                      wpabuf_len(ie));
+               wpabuf_free(ie);
+               return res;
+       }
+
        subelem = atoi(cmd);
        if (subelem < 0 || subelem >= MAX_WFD_SUBELEMS)
                return -1;