Date: Wed, 21 Sep 2011 16:47:08 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r225716 - user/adrian/if_ath_tx/sys/net80211 Message-ID: <201109211647.p8LGl8SQ083502@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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)) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201109211647.p8LGl8SQ083502>