[RFC 51/56] NAN: Support parsing peer device capability extension attribute
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Sun Dec 7 03:19:00 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 208a8c1784..dae9ba8d27 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 22a5412184..02d5935c75 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;
@@ -2078,3 +2093,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 87c46a4d0d..52c2d6240b 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -305,6 +305,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;
@@ -313,6 +315,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;
};
/**
@@ -462,6 +467,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;
@@ -469,6 +475,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 2288f889f3..98abafa4df 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