diff mbox

[2/4] ibss: fix control freq if IBSS already found

Message ID 1424326548-5098-2-git-send-email-janusz.dziedzic@tieto.com
State Accepted
Headers show

Commit Message

Janusz.Dziedzic@tieto.com Feb. 19, 2015, 6:15 a.m. UTC
If IBSS already found in scan results change
requested frequency and disable OBSS scan.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
---
 wpa_supplicant/wpa_supplicant.c | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

Comments

Jouni Malinen Feb. 21, 2015, 10:24 a.m. UTC | #1
On Thu, Feb 19, 2015 at 07:15:46AM +0100, Janusz Dziedzic wrote:
> If IBSS already found in scan results change
> requested frequency and disable OBSS scan.

> @@ -1664,11 +1670,38 @@ void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
> +	/* Disable obss scan when fixed freq */
> +	if (ssid->fixed_freq)
> +		obss_scan = 0;

This does not look desirable. Why would fixed_freq=1 disable HT
co-existence requirements for channel bandwidth selection? I'm going to
drop this part.
diff mbox

Patch

diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 2a0bf39..926e8c0 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -1654,6 +1654,12 @@  void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
 }
 
 
+static int bss_is_ibss(struct wpa_bss *bss)
+{
+	return ((bss->caps & (IEEE80211_CAP_ESS | IEEE80211_CAP_IBSS)) ==
+		 IEEE80211_CAP_IBSS);
+}
+
 void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
 			  const struct wpa_ssid *ssid,
 			  struct hostapd_freq_params *freq)
@@ -1664,11 +1670,38 @@  void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
 			   184, 192 };
 	struct hostapd_channel_data *pri_chan = NULL, *sec_chan = NULL;
 	u8 channel;
-	int i, chan_idx, ht40 = -1, res;
+	int i, chan_idx, ht40 = -1, res, obss_scan = 1;
 	unsigned int j;
 
 	freq->freq = ssid->frequency;
 
+	for (i = 0; i < wpa_s->last_scan_res_used; i++) {
+		struct wpa_bss *bss = wpa_s->last_scan_res[i];
+
+		if (ssid->mode != WPAS_MODE_IBSS)
+			break;
+
+		/* Don't adjust control freq in case of fixed_freq */
+		if (ssid->fixed_freq)
+			break;
+
+		if (!bss_is_ibss(bss))
+			continue;
+
+		if (ssid->ssid_len == bss->ssid_len &&
+		    !memcmp(ssid->ssid, bss->ssid, bss->ssid_len)) {
+			wpa_printf(MSG_DEBUG, "IBSS already found in scan results, "
+					      "adjust control freq: %d", bss->freq);
+			freq->freq = bss->freq;
+			obss_scan = 0;
+			break;
+		}
+	}
+
+	/* Disable obss scan when fixed freq */
+	if (ssid->fixed_freq)
+		obss_scan = 0;
+
 	/* For IBSS check HT_IBSS flag */
 	if (ssid->mode == WPAS_MODE_IBSS &&
 	    !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
@@ -1682,7 +1715,7 @@  void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
 		return;
 	}
 
-	hw_mode = ieee80211_freq_to_chan(ssid->frequency, &channel);
+	hw_mode = ieee80211_freq_to_chan(freq->freq, &channel);
 	for (i = 0; wpa_s->hw.modes && i < wpa_s->hw.num_modes; i++) {
 		if (wpa_s->hw.modes[i].mode == hw_mode) {
 			mode = &wpa_s->hw.modes[i];
@@ -1753,7 +1786,7 @@  void ibss_mesh_setup_freq(struct wpa_supplicant *wpa_s,
 		break;
 	}
 
-	if (freq->sec_channel_offset) {
+	if (freq->sec_channel_offset && obss_scan) {
 		struct wpa_scan_results *scan_res;
 
 		scan_res = wpa_supplicant_get_scan_results(wpa_s, NULL, 0);