From 15d35687394b4ef464f810ee61bfd1c48dd35e86 Mon Sep 17 00:00:00 2001 From: Ankita Bajaj Date: Mon, 18 Nov 2019 11:36:51 +0530 Subject: [PATCH] ACS: Add channels from all modes matching with configured hw mode The 5 GHz channels are stored in one hw_features set with mode HOSTAPD_MODE_IEEE80211A while the 6 GHz channels will need to stored in a separate hw_features set (but with same mode HOSTAPD_MODE_IEEE80211A) due to possibility of different HE capabilities being available between the 5 GHz and 6 GHz bands. Iterate through all hw_features sets and populate channels from all hw_features sets whose hardware mode is matching the configured hardware mode while preparing the channel list for ACS. Signed-off-by: Jouni Malinen --- src/ap/ap_drv_ops.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 7e6bf4451..991e9ad62 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -886,6 +886,7 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd) int ret, i, acs_ch_list_all = 0; struct hostapd_hw_modes *mode; int *freq_list = NULL; + enum hostapd_hw_mode selected_mode; if (hapd->driver == NULL || hapd->driver->do_acs == NULL) return 0; @@ -900,29 +901,18 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd) if (!hapd->iface->conf->acs_ch_list.num) acs_ch_list_all = 1; - mode = hapd->iface->current_mode; - if (mode) { - for (i = 0; i < mode->num_channels; i++) { - struct hostapd_channel_data *chan = &mode->channels[i]; - if (!acs_ch_list_all && - !freq_range_list_includes( - &hapd->iface->conf->acs_ch_list, - chan->chan)) - continue; - if (hapd->iface->conf->acs_exclude_dfs && - (chan->flag & HOSTAPD_CHAN_RADAR)) - continue; - if (!(chan->flag & HOSTAPD_CHAN_DISABLED)) { - int_array_add_unique(&freq_list, chan->freq); - } - } - } else { - for (i = 0; i < hapd->iface->num_hw_features; i++) { - mode = &hapd->iface->hw_features[i]; - hostapd_get_hw_mode_any_channels(hapd, mode, - acs_ch_list_all, - &freq_list); - } + if (hapd->iface->current_mode) + selected_mode = hapd->iface->current_mode->mode; + else + selected_mode = HOSTAPD_MODE_IEEE80211ANY; + + for (i = 0; i < hapd->iface->num_hw_features; i++) { + mode = &hapd->iface->hw_features[i]; + if (selected_mode != HOSTAPD_MODE_IEEE80211ANY && + selected_mode != mode->mode) + continue; + hostapd_get_hw_mode_any_channels(hapd, mode, acs_ch_list_all, + &freq_list); } params.freq_list = freq_list;