mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
34705946e2
Drop outdated and by now broken patchset originally supplied by Peter Oh in August 2018 but never merged upstream. Instead add the more promissing rework recently submitted by Markus Theil who picked up Peter's patchset, fixed and completed it and added support for HE (802.11ax) in mesh mode. This is only compile tested and needs some real-life testing. Fixes: FS#3214 Fixes:167028b750
("hostapd: Update to version 2.9 (2019-08-08)") Fixes:0a3ec87a66
("hostapd: update to latest Git hostap_2_9-1238-gdd2daf0848ed") Fixes:017320ead3
("hostapd: bring back mesh patches") Signed-off-by: Daniel Golle <daniel@makrotopia.org>
197 lines
6.9 KiB
Diff
197 lines
6.9 KiB
Diff
From 91976250359b263a44861aebe553b20627fe487e Mon Sep 17 00:00:00 2001
|
|
From: Markus Theil <markus.theil@tu-ilmenau.de>
|
|
Date: Tue, 30 Jun 2020 13:53:17 +0200
|
|
Subject: [PATCH 01/19] HE/VHT: fix frequency setup with HE enabled
|
|
|
|
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.
|
|
|
|
Acked-by: John Crispin <john@phrozen.org>
|
|
Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
|
|
---
|
|
src/ap/dfs.c | 8 ++++----
|
|
wpa_supplicant/ap.c | 40 +++++++++++++++++++++++-----------------
|
|
wpa_supplicant/mesh.c | 24 ------------------------
|
|
3 files changed, 27 insertions(+), 45 deletions(-)
|
|
|
|
--- a/src/ap/dfs.c
|
|
+++ b/src/ap/dfs.c
|
|
@@ -1028,7 +1028,7 @@ static int hostapd_dfs_start_channel_swi
|
|
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_swi
|
|
"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_swi
|
|
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,
|
|
--- a/wpa_supplicant/ap.c
|
|
+++ b/wpa_supplicant/ap.c
|
|
@@ -52,6 +52,7 @@ static void wpas_conf_ap_vht(struct wpa_
|
|
#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_
|
|
|
|
/* 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_
|
|
* 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_
|
|
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
|
|
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;
|
|
}
|
|
}
|
|
|
|
--- a/wpa_supplicant/mesh.c
|
|
+++ b/wpa_supplicant/mesh.c
|
|
@@ -333,30 +333,6 @@ static int wpa_supplicant_mesh_init(stru
|
|
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) {
|
|
/*
|