[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