summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamya Gnanasekar <quic_rgnanase@quicinc.com>2023-04-03 07:04:57 +0530
committerJouni Malinen <j@w1.fi>2023-04-26 23:10:03 +0300
commit8f8f68ba67867b201ae6504b607632dfb083b047 (patch)
tree18ae54e9d1b9d5017761ebac74f39f3ca29c36ad
parent4d0743d5e5a7af1e74bbc953f0aed2975438031c (diff)
downloadhostap-8f8f68ba67867b201ae6504b607632dfb083b047.tar.gz
hostapd: Support channel switch to 320 MHz channels
Add validatation of center frequency, and filling of appropriate bandwidth in the channel switch wrapper when the channel switch is done to a 320 MHz channel. Signed-off-by: Ramya Gnanasekar <quic_rgnanase@quicinc.com>
-rw-r--r--hostapd/ctrl_iface.c30
-rw-r--r--src/ap/drv_callbacks.c3
-rw-r--r--src/ap/hostapd.c4
-rw-r--r--src/ap/ieee802_11.c5
4 files changed, 40 insertions, 2 deletions
diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index eb813d04a..b5a1c8a5d 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -2546,6 +2546,36 @@ static int hostapd_ctrl_check_freq_params(struct hostapd_freq_params *params,
return -1;
}
break;
+ case 320:
+ if (!params->center_freq1 || params->center_freq2 ||
+ !params->sec_channel_offset)
+ return -1;
+
+ switch (params->sec_channel_offset) {
+ case 1:
+ if (params->freq + 150 != params->center_freq1 &&
+ params->freq + 110 != params->center_freq1 &&
+ params->freq + 70 != params->center_freq1 &&
+ params->freq + 30 != params->center_freq1 &&
+ params->freq - 10 != params->center_freq1 &&
+ params->freq - 50 != params->center_freq1 &&
+ params->freq - 90 != params->center_freq1 &&
+ params->freq - 130 != params->center_freq1)
+ return -1;
+ break;
+ case -1:
+ if (params->freq + 130 != params->center_freq1 &&
+ params->freq + 90 != params->center_freq1 &&
+ params->freq + 50 != params->center_freq1 &&
+ params->freq + 10 != params->center_freq1 &&
+ params->freq - 30 != params->center_freq1 &&
+ params->freq - 70 != params->center_freq1 &&
+ params->freq - 110 != params->center_freq1 &&
+ params->freq - 150 != params->center_freq1)
+ return -1;
+ break;
+ }
+ break;
default:
return -1;
}
diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index 6a044c542..7da5c524c 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -978,7 +978,8 @@ void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
hapd->iconf->ch_switch_eht_config = 0;
if (width == CHAN_WIDTH_40 || width == CHAN_WIDTH_80 ||
- width == CHAN_WIDTH_80P80 || width == CHAN_WIDTH_160)
+ width == CHAN_WIDTH_80P80 || width == CHAN_WIDTH_160 ||
+ width == CHAN_WIDTH_320)
hapd->iconf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
else if (width == CHAN_WIDTH_20 || width == CHAN_WIDTH_20_NOHT)
hapd->iconf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c
index aaf8d5e3c..ef8800c8c 100644
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -3601,6 +3601,7 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd,
case 40:
case 80:
case 160:
+ case 320:
conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
break;
default:
@@ -3673,6 +3674,9 @@ static int hostapd_fill_csa_settings(struct hostapd_data *hapd,
case 160:
bandwidth = CONF_OPER_CHWIDTH_160MHZ;
break;
+ case 320:
+ bandwidth = CONF_OPER_CHWIDTH_320MHZ;
+ break;
default:
bandwidth = CONF_OPER_CHWIDTH_USE_HT;
break;
diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
index 0fa19debf..908e97105 100644
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -6347,7 +6347,7 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid)
!hapd->cs_freq_params.eht_enabled))
return eid;
- /* bandwidth: 0: 40, 1: 80, 2: 160, 3: 80+80 */
+ /* bandwidth: 0: 40, 1: 80, 2: 160, 3: 80+80, 4: 320 */
switch (hapd->cs_freq_params.bandwidth) {
case 40:
bw = 0;
@@ -6362,6 +6362,9 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid)
case 160:
bw = 2;
break;
+ case 320:
+ bw = 4;
+ break;
default:
/* not valid VHT bandwidth or not in CSA */
return eid;