svn commit: r225716 - user/adrian/if_ath_tx/sys/net80211

Adrian Chadd adrian at FreeBSD.org
Wed Sep 21 16:47:09 UTC 2011


Author: adrian
Date: Wed Sep 21 16:47:08 2011
New Revision: 225716
URL: http://svn.freebsd.org/changeset/base/225716

Log:
  Add a temporary workaround to filter out some of the STA issues
  I'm seeing in busy 11n tests.
  
  I'm occasionally seeing frames destined for other STA's pop up
  from the AR9160 NIC. But I'm not seeing it from an AR9280 NIC
  which is also in STA mode.
  
  What would thus happen:
  
  * the frame would most likely end up entering via
    ieee80211_input_all();
  * It would be punted to the bss node of each VAP;
  * It would attempt to be decrypted, and may result in the
    rsc being bumped to a high value and thus causing subsequent
    frames to fail to be RX'ed due to a suspected replay attack;
  * It may also end up bumping the TID sequence number,
    causing subsequent valid frames to also be dropped for being
    out of sequence.
  
  It's quite possible that this is all the result of some subtle
  descriptor corruption in the ath driver....

Modified:
  user/adrian/if_ath_tx/sys/net80211/ieee80211_sta.c

Modified: user/adrian/if_ath_tx/sys/net80211/ieee80211_sta.c
==============================================================================
--- user/adrian/if_ath_tx/sys/net80211/ieee80211_sta.c	Wed Sep 21 13:22:36 2011	(r225715)
+++ user/adrian/if_ath_tx/sys/net80211/ieee80211_sta.c	Wed Sep 21 16:47:08 2011	(r225716)
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
 #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>
@@ -582,6 +584,25 @@ sta_input(struct ieee80211_node *ni, str
 			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.
+		 */
+		if (ni == vap->iv_bss
+		    && (!(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 svn-src-user mailing list