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@nbd.name>
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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="" | ||||
| 	} | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -140,11 +140,10 @@ Signed-hostap: Antonio Quartulli <ordex@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@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]; | ||||
|   | ||||
| @@ -1,156 +0,0 @@ | ||||
| From b9329c5dfeed7d5c55d2117d8dfe326fc40c8fb1 Mon Sep 17 00:00:00 2001 | ||||
| From: Antonio Quartulli <ordex@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@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; | ||||
| @@ -19,7 +19,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@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@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@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) || | ||||
|   | ||||
| @@ -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)) | ||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau