mac80211: fix multi-bss related rx handling bug
authorFelix Fietkau <nbd@openwrt.org>
Thu, 21 Jan 2010 23:38:49 +0000 (23:38 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 21 Jan 2010 23:38:49 +0000 (23:38 +0000)
SVN-Revision: 19260

package/mac80211/patches/580-mac80211_rxdata_fix.patch [new file with mode: 0644]

diff --git a/package/mac80211/patches/580-mac80211_rxdata_fix.patch b/package/mac80211/patches/580-mac80211_rxdata_fix.patch
new file mode 100644 (file)
index 0000000..5d97562
--- /dev/null
@@ -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);