]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hostapd: Add HE 6 GHz band capability configuration
authorRajkumar Manoharan <rmanohar@codeaurora.org>
Sat, 3 Oct 2020 06:34:16 +0000 (23:34 -0700)
committerJouni Malinen <j@w1.fi>
Sun, 7 Feb 2021 22:09:45 +0000 (00:09 +0200)
Enable user to configure Maximum MPDU Length, Maximum A-MPDU Length
Exponent, Rx Antenna Pattern Consistency, and Tx Antenna Pattern
Consistency of 6 GHz capability through config file.

Signed-off-by: Rajkumar Manoharan <rmanohar@codeaurora.org>
hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.c
src/ap/ap_config.h
src/ap/hostapd.c
src/ap/hw_features.c
src/ap/hw_features.h
src/ap/ieee802_11_he.c

index 093dc4f375f0c8be73ff18d0d66f3f1323a67ee5..fe8fcd728a3ec8b52b79c1a0992e275bdecbc0a3 100644 (file)
@@ -3557,6 +3557,14 @@ static int hostapd_config_fill(struct hostapd_config *conf,
                conf->he_oper_centr_freq_seg0_idx = atoi(pos);
        } else if (os_strcmp(buf, "he_oper_centr_freq_seg1_idx") == 0) {
                conf->he_oper_centr_freq_seg1_idx = atoi(pos);
+       } else if (os_strcmp(buf, "he_6ghz_max_mpdu") == 0) {
+               conf->he_6ghz_max_mpdu = atoi(pos);
+       } else if (os_strcmp(buf, "he_6ghz_max_ampdu_len_exp") == 0) {
+               conf->he_6ghz_max_ampdu_len_exp = atoi(pos);
+       } else if (os_strcmp(buf, "he_6ghz_rx_ant_pat") == 0) {
+               conf->he_6ghz_rx_ant_pat = atoi(pos);
+       } else if (os_strcmp(buf, "he_6ghz_tx_ant_pat") == 0) {
+               conf->he_6ghz_tx_ant_pat = atoi(pos);
 #endif /* CONFIG_IEEE80211AX */
        } else if (os_strcmp(buf, "max_listen_interval") == 0) {
                bss->max_listen_interval = atoi(pos);
index 6666153a75262c586a1bed90516c8e2f1e724965..c4482c13c72c2a144d1ba01968ffbe0d57e0f9d6 100644 (file)
@@ -880,6 +880,42 @@ wmm_ac_vo_acm=0
 #he_spr_srg_obss_pd_min_offset
 #he_spr_srg_obss_pd_max_offset
 
+#he_6ghz_max_mpdu: Maximum MPDU Length of HE 6 GHz band capabilities.
+# Indicates maximum MPDU length
+# 0 = 3895 octets
+# 1 = 7991 octets
+# 2 = 11454 octets (default)
+#he_6ghz_max_mpdu=2
+#
+#he_6ghz_max_ampdu_len_exp: Maximum A-MPDU Length Exponent of HE 6 GHz band
+# capabilities. Indicates the maximum length of A-MPDU pre-EOF padding that
+# the STA can receive. This field is an integer in the range of 0 to 7.
+# The length defined by this field is equal to
+# 2 pow(13 + Maximum A-MPDU Length Exponent) -1 octets
+# 0 = AMPDU length of 8k
+# 1 = AMPDU length of 16k
+# 2 = AMPDU length of 32k
+# 3 = AMPDU length of 65k
+# 4 = AMPDU length of 131k
+# 5 = AMPDU length of 262k
+# 6 = AMPDU length of 524k
+# 7 = AMPDU length of 1048k (default)
+#he_6ghz_max_ampdu_len_exp=7
+#
+#he_6ghz_rx_ant_pat: Rx Antenna Pattern Consistency of HE 6 GHz capability.
+# Indicates the possibility of Rx antenna pattern change
+# 0 = Rx antenna pattern might change during the lifetime of an association
+# 1 = Rx antenna pattern does not change during the lifetime of an association
+#     (default)
+#he_6ghz_rx_ant_pat=1
+#
+#he_6ghz_tx_ant_pat: Tx Antenna Pattern Consistency of HE 6 GHz capability.
+# Indicates the possibility of Tx antenna pattern change
+# 0 = Tx antenna pattern might change during the lifetime of an association
+# 1 = Tx antenna pattern does not change during the lifetime of an association
+#     (default)
+#he_6ghz_tx_ant_pat=1
+
 ##### IEEE 802.1X-2004 related configuration ##################################
 
 # Require IEEE 802.1X authorization
index 35c0fe577f6727bcd9a7fa927e038f9de53fa84d..8b98e67554514cb9c7ec7a6570d45e316d7327e5 100644 (file)
@@ -268,6 +268,10 @@ struct hostapd_config * hostapd_config_defaults(void)
        conf->he_op.he_bss_color_disabled = 1;
        conf->he_op.he_bss_color_partial = 0;
        conf->he_op.he_bss_color = 1;
+       conf->he_6ghz_max_mpdu = 2;
+       conf->he_6ghz_max_ampdu_len_exp = 7;
+       conf->he_6ghz_rx_ant_pat = 1;
+       conf->he_6ghz_tx_ant_pat = 1;
 #endif /* CONFIG_IEEE80211AX */
 
        /* The third octet of the country string uses an ASCII space character
index abe58532e256eb7df0fafca18c8bdde356704d4c..0d330075df705044ff2a7461586487de0c9c2efc 100644 (file)
@@ -1044,6 +1044,10 @@ struct hostapd_config {
        u8 he_oper_chwidth;
        u8 he_oper_centr_freq_seg0_idx;
        u8 he_oper_centr_freq_seg1_idx;
+       u8 he_6ghz_max_mpdu;
+       u8 he_6ghz_max_ampdu_len_exp;
+       u8 he_6ghz_rx_ant_pat;
+       u8 he_6ghz_tx_ant_pat;
 #endif /* CONFIG_IEEE80211AX */
 
        /* VHT enable/disable config from CHAN_SWITCH */
index 1b105227db2ab36a9b4786ce15e686abdf42aa35..e257174645ed4cc682bc6df25d043c70c1e87b4d 100644 (file)
@@ -1701,6 +1701,9 @@ static int setup_interface2(struct hostapd_iface *iface)
                        return 0;
                }
                ret = hostapd_check_edmg_capab(iface);
