Re: [PATCH] HE/VHT: fix frequency setup with HE enabled

John Crispin <[email protected]> Thu, 18 Jun 2020 21:54:30 +0200
Newsgroups gmane.linux.drivers.hostap
Message-ID <[email protected]>
On 18.06.20 21:19, Markus Theil wrote:
> Some places in the code base were not using the
> wrappers like hostapd_set_oper_centr_freq_seg0_idx
> and friends. This could lead to errors, for example when
> joining 80 MHz mesh networks. Fix this, by enforcing
> usage of these wrappers.
>
> wpa_supplicant_conf_ap_ht now checks for HE capability
> before dealing with VHT in order for these wrappers to work,
> as they first check HE support in the config.
>
> While doing these changes, I've noticed that the extra
> channel setup code for mesh networks in wpa_supplicant/mesh.c
> should not be necessary anymore and dropped it.
> wpa_supplicant_conf_ap_ht should handle this setup already.
>
> Signed-off-by: Markus Theil <[email protected]>

Acked-by: John Crispin <[email protected]>

had a similar non-finished patch in my staging tree, this one is more 
complete

     John

> ---
>   src/ap/dfs.c          |  8 ++++----
>   wpa_supplicant/ap.c   | 40 +++++++++++++++++++++++-----------------
>   wpa_supplicant/mesh.c | 24 ------------------------
>   3 files changed, 27 insertions(+), 45 deletions(-)
>
> diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> index 3c078b9cb..f62da49a7 100644
> --- a/src/ap/dfs.c
> +++ b/src/ap/dfs.c
> @@ -1028,7 +1028,7 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
>   	unsigned int i;
>   	int err = 1;
>   	struct hostapd_hw_modes *cmode = iface->current_mode;
> -	u8 current_vht_oper_chwidth = iface->conf->vht_oper_chwidth;
> +	u8 current_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
>   
>   	wpa_printf(MSG_DEBUG, "%s called (CAC active: %s, CSA active: %s)",
>   		   __func__, iface->cac_started ? "yes" : "no",
> @@ -1089,8 +1089,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
>   		"freq=%d chan=%d sec_chan=%d", channel->freq,
>   		channel->chan, secondary_channel);
>   
> -	new_vht_oper_chwidth = iface->conf->vht_oper_chwidth;
> -	iface->conf->vht_oper_chwidth = current_vht_oper_chwidth;
> +	new_vht_oper_chwidth = hostapd_get_oper_chwidth(iface->conf);
> +	hostapd_set_oper_chwidth(iface->conf, current_vht_oper_chwidth);
>   
>   	/* Setup CSA request */
>   	os_memset(&csa_settings, 0, sizeof(csa_settings));
> @@ -1130,7 +1130,7 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
>   		iface->freq = channel->freq;
>   		iface->conf->channel = channel->chan;
>   		iface->conf->secondary_channel = secondary_channel;
> -		iface->conf->vht_oper_chwidth = new_vht_oper_chwidth;
> +		hostapd_set_oper_chwidth(iface->conf, new_vht_oper_chwidth);
>   		hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
>   						     oper_centr_freq_seg0_idx);
>   		hostapd_set_oper_centr_freq_seg1_idx(iface->conf,
> diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c
> index 2accf92cd..fe32ae525 100644
> --- a/wpa_supplicant/ap.c
> +++ b/wpa_supplicant/ap.c
> @@ -52,6 +52,7 @@ static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
>   #ifdef CONFIG_P2P
>   	u8 center_chan = 0;
>   	u8 channel = conf->channel;
> +	u8 freq_seg_idx;
>   #endif /* CONFIG_P2P */
>   
>   	if (!conf->secondary_channel)
> @@ -59,19 +60,21 @@ static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
>   
>   	/* Use the maximum oper channel width if it's given. */
>   	if (ssid->max_oper_chwidth)
> -		conf->vht_oper_chwidth = ssid->max_oper_chwidth;
> +		hostapd_set_oper_chwidth(conf, ssid->max_oper_chwidth);
>   
>   	ieee80211_freq_to_chan(ssid->vht_center_freq2,
> -			       &conf->vht_oper_centr_freq_seg1_idx);
> +			       &freq_seg_idx);
> +	hostapd_set_oper_centr_freq_seg1_idx(conf, freq_seg_idx);
>   
>   	if (!ssid->p2p_group) {
>   		if (!ssid->vht_center_freq1 ||
> -		    conf->vht_oper_chwidth == CHANWIDTH_USE_HT)
> +		    hostapd_get_oper_chwidth(conf) == CHANWIDTH_USE_HT)
>   			goto no_vht;
>   		ieee80211_freq_to_chan(ssid->vht_center_freq1,
> -				       &conf->vht_oper_centr_freq_seg0_idx);
> +				       &freq_seg_idx);
> +		hostapd_set_oper_centr_freq_seg0_idx(conf, freq_seg_idx);
>   		wpa_printf(MSG_DEBUG, "VHT seg0 index %d for AP",
> -			   conf->vht_oper_centr_freq_seg0_idx);
> +			   hostapd_get_oper_centr_freq_seg0_idx(conf));
>   		return;
>   	}
>   
> @@ -96,14 +99,14 @@ static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
>   		 * try oper_cwidth 160 MHz first then VHT 80 MHz, if 160 MHz is
>   		 * not supported.
>   		 */
> -		conf->vht_oper_chwidth = CHANWIDTH_160MHZ;
> +		hostapd_set_oper_chwidth(conf, CHANWIDTH_160MHZ);
>   		center_chan = wpas_p2p_get_vht160_center(wpa_s, mode, channel);
>   		if (center_chan) {
>   			wpa_printf(MSG_DEBUG,
>   				   "VHT center channel %u for auto-selected 160 MHz bandwidth",
>   				   center_chan);
>   		} else {
> -			conf->vht_oper_chwidth = CHANWIDTH_80MHZ;
> +			hostapd_set_oper_chwidth(conf, CHANWIDTH_80MHZ);
>   			center_chan = wpas_p2p_get_vht80_center(wpa_s, mode,
>   								channel);
>   			wpa_printf(MSG_DEBUG,
> @@ -115,9 +118,9 @@ static void wpas_conf_ap_vht(struct wpa_supplicant *wpa_s,
>   	if (!center_chan)
>   		goto no_vht;
>   
> -	conf->vht_oper_centr_freq_seg0_idx = center_chan;
> +	hostapd_set_oper_centr_freq_seg0_idx(conf, center_chan);
>   	wpa_printf(MSG_DEBUG, "VHT seg0 index %d for P2P GO",
> -		   conf->vht_oper_centr_freq_seg0_idx);
> +		   hostapd_get_oper_centr_freq_seg0_idx(conf));
>   	return;
>   #endif /* CONFIG_P2P */
>   
> @@ -125,9 +128,9 @@ no_vht:
>   	wpa_printf(MSG_DEBUG,
>   		   "No VHT higher bandwidth support for the selected channel %d",
>   		   conf->channel);
> -	conf->vht_oper_centr_freq_seg0_idx =
> -		conf->channel + conf->secondary_channel * 2;
> -	conf->vht_oper_chwidth = CHANWIDTH_USE_HT;
> +	hostapd_set_oper_centr_freq_seg0_idx(conf,
> +					     conf->channel + conf->secondary_channel * 2);
> +	hostapd_set_oper_chwidth(conf, CHANWIDTH_USE_HT);
>   }
>   
>   
> @@ -231,16 +234,19 @@ int wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s,
>   				 HT_CAP_INFO_TX_STBC |
>   				 HT_CAP_INFO_MAX_AMSDU_SIZE);
>   
> +			/* check this before VHT, because setting oper chan
> +			 * width and friends is the same call for HE and VHT
> +			 * and checks if conf->ieee8021ax == 1 */
> +			if (mode->he_capab[wpas_mode_to_ieee80211_mode(
> +					    ssid->mode)].he_supported &&
> +			    ssid->he)
> +				conf->ieee80211ax = 1;
> +
>   			if (mode->vht_capab && ssid->vht) {
>   				conf->ieee80211ac = 1;
>   				conf->vht_capab |= mode->vht_capab;
>   				wpas_conf_ap_vht(wpa_s, ssid, conf, mode);
>   			}
> -
> -			if (mode->he_capab[wpas_mode_to_ieee80211_mode(
> -					    ssid->mode)].he_supported &&
> -			    ssid->he)
> -				conf->ieee80211ax = 1;
>   		}
>   	}
>   
> diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
> index e0a3ec128..ef798a037 100644
> --- a/wpa_supplicant/mesh.c
> +++ b/wpa_supplicant/mesh.c
> @@ -352,30 +352,6 @@ static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
>   			   frequency);
>   		goto out_free;
>   	}
> -	if (ssid->ht40)
> -		conf->secondary_channel = ssid->ht40;
> -	if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && ssid->vht) {
> -		if (ssid->max_oper_chwidth != DEFAULT_MAX_OPER_CHWIDTH)
> -			conf->vht_oper_chwidth = ssid->max_oper_chwidth;
> -		switch (conf->vht_oper_chwidth) {
> -		case CHANWIDTH_80MHZ:
> -		case CHANWIDTH_80P80MHZ:
> -			ieee80211_freq_to_chan(
> -				frequency,
> -				&conf->vht_oper_centr_freq_seg0_idx);
> -			conf->vht_oper_centr_freq_seg0_idx += ssid->ht40 * 2;
> -			break;
> -		case CHANWIDTH_160MHZ:
> -			ieee80211_freq_to_chan(
> -				frequency,
> -				&conf->vht_oper_centr_freq_seg0_idx);
> -			conf->vht_oper_centr_freq_seg0_idx += ssid->ht40 * 2;
> -			conf->vht_oper_centr_freq_seg0_idx += 40 / 5;
> -			break;
> -		}
> -		ieee80211_freq_to_chan(ssid->vht_center_freq2,
> -				       &conf->vht_oper_centr_freq_seg1_idx);
> -	}
>   
>   	if (ssid->mesh_basic_rates == NULL) {
>   		/*

_______________________________________________
Hostap mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/hostap