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