From c1d377396738839c005d4027173e609f7b7756fa Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Mon, 13 Nov 2017 12:12:08 +0200 Subject: [PATCH] DPP: Stop authentication exchange of DPP_STOP_LISTEN Previously, this command stopped listen operation immediately, but if there was an ongoing authentication exchange, a new listen operation was started. This is not really expected behavior, so stop the authentication exchange first with this command to avoid restarting listen operation. Signed-off-by: Jouni Malinen --- hostapd/ctrl_iface.c | 1 + src/ap/dpp_hostapd.c | 7 +++++++ src/ap/dpp_hostapd.h | 1 + wpa_supplicant/ctrl_iface.c | 1 + wpa_supplicant/dpp_supplicant.c | 7 +++++++ wpa_supplicant/dpp_supplicant.h | 1 + 6 files changed, 18 insertions(+) diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 181760c21..3161170b7 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -3022,6 +3022,7 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd, if (hostapd_dpp_listen(hapd, buf + 11) < 0) reply_len = -1; } else if (os_strcmp(buf, "DPP_STOP_LISTEN") == 0) { + hostapd_dpp_stop(hapd); hostapd_dpp_listen_stop(hapd); } else if (os_strncmp(buf, "DPP_CONFIGURATOR_ADD", 20) == 0) { res = hostapd_dpp_configurator_add(hapd, buf + 20); diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c index a8d90fd0f..a579e7fc8 100644 --- a/src/ap/dpp_hostapd.c +++ b/src/ap/dpp_hostapd.c @@ -1600,6 +1600,13 @@ int hostapd_dpp_pkex_remove(struct hostapd_data *hapd, const char *id) } +void hostapd_dpp_stop(struct hostapd_data *hapd) +{ + dpp_auth_deinit(hapd->dpp_auth); + hapd->dpp_auth = NULL; +} + + int hostapd_dpp_init(struct hostapd_data *hapd) { dl_list_init(&hapd->dpp_bootstrap); diff --git a/src/ap/dpp_hostapd.h b/src/ap/dpp_hostapd.h index f9d0efec2..d3a57cd2e 100644 --- a/src/ap/dpp_hostapd.h +++ b/src/ap/dpp_hostapd.h @@ -30,6 +30,7 @@ int hostapd_dpp_configurator_add(struct hostapd_data *hapd, const char *cmd); int hostapd_dpp_configurator_remove(struct hostapd_data *hapd, const char *id); int hostapd_dpp_pkex_add(struct hostapd_data *hapd, const char *cmd); int hostapd_dpp_pkex_remove(struct hostapd_data *hapd, const char *id); +void hostapd_dpp_stop(struct hostapd_data *hapd); int hostapd_dpp_init(struct hostapd_data *hapd); void hostapd_dpp_deinit(struct hostapd_data *hapd); diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 296423ae3..c2c423587 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -10498,6 +10498,7 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, if (wpas_dpp_listen(wpa_s, buf + 11) < 0) reply_len = -1; } else if (os_strcmp(buf, "DPP_STOP_LISTEN") == 0) { + wpas_dpp_stop(wpa_s); wpas_dpp_listen_stop(wpa_s); } else if (os_strncmp(buf, "DPP_CONFIGURATOR_ADD", 20) == 0) { int res; diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c index bb4b5ada5..2f7a9940a 100644 --- a/wpa_supplicant/dpp_supplicant.c +++ b/wpa_supplicant/dpp_supplicant.c @@ -2201,6 +2201,13 @@ int wpas_dpp_pkex_remove(struct wpa_supplicant *wpa_s, const char *id) } +void wpas_dpp_stop(struct wpa_supplicant *wpa_s) +{ + dpp_auth_deinit(wpa_s->dpp_auth); + wpa_s->dpp_auth = NULL; +} + + int wpas_dpp_init(struct wpa_supplicant *wpa_s) { u8 adv_proto_id[7]; diff --git a/wpa_supplicant/dpp_supplicant.h b/wpa_supplicant/dpp_supplicant.h index 05a466d55..0760b3648 100644 --- a/wpa_supplicant/dpp_supplicant.h +++ b/wpa_supplicant/dpp_supplicant.h @@ -30,6 +30,7 @@ int wpas_dpp_configurator_remove(struct wpa_supplicant *wpa_s, const char *id); int wpas_dpp_configurator_sign(struct wpa_supplicant *wpa_s, const char *cmd); int wpas_dpp_pkex_add(struct wpa_supplicant *wpa_s, const char *cmd); int wpas_dpp_pkex_remove(struct wpa_supplicant *wpa_s, const char *id); +void wpas_dpp_stop(struct wpa_supplicant *wpa_s); int wpas_dpp_init(struct wpa_supplicant *wpa_s); void wpas_dpp_deinit(struct wpa_supplicant *wpa_s); int wpas_dpp_check_connect(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,