Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 May 2017 00:43:52 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r318566 - head/sys/net80211
Message-ID:  <201705200043.v4K0hqjB015092@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sat May 20 00:43:52 2017
New Revision: 318566
URL: https://svnweb.freebsd.org/changeset/base/318566

Log:
  [net80211] prepare for A-MSDU/A-MPDU offload crypto / sequence number checking.
  
  When doing AMSDU offload, the driver (for now!) presents 802.11 frames with
  the same sequence number and crypto sequence number / IV values up to the stack.
  But, this will trip afoul over the sequence number detection.
  
  So drivers now have a way to signify that a frame is part of an offloaded
  AMSDU group, so we can just ensure that we pass those frames up to the
  stack.
  
  The logic will be a bit messy - the TL;DR will be that if it's part of
  the previously seen sequence number then it belongs in the same burst.
  But if we get a repeat of the same sequence number (eg we sent an ACK
  but the receiver didn't hear it) then we shouldn't be passing those frames
  up.  So, we can't just say "all subframes go up", we need to track
  whether we've seen the end of a burst of frames for the given sequence
  number or not, so we know whether to actually pass them up or not.
  
  The first part of doing all of this is to ensure the ieee80211_rx_stats
  struct is available in the RX sequence number check path and the
  RX ampdu reorder path.  So, start by passing the pointer into these
  functions to avoid doing another lookup.
  
  The actual support will come in a subsequent commit once I know the
  functionality actually works!

Modified:
  head/sys/net80211/ieee80211_adhoc.c
  head/sys/net80211/ieee80211_hostap.c
  head/sys/net80211/ieee80211_ht.c
  head/sys/net80211/ieee80211_ht.h
  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	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_adhoc.c	Sat May 20 00:43:52 2017	(r318566)
@@ -448,7 +448,7 @@ 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++;
-			if (! ieee80211_check_rxseq(ni, wh, bssid))
+			if (! ieee80211_check_rxseq(ni, wh, bssid, rxs))
 				goto out;
 		}
 	}
@@ -479,7 +479,7 @@ adhoc_input(struct ieee80211_node *ni, s
 		 * and we should do nothing more with it.
 		 */
 		if ((m->m_flags & M_AMPDU) &&
-		    ieee80211_ampdu_reorder(ni, m) != 0) {
+		    ieee80211_ampdu_reorder(ni, m, rxs) != 0) {
 			m = NULL;
 			goto out;
 		}

Modified: head/sys/net80211/ieee80211_hostap.c
==============================================================================
--- head/sys/net80211/ieee80211_hostap.c	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_hostap.c	Sat May 20 00:43:52 2017	(r318566)
@@ -577,7 +577,7 @@ 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++;
-			if (! ieee80211_check_rxseq(ni, wh, bssid))
+			if (! ieee80211_check_rxseq(ni, wh, bssid, rxs))
 				goto out;
 		}
 	}
