[RFC 09/13] NAN: Parse and store peer bootstrap information

Andrei Otcheretianski andrei.otcheretianski at intel.com
Tue Dec 23 03:57:21 PST 2025


- Support parsing NAN Paring and Bootstrapping attribute (NPBA)
  as part of the NAN attributes parsing.
- Store the supported pairing and bootstrapping information for a peer.
- Move attribute parsing to be done when a peer is added.

Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
Signed-off-by: Ilan Peer <ilan.peer at intel.com>
---
 src/nan/nan.c      | 27 +++++++++++++++++++++++++++
 src/nan/nan_i.h    | 15 +++++++++++++++
 src/nan/nan_util.c | 11 ++++++++++-
 3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/src/nan/nan.c b/src/nan/nan.c
index 3767db6c39..cb048e843b 100644
--- a/src/nan/nan.c
+++ b/src/nan/nan.c
@@ -928,6 +928,29 @@ static void nan_parse_peer_dev_capa_ext(struct nan_data *nan,
 }
 
 
+static void nan_parse_bpba(struct nan_data *nan,
+			   struct nan_peer *peer,
+			   struct nan_attrs *attrs)
+{
+	const u8 *npba = attrs->bpba;
+	u8 type;
+
+	if (!attrs->bpba || !attrs->bpba_len)
+		return;
+
+	/* Skip the dialog token and get the type */
+	type = *(npba + 1) & NAN_PBA_TYPE_MSK;
+
+	if (type != NAN_PBA_TYPE_ADVERTISE)
+		return;
+
+	peer->bootstrap.supported_methods = WPA_GET_LE16(npba + 3);
+
+	wpa_printf(MSG_DEBUG, "NAN: Peer supports bootstrap methods: 0x%04x",
+		   peer->bootstrap.supported_methods);
+}
+
+
 /*
  * nan_parse_device_attrs - Parse device attributes and build availability info
  *
@@ -964,6 +987,7 @@ int nan_parse_device_attrs(struct nan_data *nan, struct nan_peer *peer,
 	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_parse_bpba(nan, peer, &attrs);
 
 	nan_peer_dump(nan, peer);
 	ret = 0;
@@ -1048,6 +1072,9 @@ int nan_add_peer(struct nan_data *nan, const u8 *addr,
 	nan_parse_device_attrs(nan, peer, device_attrs, device_attrs_len);
 
 	os_get_reltime(&peer->last_seen);
+
+	nan_parse_device_attrs(nan, peer, device_attrs, device_attrs_len);
+
 	return 0;
 }
 
diff --git a/src/nan/nan_i.h b/src/nan/nan_i.h
index 3f909e5ca1..019f6d73e0 100644
--- a/src/nan/nan_i.h
+++ b/src/nan/nan_i.h
@@ -399,6 +399,16 @@ struct nan_ndl {
 	u16 immut_sched_len;
 };
 
+/*
+ * struct nan_bootstrap - NAN bootstrap information
+ *
+ * @supported_methods: Bitmap of supported bootstrap methods. See
+ *     &enum nan_pairing_bootstrapping_method.
+ */
+struct nan_bootstrap {
+	u16 supported_methods;
+};
+
 /*
  * struct nan_peer - Represents a known NAN peer
  * @list: List node for linking peers.
@@ -410,6 +420,7 @@ struct nan_ndl {
  * @ndp_setup: Used to hold an NDP object while NDP establishment is in
  *     progress.
  * @ndl: NDL data associated with this peer.
+ * @bootstrap: Bootstrap information of the peer.
  */
 struct nan_peer {
 	struct dl_list list;
@@ -423,6 +434,8 @@ struct nan_peer {
 	struct nan_ndp_setup ndp_setup;
 
 	struct nan_ndl *ndl;
+
+	struct nan_bootstrap bootstrap;
 };
 
 /**
@@ -468,6 +481,7 @@ struct nan_attrs {
 	const u8 *sec_ctxt_info;
 	const u8 *shared_key_desc;
 	const u8 *dev_capa_ext;
+	const u8 *bpba;
 
 	u16 ndp_len;
 	u16 ndl_len;
@@ -476,6 +490,7 @@ struct nan_attrs {
 	u16 sec_ctxt_info_len;
 	u16 shared_key_desc_len;
 	u16 dev_capa_ext_len;
+	u16 bpba_len;
 };
 
 struct nan_msg {
diff --git a/src/nan/nan_util.c b/src/nan/nan_util.c
index e1e32ff690..3d67d32f49 100644
--- a/src/nan/nan_util.c
+++ b/src/nan/nan_util.c
@@ -185,6 +185,16 @@ int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,
 			attrs->dev_capa_ext = pos;
 			attrs->dev_capa_ext_len = attr_len;
 			break;
+		case NAN_ATTR_BPBA:
+			/*
+			 * Validate minimal NPBA element length: dialog token
+			 * (1) + type and stats (1) + reason code (1) + pbm (2)
+			 */
+			if (attr_len < 5)
+				break;
+			attrs->bpba = pos;
+			attrs->bpba_len = attr_len;
+			break;
 		case NAN_ATTR_MASTER_INDICATION:
 		case NAN_ATTR_CLUSTER:
 		case NAN_ATTR_NAN_ATTR_SERVICE_ID_LIST:
@@ -211,7 +221,6 @@ int nan_parse_attrs(struct nan_data *nan, const u8 *data, size_t len,
 		case NAN_ATTR_SUBSC_SERVICE_ID_LIST:
 		case NAN_ATTR_NDP_EXT:
 		case NAN_ATTR_NIRA:
-		case NAN_ATTR_BPBA:
 		case NAN_ATTR_S3:
 		case NAN_ATTR_TPEA:
 		case NAN_ATTR_VENDOR_SPECIFIC:
-- 
2.49.0




More information about the Hostap mailing list