diff options
| author | Peng Xu <pxu@qca.qualcomm.com> | 2015-06-20 00:19:27 +0000 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-04-01 16:42:45 +0530 |
| commit | 2785a2f7d88ff1e3aecb8b0651811c1682523fbd (patch) | |
| tree | 98f91f3eda2981920d21bfbfc8a43e1d244c5312 /src/ap | |
| parent | c810220c2a94a096c2cde603fb200de72c220df9 (diff) | |
| download | android_external_wpa_supplicant_8-2785a2f7d88ff1e3aecb8b0651811c1682523fbd.tar.gz android_external_wpa_supplicant_8-2785a2f7d88ff1e3aecb8b0651811c1682523fbd.tar.bz2 android_external_wpa_supplicant_8-2785a2f7d88ff1e3aecb8b0651811c1682523fbd.zip | |
Fix generating offloaded ACS channel list when hw_mode is set to any
When ACS is offloaded to device driver and the hw_mode parameter is set
to any, the current_mode structure is NULL which fails the ACS command.
Fix this by populating the ACS channel list with channels from all bands
when current_mode is NULL.
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Git-commit: d0cdccd30785b2471c632c341caef68ab1bc62db
Git-repo : git://w1.fi/srv/git/hostap.git
Change-Id: Ia8a5ef25184788f836daec2e009eb5bc64108e5d
CRs-fixed: 842468
Diffstat (limited to 'src/ap')
| -rw-r--r-- | src/ap/ap_drv_ops.c | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index e4176142..6cafcb74 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -743,6 +743,25 @@ int hostapd_drv_set_qos_map(struct hostapd_data *hapd, } +static void hostapd_get_hw_mode_any_channels(struct hostapd_data *hapd, + struct hostapd_hw_modes *mode, + int acs_ch_list_all, + int **freq_list) +{ + int i; + + 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)) && + !(chan->flag & HOSTAPD_CHAN_DISABLED)) + int_array_add_unique(freq_list, chan->freq); + } +} + + int hostapd_drv_do_acs(struct hostapd_data *hapd) { struct drv_acs_params params; @@ -750,6 +769,7 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd) u8 *channels = NULL; unsigned int num_channels = 0; struct hostapd_hw_modes *mode; + int *freq_list = NULL; if (hapd->driver == NULL || hapd->driver->do_acs == NULL) return 0; @@ -765,24 +785,35 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd) acs_ch_list_all = 1; mode = hapd->iface->current_mode; - if (mode == NULL) - return -1; - channels = os_malloc(mode->num_channels); - if (channels == NULL) - return -1; - - 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 (!(chan->flag & HOSTAPD_CHAN_DISABLED)) - channels[num_channels++] = chan->chan; + if (mode) { + channels = os_malloc(mode->num_channels); + if (channels == NULL) + return -1; + + 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 (!(chan->flag & HOSTAPD_CHAN_DISABLED)) { + channels[num_channels++] = chan->chan; + 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); + } } params.ch_list = channels; params.ch_list_len = num_channels; + params.freq_list = freq_list; params.ht_enabled = !!(hapd->iface->conf->ieee80211n); params.ht40_enabled = !!(hapd->iface->conf->ht_capab & |
