PERFORCE change 77139 for review

Sam Leffler sam at FreeBSD.org
Wed May 18 10:00:54 PDT 2005


http://perforce.freebsd.org/chv.cgi?CH=77139

Change 77139 by sam at sam_ebb on 2005/05/18 17:00:06

	move ps q drain+age to routines

Affected files ...

.. //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#6 edit
.. //depot/projects/vap/sys/net80211/ieee80211_node.c#7 edit

Differences ...

==== //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#6 (text+ko) ====

@@ -78,14 +78,14 @@
 	mtx_init(&(_ni)->ni_savedq.ifq_mtx, _name, "802.11 ps queue", MTX_DEF);\
 	(_ni)->ni_savedq.ifq_maxlen = IEEE80211_PS_MAX_QUEUE;	\
 } while (0)
-#define	IEEE80211_NODE_SAVEQ_DESTROY(_ni) \
+#define	IEEE80211_NODE_SAVEQ_DESTROY(_ni) 			\
 	mtx_destroy(&(_ni)->ni_savedq.ifq_mtx)
-#define	IEEE80211_NODE_SAVEQ_QLEN(_ni) \
+#define	IEEE80211_NODE_SAVEQ_QLEN(_ni) 				\
 	_IF_QLEN(&(_ni)->ni_savedq)
-#define	IEEE80211_NODE_SAVEQ_LOCK(_ni) do {	\
+#define	IEEE80211_NODE_SAVEQ_LOCK(_ni) do {			\
 	IF_LOCK(&(_ni)->ni_savedq);				\
 } while (0)
-#define	IEEE80211_NODE_SAVEQ_UNLOCK(_ni) do {	\
+#define	IEEE80211_NODE_SAVEQ_UNLOCK(_ni) do {			\
 	IF_UNLOCK(&(_ni)->ni_savedq);				\
 } while (0)
 #define	IEEE80211_NODE_SAVEQ_DEQUEUE(_ni, _m, _qlen) do {	\
@@ -94,16 +94,6 @@
 	(_qlen) = IEEE80211_NODE_SAVEQ_QLEN(_ni);		\
 	IEEE80211_NODE_SAVEQ_UNLOCK(_ni);			\
 } while (0)
