diff mbox

wpa_supplicant: call frequency conflict handling during auth

Message ID 1398318340-31142-8-git-send-email-ilan.peer@intel.com
State Accepted
Headers show

Commit Message

Peer, Ilan April 24, 2014, 5:45 a.m. UTC
Currently, the frequency conflict is handled only during the
association flow. However, some drivers, e.g., mac80211 based
drivers, will fail an authentication request in case that there
are no available channels for use (as they might be used by
other interfaces), and thus the frequency conflict resolution
is never called.

Fix this by calling frequency conflict resolution during
authentication.

In addition get the shared radio frequency from the wpa_s
context and not from the driver.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
---
 wpa_supplicant/sme.c            |   26 ++++++++++++++++++++++++++
 wpa_supplicant/wpa_supplicant.c |    8 +++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

Comments

Jouni Malinen April 24, 2014, 9:49 a.m. UTC | #1
On Thu, Apr 24, 2014 at 08:45:40AM +0300, Ilan Peer wrote:
> Currently, the frequency conflict is handled only during the
> association flow. However, some drivers, e.g., mac80211 based
> drivers, will fail an authentication request in case that there
> are no available channels for use (as they might be used by
> other interfaces), and thus the frequency conflict resolution
> is never called.
> 
> Fix this by calling frequency conflict resolution during
> authentication.
> 
> In addition get the shared radio frequency from the wpa_s
> context and not from the driver.

Thanks, applied.
diff mbox

Patch

diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c
index 2538ba0..9b6667a 100644
--- a/wpa_supplicant/sme.c
+++ b/wpa_supplicant/sme.c
@@ -416,6 +416,32 @@  static void sme_send_authentication(struct wpa_supplicant *wpa_s,
 	if (old_ssid != wpa_s->current_ssid)
 		wpas_notify_network_changed(wpa_s);
 
+#ifdef CONFIG_P2P
+	/*
+	 * If multi-channel concurrency is not supported, check for any
+	 * frequency conflict. In case of any frequency conflict, remove the
+	 * least prioritized connection.
+	 */
+	if (wpa_s->num_multichan_concurrent < 2) {
+		int freq, num;
+		num = get_shared_radio_freqs(wpa_s, &freq, 1);
+		if (num > 0 && freq > 0 && freq != params.freq) {
+			wpa_printf(MSG_DEBUG,
+				   "Conflicting frequency found (%d != %d)",
+				   freq, params.freq);
+			if (wpas_p2p_handle_frequency_conflicts(wpa_s,
+								params.freq,
+								ssid) < 0) {
+				wpas_connection_failed(wpa_s, bss->bssid);
+				wpa_supplicant_mark_disassoc(wpa_s);
+				wpabuf_free(resp);
+				wpas_connect_work_done(wpa_s);
+				return;
+			}
+		}
+	}
+#endif /* CONFIG_P2P */
+
 	wpa_s->sme.auth_alg = params.auth_alg;
 	if (wpa_drv_authenticate(wpa_s, &params) < 0) {
 		wpa_msg(wpa_s, MSG_INFO, "SME: Authentication request to the "
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 6e67ef7..0a89baa 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -1822,9 +1822,11 @@  static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
 	 * least prioritized connection.
 	 */
 	if (wpa_s->num_multichan_concurrent < 2) {
-		int freq = wpa_drv_shared_freq(wpa_s);
-		if (freq > 0 && freq != params.freq) {
-			wpa_printf(MSG_DEBUG, "Shared interface with conflicting frequency found (%d != %d)",
+		int freq, num;
+		num = get_shared_radio_freqs(wpa_s, &freq, 1);
+		if (num > 0 && freq > 0 && freq != params.freq) {
+			wpa_printf(MSG_DEBUG,
+				   "Assoc conflicting freq found (%d != %d)",
 				   freq, params.freq);
 			if (wpas_p2p_handle_frequency_conflicts(wpa_s,
 								params.freq,