[PATCH] wpa_supplicant: call frequency conflict handling during auth

Ilan Peer ilan.peer
Wed Apr 23 22:45:40 PDT 2014


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 at intel.com>
---
 wpa_supplicant/sme.c            |   26 ++++++++++++++++++++++++++
 wpa_supplicant/wpa_supplicant.c |    8 +++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

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,
-- 
1.7.10.4




More information about the Hostap mailing list