From: Felix Fietkau Date: Thu, 21 Jan 2010 23:38:49 +0000 (+0000) Subject: mac80211: fix multi-bss related rx handling bug X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=9237420b798a66d285a6728890101eceabdd4db2;p=librecmc%2Flibrecmc.git mac80211: fix multi-bss related rx handling bug SVN-Revision: 19260 --- 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);