@@ -665,7 +665,7 @@ hostap_input(struct ieee80211_node *ni, 
 		 * and we should do nothing more with it.
 		 */
 		if ((m->m_flags & M_AMPDU) &&
-		    ieee80211_ampdu_reorder(ni, m) != 0) {
+		    ieee80211_ampdu_reorder(ni, m, rxs) != 0) {
 			m = NULL;
 			goto out;
 		}

Modified: head/sys/net80211/ieee80211_ht.c
==============================================================================
--- head/sys/net80211/ieee80211_ht.c	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_ht.c	Sat May 20 00:43:52 2017	(r318566)
@@ -849,7 +849,8 @@ ampdu_rx_flush_upto(struct ieee80211_nod
  * the frame should be processed normally by the caller.
  */
 int
-ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m)
+ieee80211_ampdu_reorder(struct ieee80211_node *ni, struct mbuf *m,
+    const struct ieee80211_rx_stats *rxs)
 {
 #define	PROCESS		0	/* caller should process frame */
 #define	CONSUMED	1	/* frame consumed, caller does nothing */

Modified: head/sys/net80211/ieee80211_ht.h
==============================================================================
--- head/sys/net80211/ieee80211_ht.h	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_ht.h	Sat May 20 00:43:52 2017	(r318566)
@@ -185,7 +185,8 @@ int	ieee80211_setup_htrates(struct ieee8
 void	ieee80211_setup_basic_htrates(struct ieee80211_node *,
 		const uint8_t *htinfo);
 struct mbuf *ieee80211_decap_amsdu(struct ieee80211_node *, struct mbuf *);
-int	ieee80211_ampdu_reorder(struct ieee80211_node *, struct mbuf *);
+int	ieee80211_ampdu_reorder(struct ieee80211_node *, struct mbuf *,
+	    const struct ieee80211_rx_stats *);
 void	ieee80211_recv_bar(struct ieee80211_node *, struct mbuf *);
 void	ieee80211_ht_node_init(struct ieee80211_node *);
 void	ieee80211_ht_node_cleanup(struct ieee80211_node *);

Modified: head/sys/net80211/ieee80211_input.h
==============================================================================
--- head/sys/net80211/ieee80211_input.h	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_input.h	Sat May 20 00:43:52 2017	(r318566)
@@ -158,7 +158,7 @@ ishtinfooui(const uint8_t *frm)
  */
 static __inline int
 ieee80211_check_rxseq(struct ieee80211_node *ni, struct ieee80211_frame *wh,
-    uint8_t *bssid)
+    uint8_t *bssid, const struct ieee80211_rx_stats *rxs)
 {
 #define	SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
 #define	SEQ_EQ(a,b)	((int)((a)-(b)) == 0)

Modified: head/sys/net80211/ieee80211_mesh.c
==============================================================================
--- head/sys/net80211/ieee80211_mesh.c	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_mesh.c	Sat May 20 00:43:52 2017	(r318566)
@@ -1580,7 +1580,7 @@ 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++;
-			if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1))
+			if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1, rxs))
 				goto out;
 		}
 	}

Modified: head/sys/net80211/ieee80211_sta.c
==============================================================================
--- head/sys/net80211/ieee80211_sta.c	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_sta.c	Sat May 20 00:43:52 2017	(r318566)
@@ -648,7 +648,7 @@ 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++;
-			if (! ieee80211_check_rxseq(ni, wh, bssid))
+			if (! ieee80211_check_rxseq(ni, wh, bssid, rxs))
 				goto out;
 		}
 	}
@@ -673,7 +673,7 @@ sta_input(struct ieee80211_node *ni, str
 		if ((m->m_flags & M_AMPDU) &&
 		    (dir == IEEE80211_FC1_DIR_FROMDS ||
 		     dir == IEEE80211_FC1_DIR_DSTODS) &&
-		    ieee80211_ampdu_reorder(ni, m) != 0) {
+		    ieee80211_ampdu_reorder(ni, m, rxs) != 0) {
 			m = NULL;
 			goto out;
 		}

Modified: head/sys/net80211/ieee80211_wds.c
==============================================================================
--- head/sys/net80211/ieee80211_wds.c	Sat May 20 00:42:47 2017	(r318565)
+++ head/sys/net80211/ieee80211_wds.c	Sat May 20 00:43:52 2017	(r318566)
@@ -504,7 +504,7 @@ 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++;
-		if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1))
+		if (! ieee80211_check_rxseq(ni, wh, wh->i_addr1, rxs))
 			goto out;
 	}
 	switch (type) {
@@ -540,7 +540,7 @@ wds_input(struct ieee80211_node *ni, str
 		 * and we should do nothing more with it.
 		 */
 		if ((m->m_flags & M_AMPDU) &&
-		    ieee80211_ampdu_reorder(ni, m) != 0) {
+		    ieee80211_ampdu_reorder(ni, m, rxs) != 0) {
 			m = NULL;
 			goto out;
 		}



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