[PATCH v2 3/5] hostapd: Add HE 6 GHz band capability configuration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxx>
---
 hostapd/config_file.c  | 29 +++++++++++++++++++++++++++++
 hostapd/hostapd.conf   | 25 +++++++++++++++++++++++++
 src/ap/ap_config.h     |  1 +
 src/ap/hostapd.c       |  3 +++
 src/ap/hw_features.c   | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/ap/hw_features.h   |  6 ++++++
 src/ap/ieee802_11_he.c |  4 ++--
 7 files changed, 112 insertions(+), 2 deletions(-)

diff --git a/hostapd/config_file.c b/hostapd/config_file.c
index cc1855dcd6ef..87f01ecf6f9a 100644
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -1313,6 +1313,33 @@ static u8 set_he_cap(int val, u8 mask)
 	return (u8) (mask & (val << find_bit_offset(mask)));
 }
 
+static void hostapd_config_he_6ghz_capab(struct hostapd_config *conf,
+					 const char *capab)
+{
+	if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-1024K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_1024K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-512K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_512K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-256K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_256K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-128K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_128K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-64K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_64K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-32K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_32K;
+	else if (os_strstr(capab, "[MAX-AMPDU-LEN-EXP-16K]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_16K;
+	if (os_strstr(capab, "[MAX-MPDU-LEN-7991]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_7991;
+	if (os_strstr(capab, "[MAX-MPDU-LEN-11454]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_11454;
+	if (os_strstr(capab, "[RX-ANTENNA-PATTERN]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS;
+	if (os_strstr(capab, "[TX-ANTENNA-PATTERN]"))
+		conf->he_6ghz_capab |= HE_6GHZ_BAND_CAP_TX_ANTPAT_CONS;
+}
+
 #endif /* CONFIG_IEEE80211AX */
 
 
@@ -3606,6 +3633,8 @@ 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_capab") == 0) {
+		hostapd_config_he_6ghz_capab(conf, pos);
 #endif /* CONFIG_IEEE80211AX */
 	} else if (os_strcmp(buf, "max_listen_interval") == 0) {
 		bss->max_listen_interval = atoi(pos);
diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf
index 812c09a9f7e1..b96f885ef8cd 100644
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -867,6 +867,31 @@ wmm_ac_vo_acm=0
 #he_spr_srg_obss_pd_min_offset
 #he_spr_srg_obss_pd_max_offset
 
+# he_6ghz_capab: HE 6 GHz capabilities (list of flags)
+#
+# Maximum MPDU Length: [MAX-MPDU-LEN-7991] [MAX-MPDU-LEN-11454]
+# Indicates maximum MPDU length
+# 0 = 3895 octets (default)
+# 1 = 7991 octets
+# 2 = 11454 octets
+# 3 = reserved
+#
+# Maximum A-MPDU Length Exponent: [MAX-AMPDU-LEN-EXP-8K]..[MAX-AMPDU-LEN-EXP-1024K]
+# Indicates the maximum length of A-MPDU pre-EOF padding that the STA can recv
+# 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
+#
+# Rx Antenna Pattern Consistency: [RX-ANTENNA-PATTERN]
+# 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
+#
+# Tx Antenna Pattern Consistency: [TX-ANTENNA-PATTERN]
+# 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
+#
 ##### IEEE 802.1X-2004 related configuration ##################################
 
 # Require IEEE 802.1X authorization
diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h
index cffa636cc298..d59e971583f5 100644
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1027,6 +1027,7 @@ struct hostapd_config {
 	u8 he_oper_chwidth;
 	u8 he_oper_centr_freq_seg0_idx;
 	u8 he_oper_centr_freq_seg1_idx;
+	u16 he_6ghz_capab;
 #endif /* CONFIG_IEEE80211AX */
 
 	/* VHT enable/disable config from CHAN_SWITCH */
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index b37f49f9a8ec..2d8d56e15345 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -1701,6 +1701,9 @@ static int setup_interface2(struct hostapd_iface *iface)
 		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);
 		if (ret < 0)
 			goto fail;
diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c
index f6e69030d767..b891e38206c5 100644
--- a/src/ap/hw_features.c
+++ b/src/ap/hw_features.c
@@ -732,6 +732,52 @@ int hostapd_check_edmg_capab(struct hostapd_iface *iface)
 }
 
 
+int hostapd_check_he_6ghz_capab(struct hostapd_iface *iface)
+{
+	struct he_capabilities *he_cap;
+	u16 conf = iface->conf->he_6ghz_capab;
+	u16 hw;
+
+	if (!iface->current_mode)
+		return 0;
+
+	if (!is_6ghz_freq(iface->freq))
+		return 0;
+
+	he_cap = &iface->current_mode->he_capab[IEEE80211_MODE_AP];
+	hw = he_cap->he_6ghz_capa;
+	if ((conf & HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_MASK) >
+	    (hw & HE_6GHZ_BAND_CAP_MAX_MPDU_LEN_MASK)) {
+		wpa_printf(MSG_ERROR, "Driver does not support configured "
+			   "HE 6GHz capability [MAX_MPDU_LENGTH]");
+		return -1;
+	}
+
+	if ((conf & HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_MASK) >
+	    (hw & HE_6GHZ_BAND_CAP_MAX_AMPDU_LEN_EXP_MASK)) {
+		wpa_printf(MSG_ERROR, "Driver does not support configured "
+			   "HE 6 GHz capability [MAX_A_MPDU_LENGTH_EXPONENT]");
+		return -1;
+	}
+
+	if ((conf & HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS) &&
+	    !(hw & HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS)) {
+		wpa_printf(MSG_ERROR, "Driver does not support configured "
+			   "HE 6 GHz capability [RX_ANTENNA_PATTERN]");
+		return -1;
+	}
+
+	if ((conf & HE_6GHZ_BAND_CAP_TX_ANTPAT_CONS) &&
+	    !(hw & HE_6GHZ_BAND_CAP_RX_ANTPAT_CONS)) {
+		wpa_printf(MSG_ERROR, "Driver does not support configured "
+			   "HE 6 GHz capability [TX_ANTENNA_PATTERN]");
+		return -1;
+	}
+
+	return 0;
+}
+
+
 static int hostapd_is_usable_chan(struct hostapd_iface *iface,
 				  int frequency, int primary)
 {
diff --git a/src/ap/hw_features.h b/src/ap/hw_features.h
index dd24f95b2ad8..ad0ddf7ff386 100644
--- a/src/ap/hw_features.h
+++ b/src/ap/hw_features.h
@@ -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 */
diff --git a/src/ap/ieee802_11_he.c b/src/ap/ieee802_11_he.c
index efb8587f71c3..a7b8505929a6 100644
--- a/src/ap/ieee802_11_he.c
+++ b/src/ap/ieee802_11_he.c
@@ -316,7 +316,7 @@ u8 * hostapd_eid_he_6ghz_band_cap(struct hostapd_data *hapd, u8 *eid)
 	struct hostapd_hw_modes *mode = hapd->iface->current_mode;
 	struct he_capabilities *he_cap;
 	struct ieee80211_he_6ghz_band_cap *cap;
-	u16 capab;
+	u16 capab = hapd->iface->conf->he_6ghz_capab;
 	u8 *pos;
 
 	if (!mode || !is_6ghz_op_class(hapd->iconf->op_class))
@@ -326,7 +326,7 @@ 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 |= HE_6GHZ_BAND_CAP_SMPS_DISABLED;
 
 	pos = eid;
-- 
2.7.4


_______________________________________________
Hostap mailing list
Hostap@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/hostap



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux