]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
ACS: Remove redundant ch_list parameters from do_acs interface
authorAnkita Bajaj <bankita@codeaurora.org>
Tue, 19 Nov 2019 13:11:34 +0000 (18:41 +0530)
committerJouni Malinen <j@w1.fi>
Thu, 5 Dec 2019 16:02:34 +0000 (18:02 +0200)
Clean up do_acs interface to not pass ch_list to drivers as the same
information is available in freq_list. The channel numbers are
duplicated between 2.4 GHz and 5 GHz bands and the 6 GHz band. So, use
the QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST to populate only 2.4 GHz and 5 GHz
channels to ensure backwards compatibility with old drivers which do not
have support to decode the newer QCA_WLAN_VENDOR_ATTR_ACS_FREQ_LIST
attribute.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
src/ap/ap_drv_ops.c
src/drivers/driver.h
src/drivers/driver_nl80211.c

index 204274f0daa3d6f095bd81cfa7156ef582a86079..dcc4fdc459fa229ffe8abc2dc838cfa195c185b4 100644 (file)
@@ -884,8 +884,6 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
 {
        struct drv_acs_params params;
        int ret, i, acs_ch_list_all = 0;
-       u8 *channels = NULL;
-       unsigned int num_channels = 0;
        struct hostapd_hw_modes *mode;
        int *freq_list = NULL;
 
@@ -904,10 +902,6 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
 
        mode = hapd->iface->current_mode;
        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 &&
@@ -919,7 +913,6 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
                            (chan->flag & HOSTAPD_CHAN_RADAR))
                                continue;
                        if (!(chan->flag & HOSTAPD_CHAN_DISABLED)) {
-                               channels[num_channels++] = chan->chan;
                                int_array_add_unique(&freq_list, chan->freq);
                        }
                }
@@ -932,8 +925,6 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
                }
        }
 
-       params.ch_list = channels;
-       params.ch_list_len = num_channels;
        params.freq_list = freq_list;
 
        params.ht_enabled = !!(hapd->iface->conf->ieee80211n);
@@ -959,7 +950,6 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
        }
 
        ret = hapd->driver->do_acs(hapd->drv_priv, &params);
-       os_free(channels);
 
        return ret;
 }
index ad68a076596a9cf8b6b8a7f35b197fc4c32cf13f..c6b7db8c29329e004fddba8f3228ac2bfaf50629 100644 (file)
@@ -2192,9 +2192,7 @@ struct drv_acs_params {
        /* Configured ACS channel width */
        u16 ch_width;
 
-       /* ACS channel list info */
-       unsigned int ch_list_len;
-       const u8 *ch_list;
+       /* ACS frequency list info */
        const int *freq_list;
 };
 
index 4c8dcad8dcaf13b8c2ca7e2a490a7216d917ede3..02b9527193c6ebd10fdeb75a0bf269df6f2de791 100644 (file)
@@ -10157,6 +10157,48 @@ static int hw_mode_to_qca_acs(enum hostapd_hw_mode hw_mode)
 }
 
 
+static int add_acs_ch_list(struct nl_msg *msg, const int *freq_list)
+{
+       int num_channels = 0, num_freqs;
+       u8 *ch_list;
+       enum hostapd_hw_mode hw_mode;
+       int ret = 0;
+       int i;
+
+       if (!freq_list)
+               return 0;
+
+       num_freqs = int_array_len(freq_list);
+       ch_list = os_malloc(sizeof(u8) * num_freqs);
+       if (!ch_list)
+               return -1;
+
+       for (i = 0; i < num_freqs; i++) {
+               const int freq = freq_list[i];
+
+               if (freq == 0)
+                       break;
+               /* Send 2.4 GHz and 5 GHz channels with
+                * QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST to maintain backwards
+                * compatibility.
+                */
+               if (!(freq >= 2412 && freq <= 2484) &&
+                   !(freq >= 5180 && freq <= 5900))
+                       continue;
+               hw_mode = ieee80211_freq_to_chan(freq, &ch_list[num_channels]);
+               if (hw_mode != NUM_HOSTAPD_MODES)
+                       num_channels++;
+       }
+
+       if (num_channels)
+               ret = nla_put(msg, QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST,
+                             num_channels, ch_list);
+
+       os_free(ch_list);
+       return ret;
+}
+
+
 static int add_acs_freq_list(struct nl_msg *msg, const int *freq_list)
 {
        int i, len, ret;
@@ -10204,9 +10246,7 @@ static int wpa_driver_do_acs(void *priv, struct drv_acs_params *params)
             nla_put_flag(msg, QCA_WLAN_VENDOR_ATTR_ACS_VHT_ENABLED)) ||
            nla_put_u16(msg, QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH,
                        params->ch_width) ||
-           (params->ch_list_len &&
-            nla_put(msg, QCA_WLAN_VENDOR_ATTR_ACS_CH_LIST, params->ch_list_len,
-                    params->ch_list)) ||
+           add_acs_ch_list(msg, params->freq_list) ||
            add_acs_freq_list(msg, params->freq_list)) {
                nlmsg_free(msg);
                return -ENOBUFS;
@@ -10214,9 +10254,9 @@ static int wpa_driver_do_acs(void *priv, struct drv_acs_params *params)
        nla_nest_end(msg, data);
 
        wpa_printf(MSG_DEBUG,
-                  "nl80211: ACS Params: HW_MODE: %d HT: %d HT40: %d VHT: %d BW: %d CH_LIST_LEN: %u",
+                  "nl80211: ACS Params: HW_MODE: %d HT: %d HT40: %d VHT: %d BW: %d",
                   params->hw_mode, params->ht_enabled, params->ht40_enabled,
-                  params->vht_enabled, params->ch_width, params->ch_list_len);
+                  params->vht_enabled, params->ch_width);
 
        ret = send_and_recv_msgs(drv, msg, NULL, NULL);
        if (ret) {