summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches')
-rw-r--r--package/mac80211/patches/580-mac80211_rxdata_fix.patch72
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 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);