[source] hostapd: rework frequency/ht/vht selection for ibss/mesh

LEDE Commits lede-commits at lists.infradead.org
Wed Nov 15 09:49:22 PST 2017


nbd pushed a commit to source.git, branch master:
https://git.lede-project.org/d91494eedf06ac6b31c1aa9f7172871b16af96c8

commit d91494eedf06ac6b31c1aa9f7172871b16af96c8
Author: Felix Fietkau <nbd at nbd.name>
AuthorDate: Tue Nov 14 12:38:08 2017 +0100

    hostapd: rework frequency/ht/vht selection for ibss/mesh
    
    - Remove obsolete patch chunks regarding fixed_freq
    - Instead of patching in custom HT40+/- parameters, use the standard
    config syntax as much as possible.
    - Use fixed_freq for mesh
    - Fix issues with disabling obss scan when using fixed_freq on mesh
    
    Signed-off-by: Felix Fietkau <nbd at nbd.name>
---
 .../mac80211/files/lib/netifd/wireless/mac80211.sh |   4 +-
 package/network/services/hostapd/files/hostapd.sh  |  34 +++--
 .../hostapd/files/wpa_supplicant-full.config       |   4 +-
 .../hostapd/files/wpa_supplicant-mini.config       |   4 +-
 .../hostapd/files/wpa_supplicant-p2p.config        |   4 +-
 ...ant-add-new-config-params-to-be-used-with.patch |   6 +-
 .../patches/462-wpa_s-support-htmode-param.patch   | 156 ---------------------
 .../patches/463-add-mcast_rate-to-11s.patch        |   6 +-
 .../hostapd/patches/464-fix-mesh-obss-check.patch  |  19 +++
 9 files changed, 58 insertions(+), 179 deletions(-)

diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
index 703609b..cdc1554 100644
--- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
@@ -524,7 +524,7 @@ mac80211_setup_supplicant() {
 
 mac80211_setup_supplicant_noctl() {
 	wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1
-	wpa_supplicant_add_network "$ifname"
+	wpa_supplicant_add_network "$ifname" "$freq" "$htmode"
 	wpa_supplicant_run "$ifname"
 }
 
@@ -637,6 +637,7 @@ mac80211_setup_vif() {
 					authsae_start_interface || failed=1
 				else
 					wireless_vif_parse_encryption
+					freq="$(get_freq "$phy" "$channel")"
 					mac80211_setup_supplicant_noctl || failed=1
 				fi
 			else
@@ -694,6 +695,7 @@ mac80211_setup_vif() {
 			wireless_vif_parse_encryption
 			mac80211_setup_adhoc_htmode
 			if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then
+				freq="$(get_freq "$phy" "$channel")"
 				mac80211_setup_supplicant_noctl || failed=1
 			else
 				mac80211_setup_adhoc
diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh
index 6e95805..2400976 100644
--- a/package/network/services/hostapd/files/hostapd.sh
+++ b/package/network/services/hostapd/files/hostapd.sh
@@ -594,8 +594,31 @@ EOF
 	return 0
 }
 
+wpa_supplicant_set_fixed_freq() {
+	local freq="$1"
+	local htmode="$2"
+
+	append network_data "fixed_freq=1" "$N$T"
+	append network_data "frequency=$freq" "$N$T"
+	case "$htmode" in
+		NOHT) append network_data "disable_ht=1" "$N$T";;
+		HT20|VHT20) append network_data "disable_ht40=1" "$N$T";;
+		HT40*|VHT40*|VHT80*|VHT160*) append network_data "ht40=1" "$N$T";;
+	esac
+	case "$htmode" in
+		VHT*) append network_data "vht=1" "$N$T";;
+	esac
+	case "$htmode" in
+		VHT80) append network_data "max_oper_chwidth=1" "$N$T";;
+		VHT160) append network_data "max_oper_chwidth=2" "$N$T";;
+		*) append network_data "max_oper_chwidth=0" "$N$T";;
+	esac
+}
+
 wpa_supplicant_add_network() {
 	local ifname="$1"
+	local freq="$2"
+	local htmode="$3"
 
 	_wpa_supplicant_common "$1"
 	wireless_vif_parse_encryption
@@ -617,11 +640,7 @@ wpa_supplicant_add_network() {
 
 	[[ "$_w_mode" = "adhoc" ]] && {
 		append network_data "mode=1" "$N$T"
-		[ -n "$channel" ] && {
-			freq="$(get_freq "$phy" "$channel")"
-			append network_data "fixed_freq=1" "$N$T"
-			append network_data "frequency=$freq" "$N$T"
-		}
+		[ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
 
 		scan_ssid="scan_ssid=0"
 
@@ -633,10 +652,7 @@ wpa_supplicant_add_network() {
 		ssid="${mesh_id}"
 
 		append network_data "mode=5" "$N$T"
-		[ -n "$channel" ] && {
-			freq="$(get_freq "$phy" "$channel")"
-			append network_data "frequency=$freq" "$N$T"
-		}
+		[ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
 		append wpa_key_mgmt "SAE"
 		scan_ssid=""
 	}
diff --git a/package/network/services/hostapd/files/wpa_supplicant-full.config b/package/network/services/hostapd/files/wpa_supplicant-full.config
index 094741b..81fa8f5 100644
--- a/package/network/services/hostapd/files/wpa_supplicant-full.config
+++ b/package/network/services/hostapd/files/wpa_supplicant-full.config
@@ -179,10 +179,10 @@ CONFIG_SMARTCARD=y
 #CONFIG_PCSC=y
 
 # Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
-#CONFIG_HT_OVERRIDES=y
+CONFIG_HT_OVERRIDES=y
 
 # Support VHT overrides (disable VHT, mask MCS rates, etc.)
-#CONFIG_VHT_OVERRIDES=y
+CONFIG_VHT_OVERRIDES=y
 
 # Development testing
 #CONFIG_EAPOL_TEST=y
diff --git a/package/network/services/hostapd/files/wpa_supplicant-mini.config b/package/network/services/hostapd/files/wpa_supplicant-mini.config
index 3e9a661..3e08871 100644
--- a/package/network/services/hostapd/files/wpa_supplicant-mini.config
+++ b/package/network/services/hostapd/files/wpa_supplicant-mini.config
@@ -179,10 +179,10 @@ CONFIG_DRIVER_WIRED=y
 #CONFIG_PCSC=y
 
 # Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
-#CONFIG_HT_OVERRIDES=y
+CONFIG_HT_OVERRIDES=y
 
 # Support VHT overrides (disable VHT, mask MCS rates, etc.)
-#CONFIG_VHT_OVERRIDES=y
+CONFIG_VHT_OVERRIDES=y
 
 # Development testing
 #CONFIG_EAPOL_TEST=y
diff --git a/package/network/services/hostapd/files/wpa_supplicant-p2p.config b/package/network/services/hostapd/files/wpa_supplicant-p2p.config
index de60551..420aebc 100644
--- a/package/network/services/hostapd/files/wpa_supplicant-p2p.config
+++ b/package/network/services/hostapd/files/wpa_supplicant-p2p.config
@@ -179,10 +179,10 @@ CONFIG_SMARTCARD=y
 #CONFIG_PCSC=y
 
 # Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
-#CONFIG_HT_OVERRIDES=y
+CONFIG_HT_OVERRIDES=y
 
 # Support VHT overrides (disable VHT, mask MCS rates, etc.)
-#CONFIG_VHT_OVERRIDES=y
+CONFIG_VHT_OVERRIDES=y
 
 # Development testing
 #CONFIG_EAPOL_TEST=y
diff --git a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
index 8869852..213ee6d 100644
--- a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
+++ b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch
@@ -140,11 +140,10 @@ Signed-hostap: Antonio Quartulli <ordex at autistici.org>
  /* Helper macros for network block parser */
  
  #ifdef OFFSET
-@@ -2224,6 +2316,9 @@ static const struct parse_data ssid_fiel
+@@ -2224,6 +2316,8 @@ static const struct parse_data ssid_fiel
  	{ INT(ap_max_inactivity) },
  	{ INT(dtim_period) },
  	{ INT(beacon_int) },
-+	{ INT_RANGE(fixed_freq, 0, 1) },
 +	{ FUNC(rates) },
 +	{ FUNC(mcast_rate) },
  #ifdef CONFIG_MACSEC
@@ -175,11 +174,10 @@ Signed-hostap: Antonio Quartulli <ordex at autistici.org>
  	 * macsec_policy - Determines the policy for MACsec secure session
 --- a/wpa_supplicant/wpa_supplicant.c
 +++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2781,6 +2781,13 @@ static void wpas_start_assoc_cb(struct w
+@@ -2781,6 +2781,12 @@ static void wpas_start_assoc_cb(struct w
  			params.beacon_int = ssid->beacon_int;
  		else
  			params.beacon_int = wpa_s->conf->beacon_int;
-+		params.fixed_freq = ssid->fixed_freq;
 +		i = 0;
 +		while (i < WLAN_SUPP_RATES_MAX) {
 +			params.rates[i] = ssid->rates[i];
diff --git a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch b/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch
deleted file mode 100644
index d2e5eab..0000000
--- a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001
-From: Antonio Quartulli <ordex at autistici.org>
-Date: Tue, 3 Jul 2012 00:36:24 +0200
-Subject: [PATCH] wpa_s: support htmode param
-
-possible values are HT20, HT40-, HT40+ and NOHT
-
-Signed-off-by: Antonio Quartulli <ordex at autistici.org>
----
- src/drivers/driver.h            |    2 ++
- src/drivers/driver_nl80211.c    |   16 ++++++++++
- wpa_supplicant/config.c         |   66 +++++++++++++++++++++++++++++++++++++++
- wpa_supplicant/config_ssid.h    |    2 ++
- wpa_supplicant/wpa_supplicant.c |    2 ++
- 5 files changed, 88 insertions(+)
-
---- a/src/drivers/driver.h
-+++ b/src/drivers/driver.h
-@@ -765,6 +765,8 @@ struct wpa_driver_associate_params {
- 
- 	unsigned char rates[WLAN_SUPP_RATES_MAX];
- 	int mcast_rate;
-+	int ht_set;
-+	unsigned int htmode;
- 
- 	/**
- 	 * bssid_hint - BSSID of a proposed AP
---- a/src/drivers/driver_nl80211.c
-+++ b/src/drivers/driver_nl80211.c
-@@ -5070,6 +5070,22 @@ retry:
- 		nla_put_u32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
- 	}
- 
-+	if (params->ht_set) {
-+		switch(params->htmode) {
-+			case NL80211_CHAN_HT20:
-+				wpa_printf(MSG_DEBUG, "  * ht=HT20");
-+				break;
-+			case NL80211_CHAN_HT40PLUS:
-+				wpa_printf(MSG_DEBUG, "  * ht=HT40+");
-+				break;
-+			case NL80211_CHAN_HT40MINUS:
-+				wpa_printf(MSG_DEBUG, "  * ht=HT40-");
-+				break;
-+		}
-+		nla_put_u32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE,
-+			    params->htmode);
-+	}
-+
- 	ret = nl80211_set_conn_keys(params, msg);
- 	if (ret)
- 		goto fail;
---- a/wpa_supplicant/config.c
-+++ b/wpa_supplicant/config.c
-@@ -2017,6 +2017,71 @@ static char * wpa_config_write_mcast_rat
- }
- #endif /* NO_CONFIG_WRITE */
- 
-+static int wpa_config_parse_htmode(const struct parse_data *data,
-+				   struct wpa_ssid *ssid, int line,
-+				   const char *value)
-+{
-+	int i;
-+	static const struct {
-+		const char *name;
-+		unsigned int val;
-+	} htmap[] = {
-+		{ .name = "HT20", .val = NL80211_CHAN_HT20, },
-+		{ .name = "HT40+", .val = NL80211_CHAN_HT40PLUS, },
-+		{ .name = "HT40-", .val = NL80211_CHAN_HT40MINUS, },
-+		{ .name = "NOHT", .val = NL80211_CHAN_NO_HT, },
-+	};
-+	ssid->ht_set = 0;;
-+	for (i = 0; i < 4; i++) {
-+		if (strcasecmp(htmap[i].name, value) == 0) {
-+			ssid->htmode = htmap[i].val;
-+			ssid->ht_set = 1;
-+			break;
-+		}
-+	}
-+
-+	return 0;
-+}
-+
-+#ifndef NO_CONFIG_WRITE
-+static char * wpa_config_write_htmode(const struct parse_data *data,
-+				      struct wpa_ssid *ssid)
-+{
-+	char *value;
-+	int res;
-+
-+	value = os_malloc(6); /* longest: HT40+ */
-+	if (value == NULL)
-+		return NULL;
-+
-+	switch(ssid->htmode) {
-+		case NL80211_CHAN_HT20:
-+			res = os_snprintf(value, 4, "HT20");
-+			break;
-+		case NL80211_CHAN_HT40PLUS:
-+			res = os_snprintf(value, 5, "HT40+");
-+			break;
-+		case NL80211_CHAN_HT40MINUS:
-+			res = os_snprintf(value, 5, "HT40-");
-+			break;
-+		case NL80211_CHAN_NO_HT:
-+			res = os_snprintf(value, 4, "NOHT");
-+			break;
-+		default:
-+			os_free(value);
-+			return NULL;
-+	}
-+
-+	if (res < 0) {
-+		os_free(value);
-+		return NULL;
-+	}
-+
-+	return value;
-+}
-+#endif /* NO_CONFIG_WRITE */
-+
-+
- static int wpa_config_parse_rates(const struct parse_data *data,
- 				  struct wpa_ssid *ssid, int line,
- 				  const char *value)
-@@ -2319,6 +2384,7 @@ static const struct parse_data ssid_fiel
- 	{ INT_RANGE(fixed_freq, 0, 1) },
- 	{ FUNC(rates) },
- 	{ FUNC(mcast_rate) },
-+	{ FUNC(htmode) },
- #ifdef CONFIG_MACSEC
- 	{ INT_RANGE(macsec_policy, 0, 1) },
- 	{ INT_RANGE(macsec_integ_only, 0, 1) },
---- a/wpa_supplicant/config_ssid.h
-+++ b/wpa_supplicant/config_ssid.h
-@@ -739,6 +739,8 @@ struct wpa_ssid {
- 
- 	unsigned char rates[WLAN_SUPP_RATES_MAX];
- 	double mcast_rate;
-+	int ht_set;
-+	unsigned int htmode;
- 
- #ifdef CONFIG_MACSEC
- 	/**
---- a/wpa_supplicant/wpa_supplicant.c
-+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2788,6 +2788,8 @@ static void wpas_start_assoc_cb(struct w
- 			i++;
- 		}
- 		params.mcast_rate = ssid->mcast_rate;
-+		params.ht_set = ssid->ht_set;
-+		params.htmode = ssid->htmode;
- 	}
- 
- 	params.wpa_ie = wpa_ie;
diff --git a/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch b/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch
index da146ba..9b5ee4b 100644
--- a/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch
+++ b/package/network/services/hostapd/patches/463-add-mcast_rate-to-11s.patch
@@ -19,7 +19,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich at openmesh.com>
 
 --- a/src/drivers/driver.h
 +++ b/src/drivers/driver.h
-@@ -1426,6 +1426,7 @@ struct wpa_driver_mesh_join_params {
+@@ -1424,6 +1424,7 @@ struct wpa_driver_mesh_join_params {
  #define WPA_DRIVER_MESH_FLAG_SAE_AUTH	0x00000004
  #define WPA_DRIVER_MESH_FLAG_AMPE	0x00000008
  	unsigned int flags;
@@ -29,7 +29,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich at openmesh.com>
  /**
 --- a/src/drivers/driver_nl80211.c
 +++ b/src/drivers/driver_nl80211.c
-@@ -8997,6 +8997,18 @@ static int nl80211_put_mesh_id(struct nl
+@@ -8981,6 +8981,18 @@ static int nl80211_put_mesh_id(struct nl
  }
  
  
@@ -48,7 +48,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich at openmesh.com>
  static int nl80211_put_mesh_config(struct nl_msg *msg,
  				   struct wpa_driver_mesh_bss_params *params)
  {
-@@ -9055,6 +9067,7 @@ static int nl80211_join_mesh(struct i802
+@@ -9039,6 +9051,7 @@ static int nl80211_join_mesh(struct i802
  	    nl80211_put_basic_rates(msg, params->basic_rates) ||
  	    nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
  	    nl80211_put_beacon_int(msg, params->beacon_int) ||
diff --git a/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch b/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch
new file mode 100644
index 0000000..3833539
--- /dev/null
+++ b/package/network/services/hostapd/patches/464-fix-mesh-obss-check.patch
@@ -0,0 +1,19 @@
+--- a/wpa_supplicant/wpa_supplicant.c
++++ b/wpa_supplicant/wpa_supplicant.c
+@@ -2010,11 +2010,13 @@ void ibss_mesh_setup_freq(struct wpa_sup
+ 	for (j = 0; j < wpa_s->last_scan_res_used; j++) {
+ 		struct wpa_bss *bss = wpa_s->last_scan_res[j];
+ 
+-		if (ssid->mode != WPAS_MODE_IBSS)
++		/* Don't adjust control freq in case of fixed_freq */
++		if (ssid->fixed_freq) {
++			obss_scan = 0;
+ 			break;
++		}
+ 
+-		/* Don't adjust control freq in case of fixed_freq */
+-		if (ssid->fixed_freq)
++		if (ssid->mode != WPAS_MODE_IBSS)
+ 			break;
+ 
+ 		if (!bss_is_ibss(bss))



More information about the lede-commits mailing list