From owner-p4-projects@FreeBSD.ORG Fri May 20 02:21:22 2005 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7E88F16A4D0; Fri, 20 May 2005 02:21:21 +0000 (GMT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 17E1516A4CE for ; Fri, 20 May 2005 02:21:21 +0000 (GMT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id CCD2043DA9 for ; Fri, 20 May 2005 02:21:20 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j4K2LKvd095394 for ; Fri, 20 May 2005 02:21:20 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j4K2LKgc095391 for perforce@freebsd.org; Fri, 20 May 2005 02:21:20 GMT (envelope-from sam@freebsd.org) Date: Fri, 20 May 2005 02:21:20 GMT Message-Id: <200505200221.j4K2LKgc095391@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Subject: PERFORCE change 77205 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 May 2005 02:21:22 -0000 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