DPP3: Use chirping channel list in PB discovery

This design was changed in the draft specification, so update
implementation to match the new design. Instead of including all
supported 2.4 and 5 GHz channels, generate the channel list using the
same mechanism that was already used for chirping.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
Jouni Malinen 2022-08-25 12:47:53 +03:00 committed by Jouni Malinen
parent d6e790e209
commit 4ae14deeef

View file

@ -5322,40 +5322,6 @@ static int wpas_dpp_pb_announce(struct wpa_supplicant *wpa_s, int freq);
static void wpas_dpp_pb_next(void *eloop_ctx, void *timeout_ctx); static void wpas_dpp_pb_next(void *eloop_ctx, void *timeout_ctx);
static bool wpas_dpp_pb_chan_ok(struct hostapd_channel_data *chan)
{
/* For now, do not include 6 GHz channels since finding a Configurator
* from a large number of channels would take excessive amount of time.
*/
if (is_6ghz_freq(chan->freq))
return false;
return !(chan->flag & (HOSTAPD_CHAN_DISABLED |
HOSTAPD_CHAN_NO_IR |
HOSTAPD_CHAN_RADAR));
}
static int wpas_dpp_pb_channels(struct wpa_supplicant *wpa_s)
{
struct hostapd_hw_modes *mode;
int m, c;
for (m = 0; m < wpa_s->hw.num_modes; m++) {
mode = &wpa_s->hw.modes[m];
for (c = 0; c < mode->num_channels; c++) {
struct hostapd_channel_data *chan = &mode->channels[c];
if (!wpas_dpp_pb_chan_ok(chan))
continue;
int_array_add_unique(&wpa_s->dpp_pb_freqs, chan->freq);
}
}
return wpa_s->dpp_pb_freqs ? 0 : -1;
}
static void wpas_dpp_pb_tx_status(struct wpa_supplicant *wpa_s, static void wpas_dpp_pb_tx_status(struct wpa_supplicant *wpa_s,
unsigned int freq, const u8 *dst, unsigned int freq, const u8 *dst,
const u8 *src, const u8 *bssid, const u8 *src, const u8 *bssid,
@ -5544,6 +5510,22 @@ static int wpas_dpp_push_button_configurator(struct wpa_supplicant *wpa_s,
} }
static void wpas_dpp_pb_scan_res_handler(struct wpa_supplicant *wpa_s,
struct wpa_scan_results *scan_res)
{
if (!wpa_s->dpp_pb_time.sec && !wpa_s->dpp_pb_time.usec)
return;
os_free(wpa_s->dpp_pb_freqs);
wpa_s->dpp_pb_freqs = wpas_dpp_presence_ann_channels(wpa_s, NULL);
wpa_printf(MSG_DEBUG, "DPP: Scan completed for PB discovery");
if (!wpa_s->dpp_pb_freqs ||
eloop_register_timeout(0, 0, wpas_dpp_pb_next, wpa_s, NULL) < 0)
wpas_dpp_push_button_stop(wpa_s);
}
int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd) int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd)
{ {
int res; int res;
@ -5563,8 +5545,6 @@ int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd)
wpa_s->dpp_pb_configurator = false; wpa_s->dpp_pb_configurator = false;
if (wpas_dpp_pb_channels(wpa_s) < 0)
return -1;
wpa_s->dpp_pb_freq_idx = 0; wpa_s->dpp_pb_freq_idx = 0;
res = dpp_bootstrap_gen(wpa_s->dpp, "type=pkex"); res = dpp_bootstrap_gen(wpa_s->dpp, "type=pkex");
@ -5582,7 +5562,12 @@ int wpas_dpp_push_button(struct wpa_supplicant *wpa_s, const char *cmd)
if (!wpa_s->dpp_pb_announcement) if (!wpa_s->dpp_pb_announcement)
return -1; return -1;
return eloop_register_timeout(0, 0, wpas_dpp_pb_next, wpa_s, NULL); wpa_printf(MSG_DEBUG,
"DPP: Scan to create channel list for PB discovery");
wpa_s->scan_req = MANUAL_SCAN_REQ;
wpa_s->scan_res_handler = wpas_dpp_pb_scan_res_handler;
wpa_supplicant_req_scan(wpa_s, 0, 0);
return 0;
} }
@ -5630,6 +5615,11 @@ void wpas_dpp_push_button_stop(struct wpa_supplicant *wpa_s)
str_clear_free(wpa_s->dpp_pb_cmd); str_clear_free(wpa_s->dpp_pb_cmd);
wpa_s->dpp_pb_cmd = NULL; wpa_s->dpp_pb_cmd = NULL;
if (wpa_s->scan_res_handler == wpas_dpp_pb_scan_res_handler) {
wpas_abort_ongoing_scan(wpa_s);
wpa_s->scan_res_handler = NULL;
}
} }
#endif /* CONFIG_DPP3 */ #endif /* CONFIG_DPP3 */