diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-01-21 23:38:49 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2010-01-21 23:38:49 +0000 |
commit | 2dedf7dcbd82903a3447927ab2764bfe5127fd9a (patch) | |
tree | 23d8e38de7d36260dad45956cded1859b6dfd30b /package/mac80211 | |
parent | f9680422a7b0df77ce778d56960f165173d8615b (diff) | |
download | upstream-2dedf7dcbd82903a3447927ab2764bfe5127fd9a.tar.gz upstream-2dedf7dcbd82903a3447927ab2764bfe5127fd9a.tar.bz2 upstream-2dedf7dcbd82903a3447927ab2764bfe5127fd9a.zip |
mac80211: fix multi-bss related rx handling bug
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19260 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211')
-rw-r--r-- | package/mac80211/patches/580-mac80211_rxdata_fix.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/package/mac80211/patches/580-mac80211_rxdata_fix.patch b/package/mac80211/patches/580-mac80211_rxdata_fix.patch new file mode 100644 index 0000000000..5d9756247c --- /dev/null +++ b/package/mac80211/patches/580-mac80211_rxdata_fix.patch @@ -0,0 +1,72 @@ +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2348,22 +2348,6 @@ static void __ieee80211_rx_handle_packet + sdata->vif.type == NL80211_IFTYPE_AP_VLAN) + continue; + +- rx.sta = sta_info_get(sdata, hdr->addr2); +- +- rx.flags |= IEEE80211_RX_RA_MATCH; +- prepares = prepare_for_handlers(sdata, &rx, hdr); +- +- if (!prepares) +- continue; +- +- if (status->flag & RX_FLAG_MMIC_ERROR) { +- rx.sdata = sdata; +- if (rx.flags & IEEE80211_RX_RA_MATCH) +- ieee80211_rx_michael_mic_report(hdr, +- &rx); +- continue; +- } +- + /* + * frame is destined for this interface, but if it's + * not also for the previous one we handle that after +@@ -2375,6 +2359,22 @@ static void __ieee80211_rx_handle_packet + continue; + } + ++ rx.sta = sta_info_get(prev, hdr->addr2); ++ ++ rx.flags |= IEEE80211_RX_RA_MATCH; ++ prepares = prepare_for_handlers(prev, &rx, hdr); ++ ++ if (!prepares) ++ goto next; ++ ++ if (status->flag & RX_FLAG_MMIC_ERROR) { ++ rx.sdata = prev; ++ if (rx.flags & IEEE80211_RX_RA_MATCH) ++ ieee80211_rx_michael_mic_report(hdr, ++ &rx); ++ goto next; ++ } ++ + /* + * frame was destined for the previous interface + * so invoke RX handlers for it +@@ -2387,11 +2387,22 @@ static void __ieee80211_rx_handle_packet + "multicast frame for %s\n", + wiphy_name(local->hw.wiphy), + prev->name); +- continue; ++ goto next; + } + ieee80211_invoke_rx_handlers(prev, &rx, skb_new, rate); ++next: + prev = sdata; + } ++ ++ if (prev) { ++ rx.sta = sta_info_get(prev, hdr->addr2); ++ ++ rx.flags |= IEEE80211_RX_RA_MATCH; ++ prepares = prepare_for_handlers(prev, &rx, hdr); ++ ++ if (!prepares) ++ prev = NULL; ++ } + } + if (prev) + ieee80211_invoke_rx_handlers(prev, &rx, skb, rate); |