[PATCH 1/1] Fix NAN USD state machine stall seen with listen failure.

Ajay Davanageri ajay.davanageri at synaptics.corp-partner.google.com
Tue Apr 29 01:18:41 PDT 2025


If driver returns -EBUSY for remain_on_channel operation, NAN USD state-machine gets stuck and no further listen is configured from supplicant.
This patch clears the states and re-triggers the nan_de_timer to restart the listen operation.

bug:298345110
test:n/a

Signed-off-by: Ajay Davanageri <ajay.davanageri at synaptics.corp-partner.google.com>
---
 src/common/nan_de.c      |  5 +----
 wpa_supplicant/nan_usd.c | 12 ++++++++++++
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/common/nan_de.c b/src/common/nan_de.c
index 4f63adc85..7798887ff 100644
--- a/src/common/nan_de.c
+++ b/src/common/nan_de.c
@@ -165,7 +165,6 @@ void nan_de_flush(struct nan_de *de)
 	nan_de_clear_pending(de);
 }
 
-
 static void nan_de_pause_state(struct nan_de_service *srv, const u8 *peer_addr,
 			       u8 peer_id)
 {
@@ -179,7 +178,6 @@ static void nan_de_pause_state(struct nan_de_service *srv, const u8 *peer_addr,
 	srv->sel_peer_id = peer_id;
 }
 
-
 static void nan_de_unpause_state(struct nan_de_service *srv)
 {
 	wpa_printf(MSG_DEBUG, "NAN: Stop pauseState");
@@ -582,7 +580,6 @@ static void nan_de_start_new_publish_state(struct nan_de_service *srv,
 		   srv->in_multi_chan ? "multi" : "single", n * 100, srv->freq);
 }
 
-
 static void nan_de_timer(void *eloop_ctx, void *timeout_ctx)
 {
 	struct nan_de *de = eloop_ctx;
@@ -685,7 +682,6 @@ static void nan_de_timer(void *eloop_ctx, void *timeout_ctx)
 			       de, NULL);
 }
 
-
 static void nan_de_run_timer(struct nan_de *de)
 {
 	eloop_cancel_timeout(nan_de_timer, de, NULL);
@@ -1180,6 +1176,7 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
 		if (type == NAN_SRV_CTRL_SUBSCRIBE &&
 		    srv->type == NAN_DE_SUBSCRIBE)
 			continue;
+
 		wpa_printf(MSG_DEBUG, "NAN: Received SDF matches service ID %u",
 			   i + 1);
 
diff --git a/wpa_supplicant/nan_usd.c b/wpa_supplicant/nan_usd.c
index 946d62fb3..4d5a132f5 100644
--- a/wpa_supplicant/nan_usd.c
+++ b/wpa_supplicant/nan_usd.c
@@ -9,6 +9,7 @@
 #include "utils/includes.h"
 
 #include "utils/common.h"
+#include "utils/eloop.h"
 #include "common/nan_de.h"
 #include "wpa_supplicant_i.h"
 #include "offchannel.h"
@@ -180,6 +181,14 @@ static void wpas_nan_usd_listen_work_done(struct wpa_supplicant *wpa_s)
 	wpa_s->nan_usd_listen_work = NULL;
 }
 
+static void wpas_nan_usd_remain_on_channel_timeout(void *eloop_ctx, void *timeout_ctx)
+{
+	struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)eloop_ctx;
+	struct wpas_nan_usd_listen_work *lwork = (struct wpas_nan_usd_listen_work *)timeout_ctx;
+
+	wpas_nan_usd_cancel_remain_on_channel_cb(wpa_s, lwork->freq);
+	return;
+}
 
 static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
 					 int deinit)
@@ -209,6 +218,9 @@ static void wpas_nan_usd_start_listen_cb(struct wpa_radio_work *work,
 			   "NAN: Failed to request the driver to remain on channel (%u MHz) for listen",
 			   lwork->freq);
 		wpas_nan_usd_listen_work_done(wpa_s);
+                eloop_cancel_timeout(wpas_nan_usd_remain_on_channel_timeout, wpa_s, NULL);
+		/* restart the listen state after a delay */
+		eloop_register_timeout(0, 500, wpas_nan_usd_remain_on_channel_timeout, wpa_s, lwork)
 		return;
 	}
 }
-- 
2.34.1




More information about the Hostap mailing list