From 1fafdf1124cdee73c7cfd1767cd9ec335a475c79 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sat, 4 Nov 2017 11:27:00 +0200 Subject: [PATCH] DPP: Add DPP_LISTEN and DPP_STOP_LISTEN to hostapd This is an initial step in allowing non-operating channel operations with DPP when hostapd is the Responder. For now, this is only used for specifying role=configurator/enrollee and qr=mutual cases similarly to the wpa_supplicant configuration for in Responder role. Request to use a non-operating channel will be rejected. Signed-off-by: Jouni Malinen --- hostapd/ctrl_iface.c | 5 +++++ src/ap/dpp_hostapd.c | 35 +++++++++++++++++++++++++++++++++++ src/ap/dpp_hostapd.h | 2 ++ 3 files changed, 42 insertions(+) diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 2e9c4c735..181760c21 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -3018,6 +3018,11 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd, } else if (os_strncmp(buf, "DPP_AUTH_INIT ", 14) == 0) { if (hostapd_dpp_auth_init(hapd, buf + 13) < 0) reply_len = -1; + } else if (os_strncmp(buf, "DPP_LISTEN ", 11) == 0) { + if (hostapd_dpp_listen(hapd, buf + 11) < 0) + reply_len = -1; + } else if (os_strcmp(buf, "DPP_STOP_LISTEN") == 0) { + hostapd_dpp_listen_stop(hapd); } else if (os_strncmp(buf, "DPP_CONFIGURATOR_ADD", 20) == 0) { res = hostapd_dpp_configurator_add(hapd, buf + 20); if (res < 0) { diff --git a/src/ap/dpp_hostapd.c b/src/ap/dpp_hostapd.c index 45495f3b8..f715e1578 100644 --- a/src/ap/dpp_hostapd.c +++ b/src/ap/dpp_hostapd.c @@ -543,6 +543,41 @@ fail: } +int hostapd_dpp_listen(struct hostapd_data *hapd, const char *cmd) +{ + int freq; + + freq = atoi(cmd); + if (freq <= 0) + return -1; + + if (os_strstr(cmd, " role=configurator")) + hapd->dpp_allowed_roles = DPP_CAPAB_CONFIGURATOR; + else if (os_strstr(cmd, " role=enrollee")) + hapd->dpp_allowed_roles = DPP_CAPAB_ENROLLEE; + else + hapd->dpp_allowed_roles = DPP_CAPAB_CONFIGURATOR | + DPP_CAPAB_ENROLLEE; + hapd->dpp_qr_mutual = os_strstr(cmd, " qr=mutual") != NULL; + + if (freq != hapd->iface->freq && hapd->iface->freq > 0) { + /* TODO: Listen operation on non-operating channel */ + wpa_printf(MSG_INFO, + "DPP: Listen operation on non-operating channel (%d MHz) is not yet supported (operating channel: %d MHz)", + freq, hapd->iface->freq); + return -1; + } + + return 0; +} + + +void hostapd_dpp_listen_stop(struct hostapd_data *hapd) +{ + /* TODO: Stop listen operation on non-operating channel */ +} + + static void hostapd_dpp_rx_auth_req(struct hostapd_data *hapd, const u8 *src, const u8 *hdr, const u8 *buf, size_t len, unsigned int freq) diff --git a/src/ap/dpp_hostapd.h b/src/ap/dpp_hostapd.h index d870b2051..f9d0efec2 100644 --- a/src/ap/dpp_hostapd.h +++ b/src/ap/dpp_hostapd.h @@ -17,6 +17,8 @@ const char * hostapd_dpp_bootstrap_get_uri(struct hostapd_data *hapd, int hostapd_dpp_bootstrap_info(struct hostapd_data *hapd, int id, char *reply, int reply_size); int hostapd_dpp_auth_init(struct hostapd_data *hapd, const char *cmd); +int hostapd_dpp_listen(struct hostapd_data *hapd, const char *cmd); +void hostapd_dpp_listen_stop(struct hostapd_data *hapd); void hostapd_dpp_rx_action(struct hostapd_data *hapd, const u8 *src, const u8 *buf, size_t len, unsigned int freq); void hostapd_dpp_tx_status(struct hostapd_data *hapd, const u8 *dst,