Date: Wed, 18 May 2005 17:00:52 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 77139 for review Message-ID: <200505181700.j4IH0q1i051006@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=77139 Change 77139 by sam@sam_ebb on 2005/05/18 17:00:06 move ps q drain+age to routines Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#6 edit .. //depot/projects/vap/sys/net80211/ieee80211_node.c#7 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_freebsd.h#6 (text+ko) ==== @@ -78,14 +78,14 @@ mtx_init(&(_ni)->ni_savedq.ifq_mtx, _name, "802.11 ps queue", MTX_DEF);\ (_ni)->ni_savedq.ifq_maxlen = IEEE80211_PS_MAX_QUEUE; \ } while (0) -#define IEEE80211_NODE_SAVEQ_DESTROY(_ni) \ +#define IEEE80211_NODE_SAVEQ_DESTROY(_ni) \ mtx_destroy(&(_ni)->ni_savedq.ifq_mtx) -#define IEEE80211_NODE_SAVEQ_QLEN(_ni) \ +#define IEEE80211_NODE_SAVEQ_QLEN(_ni) \ _IF_QLEN(&(_ni)->ni_savedq) -#define IEEE80211_NODE_SAVEQ_LOCK(_ni) do { \ +#define IEEE80211_NODE_SAVEQ_LOCK(_ni) do { \ IF_LOCK(&(_ni)->ni_savedq); \ } while (0) -#define IEEE80211_NODE_SAVEQ_UNLOCK(_ni) do { \ +#define IEEE80211_NODE_SAVEQ_UNLOCK(_ni) do { \ IF_UNLOCK(&(_ni)->ni_savedq); \ } while (0) #define IEEE80211_NODE_SAVEQ_DEQUEUE(_ni, _m, _qlen) do { \ @@ -94,16 +94,6 @@ (_qlen) = IEEE80211_NODE_SAVEQ_QLEN(_ni); \ IEEE80211_NODE_SAVEQ_UNLOCK(_ni); \ } while (0) -#define IEEE80211_NODE_SAVEQ_DRAIN(_ni, _qlen) do { \ - IEEE80211_NODE_SAVEQ_LOCK(_ni); \ - (_qlen) = IEEE80211_NODE_SAVEQ_QLEN(_ni); \ - _IF_DRAIN(&(_ni)->ni_savedq); \ - IEEE80211_NODE_SAVEQ_UNLOCK(_ni); \ -} while (0) -/* XXX could be optimized */ -#define _IEEE80211_NODE_SAVEQ_DEQUEUE_HEAD(_ni, _m) do { \ - _IF_DEQUEUE(&(_ni)->ni_savedq, m); \ -} while (0) #define _IEEE80211_NODE_SAVEQ_ENQUEUE(_ni, _m, _qlen, _age) do {\ (_m)->m_nextpkt = NULL; \ if ((_ni)->ni_savedq.ifq_tail != NULL) { \ ==== //depot/projects/vap/sys/net80211/ieee80211_node.c#7 (text+ko) ==== @@ -66,6 +66,8 @@ static void node_cleanup(struct ieee80211_node *); static void node_free(struct ieee80211_node *); static u_int8_t node_getrssi(const struct ieee80211_node *); +static int node_saveq_drain(struct ieee80211_node *); +static int node_saveq_age(struct ieee80211_node *); static void _ieee80211_free_node(struct ieee80211_node *); @@ -518,7 +520,7 @@ { #define N(a) (sizeof(a)/sizeof(a[0])) struct ieee80211vap *vap = ni->ni_vap; - int i, qlen; + int i; /* NB: preserve ni_table */ if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { @@ -539,8 +541,7 @@ /* * Drain power save queue and, if needed, clear TIM. */ - IEEE80211_NODE_SAVEQ_DRAIN(ni, qlen); - if (qlen != 0 && vap->iv_set_tim != NULL) + if (node_saveq_drain(ni) != 0 && vap->iv_set_tim != NULL) vap->iv_set_tim(ni, 0); ni->ni_associd = 0; @@ -592,6 +593,73 @@ } /* + * Clear any frames queued on a node's power save queue. + * The number of frames that were present is returned. + */ +static int +node_saveq_drain(struct ieee80211_node *ni) +{ + struct mbuf *m; + int qlen; + + IEEE80211_NODE_SAVEQ_LOCK(ni); + qlen = IEEE80211_NODE_SAVEQ_QLEN(ni); + for (;;) { + _IF_DEQUEUE(&ni->ni_savedq, m); + if (m == NULL) + break; + m_freem(m); + } + IEEE80211_NODE_SAVEQ_UNLOCK(ni); + + return qlen; +} + +/* + * Age frames on the power save queue. The aging interval is + * 4 times the listen interval specified by the station. This + * number is factored into the age calculations when the frame + * is placed on the queue. We store ages as time differences + * so we can check and/or adjust only the head of the list. + * If a frame's age exceeds the threshold then discard it. + * The number of frames discarded is returned so the caller + * can check if it needs to adjust the tim. + */ +static int +node_saveq_age(struct ieee80211_node *ni) +{ + int discard = 0; + + /* XXX racey but good 'nuf? */ + if (IEEE80211_NODE_SAVEQ_QLEN(ni) != 0) { +#ifdef IEEE80211_DEBUG + struct ieee80211vap *vap = ni->ni_vap; +#endif + struct mbuf *m; + + IEEE80211_NODE_SAVEQ_LOCK(ni); + while (IF_POLL(&ni->ni_savedq, m) != NULL && + M_AGE_GET(m) < IEEE80211_INACT_WAIT) { + IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni, + "discard frame, age %u", M_AGE_GET(m)); + + /* XXX could be optimized */ + _IF_DEQUEUE(&ni->ni_savedq, m); + m_freem(m); + discard++; + } + if (m != NULL) + M_AGE_SUB(m, IEEE80211_INACT_WAIT); + IEEE80211_NODE_SAVEQ_UNLOCK(ni); + + IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni, + "discard %u frames for age", discard); + IEEE80211_NODE_STAT_ADD(ni, ps_discard, discard); + } + return discard; +} + +/* * Create an entry in the specified node table. The node * is setup with the mac address, an initial reference count, * and some basic parameters obtained from global state. @@ -1136,41 +1204,11 @@ if (ni->ni_associd != 0) { struct ieee80211vap *vap = ni->ni_vap; /* - * Age frames on the power save queue. The - * aging interval is 4 times the listen - * interval specified by the station. This - * number is factored into the age calculations - * when the frame is placed on the queue. We - * store ages as time differences we can check - * and/or adjust only the head of the list. + * Age frames on the power save queue. */ - if (IEEE80211_NODE_SAVEQ_QLEN(ni) != 0) { - struct mbuf *m; - int discard = 0; - - IEEE80211_NODE_SAVEQ_LOCK(ni); - while (IF_POLL(&ni->ni_savedq, m) != NULL && - M_AGE_GET(m) < IEEE80211_INACT_WAIT) { -IEEE80211_NOTE(vap, IEEE80211_MSG_POWER, ni, "discard frame, age %u", M_AGE_GET(m));/*XXX*/ - _IEEE80211_NODE_SAVEQ_DEQUEUE_HEAD(ni, m); - m_freem(m); - discard++; - } - if (m != NULL) - M_AGE_SUB(m, IEEE80211_INACT_WAIT); - IEEE80211_NODE_SAVEQ_UNLOCK(ni); - - if (discard != 0) { - IEEE80211_NOTE(vap, - IEEE80211_MSG_POWER, ni, - "discard %u frames for age", - discard); - IEEE80211_NODE_STAT_ADD(ni, - ps_discard, discard); - if (IEEE80211_NODE_SAVEQ_QLEN(ni) == 0) - vap->iv_set_tim(ni, 0); - } - } + if (node_saveq_age(ni) != 0 && + IEEE80211_NODE_SAVEQ_QLEN(ni) == 0) + vap->iv_set_tim(ni, 0); /* * Probe the station before time it out. We * send a null data frame which may not be
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200505181700.j4IH0q1i051006>