[RFC v2 51/99] NAN: Support parsing peer device capability extension attribute

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:51:55 PST 2025


From: Ilan Peer <ilan.peer at intel.com>

Store the peer's support for pairing and NPK/NIK caching and
add API to retrieve this information.

Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/common/nan_defs.h | 11 +++++++++++
 src/nan/nan.c         | 46 +++++++++++++++++++++++++++++++++++++++++++
 src/nan/nan.h         |  2 ++
 src/nan/nan_i.h       |  7 +++++++
 src/nan/nan_util.c    |  5 ++++-
 5 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/src/common/nan_defs.h b/src/common/nan_defs.h
index 7e7aee16b9..649326eae8 100644
--- a/src/common/nan_defs.h
+++ b/src/common/nan_defs.h
@@ -522,4 +522,15 @@ struct nan_shared_key {
 	u8 key[0];
 } STRUCT_PACKED;
 
+/* See Table 141 (Capability Info Field) */
+#define NAN_DEV_CAPA_EXT_INFO_0_REG_VALID         BIT(0)
+#define NAN_DEV_CAPA_EXT_INFO_0_INDOOR_AP         BIT(1)
+#define NAN_DEV_CAPA_EXT_INFO_0_SP_AP             BIT(2)
+#define NAN_DEV_CAPA_EXT_INFO_0_VLP               BIT(3)
+#define NAN_DEV_CAPA_EXT_INFO_0_INDOOR_ENABLED_AP BIT(4)
+#define NAN_DEV_CAPA_EXT_INFO_0_INDOOR_SP_AP      BIT(5)
+
+#define NAN_DEV_CAPA_EXT_INFO_1_PAIRING_SETUP     BIT(0)
+#define NAN_DEV_CAPA_EXT_INFO_1_NPK_NIK_CACHING   BIT(1)
+
 #endif /* NAN_DEFS_H */
diff --git a/src/nan/nan.c b/src/nan/nan.c
index 76aee12936..5e4a4573a6 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -914,6 +914,20 @@ static void nan_parse_peer_elem_container(struct nan_data *nan,
 }
 
 
+static void nan_parse_peer_dev_capa_ext(struct nan_data *nan,
+					struct nan_peer *peer,
+					struct nan_attrs *attrs)
+{
+	if (!attrs->dev_capa_ext || attrs->dev_capa_ext_len <= 1)
+		return;
+
+	peer->info.pairing_support = attrs->dev_capa_ext[1] &
+		NAN_DEV_CAPA_EXT_INFO_1_PAIRING_SETUP;
+	peer->info.npk_nik_caching_support = attrs->dev_capa_ext[1] &
+		NAN_DEV_CAPA_EXT_INFO_1_NPK_NIK_CACHING;
+}
+
+
 /*
  * nan_parse_device_attrs - Parse device attributes and build availability info
  *
@@ -949,6 +963,7 @@ int nan_parse_device_attrs(struct nan_data *nan, struct nan_peer *peer,
 	nan_merge_peer_info(&peer->info, &info);
 	nan_parse_peer_device_capa(nan, peer, &attrs);
 	nan_parse_peer_elem_container(nan, peer, &attrs);
+	nan_parse_peer_dev_capa_ext(nan, peer, &attrs);
 
 	nan_peer_dump(nan, peer);
 	ret = 0;
@@ -2083,3 +2098,34 @@ int nan_convert_sched_to_avail_attrs(struct nan_data *nan, u8 sequence_id,
 				   NAN_AVAIL_ENTRY_CTRL_TYPE_COND,
 				   n_chans, chans, buf);
 }
+
+
+bool nan_peer_pairing_supported(struct nan_data *nan, const u8 *addr)
+{
+	struct nan_peer *peer;
+
+	if (!nan)
+		return false;
+
+	peer = nan_get_peer(nan, addr);
+	if (!peer)
+		return false;
+
+	return peer->info.pairing_support;
+}
+
+
+bool nan_peer_npk_nik_caching_supported(struct nan_data *nan,
+					const u8 *addr)
+{
+	struct nan_peer *peer;
+
+	if (!nan)
+		return false;
+
+	peer = nan_get_peer(nan, addr);
+	if (!peer)
+		return false;
+
+	return peer->info.npk_nik_caching_support;
+}
diff --git a/src/nan/nan.h b/src/nan/nan.h
index f34f9e0e90..1b6d99aaf1 100644
--- a/src/nan/nan.h
+++ b/src/nan/nan.h
@@ -536,4 +536,6 @@ int nan_convert_sched_to_avail_attrs(struct nan_data *nan, u8 sequence_id,
 				     size_t n_chans,
 				     struct nan_chan_schedule *chans,
 				     struct wpabuf *buf);
+bool nan_peer_pairing_supported(struct nan_data *nan, const u8 *addr);
+bool nan_peer_npk_nik_caching_supported(struct nan_data *nan, const u8 *addr);
 #endif /* NAN_H */
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index aba8fda618..7ea0277929 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -303,6 +303,8 @@ struct nan_peer_sec_info_entry {
  * @dev_capa: List of device capabilities of the peer.
  * @element_container: List of element container entries of the peer.
  * @sec: List of security information entries of the peer.
+ * @pairing_support: Indicates if the peer supports pairing.
+ * @npk_nik_caching_support: Indicates if the peer supports NPK/NIK caching.
  */
 struct nan_peer_info {
 	struct os_reltime last_seen;
@@ -311,6 +313,9 @@ struct nan_peer_info {
 	struct dl_list dev_capa;
 	struct dl_list element_container;
 	struct dl_list sec;
+
+	bool pairing_support;
+	bool npk_nik_caching_support;
 };
 
 /**
@@ -460,6 +465,7 @@ struct nan_attrs {
 	const u8 *cipher_suite_info;
 	const u8 *sec_ctxt_info;
 	const u8 *shared_key_desc;
+	const u8 *dev_capa_ext;
 
 	u16 ndp_len;
 	u16 ndl_len;
@@ -467,6 +473,7 @@ struct nan_attrs {
 	u16 cipher_suite_info_len;
 	u16 sec_ctxt_info_len;
 	u16 shared_key_desc_len;
+	u16 dev_capa_ext_len;
 };
 
 struct nan_msg {
diff --git a/src/nan/nan_util.c b/src/nan/nan_util.c
index abf6f487f5..9081c225d6 100644
--- a/src/nan/nan_util.c
+++ b/src/nan/nan_util.c
@@ -181,6 +181,10 @@ int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,
 			attrs->shared_key_desc = pos;
 			attrs->shared_key_desc_len = attr_len;
 			break;
+		case NAN_ATTR_DCEA:
+			attrs->dev_capa_ext = pos;
+			attrs->dev_capa_ext_len = attr_len;
+			break;
 		case NAN_ATTR_MASTER_INDICATION:
 		case NAN_ATTR_CLUSTER:
 		case NAN_ATTR_NAN_ATTR_SERVICE_ID_LIST:
@@ -206,7 +210,6 @@ int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,
 		case NAN_ATTR_PUBLIC_AVAILABILITY:
 		case NAN_ATTR_SUBSC_SERVICE_ID_LIST:
 		case NAN_ATTR_NDP_EXT:
-		case NAN_ATTR_DCEA:
 		case NAN_ATTR_NIRA:
 		case NAN_ATTR_BPBA:
 		case NAN_ATTR_S3:
-- 
2.49.0




More information about the Hostap mailing list