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 *);
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 */
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);
}
/*
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();