[PATCH v3 26/46] PR: Add interface to trigger PASN authentication for ranging

Kavita Kavita kavita.kavita at oss.qualcomm.com
Wed May 13 02:59:50 PDT 2026


From: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>

Add wpas_pr_pasn_trigger() as the entry point for initiating PASN
authentication for a single peer in the PR ranging workflow. The
function stores the request parameters in pr_data to track the
in-progress session and calls wpas_pr_initiate_pasn_auth() to start
the exchange.

Add pr_pasn_ranging_params struct to carry per-peer PASN and ranging
parameters including peer address, frequency, auth mode, ranging role
and type, source address, and PASN role.

pr_pasn_params is freed in pr_deinit() under CONFIG_PASN and on
failure in wpas_pr_pasn_trigger().

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>
---
 src/common/proximity_ranging.c |  3 ++
 src/common/proximity_ranging.h | 22 +++++++++++
 wpa_supplicant/pr_supplicant.c | 72 ++++++++++++++++++++++++++++++++++
 wpa_supplicant/pr_supplicant.h |  7 ++++
 4 files changed, 104 insertions(+)

diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
index ea229eaef..4aa8ebee0 100644
--- a/src/common/proximity_ranging.c
+++ b/src/common/proximity_ranging.c
@@ -149,6 +149,9 @@ void pr_deinit(struct pr_data *pr)
 	pr_deinit_dev_iks(pr);
 
 #ifdef CONFIG_PASN
+	os_free(pr->pr_pasn_params);
+	pr->pr_pasn_params = NULL;
+
 	pasn_initiator_pmksa_cache_deinit(pr->initiator_pmksa);
 	pasn_responder_pmksa_cache_deinit(pr->responder_pmksa);
 #endif /* CONFIG_PASN */
diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h
index 2643f8534..91fa3f652 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -258,6 +258,25 @@ enum pr_attr_id {
 #define PR_PASN_AUTH_MODE_SAE    1
 #define PR_PASN_AUTH_MODE_PMK    2
 
+/**
+ * struct pr_pasn_ranging_params - peer parameters to be used in PASN
+ * then to trigger ranging in case where PR PASN is successful.
+ */
+struct pr_pasn_ranging_params {
+	enum {
+		PR_PASN_AND_RANGING,
+		PR_STOP_RANGING,
+	} action;
+	u8 peer_addr[ETH_ALEN];
+	u8 ranging_type;
+	u8 ranging_role;
+	u8 pr_pasn_status;
+	u8 auth_mode;
+	int freq;
+	u8 src_addr[ETH_ALEN];
+	enum pr_pasn_role pasn_role;
+};
+
 struct pr_dev_ik {
 	struct dl_list list;
 	u8 dik[DEVICE_IDENTITY_KEY_LEN];
@@ -479,6 +498,9 @@ struct pr_data {
 	/* PMKSA cache for PASN-PMK authentication */
 	struct rsn_pmksa_cache *initiator_pmksa;
 	struct rsn_pmksa_cache *responder_pmksa;
+
+	/* PR PASN request tracking - similar to pasn_params in wpa_supplicant */
+	struct pr_pasn_ranging_params *pr_pasn_params;
 };
 
 /* PR Device Identity Resolution Attribute parameters */
diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c
index 6272c0b7c..b47434eae 100644
--- a/wpa_supplicant/pr_supplicant.c
+++ b/wpa_supplicant/pr_supplicant.c
@@ -965,6 +965,78 @@ int wpas_pr_initiate_pasn_auth(struct wpa_supplicant *wpa_s,
 }
 
 
+/**
+ * wpas_pr_pasn_trigger - Entry point to trigger PASN authentication for PR
+ */
+void wpas_pr_pasn_trigger(struct wpa_supplicant *wpa_s,
+			  struct pr_pasn_ranging_params *pr_pasn_params)
+{
+	struct pr_data *pr = wpa_s->global->pr;
+
+	if (!pr_pasn_params) {
+		wpa_printf(MSG_DEBUG, "PR PASN: trigger: NULL params");
+		return;
+	}
+
+	if (!pr) {
+		wpa_printf(MSG_DEBUG, "PR PASN: trigger: PR not initialized");
+		return;
+	}
+
+	if (pr->pr_pasn_params) {
+		wpa_printf(MSG_DEBUG,
+			   "PR PASN: auth_trigger: Already in progress");
+		pr_pasn_params->pr_pasn_status = PASN_STATUS_FAILURE;
+		return;
+	}
+
+	if (pr_pasn_params->action == PR_PASN_AND_RANGING) {
+		wpa_printf(MSG_DEBUG,
+			   "PR PASN: Triggering PASN authentication for " MACSTR
+			   " type=%u role=%u mode=%u freq=%d",
+			   MAC2STR(pr_pasn_params->peer_addr),
+			   pr_pasn_params->ranging_type,
+			   pr_pasn_params->ranging_role,
+			   pr_pasn_params->auth_mode,
+			   pr_pasn_params->freq);
+
+		/* Allocate and store the params to track the request */
+		pr->pr_pasn_params = os_zalloc(sizeof(*pr->pr_pasn_params));
+		if (!pr->pr_pasn_params) {
+			wpa_printf(MSG_DEBUG,
+				   "PR PASN: Failed to allocate params");
+			pr_pasn_params->pr_pasn_status = PASN_STATUS_FAILURE;
+			return;
+		}
+
+		os_memcpy(pr->pr_pasn_params, pr_pasn_params,
+			  sizeof(*pr->pr_pasn_params));
+
+		/* Initiate PASN authentication for the peer */
+		if (wpas_pr_initiate_pasn_auth(wpa_s, pr_pasn_params->peer_addr,
+					       pr_pasn_params->freq,
+					       pr_pasn_params->auth_mode,
+					       pr_pasn_params->ranging_role,
+					       pr_pasn_params->ranging_type, 0,
+					       pr_pasn_params->src_addr,
+					       pr_pasn_params->pasn_role)) {
+			wpa_printf(MSG_DEBUG,
+				   "PR PASN: Failed to initiate PASN for " MACSTR,
+				   MAC2STR(pr_pasn_params->peer_addr));
+			pr_pasn_params->pr_pasn_status = PASN_STATUS_FAILURE;
+			os_free(pr->pr_pasn_params);
+			pr->pr_pasn_params = NULL;
+			return;
+		}
+	} else {
+		wpa_printf(MSG_WARNING,
+			   "PR PASN: Unsupported action %u, ignoring request",
+			   pr_pasn_params->action);
+		pr_pasn_params->pr_pasn_status = PASN_STATUS_FAILURE;
+	}
+}
+
+
 int wpas_pr_pasn_auth_tx_status(struct wpa_supplicant *wpa_s, const u8 *data,
 				size_t data_len, bool acked)
 {
diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h
index 747bb900a..f8b114985 100644
--- a/wpa_supplicant/pr_supplicant.h
+++ b/wpa_supplicant/pr_supplicant.h
@@ -39,6 +39,8 @@ int wpas_pr_pasn_auth_rx(struct wpa_supplicant *wpa_s,
 			 int freq);
 void wpas_pr_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
 					 unsigned int freq);
+void wpas_pr_pasn_trigger(struct wpa_supplicant *wpa_s,
+			  struct pr_pasn_ranging_params *pr_pasn_params);
 
 #else /* CONFIG_PR */
 
@@ -111,6 +113,11 @@ wpas_pr_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline void wpas_pr_pasn_trigger(struct wpa_supplicant *wpa_s,
+					struct pr_pasn_ranging_params *pr_pasn_params)
+{
+}
+
 #endif /* CONFIG_PR */
 
 #endif /* PR_SUPPLICANT_H */
-- 
2.34.1




More information about the Hostap mailing list