WFD: Add WFD R2 Subelements

Define and add support for WFD R2 Subelements.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Amarnath Hullur Subramanyam 2017-02-28 21:18:58 -08:00 committed by Jouni Malinen
parent 21ac782797
commit e9518ae749
7 changed files with 36 additions and 2 deletions

View file

@ -1570,7 +1570,9 @@ enum wifi_display_subelem {
WFD_SUBELEM_COUPLED_SINK = 6, WFD_SUBELEM_COUPLED_SINK = 6,
WFD_SUBELEM_EXT_CAPAB = 7, WFD_SUBELEM_EXT_CAPAB = 7,
WFD_SUBELEM_LOCAL_IP_ADDRESS = 8, 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 */ /* 802.11s */

View file

@ -2993,6 +2993,7 @@ void p2p_deinit(struct p2p_data *p2p)
wpabuf_free(p2p->wfd_dev_info); wpabuf_free(p2p->wfd_dev_info);
wpabuf_free(p2p->wfd_assoc_bssid); wpabuf_free(p2p->wfd_assoc_bssid);
wpabuf_free(p2p->wfd_coupled_sink_info); wpabuf_free(p2p->wfd_coupled_sink_info);
wpabuf_free(p2p->wfd_r2_dev_info);
#endif /* CONFIG_WIFI_DISPLAY */ #endif /* CONFIG_WIFI_DISPLAY */
eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL); 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) int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem)
{ {
wpabuf_free(p2p->wfd_assoc_bssid); wpabuf_free(p2p->wfd_assoc_bssid);

View 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_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_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_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_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem);
int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p, int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p,
const struct wpabuf *elem); const struct wpabuf *elem);

View file

@ -367,6 +367,8 @@ wifi_display_build_go_ie(struct p2p_group *group)
return NULL; return NULL;
if (group->p2p->wfd_dev_info) if (group->p2p->wfd_dev_info)
wpabuf_put_buf(wfd_subelems, 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) if (group->p2p->wfd_assoc_bssid)
wpabuf_put_buf(wfd_subelems, wpabuf_put_buf(wfd_subelems,
group->p2p->wfd_assoc_bssid); group->p2p->wfd_assoc_bssid);

View file

@ -545,6 +545,7 @@ struct p2p_data {
struct wpabuf *wfd_dev_info; struct wpabuf *wfd_dev_info;
struct wpabuf *wfd_assoc_bssid; struct wpabuf *wfd_assoc_bssid;
struct wpabuf *wfd_coupled_sink_info; struct wpabuf *wfd_coupled_sink_info;
struct wpabuf *wfd_r2_dev_info;
#endif /* CONFIG_WIFI_DISPLAY */ #endif /* CONFIG_WIFI_DISPLAY */
u16 authorized_oob_dev_pw_id; u16 authorized_oob_dev_pw_id;

View 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_prov_disc_resp(global->p2p, NULL);
p2p_set_wfd_ie_go_neg(global->p2p, NULL); p2p_set_wfd_ie_go_neg(global->p2p, NULL);
p2p_set_wfd_dev_info(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_assoc_bssid(global->p2p, NULL);
p2p_set_wfd_coupled_sink_info(global->p2p, NULL); p2p_set_wfd_coupled_sink_info(global->p2p, NULL);
return 0; return 0;
@ -93,6 +94,8 @@ static int wifi_display_update_wfd_ie(struct wpa_global *global)
p2p_set_wfd_dev_info(global->p2p, p2p_set_wfd_dev_info(global->p2p,
global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO]); 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( p2p_set_wfd_assoc_bssid(
global->p2p, global->p2p,
global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID]); 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]) if (global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO])
len += wpabuf_len(global->wfd_subelem[ len += wpabuf_len(global->wfd_subelem[
WFD_SUBELEM_DEVICE_INFO]); 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]) if (global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID])
len += wpabuf_len(global->wfd_subelem[ len += wpabuf_len(global->wfd_subelem[
WFD_SUBELEM_ASSOCIATED_BSSID]); 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]) if (global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO])
wpabuf_put_buf(buf, wpabuf_put_buf(buf,
global->wfd_subelem[WFD_SUBELEM_DEVICE_INFO]); 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]) if (global->wfd_subelem[WFD_SUBELEM_ASSOCIATED_BSSID])
wpabuf_put_buf(buf, global->wfd_subelem[ wpabuf_put_buf(buf, global->wfd_subelem[
WFD_SUBELEM_ASSOCIATED_BSSID]); WFD_SUBELEM_ASSOCIATED_BSSID]);

View file

@ -296,7 +296,7 @@ struct wpa_global {
#ifdef CONFIG_WIFI_DISPLAY #ifdef CONFIG_WIFI_DISPLAY
int wifi_display; int wifi_display;
#define MAX_WFD_SUBELEMS 10 #define MAX_WFD_SUBELEMS 12
struct wpabuf *wfd_subelem[MAX_WFD_SUBELEMS]; struct wpabuf *wfd_subelem[MAX_WFD_SUBELEMS];
#endif /* CONFIG_WIFI_DISPLAY */ #endif /* CONFIG_WIFI_DISPLAY */