wlan: ifaltq is no longer ifqueue
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 28 Jan 2013 01:57:04 +0000 (09:57 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 28 Jan 2013 01:57:04 +0000 (09:57 +0800)
sys/netproto/802_11/ieee80211_dragonfly.h
sys/netproto/802_11/wlan/ieee80211_dragonfly.c
sys/netproto/802_11/wlan/ieee80211_proto.c

index 6be7b6f..8750d0e 100644 (file)
@@ -106,7 +106,7 @@ int ieee80211_node_dectestref(struct ieee80211_node *ni);
 
 struct ifqueue;
 struct ieee80211vap;
 
 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 *);
 
 void   ieee80211_vap_destroy(struct ieee80211vap *);
 int    ieee80211_handoff(struct ifnet *, struct mbuf *);
index 115b039..ce13b30 100644 (file)
@@ -407,19 +407,24 @@ ieee80211_node_dectestref(struct ieee80211_node *ni)
        return atomic_cmpset_int(&ni->ni_refcnt, 0, 1);
 }
 
        return atomic_cmpset_int(&ni->ni_refcnt, 0, 1);
 }
 
+/* XXX this breaks ALTQ's packet scheduler */
 void
 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 ieee80211_node *ni;
        struct mbuf *m, **mprev;
+       struct ifaltq_subque *ifsq = ifq_get_subq_default(ifq);
 
        wlan_assert_serialized();
 
        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 */
        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 */
 
                        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 */
                        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)
                ;
        for (; m != NULL && m->m_nextpkt != NULL; m = m->m_nextpkt)
                ;
-       ifq->ifq_tail = m;
+       ifsq->ifq_tail = m;
+
+       ALTQ_SQ_UNLOCK(ifsq);
 }
 
 /*
 }
 
 /*
index e0b39e7..8ba894c 100644 (file)
@@ -1673,7 +1673,7 @@ ieee80211_newstate_task(void *xvap, int npending)
                ieee80211_scan_flush(vap);
 
                /* XXX NB: cast for altq */
                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();
        }
 done:
        wlan_serialize_exit();