[patch] net80211: reject STA frames not destined to the current STA VAP MAC address

Adrian Chadd adrian at freebsd.org
Wed Oct 26 14:28:40 UTC 2011


Hi,

This patch rejects frames that are sent to a STA with an incorrect
destination MAC.
This is to fix an issue with the AR9160 in STA mode where it
occasionally leaks frames destined to other stations. This then
updates the crypto IV state and last received sequence number, causing
subsequent frames from the correct MAC to be dropped inside net80211.

It's also needed if we decide (eventually) to support >1 STA VAP.

I'd like to merge this to -9 and -8, in case there are other AR9160 STA users.

Thanks,


Adrian


Index: ieee80211_sta.c
===================================================================
--- ieee80211_sta.c     (.../head/sys/net80211) (revision 226789)
+++ ieee80211_sta.c     (.../user/adrian/if_ath_tx/sys/net80211)
 (revision 226789)
@@ -50,6 +50,8 @@
 #include <net/if.h>
 #include <net/if_media.h>
 #include <net/if_llc.h>
+#include <net/if_dl.h>
+#include <net/if_var.h>
 #include <net/ethernet.h>

 #include <net/bpf.h>
@@ -584,6 +584,30 @@
                        vap->iv_stats.is_rx_wrongbss++;
                        goto out;
                }
+
+               /*
+                * Some devices may be in a promiscuous mode
+                * where they receive frames for multiple station
+                * addresses.
+                *
+                * If we receive a data frame that isn't
+                * destined to our VAP MAC, drop it.
+                *
+                * XXX TODO: This is only enforced when not scanning;
+                * XXX it assumes a software-driven scan will put the NIC
+                * XXX into a "no data frames" mode before setting this
+                * XXX flag. Otherwise it may be possible that we'll still
+                * XXX process data frames whilst scanning.
+                */
+               if ((! IEEE80211_IS_MULTICAST(wh->i_addr1))
+                   && (! IEEE80211_ADDR_EQ(wh->i_addr1, IF_LLADDR(ifp)))) {
+                       IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
+                           bssid, NULL, "not to cur sta: lladdr=%6D,
addr1=%6D",
+                           IF_LLADDR(ifp), ":", wh->i_addr1, ":");
+                       vap->iv_stats.is_rx_wrongbss++;
+                       goto out;
+               }
+
                IEEE80211_RSSI_LPF(ni->ni_avgrssi, rssi);
                ni->ni_noise = nf;
                if (HAS_SEQ(type) && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {


More information about the freebsd-wireless mailing list