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);
 |