mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 17:18:59 +00:00
73 lines
1.8 KiB
Diff
73 lines
1.8 KiB
Diff
|
--- 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);
|