[PATCH 53/58] NAN: Support parsing peer device capability extension attribute
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Thu Feb 19 12:25:09 PST 2026
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 a5fa13ff7c..750c530135 100644
--- a/src/common/nan_defs.h
+++ b/src/common/nan_defs.h
@@ -525,4 +525,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 9d01309f4f..d0f1c6822a 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -920,6 +920,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
*
@@ -955,6 +969,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;
@@ -2089,3 +2104,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 3d383378cc..73ecaa13bb 100644
--- a/src/nan/nan.h
+++ b/src/nan/nan.h
@@ -538,4 +538,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 a53d3ac1dc..7de3500d0f 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 5d8447a2a8..70015474e5 100644
--- a/src/nan/nan_util.c
+++ b/src/nan/nan_util.c
@@ -192,6 +192,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:
@@ -217,7 +221,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.52.0
More information about the Hostap
mailing list