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,

Reply via email to