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:
parent
0da54fa642
commit
d91494eedf
9 changed files with 58 additions and 179 deletions
|
@ -524,7 +524,7 @@ mac80211_setup_supplicant() {
|
||||||
|
|
||||||
mac80211_setup_supplicant_noctl() {
|
mac80211_setup_supplicant_noctl() {
|
||||||
wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1
|
wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1
|
||||||
wpa_supplicant_add_network "$ifname"
|
wpa_supplicant_add_network "$ifname" "$freq" "$htmode"
|
||||||
wpa_supplicant_run "$ifname"
|
wpa_supplicant_run "$ifname"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -637,6 +637,7 @@ mac80211_setup_vif() {
|
||||||
authsae_start_interface || failed=1
|
authsae_start_interface || failed=1
|
||||||
else
|
else
|
||||||
wireless_vif_parse_encryption
|
wireless_vif_parse_encryption
|
||||||
|
freq="$(get_freq "$phy" "$channel")"
|
||||||
mac80211_setup_supplicant_noctl || failed=1
|
mac80211_setup_supplicant_noctl || failed=1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
@ -694,6 +695,7 @@ mac80211_setup_vif() {
|
||||||
wireless_vif_parse_encryption
|
wireless_vif_parse_encryption
|
||||||
mac80211_setup_adhoc_htmode
|
mac80211_setup_adhoc_htmode
|
||||||
if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then
|
if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then
|
||||||
|
freq="$(get_freq "$phy" "$channel")"
|
||||||
mac80211_setup_supplicant_noctl || failed=1
|
mac80211_setup_supplicant_noctl || failed=1
|
||||||
else
|
else
|
||||||
mac80211_setup_adhoc
|
mac80211_setup_adhoc
|
||||||
|
|
|
@ -594,8 +594,31 @@ EOF
|
||||||
return 0
|
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() {
|
wpa_supplicant_add_network() {
|
||||||
local ifname="$1"
|
local ifname="$1"
|
||||||
|
local freq="$2"
|
||||||
|
local htmode="$3"
|
||||||
|
|
||||||
_wpa_supplicant_common "$1"
|
_wpa_supplicant_common "$1"
|
||||||
wireless_vif_parse_encryption
|
wireless_vif_parse_encryption
|
||||||
|
@ -617,11 +640,7 @@ wpa_supplicant_add_network() {
|
||||||
|
|
||||||
[[ "$_w_mode" = "adhoc" ]] && {
|
[[ "$_w_mode" = "adhoc" ]] && {
|
||||||
append network_data "mode=1" "$N$T"
|
append network_data "mode=1" "$N$T"
|
||||||
[ -n "$channel" ] && {
|
[ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
|
||||||
freq="$(get_freq "$phy" "$channel")"
|
|
||||||
append network_data "fixed_freq=1" "$N$T"
|
|
||||||
append network_data "frequency=$freq" "$N$T"
|
|
||||||
}
|
|
||||||
|
|
||||||
scan_ssid="scan_ssid=0"
|
scan_ssid="scan_ssid=0"
|
||||||
|
|
||||||
|
@ -633,10 +652,7 @@ wpa_supplicant_add_network() {
|
||||||
ssid="${mesh_id}"
|
ssid="${mesh_id}"
|
||||||
|
|
||||||
append network_data "mode=5" "$N$T"
|
append network_data "mode=5" "$N$T"
|
||||||
[ -n "$channel" ] && {
|
[ -n "$channel" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
|
||||||
freq="$(get_freq "$phy" "$channel")"
|
|
||||||
append network_data "frequency=$freq" "$N$T"
|
|
||||||
}
|
|
||||||
append wpa_key_mgmt "SAE"
|
append wpa_key_mgmt "SAE"
|
||||||
scan_ssid=""
|
scan_ssid=""
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,10 +179,10 @@ CONFIG_SMARTCARD=y
|
||||||
#CONFIG_PCSC=y
|
#CONFIG_PCSC=y
|
||||||
|
|
||||||
# Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
|
# 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.)
|
# Support VHT overrides (disable VHT, mask MCS rates, etc.)
|
||||||
#CONFIG_VHT_OVERRIDES=y
|
CONFIG_VHT_OVERRIDES=y
|
||||||
|
|
||||||
# Development testing
|
# Development testing
|
||||||
#CONFIG_EAPOL_TEST=y
|
#CONFIG_EAPOL_TEST=y
|
||||||
|
|
|
@ -179,10 +179,10 @@ CONFIG_DRIVER_WIRED=y
|
||||||
#CONFIG_PCSC=y
|
#CONFIG_PCSC=y
|
||||||
|
|
||||||
# Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
|
# 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.)
|
# Support VHT overrides (disable VHT, mask MCS rates, etc.)
|
||||||
#CONFIG_VHT_OVERRIDES=y
|
CONFIG_VHT_OVERRIDES=y
|
||||||
|
|
||||||
# Development testing
|
# Development testing
|
||||||
#CONFIG_EAPOL_TEST=y
|
#CONFIG_EAPOL_TEST=y
|
||||||
|
|
|
@ -179,10 +179,10 @@ CONFIG_SMARTCARD=y
|
||||||
#CONFIG_PCSC=y
|
#CONFIG_PCSC=y
|
||||||
|
|
||||||
# Support HT overrides (disable HT/HT40, mask MCS rates, etc.)
|
# 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.)
|
# Support VHT overrides (disable VHT, mask MCS rates, etc.)
|
||||||
#CONFIG_VHT_OVERRIDES=y
|
CONFIG_VHT_OVERRIDES=y
|
||||||
|
|
||||||
# Development testing
|
# Development testing
|
||||||
#CONFIG_EAPOL_TEST=y
|
#CONFIG_EAPOL_TEST=y
|
||||||
|
|
|
@ -140,11 +140,10 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
|
||||||
/* Helper macros for network block parser */
|
/* Helper macros for network block parser */
|
||||||
|
|
||||||
#ifdef OFFSET
|
#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(ap_max_inactivity) },
|
||||||
{ INT(dtim_period) },
|
{ INT(dtim_period) },
|
||||||
{ INT(beacon_int) },
|
{ INT(beacon_int) },
|
||||||
+ { INT_RANGE(fixed_freq, 0, 1) },
|
|
||||||
+ { FUNC(rates) },
|
+ { FUNC(rates) },
|
||||||
+ { FUNC(mcast_rate) },
|
+ { FUNC(mcast_rate) },
|
||||||
#ifdef CONFIG_MACSEC
|
#ifdef CONFIG_MACSEC
|
||||||
|
@ -175,11 +174,10 @@ Signed-hostap: Antonio Quartulli <ordex@autistici.org>
|
||||||
* macsec_policy - Determines the policy for MACsec secure session
|
* macsec_policy - Determines the policy for MACsec secure session
|
||||||
--- a/wpa_supplicant/wpa_supplicant.c
|
--- a/wpa_supplicant/wpa_supplicant.c
|
||||||
+++ b/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;
|
params.beacon_int = ssid->beacon_int;
|
||||||
else
|
else
|
||||||
params.beacon_int = wpa_s->conf->beacon_int;
|
params.beacon_int = wpa_s->conf->beacon_int;
|
||||||
+ params.fixed_freq = ssid->fixed_freq;
|
|
||||||
+ i = 0;
|
+ i = 0;
|
||||||
+ while (i < WLAN_SUPP_RATES_MAX) {
|
+ while (i < WLAN_SUPP_RATES_MAX) {
|
||||||
+ params.rates[i] = ssid->rates[i];
|
+ 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
|
--- a/src/drivers/driver.h
|
||||||
+++ b/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_SAE_AUTH 0x00000004
|
||||||
#define WPA_DRIVER_MESH_FLAG_AMPE 0x00000008
|
#define WPA_DRIVER_MESH_FLAG_AMPE 0x00000008
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
@ -29,7 +29,7 @@ Tested-by: Simon Wunderlich <simon.wunderlich@openmesh.com>
|
||||||
/**
|
/**
|
||||||
--- a/src/drivers/driver_nl80211.c
|
--- a/src/drivers/driver_nl80211.c
|
||||||
+++ b/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,
|
static int nl80211_put_mesh_config(struct nl_msg *msg,
|
||||||
struct wpa_driver_mesh_bss_params *params)
|
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_basic_rates(msg, params->basic_rates) ||
|
||||||
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
|
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
|
||||||
nl80211_put_beacon_int(msg, params->beacon_int) ||
|
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))
|
Loading…
Reference in a new issue