]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
DPP: PKEX initiation on other bands
authorJouni Malinen <jouni@codeaurora.org>
Wed, 7 Feb 2018 14:56:43 +0000 (16:56 +0200)
committerJouni Malinen <j@w1.fi>
Wed, 7 Feb 2018 14:56:43 +0000 (16:56 +0200)
Add support for wpa_supplicant to try to initiate PKEX on 5 GHz and 60
GHz bands in addition to the previously available 2.4 GHz case. If no
response from a peer device is seen on the 2.4 GHz band (channel 6) for
the five attempts, try the other PKEX channels (5 GHz channels 44 and
149; and 60 GHz channel 2) if they are supported and allowed for
initiating radiation.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
wpa_supplicant/dpp_supplicant.c

index 18404310acbd37695c6d4963cbd86989f4af28df..3eb18727b2baeda42ce37e00e9ca8a1a146ab7d9 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * wpa_supplicant - DPP
  * Copyright (c) 2017, Qualcomm Atheros, Inc.
+ * Copyright (c) 2018, The Linux Foundation
  *
  * This software may be distributed under the terms of the BSD license.
  * See README for more details.
@@ -1654,6 +1655,62 @@ fail:
 }
 
 
+static int wpas_dpp_allow_ir(struct wpa_supplicant *wpa_s, unsigned int freq)
+{
+       int i, j;
+
+       if (!wpa_s->hw.modes)
+               return -1;
+
+       for (i = 0; i < wpa_s->hw.num_modes; i++) {
+               struct hostapd_hw_modes *mode = &wpa_s->hw.modes[i];
+
+               for (j = 0; j < mode->num_channels; j++) {
+                       struct hostapd_channel_data *chan = &mode->channels[j];
+
+                       if (chan->freq != (int) freq)
+                               continue;
+
+                       if (chan->flag & (HOSTAPD_CHAN_DISABLED |
+                                         HOSTAPD_CHAN_NO_IR |
+                                         HOSTAPD_CHAN_RADAR))
+                               continue;
+
+                       return 1;
+               }
+       }
+
+       wpa_printf(MSG_DEBUG,
+                  "DPP: Frequency %u MHz not supported or does not allow PKEX initiation in the current channel list",
+                  freq);
+
+       return 0;
+}
+
+
+static int wpas_dpp_pkex_next_channel(struct wpa_supplicant *wpa_s,
+                                     struct dpp_pkex *pkex)
+{
+       if (pkex->freq == 2437)
+               pkex->freq = 5745;
+       else if (pkex->freq == 5745)
+               pkex->freq = 5220;
+       else if (pkex->freq == 5220)
+               pkex->freq = 60480;
+       else
+               return -1; /* no more channels to try */
+
+       if (wpas_dpp_allow_ir(wpa_s, pkex->freq) == 1) {
+               wpa_printf(MSG_DEBUG, "DPP: Try to initiate on %u MHz",
+                          pkex->freq);
+               return 0;
+       }
+
+       /* Could not use this channel - try the next one */
+       return wpas_dpp_pkex_next_channel(wpa_s, pkex);
+}
+
+
 static void wpas_dpp_pkex_retry_timeout(void *eloop_ctx, void *timeout_ctx)
 {
        struct wpa_supplicant *wpa_s = eloop_ctx;
@@ -1662,11 +1719,14 @@ static void wpas_dpp_pkex_retry_timeout(void *eloop_ctx, void *timeout_ctx)
        if (!pkex || !pkex->exchange_req)
                return;
        if (pkex->exch_req_tries >= 5) {
-               wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
-                       "No response from PKEX peer");
-               dpp_pkex_free(pkex);
-               wpa_s->dpp_pkex = NULL;
-               return;
+               if (wpas_dpp_pkex_next_channel(wpa_s, pkex) < 0) {
+                       wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
+                               "No response from PKEX peer");
+                       dpp_pkex_free(pkex);
+                       wpa_s->dpp_pkex = NULL;
+                       return;
+               }
+               pkex->exch_req_tries = 0;
        }
 
        pkex->exch_req_tries++;
@@ -2400,7 +2460,6 @@ int wpas_dpp_pkex_add(struct wpa_supplicant *wpa_s, const char *cmd)
                wait_time = wpa_s->max_remain_on_chan;
                if (wait_time > 2000)
                        wait_time = 2000;
-               /* TODO: Support for 5 GHz channels */
                pkex->freq = 2437;
                wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR
                        " freq=%u type=%d",