[PATCH v3 38/46] PR: Add API and ctrl iface command to abort ranging session
Kavita Kavita
kavita.kavita at oss.qualcomm.com
Wed May 13 03:00:02 PDT 2026
From: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>
Add wpas_pr_abort_ranging() and PR_RANGING_ABORT ctrl_iface command to
allow early termination of an ongoing ranging session.
The function cancels any active PASN work and ROC (for the
responder path where no PD wdev exists yet), then calls
wpas_pr_pd_stop() to clean up all ranging resources including the
nl_pr socket, session timeout, and PD wdev.
Signed-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy at oss.qualcomm.com>
---
wpa_supplicant/ctrl_iface.c | 2 ++
wpa_supplicant/pr_supplicant.c | 48 ++++++++++++++++++++++++++++++++++
wpa_supplicant/pr_supplicant.h | 5 ++++
3 files changed, 55 insertions(+)
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index b2cb6746e..8238229f0 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -14505,6 +14505,8 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
reply_len = -1;
} else if (os_strcmp(buf, "PR_CLEAR_DIK_CONTEXT") == 0) {
wpas_pr_clear_dev_iks(wpa_s);
+ } else if (os_strcmp(buf, "PR_RANGING_ABORT") == 0) {
+ wpas_pr_abort_ranging(wpa_s);
#endif /* CONFIG_PR */
#ifdef CONFIG_TESTING_OPTIONS
} else if (os_strncmp(buf, "PASN_DRIVER ", 12) == 0) {
diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c
index a753db9a1..8d1a1b632 100644
--- a/wpa_supplicant/pr_supplicant.c
+++ b/wpa_supplicant/pr_supplicant.c
@@ -22,6 +22,8 @@
#ifdef CONFIG_PASN
static void wpas_pr_pasn_timeout(void *eloop_ctx, void *timeout_ctx);
+static void wpas_pr_pasn_cancel_auth_work(struct wpa_supplicant *wpa_s);
+static void wpas_pr_pasn_roc_work_done(struct wpa_supplicant *wpa_s);
/* Total listen window (ms) for the PASN responder ROC */
#define PR_PASN_RESPONDER_ROC_DURATION 5000
@@ -808,6 +810,52 @@ void wpas_pr_set_dev_ik(struct wpa_supplicant *wpa_s, const u8 *dik,
}
+void wpas_pr_abort_ranging(struct wpa_supplicant *wpa_s)
+{
+ struct pr_data *pr = wpa_s->global->pr;
+
+ if (!pr) {
+ wpa_printf(MSG_DEBUG, "PR: abort_ranging: PR not initialized");
+ return;
+ }
+
+ /* Check if there's an active ranging session */
+ if (is_zero_ether_addr(wpa_s->pd_addr) && !pr->pr_pasn_params) {
+ wpa_printf(MSG_DEBUG,
+ "PR: abort_ranging: no active ranging session");
+ return;
+ }
+
+ wpa_printf(MSG_DEBUG, "PR: Aborting ranging session");
+
+ /*
+ * Cancel PASN and ROC in case PD wdev is not yet created
+ * (PASN still in progress or responder ROC active).
+ */
+ wpas_pr_pasn_cancel_auth_work(wpa_s);
+ wpa_s->pr_pasn_auth_work = NULL;
+ if (wpa_s->pr_responder_mode) {
+ eloop_cancel_timeout(wpas_pr_pasn_roc_total_timeout, wpa_s, NULL);
+ wpa_drv_cancel_remain_on_channel(wpa_s);
+ wpa_s->off_channel_freq = 0;
+ wpa_s->roc_waiting_drv_freq = 0;
+ wpas_pr_pasn_roc_work_done(wpa_s);
+ wpa_s->pr_responder_mode = false;
+ os_memset(wpa_s->pr_responder_src_addr, 0, ETH_ALEN);
+ }
+
+ /* Stop PD wdev and cleanup all ranging resources */
+ wpas_pr_pd_stop(wpa_s);
+
+ /* Free ranging params so a new session can be started */
+ if (pr->pr_pasn_params) {
+ os_free(pr->pr_pasn_params);
+ pr->pr_pasn_params = NULL;
+ pr->ranging_final_received = false;
+ }
+}
+
+
void wpas_pr_measurement_complete(struct wpa_supplicant *wpa_s,
struct peer_measurement_complete *complete)
{
diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h
index 9a4009819..941a4a2f8 100644
--- a/wpa_supplicant/pr_supplicant.h
+++ b/wpa_supplicant/pr_supplicant.h
@@ -41,6 +41,7 @@ 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);
+void wpas_pr_abort_ranging(struct wpa_supplicant *wpa_s);
void wpas_pr_measurement_complete(struct wpa_supplicant *wpa_s,
struct peer_measurement_complete *complete);
void wpas_pr_measurement_result(struct wpa_supplicant *wpa_s,
@@ -122,6 +123,10 @@ static inline void wpas_pr_pasn_trigger(struct wpa_supplicant *wpa_s,
{
}
+static inline void wpas_pr_abort_ranging(struct wpa_supplicant *wpa_s)
+{
+}
+
static inline void
wpas_pr_measurement_complete(struct wpa_supplicant *wpa_s,
struct peer_measurement_complete *complete)
--
2.34.1
More information about the Hostap
mailing list