Commit 5ca99e71 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Greg Kroah-Hartman

mac80211: fix ibss scanning

commit 34bcf715 upstream.

Do not scan on no-IBSS and disabled channels in IBSS mode. Doing this
can trigger Microcode errors on iwlwifi and iwlegacy drivers.

Also rename ieee80211_request_internal_scan() function since it is only
used in IBSS mode and simplify calling it from ieee80211_sta_find_ibss().

This patch should address:
https://bugzilla.redhat.com/show_bug.cgi?id=883414
https://bugzilla.kernel.org/show_bug.cgi?id=49411Reported-by: default avatarJesse Kahtava <jesse_kahtava@f-m.fm>
Reported-by: default avatarMikko Rapeli  <mikko.rapeli@iki.fi>
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4a3b5681
...@@ -664,8 +664,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata) ...@@ -664,8 +664,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other " printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
"IBSS networks with same SSID (merge)\n", sdata->name); "IBSS networks with same SSID (merge)\n", sdata->name);
ieee80211_request_internal_scan(sdata, ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
ifibss->ssid, ifibss->ssid_len, NULL); NULL);
} }
static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata) static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
...@@ -772,9 +772,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) ...@@ -772,9 +772,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to " printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
"join\n", sdata->name); "join\n", sdata->name);
ieee80211_request_internal_scan(sdata, ieee80211_request_ibss_scan(sdata, ifibss->ssid,
ifibss->ssid, ifibss->ssid_len, ifibss->ssid_len, chan);
ifibss->fixed_channel ? ifibss->channel : NULL);
} else { } else {
int interval = IEEE80211_SCAN_INTERVAL; int interval = IEEE80211_SCAN_INTERVAL;
......
...@@ -1233,7 +1233,7 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, ...@@ -1233,7 +1233,7 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
/* scan/BSS handling */ /* scan/BSS handling */
void ieee80211_scan_work(struct work_struct *work); void ieee80211_scan_work(struct work_struct *work);
int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
const u8 *ssid, u8 ssid_len, const u8 *ssid, u8 ssid_len,
struct ieee80211_channel *chan); struct ieee80211_channel *chan);
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
......
...@@ -761,7 +761,7 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, ...@@ -761,7 +761,7 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
return res; return res;
} }
int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
const u8 *ssid, u8 ssid_len, const u8 *ssid, u8 ssid_len,
struct ieee80211_channel *chan) struct ieee80211_channel *chan)
{ {
...@@ -777,22 +777,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, ...@@ -777,22 +777,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
/* fill internal scan request */ /* fill internal scan request */
if (!chan) { if (!chan) {
int i, nchan = 0; int i, max_n;
int n_ch = 0;
for (band = 0; band < IEEE80211_NUM_BANDS; band++) { for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
if (!local->hw.wiphy->bands[band]) if (!local->hw.wiphy->bands[band])
continue; continue;
for (i = 0;
i < local->hw.wiphy->bands[band]->n_channels; max_n = local->hw.wiphy->bands[band]->n_channels;
i++) { for (i = 0; i < max_n; i++) {
local->int_scan_req->channels[nchan] = struct ieee80211_channel *tmp_ch =
&local->hw.wiphy->bands[band]->channels[i]; &local->hw.wiphy->bands[band]->channels[i];
nchan++;
if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
IEEE80211_CHAN_DISABLED))
continue;
local->int_scan_req->channels[n_ch] = tmp_ch;
n_ch++;
} }
} }
local->int_scan_req->n_channels = nchan; if (WARN_ON_ONCE(n_ch == 0))
goto unlock;
local->int_scan_req->n_channels = n_ch;
} else { } else {
if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
IEEE80211_CHAN_DISABLED)))
goto unlock;
local->int_scan_req->channels[0] = chan; local->int_scan_req->channels[0] = chan;
local->int_scan_req->n_channels = 1; local->int_scan_req->n_channels = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment