[PATCH v3 02/36] PR: Update PR device configs and capabilities from driver

Peddolla Harshavardhan Reddy peddolla at qti.qualcomm.com
Thu Aug 28 08:42:37 PDT 2025


Add changes to fetch device configurations, capabilities, and
supported channels for ranging and store them in Proximity Ranging
global context.

This includes propagation of Enhanced Distributed channel Access
(EDCA-802.11mc) based ranging capabilities as well as Non-Trigger
Based (NTB-802.11az) ranging capabilities.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla at qti.qualcomm.com>
---
 src/common/proximity_ranging.h    | 43 +++++++++++++++++++++++++++++++
 src/drivers/driver.h              | 23 +++++++++++++++++
 wpa_supplicant/config.c           |  2 ++
 wpa_supplicant/config.h           |  9 +++++++
 wpa_supplicant/config_file.c      |  4 +++
 wpa_supplicant/pr_supplicant.c    | 36 ++++++++++++++++++++++++++
 wpa_supplicant/wpa_supplicant.c   | 15 +++++++++++
 wpa_supplicant/wpa_supplicant_i.h | 16 ++++++++++++
 8 files changed, 148 insertions(+)

diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
index 0e597f85e..affabc19c 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -34,6 +34,12 @@ struct pr_device {
 
 
 struct pr_config {
+	u8 pasn_type;
+
+	int preferred_ranging_role;
+
+	char country[3];
+
 	u8 dev_addr[ETH_ALEN];
 
 	/**
@@ -41,6 +47,43 @@ struct pr_config {
 	 */
 	char *dev_name;
 
+	bool edca_ista_support;
+
+	bool edca_rsta_support;
+
+	u8 edca_format_and_bw;
+
+	u8 max_tx_antenna;
+
+	u8 max_rx_antenna;
+
+	bool ntb_ista_support;
+
+	bool ntb_rsta_support;
+
+	bool secure_he_ltf;
+
+	u8 max_tx_ltf_repetations;
+
+	u8 max_rx_ltf_repetations;
+
+	u8 max_tx_ltf_total;
+
+	u8 max_rx_ltf_total;
+
+	u8 max_rx_sts_le_80;
+
+	u8 max_rx_sts_gt_80;
+
+	u8 max_tx_sts_le_80;
+
+	u8 max_tx_sts_gt_80;
+
+	u8 ntb_format_and_bw;
+
+	bool support_6ghz;
+
+
 	/**
 	 * cb_ctx - Context to use with callback functions
 	 */
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index d943062fe..ac389ba47 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -2422,6 +2422,12 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS2_P2P_FEATURE_V2	0x0000000002000000ULL
 /** Driver supports P2P PCC mode */
 #define WPA_DRIVER_FLAGS2_P2P_FEATURE_PCC_MODE	0x0000000004000000ULL
+/** Driver supports FTM initiator functionality */
+#define WPA_DRIVER_FLAGS2_FTM_INITIATOR		0x0000000008000000ULL
+/** Driver supports non-trigger based ranging responder functionality */
+#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER   0x0000000010000000ULL
+/** Driver supports non-trigger based ranging initiator functionality */
+#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR	0x0000000020000000ULL
 	u64 flags2;
 
 #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \
@@ -2546,6 +2552,23 @@ struct wpa_driver_capa {
 	/* Maximum number of bytes of extra IE(s) that can be added to Probe
 	 * Request frames */
 	size_t max_probe_req_ie_len;
+
+	/* EDCA based ranging capabilities */
+	u8 edca_format_and_bw;
+	u8 max_tx_antenna;
+	u8 max_rx_antenna;
+
+	/* NTB based ranging capabilities */
+	u8 ntb_format_and_bw;
+	u8 max_tx_ltf_repetations;
+	u8 max_rx_ltf_repetations;
+	u8 max_tx_ltf_total;
+	u8 max_rx_ltf_total;
+	u8 max_rx_sts_le_80;
+	u8 max_rx_sts_gt_80;
+	u8 max_tx_sts_le_80;
+	u8 max_tx_sts_gt_80;
+
 };
 
 
diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
index a0f71cfc6..07ca894a8 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -5706,6 +5706,8 @@ static const struct global_parse_data global_fields[] = {
 	{ BIN(wfa_gen_capa_supp), 0 },
 	{ BIN(wfa_gen_capa_cert), 0 },
 	{ BOOL(disable_op_classes_80_80_mhz), 0 },
+	{ INT(pr_pasn_type), 0 },
+	{ INT_RANGE(pr_preferred_role, 0, 1), 0},
 	/* NOTE: When adding new parameters here, add_interface() in
 	 * wpa_supplicant/dbus_new_introspect.c may need to be modified to
 	 * increase the size of the iface->xml buffer. */
diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h
index c187d36ed..7728f8be6 100644
--- a/wpa_supplicant/config.h
+++ b/wpa_supplicant/config.h
@@ -1909,6 +1909,15 @@ struct wpa_config {
 	 * supports this.
 	*/
 	bool disable_op_classes_80_80_mhz;
+
+	/* Indicates the types of PASN supported for Proximity Ranging */
+	int pr_pasn_type;
+
+	/* Indicates the preferred Proximity Ranging Role
+	 * 0: Prefer ranging initiator role (default)
+	 * 1: Prefer ranging responder role
+	 */
+	int pr_preferred_role;
 };
 
 
diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c
index b1ba03ac5..5dfd008eb 100644
--- a/wpa_supplicant/config_file.c
+++ b/wpa_supplicant/config_file.c
@@ -1756,6 +1756,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
 	if (config->disable_op_classes_80_80_mhz)
 		fprintf(f, "disable_op_classes_80_80_mhz=%d\n",
 			config->disable_op_classes_80_80_mhz);
+	if (config->pr_pasn_type)
+		fprintf(f, "pr_pasn_type=%d\n", config->pr_pasn_type);
+	if (config->pr_preferred_role)
+		fprintf(f, "pr_preferred_role=%d\n", config->pr_preferred_role);
 }
 
 static void wpa_config_write_identity(FILE *f, struct wpa_dev_ik *dev_ik)
diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c
index ba8746589..a69385980 100644
--- a/wpa_supplicant/pr_supplicant.c
+++ b/wpa_supplicant/pr_supplicant.c
@@ -18,6 +18,7 @@
 #include "common/proximity_ranging.h"
 #include "pr_supplicant.h"
 
+
 int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
 {
 	struct pr_config pr;
@@ -30,6 +31,41 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
 	os_memcpy(pr.dev_addr, wpa_s->own_addr, ETH_ALEN);
 	pr.cb_ctx = wpa_s;
 	pr.dev_name = wpa_s->conf->device_name;
+	pr.pasn_type = wpa_s->conf->pr_pasn_type;
+	pr.preferred_ranging_role = wpa_s->conf->pr_preferred_role;
+
+	pr.edca_ista_support = wpa_s->drv_flags2 &
+				WPA_DRIVER_FLAGS2_FTM_INITIATOR;
+	pr.edca_rsta_support = wpa_s->drv_flags &
+				WPA_DRIVER_FLAGS_FTM_RESPONDER;
+	pr.edca_format_and_bw = wpa_s->edca_format_and_bw;
+	pr.max_rx_antenna = wpa_s->max_rx_antenna;
+	pr.max_tx_antenna = wpa_s->max_tx_antenna;
+
+	pr.ntb_ista_support = (wpa_s->drv_flags2
+			       & WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR);
+	pr.ntb_rsta_support = (wpa_s->drv_flags2 &
+				WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER);
+	pr.ntb_format_and_bw = wpa_s->ntb_format_and_bw;
+	pr.max_tx_ltf_repetations = wpa_s->max_tx_ltf_repetations;
+	pr.max_rx_ltf_repetations = wpa_s->max_rx_ltf_repetations;
+	pr.max_tx_ltf_total = wpa_s->max_tx_ltf_total;
+	pr.max_rx_ltf_total = wpa_s->max_rx_ltf_total;
+	pr.max_rx_sts_le_80 = wpa_s->max_rx_sts_le_80;
+	pr.max_rx_sts_gt_80 = wpa_s->max_rx_sts_gt_80;
+	pr.max_tx_sts_le_80 = wpa_s->max_tx_sts_le_80;
+	pr.max_tx_sts_gt_80 = wpa_s->max_tx_sts_gt_80;
+
+	pr.support_6ghz = wpas_is_6ghz_supported(wpa_s, true);
+
+	pr.secure_he_ltf = wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_STA;
+
+	if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
+		os_memcpy(pr.country, wpa_s->conf->country, 2);
+		pr.country[2] = 0x04;
+	} else {
+		os_memcpy(pr.country, "XX\x04", 3);
+	}
 
 	global->pr = pr_init(&pr);
 	if (!global->pr) {
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 3c8cc0727..719829197 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -7825,6 +7825,21 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 		wpa_s->extended_capa_len = capa.extended_capa_len;
 		wpa_s->num_multichan_concurrent =
 			capa.num_multichan_concurrent;
+
+		wpa_s->edca_format_and_bw = capa.edca_format_and_bw;
+		wpa_s->max_tx_antenna = capa.max_tx_antenna;
+		wpa_s->max_rx_antenna = capa.max_rx_antenna;
+
+		wpa_s->ntb_format_and_bw = capa.ntb_format_and_bw;
+		wpa_s->max_tx_ltf_repetations = capa.max_tx_ltf_repetations;
+		wpa_s->max_rx_ltf_repetations = capa.max_rx_ltf_repetations;
+		wpa_s->max_tx_ltf_total = capa.max_tx_ltf_total;
+		wpa_s->max_rx_ltf_total = capa.max_rx_ltf_total;
+		wpa_s->max_rx_sts_le_80 = capa.max_rx_sts_le_80;
+		wpa_s->max_rx_sts_gt_80 = capa.max_rx_sts_gt_80;
+		wpa_s->max_tx_sts_le_80 = capa.max_tx_sts_le_80;
+		wpa_s->max_tx_sts_gt_80 = capa.max_tx_sts_gt_80;
+
 #ifndef CONFIG_NO_WMM_AC
 		wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
 #endif /* CONFIG_NO_WMM_AC */
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index cc8ee34ad..3c9e02af1 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -957,6 +957,22 @@ struct wpa_supplicant {
 	unsigned int max_stations;
 	unsigned int max_num_akms;
 
+	/* EDCA based ranging capabilities */
+	u8 edca_format_and_bw;
+	u8 max_tx_antenna;
+	u8 max_rx_antenna;
+
+	/* NTB based ranging capabilities */
+	u8 ntb_format_and_bw;
+	u8 max_tx_ltf_repetations;
+	u8 max_rx_ltf_repetations;
+	u8 max_tx_ltf_total;
+	u8 max_rx_ltf_total;
+	u8 max_rx_sts_le_80;
+	u8 max_rx_sts_gt_80;
+	u8 max_tx_sts_le_80;
+	u8 max_tx_sts_gt_80;
+
 	int pending_mic_error_report;
 	int pending_mic_error_pairwise;
 	int mic_errors_seen; /* Michael MIC errors with the current PTK */
-- 
2.34.1




More information about the Hostap mailing list