wpa_supplicant: Enable Automatic Channel Selection support for AP mode
Since hostapd supports ACS now, let's enable its support in wpa_supplicant as well when starting AP mode. Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com> [u.oelmann@pengutronix.de: rebased series from hostap_2_1~944 to master] [u.oelmann@pengutronix.de: adjusted added text in defconfig] Signed-off-by: Ulrich Ölmann <u.oelmann@pengutronix.de>
This commit is contained in:
parent
96bc508684
commit
d99097177a
10 changed files with 81 additions and 2 deletions
|
@ -549,8 +549,8 @@ void hostapd_event_connect_failed_reason(struct hostapd_data *hapd,
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_ACS
|
#ifdef CONFIG_ACS
|
||||||
static void hostapd_acs_channel_selected(struct hostapd_data *hapd,
|
void hostapd_acs_channel_selected(struct hostapd_data *hapd,
|
||||||
struct acs_selected_channels *acs_res)
|
struct acs_selected_channels *acs_res)
|
||||||
{
|
{
|
||||||
int ret, i;
|
int ret, i;
|
||||||
|
|
||||||
|
|
|
@ -496,6 +496,8 @@ void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
|
||||||
struct survey_results;
|
struct survey_results;
|
||||||
void hostapd_event_get_survey(struct hostapd_iface *iface,
|
void hostapd_event_get_survey(struct hostapd_iface *iface,
|
||||||
struct survey_results *survey_results);
|
struct survey_results *survey_results);
|
||||||
|
void hostapd_acs_channel_selected(struct hostapd_data *hapd,
|
||||||
|
struct acs_selected_channels *acs_res);
|
||||||
|
|
||||||
const struct hostapd_eap_user *
|
const struct hostapd_eap_user *
|
||||||
hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
|
hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
|
||||||
|
|
|
@ -857,6 +857,12 @@ OBJS += src/ap/peerkey_auth.c
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_ACS
|
||||||
|
L_CFLAGS += -DCONFIG_ACS
|
||||||
|
OBJS += src/ap/acs.c
|
||||||
|
LIBS += -lm
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PCSC
|
ifdef CONFIG_PCSC
|
||||||
# PC/SC interface for smartcards (USIM, GSM SIM)
|
# PC/SC interface for smartcards (USIM, GSM SIM)
|
||||||
L_CFLAGS += -DPCSC_FUNCS -I/usr/include/PCSC
|
L_CFLAGS += -DPCSC_FUNCS -I/usr/include/PCSC
|
||||||
|
|
|
@ -884,6 +884,12 @@ OBJS += ../src/ap/peerkey_auth.o
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_ACS
|
||||||
|
CFLAGS += -DCONFIG_ACS
|
||||||
|
OBJS += ../src/ap/acs.o
|
||||||
|
LIBS += -lm
|
||||||
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_PCSC
|
ifdef CONFIG_PCSC
|
||||||
# PC/SC interface for smartcards (USIM, GSM SIM)
|
# PC/SC interface for smartcards (USIM, GSM SIM)
|
||||||
CFLAGS += -DPCSC_FUNCS -I/usr/include/PCSC
|
CFLAGS += -DPCSC_FUNCS -I/usr/include/PCSC
|
||||||
|
|
|
@ -213,6 +213,14 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
|
||||||
if (wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf))
|
if (wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
if (ssid->acs) {
|
||||||
|
/* Setting channel to 0 in order to enable ACS */
|
||||||
|
conf->channel = 0;
|
||||||
|
wpa_printf(MSG_DEBUG, "Use automatic channel selection");
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
|
|
||||||
if (ieee80211_is_dfs(ssid->frequency) && wpa_s->conf->country[0]) {
|
if (ieee80211_is_dfs(ssid->frequency) && wpa_s->conf->country[0]) {
|
||||||
conf->ieee80211h = 1;
|
conf->ieee80211h = 1;
|
||||||
conf->ieee80211d = 1;
|
conf->ieee80211d = 1;
|
||||||
|
@ -558,6 +566,11 @@ static void wpas_ap_configured_cb(void *ctx)
|
||||||
{
|
{
|
||||||
struct wpa_supplicant *wpa_s = ctx;
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
if (wpa_s->current_ssid && wpa_s->current_ssid->acs)
|
||||||
|
wpa_s->assoc_freq = wpa_s->ap_iface->freq;
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
|
|
||||||
wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
|
wpa_supplicant_set_state(wpa_s, WPA_COMPLETED);
|
||||||
|
|
||||||
if (wpa_s->ap_configured_cb)
|
if (wpa_s->ap_configured_cb)
|
||||||
|
|
|
@ -1920,6 +1920,9 @@ static const struct parse_data ssid_fields[] = {
|
||||||
{ INT_RANGE(mixed_cell, 0, 1) },
|
{ INT_RANGE(mixed_cell, 0, 1) },
|
||||||
{ INT_RANGE(frequency, 0, 65000) },
|
{ INT_RANGE(frequency, 0, 65000) },
|
||||||
{ INT_RANGE(fixed_freq, 0, 1) },
|
{ INT_RANGE(fixed_freq, 0, 1) },
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
{ INT_RANGE(acs, 0, 1) },
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
#ifdef CONFIG_MESH
|
#ifdef CONFIG_MESH
|
||||||
{ FUNC(mesh_basic_rates) },
|
{ FUNC(mesh_basic_rates) },
|
||||||
{ INT(dot11MeshMaxRetries) },
|
{ INT(dot11MeshMaxRetries) },
|
||||||
|
|
|
@ -747,6 +747,9 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid)
|
||||||
INT(no_auto_peer);
|
INT(no_auto_peer);
|
||||||
INT(frequency);
|
INT(frequency);
|
||||||
INT(fixed_freq);
|
INT(fixed_freq);
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
INT(acs);
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1);
|
write_int(f, "proactive_key_caching", ssid->proactive_key_caching, -1);
|
||||||
INT(disabled);
|
INT(disabled);
|
||||||
INT(peerkey);
|
INT(peerkey);
|
||||||
|
|
|
@ -431,6 +431,18 @@ struct wpa_ssid {
|
||||||
*/
|
*/
|
||||||
int fixed_freq;
|
int fixed_freq;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
/**
|
||||||
|
* ACS - Automatic Channel Selection for AP mode
|
||||||
|
*
|
||||||
|
* If present, it will be handled together with frequency.
|
||||||
|
* frequency will be used to determine hardware mode only, when it is
|
||||||
|
* used for both hardware mode and channel when used alone. This will
|
||||||
|
* force the channel to be set to 0, thus enabling ACS.
|
||||||
|
*/
|
||||||
|
int acs;
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mesh_basic_rates - BSS Basic rate set for mesh network
|
* mesh_basic_rates - BSS Basic rate set for mesh network
|
||||||
*
|
*
|
||||||
|
|
|
@ -513,3 +513,29 @@ CONFIG_PEERKEY=y
|
||||||
|
|
||||||
# OS X builds. This is only for building eapol_test.
|
# OS X builds. This is only for building eapol_test.
|
||||||
#CONFIG_OSX=y
|
#CONFIG_OSX=y
|
||||||
|
|
||||||
|
# Automatic Channel Selection
|
||||||
|
# This will allow wpa_supplicant to pick the channel automatically when channel
|
||||||
|
# is set to "0".
|
||||||
|
#
|
||||||
|
# TODO: Extend parser to be able to parse "channel=acs_survey" as an alternative
|
||||||
|
# to "channel=0". This would enable us to eventually add other ACS algorithms in
|
||||||
|
# similar way.
|
||||||
|
#
|
||||||
|
# Automatic selection is currently only done through initialization, later on
|
||||||
|
# we hope to do background checks to keep us moving to more ideal channels as
|
||||||
|
# time goes by. ACS is currently only supported through the nl80211 driver and
|
||||||
|
# your driver must have survey dump capability that is filled by the driver
|
||||||
|
# during scanning.
|
||||||
|
#
|
||||||
|
# TODO: In analogy to hostapd be able to customize the ACS survey algorithm with
|
||||||
|
# a newly to create wpa_supplicant.conf variable acs_num_scans.
|
||||||
|
#
|
||||||
|
# Supported ACS drivers:
|
||||||
|
# * ath9k
|
||||||
|
# * ath5k
|
||||||
|
# * ath10k
|
||||||
|
#
|
||||||
|
# For more details refer to:
|
||||||
|
# http://wireless.kernel.org/en/users/Documentation/acs
|
||||||
|
#CONFIG_ACS=y
|
||||||
|
|
|
@ -3946,6 +3946,14 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
|
||||||
&data->survey_results);
|
&data->survey_results);
|
||||||
#endif /* CONFIG_AP */
|
#endif /* CONFIG_AP */
|
||||||
break;
|
break;
|
||||||
|
case EVENT_ACS_CHANNEL_SELECTED:
|
||||||
|
#ifdef CONFIG_ACS
|
||||||
|
if (!wpa_s->ap_iface)
|
||||||
|
break;
|
||||||
|
hostapd_acs_channel_selected(wpa_s->ap_iface->bss[0],
|
||||||
|
&data->acs_selected_channels);
|
||||||
|
#endif /* CONFIG_ACS */
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
wpa_msg(wpa_s, MSG_INFO, "Unknown event %d", event);
|
wpa_msg(wpa_s, MSG_INFO, "Unknown event %d", event);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue