Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Mar 2016 06:47:21 +0000 (UTC)
From:      Andriy Voskoboinyk <avos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r296254 - head/sys/net80211
Message-ID:  <201603010647.u216lLKg065904@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avos
Date: Tue Mar  1 06:47:21 2016
New Revision: 296254
URL: https://svnweb.freebsd.org/changeset/base/296254

Log:
  net80211: eliminate copy-paste nearby ieee80211_check_rxseq()
  
  Approved by:	adrian (mentor)
  Differential Revision:	https://reviews.freebsd.org/D4043

Modified:
  head/sys/net80211/ieee80211_adhoc.c
  head/sys/net80211/ieee80211_hostap.c
  head/sys/net80211/ieee80211_input.h
  head/sys/net80211/ieee80211_mesh.c
  head/sys/net80211/ieee80211_sta.c
  head/sys/net80211/ieee80211_wds.c

Modified: head/sys/net80211/ieee80211_adhoc.c
==============================================================================
--- head/sys/net80211/ieee80211_adhoc.c	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_adhoc.c	Tue Mar  1 06:47:21 2016	(r296254)
@@ -302,7 +302,6 @@ adhoc_input(struct ieee80211_node *ni, s
 	int hdrspace, need_tap = 1;	/* mbuf need to be tapped. */	
 	uint8_t dir, type, subtype, qos;
 	uint8_t *bssid;
-	uint16_t rxseq;
 
 	if (m->m_flags & M_AMPDU_MPDU) {
 		/*
@@ -421,24 +420,8 @@ adhoc_input(struct ieee80211_node *ni, s
 			if (IEEE80211_QOS_HAS_SEQ(wh) &&
 			    TID_TO_WME_AC(tid) >= WME_AC_VI)
 				ic->ic_wme.wme_hipri_traffic++;
-			rxseq = le16toh(*(uint16_t *)wh->i_seq);
-			if (! ieee80211_check_rxseq(ni, wh)) {
-				/* duplicate, discard */
-				IEEE80211_DISCARD_MAC(vap, 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,
-				    rxseq & IEEE80211_SEQ_FRAG_MASK,
-				    ni->ni_rxseqs[tid] &
-					IEEE80211_SEQ_FRAG_MASK,
-				    tid);
-				vap->iv_stats.is_rx_dup++;
-				IEEE80211_NODE_STAT(ni, rx_dup);
+			if (! ieee80211_check_rxseq(ni, wh, bssid))
 				goto out;
-			}
-			ni->ni_rxseqs[tid] = rxseq;
 		}
 	}
 

Modified: head/sys/net80211/ieee80211_hostap.c
==============================================================================
--- head/sys/net80211/ieee80211_hostap.c	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_hostap.c	Tue Mar  1 06:47:21 2016	(r296254)
@@ -485,7 +485,6 @@ hostap_input(struct ieee80211_node *ni, 
 	int hdrspace, need_tap = 1;	/* mbuf need to be tapped. */
 	uint8_t dir, type, subtype, qos;
 	uint8_t *bssid;
-	uint16_t rxseq;
 
 	if (m->m_flags & M_AMPDU_MPDU) {
 		/*
@@ -573,24 +572,8 @@ hostap_input(struct ieee80211_node *ni, 
 			if (IEEE80211_QOS_HAS_SEQ(wh) &&
 			    TID_TO_WME_AC(tid) >= WME_AC_VI)
 				ic->ic_wme.wme_hipri_traffic++;
-			rxseq = le16toh(*(uint16_t *)wh->i_seq);
-			if (! ieee80211_check_rxseq(ni, wh)) {
-				/* duplicate, discard */
-				IEEE80211_DISCARD_MAC(vap, 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,
-				    rxseq & IEEE80211_SEQ_FRAG_MASK,
-				    ni->ni_rxseqs[tid] &
-					IEEE80211_SEQ_FRAG_MASK,
-				    tid);
-				vap->iv_stats.is_rx_dup++;
-				IEEE80211_NODE_STAT(ni, rx_dup);
+			if (! ieee80211_check_rxseq(ni, wh, bssid))
 				goto out;
-			}
-			ni->ni_rxseqs[tid] = rxseq;
 		}
 	}
 

