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>
This commit is contained in:
Ramya Gnanasekar 2023-04-03 07:04:57 +05:30 committed by Jouni Malinen
parent 4d0743d5e5
commit 8f8f68ba67
4 changed files with 40 additions and 2 deletions

View file

@ -2546,6 +2546,36 @@ static int hostapd_ctrl_check_freq_params(struct hostapd_freq_params *params,
return -1; return -1;
} }
break; 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: default:
return -1; return -1;
} }

View file

@ -978,7 +978,8 @@ void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
hapd->iconf->ch_switch_eht_config = 0; hapd->iconf->ch_switch_eht_config = 0;
if (width == CHAN_WIDTH_40 || width == CHAN_WIDTH_80 || 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; hapd->iconf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
else if (width == CHAN_WIDTH_20 || width == CHAN_WIDTH_20_NOHT) else if (width == CHAN_WIDTH_20 || width == CHAN_WIDTH_20_NOHT)
hapd->iconf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; hapd->iconf->ht_capab &= ~HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;

View file

@ -3601,6 +3601,7 @@ static int hostapd_change_config_freq(struct hostapd_data *hapd,
case 40: case 40:
case 80: case 80:
case 160: case 160:
case 320:
conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET; conf->ht_capab |= HT_CAP_INFO_SUPP_CHANNEL_WIDTH_SET;
break; break;
default: default:
@ -3673,6 +3674,9 @@ static int hostapd_fill_csa_settings(struct hostapd_data *hapd,
case 160: case 160:
bandwidth = CONF_OPER_CHWIDTH_160MHZ; bandwidth = CONF_OPER_CHWIDTH_160MHZ;
break; break;
case 320:
bandwidth = CONF_OPER_CHWIDTH_320MHZ;
break;
default: default:
bandwidth = CONF_OPER_CHWIDTH_USE_HT; bandwidth = CONF_OPER_CHWIDTH_USE_HT;
break; break;

View file

@ -6347,7 +6347,7 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid)
!hapd->cs_freq_params.eht_enabled)) !hapd->cs_freq_params.eht_enabled))
return eid; 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) { switch (hapd->cs_freq_params.bandwidth) {
case 40: case 40:
bw = 0; bw = 0;
@ -6362,6 +6362,9 @@ u8 * hostapd_eid_wb_chsw_wrapper(struct hostapd_data *hapd, u8 *eid)
case 160: case 160:
bw = 2; bw = 2;
break; break;
case 320:
bw = 4;
break;
default: default:
/* not valid VHT bandwidth or not in CSA */ /* not valid VHT bandwidth or not in CSA */
return eid; return eid;