Преглед изворни кода

mac80211: fix multi-bss related rx handling bug

SVN-Revision: 19260
Felix Fietkau пре 16 година
родитељ
комит
9237420b79
1 измењених фајлова са 72 додато и 0 уклоњено
  1. 72 0
      package/mac80211/patches/580-mac80211_rxdata_fix.patch

+ 72 - 0
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);