hostapd: fix encrypted mesh channel settings

Import two patches from Peter Oh to allow setting channel
bandwidth in the way it already works for managed interfaces.
This fixes mesh interfaces on 802.11ac devices always coming up in
VHT80 mode.

Add a patch to allow HT40 also on 2.4GHz if noscan option is set, which
also skips secondary channel scan just like noscan works in AP mode.

This time also make sure to add all files to the patch before
committing it...

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
Daniel Golle 2018-04-20 07:41:03 +02:00
parent 99d9c98748
commit a4322eba2b
5 changed files with 226 additions and 1 deletions

View file

@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=hostapd PKG_NAME:=hostapd
PKG_RELEASE:=2 PKG_RELEASE:=3
PKG_SOURCE_URL:=http://w1.fi/hostap.git PKG_SOURCE_URL:=http://w1.fi/hostap.git
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git

View file

@ -647,6 +647,7 @@ wpa_supplicant_add_network() {
local ifname="$1" local ifname="$1"
local freq="$2" local freq="$2"
local htmode="$3" local htmode="$3"
local noscan="$4"
_wpa_supplicant_common "$1" _wpa_supplicant_common "$1"
wireless_vif_parse_encryption wireless_vif_parse_encryption
@ -682,6 +683,7 @@ wpa_supplicant_add_network() {
append network_data "mode=5" "$N$T" append network_data "mode=5" "$N$T"
[ -n "$mesh_fwding" ] && append network_data "mesh_fwding=${mesh_fwding}" "$N$T" [ -n "$mesh_fwding" ] && append network_data "mesh_fwding=${mesh_fwding}" "$N$T"
[ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode" [ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
[ "$noscan" = "1" ] && append network_data "noscan=1" "$N$T"
append wpa_key_mgmt "SAE" append wpa_key_mgmt "SAE"
scan_ssid="" scan_ssid=""
} }

View file

@ -0,0 +1,58 @@
From 838225f2319348e430b553fd9bb3680bd7434ae3 Mon Sep 17 00:00:00 2001
From: Peter Oh <peter.oh@bowerswilkins.com>
Date: Wed, 18 Apr 2018 14:14:18 -0700
Subject: [PATCH 1/2] mesh: add VHT_CHANWIDTH_USE_HT to max_oper_chwidth
Channel width in VHT mode refers HT capability when
the width goes down to below 80MHz, hence add checking
HT channel width to its max operation channel width.
So that mesh has capable to select bandwidth below 80Mhz.
Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
---
wpa_supplicant/config.c | 1 +
wpa_supplicant/config_ssid.h | 1 +
wpa_supplicant/wpa_supplicant.c | 3 +++
3 files changed, 5 insertions(+)
diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
index f65bbb02f..7e8f014cc 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -2798,6 +2798,7 @@ void wpa_config_set_network_defaults(struct wpa_ssid *ssid)
ssid->mka_priority = DEFAULT_PRIO_NOT_KEY_SERVER;
#endif /* CONFIG_MACSEC */
ssid->mac_addr = -1;
+ ssid->max_oper_chwidth = (u8)DEFAULT_MAX_OPER_CHWIDTH;
}
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index 9fd56c32f..2ddb777b2 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -37,6 +37,7 @@
#define DEFAULT_AMPDU_FACTOR -1 /* no change */
#define DEFAULT_AMPDU_DENSITY -1 /* no change */
#define DEFAULT_USER_SELECTED_SIM 1
+#define DEFAULT_MAX_OPER_CHWIDTH -1
struct psk_list_entry {
struct dl_list list;
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index dcd787bec..ca893f942 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2293,6 +2293,9 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
seg0 = 114;
}
+ } else if (ssid->max_oper_chwidth == VHT_CHANWIDTH_USE_HT) {
+ chwidth = VHT_CHANWIDTH_USE_HT;
+ seg0 = vht80[j] + 2;
}
if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
--
2.17.0

View file

