[RFC PATCH 12/34] API to process ranging capabilities from USD PR IE

Peddolla Harshavardhan Reddy peddolla at qti.qualcomm.com
Thu May 15 00:17:35 PDT 2025


Signed-off-by: Peddolla Harshavardhan Reddy <peddolla at qti.qualcomm.com>
---
 src/common/proximity_ranging.c | 56 ++++++++++++++++++++++++++++++++++
 src/common/proximity_ranging.h |  2 ++
 2 files changed, 58 insertions(+)

diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
index ae4c0e7a8..a4f36df6a 100644
--- a/src/common/proximity_ranging.c
+++ b/src/common/proximity_ranging.c
@@ -694,6 +694,52 @@ static int pr_parse_ies(const u8 *data, size_t len, struct pr_message *msg)
 }
 
 
+
+
+static void pr_process_ranging_capabilities(const u8 *caps, size_t caps_len,
+					    struct pr_capabilities *pr_caps)
+{
+	const u8 *pos;
+
+	if (!caps || caps_len < 34) {
+		wpa_printf(MSG_ERROR, "PR: Invalid args in PR capabilities");
+		return;
+	}
+
+	pos = caps;
+
+	if (*pos & PR_EDCA_BASED_RANGING)
+		pr_caps->edca_support = true;
+	if (*pos & PR_NTB_SECURE_LTF_BASED_RANGING) {
+		pr_caps->secure_he_ltf = true;
+		pr_caps->ntb_support = true;
+	}
+	if (*pos & PR_NTB_OPEN_BASED_RANGING)
+		pr_caps->ntb_support = true;
+
+	pos++;
+	pr_caps->pasn_type = *pos;
+
+	pos++;
+
+	if (*pos & BIT(0))
+		pr_caps->support_6ghz = true;
+	else
+		pr_caps->support_6ghz = false;
+
+	pos++;
+
+	os_memset(pr_caps->device_name, 0, WPS_DEV_NAME_MAX_LEN + 1);
+	os_memcpy(pr_caps->device_name, pos, WPS_DEV_NAME_MAX_LEN);
+
+	wpa_printf(MSG_INFO, "PR: Device name=%s, edca capability=%u, ntb capability= %u,"
+		   " secure ltf capability= %u, 6Ghz support= %u",
+		   pr_caps->device_name, pr_caps->edca_support,
+		   pr_caps->ntb_support, pr_caps->secure_he_ltf,
+		   pr_caps->support_6ghz);
+}
+
+
 void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
 			  const u8 *peer_addr, unsigned int freq)
 {
@@ -709,6 +755,13 @@ void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
 		return;
 	}
 
+	if (!msg.pr_capability) {
+		wpa_printf(MSG_DEBUG,
+			   "PR: Ranging caps not present, Ignoring proximity device");
+		pr_parse_free(&msg);
+		return;
+	}
+
 	dev = pr_create_device(pr, peer_addr);
 	if (!dev) {
 		pr_parse_free(&msg);
@@ -719,5 +772,8 @@ void pr_process_usd_elems(struct pr_data *pr, const u8 *ies, u16 ies_len,
 	os_get_reltime(&dev->last_seen);
 	dev->listen_freq = freq;
 
+	pr_process_ranging_capabilities(msg.pr_capability,
+					msg.pr_capability_len, &dev->pr_caps);
+
 	pr_parse_free(&msg);
 }
diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
index 84535a8b6..28cbc197d 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -193,6 +193,8 @@ struct pr_device {
 	 */
 	u8 pr_device_addr[ETH_ALEN];
 
+	struct pr_capabilities pr_caps;
+
 	/* Password to be used in PASN-SAE by the Seeker
 	 * This is updated with valid password if DIRA matches for the peer
 	 */
-- 
2.34.1




More information about the Hostap mailing list