[PATCH 2/4] ibss: fix control freq if IBSS already found
Janusz Dziedzic
janusz.dziedzic
Wed Feb 18 22:15:46 PST 2015
If IBSS already found in scan results change
requested frequency and disable OBSS scan.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic at tieto.com>
---
wpa_supplicant/wpa_supplicant.c | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
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);
--
1.9.1
More information about the Hostap
mailing list