@ -0,0 +1,87 @@
From 24fc73b2470ff79cd8c92e029ca785c8e95a204c Mon Sep 17 00:00:00 2001
From: Peter Oh <peter.oh@bowerswilkins.com>
Date: Wed, 18 Apr 2018 14:14:19 -0700
Subject: [PATCH 2/2] mesh: implement use of VHT20 config in mesh mode
mesh in VHT mode is supposed to be able to use any bandwidth
that 11ac supports, but we don't have a way to set VHT20
although there are parameters that are supposed to be used.
This patch along with the patch of
"mesh: add VHT_CHANWIDTH_USE_HT to max_oper_chwidth" makes mesh
available to use of any bandwidth using combination of
existing parameters like below shown.
VHT80:
default
do not set any parameters
VHT40:
max_oper_chwidth = 0
VHT20:
max_oper_chwidth=0
disable_ht40=1
HT40:
disable_vht = 1
HT20:
disable_ht40 = 1
disable HT:
disable_ht = 1
Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
---
wpa_supplicant/wpa_supplicant.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index ca893f942..8429cfd43 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2132,9 +2132,15 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
if (pri_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
return;
+ freq->channel = pri_chan->chan;
+
#ifdef CONFIG_HT_OVERRIDES
- if (ssid->disable_ht40)
- return;
+ if (ssid->disable_ht40) {
+ if (ssid->disable_vht)
+ return;
+ else
+ goto skip_ht40;
+ }
#endif /* CONFIG_HT_OVERRIDES */
/* Check/setup HT40+/HT40- */
@@ -2159,8 +2165,6 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
if (sec_chan->flag & (HOSTAPD_CHAN_DISABLED | HOSTAPD_CHAN_NO_IR))
return;
- freq->channel = pri_chan->chan;
-
if (ht40 == -1) {
if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
return;
@@ -2204,6 +2208,7 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
wpa_scan_results_free(scan_res);
}
+skip_ht40:
wpa_printf(MSG_DEBUG,
"IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
freq->channel, freq->sec_channel_offset);
@@ -2295,7 +2300,10 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
}
} else if (ssid->max_oper_chwidth == VHT_CHANWIDTH_USE_HT) {
chwidth = VHT_CHANWIDTH_USE_HT;
- seg0 = vht80[j] + 2;
+ if (ssid->disable_ht40)
+ seg0 = 0;
+ else
+ seg0 = vht80[j] + 2;
}
if (hostapd_set_freq_params(&vht_freq, mode->mode, freq->freq,
--
2.17.0

View file

@ -0,0 +1,78 @@
Index: hostapd-2018-04-09-fa617ee6/wpa_supplicant/config.c
===================================================================
--- hostapd-2018-04-09-fa617ee6.orig/wpa_supplicant/config.c
+++ hostapd-2018-04-09-fa617ee6/wpa_supplicant/config.c
@@ -2216,6 +2216,7 @@ static const struct parse_data ssid_fiel
#else /* CONFIG_MESH */
{ INT_RANGE(mode, 0, 4) },
#endif /* CONFIG_MESH */
+ { INT_RANGE(noscan, 0, 1) },
{ INT_RANGE(proactive_key_caching, 0, 1) },
{ INT_RANGE(disabled, 0, 2) },
{ STR(id_str) },
Index: hostapd-2018-04-09-fa617ee6/wpa_supplicant/config_file.c
===================================================================
--- hostapd-2018-04-09-fa617ee6.orig/wpa_supplicant/config_file.c
+++ hostapd-2018-04-09-fa617ee6/wpa_supplicant/config_file.c
@@ -816,6 +816,7 @@ static void wpa_config_write_network(FIL
#endif /* IEEE8021X_EAPOL */
INT(mode);
INT(no_auto_peer);
+ INT(noscan);
INT(mesh_fwding);
INT(frequency);
INT(fixed_freq);
Index: hostapd-2018-04-09-fa617ee6/wpa_supplicant/mesh.c
===================================================================
--- hostapd-2018-04-09-fa617ee6.orig/wpa_supplicant/mesh.c
+++ hostapd-2018-04-09-fa617ee6/wpa_supplicant/mesh.c
@@ -287,6 +287,8 @@ static int wpa_supplicant_mesh_init(stru
frequency);
goto out_free;
}
+ if (ssid->noscan)
+ conf->noscan = 1;
if (ssid->ht40)
conf->secondary_channel = ssid->ht40;
if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && ssid->vht) {
Index: hostapd-2018-04-09-fa617ee6/wpa_supplicant/wpa_supplicant.c
===================================================================
--- hostapd-2018-04-09-fa617ee6.orig/wpa_supplicant/wpa_supplicant.c
+++ hostapd-2018-04-09-fa617ee6/wpa_supplicant/wpa_supplicant.c
@@ -2024,12 +2024,12 @@ void ibss_mesh_setup_freq(struct wpa_sup
{
enum hostapd_hw_mode hw_mode;
struct hostapd_hw_modes *mode = NULL;
- int ht40plus[] = { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
+ int ht40plus[] = { 1, 2, 3, 4, 5, 6, 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157,
184, 192 };
int vht80[] = { 36, 52, 100, 116, 132, 149 };
struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
u8 channel;
- int i, chan_idx, ht40 = -1, res, obss_scan = 1;
+ int i, chan_idx, ht40 = -1, res, obss_scan = !(ssid->noscan);
unsigned int j, k;
struct hostapd_freq_params vht_freq;
int chwidth, seg0, seg1;
@@ -2099,7 +2099,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
return;
/* Setup higher BW only for 5 GHz */
- if (mode->mode != HOSTAPD_MODE_IEEE80211A)
+ if (mode->mode != HOSTAPD_MODE_IEEE80211A && !(ssid->noscan))
return;
for (chan_idx = 0; chan_idx < mode->num_channels; chan_idx++) {
Index: hostapd-2018-04-09-fa617ee6/wpa_supplicant/config_ssid.h
===================================================================
--- hostapd-2018-04-09-fa617ee6.orig/wpa_supplicant/config_ssid.h
+++ hostapd-2018-04-09-fa617ee6/wpa_supplicant/config_ssid.h
@@ -835,6 +835,8 @@ struct wpa_ssid {
*/
int no_auto_peer;
+ int noscan;
+
/**
* mesh_rssi_threshold - Set mesh parameter mesh_rssi_threshold (dBm)
*