@@ -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) {
@@ -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)
{
@@ -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)