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@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> --- 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 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap