From 55413ce072aaf52d583e36e5401a51857cb9ab1f Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 28 Jun 2015 18:14:58 +0300 Subject: [PATCH] P2P: Do not allow 40 MHz co-ex PRI/SEC switch to force MCC Do not allow 40 MHz co-ex PRI/SEC switch to force us to change our PRI channel if we have an existing connection on the selected PRI channel since doing multi-channel concurrency is likely to cause more harm than using different PRI/SEC selection in environment with multiple BSSes on these two channels with mixed 20 MHz or PRI channel selection. Signed-off-by: Jouni Malinen --- src/ap/ap_config.h | 1 + src/ap/hw_features.c | 10 ++++++++-- wpa_supplicant/ap.c | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index c14eeda4b..2e7c1380b 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -619,6 +619,7 @@ struct hostapd_config { u16 ht_capab; int ieee80211n; int secondary_channel; + int no_pri_sec_switch; int require_ht; int obss_interval; u32 vht_capab; diff --git a/src/ap/hw_features.c b/src/ap/hw_features.c index 28324a8ee..7cb7e8804 100644 --- a/src/ap/hw_features.c +++ b/src/ap/hw_features.c @@ -260,8 +260,14 @@ static int ieee80211n_check_40mhz_5g(struct hostapd_iface *iface, res = check_40mhz_5g(iface->current_mode, scan_res, pri_chan, sec_chan); - if (res == 2) - ieee80211n_switch_pri_sec(iface); + if (res == 2) { + if (iface->conf->no_pri_sec_switch) { + wpa_printf(MSG_DEBUG, + "Cannot switch PRI/SEC channels due to local constraint"); + } else { + ieee80211n_switch_pri_sec(iface); + } + } return !!res; } diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index f3960c5eb..aaea52428 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -142,6 +142,29 @@ void wpa_supplicant_conf_ap_ht(struct wpa_supplicant *wpa_s, } } } + + if (conf->secondary_channel) { + struct wpa_supplicant *iface; + + for (iface = wpa_s->global->ifaces; iface; iface = iface->next) + { + if (iface == wpa_s || + iface->wpa_state < WPA_AUTHENTICATING || + (int) iface->assoc_freq != ssid->frequency) + continue; + + /* + * Do not allow 40 MHz co-ex PRI/SEC switch to force us + * to change our PRI channel since we have an existing, + * concurrent connection on that channel and doing + * multi-channel concurrency is likely to cause more + * harm than using different PRI/SEC selection in + * environment with multiple BSSes on these two channels + * with mixed 20 MHz or PRI channel selection. + */ + conf->no_pri_sec_switch = 1; + } + } #endif /* CONFIG_IEEE80211N */ }