[RFC PATCH 05/34] API to add ranging capabilities in USD PR IE

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


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

diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
index d87856b12..c39753b33 100644
--- a/src/common/proximity_ranging.c
+++ b/src/common/proximity_ranging.c
@@ -142,15 +142,79 @@ static struct wpabuf * pr_encaps_ie(const struct wpabuf *subelems, u32 ie_type)
 }
 
 
+static void pr_get_ranging_capabilities(struct pr_data *pr,
+					struct pr_capabilities *capab)
+{
+	os_memset(capab, 0, sizeof(struct pr_capabilities));
+
+	if (pr->cfg->dev_name)
+		os_strlcpy(capab->device_name, pr->cfg->dev_name,
+			   WPS_DEV_NAME_MAX_LEN);
+
+	if (pr->cfg->edca_ista_support || pr->cfg->edca_rsta_support)
+		capab->edca_support = true;
+
+	if (pr->cfg->ntb_ista_support || pr->cfg->ntb_rsta_support)
+		capab->ntb_support = true;
+
+	capab->secure_he_ltf = pr->cfg->secure_he_ltf;
+	capab->pasn_type = pr->cfg->pasn_type;
+	capab->support_6ghz = pr->cfg->support_6ghz;
+}
+
+
+static void pr_buf_add_ranging_capa_info(struct wpabuf *buf,
+					 struct pr_capabilities *capab)
+{
+	u8 *len;
+	u8 capa_6g = 0;
+	u8 protocol_type = 0;
+
+	if (!buf || !capab || !capab->device_name)
+		return;
+
+	wpabuf_put_u8(buf, PR_ATTR_RANGING_CAPABILITY);
+	len = wpabuf_put(buf, 2); /* IE length to be filled */
+
+	if (capab->edca_support)
+		protocol_type |= PR_EDCA_BASED_RANGING;
+	if (capab->ntb_support && capab->secure_he_ltf)
+		protocol_type |= PR_NTB_SECURE_LTF_BASED_RANGING;
+	if (capab->ntb_support)
+		protocol_type |= PR_NTB_OPEN_BASED_RANGING;
+
+	wpabuf_put_u8(buf, protocol_type);
+	wpabuf_put_u8(buf, capab->pasn_type);
+
+	if (capab->support_6ghz)
+		capa_6g |= BIT(0);
+
+	wpabuf_put_u8(buf, capa_6g);
+
+	/*Device name*/
+	wpabuf_put_data(buf, capab->device_name, WPS_DEV_NAME_MAX_LEN);
+
+	wpa_printf(MSG_INFO, "PR: Device name: %s", capab->device_name);
+
+	WPA_PUT_LE16(len, (u8 *) wpabuf_put(buf, 0) - len - 2);
+	wpa_hexdump(MSG_DEBUG, "PR: * Device capability info",
+		    len + 2, (u8 *) wpabuf_put(buf, 0) - len - 2);
+}
+
+
 struct wpabuf * pr_prepare_usd_elems(struct pr_data *pr, const char *country)
 {
 	u32 ie_type;
 	struct wpabuf *buf, *buf2;
+	struct pr_capabilities pr_caps;
 
 	buf = wpabuf_alloc(1000);
 	if (!buf)
 		return NULL;
 
+	pr_get_ranging_capabilities(pr, &pr_caps);
+	pr_buf_add_ranging_capa_info(buf, &pr_caps);
+
 	ie_type = (OUI_WFA << 8) | PR_OUI_TYPE;
 	buf2 = pr_encaps_ie(buf, ie_type);
 	wpabuf_free(buf);
diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
index 4f5c59f9b..0d31fb1a0 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -58,6 +58,37 @@ struct pr_channels {
 	size_t reg_classes;
 };
 
+struct pr_capabilities {
+	u8 pasn_type;
+
+	char device_name[WPS_DEV_NAME_MAX_LEN + 1];
+
+	bool edca_support;
+
+	bool ntb_support;
+
+	bool secure_he_ltf;
+
+	bool support_6ghz;
+};
+
+
+enum pr_attr_id {
+	PR_ATTR_STATUS = 0,
+	PR_ATTR_RANGING_CAPABILITY = 1,
+	PR_ATTR_EDCA_CAPABILITY = 2,
+	PR_ATTR_NTB_CAPABILITY = 3,
+	PR_ATTR_OPERATION_MODE = 4,
+	PR_ATTR_DEVICE_IDENTITY_RESOLUTION = 6,
+	PR_ATTR_DEVICE_IDENTITY_KEY = 7,
+	PR_ATTR_VENDOR_SPECIFIC = 221,
+};
+
+/* Proximity Ranging capabilities*/
+#define PR_EDCA_BASED_RANGING BIT(0)
+#define PR_NTB_SECURE_LTF_BASED_RANGING BIT(1)
+#define PR_NTB_OPEN_BASED_RANGING BIT(2)
+
 /**
  * struct pr_device_info - Proximity ranging peer information
  */
-- 
2.34.1




More information about the Hostap mailing list