ACS: Introduce acs_get_bw_center_chan()
When using 40/80/160 MHz bandwidth, instead of computing the index of the segment center freq based on the selected channel, lets look it up in the bw_desc[] table. This is preparative work to allow selecting a primary channel which is not the first of the segment. Signed-off-by: Nicolas Escande <nico.escande@gmail.com>
This commit is contained in:
parent
ed8e13decc
commit
60e2934cbf
1 changed files with 27 additions and 6 deletions
33
src/ap/acs.c
33
src/ap/acs.c
|
@ -436,6 +436,21 @@ static bool acs_usable_bw_chan(const struct hostapd_channel_data *chan,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int acs_get_bw_center_chan(int freq, enum bw_type bw)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
while (bw_desc[bw][i].first != -1) {
|
||||||
|
if (freq >= bw_desc[bw][i].first &&
|
||||||
|
freq <= bw_desc[bw][i].last)
|
||||||
|
return bw_desc[bw][i].center_chan;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int acs_survey_is_sufficient(struct freq_survey *survey)
|
static int acs_survey_is_sufficient(struct freq_survey *survey)
|
||||||
{
|
{
|
||||||
if (!(survey->filled & SURVEY_HAS_NF)) {
|
if (!(survey->filled & SURVEY_HAS_NF)) {
|
||||||
|
@ -944,19 +959,26 @@ bw_selected:
|
||||||
|
|
||||||
static void acs_adjust_center_freq(struct hostapd_iface *iface)
|
static void acs_adjust_center_freq(struct hostapd_iface *iface)
|
||||||
{
|
{
|
||||||
int offset;
|
int center;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "ACS: Adjusting VHT center frequency");
|
wpa_printf(MSG_DEBUG, "ACS: Adjusting VHT center frequency");
|
||||||
|
|
||||||
switch (hostapd_get_oper_chwidth(iface->conf)) {
|
switch (hostapd_get_oper_chwidth(iface->conf)) {
|
||||||
case CONF_OPER_CHWIDTH_USE_HT:
|
case CONF_OPER_CHWIDTH_USE_HT:
|
||||||
offset = 2 * iface->conf->secondary_channel;
|
if (iface->conf->secondary_channel &&
|
||||||
|
iface->freq >= 2400 && iface->freq < 2500)
|
||||||
|
center = iface->conf->channel +
|
||||||
|
2 * iface->conf->secondary_channel;
|
||||||
|
else if (iface->conf->secondary_channel)
|
||||||
|
center = acs_get_bw_center_chan(iface->freq, ACS_BW40);
|
||||||
|
else
|
||||||
|
center = iface->conf->channel;
|
||||||
break;
|
break;
|
||||||
case CONF_OPER_CHWIDTH_80MHZ:
|
case CONF_OPER_CHWIDTH_80MHZ:
|
||||||
offset = 6;
|
center = acs_get_bw_center_chan(iface->freq, ACS_BW80);
|
||||||
break;
|
break;
|
||||||
case CONF_OPER_CHWIDTH_160MHZ:
|
case CONF_OPER_CHWIDTH_160MHZ:
|
||||||
offset = 14;
|
center = acs_get_bw_center_chan(iface->freq, ACS_BW160);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* TODO: How can this be calculated? Adjust
|
/* TODO: How can this be calculated? Adjust
|
||||||
|
@ -966,8 +988,7 @@ static void acs_adjust_center_freq(struct hostapd_iface *iface)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hostapd_set_oper_centr_freq_seg0_idx(iface->conf,
|
hostapd_set_oper_centr_freq_seg0_idx(iface->conf, center);
|
||||||
iface->conf->channel + offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue