mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-19 18:31:33 +00:00
309 lines
12 KiB
Diff
309 lines
12 KiB
Diff
From bcbde623ce398a9f3503db3756c2c5acaafcad91 Mon Sep 17 00:00:00 2001
|
|
From: Muna Sinada <quic_msinada@quicinc.com>
|
|
Date: Thu, 15 Jul 2021 09:35:12 -0700
|
|
Subject: [PATCH 17/23] eht: additions to hostapd_set_freq_params()
|
|
|
|
Modify hostapd_set_freq_params to include EHT parameters and the calling
|
|
functions.
|
|
|
|
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
|
Signed-off-by: Aloka Dixit <quic_alokad@quicinc.com>
|
|
---
|
|
src/ap/ap_drv_ops.c | 14 +++++++++-----
|
|
src/ap/ap_drv_ops.h | 6 +++---
|
|
src/ap/beacon.c | 2 ++
|
|
src/ap/dfs.c | 6 +++++-
|
|
src/ap/hostapd.c | 5 ++++-
|
|
src/common/hw_features_common.c | 24 ++++++++++++++++++------
|
|
src/common/hw_features_common.h | 6 ++++--
|
|
src/drivers/driver.h | 5 +++++
|
|
wpa_supplicant/mesh.c | 8 ++++++--
|
|
wpa_supplicant/wpa_supplicant.c | 6 ++++--
|
|
10 files changed, 60 insertions(+), 22 deletions(-)
|
|
|
|
--- a/src/ap/ap_drv_ops.c
|
|
+++ b/src/ap/ap_drv_ops.c
|
|
@@ -550,7 +550,7 @@ int hostapd_flush(struct hostapd_data *h
|
|
int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode,
|
|
int freq, int channel, int edmg, u8 edmg_channel,
|
|
int ht_enabled, int vht_enabled,
|
|
- int he_enabled,
|
|
+ int he_enabled, int eht_enabled,
|
|
int sec_channel_offset, int oper_chwidth,
|
|
int center_segment0, int center_segment1)
|
|
{
|
|
@@ -559,12 +559,14 @@ int hostapd_set_freq(struct hostapd_data
|
|
|
|
if (hostapd_set_freq_params(&data, mode, freq, channel, edmg,
|
|
edmg_channel, ht_enabled,
|
|
- vht_enabled, he_enabled, sec_channel_offset,
|
|
- oper_chwidth,
|
|
+ vht_enabled, he_enabled, eht_enabled,
|
|
+ sec_channel_offset, oper_chwidth,
|
|
center_segment0, center_segment1,
|
|
cmode ? cmode->vht_capab : 0,
|
|
cmode ?
|
|
&cmode->he_capab[IEEE80211_MODE_AP] : NULL,
|
|
+ cmode ?
|
|
+ &cmode->eht_capab[IEEE80211_MODE_AP] : NULL,
|
|
hapd->iconf->he_6ghz_reg_pwr_type))
|
|
return -1;
|
|
|
|
@@ -815,7 +817,7 @@ int hostapd_drv_send_action_addr3_ap(str
|
|
int hostapd_start_dfs_cac(struct hostapd_iface *iface,
|
|
enum hostapd_hw_mode mode, int freq,
|
|
int channel, int ht_enabled, int vht_enabled,
|
|
- int he_enabled,
|
|
+ int he_enabled, int eht_enabled,
|
|
int sec_channel_offset, int oper_chwidth,
|
|
int center_segment0, int center_segment1)
|
|
{
|
|
@@ -835,11 +837,13 @@ int hostapd_start_dfs_cac(struct hostapd
|
|
|
|
if (hostapd_set_freq_params(&data, mode, freq, channel, 0, 0,
|
|
ht_enabled,
|
|
- vht_enabled, he_enabled, sec_channel_offset,
|
|
+ vht_enabled, he_enabled, eht_enabled,
|
|
+ sec_channel_offset,
|
|
oper_chwidth, center_segment0,
|
|
center_segment1,
|
|
cmode->vht_capab,
|
|
&cmode->he_capab[IEEE80211_MODE_AP],
|
|
+ &cmode->eht_capab[IEEE80211_MODE_AP],
|
|
hapd->iconf->he_6ghz_reg_pwr_type)) {
|
|
wpa_printf(MSG_ERROR, "Can't set freq params");
|
|
return -1;
|
|
--- a/src/ap/ap_drv_ops.h
|
|
+++ b/src/ap/ap_drv_ops.h
|
|
@@ -65,8 +65,8 @@ int hostapd_get_seqnum(const char *ifnam
|
|
int hostapd_flush(struct hostapd_data *hapd);
|
|
int hostapd_set_freq(struct hostapd_data *hapd, enum hostapd_hw_mode mode,
|
|
int freq, int channel, int edmg, u8 edmg_channel,
|
|
- int ht_enabled, int vht_enabled,
|
|
- int he_enabled, int sec_channel_offset, int oper_chwidth,
|
|
+ int ht_enabled, int vht_enabled, int he_enabled,
|
|
+ int eht_enabled, int sec_channel_offset, int oper_chwidth,
|
|
int center_segment0, int center_segment1);
|
|
int hostapd_set_rts(struct hostapd_data *hapd, int rts);
|
|
int hostapd_set_frag(struct hostapd_data *hapd, int frag);
|
|
@@ -129,7 +129,7 @@ int hostapd_add_tspec(struct hostapd_dat
|
|
int hostapd_start_dfs_cac(struct hostapd_iface *iface,
|
|
enum hostapd_hw_mode mode, int freq,
|
|
int channel, int ht_enabled, int vht_enabled,
|
|
- int he_enabled,
|
|
+ int he_enabled, int eht_enabled,
|
|
int sec_channel_offset, int oper_chwidth,
|
|
int center_segment0, int center_segment1);
|
|
int hostapd_drv_do_acs(struct hostapd_data *hapd);
|
|
--- a/src/ap/beacon.c
|
|
+++ b/src/ap/beacon.c
|
|
@@ -2162,12 +2162,14 @@ static int __ieee802_11_set_beacon(struc
|
|
iconf->channel, iconf->enable_edmg,
|
|
iconf->edmg_channel, iconf->ieee80211n,
|
|
iconf->ieee80211ac, iconf->ieee80211ax,
|
|
+ iconf->ieee80211be,
|
|
iconf->secondary_channel,
|
|
hostapd_get_oper_chwidth(iconf),
|
|
hostapd_get_oper_centr_freq_seg0_idx(iconf),
|
|
hostapd_get_oper_centr_freq_seg1_idx(iconf),
|
|
cmode->vht_capab,
|
|
&cmode->he_capab[IEEE80211_MODE_AP],
|
|
+ &cmode->eht_capab[IEEE80211_MODE_AP],
|
|
iconf->he_6ghz_reg_pwr_type) == 0)
|
|
params.freq = &freq;
|
|
|
|
--- a/src/ap/dfs.c
|
|
+++ b/src/ap/dfs.c
|
|
@@ -871,7 +871,7 @@ int hostapd_handle_dfs(struct hostapd_if
|
|
res = hostapd_start_dfs_cac(
|
|
iface, iface->conf->hw_mode, iface->freq, iface->conf->channel,
|
|
iface->conf->ieee80211n, iface->conf->ieee80211ac,
|
|
- iface->conf->ieee80211ax,
|
|
+ iface->conf->ieee80211ax, iface->conf->ieee80211be,
|
|
iface->conf->secondary_channel,
|
|
hostapd_get_oper_chwidth(iface->conf),
|
|
hostapd_get_oper_centr_freq_seg0_idx(iface->conf),
|
|
@@ -1084,12 +1084,14 @@ static int hostapd_dfs_testmode_set_beac
|
|
iface->conf->ieee80211n,
|
|
iface->conf->ieee80211ac,
|
|
iface->conf->ieee80211ax,
|
|
+ iface->conf->ieee80211be,
|
|
secondary_channel,
|
|
hostapd_get_oper_chwidth(iface->conf),
|
|
vht_oper_centr_freq_seg0_idx,
|
|
vht_oper_centr_freq_seg1_idx,
|
|
iface->current_mode->vht_capab,
|
|
&iface->current_mode->he_capab[IEEE80211_MODE_AP],
|
|
+ &iface->current_mode->eht_capab[IEEE80211_MODE_AP],
|
|
hapd->iconf->he_6ghz_reg_pwr_type);
|
|
|
|
if (err) {
|
|
@@ -1226,12 +1228,14 @@ static int hostapd_dfs_start_channel_swi
|
|
iface->conf->ieee80211n,
|
|
iface->conf->ieee80211ac,
|
|
iface->conf->ieee80211ax,
|
|
+ iface->conf->ieee80211be,
|
|
secondary_channel,
|
|
new_vht_oper_chwidth,
|
|
oper_centr_freq_seg0_idx,
|
|
oper_centr_freq_seg1_idx,
|
|
cmode->vht_capab,
|
|
&cmode->he_capab[ieee80211_mode],
|
|
+ &cmode->eht_capab[ieee80211_mode],
|
|
iface->conf->he_6ghz_reg_pwr_type);
|
|
|
|
if (err) {
|
|
--- a/src/ap/hostapd.c
|
|
+++ b/src/ap/hostapd.c
|
|
@@ -2117,6 +2117,7 @@ static int hostapd_setup_interface_compl
|
|
hapd->iconf->ieee80211n,
|
|
hapd->iconf->ieee80211ac,
|
|
hapd->iconf->ieee80211ax,
|
|
+ hapd->iconf->ieee80211be,
|
|
hapd->iconf->secondary_channel,
|
|
hostapd_get_oper_chwidth(hapd->iconf),
|
|
hostapd_get_oper_centr_freq_seg0_idx(
|
|
@@ -3524,12 +3525,14 @@ static int hostapd_change_config_freq(st
|
|
conf->channel, conf->enable_edmg,
|
|
conf->edmg_channel, conf->ieee80211n,
|
|
conf->ieee80211ac, conf->ieee80211ax,
|
|
- conf->secondary_channel,
|
|
+ conf->ieee80211be, conf->secondary_channel,
|
|
hostapd_get_oper_chwidth(conf),
|
|
hostapd_get_oper_centr_freq_seg0_idx(conf),
|
|
hostapd_get_oper_centr_freq_seg1_idx(conf),
|
|
conf->vht_capab,
|
|
mode ? &mode->he_capab[IEEE80211_MODE_AP] :
|
|
+ NULL,
|
|
+ mode ? &mode->eht_capab[IEEE80211_MODE_AP] :
|
|
NULL, hapd->iconf->he_6ghz_reg_pwr_type))
|
|
return -1;
|
|
|
|
--- a/src/common/hw_features_common.c
|
|
+++ b/src/common/hw_features_common.c
|
|
@@ -383,10 +383,12 @@ int hostapd_set_freq_params(struct hosta
|
|
int freq, int channel, int enable_edmg,
|
|
u8 edmg_channel, int ht_enabled,
|
|
int vht_enabled, int he_enabled,
|
|
- int sec_channel_offset,
|
|
+ int eht_enabled, int sec_channel_offset,
|
|
int oper_chwidth, int center_segment0,
|
|
int center_segment1, u32 vht_caps,
|
|
- struct he_capabilities *he_cap, u8 reg_6g_pwr_mode)
|
|
+ struct he_capabilities *he_cap,
|
|
+ struct eht_capabilities *eht_cap,
|
|
+ u8 reg_6g_pwr_mode)
|
|
{
|
|
if (!he_cap || !he_cap->he_supported)
|
|
he_enabled = 0;
|
|
@@ -397,6 +399,7 @@ int hostapd_set_freq_params(struct hosta
|
|
data->ht_enabled = ht_enabled;
|
|
data->vht_enabled = vht_enabled;
|
|
data->he_enabled = he_enabled;
|
|
+ data->eht_enabled = eht_enabled;
|
|
data->sec_channel_offset = sec_channel_offset;
|
|
data->center_freq1 = freq + sec_channel_offset * 10;
|
|
data->center_freq2 = 0;
|
|
@@ -415,9 +418,9 @@ int hostapd_set_freq_params(struct hosta
|
|
&data->edmg);
|
|
|
|
if (is_6ghz_freq(freq)) {
|
|
- if (!data->he_enabled) {
|
|
+ if (!data->he_enabled && !data->eht_enabled) {
|
|
wpa_printf(MSG_ERROR,
|
|
- "Can't set 6 GHz mode - HE isn't enabled");
|
|
+ "Can't set 6 GHz mode - HE and EHT aren't enabled");
|
|
return -1;
|
|
}
|
|
|
|
@@ -482,7 +485,16 @@ int hostapd_set_freq_params(struct hosta
|
|
return 0;
|
|
}
|
|
|
|
- if (data->he_enabled) switch (oper_chwidth) {
|
|
+ if (data->eht_enabled) switch (oper_chwidth) {
|
|
+ case CHANWIDTH_320MHZ:
|
|
+ if (!(eht_cap->phy_cap[EHT_PHYCAP_320MHZ_IN_6GHZ_SUPPORT_IDX] &
|
|
+ EHT_PHYCAP_320MHZ_IN_6GHZ_SUPPORT_MASK)) {
|
|
+ wpa_printf(MSG_ERROR,
|
|
+ "320 MHz channel width is not supported in 5 / 6GHz");
|
|
+ return -1;
|
|
+ }
|
|
+ break;
|
|
+ } else if (data->he_enabled) switch (oper_chwidth) {
|
|
case CHANWIDTH_USE_HT:
|
|
if (sec_channel_offset == 0)
|
|
break;
|
|
@@ -545,7 +557,7 @@ int hostapd_set_freq_params(struct hosta
|
|
break;
|
|
}
|
|
|
|
- if (data->he_enabled || data->vht_enabled) switch (oper_chwidth) {
|
|
+ if (data->eht_enabled || data->he_enabled || data->vht_enabled) switch (oper_chwidth) {
|
|
case CHANWIDTH_USE_HT:
|
|
if (center_segment1 ||
|
|
(center_segment0 != 0 &&
|
|
--- a/src/common/hw_features_common.h
|
|
+++ b/src/common/hw_features_common.h
|
|
@@ -40,10 +40,12 @@ int hostapd_set_freq_params(struct hosta
|
|
int freq, int channel, int edmg, u8 edmg_channel,
|
|
int ht_enabled,
|
|
int vht_enabled, int he_enabled,
|
|
- int sec_channel_offset,
|
|
+ int eht_enabled, int sec_channel_offset,
|
|
int oper_chwidth, int center_segment0,
|
|
int center_segment1, u32 vht_caps,
|
|
- struct he_capabilities *he_caps, u8 reg_6g_pwr_mode);
|
|
+ struct he_capabilities *he_caps,
|
|
+ struct eht_capabilities *eht_cap,
|
|
+ u8 reg_6g_pwr_mode);
|
|
void set_disable_ht40(struct ieee80211_ht_capabilities *htcaps,
|
|
int disabled);
|
|
int ieee80211ac_cap_check(u32 hw, u32 conf);
|
|
--- a/src/drivers/driver.h
|
|
+++ b/src/drivers/driver.h
|
|
@@ -814,6 +814,11 @@ struct hostapd_freq_params {
|
|
* 2 - VLP_AP
|
|
*/
|
|
u8 he_6ghz_reg_pwr_type;
|
|
+
|
|
+ /**
|
|
+ * eht_enabled - Whether EHT is enabled
|
|
+ */
|
|
+ int eht_enabled;
|
|
};
|
|
|
|
/**
|
|
--- a/wpa_supplicant/mesh.c
|
|
+++ b/wpa_supplicant/mesh.c
|
|
@@ -227,12 +227,13 @@ static int wpas_mesh_update_freq_params(
|
|
ifmsh->conf->ieee80211n,
|
|
ifmsh->conf->ieee80211ac,
|
|
ifmsh->conf->ieee80211ax,
|
|
+ 0,
|
|
ifmsh->conf->secondary_channel,
|
|
hostapd_get_oper_chwidth(ifmsh->conf),
|
|
hostapd_get_oper_centr_freq_seg0_idx(ifmsh->conf),
|
|
hostapd_get_oper_centr_freq_seg1_idx(ifmsh->conf),
|
|
ifmsh->conf->vht_capab,
|
|
- he_capab, ifmsh->conf->he_6ghz_reg_pwr_type)) {
|
|
+ he_capab, NULL, ifmsh->conf->he_6ghz_reg_pwr_type)) {
|
|
wpa_printf(MSG_ERROR, "Error updating mesh frequency params");
|
|
wpa_supplicant_mesh_deinit(wpa_s, true);
|
|
return -1;
|
|
--- a/wpa_supplicant/wpa_supplicant.c
|
|
+++ b/wpa_supplicant/wpa_supplicant.c
|
|
@@ -2849,9 +2849,10 @@ skip_to_6ghz:
|
|
freq->channel, ssid->enable_edmg,
|
|
ssid->edmg_channel, freq->ht_enabled,
|
|
vht_freq.vht_enabled, vht_freq.he_enabled,
|
|
- freq->sec_channel_offset,
|
|
+ 0, freq->sec_channel_offset,
|
|
chwidth, seg0, seg1, vht_caps,
|
|
- &mode->he_capab[ieee80211_mode], 0) != 0)
|
|
+ &mode->he_capab[ieee80211_mode], NULL,
|
|
+ 0) != 0)
|
|
return;
|
|
|
|
*freq = vht_freq;
|