summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-08-03 01:46:47 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2007-08-03 01:46:47 +0000
commitc52d9838a4fb7695b0e674bf96065548ddd4b007 (patch)
treeea4c894d08eca66d0f98eae55d6553aedb6d3976
parent5ce36cbb20aa8d96145a1fe5e9e59794224c82df (diff)
add a fix for skb_put_over in beacon handling code
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@8325 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/madwifi/patches/130-chanswitch_beacon_fix_PR_1477.patch42
1 files changed, 42 insertions, 0 deletions
diff --git a/package/madwifi/patches/130-chanswitch_beacon_fix_PR_1477.patch b/package/madwifi/patches/130-chanswitch_beacon_fix_PR_1477.patch
new file mode 100644
index 000000000..7ed64c610
--- /dev/null
+++ b/package/madwifi/patches/130-chanswitch_beacon_fix_PR_1477.patch
@@ -0,0 +1,42 @@
+Signed-off-by: Andrew Lunn <andrew@lunn.ch>
+
+Index: trunk/net80211/ieee80211_beacon.c
+===================================================================
+--- trunk/net80211/ieee80211_beacon.c (revision 2631)
++++ trunk/net80211/ieee80211_beacon.c (working copy)
+@@ -305,13 +305,17 @@
+ */
+ c = ieee80211_doth_findchan(vap, ic->ic_chanchange_chan);
+ if (c == NULL) {
++ /*
++ * The channel we have been requested to change to
++ * is not valid. Drop the channel switch annoucement
++ * from the beacon and don't change channel.
++ */
+ IEEE80211_DPRINTF(vap, IEEE80211_MSG_DOTH,
+- "%s: find channel failure\n", __func__);
+- IEEE80211_UNLOCK_IRQ_EARLY(ic);
+- return 0;
++ "%s: find channel failure\n",
++ __func__);
++ } else {
++ ic->ic_bsschan = c;
+ }
+- ic->ic_bsschan = c;
+-
+ skb_pull(skb, sizeof(struct ieee80211_frame));
+ skb_trim(skb, 0);
+ frm = skb->data;
+@@ -321,8 +325,10 @@
+ vap->iv_flags &= ~IEEE80211_F_CHANSWITCH;
+ ic->ic_flags &= ~IEEE80211_F_CHANSWITCH;
+
+- /* NB: only for the first VAP to get here */
+- if (ic->ic_curchan != c) {
++ /* NB: only for the first VAP to get here, and we have a valid
++ * new channel to change to.
++ */
++ if (c && ic->ic_curchan != c) {
+ ic->ic_curchan = c;
+ ic->ic_set_channel(ic);
+ }