]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hw_features: Move VHT capabilities checks to common
authorMasashi Honma <masashi.honma@gmail.com>
Tue, 14 Feb 2017 05:13:42 +0000 (14:13 +0900)
committerJouni Malinen <j@w1.fi>
Sun, 19 Feb 2017 13:53:05 +0000 (15:53 +0200)
This allows the previous AP-specific functions to be use for IBSS/mesh
setup in wpa_supplicant.

Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
src/ap/hw_features.c
src/common/hw_features_common.c
src/common/hw_features_common.h

index 0e0878bee2cbf3130288de3371088224b05f47fb..2d6cef1afda337c0b635ba7eaf0218ed2fa5edaf 100644 (file)
@@ -623,41 +623,6 @@ static int ieee80211n_supported_ht_capab(struct hostapd_iface *iface)
 
 
 #ifdef CONFIG_IEEE80211AC
-
-static int ieee80211ac_cap_check(u32 hw, u32 conf, u32 cap, const char *name)
-{
-       u32 req_cap = conf & cap;
-
-       /*
-        * Make sure we support all requested capabilities.
-        * NOTE: We assume that 'cap' represents a capability mask,
-        * not a discrete value.
-        */
-       if ((hw & req_cap) != req_cap) {
-               wpa_printf(MSG_ERROR, "Driver does not support configured VHT capability [%s]",
-                          name);
-               return 0;
-       }
-       return 1;
-}
-
-
-static int ieee80211ac_cap_check_max(u32 hw, u32 conf, u32 mask,
-                                    unsigned int shift,
-                                    const char *name)
-{
-       u32 hw_max = hw & mask;
-       u32 conf_val = conf & mask;
-
-       if (conf_val > hw_max) {
-               wpa_printf(MSG_ERROR, "Configured VHT capability [%s] exceeds max value supported by the driver (%d > %d)",
-                          name, conf_val >> shift, hw_max >> shift);
-               return 0;
-       }
-       return 1;
-}
-
-
 static int ieee80211ac_supported_vht_capab(struct hostapd_iface *iface)
 {
        struct hostapd_hw_modes *mode = iface->current_mode;
@@ -685,45 +650,7 @@ static int ieee80211ac_supported_vht_capab(struct hostapd_iface *iface)
                }
        }
 
