P2P2: Parse P2P2 IE
Add parsing of the P2P2 IE similarly to the way the P2P IE is parsed. Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
This commit is contained in:
parent
25c6598f30
commit
fa389f2a3b
4 changed files with 48 additions and 0 deletions
|
@ -157,6 +157,11 @@ static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
|
||||||
elems->rsn_selection = pos + 4;
|
elems->rsn_selection = pos + 4;
|
||||||
elems->rsn_selection_len = elen - 4;
|
elems->rsn_selection_len = elen - 4;
|
||||||
break;
|
break;
|
||||||
|
case P2P2_OUI_TYPE:
|
||||||
|
/* Wi-Fi Alliance - P2P2 IE */
|
||||||
|
elems->p2p2_ie = pos;
|
||||||
|
elems->p2p2_ie_len = elen;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
wpa_printf(MSG_MSGDUMP, "Unknown WFA "
|
wpa_printf(MSG_MSGDUMP, "Unknown WFA "
|
||||||
"information element ignored "
|
"information element ignored "
|
||||||
|
|
|
@ -65,6 +65,7 @@ struct ieee802_11_elems {
|
||||||
const u8 *vendor_ht_cap;
|
const u8 *vendor_ht_cap;
|
||||||
const u8 *vendor_vht;
|
const u8 *vendor_vht;
|
||||||
const u8 *p2p;
|
const u8 *p2p;
|
||||||
|
const u8 *p2p2_ie;
|
||||||
const u8 *wfd;
|
const u8 *wfd;
|
||||||
const u8 *link_id;
|
const u8 *link_id;
|
||||||
const u8 *interworking;
|
const u8 *interworking;
|
||||||
|
@ -139,6 +140,7 @@ struct ieee802_11_elems {
|
||||||
u8 vendor_ht_cap_len;
|
u8 vendor_ht_cap_len;
|
||||||
u8 vendor_vht_len;
|
u8 vendor_vht_len;
|
||||||
u8 p2p_len;
|
u8 p2p_len;
|
||||||
|
u8 p2p2_ie_len;
|
||||||
u8 wfd_len;
|
u8 wfd_len;
|
||||||
u8 interworking_len;
|
u8 interworking_len;
|
||||||
u8 qos_map_set_len;
|
u8 qos_map_set_len;
|
||||||
|
|
|
@ -596,6 +596,7 @@ struct p2p_data {
|
||||||
*/
|
*/
|
||||||
struct p2p_message {
|
struct p2p_message {
|
||||||
struct wpabuf *p2p_attributes;
|
struct wpabuf *p2p_attributes;
|
||||||
|
struct wpabuf *p2p2_attributes;
|
||||||
struct wpabuf *wps_attributes;
|
struct wpabuf *wps_attributes;
|
||||||
struct wpabuf *wfd_subelems;
|
struct wpabuf *wfd_subelems;
|
||||||
|
|
||||||
|
@ -694,6 +695,12 @@ struct p2p_message {
|
||||||
|
|
||||||
const u8 *pref_freq_list;
|
const u8 *pref_freq_list;
|
||||||
size_t pref_freq_list_len;
|
size_t pref_freq_list_len;
|
||||||
|
|
||||||
|
const u8 *pcea_info;
|
||||||
|
size_t pcea_info_len;
|
||||||
|
|
||||||
|
const u8 *pbma_info;
|
||||||
|
size_t pbma_info_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -417,6 +417,26 @@ static int p2p_parse_attribute(u8 id, const u8 *data, u16 len,
|
||||||
msg->persistent_ssid_len));
|
msg->persistent_ssid_len));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case P2P_ATTR_CAPABILITY_EXTENSION:
|
||||||
|
if (len < 2) {
|
||||||
|
wpa_printf(MSG_DEBUG, "P2P: Too short PCEA (length %d)",
|
||||||
|
len);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
msg->pcea_info = data;
|
||||||
|
msg->pcea_info_len = len;
|
||||||
|
wpa_printf(MSG_DEBUG, "P2P: * PCEA (length=%u)", len);
|
||||||
|
break;
|
||||||
|
case P2P_ATTR_PAIRING_AND_BOOTSTRAPPING:
|
||||||
|
if (len < 1) {
|
||||||
|
wpa_printf(MSG_DEBUG, "P2P: Too short PBMA (length %d)",
|
||||||
|
len);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
msg->pbma_info = data;
|
||||||
|
msg->pbma_info_len = len;
|
||||||
|
wpa_printf(MSG_DEBUG, "P2P: * PBMA (length=%u)", len);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
wpa_printf(MSG_DEBUG, "P2P: Skipped unknown attribute %d "
|
wpa_printf(MSG_DEBUG, "P2P: Skipped unknown attribute %d "
|
||||||
"(length %d)", id, len);
|
"(length %d)", id, len);
|
||||||
|
@ -573,6 +593,18 @@ int p2p_parse_ies(const u8 *data, size_t len, struct p2p_message *msg)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg->p2p2_attributes = ieee802_11_vendor_ie_concat(data, len,
|
||||||
|
P2P2_IE_VENDOR_TYPE);
|
||||||
|
if (msg->p2p2_attributes &&
|
||||||
|
p2p_parse_p2p_ie(msg->p2p2_attributes, msg)) {
|
||||||
|
wpa_printf(MSG_DEBUG, "P2P: Failed to parse P2P2 IE data");
|
||||||
|
if (msg->p2p2_attributes)
|
||||||
|
wpa_hexdump_buf(MSG_MSGDUMP, "P2P: P2P2 IE data",
|
||||||
|
msg->p2p2_attributes);
|
||||||
|
p2p_parse_free(msg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_WIFI_DISPLAY
|
#ifdef CONFIG_WIFI_DISPLAY
|
||||||
if (elems.wfd) {
|
if (elems.wfd) {
|
||||||
msg->wfd_subelems = ieee802_11_vendor_ie_concat(
|
msg->wfd_subelems = ieee802_11_vendor_ie_concat(
|
||||||
|
@ -647,6 +679,8 @@ void p2p_parse_free(struct p2p_message *msg)
|
||||||
{
|
{
|
||||||
wpabuf_free(msg->p2p_attributes);
|
wpabuf_free(msg->p2p_attributes);
|
||||||
msg->p2p_attributes = NULL;
|
msg->p2p_attributes = NULL;
|
||||||
|
wpabuf_free(msg->p2p2_attributes);
|
||||||
|
msg->p2p2_attributes = NULL;
|
||||||
wpabuf_free(msg->wps_attributes);
|
wpabuf_free(msg->wps_attributes);
|
||||||
msg->wps_attributes = NULL;
|
msg->wps_attributes = NULL;
|
||||||
#ifdef CONFIG_WIFI_DISPLAY
|
#ifdef CONFIG_WIFI_DISPLAY
|
||||||
|
|
Loading…
Reference in a new issue