-#define	IEEE80211_NODE_SAVEQ_DRAIN(_ni, _qlen) do {		\
-	IEEE80211_NODE_SAVEQ_LOCK(_ni);				\
-	(_qlen) = IEEE80211_NODE_SAVEQ_QLEN(_ni);		\
-	_IF_DRAIN(&(_ni)->ni_savedq);				\
-	IEEE80211_NODE_SAVEQ_UNLOCK(_ni);			\
-} while (0)
-/* XXX could be optimized */
-#define	_IEEE80211_NODE_SAVEQ_DEQUEUE_HEAD(_ni, _m) do {	\
-	_IF_DEQUEUE(&(_ni)->ni_savedq, m);			\
-} while (0)
 #define	_IEEE80211_NODE_SAVEQ_ENQUEUE(_ni, _m, _qlen, _age) do {\
 	(_m)->m_nextpkt = NULL;					\
 	if ((_ni)->ni_savedq.ifq_tail != NULL) { 		\

==== //depot/projects/vap/sys/net80211/ieee80211_node.c#7 (text+ko) ====

@@ -66,6 +66,8 @@
 static void node_cleanup(struct ieee80211_node *);
 static void node_free(struct ieee80211_node *);
 static u_int8_t node_getrssi(const struct ieee80211_node *);
+static int node_saveq_drain(struct ieee80211_node *);
+static int node_saveq_age(struct ieee80211_node *);
 
 static void _ieee80211_free_node(struct ieee80211_node *);
 
@@ -518,7 +520,7 @@
 {
 #define	N(a)	(sizeof(a)/sizeof(a[0]))
 	struct ieee80211vap *vap = ni->ni_vap;
-	int i, qlen;
+	int i;
 
 	/* NB: preserve ni_table */
 	if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) {
@@ -539,8 +541,7 @@
 	/*
 	 * Drain power save queue and, if needed, clear TIM.
 	 */
-	IEEE80211_NODE_SAVEQ_DRAIN(ni, qlen);
-	if (qlen != 0 && vap->iv_set_tim != NULL)
+	if (node_saveq_drain(ni) != 0 && vap->iv_set_tim != NULL)
 		vap->iv_set_tim(ni, 0);
 
 	ni->ni_associd = 0;
@@ -592,6 +593,73 @@
 }
 
 /*
+ * Clear any frames queued on a node's power save queue.
+ * The number of frames that were present is returned.
+ */
+static int
+node_saveq_drain(struct ieee80211_node *ni)
+{
+	struct mbuf *m;
+	int qlen;
+
+	IEEE80211_NODE_SAVEQ_LOCK(ni);
+	qlen = IEEE80211_NODE_SAVEQ_QLEN(ni);
+	for (;;) {
+		_IF_DEQUEUE(&ni->ni_savedq, m);
+		if (m == NULL)
+			break;
+		m_freem(m);
+	}
+	IEEE80211_NODE_SAVEQ_UNLOCK(ni);
+
+	return qlen;
+}
+
+/*
+ * Age frames on the power save queue. The aging interval is
+ * 4 times the listen interval specified by the station.  This
+ * number is factored into the age calculations when the frame
+ * is placed on the queue.  We store ages as time differences
+ * so we can check and/or adjust only the head of the list.
+ * If a frame's age exceeds the threshold then discard it.
+ * The number of frames discarded is returned so the caller
+ * can check if it needs to adjust the tim.
+ */
+static int
+node_saveq_age(struct ieee80211_node *ni)
+{
+	int discard = 0;
+
+	/* XXX racey but good 'nuf? */
+	if (IEEE80211_NODE_SAVEQ_QLEN(ni) != 0) {
+#ifdef IEEE80211_DEBUG
+		struct ieee80211vap *vap = ni->ni_vap;
+#endif
+		struct mbuf *m;
+
+		IEEE80211_NODE_SAVEQ_LOCK(ni);
+		while (IF_POLL(&ni->ni_savedq, m) != NULL &&
+		     M_AGE_GET(m) < IEEE80211_INACT_WAIT) {
+			IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
+				"discard frame, age %u", M_AGE_GET(m));
+
+			/* XXX could be optimized */
+			_IF_DEQUEUE(&ni->ni_savedq, m);
+			m_freem(m);
+			discard++;
+		}
+		if (m != NULL)
+			M_AGE_SUB(m, IEEE80211_INACT_WAIT);
+		IEEE80211_NODE_SAVEQ_UNLOCK(ni);
+
+		IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
+		    "discard %u frames for age", discard);
+		IEEE80211_NODE_STAT_ADD(ni, ps_discard, discard);
+	}
+	return discard;
+}
+
+/*
  * Create an entry in the specified node table.  The node
  * is setup with the mac address, an initial reference count,
  * and some basic parameters obtained from global state.
@@ -1136,41 +1204,11 @@
 		if (ni->ni_associd != 0) {
 			struct ieee80211vap *vap = ni->ni_vap;
 			/*
-			 * Age frames on the power save queue. The
-			 * aging interval is 4 times the listen
-			 * interval specified by the station.  This
-			 * number is factored into the age calculations
-			 * when the frame is placed on the queue.  We
-			 * store ages as time differences we can check
-			 * and/or adjust only the head of the list.
+			 * Age frames on the power save queue.
 			 */
-			if (IEEE80211_NODE_SAVEQ_QLEN(ni) != 0) {
-				struct mbuf *m;
-				int discard = 0;
-
-				IEEE80211_NODE_SAVEQ_LOCK(ni);
-				while (IF_POLL(&ni->ni_savedq, m) != NULL &&
-				     M_AGE_GET(m) < IEEE80211_INACT_WAIT) {
-IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni, "discard frame, age %u", M_AGE_GET(m));/*XXX*/
-					_IEEE80211_NODE_SAVEQ_DEQUEUE_HEAD(ni, m);
-					m_freem(m);
-					discard++;
-				}
-				if (m != NULL)
-					M_AGE_SUB(m, IEEE80211_INACT_WAIT);
-				IEEE80211_NODE_SAVEQ_UNLOCK(ni);
-
-				if (discard != 0) {
-					IEEE80211_NOTE(vap,
-					    IEEE80211_MSG_POWER, ni,
-					    "discard %u frames for age",
-					    discard);
-					IEEE80211_NODE_STAT_ADD(ni,
-						ps_discard, discard);
-					if (IEEE80211_NODE_SAVEQ_QLEN(ni) == 0)
-						vap->iv_set_tim(ni, 0);
-				}
-			}
+			if (node_saveq_age(ni) != 0 && 
+			    IEEE80211_NODE_SAVEQ_QLEN(ni) == 0)
+				vap->iv_set_tim(ni, 0);
 			/*
 			 * Probe the station before time it out.  We
 			 * send a null data frame which may not be


More information about the p4-projects mailing list