PERFORCE change 77205 for review

Sam Leffler sam at FreeBSD.org
Thu May 19 19:21:22 PDT 2005


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

Change 77205 by sam at sam_ebb on 2005/05/20 02:20:47

	o only set iv_set_tim for ap and ibss vap's
	o check iv_set_tim consistently before invoking it
	o eliminate some checks of iv_opmode that are redudant now that
	  iv_set_tim is set based on operating mode
	o change ieee80211_sta_pwrsave to not use ieee80211_node_pwrsave;
	  mixing ap ps and sta ps operation is the wrong thing as sta mode
	  requires that we synchronize with the ap before flushing any
	  pending frames on the ps queue

Affected files ...

.. //depot/projects/vap/sys/net80211/ieee80211_input.c#13 edit
.. //depot/projects/vap/sys/net80211/ieee80211_node.c#9 edit

Differences ...

==== //depot/projects/vap/sys/net80211/ieee80211_input.c#13 (text+ko) ====

@@ -2931,8 +2931,7 @@
 	struct mbuf *m;
 
 	if (enable) {
-		if (vap->iv_opmode != IEEE80211_M_STA &&
-		    (ni->ni_flags & IEEE80211_NODE_PWR_MGT) == 0)
+		if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) == 0)
 			vap->iv_ps_sta++;
 		ni->ni_flags |= IEEE80211_NODE_PWR_MGT;
 		IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
@@ -2940,8 +2939,7 @@
 		return;
 	}
 
-	if (vap->iv_opmode != IEEE80211_M_STA &&
-	    (ni->ni_flags & IEEE80211_NODE_PWR_MGT))
+	if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT))
 		vap->iv_ps_sta--;
 	ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT;
 	IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
@@ -2952,7 +2950,7 @@
 	 * Flush queued unicast frames.
 	 */
 	if (IEEE80211_NODE_SAVEQ_QLEN(ni) == 0) {
-		if (vap->iv_opmode != IEEE80211_M_STA)
+		if (vap->iv_set_tim != NULL)
 			vap->iv_set_tim(ni, 0);		/* just in case */
 		return;
 	}
@@ -2988,8 +2986,21 @@
 {
 	struct ieee80211_node *ni = vap->iv_bss;
 
-	ieee80211_node_pwrsave(ni, enable);
-	ieee80211_send_nulldata(ieee80211_ref_node(ni));
+	IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
+	    "sta power save mode %s", enable ? "on" : "off");
+	if (enable) {
+		if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) == 0) {
+			ni->ni_flags |= IEEE80211_NODE_PWR_MGT;
+			ieee80211_send_nulldata(ieee80211_ref_node(ni));
+		}
+	} else {
+		if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) {
+			ni->ni_flags &= ~IEEE80211_NODE_PWR_MGT;
+			ieee80211_send_nulldata(ieee80211_ref_node(ni));
+			/* NB: cannot flush ps queue until ack received */
+			/* XXX no mechanism for this... */
+		}
+	}
 }
 
 /*
@@ -3036,7 +3047,8 @@
 		    "%s", "recv ps-poll, but queue empty");
 		ieee80211_send_nulldata(ieee80211_ref_node(ni));
 		vap->iv_stats.is_ps_qempty++;	/* XXX node stat */
-		vap->iv_set_tim(ni, 0);		/* just in case */
+		if (vap->iv_set_tim != NULL)
+			vap->iv_set_tim(ni, 0);	/* just in case */
 		return;
 	}
 	/* 
@@ -3052,7 +3064,8 @@
 	} else {
 		IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni,
 		    "%s", "recv ps-poll, send packet, queue empty");
-		vap->iv_set_tim(ni, 0);
+		if (vap->iv_set_tim != NULL)
+			vap->iv_set_tim(ni, 0);
 	}
 	m->m_flags |= M_PWR_SAV;		/* bypass PS handling */
 	IF_ENQUEUE(&vap->iv_if.if_snd, m);

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

@@ -118,7 +118,11 @@
 	vap->iv_inact_run = IEEE80211_INACT_RUN;
 	vap->iv_inact_probe = IEEE80211_INACT_PROBE;
 
-	vap->iv_set_tim = ieee80211_set_tim;	/* NB: driver should override */
+	if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
+	    vap->iv_opmode == IEEE80211_M_IBSS) {
+		/* NB: driver should override */
+		vap->iv_set_tim = ieee80211_set_tim;
+	}
 }
 
 void
@@ -1207,7 +1211,8 @@
 			 * Age frames on the power save queue.
 			 */
 			if (node_saveq_age(ni) != 0 && 
-			    IEEE80211_NODE_SAVEQ_QLEN(ni) == 0)
+			    IEEE80211_NODE_SAVEQ_QLEN(ni) == 0 &&
+			    vap->iv_set_tim != NULL)
 				vap->iv_set_tim(ni, 0);
 			/*
 			 * Probe the station before time it out.  We


More information about the p4-projects mailing list