]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
WFD: Add WFD R2 Subelements
authorAmarnath Hullur Subramanyam <amarnath@qca.qualcomm.com>
Wed, 1 Mar 2017 05:18:58 +0000 (21:18 -0800)
committerJouni Malinen <j@w1.fi>
Wed, 1 Mar 2017 09:59:57 +0000 (11:59 +0200)
Define and add support for WFD R2 Subelements.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/common/ieee802_11_defs.h
src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_group.c
src/p2p/p2p_i.h
wpa_supplicant/wifi_display.c
wpa_supplicant/wpa_supplicant_i.h

index 15f6d42cd1ea037b94a62ae94cb36846d4a42836..eecabd9450496480e30e791c308d5f7edd59f0c8 100644 (file)
@@ -1570,7 +1570,9 @@ enum wifi_display_subelem {
        WFD_SUBELEM_COUPLED_SINK = 6,
        WFD_SUBELEM_EXT_CAPAB = 7,
        WFD_SUBELEM_LOCAL_IP_ADDRESS = 8,
-       WFD_SUBELEM_SESSION_INFO = 9
+       WFD_SUBELEM_SESSION_INFO = 9,
+       WFD_SUBELEM_MAC_INFO = 10,
+       WFD_SUBELEM_R2_DEVICE_INFO = 11,
 };
 
 /* 802.11s */
index 14d6279981afa14d82dc759980e238cfc0074e8a..77eda064bb8d4348825fe0ffa90c9f7828366451 100644 (file)
@@ -2993,6 +2993,7 @@ void p2p_deinit(struct p2p_data *p2p)
        wpabuf_free(p2p->wfd_dev_info);
        wpabuf_free(p2p->wfd_assoc_bssid);
        wpabuf_free(p2p->wfd_coupled_sink_info);
+       wpabuf_free(p2p->wfd_r2_dev_info);
 #endif /* CONFIG_WIFI_DISPLAY */
 
        eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
@@ -5143,6 +5144,20 @@ int p2p_set_wfd_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
 }
 
 
+int p2p_set_wfd_r2_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
+{
+       wpabuf_free(p2p->wfd_r2_dev_info);
+       if (elem) {
+               p2p->wfd_r2_dev_info = wpabuf_dup(elem);
+               if (p2p->wfd_r2_dev_info == NULL)
+                       return -1;
+       } else
+               p2p->wfd_r2_dev_info = NULL;
+
+       return 0;
+}
+
+
 int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem)
 {
        wpabuf_free(p2p->wfd_assoc_bssid);
index 70d3a907e2ceb646d1ae741d7244d1a500e94765..fac5ce05ae6e14042d104c3481d861d04770c206 100644 (file)
@@ -2266,6 +2266,7 @@ int p2p_set_wfd_ie_prov_disc_req(struct p2p_data *p2p, struct wpabuf *ie);
 int p2p_set_wfd_ie_prov_disc_resp(struct p2p_data *p2p, struct wpabuf *ie);
 int p2p_set_wfd_ie_go_neg(struct p2p_data *p2p, struct wpabuf *ie);
 int p2p_set_wfd_dev_info(struct p2p_data *p2p, const struct wpabuf *elem);
+int p2p_set_wfd_r2_dev_info(struct p2p_data *p2p, const struct wpabuf *elem);
 int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem);
 int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p,
                                  const struct wpabuf *elem);
index 051b4e391505e40c9ef4141026e8ac08c039be94..16c28a0d95ee73d09e97bb7f7cffd82880ebfb3f 100644 (file)
@@ -367,6 +367,8 @@ wifi_display_build_go_ie(struct p2p_group *group)
                return NULL;
        if (group->p2p->wfd_dev_info)
                wpabuf_put_buf(wfd_subelems, group->p2p->wfd_dev_info);
+       if (group->p2p->wfd_r2_dev_info)
+               wpabuf_put_buf(wfd_subelems, group->p2p->wfd_r2_dev_info);
        if (group->p2p->wfd_assoc_bssid)
                wpabuf_put_buf(wfd_subelems,
                               group->p2p->wfd_assoc_bssid);
index ce699329cb247132909713903da0367966bfc5dd..0041d5978c484d7979556813697d57bd0920408f 100644 (file)
@@ -545,6 +545,7 @@ struct p2p_data {
        struct wpabuf *wfd_dev_info;
        struct wpabuf *wfd_assoc_bssid;
        struct wpabuf *wfd_coupled_sink_info;
+       struct wpabuf *wfd_r2_dev_info;
 #endif /* CONFIG_WIFI_DISPLAY */
 
        u16 authorized_oob_dev_pw_id;
index c363b21b92b160b5a6a12b41a9ec1cce94bf951c..c94e4610893a503bf8304e379aff13d54a6d64fc 100644 (file)
@@ -86,6 +86,7 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global)
                p2p_set_wfd_ie_prov_disc_resp(global->p2p, NULL);
                p2p_set_wfd_ie_go_neg(global->p2p, NULL);
                p2p_set_wfd_dev_info(global->p2p, NULL);
+               p2p_set_wfd_r2_dev_info(global->p2p, NULL);
                p2p_set_wfd_assoc_bssid(global->p2p, NULL);
                p2p_set_wfd_coupled_sink_info(global->p2p, NULL);
                return 0;
@@ -93,6 +94,8 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global)
 
        p2p_set_wfd_dev_info(global->p2p,
                             global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO]);
+       p2p_set_wfd_r2_dev_info(
+               global->p2p, global->wfd_subelem[WFD_SUBELEM_R2_DEVICE_INFO]);
        p2p_set_wfd_assoc_bssid(
                global->p2p,
                global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID]);
@@ -133,6 +136,11 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global)
        if (global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO])
                len += wpabuf_len(global->wfd_subelem[
                                          WFD_SUBELEM_DEVICE_INFO]);
+
+       if (global->wfd_subelem[WFD_SUBELEM_R2_DEVICE_INFO])
+               len += wpabuf_len(global->wfd_subelem[
+                                         WFD_SUBELEM_R2_DEVICE_INFO]);
+
        if (global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID])
                len += wpabuf_len(global->wfd_subelem[
                                          WFD_SUBELEM_ASSOCIATED_BSSID]);
@@ -151,6 +159,11 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global)
        if (global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO])
                wpabuf_put_buf(buf,
                               global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO]);
+
+       if (global->wfd_subelem[WFD_SUBELEM_R2_DEVICE_INFO])
+               wpabuf_put_buf(buf,
+                              global->wfd_subelem[WFD_SUBELEM_R2_DEVICE_INFO]);
+
        if (global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID])
                wpabuf_put_buf(buf, global->wfd_subelem[
                                       WFD_SUBELEM_ASSOCIATED_BSSID]);
index 50cdf86cee10686367c160d563b782fef2e49f3f..95e19b8feadbd3f908ebf5b510c89498bafa6839 100644 (file)
@@ -296,7 +296,7 @@ struct wpa_global {
 
 #ifdef CONFIG_WIFI_DISPLAY
        int wifi_display;
-#define MAX_WFD_SUBELEMS 10
+#define MAX_WFD_SUBELEMS 12
        struct wpabuf *wfd_subelem[MAX_WFD_SUBELEMS];
 #endif /* CONFIG_WIFI_DISPLAY */