From 44a35be85c4b8f9c09d0fae724c20f0cfb74c15f Mon Sep 17 00:00:00 2001 From: nbd Date: Thu, 21 Jan 2010 23:38:49 +0000 Subject: [PATCH] mac80211: fix multi-bss related rx handling bug git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19260 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches/580-mac80211_rxdata_fix.patch | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 package/mac80211/patches/580-mac80211_rxdata_fix.patch 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 000000000..5d9756247 --- /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);