]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
IBSS: Update operating frequency if joining an existing IBSS
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Thu, 19 Feb 2015 06:15:46 +0000 (07:15 +0100)
committerJouni Malinen <j@w1.fi>
Sat, 21 Feb 2015 14:07:53 +0000 (16:07 +0200)
If a matching IBSS is found in scan results, change requested frequency
to match and disable OBSS scan.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
wpa_supplicant/wpa_supplicant.c

index 2a0bf399510df35d8df51d82be499dc4f3b5054d..c1ec8a3fb0d13ced55011ec144c1dbbe7fad445e 100644 (file)
@@ -1654,6 +1654,13 @@ 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 +1671,35 @@ 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 (j = 0; j < wpa_s->last_scan_res_used; j++) {
+               struct wpa_bss *bss = wpa_s->last_scan_res[j];
+
+               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 &&
+                   os_memcmp(ssid->ssid, bss->ssid, bss->ssid_len) == 0) {
+                       wpa_printf(MSG_DEBUG,
+                                  "IBSS already found in scan results, adjust control freq: %d",
+                                  bss->freq);
+                       freq->freq = bss->freq;
+                       obss_scan = 0;
+                       break;
+               }
+       }
+
        /* For IBSS check HT_IBSS flag */
        if (ssid->mode == WPAS_MODE_IBSS &&
            !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_HT_IBSS))
@@ -1682,7 +1713,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 +1784,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);