git: 1375790a15b1 - main - net80211: add IEEE80211_IS_QOS_NULL()

From: Adrian Chadd <adrian_at_FreeBSD.org>
Date: Tue, 19 Nov 2024 04:52:52 UTC
The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=1375790a15b122518b779b111c18ee2da5702728

commit 1375790a15b122518b779b111c18ee2da5702728
Author:     Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2024-11-17 06:06:11 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2024-11-19 04:50:17 +0000

    net80211: add IEEE80211_IS_QOS_NULL()
    
    This will be useful when fixing up the sequence number generation
    and checks, as the rules around how sequence numbers are generated
    have been clarified in 802.11-2016 and later.  QoS-NULL frames are
    explicitly marked as "any sequence number".
    
    But for now, just create a macro and use it in the one place
    it's currently being used as a check - ath(4).
    
    * Add IEEE80211_IS_QOS_NULL().
    * Change the "will this frame go into the TX block-ack window" check
      in the ath(4) transmit path.  Note this changes the check to be
      more specific, but both paths already had previous checks to ensure
      they're QoS data frames.
    
    Locally tested:
    
    * ath(4), AR9380, STA mode w/ AMPDU TX/RX enabled and negotiated
    
    Differential Revision: https://reviews.freebsd.org/D47645
---
 sys/dev/ath/if_ath_tx.c  |  4 ++--
 sys/net80211/ieee80211.h | 10 ++++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/sys/dev/ath/if_ath_tx.c b/sys/dev/ath/if_ath_tx.c
index 1ec23972f283..1559b66a7c7d 100644
--- a/sys/dev/ath/if_ath_tx.c
+++ b/sys/dev/ath/if_ath_tx.c
@@ -2050,7 +2050,7 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni,
 		 */
 		if (IEEE80211_QOS_HAS_SEQ(wh) &&
 		    (! IEEE80211_IS_MULTICAST(wh->i_addr1)) &&
-		    (subtype != IEEE80211_FC0_SUBTYPE_QOS_NULL)) {
+		    (! IEEE80211_IS_QOS_NULL(wh))) {
 			bf->bf_state.bfs_dobaw = 1;
 		}
 	}
@@ -2991,7 +2991,7 @@ ath_tx_tid_seqno_assign(struct ath_softc *sc, struct ieee80211_node *ni,
 	 * RX side.
 	 */
 	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
-	if (subtype == IEEE80211_FC0_SUBTYPE_QOS_NULL) {
+	if (IEEE80211_IS_QOS_NULL(wh)) {
 		/* XXX no locking for this TID? This is a bit of a problem. */
 		seqno = ni->ni_txseqs[IEEE80211_NONQOS_TID];
 		INCR(ni->ni_txseqs[IEEE80211_NONQOS_TID], IEEE80211_SEQ_RANGE);
diff --git a/sys/net80211/ieee80211.h b/sys/net80211/ieee80211.h
index eb83d0a40a33..e62b8c16d68f 100644
--- a/sys/net80211/ieee80211.h
+++ b/sys/net80211/ieee80211.h
@@ -274,6 +274,16 @@ struct ieee80211_qosframe_addr4 {
 	 IEEE80211_FC0_TYPE_DATA,			\
 	 IEEE80211_FC0_SUBTYPE_QOS_DATA))
 
+/*
+ * Return true if this frame is a QoS NULL data frame.
+ */
+#define	IEEE80211_IS_QOS_NULL(wh)			\
+	(IEEE80211_IS_FC0_CHECK_VER_TYPE_SUBTYPE(wh,	\
+	 IEEE80211_FC0_VERSION_0,			\
+	 IEEE80211_FC0_TYPE_DATA,			\
+	 IEEE80211_FC0_SUBTYPE_QOS_NULL))
+
+
 #define	IEEE80211_FC1_DIR_MASK			0x03
 #define	IEEE80211_FC1_DIR_NODS			0x00	/* STA->STA */
 #define	IEEE80211_FC1_DIR_TODS			0x01	/* STA->AP  */