Modified: head/sys/net80211/ieee80211_input.h
==============================================================================
--- head/sys/net80211/ieee80211_input.h	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_input.h	Tue Mar  1 06:47:21 2016	(r296254)
@@ -164,12 +164,14 @@ ishtinfooui(const uint8_t *frm)
  * but a retransmit since the initial packet didn't make it.
  */
 static __inline int
-ieee80211_check_rxseq(struct ieee80211_node *ni, struct ieee80211_frame *wh)
+ieee80211_check_rxseq(struct ieee80211_node *ni, struct ieee80211_frame *wh,
+    uint8_t *bssid)
 {
 #define	SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
 #define	SEQ_EQ(a,b)	((int)((a)-(b)) == 0)
 #define	SEQNO(a)	((a) >> IEEE80211_SEQ_SEQ_SHIFT)
 #define	FRAGNO(a)	((a) & IEEE80211_SEQ_FRAG_MASK)
+	struct ieee80211vap *vap = ni->ni_vap;
 	uint16_t rxseq;
 	uint8_t type, subtype;
 	uint8_t tid;
@@ -198,7 +200,7 @@ ieee80211_check_rxseq(struct ieee80211_n
 		/* HT nodes currently doing RX AMPDU are always valid */
 		if ((ni->ni_flags & IEEE80211_NODE_HT) &&
 		    (rap->rxa_flags & IEEE80211_AGGR_RUNNING))
-			return 1;
+			goto ok;
 	}
 
 	/*	
@@ -216,7 +218,7 @@ ieee80211_check_rxseq(struct ieee80211_n
 		 */
 		if (SEQ_EQ(rxseq, ni->ni_rxseqs[tid]) &&
 		    (wh->i_fc[1] & IEEE80211_FC1_RETRY))
-			return 0;
+			goto fail;
 		/*
 		 * Treat any subsequent frame as fine if the last seen frame
 		 * is 4095 and it's not a retransmit for the same sequence
@@ -224,7 +226,7 @@ ieee80211_check_rxseq(struct ieee80211_n
 	 	 * fragments w/ sequence number 4095. It shouldn't be seen
 		 * in practice, but see the comment above for further info.
 		 */
-		return 1;
+		goto ok;
 	}
 
 	/*
@@ -233,9 +235,23 @@ ieee80211_check_rxseq(struct ieee80211_n
 	 */
 	if ((wh->i_fc[1] & IEEE80211_FC1_RETRY) &&
 	    SEQ_LEQ(rxseq, ni->ni_rxseqs[tid]))
-		return 0;
+		goto fail;
+
+ok:
+	ni->ni_rxseqs[tid] = rxseq;
 
 	return 1;
+
+fail:
+	/* duplicate, discard */
+	IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, bssid, "duplicate",
+	    "seqno <%u,%u> fragno <%u,%u> tid %u",
+	     SEQNO(rxseq),  SEQNO(ni->ni_rxseqs[tid]),
+	    FRAGNO(rxseq), FRAGNO(ni->ni_rxseqs[tid]), tid);
+	vap->iv_stats.is_rx_dup++;
+	IEEE80211_NODE_STAT(ni, rx_dup);
+
+	return 0;
 #undef	SEQ_LEQ
 #undef	SEQ_EQ
 #undef	SEQNO

Modified: head/sys/net80211/ieee80211_mesh.c
==============================================================================
--- head/sys/net80211/ieee80211_mesh.c	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_mesh.c	Tue Mar  1 06:47:21 2016	(r296254)
@@ -1537,7 +1537,6 @@ mesh_input(struct ieee80211_node *ni, st
 	uint32_t seq;
 	const uint8_t *addr;
 	uint8_t qos[2];
-	ieee80211_seq rxseq;
 
 	KASSERT(ni != NULL, ("null node"));
 	ni->ni_inact = ni->ni_inact_reload;
@@ -1582,24 +1581,8 @@ mesh_input(struct ieee80211_node *ni, st
 			if (IEEE80211_QOS_HAS_SEQ(wh) &&
 			    TID_TO_WME_AC(tid) >= WME_AC_VI)
 				ic->ic_wme.wme_hipri_traffic++;
-			rxseq = le16toh(*(uint16_t *)wh->i_seq);
-			if (! ieee80211_check_rxseq(ni, wh)) {
-				/* duplicate, discard */
-				IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
-				    wh->i_addr1, "duplicate",
-				    "seqno <%u,%u> fragno <%u,%u> tid %u",
-				    rxseq >> IEEE80211_SEQ_SEQ_SHIFT,
-				    ni->ni_rxseqs[tid] >>
-				    IEEE80211_SEQ_SEQ_SHIFT,
-				    rxseq & IEEE80211_SEQ_FRAG_MASK,
-				    ni->ni_rxseqs[tid] &
-				    IEEE80211_SEQ_FRAG_MASK,
-				    tid);
-				vap->iv_stats.is_rx_dup++;
-				IEEE80211_NODE_STAT(ni, rx_dup);
+			if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1))
 				goto out;
