From: Sepherosa Ziehau Date: Mon, 28 Jan 2013 01:57:04 +0000 (+0800) Subject: wlan: ifaltq is no longer ifqueue X-Git-Tag: v3.4.0rc~433 X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/c332e0e8d3bc067a075fa42c1e3896f875c99b82 wlan: ifaltq is no longer ifqueue --- diff --git a/sys/netproto/802_11/ieee80211_dragonfly.h b/sys/netproto/802_11/ieee80211_dragonfly.h index 6be7b6f..8750d0e 100644 --- a/sys/netproto/802_11/ieee80211_dragonfly.h +++ b/sys/netproto/802_11/ieee80211_dragonfly.h @@ -106,7 +106,7 @@ int ieee80211_node_dectestref(struct ieee80211_node *ni); struct ifqueue; struct ieee80211vap; -void ieee80211_flush_ifq(struct ifqueue *, struct ieee80211vap *); +void ieee80211_flush_ifq(struct ifaltq *, struct ieee80211vap *); void ieee80211_vap_destroy(struct ieee80211vap *); int ieee80211_handoff(struct ifnet *, struct mbuf *); diff --git a/sys/netproto/802_11/wlan/ieee80211_dragonfly.c b/sys/netproto/802_11/wlan/ieee80211_dragonfly.c index 115b039..ce13b30 100644 --- a/sys/netproto/802_11/wlan/ieee80211_dragonfly.c +++ b/sys/netproto/802_11/wlan/ieee80211_dragonfly.c @@ -407,19 +407,24 @@ ieee80211_node_dectestref(struct ieee80211_node *ni) return atomic_cmpset_int(&ni->ni_refcnt, 0, 1); } +/* XXX this breaks ALTQ's packet scheduler */ void -ieee80211_flush_ifq(struct ifqueue *ifq, struct ieee80211vap *vap) +ieee80211_flush_ifq(struct ifaltq *ifq, struct ieee80211vap *vap) { struct ieee80211_node *ni; struct mbuf *m, **mprev; + struct ifaltq_subque *ifsq = ifq_get_subq_default(ifq); wlan_assert_serialized(); - mprev = &ifq->ifq_head; + + ALTQ_SQ_LOCK(ifsq); + + mprev = &ifsq->ifq_head; while ((m = *mprev) != NULL) { ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; if (ni != NULL && ni->ni_vap == vap) { *mprev = m->m_nextpkt; /* remove from list */ - ifq->ifq_len--; + ifsq->ifq_len--; m_freem(m); ieee80211_free_node(ni); /* reclaim ref */ @@ -427,10 +432,12 @@ ieee80211_flush_ifq(struct ifqueue *ifq, struct ieee80211vap *vap) mprev = &m->m_nextpkt; } /* recalculate tail ptr */ - m = ifq->ifq_head; + m = ifsq->ifq_head; for (; m != NULL && m->m_nextpkt != NULL; m = m->m_nextpkt) ; - ifq->ifq_tail = m; + ifsq->ifq_tail = m; + + ALTQ_SQ_UNLOCK(ifsq); } /* diff --git a/sys/netproto/802_11/wlan/ieee80211_proto.c b/sys/netproto/802_11/wlan/ieee80211_proto.c index e0b39e7..8ba894c 100644 --- a/sys/netproto/802_11/wlan/ieee80211_proto.c +++ b/sys/netproto/802_11/wlan/ieee80211_proto.c @@ -1673,7 +1673,7 @@ ieee80211_newstate_task(void *xvap, int npending) ieee80211_scan_flush(vap); /* XXX NB: cast for altq */ - ieee80211_flush_ifq((struct ifqueue *)&ic->ic_ifp->if_snd, vap); + ieee80211_flush_ifq(&ic->ic_ifp->if_snd, vap); } done: wlan_serialize_exit();