From 0a488ef35c28970c561d84787067a3350b563784 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sat, 9 May 2020 17:30:48 +0300 Subject: [PATCH] DPP: Track ending time for remain-on-channel operations This may be needed to optimize use of offchannel TX operations with wait-for-response when near the end of a pending remain-on-channel operation. Signed-off-by: Jouni Malinen --- wpa_supplicant/dpp_supplicant.c | 18 ++++++++++++++++++ wpa_supplicant/dpp_supplicant.h | 2 ++ wpa_supplicant/events.c | 5 +++++ wpa_supplicant/wpa_supplicant_i.h | 1 + 4 files changed, 26 insertions(+) diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c index eae62e289..837ddbe04 100644 --- a/wpa_supplicant/dpp_supplicant.c +++ b/wpa_supplicant/dpp_supplicant.c @@ -938,6 +938,24 @@ void wpas_dpp_listen_stop(struct wpa_supplicant *wpa_s) } +void wpas_dpp_remain_on_channel_cb(struct wpa_supplicant *wpa_s, + unsigned int freq, unsigned int duration) +{ + if (wpa_s->dpp_listen_freq != freq) + return; + + wpa_printf(MSG_DEBUG, + "DPP: Remain-on-channel started for listen on %u MHz for %u ms", + freq, duration); + os_get_reltime(&wpa_s->dpp_listen_end); + wpa_s->dpp_listen_end.usec += duration * 1000; + while (wpa_s->dpp_listen_end.usec >= 1000000) { + wpa_s->dpp_listen_end.sec++; + wpa_s->dpp_listen_end.usec -= 1000000; + } +} + + void wpas_dpp_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s, unsigned int freq) { diff --git a/wpa_supplicant/dpp_supplicant.h b/wpa_supplicant/dpp_supplicant.h index 2ce378dc1..6d70874c4 100644 --- a/wpa_supplicant/dpp_supplicant.h +++ b/wpa_supplicant/dpp_supplicant.h @@ -19,6 +19,8 @@ int wpas_dpp_nfc_handover_sel(struct wpa_supplicant *wpa_s, const char *cmd); int wpas_dpp_auth_init(struct wpa_supplicant *wpa_s, const char *cmd); int wpas_dpp_listen(struct wpa_supplicant *wpa_s, const char *cmd); void wpas_dpp_listen_stop(struct wpa_supplicant *wpa_s); +void wpas_dpp_remain_on_channel_cb(struct wpa_supplicant *wpa_s, + unsigned int freq, unsigned int duration); void wpas_dpp_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s, unsigned int freq); void wpas_dpp_rx_action(struct wpa_supplicant *wpa_s, const u8 *src, diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index a25b43db0..46341e936 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -5005,6 +5005,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, wpas_p2p_remain_on_channel_cb( wpa_s, data->remain_on_channel.freq, data->remain_on_channel.duration); +#ifdef CONFIG_DPP + wpas_dpp_remain_on_channel_cb( + wpa_s, data->remain_on_channel.freq, + data->remain_on_channel.duration); +#endif /* CONFIG_DPP */ break; case EVENT_CANCEL_REMAIN_ON_CHANNEL: #ifdef CONFIG_OFFCHANNEL diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 619ae42b6..2ed8e2f85 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1249,6 +1249,7 @@ struct wpa_supplicant { struct wpa_radio_work *dpp_listen_work; unsigned int dpp_pending_listen_freq; unsigned int dpp_listen_freq; + struct os_reltime dpp_listen_end; u8 dpp_allowed_roles; int dpp_qr_mutual; int dpp_netrole;