-			}
-			ni->ni_rxseqs[tid] = rxseq;
 		}
 	}
 #ifdef IEEE80211_DEBUG

Modified: head/sys/net80211/ieee80211_sta.c
==============================================================================
--- head/sys/net80211/ieee80211_sta.c	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_sta.c	Tue Mar  1 06:47:21 2016	(r296254)
@@ -538,7 +538,6 @@ sta_input(struct ieee80211_node *ni, str
 	int hdrspace, need_tap = 1;	/* mbuf need to be tapped. */
 	uint8_t dir, type, subtype, qos;
 	uint8_t *bssid;
-	uint16_t rxseq;
 
 	if (m->m_flags & M_AMPDU_MPDU) {
 		/*
@@ -630,24 +629,8 @@ sta_input(struct ieee80211_node *ni, str
 			if (IEEE80211_QOS_HAS_SEQ(wh) &&
 			    TID_TO_WME_AC(tid) >= WME_AC_VI)
 				ic->ic_wme.wme_hipri_traffic++;
-			rxseq = le16toh(*(uint16_t *)wh->i_seq);
-			if (! ieee80211_check_rxseq(ni, wh)) {
-				/* duplicate, discard */
-				IEEE80211_DISCARD_MAC(vap, 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,
-				    rxseq & IEEE80211_SEQ_FRAG_MASK,
-				    ni->ni_rxseqs[tid] &
-					IEEE80211_SEQ_FRAG_MASK,
-				    tid);
-				vap->iv_stats.is_rx_dup++;
-				IEEE80211_NODE_STAT(ni, rx_dup);
+			if (! ieee80211_check_rxseq(ni, wh, bssid))
 				goto out;
-			}
-			ni->ni_rxseqs[tid] = rxseq;
 		}
 	}
 

Modified: head/sys/net80211/ieee80211_wds.c
==============================================================================
--- head/sys/net80211/ieee80211_wds.c	Tue Mar  1 05:15:26 2016	(r296253)
+++ head/sys/net80211/ieee80211_wds.c	Tue Mar  1 06:47:21 2016	(r296254)
@@ -416,7 +416,6 @@ wds_input(struct ieee80211_node *ni, str
 	struct ether_header *eh;
 	int hdrspace, need_tap = 1;	/* mbuf need to be tapped. */
 	uint8_t dir, type, subtype, qos;
-	uint16_t rxseq;
 
 	if (m->m_flags & M_AMPDU_MPDU) {
 		/*
@@ -494,22 +493,8 @@ wds_input(struct ieee80211_node *ni, str
 		if (IEEE80211_QOS_HAS_SEQ(wh) &&
 		    TID_TO_WME_AC(tid) >= WME_AC_VI)
 			ic->ic_wme.wme_hipri_traffic++;
-		rxseq = le16toh(*(uint16_t *)wh->i_seq);
-		if (! ieee80211_check_rxseq(ni, wh)) {
-			/* duplicate, discard */
-			IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT,
-			    wh->i_addr1, "duplicate",
-			    "seqno <%u,%u> fragno <%u,%u> tid %u",
-			    rxseq >> IEEE80211_SEQ_SEQ_SHIFT,
-			    ni->ni_rxseqs[tid] >> IEEE80211_SEQ_SEQ_SHIFT,
-			    rxseq & IEEE80211_SEQ_FRAG_MASK,
-			    ni->ni_rxseqs[tid] & IEEE80211_SEQ_FRAG_MASK,
-			    tid);
-			vap->iv_stats.is_rx_dup++;
-			IEEE80211_NODE_STAT(ni, rx_dup);
+		if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1))
 			goto out;
-		}
-		ni->ni_rxseqs[tid] = rxseq;
 	}
 	switch (type) {
 	case IEEE80211_FC0_TYPE_DATA:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201603010647.u216lLKg065904>