[PATCH 1/2] wpa_supplicant: Enable HT40 automatically when setting up AP mode operation

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

 



This patch aims to automatically enable 40MHz channel width based on
driver capabilities when setting up an AP mode operation. It can also be
prevented that using the disable_ht40 network parameter.

---
 wpa_supplicant/ap.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 75 insertions(+), 8 deletions(-)

diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c
index 7710a8d..2826c28 100644
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -96,6 +96,52 @@ no_vht:
 }
 #endif /* CONFIG_IEEE80211N */
 
+#ifdef CONFIG_IEEE80211N
+static int wpas_conf_ap_mode_ht_chwidth(struct hostapd_hw_modes *mode, u8 channel)
+{
+	int j, secondary_channel = 0;
+	struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
+	int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
+			   184, 192 };
+
+	/*
+	 * Only HT40+ is supported.
+	 * TODO: Select HT40+ or HT40- based on Beacons detection.
+	 */
+
+	for (j = 0; j < mode->num_channels; j++) {
+		pri_chan = &mode->channels[j];
+		if (pri_chan->chan == channel)
+			break;
+		pri_chan = NULL;
+	}
+	if (!pri_chan || (pri_chan->flag & (HOSTAPD_CHAN_DISABLED |
+								HOSTAPD_CHAN_RADAR | HOSTAPD_CHAN_NO_IR)) ||
+					!(pri_chan->flag & HOSTAPD_CHAN_HT40PLUS))
+		return 0;
+
+	for (j = 0; j < ARRAY_SIZE(ht40plus); j++) {
+		if (ht40plus[j] == channel) {
+			secondary_channel = 1;
+			break;
+		}
+	}
+	if (!secondary_channel)
+		return 0;
+
+	for (j = 0; j < mode->num_channels; j++) {
+		sec_chan = &mode->channels[j];
+		if (sec_chan->chan == channel + 4)
+			break;
+		sec_chan = NULL;
+	}
+	if (!sec_chan || (sec_chan->flag & (HOSTAPD_CHAN_DISABLED |
+								HOSTAPD_CHAN_RADAR | HOSTAPD_CHAN_NO_IR)))
+		return 0;
+
+	return secondary_channel;
+}
+#endif /* CONFIG_IEEE80211N */
 
 int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
 			      struct wpa_ssid *ssid,
@@ -110,7 +156,7 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
 		return -1;
 	}
 
-	/* TODO: enable HT40 if driver supports it;
+	/* TODO: enable HT40 if driver supports it for non-AP use cases;
 	 * drop to 11b if driver does not support 11g */
 
 #ifdef CONFIG_IEEE80211N
@@ -140,18 +186,39 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
 
 		if (!no_ht && mode && mode->ht_capab) {
 			conf->ieee80211n = 1;
-#ifdef CONFIG_P2P
+
 			if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A &&
 			    (mode->ht_capab &
-			     HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET) &&
-			    ssid->ht40)
-				conf->secondary_channel =
-					wpas_p2p_get_ht40_mode(wpa_s, mode,
-							       conf->channel);
+			     HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET)) {
+
+				/* Enable HT40 when AP mode operation if the driver
+				 * supports it unless it was specifically prevented.*/
+				if (ssid->mode == WPAS_MODE_AP) {
+					ssid->ht40 = 1;
+#ifdef CONFIG_HT_OVERRIDES
+					if (ssid->disable_ht40)
+						ssid->ht40 = 0;
+#endif /* CONFIG_HT_OVERRIDES */
+				}
+
+				if (ssid->ht40) {
+					if (ssid->mode == WPAS_MODE_AP) {
+						conf->secondary_channel =
+								wpas_conf_ap_mode_ht_chwidth(mode,
+										conf->channel);
+					} else {
+#ifdef CONFIG_P2P
+						conf->secondary_channel =
+								wpas_p2p_get_ht40_mode(wpa_s, mode,
+										conf->channel);
+#endif /* CONFIG_P2P */
+					}
+				}
+			}
+
 			if (conf->secondary_channel)
 				conf->ht_capab |=
 					HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
-#endif /* CONFIG_P2P */
 
 			/*
 			 * white-list capabilities that won't cause issues
-- 
1.9.1


_______________________________________________
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