[PATCH v3 03/25] P2P: Add PCEA and PBMA attributes to P2P2 IE of NAN SDFs
Shivani Baranwal
quic_shivbara at quicinc.com
Mon Aug 5 02:33:01 PDT 2024
Add PCEA and PBMA attribute in P2P2 IE of NAN Subscribe and Publish frames
to include the P2P2 capabilities and bootstrapping methods.
Signed-off-by: Shivani Baranwal <quic_shivbara at quicinc.com>
---
src/common/ieee802_11_defs.h | 18 +++++++++++
src/p2p/p2p.c | 36 +++++++++++++++++++++
src/p2p/p2p.h | 57 +++++++++++++++++++++++++++++++++
src/p2p/p2p_build.c | 76 ++++++++++++++++++++++++++++++++++++++++++++
src/p2p/p2p_i.h | 17 ++++++++++
5 files changed, 204 insertions(+)
diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h
index 434844a..452f2dc 100644
--- a/src/common/ieee802_11_defs.h
+++ b/src/common/ieee802_11_defs.h
@@ -1749,6 +1749,12 @@ enum p2p_attr_id {
P2P_ATTR_SESSION_ID = 26,
P2P_ATTR_FEATURE_CAPABILITY = 27,
P2P_ATTR_PERSISTENT_GROUP = 28,
+ P2P_ATTR_CAPABILITY_EXTENSION = 29,
+ P2P_ATTR_DEVICE_IDENTITY_KEY = 31,
+ P2P_ATTR_DEVICE_IDENTITY_RESOLUTION = 32,
+ P2P_ATTR_PAIRING_AND_BOOTSTRAPPING = 33,
+ P2P_ATTR_PASSWORD = 34,
+ P2P_ATTR_ACTION_FRAME_WRAPPER = 35,
P2P_ATTR_VENDOR_SPECIFIC = 221
};
@@ -1773,6 +1779,18 @@ enum p2p_attr_id {
#define P2P_GROUP_CAPAB_GROUP_FORMATION BIT(6)
#define P2P_GROUP_CAPAB_IP_ADDR_ALLOCATION BIT(7)
+/* P2P Capability Extension attribute - Capability info */
+#define P2P_PCEA_LEN_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(3))
+#define P2P_PCEA_6GHZ BIT(4)
+#define P2P_PCEA_REG_INFO BIT(5)
+#define P2P_PCEA_DFS_OWNER BIT(6)
+#define P2P_PCEA_CLI_REQ_CS BIT(7)
+#define P2P_PCEA_PAIRING_CAPABLE BIT(8)
+#define P2P_PCEA_PAIRING_SETUP_ENABLE BIT(9)
+#define P2P_PCEA_PMK_CACHING BIT(10)
+#define P2P_PCEA_PASN_TYPE BIT(11)
+#define P2P_PCEA_TWT_POWER_MGMT BIT(12)
+
/* P2PS Coordination Protocol Transport Bitmap */
#define P2PS_FEATURE_CAPAB_UDP_TRANSPORT BIT(0)
#define P2PS_FEATURE_CAPAB_MAC_TRANSPORT BIT(1)
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index 0c26086..2f9482a 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -2967,6 +2967,30 @@ bool is_p2p_6ghz_disabled(struct p2p_data *p2p)
return false;
}
+int p2p_pairing_info_init(struct p2p_data *p2p)
+{
+ struct p2p_pairing_info *pairing_info;
+
+ if (!p2p) {
+ p2p_dbg(p2p, "P2P data NULL");
+ return -1;
+ }
+
+ pairing_info = os_zalloc(sizeof(struct p2p_pairing_info));
+ if (!pairing_info)
+ return -1;
+
+ pairing_info->enable_pairing_setup =
+ p2p->cfg->pairing_config.enable_pairing_setup;
+ pairing_info->enable_pairing_cache =
+ p2p->cfg->pairing_config.enable_pairing_cache;
+ pairing_info->supported_bootstrap =
+ p2p->cfg->pairing_config.bootstrap_methods;
+
+ p2p->pairing_info = pairing_info;
+
+ return 0;
+}
struct p2p_data * p2p_init(const struct p2p_config *cfg)
{
@@ -3023,6 +3047,7 @@ struct p2p_data * p2p_init(const struct p2p_config *cfg)
p2p->go_timeout = 100;
p2p->client_timeout = 20;
p2p->num_p2p_sd_queries = 0;
+ p2p_pairing_info_init(p2p);
p2p_dbg(p2p, "initialized");
p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
@@ -3031,6 +3056,10 @@ struct p2p_data * p2p_init(const struct p2p_config *cfg)
return p2p;
}
+void p2p_pairing_info_deinit(struct p2p_data *p2p)
+{
+ os_free(p2p->pairing_info);
+}
void p2p_deinit(struct p2p_data *p2p)
{
@@ -3066,6 +3095,7 @@ void p2p_deinit(struct p2p_data *p2p)
p2p_remove_wps_vendor_extensions(p2p);
os_free(p2p->no_go_freq.range);
p2p_service_flush_asp(p2p);
+ p2p_pairing_info_deinit(p2p);
os_free(p2p);
}
@@ -5723,6 +5753,12 @@ struct wpabuf * p2p_usd_elems(struct p2p_data *p2p)
p2p_buf_update_ie_hdr(buf, len);
len = p2p_buf_add_p2p2_ie_hdr(buf);
+ /* P2P Capability Extension attribute */
+ p2p_buf_add_pcea(buf, p2p);
+
+ /* P2P Pairing Bootstrapping Method attribute */
+ p2p_buf_add_pbma(buf, p2p->cfg->pairing_config.bootstrap_methods, NULL,
+ 0, 0);
p2p_buf_update_p2p2_ie_hdr(buf, len);
diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h
index ab6e9ca..700f839 100644
--- a/src/p2p/p2p.h
+++ b/src/p2p/p2p.h
@@ -321,6 +321,43 @@ enum p2p_scan_type {
#define P2P_MAX_WPS_VENDOR_EXT 10
/**
+ * struct p2p_pairing_config - P2P pairing config.
+ */
+struct p2p_pairing_config {
+ /**
+ * Pairing capable
+ */
+ u8 pairing_capable;
+
+ /**
+ * Enable P2P pairing setup
+ */
+ u32 enable_pairing_setup;
+
+ /**
+ * Enable pairing cache to allow verification
+ */
+ u32 enable_pairing_cache;
+
+ /**
+ * Enable P2P pairing verification with cached NIK/NPK
+ */
+ u32 enable_pairing_verification;
+
+ /**
+ * P2P bootstrapping methods supported
+ */
+ u16 bootstrap_methods;
+
+ /**
+ * The set of supported PASN type
+ */
+ u8 pasn_type;
+
+};
+
+
+/**
* struct p2p_peer_info - P2P peer information
*/
struct p2p_peer_info {
@@ -590,6 +627,26 @@ struct p2p_config {
unsigned int passphrase_len;
/**
+ * p2p_pairing_config - P2P Pairing configuration
+ */
+ struct p2p_pairing_config pairing_config;
+
+ /**
+ * reg_info - regulatory info encoding for operation in 6 GHz band
+ */
+ u8 reg_info;
+
+ /**
+ * dfs_owner - Enable p2p GO to act as DFS Owner
+ */
+ bool dfs_owner;
+
+ /**
+ * twt_power_mgmt - Enable TWT based power mgmt for P2P
+ */
+ bool twt_power_mgmt;
+
+ /**
* cb_ctx - Context to use with callback functions
*/
void *cb_ctx;
diff --git a/src/p2p/p2p_build.c b/src/p2p/p2p_build.c
index 0bb0903..4bdfb7e 100644
--- a/src/p2p/p2p_build.c
+++ b/src/p2p/p2p_build.c
@@ -727,6 +727,82 @@ void p2p_buf_add_persistent_group_info(struct wpabuf *buf, const u8 *dev_addr,
}
+void p2p_buf_add_pcea(struct wpabuf *buf, struct p2p_data *p2p)
+{
+ u8 *len;
+ u16 capability_info = 0;
+
+ /* P2P Capability Extension */
+ wpabuf_put_u8(buf, P2P_ATTR_CAPABILITY_EXTENSION);
+ /* Length to be filled */
+ len = wpabuf_put(buf, 2);
+
+ if (!p2p->cfg->p2p_6ghz_disable)
+ capability_info |= P2P_PCEA_6GHZ;
+
+ if (p2p->cfg->reg_info)
+ capability_info |= P2P_PCEA_REG_INFO;
+
+ if (p2p->cfg->dfs_owner)
+ capability_info |= P2P_PCEA_DFS_OWNER;
+
+ if (p2p->cfg->pairing_config.pairing_capable)
+ capability_info |= P2P_PCEA_PAIRING_CAPABLE;
+
+ if (p2p->cfg->pairing_config.enable_pairing_setup)
+ capability_info |= P2P_PCEA_PAIRING_SETUP_ENABLE;
+
+ if (p2p->cfg->pairing_config.enable_pairing_cache)
+ capability_info |= P2P_PCEA_PMK_CACHING;
+
+ if (p2p->cfg->pairing_config.pasn_type)
+ capability_info |= P2P_PCEA_PASN_TYPE;
+
+ if (p2p->cfg->twt_power_mgmt)
+ capability_info |= P2P_PCEA_TWT_POWER_MGMT;
+
+ /* Field length is (n-1), n in octets */
+ capability_info |= (2 - 1) & P2P_PCEA_LEN_MASK;
+ wpabuf_put_le16(buf, capability_info);
+
+ if (capability_info & P2P_PCEA_REG_INFO)
+ wpabuf_put_u8(buf, p2p->cfg->reg_info);
+
+ if (capability_info & P2P_PCEA_PASN_TYPE)
+ wpabuf_put_u8(buf, p2p->cfg->pairing_config.pasn_type);
+
+ /* Update attribute length */
+ WPA_PUT_LE16(len, (u8 *) wpabuf_put(buf, 0) - len - 2);
+
+ wpa_printf(MSG_DEBUG, "P2P: * Capability Extension info=0x%x",
+ capability_info);
+}
+
+void p2p_buf_add_pbma(struct wpabuf *buf, u16 bootstrap, const u8 *cookie,
+ size_t cookie_len, int comeback_after)
+{
+ u8 *len;
+
+ /* P2P Pairing and Bootstrapping methods */
+ wpabuf_put_u8(buf, P2P_ATTR_PAIRING_AND_BOOTSTRAPPING);
+ /* Length to be filled */
+ len = wpabuf_put(buf, 2);
+
+ if (cookie && cookie_len) {
+ if (comeback_after)
+ wpabuf_put_le16(buf, comeback_after);
+ wpabuf_put_u8(buf, cookie_len);
+ wpabuf_put_data(buf, cookie, cookie_len);
+ }
+ wpabuf_put_le16(buf, bootstrap);
+
+ /* Update attribute length */
+ WPA_PUT_LE16(len, (u8 *) wpabuf_put(buf, 0) - len - 2);
+
+ wpa_printf(MSG_DEBUG, "P2P: * Bootstrapping method=0x%x",
+ bootstrap);
+}
+
static int p2p_add_wps_string(struct wpabuf *buf, enum wps_attribute attr,
const char *val)
{
diff --git a/src/p2p/p2p_i.h b/src/p2p/p2p_i.h
index d6826c7..381a02e 100644
--- a/src/p2p/p2p_i.h
+++ b/src/p2p/p2p_i.h
@@ -160,6 +160,18 @@ struct p2p_sd_query {
struct wpabuf *tlvs;
};
+
+struct p2p_pairing_info {
+ /* P2P device own address */
+ u8 own_addr[ETH_ALEN];
+ /* device capability to enable pairing setup */
+ u32 enable_pairing_setup;
+ /* device capability to enable pairing cache */
+ u32 enable_pairing_cache;
+ /* device supported bootstrapping */
+ u16 supported_bootstrap;
+};
+
/**
* struct p2p_data - P2P module data (internal to P2P module)
*/
@@ -554,6 +566,8 @@ struct p2p_data {
bool p2p_6ghz_capable;
bool include_6ghz;
bool allow_6ghz;
+
+ struct p2p_pairing_info *pairing_info;
};
/**
@@ -790,6 +804,9 @@ void p2p_buf_add_feature_capability(struct wpabuf *buf, u16 len,
const u8 *mask);
void p2p_buf_add_persistent_group_info(struct wpabuf *buf, const u8 *dev_addr,
const u8 *ssid, size_t ssid_len);
+void p2p_buf_add_pcea(struct wpabuf *buf, struct p2p_data *p2p);
+void p2p_buf_add_pbma(struct wpabuf *buf, u16 bootstrap, const u8 *cookie,
+ size_t cookie_len, int comeback_after);
int p2p_build_wps_ie(struct p2p_data *p2p, struct wpabuf *buf, int pw_id,
int all_attr);
void p2p_buf_add_pref_channel_list(struct wpabuf *buf,
--
2.7.4
More information about the Hostap
mailing list