Module Name: src Committed By: martin Date: Sun May 15 09:07:57 UTC 2016
Modified Files: src/sys/net80211 [netbsd-7]: ieee80211_input.c Log Message: Pull up following revision(s) (requested by mlelstv in ticket #1167): sys/net80211/ieee80211_input.c: revision 1.83-1.84 Don't check sequence number on multicast packets in station mode. Handle overflow of 12bit sequence number. In station mode filter packets that or not for us in case the interface is in promiscous mode or doesn't filter packets itself. To generate a diff of this commit: cvs rdiff -u -r1.77 -r1.77.4.1 src/sys/net80211/ieee80211_input.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net80211/ieee80211_input.c diff -u src/sys/net80211/ieee80211_input.c:1.77 src/sys/net80211/ieee80211_input.c:1.77.4.1 --- src/sys/net80211/ieee80211_input.c:1.77 Fri Sep 13 20:19:53 2013 +++ src/sys/net80211/ieee80211_input.c Sun May 15 09:07:57 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ieee80211_input.c,v 1.77 2013/09/13 20:19:53 joerg Exp $ */ +/* $NetBSD: ieee80211_input.c,v 1.77.4.1 2016/05/15 09:07:57 martin Exp $ */ /*- * Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting @@ -36,7 +36,7 @@ __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.81 2005/08/10 16:22:29 sam Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.77 2013/09/13 20:19:53 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.77.4.1 2016/05/15 09:07:57 martin Exp $"); #endif #include "opt_inet.h" @@ -224,6 +224,18 @@ ieee80211_input(struct ieee80211com *ic, ic->ic_stats.is_rx_wrongbss++; goto out; } + + /* Filter out packets not directed to us in case the + * device is in promiscous mode + */ + if ((! IEEE80211_IS_MULTICAST(wh->i_addr1)) + && (! IEEE80211_ADDR_EQ(wh->i_addr1, ic->ic_myaddr))) { + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + bssid, NULL, "not to cur sta: lladdr=%6D, addr1=%6D", + ic->ic_myaddr, ":", wh->i_addr1, ":"); + ic->ic_stats.is_rx_wrongbss++; + goto out; + } break; case IEEE80211_M_IBSS: case IEEE80211_M_AHDEMO: @@ -280,8 +292,11 @@ ieee80211_input(struct ieee80211com *ic, } ni->ni_rssi = rssi; ni->ni_rstamp = rstamp; - if (HAS_SEQ(type)) { - u_int8_t tid; + if (HAS_SEQ(type) && (ic->ic_opmode != IEEE80211_M_STA || + !IEEE80211_IS_MULTICAST(wh->i_addr1))) { + u_int8_t tid, retry; + u_int16_t rxno, orxno; + if (ieee80211_has_qos(wh)) { tid = ((struct ieee80211_qosframe *)wh)-> i_qos[0] & IEEE80211_QOS_TID; @@ -291,15 +306,20 @@ ieee80211_input(struct ieee80211com *ic, } else tid = 0; rxseq = le16toh(*(u_int16_t *)wh->i_seq); - if ((wh->i_fc[1] & IEEE80211_FC1_RETRY) && - SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) { + retry = wh->i_fc[1] & IEEE80211_FC1_RETRY; + rxno = rxseq >> IEEE80211_SEQ_SEQ_SHIFT; + orxno = ni->ni_rxseqs[tid] >> IEEE80211_SEQ_SEQ_SHIFT; + if (retry && ( + (orxno == 4095 && rxno == orxno) || + (orxno != 4095 && + SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) + )) { /* duplicate, discard */ IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, bssid, "duplicate", "seqno <%u,%u> fragno <%u,%u> tid %u", - rxseq >> IEEE80211_SEQ_SEQ_SHIFT, - ni->ni_rxseqs[tid] >> - IEEE80211_SEQ_SEQ_SHIFT, + rxno, + orxno, rxseq & IEEE80211_SEQ_FRAG_MASK, ni->ni_rxseqs[tid] & IEEE80211_SEQ_FRAG_MASK,