supplicant: Take disable_ht, disable_vht into account for oper-ie

Message ID 1535142464-7922-1-git-send-email-greearb@candelatech.com
State New
Headers show
Series
  • supplicant: Take disable_ht, disable_vht into account for oper-ie
Related show

Commit Message

Ben Greear Aug. 24, 2018, 8:27 p.m.
From: Ben Greear <greearb@candelatech.com>

If user has disabled HT or VHT, then those related operating classes
should not be advertised.

Signed-off-by: Ben Greear <greearb@candelatech.com>
---

NOTE:  This patch is on top of the two previous ones I sent.

 wpa_supplicant/op_classes.c       | 40 ++++++++++++++++++++++++++++++++++++---
 wpa_supplicant/sme.c              |  2 +-
 wpa_supplicant/wpa_supplicant.c   |  2 +-
 wpa_supplicant/wpa_supplicant_i.h |  4 ++--
 4 files changed, 41 insertions(+), 7 deletions(-)

Patch

diff --git a/wpa_supplicant/op_classes.c b/wpa_supplicant/op_classes.c
index d886134..9c756b2 100644
--- a/wpa_supplicant/op_classes.c
+++ b/wpa_supplicant/op_classes.c
@@ -209,6 +209,7 @@  enum chan_allowed verify_channel(struct hostapd_hw_modes *mode, u8 channel,
 
 
 static int wpas_op_class_supported(struct wpa_supplicant *wpa_s,
+				   struct wpa_ssid *ssid,
 				   const struct oper_class_map *op_class)
 {
 	int chan;
@@ -250,6 +251,39 @@  static int wpas_op_class_supported(struct wpa_supplicant *wpa_s,
 		return 0;
 	}
 
+#ifdef CONFIG_HT_OVERRIDES
+	if (ssid->disable_ht) {
+		switch (op_class->op_class) {
+		case 83:
+		case 84:
+		case 104:
+		case 105:
+		case 116:
+		case 117:
+		case 119:
+		case 120:
+		case 122:
+		case 123:
+		case 126:
+		case 127:
+		case 128:
+		case 129:
+		case 130:
+			/* Disable 40Mhz modes if ht is disabled */
+			return 0;
+		}
+	}
+#endif
+
+#ifdef CONFIG_VHT_OVERRIDES
+	if (ssid->disable_vht) {
+		if (op_class->op_class >= 128 && op_class->op_class <= 130) {
+			/* Disable 80Mhz modes */
+			return 0;
+		}
+	}
+#endif
+
 	if (op_class->op_class == 128) {
 		u8 channels[] = { 42, 58, 106, 122, 138, 155 };
 
@@ -304,8 +338,8 @@  static int wpas_op_class_supported(struct wpa_supplicant *wpa_s,
 }
 
 
-size_t wpas_supp_op_class_ie(struct wpa_supplicant *wpa_s, int freq, u8 *pos,
-			      size_t len)
+size_t wpas_supp_op_class_ie(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
+			     int freq, u8 *pos, size_t len)
 {
 	struct wpabuf *buf;
 	u8 op, current, chan;
@@ -335,7 +369,7 @@  size_t wpas_supp_op_class_ie(struct wpa_supplicant *wpa_s, int freq, u8 *pos,
 	wpabuf_put_u8(buf, current);
 
 	for (op = 0; global_op_class[op].op_class; op++) {
-		if (wpas_op_class_supported(wpa_s, &global_op_class[op]))
+		if (wpas_op_class_supported(wpa_s, ssid, &global_op_class[op]))
 			wpabuf_put_u8(buf, global_op_class[op].op_class);
 	}
 
diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c
index 16dd61f..c8ff88b 100644
--- a/wpa_supplicant/sme.c
+++ b/wpa_supplicant/sme.c
@@ -475,7 +475,7 @@  static void sme_send_authentication(struct wpa_supplicant *wpa_s,
 
 	if (!wpa_s->conf->no_oper_classes_ie) {
 		wpa_s->sme.assoc_req_ie_len += wpas_supp_op_class_ie(
-			wpa_s, bss->freq,
+			wpa_s, ssid, bss->freq,
 			wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len,
 			sizeof(wpa_s->sme.assoc_req_ie) - wpa_s->sme.assoc_req_ie_len);
 	}
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 533cdd7..ec36cd8 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2656,7 +2656,7 @@  static u8 * wpas_populate_assoc_ies(
 #endif /* CONFIG_P2P */
 
 	if (bss && !(wpa_s->conf->no_oper_classes_ie)) {
-		wpa_ie_len += wpas_supp_op_class_ie(wpa_s, bss->freq,
+		wpa_ie_len += wpas_supp_op_class_ie(wpa_s, ssid, bss->freq,
 						    wpa_ie + wpa_ie_len,
 						    max_wpa_ie_len -
 						    wpa_ie_len);
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 2b8f188..eaa063d 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -1414,8 +1414,8 @@  enum chan_allowed {
 
 enum chan_allowed verify_channel(struct hostapd_hw_modes *mode, u8 channel,
 				 u8 bw);
-size_t wpas_supp_op_class_ie(struct wpa_supplicant *wpa_s, int freq, u8 *pos,
-			      size_t len);
+size_t wpas_supp_op_class_ie(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
+			     int freq, u8 *pos, size_t len);
 
 /**
  * wpa_supplicant_ctrl_iface_ctrl_rsp_handle - Handle a control response