]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
HE: Add HE support to hostapd_set_freq_params()
authorJohn Crispin <john@phrozen.org>
Mon, 23 Mar 2020 13:13:15 +0000 (14:13 +0100)
committerJouni Malinen <j@w1.fi>
Mon, 23 Mar 2020 16:08:50 +0000 (18:08 +0200)
The parameters that need to be applied are symmetric to those of VHT,
however the validation code needs to be tweaked to check the HE
capabilities.

Signed-off-by: Shashidhar Lakkavalli <slakkavalli@datto.com>
Signed-off-by: John Crispin <john@phrozen.org>
src/common/hw_features_common.c

index 4f1c4935a4fa610940d50d752f369f0c72a41c12..f6c67a37503731c694ae7f610059309db263ce39 100644 (file)
@@ -475,13 +475,46 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,
                return 0;
        }
 
-       if (data->vht_enabled) switch (oper_chwidth) {
+       if (data->he_enabled) switch (oper_chwidth) {
        case CHANWIDTH_USE_HT:
-               if (center_segment1 ||
-                   (center_segment0 != 0 &&
-                    5000 + center_segment0 * 5 != data->center_freq1 &&
-                    2407 + center_segment0 * 5 != data->center_freq1))
+               if (mode == HOSTAPD_MODE_IEEE80211G && sec_channel_offset) {
+                       if (!(he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
+                             HE_PHYCAP_CHANNEL_WIDTH_SET_40MHZ_IN_2G)) {
+                               wpa_printf(MSG_ERROR,
+                                          "40 MHz channel width is not supported in 2.4 GHz");
+                               return -1;
+                       }
+                       break;
+               }
+               /* fall through */
+       case CHANWIDTH_80MHZ:
+               if (mode == HOSTAPD_MODE_IEEE80211A) {
+                       if (!(he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
+                             HE_PHYCAP_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)) {
+                               wpa_printf(MSG_ERROR,
+                                          "40/80 MHz channel width is not supported in 5/6 GHz");
+                               return -1;
+                       }
+               }
+               break;
+       case CHANWIDTH_80P80MHZ:
+               if (!(he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
+                     HE_PHYCAP_CHANNEL_WIDTH_SET_80PLUS80MHZ_IN_5G)) {
+                       wpa_printf(MSG_ERROR,
+                                  "80+80 MHz channel width is not supported in 5/6 GHz");
                        return -1;
+               }
+               break;
+       case CHANWIDTH_160MHZ:
+               if (!(he_cap->phy_cap[HE_PHYCAP_CHANNEL_WIDTH_SET_IDX] &
+                     HE_PHYCAP_CHANNEL_WIDTH_SET_160MHZ_IN_5G)) {
+                       wpa_printf(MSG_ERROR,
+                                  "160 MHz channel width is not supported in 5 / 6GHz");
+                       return -1;
+               }
+               break;
+       } else if (data->vht_enabled) switch (oper_chwidth) {
+       case CHANWIDTH_USE_HT:
                break;
        case CHANWIDTH_80P80MHZ:
                if (!(vht_caps & VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)) {
@@ -489,6 +522,28 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,
                                   "80+80 channel width is not supported!");
                        return -1;
                }
+               /* fall through */
+       case CHANWIDTH_80MHZ:
+               break;
+       case CHANWIDTH_160MHZ:
+               if (!(vht_caps & (VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
+                                 VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))) {
+                       wpa_printf(MSG_ERROR,
+                                  "160 MHz channel width is not supported!");
+                       return -1;
+               }
+               break;
+       }
+
+       if (data->he_enabled || data->vht_enabled) switch (oper_chwidth) {
+       case CHANWIDTH_USE_HT:
+               if (center_segment1 ||
+                   (center_segment0 != 0 &&
+                    5000 + center_segment0 * 5 != data->center_freq1 &&
+                    2407 + center_segment0 * 5 != data->center_freq1))
+                       return -1;
+               break;
+       case CHANWIDTH_80P80MHZ:
                if (center_segment1 == center_segment0 + 4 ||
                    center_segment1 == center_segment0 - 4)
                        return -1;
@@ -533,12 +588,6 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,
                break;
        case CHANWIDTH_160MHZ:
                data->bandwidth = 160;
-               if (!(vht_caps & (VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
-                                 VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))) {
-                       wpa_printf(MSG_ERROR,
-                                  "160MHZ channel width is not supported!");
-                       return -1;
-               }
                if (center_segment1)
                        return -1;
                if (!sec_channel_offset)