Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Aug 2011 14:43:37 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r224798 - user/adrian/if_ath_tx/sys/dev/ath
Message-ID:  <201108121443.p7CEhbPt068009@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Fri Aug 12 14:43:37 2011
New Revision: 224798
URL: http://svn.freebsd.org/changeset/base/224798

Log:
  Don't assign sequence numbers to null qos frames.
  
  This creates a 1 packet hole in the receivers BAW, which causes packets to get received
  but put in the reassembly queue.

Modified:
  user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c

Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c
==============================================================================
--- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Fri Aug 12 14:26:47 2011	(r224797)
+++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c	Fri Aug 12 14:43:37 2011	(r224798)
@@ -1627,8 +1627,8 @@ ath_tx_tid_unsched(struct ath_softc *sc,
 
 /*
  * Assign a sequence number manually to the given frame.
- * 
- * This should only be called for A-MPDU TX frames. 
+ *
+ * This should only be called for A-MPDU TX frames.
  */
 static ieee80211_seq
 ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni,
@@ -1637,6 +1637,7 @@ ath_tx_tid_seqno_assign(struct ath_softc
 	struct ieee80211_frame *wh;
 	int tid, pri;
 	ieee80211_seq seqno;
+	uint8_t subtype;
 
 	/* TID lookup */
 	wh = mtod(m0, struct ieee80211_frame *);
@@ -1645,13 +1646,28 @@ ath_tx_tid_seqno_assign(struct ath_softc
 	DPRINTF(sc, ATH_DEBUG_SW_TX, "%s: pri=%d, tid=%d, qos has seq=%d\n",
 	    __func__, pri, tid, IEEE80211_QOS_HAS_SEQ(wh));
 
+	/* XXX Is it a control frame? Ignore */
+
 	/* Does the packet require a sequence number? */
 	if (! IEEE80211_QOS_HAS_SEQ(wh))
 		return -1;
 
-	/* Manually assign sequence number */
-	seqno = ni->ni_txseqs[tid];
-	INCR(ni->ni_txseqs[tid], IEEE80211_SEQ_RANGE);
+	/*
+	 * Is it a QOS NULL Data frame? Give it a sequence number of 0x0.
+	 * The RX path of everything I've looked at doesn't include the NULL
+	 * data frame sequence number in the aggregation state updates, so
+	 * assigning it a sequence number there will cause a BAW hole on the
+	 * RX side.
+	 */
+	/* XXX use the global sequence number instead? */
+	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
+	if (subtype == IEEE80211_FC0_SUBTYPE_QOS_NULL) {
+		seqno = 0;
+	} else {
+		/* Manually assign sequence number */
+		seqno = ni->ni_txseqs[tid];
+		INCR(ni->ni_txseqs[tid], IEEE80211_SEQ_RANGE);
+	}
 	*(uint16_t *)&wh->i_seq[0] = htole16(seqno << IEEE80211_SEQ_SEQ_SHIFT);
 	M_SEQNO_SET(m0, seqno);
 



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