PERFORCE change 66121 for review

Sam Leffler sam at FreeBSD.org
Tue Nov 30 10:17:27 PST 2004


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

Change 66121 by sam at sam_ebb on 2004/11/30 18:16:45

	o replace explicit ps queue manipulations with portability shims
	o no need to mark management frame with M_PWR_SAV any more; the
	  driver no longer intercepts them
	o mark frames placed on the power save queue with an age so they
	  can be reaped if they sit too long (need to recheck calc)

Affected files ...

.. //depot/projects/wifi/sys/net80211/ieee80211_output.c#16 edit

Differences ...

==== //depot/projects/wifi/sys/net80211/ieee80211_output.c#16 (text+ko) ====

@@ -1127,15 +1127,6 @@
 		IEEE80211_NODE_STAT_SET(ni, tx_deauth_code, arg);
 
 		ieee80211_node_unauthorize(ic, ni);	/* port closed */
-		/*
-		 * If station is in power-save state mark the frame
-		 * so it goes out immediately.  The station is likely
-		 * to ignore it but the alternative is to defer reclaiming
-		 * station state until it wakes up and polls for the
-		 * frame which leads to possible DOS.
-		 */
-		if (ni->ni_flags & IEEE80211_NODE_PWR_MGT)
-			m->m_flags |= M_PWR_SAV;
 		break;
 
 	case IEEE80211_FC0_SUBTYPE_ASSOC_REQ:
@@ -1537,8 +1528,8 @@
 			ic->ic_flags &= ~IEEE80211_F_TIMUPDATE;
 
 			IEEE80211_DPRINTF(ic, IEEE80211_MSG_POWER,
-				"%s: TIM updated, off %u, len %u\n",
-				__func__, timoff, timlen);
+				"%s: TIM updated, pending %u, off %u, len %u\n",
+				__func__, ic->ic_ps_pending, timoff, timlen);
 		}
 		/* update TIM state regarding buffered multicast frames */
 		if (mcast)
@@ -1560,12 +1551,12 @@
 ieee80211_pwrsave(struct ieee80211com *ic, struct ieee80211_node *ni, 
 		  struct mbuf *m)
 {
-	int qlen;
+	int qlen, age;
 
-	IF_LOCK(&ni->ni_savedq);
+	IEEE80211_NODE_SAVEQ_LOCK(ni);
 	if (_IF_QFULL(&ni->ni_savedq)) {
 		_IF_DROP(&ni->ni_savedq);
-		IF_UNLOCK(&ni->ni_savedq);
+		IEEE80211_NODE_SAVEQ_UNLOCK(ni);
 		IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY,
 			"[%s] pwr save q overflow, drops %d (size %d)\n",
 			ether_sprintf(ni->ni_macaddr), 
@@ -1575,9 +1566,17 @@
 		m_freem(m);
 		return;
 	}
-	_IF_ENQUEUE(&ni->ni_savedq, m);
-	qlen = _IF_QLEN(&ni->ni_savedq);
-	IF_UNLOCK(&ni->ni_savedq);
+	/*
+	 * Tag the frame with it's expiry time and insert
+	 * it in the queue.  The aging interval is 4 times
+	 * the listen interval specified by the station. 
+	 * Frames that sit around too long are reclaimed
+	 * using this information.
+	 */
+	/* XXX handle overflow? */
+	age = ((ni->ni_intval * ic->ic_lintval) << 2) / 1024; /* TU -> secs */
+	_IEEE80211_NODE_SAVEQ_ENQUEUE(ni, m, qlen, age);
+	IEEE80211_NODE_SAVEQ_UNLOCK(ni);
 
 	IEEE80211_DPRINTF(ic, IEEE80211_MSG_POWER,
 		"[%s] save frame, %u now queued\n",


More information about the p4-projects mailing list