Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 20 May 2005 02:21:20 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 77205 for review
Message-ID:  <200505200221.j4K2LKgc095391@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=77205

Change 77205 by sam@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



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