]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
HE: Process HE 6 GHz band capab from associating HE STA
authorRajkumar Manoharan <rmanohar@codeaurora.org>
Fri, 24 Apr 2020 22:45:41 +0000 (15:45 -0700)
committerJouni Malinen <j@w1.fi>
Sun, 17 May 2020 14:22:34 +0000 (17:22 +0300)
Process HE 6 GHz band capabilities in (Re)Association Request frames and
pass the information to the driver.

Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
src/ap/ap_drv_ops.c
src/ap/ap_drv_ops.h
src/ap/ieee802_11.c
src/ap/ieee802_11.h
src/ap/ieee802_11_he.c
src/ap/sta_info.c
src/ap/sta_info.h
src/drivers/driver.h

index 904236baee347874164cac230b5e9b8936bed180..f1576594522bb219acfd3e10800b6f154d328238 100644 (file)
@@ -418,6 +418,7 @@ int hostapd_sta_add(struct hostapd_data *hapd,
                    const struct ieee80211_vht_capabilities *vht_capab,
                    const struct ieee80211_he_capabilities *he_capab,
                    size_t he_capab_len,
+                   const struct ieee80211_he_6ghz_band_cap *he_6ghz_capab,
                    u32 flags, u8 qosinfo, u8 vht_opmode, int supp_p2p_ps,
                    int set)
 {
@@ -439,6 +440,7 @@ int hostapd_sta_add(struct hostapd_data *hapd,
        params.vht_capabilities = vht_capab;
        params.he_capab = he_capab;
        params.he_capab_len = he_capab_len;
+       params.he_6ghz_capab = he_6ghz_capab;
        params.vht_opmode_enabled = !!(flags & WLAN_STA_VHT_OPMODE_ENABLED);
        params.vht_opmode = vht_opmode;
        params.flags = hostapd_sta_flags_to_drv(flags);
index 811d26a2ce50dac400d6ab13aac58fca757cab16..5738c1c97192f8a433a5717e52e12160ef190223 100644 (file)
@@ -43,6 +43,7 @@ int hostapd_sta_add(struct hostapd_data *hapd,
                    const struct ieee80211_vht_capabilities *vht_capab,
                    const struct ieee80211_he_capabilities *he_capab,
                    size_t he_capab_len,
+                   const struct ieee80211_he_6ghz_band_cap *he_6ghz_capab,
                    u32 flags, u8 qosinfo, u8 vht_opmode, int supp_p2p_ps,
                    int set);
 int hostapd_set_privacy(struct hostapd_data *hapd, int enabled);
index 3a7c9a2b91968c55e6e791b2ca140c59e7a52a84..f1f37027b110c08462ad9fe14f2c734f78031d40 100644 (file)
@@ -3181,6 +3181,12 @@ static int check_assoc_ies(struct hostapd_data *hapd, struct sta_info *sta,
                                         elems.he_capabilities_len);
                if (resp != WLAN_STATUS_SUCCESS)
                        return resp;
+               if (is_6ghz_op_class(hapd->iconf->op_class)) {
+                       resp = copy_sta_he_6ghz_capab(hapd, sta,
+                                                     elems.he_6ghz_band_cap);
+                       if (resp != WLAN_STATUS_SUCCESS)
+                               return resp;
+               }
        }
 #endif /* CONFIG_IEEE80211AX */
 
@@ -3627,6 +3633,7 @@ static int add_associated_sta(struct hostapd_data *hapd,
                            sta->flags & WLAN_STA_VHT ? &vht_cap : NULL,
                            sta->flags & WLAN_STA_HE ? &he_cap : NULL,
                            sta->flags & WLAN_STA_HE ? sta->he_capab_len : 0,
+                           sta->he_6ghz_capab,
                            sta->flags | WLAN_STA_ASSOC, sta->qosinfo,
                            sta->vht_opmode, sta->p2p_ie ? 1 : 0,
                            set)) {
index ba505628982d9842b857c4adc91507f50ce6dd6a..ea8c60846936a7ebaffcea54db660457f7ec69a8 100644 (file)
@@ -96,6 +96,8 @@ u16 set_sta_vht_opmode(struct hostapd_data *hapd, struct sta_info *sta,
 u16 copy_sta_he_capab(struct hostapd_data *hapd, struct sta_info *sta,
                      enum ieee80211_op_mode opmode, const u8 *he_capab,
                      size_t he_capab_len);
+u16 copy_sta_he_6ghz_capab(struct hostapd_data *hapd, struct sta_info *sta,
+                          const u8 *he_6ghz_capab);
 int hostapd_get_he_twt_responder(struct hostapd_data *hapd,
                                 enum ieee80211_op_mode mode);
 void hostapd_tx_status(struct hostapd_data *hapd, const u8 *addr,
index 3267a9d672d52c2b481eab04d232061980b93c15..f1f2442fc9647bbbea4e20d7d73b0fdfd64572bb 100644 (file)
@@ -463,6 +463,32 @@ u16 copy_sta_he_capab(struct hostapd_data *hapd, struct sta_info *sta,
 }
 
 
+u16 copy_sta_he_6ghz_capab(struct hostapd_data *hapd, struct sta_info *sta,
+                          const u8 *he_6ghz_capab)
+{
+       if (!he_6ghz_capab || !hapd->iconf->ieee80211ax ||
+           !is_6ghz_op_class(hapd->iconf->op_class)) {
+               sta->flags &= ~WLAN_STA_6GHZ;
+               os_free(sta->he_6ghz_capab);
+               sta->he_6ghz_capab = NULL;
+               return WLAN_STATUS_SUCCESS;
+       }
+
+       if (!sta->he_6ghz_capab) {
+               sta->he_6ghz_capab =
+                       os_zalloc(sizeof(struct ieee80211_he_6ghz_band_cap));
+               if (!sta->he_6ghz_capab)
+                       return WLAN_STATUS_UNSPECIFIED_FAILURE;
+       }
+
+       sta->flags |= WLAN_STA_6GHZ;
+       os_memcpy(sta->he_6ghz_capab, he_6ghz_capab,
+                 sizeof(struct ieee80211_he_6ghz_band_cap));
+
+       return WLAN_STATUS_SUCCESS;
+}
+
+
 int hostapd_get_he_twt_responder(struct hostapd_data *hapd,
                                 enum ieee80211_op_mode mode)
 {
index 93f1f0c201e14d31f0c69de5c133ff8d09359b17..67b5e9885bf17d7d92fc9c58e09f11484efe9fce 100644 (file)
@@ -326,6 +326,7 @@ void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
        os_free(sta->vht_capabilities);
        os_free(sta->vht_operation);
        os_free(sta->he_capab);
+       os_free(sta->he_6ghz_capab);
        hostapd_free_psk_list(sta->psk);
        os_free(sta->identity);
        os_free(sta->radius_cui);
@@ -1424,7 +1425,8 @@ int ap_sta_flags_txt(u32 flags, char *buf, size_t buflen)
        int res;
 
        buf[0] = '\0';
-       res = os_snprintf(buf, buflen, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+       res = os_snprintf(buf, buflen,
+                         "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
                          (flags & WLAN_STA_AUTH ? "[AUTH]" : ""),
                          (flags & WLAN_STA_ASSOC ? "[ASSOC]" : ""),
                          (flags & WLAN_STA_AUTHORIZED ? "[AUTHORIZED]" : ""),
@@ -1444,6 +1446,7 @@ int ap_sta_flags_txt(u32 flags, char *buf, size_t buflen)
                          (flags & WLAN_STA_HT ? "[HT]" : ""),
                          (flags & WLAN_STA_VHT ? "[VHT]" : ""),
                          (flags & WLAN_STA_HE ? "[HE]" : ""),
+                         (flags & WLAN_STA_6GHZ ? "[6GHZ]" : ""),
                          (flags & WLAN_STA_VENDOR_VHT ? "[VENDOR_VHT]" : ""),
                          (flags & WLAN_STA_WNM_SLEEP_MODE ?
                           "[WNM_SLEEP_MODE]" : ""));
@@ -1515,7 +1518,7 @@ int ap_sta_re_add(struct hostapd_data *hapd, struct sta_info *sta)
        if (hostapd_sta_add(hapd, sta->addr, 0, 0,
                            sta->supported_rates,
                            sta->supported_rates_len,
-                           0, NULL, NULL, NULL, 0,
+                           0, NULL, NULL, NULL, 0, NULL,
                            sta->flags, 0, 0, 0, 0)) {
                hostapd_logger(hapd, sta->addr,
                               HOSTAPD_MODULE_IEEE80211,
index 308aa29d992cc1d9e2a672ec5251ca7670d9ee46..940d3159082f04d41587609e988f996aa2384618 100644 (file)
@@ -38,6 +38,7 @@
 #define WLAN_STA_PENDING_FILS_ERP BIT(22)
 #define WLAN_STA_MULTI_AP BIT(23)
 #define WLAN_STA_HE BIT(24)
+#define WLAN_STA_6GHZ BIT(25)
 #define WLAN_STA_PENDING_DISASSOC_CB BIT(29)
 #define WLAN_STA_PENDING_DEAUTH_CB BIT(30)
 #define WLAN_STA_NONERP BIT(31)
@@ -170,6 +171,7 @@ struct sta_info {
        u8 vht_opmode;
        struct ieee80211_he_capabilities *he_capab;
        size_t he_capab_len;
+       struct ieee80211_he_6ghz_band_cap *he_6ghz_capab;
 
        int sa_query_count; /* number of pending SA Query requests;
                             * 0 = no SA Query in progress */
index 782725efb672fd48e5ed3234e6d0b1c451fb532b..1e2e332a643aa1a1a665d62f51ddbaca40229ce4 100644 (file)
@@ -2087,6 +2087,7 @@ struct hostapd_sta_add_params {
        u8 vht_opmode;
        const struct ieee80211_he_capabilities *he_capab;
        size_t he_capab_len;
+       const struct ieee80211_he_6ghz_band_cap *he_6ghz_capab;
        u32 flags; /* bitmask of WPA_STA_* flags */
        u32 flags_mask; /* unset bits in flags */
 #ifdef CONFIG_MESH