Fix IBSS scanning in mac80211 (rhbz 883414)
This commit is contained in:
parent
8a3c3fe290
commit
2df5ebe9f2
12
kernel.spec
12
kernel.spec
@ -62,7 +62,7 @@ Summary: The Linux kernel
|
|||||||
# For non-released -rc kernels, this will be appended after the rcX and
|
# For non-released -rc kernels, this will be appended after the rcX and
|
||||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||||
#
|
#
|
||||||
%global baserelease 2
|
%global baserelease 3
|
||||||
%global fedora_build %{baserelease}
|
%global fedora_build %{baserelease}
|
||||||
|
|
||||||
# base_sublevel is the kernel version we're starting with and patching
|
# base_sublevel is the kernel version we're starting with and patching
|
||||||
@ -774,6 +774,9 @@ Patch21234: Revert-8139cp-revert-set-ring-address-before-enabling.patch
|
|||||||
Patch21232: 8139cp-set-ring-address-after-enabling-C-mode.patch
|
Patch21232: 8139cp-set-ring-address-after-enabling-C-mode.patch
|
||||||
Patch21233: 8139cp-re-enable-interrupts-after-tx-timeout.patch
|
Patch21233: 8139cp-re-enable-interrupts-after-tx-timeout.patch
|
||||||
|
|
||||||
|
#rhbz 883414
|
||||||
|
Patch21236: mac80211-fix-ibss-scanning.patch
|
||||||
|
|
||||||
# END OF PATCH DEFINITIONS
|
# END OF PATCH DEFINITIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -1491,6 +1494,10 @@ ApplyPatch Revert-8139cp-revert-set-ring-address-before-enabling.patch
|
|||||||
ApplyPatch 8139cp-set-ring-address-after-enabling-C-mode.patch
|
ApplyPatch 8139cp-set-ring-address-after-enabling-C-mode.patch
|
||||||
ApplyPatch 8139cp-re-enable-interrupts-after-tx-timeout.patch
|
ApplyPatch 8139cp-re-enable-interrupts-after-tx-timeout.patch
|
||||||
|
|
||||||
|
#rhbz 883414
|
||||||
|
ApplyPatch mac80211-fix-ibss-scanning.patch
|
||||||
|
|
||||||
|
|
||||||
# END OF PATCH APPLICATIONS
|
# END OF PATCH APPLICATIONS
|
||||||
|
|
||||||
%endif
|
%endif
|
||||||
@ -2358,6 +2365,9 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Dec 11 2012 Josh Boyer <jwboyer@redhat.com>
|
||||||
|
- Fix IBSS scanning in mac80211 (rhbz 883414)
|
||||||
|
|
||||||
* Tue Dec 11 2012 Dave Jones <davej@redhat.com> - 3.7.0-2
|
* Tue Dec 11 2012 Dave Jones <davej@redhat.com> - 3.7.0-2
|
||||||
- Reenable debugging options.
|
- Reenable debugging options.
|
||||||
|
|
||||||
|
132
mac80211-fix-ibss-scanning.patch
Normal file
132
mac80211-fix-ibss-scanning.patch
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
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=49411
|
||||||
|
|
||||||
|
Reported-by: Jesse Kahtava <jesse_kahtava@f-m.fm>
|
||||||
|
Reported-by: Mikko Rapeli <mikko.rapeli@iki.fi>
|
||||||
|
Cc: stable@vger.kernel.org
|
||||||
|
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
||||||
|
---
|
||||||
|
net/mac80211/ibss.c | 9 ++++-----
|
||||||
|
net/mac80211/ieee80211_i.h | 6 +++---
|
||||||
|
net/mac80211/scan.c | 34 ++++++++++++++++++++++++----------
|
||||||
|
3 files changed, 31 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
|
||||||
|
index c21e33d..d9df6b8 100644
|
||||||
|
--- a/net/mac80211/ibss.c
|
||||||
|
+++ b/net/mac80211/ibss.c
|
||||||
|
@@ -678,8 +678,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
|
||||||
|
sdata_info(sdata,
|
||||||
|
"No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
|
||||||
|
|
||||||
|
- ieee80211_request_internal_scan(sdata,
|
||||||
|
- ifibss->ssid, ifibss->ssid_len, NULL);
|
||||||
|
+ ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
|
||||||
|
+ NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
|
||||||
|
@@ -777,9 +777,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
|
||||||
|
IEEE80211_SCAN_INTERVAL)) {
|
||||||
|
sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
|
||||||
|
|
||||||
|
- ieee80211_request_internal_scan(sdata,
|
||||||
|
- ifibss->ssid, ifibss->ssid_len,
|
||||||
|
- ifibss->fixed_channel ? ifibss->channel : NULL);
|
||||||
|
+ ieee80211_request_ibss_scan(sdata, ifibss->ssid,
|
||||||
|
+ ifibss->ssid_len, chan);
|
||||||
|
} else {
|
||||||
|
int interval = IEEE80211_SCAN_INTERVAL;
|
||||||
|
|
||||||
|
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
|
||||||
|
index 156e583..bc48d4d 100644
|
||||||
|
--- a/net/mac80211/ieee80211_i.h
|
||||||
|
+++ b/net/mac80211/ieee80211_i.h
|
||||||
|
@@ -1247,9 +1247,9 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
|
/* scan/BSS handling */
|
||||||
|
void ieee80211_scan_work(struct work_struct *work);
|
||||||
|
-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
- const u8 *ssid, u8 ssid_len,
|
||||||
|
- struct ieee80211_channel *chan);
|
||||||
|
+int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
+ const u8 *ssid, u8 ssid_len,
|
||||||
|
+ struct ieee80211_channel *chan);
|
||||||
|
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct cfg80211_scan_request *req);
|
||||||
|
void ieee80211_scan_cancel(struct ieee80211_local *local);
|
||||||
|
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
|
||||||
|
index 43e60b5..fab706f 100644
|
||||||
|
--- a/net/mac80211/scan.c
|
||||||
|
+++ b/net/mac80211/scan.c
|
||||||
|
@@ -819,9 +819,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
- const u8 *ssid, u8 ssid_len,
|
||||||
|
- struct ieee80211_channel *chan)
|
||||||
|
+int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
+ const u8 *ssid, u8 ssid_len,
|
||||||
|
+ struct ieee80211_channel *chan)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
int ret = -EBUSY;
|
||||||
|
@@ -835,22 +835,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
|
/* fill internal scan request */
|
||||||
|
if (!chan) {
|
||||||
|
- int i, nchan = 0;
|
||||||
|
+ int i, max_n;
|
||||||
|
+ int n_ch = 0;
|
||||||
|
|
||||||
|
for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
|
||||||
|
if (!local->hw.wiphy->bands[band])
|
||||||
|
continue;
|
||||||
|
- for (i = 0;
|
||||||
|
- i < local->hw.wiphy->bands[band]->n_channels;
|
||||||
|
- i++) {
|
||||||
|
- local->int_scan_req->channels[nchan] =
|
||||||
|
+
|
||||||
|
+ max_n = local->hw.wiphy->bands[band]->n_channels;
|
||||||
|
+ for (i = 0; i < max_n; i++) {
|
||||||
|
+ struct ieee80211_channel *tmp_ch =
|
||||||
|
&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 {
|
||||||
|
+ 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->n_channels = 1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.7.1
|
||||||
|
|
||||||
|
--
|
||||||
|
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
|
||||||
|
the body of a message to majordomo@vger.kernel.org
|
||||||
|
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
Loading…
Reference in New Issue
Block a user