+               if (ret < 0)
+                       goto fail;
+               ret = hostapd_check_he_6ghz_capab(iface);
                if (ret < 0)
                        goto fail;
                ret = hostapd_check_ht_capab(iface);
index f6e69030d7670f5c9913f56b6868f99c5a844820..40b7b38c32431f7167f13a96df2b10b6fc6f7994 100644 (file)
@@ -732,6 +732,51 @@ int hostapd_check_edmg_capab(struct hostapd_iface *iface)
 }
 
 
+int hostapd_check_he_6ghz_capab(struct hostapd_iface *iface)
+{
+#ifdef CONFIG_IEEE80211AX
+       struct he_capabilities *he_cap;
+       u16 hw;
+
+       if (!iface->current_mode || !is_6ghz_freq(iface->freq))
+               return 0;
+
+       he_cap = &iface->current_mode->he_capab[IEEE80211_MODE_AP];
+       hw = he_cap->he_6ghz_capa;
+       if (iface->conf->he_6ghz_max_mpdu >
+           ((hw & HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_MASK) >>
+            HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_SHIFT)) {
+               wpa_printf(MSG_ERROR,
+                          "The driver does not support the configured HE 6 GHz Max MPDU length");
+               return -1;
+       }
+
+       if (iface->conf->he_6ghz_max_ampdu_len_exp >
+           ((hw & HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_MASK) >>
+            HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_SHIFT)) {
+               wpa_printf(MSG_ERROR,
+                          "The driver does not support the configured HE 6 GHz Max AMPDU Length Exponent");
+               return -1;
+       }
+
+       if (iface->conf->he_6ghz_rx_ant_pat &&
+           !(hw & HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS)) {
+               wpa_printf(MSG_ERROR,
+                          "The driver does not support the configured HE 6 GHz Rx Antenna Pattern");
+               return -1;
+       }
+
+       if (iface->conf->he_6ghz_tx_ant_pat &&
+           !(hw & HE_6GHZ_BAND_CAP_TX_ANTPAT_CONS)) {
+               wpa_printf(MSG_ERROR,
+                          "The driver does not support the configured HE 6 GHz Tx Antenna Pattern");
+               return -1;
+       }
+#endif /* CONFIG_IEEE80211AX */
+       return 0;
+}
+
+
 static int hostapd_is_usable_chan(struct hostapd_iface *iface,
                                  int frequency, int primary)
 {
index dd24f95b2ad82112c6ea5e51aba68fc02794ab61..ad0ddf7ff3864a0214452c4ffcd4b25a4ee9b02b 100644 (file)
@@ -22,6 +22,7 @@ int hostapd_hw_get_freq(struct hostapd_data *hapd, int chan);
 int hostapd_hw_get_channel(struct hostapd_data *hapd, int freq);
 int hostapd_check_ht_capab(struct hostapd_iface *iface);
 int hostapd_check_edmg_capab(struct hostapd_iface *iface);
+int hostapd_check_he_6ghz_capab(struct hostapd_iface *iface);
 int hostapd_prepare_rates(struct hostapd_iface *iface,
                          struct hostapd_hw_modes *mode);
 void hostapd_stop_setup_timers(struct hostapd_iface *iface);
@@ -85,6 +86,11 @@ static inline int hostapd_hw_skip_mode(struct hostapd_iface *iface,
        return 0;
 }
 
+static inline int hostapd_check_he_6ghz_capab(struct hostapd_iface *iface)
+{
+       return 0;
+}
+
 #endif /* NEED_AP_MLME */
 
 #endif /* HW_FEATURES_H */
index dad68ac431138f102bd69283bbc1a7e22dbf0e51..93f35855daf73ab1729b4c8600c4a5bc2cff4633 100644 (file)
@@ -313,6 +313,7 @@ u8 * hostapd_eid_spatial_reuse(struct hostapd_data *hapd, u8 *eid)
 
 u8 * hostapd_eid_he_6ghz_band_cap(struct hostapd_data *hapd, u8 *eid)
 {
+       struct hostapd_config *conf = hapd->iface->conf;
        struct hostapd_hw_modes *mode = hapd->iface->current_mode;
        struct he_capabilities *he_cap;
        struct ieee80211_he_6ghz_band_cap *cap;
@@ -324,8 +325,18 @@ u8 * hostapd_eid_he_6ghz_band_cap(struct hostapd_data *hapd, u8 *eid)
                return eid;
 
        he_cap = &mode->he_capab[IEEE80211_MODE_AP];
-       capab = he_cap->he_6ghz_capa;
+       capab = he_cap->he_6ghz_capa & HE_6GHZ_BAND_CAP_MIN_MPDU_START;
+       capab |= (conf->he_6ghz_max_ampdu_len_exp <<
+                 HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_SHIFT) &
+               HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_MASK;
+       capab |= (conf->he_6ghz_max_mpdu <<
+                 HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_SHIFT) &
+               HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_MASK;
        capab |= HE_6GHZ_BAND_CAP_SMPS_DISABLED;
+       if (conf->he_6ghz_rx_ant_pat)
+               capab |= HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS;
+       if (conf->he_6ghz_tx_ant_pat)
+               capab |= HE_6GHZ_BAND_CAP_TX_ANTPAT_CONS;
 
        pos = eid;
        *pos++ = WLAN_EID_EXTENSION;