-#define VHT_CAP_CHECK(cap) \
-       do { \
-               if (!ieee80211ac_cap_check(hw, conf, cap, #cap)) \
-                       return 0; \
-       } while (0)
-
-#define VHT_CAP_CHECK_MAX(cap) \
-       do { \
-               if (!ieee80211ac_cap_check_max(hw, conf, cap, cap ## _SHIFT, \
-                                              #cap)) \
-                       return 0; \
-       } while (0)
-
-       VHT_CAP_CHECK_MAX(VHT_CAP_MAX_MPDU_LENGTH_MASK);
-       VHT_CAP_CHECK(VHT_CAP_SUPP_CHAN_WIDTH_160MHZ);
-       VHT_CAP_CHECK(VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ);
-       VHT_CAP_CHECK(VHT_CAP_RXLDPC);
-       VHT_CAP_CHECK(VHT_CAP_SHORT_GI_80);
-       VHT_CAP_CHECK(VHT_CAP_SHORT_GI_160);
-       VHT_CAP_CHECK(VHT_CAP_TXSTBC);
-       VHT_CAP_CHECK_MAX(VHT_CAP_RXSTBC_MASK);
-       VHT_CAP_CHECK(VHT_CAP_SU_BEAMFORMER_CAPABLE);
-       VHT_CAP_CHECK(VHT_CAP_SU_BEAMFORMEE_CAPABLE);
-       VHT_CAP_CHECK_MAX(VHT_CAP_BEAMFORMEE_STS_MAX);
-       VHT_CAP_CHECK_MAX(VHT_CAP_SOUNDING_DIMENSION_MAX);
-       VHT_CAP_CHECK(VHT_CAP_MU_BEAMFORMER_CAPABLE);
-       VHT_CAP_CHECK(VHT_CAP_MU_BEAMFORMEE_CAPABLE);
-       VHT_CAP_CHECK(VHT_CAP_VHT_TXOP_PS);
-       VHT_CAP_CHECK(VHT_CAP_HTC_VHT);
-       VHT_CAP_CHECK_MAX(VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX);
-       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB);
-       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB);
-       VHT_CAP_CHECK(VHT_CAP_RX_ANTENNA_PATTERN);
-       VHT_CAP_CHECK(VHT_CAP_TX_ANTENNA_PATTERN);
-
-#undef VHT_CAP_CHECK
-#undef VHT_CAP_CHECK_MAX
-
-       return 1;
+       return ieee80211ac_cap_check(hw, conf);
 }
 #endif /* CONFIG_IEEE80211AC */
 
index 77aadf34e7fb0c559c8081d8e5fd6c20ea828c60..7a96f96da2e53a1134f03a3a86b41f56dfb0ffac 100644 (file)
@@ -469,3 +469,88 @@ void set_disable_ht40(struct ieee80211_ht_capabilities *htcaps,
        else
                htcaps->ht_capabilities_info |= msk;
 }
+
+
+#ifdef CONFIG_IEEE80211AC
+
+static int _ieee80211ac_cap_check(u32 hw, u32 conf, u32 cap,
+                                 const char *name)
+{
+       u32 req_cap = conf & cap;
+
+       /*
+        * Make sure we support all requested capabilities.
+        * NOTE: We assume that 'cap' represents a capability mask,
+        * not a discrete value.
+        */
+       if ((hw & req_cap) != req_cap) {
+               wpa_printf(MSG_ERROR,
+                          "Driver does not support configured VHT capability [%s]",
+                          name);
+               return 0;
+       }
+       return 1;
+}
+
+
+static int ieee80211ac_cap_check_max(u32 hw, u32 conf, u32 mask,
+                                    unsigned int shift,
+                                    const char *name)
+{
+       u32 hw_max = hw & mask;
+       u32 conf_val = conf & mask;
+
+       if (conf_val > hw_max) {
+               wpa_printf(MSG_ERROR,
+                          "Configured VHT capability [%s] exceeds max value supported by the driver (%d > %d)",
+                          name, conf_val >> shift, hw_max >> shift);
+               return 0;
+       }
+       return 1;
+}
+
+
+int ieee80211ac_cap_check(u32 hw, u32 conf)
+{
+#define VHT_CAP_CHECK(cap) \
+       do { \
+               if (!_ieee80211ac_cap_check(hw, conf, cap, #cap)) \
+                       return 0; \
+       } while (0)
+
+#define VHT_CAP_CHECK_MAX(cap) \
+       do { \
+               if (!ieee80211ac_cap_check_max(hw, conf, cap, cap ## _SHIFT, \
+                                              #cap)) \
+                       return 0; \
+       } while (0)
+
+       VHT_CAP_CHECK_MAX(VHT_CAP_MAX_MPDU_LENGTH_MASK);
+       VHT_CAP_CHECK(VHT_CAP_SUPP_CHAN_WIDTH_160MHZ);
+       VHT_CAP_CHECK(VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ);
+       VHT_CAP_CHECK(VHT_CAP_RXLDPC);
+       VHT_CAP_CHECK(VHT_CAP_SHORT_GI_80);
+       VHT_CAP_CHECK(VHT_CAP_SHORT_GI_160);
+       VHT_CAP_CHECK(VHT_CAP_TXSTBC);
+       VHT_CAP_CHECK_MAX(VHT_CAP_RXSTBC_MASK);
+       VHT_CAP_CHECK(VHT_CAP_SU_BEAMFORMER_CAPABLE);
+       VHT_CAP_CHECK(VHT_CAP_SU_BEAMFORMEE_CAPABLE);
+       VHT_CAP_CHECK_MAX(VHT_CAP_BEAMFORMEE_STS_MAX);
+       VHT_CAP_CHECK_MAX(VHT_CAP_SOUNDING_DIMENSION_MAX);
+       VHT_CAP_CHECK(VHT_CAP_MU_BEAMFORMER_CAPABLE);
+       VHT_CAP_CHECK(VHT_CAP_MU_BEAMFORMEE_CAPABLE);
+       VHT_CAP_CHECK(VHT_CAP_VHT_TXOP_PS);
+       VHT_CAP_CHECK(VHT_CAP_HTC_VHT);
+       VHT_CAP_CHECK_MAX(VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MAX);
+       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB);
+       VHT_CAP_CHECK(VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB);
+       VHT_CAP_CHECK(VHT_CAP_RX_ANTENNA_PATTERN);
+       VHT_CAP_CHECK(VHT_CAP_TX_ANTENNA_PATTERN);
+
+#undef VHT_CAP_CHECK
+#undef VHT_CAP_CHECK_MAX
+
+       return 1;
+}
+
+#endif /* CONFIG_IEEE80211AC */
index 234b7bf4d4ae569cd7c14b30206501bc17d2c7d2..9cddbd50e56a9a4b1ca7b49fb0b880e83ecc08b6 100644 (file)
@@ -37,5 +37,6 @@ int hostapd_set_freq_params(struct hostapd_freq_params *data,
                            int center_segment1, u32 vht_caps);
 void set_disable_ht40(struct ieee80211_ht_capabilities *htcaps,
                      int disabled);
+int ieee80211ac_cap_check(u32 hw, u32 conf);
 
 #endif /* HW_FEATURES_COMMON_H */