Add ACS support for 60 GHz channel bonding
hostapd will trigger EDMG auto channel selection by setting QCA_WLAN_VENDOR_ATTR_ACS_EDMG_ENABLED. The 60 GHz driver will be called to start an auto channel selection and will return the primary channel and the EDMG channel. Signed-off-by: Noam Shaked <nshaked@codeaurora.org>
This commit is contained in:
parent
634bc4e6df
commit
e520de8dbe
5 changed files with 19 additions and 5 deletions
|
@ -938,6 +938,7 @@ int hostapd_drv_do_acs(struct hostapd_data *hapd)
|
||||||
}
|
}
|
||||||
|
|
||||||
params.freq_list = freq_list;
|
params.freq_list = freq_list;
|
||||||
|
params.edmg_enabled = hapd->iface->conf->enable_edmg;
|
||||||
|
|
||||||
params.ht_enabled = !!(hapd->iface->conf->ieee80211n);
|
params.ht_enabled = !!(hapd->iface->conf->ieee80211n);
|
||||||
params.ht40_enabled = !!(hapd->iface->conf->ht_capab &
|
params.ht40_enabled = !!(hapd->iface->conf->ht_capab &
|
||||||
|
|
|
@ -1008,6 +1008,8 @@ void hostapd_acs_channel_selected(struct hostapd_data *hapd,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hapd->iconf->edmg_channel = acs_res->edmg_channel;
|
||||||
|
|
||||||
if (hapd->iface->conf->ieee80211ac || hapd->iface->conf->ieee80211ax) {
|
if (hapd->iface->conf->ieee80211ac || hapd->iface->conf->ieee80211ax) {
|
||||||
/* set defaults for backwards compatibility */
|
/* set defaults for backwards compatibility */
|
||||||
hostapd_set_oper_centr_freq_seg1_idx(hapd->iconf, 0);
|
hostapd_set_oper_centr_freq_seg1_idx(hapd->iconf, 0);
|
||||||
|
|
|
@ -2329,6 +2329,9 @@ struct drv_acs_params {
|
||||||
|
|
||||||
/* ACS frequency list info */
|
/* ACS frequency list info */
|
||||||
const int *freq_list;
|
const int *freq_list;
|
||||||
|
|
||||||
|
/* Indicates whether EDMG is enabled */
|
||||||
|
int edmg_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct wpa_bss_trans_info {
|
struct wpa_bss_trans_info {
|
||||||
|
@ -5724,6 +5727,7 @@ union wpa_event_data {
|
||||||
* struct acs_selected_channels - Data for EVENT_ACS_CHANNEL_SELECTED
|
* struct acs_selected_channels - Data for EVENT_ACS_CHANNEL_SELECTED
|
||||||
* @pri_freq: Selected primary frequency
|
* @pri_freq: Selected primary frequency
|
||||||
* @sec_freq: Selected secondary frequency
|
* @sec_freq: Selected secondary frequency
|
||||||
|
* @edmg_channel: Selected EDMG channel
|
||||||
* @vht_seg0_center_ch: VHT mode Segment0 center channel
|
* @vht_seg0_center_ch: VHT mode Segment0 center channel
|
||||||
* The value is the index of the channel center frequency for
|
* The value is the index of the channel center frequency for
|
||||||
* 20 MHz, 40 MHz, and 80 MHz channels. The value is the center
|
* 20 MHz, 40 MHz, and 80 MHz channels. The value is the center
|
||||||
|
@ -5742,6 +5746,7 @@ union wpa_event_data {
|
||||||
struct acs_selected_channels {
|
struct acs_selected_channels {
|
||||||
unsigned int pri_freq;
|
unsigned int pri_freq;
|
||||||
unsigned int sec_freq;
|
unsigned int sec_freq;
|
||||||
|
u8 edmg_channel;
|
||||||
u8 vht_seg0_center_ch;
|
u8 vht_seg0_center_ch;
|
||||||
u8 vht_seg1_center_ch;
|
u8 vht_seg1_center_ch;
|
||||||
u16 ch_width;
|
u16 ch_width;
|
||||||
|
|
|
@ -10436,16 +10436,18 @@ static int wpa_driver_do_acs(void *priv, struct drv_acs_params *params)
|
||||||
nla_put_u16(msg, QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH,
|
nla_put_u16(msg, QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH,
|
||||||
params->ch_width) ||
|
params->ch_width) ||
|
||||||
add_acs_ch_list(msg, params->freq_list) ||
|
add_acs_ch_list(msg, params->freq_list) ||
|
||||||
add_acs_freq_list(msg, params->freq_list)) {
|
add_acs_freq_list(msg, params->freq_list) ||
|
||||||
|
(params->edmg_enabled &&
|
||||||
|
nla_put_flag(msg, QCA_WLAN_VENDOR_ATTR_ACS_EDMG_ENABLED))) {
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
return -ENOBUFS;
|
return -ENOBUFS;
|
||||||
}
|
}
|
||||||
nla_nest_end(msg, data);
|
nla_nest_end(msg, data);
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"nl80211: ACS Params: HW_MODE: %d HT: %d HT40: %d VHT: %d BW: %d",
|
"nl80211: ACS Params: HW_MODE: %d HT: %d HT40: %d VHT: %d BW: %d EDMG: %d",
|
||||||
params->hw_mode, params->ht_enabled, params->ht40_enabled,
|
params->hw_mode, params->ht_enabled, params->ht40_enabled,
|
||||||
params->vht_enabled, params->ch_width);
|
params->vht_enabled, params->ch_width, params->edmg_enabled);
|
||||||
|
|
||||||
ret = send_and_recv_msgs(drv, msg, NULL, NULL);
|
ret = send_and_recv_msgs(drv, msg, NULL, NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -1855,6 +1855,9 @@ static void qca_nl80211_acs_select_ch(struct wpa_driver_nl80211_data *drv,
|
||||||
event.acs_selected_channels.hw_mode);
|
event.acs_selected_channels.hw_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tb[QCA_WLAN_VENDOR_ATTR_ACS_EDMG_CHANNEL])
|
||||||
|
event.acs_selected_channels.edmg_channel =
|
||||||
|
nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_EDMG_CHANNEL]);
|
||||||
if (tb[QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL])
|
if (tb[QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL])
|
||||||
event.acs_selected_channels.vht_seg0_center_ch =
|
event.acs_selected_channels.vht_seg0_center_ch =
|
||||||
nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL]);
|
nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_ACS_VHT_SEG0_CENTER_CHANNEL]);
|
||||||
|
@ -1865,13 +1868,14 @@ static void qca_nl80211_acs_select_ch(struct wpa_driver_nl80211_data *drv,
|
||||||
event.acs_selected_channels.ch_width =
|
event.acs_selected_channels.ch_width =
|
||||||
nla_get_u16(tb[QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH]);
|
nla_get_u16(tb[QCA_WLAN_VENDOR_ATTR_ACS_CHWIDTH]);
|
||||||
wpa_printf(MSG_INFO,
|
wpa_printf(MSG_INFO,
|
||||||
"nl80211: ACS Results: PFreq: %d SFreq: %d BW: %d VHT0: %d VHT1: %d HW_MODE: %d",
|
"nl80211: ACS Results: PFreq: %d SFreq: %d BW: %d VHT0: %d VHT1: %d HW_MODE: %d EDMGCH: %d",
|
||||||
event.acs_selected_channels.pri_freq,
|
event.acs_selected_channels.pri_freq,
|
||||||
event.acs_selected_channels.sec_freq,
|
event.acs_selected_channels.sec_freq,
|
||||||
event.acs_selected_channels.ch_width,
|
event.acs_selected_channels.ch_width,
|
||||||
event.acs_selected_channels.vht_seg0_center_ch,
|
event.acs_selected_channels.vht_seg0_center_ch,
|
||||||
event.acs_selected_channels.vht_seg1_center_ch,
|
event.acs_selected_channels.vht_seg1_center_ch,
|
||||||
event.acs_selected_channels.hw_mode);
|
event.acs_selected_channels.hw_mode,
|
||||||
|
event.acs_selected_channels.edmg_channel);
|
||||||
|
|
||||||
/* Ignore ACS channel list check for backwards compatibility */
|
/* Ignore ACS channel list check for backwards compatibility */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue