Fix remaining M_NOWAIT and use ieee80211_handoff instead of if_transmit.
authorRui Paulo <rpaulo@FreeBSD.org>
Fri, 26 Feb 2010 19:41:30 +0000 (19:41 +0000)
committerRui Paulo <rpaulo@FreeBSD.org>
Fri, 26 Feb 2010 19:41:30 +0000 (19:41 +0000)
16 files changed:
sys/netproto/802_11/wlan/ieee80211_dragonfly.c
sys/netproto/802_11/wlan/ieee80211_hostap.c
sys/netproto/802_11/wlan/ieee80211_ht.c
sys/netproto/802_11/wlan/ieee80211_hwmp.c
sys/netproto/802_11/wlan/ieee80211_input.c
sys/netproto/802_11/wlan/ieee80211_ioctl.c
sys/netproto/802_11/wlan/ieee80211_mesh.c
sys/netproto/802_11/wlan/ieee80211_node.c
sys/netproto/802_11/wlan/ieee80211_output.c
sys/netproto/802_11/wlan/ieee80211_power.c
sys/netproto/802_11/wlan/ieee80211_regdomain.c
sys/netproto/802_11/wlan/ieee80211_scan.c
sys/netproto/802_11/wlan/ieee80211_scan_sta.c
sys/netproto/802_11/wlan/ieee80211_superg.c
sys/netproto/802_11/wlan/ieee80211_tdma.c
sys/netproto/802_11/wlan/ieee80211_wds.c

index 09017ca..0061f90 100644 (file)
@@ -50,6 +50,7 @@
 #include <net/if_types.h>
 #include <net/ethernet.h>
 #include <net/route.h>
+#include <net/ifq_var.h>
 
 #include <netproto/802_11/ieee80211_var.h>
 #include <netproto/802_11/ieee80211_input.h>
@@ -231,7 +232,7 @@ ieee80211_sysctl_vattach(struct ieee80211vap *vap)
        char num[14];                   /* sufficient for 32 bits */
 
        ctx = (struct sysctl_ctx_list *) kmalloc(sizeof(struct sysctl_ctx_list),
-               M_DEVBUF, M_NOWAIT | M_ZERO);
+               M_DEVBUF, M_INTWAIT | M_ZERO);
        if (ctx == NULL) {
                if_printf(ifp, "%s: cannot allocate sysctl context!\n",
                        __func__);
@@ -397,7 +398,7 @@ ieee80211_getmgtframe(uint8_t **frm, int headroom, int pktlen)
        len = roundup2(headroom + pktlen, 4);
        KASSERT(len <= MCLBYTES, ("802.11 mgt frame too large: %u", len));
        if (len < MINCLSIZE) {
-               m = m_gethdr(M_NOWAIT, MT_DATA);
+               m = m_gethdr(M_INTWAIT, MT_DATA);
                /*
                 * Align the data in case additional headers are added.
                 * This should only happen when a WEP header is added
@@ -407,7 +408,7 @@ ieee80211_getmgtframe(uint8_t **frm, int headroom, int pktlen)
                if (m != NULL)
                        MH_ALIGN(m, len);
        } else {
-               m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
+               m = m_getcl(M_INTWAIT, MT_DATA, M_PKTHDR);
                if (m != NULL)
                        MC_ALIGN(m, len);
        }
@@ -465,7 +466,7 @@ ieee80211_add_callback(struct mbuf *m,
        struct ieee80211_cb *cb;
 
        mtag = m_tag_alloc(MTAG_ABI_NET80211, NET80211_TAG_CALLBACK,
-                       sizeof(struct ieee80211_cb), M_NOWAIT);
+                       sizeof(struct ieee80211_cb), M_INTWAIT);
        if (mtag == NULL)
                return 0;
 
@@ -717,6 +718,27 @@ ieee80211_notify_radio(struct ieee80211com *ic, int state)
        rt_ieee80211msg(ifp, RTM_IEEE80211_RADIO, &iev, sizeof(iev));
 }
 
+int
+ieee80211_handoff(struct ifnet *dst_ifp, struct mbuf *m)
+{
+        struct mbuf *m0;
+
+       /* We may be sending a fragment so traverse the mbuf */
+       for (; m; m = m0) {
+               struct altq_pktattr pktattr;
+
+               m0 = m->m_nextpkt;
+               m->m_nextpkt = NULL;
+
+               if (ifq_is_enabled(&dst_ifp->if_snd))
+                       altq_etherclassify(&dst_ifp->if_snd, m, &pktattr);
+
+               ifq_dispatch(dst_ifp, m, &pktattr);
+       }
+
+       return (0);
+}
+
 void
 ieee80211_load_module(const char *modname)
 {
index b723f0f..793000e 100644 (file)
@@ -411,7 +411,7 @@ hostap_deliver_data(struct ieee80211vap *vap,
                if (mcopy != NULL) {
                        int len, err;
                        len = mcopy->m_pkthdr.len;
-                       err = ifp->if_transmit(ifp, mcopy);
+                       err = ieee80211_handoff(ifp, mcopy);
                        if (err) {
                                /* NB: IFQ_HANDOFF reclaims mcopy */
                        } else {
@@ -1568,7 +1568,7 @@ ieee80211_deliver_l2uf(struct ieee80211_node *ni)
        struct l2_update_frame *l2uf;
        struct ether_header *eh;
        
-       m = m_gethdr(M_NOWAIT, MT_DATA);
+       m = m_gethdr(M_INTWAIT, MT_DATA);
        if (m == NULL) {
                IEEE80211_NOTE(vap, IEEE80211_MSG_ASSOC, ni,
                    "%s", "no mbuf for l2uf frame");
index 361da4c..b8b4efe 100644 (file)
@@ -319,7 +319,7 @@ ieee80211_decap_amsdu(struct ieee80211_node *ni, struct mbuf *m)
                }
                if (m->m_pkthdr.len == framelen)
                        break;
-               n = m_split(m, framelen, M_NOWAIT);
+               n = m_split(m, framelen, M_INTWAIT);
                if (n == NULL) {
                        IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
                            ni->ni_macaddr, "a-msdu",
index 214c665..6bfa02f 100644 (file)
@@ -238,7 +238,7 @@ hwmp_vattach(struct ieee80211vap *vap)
            ("not a mesh vap, opmode %d", vap->iv_opmode));
 
        hs = kmalloc(sizeof(struct ieee80211_hwmp_state), M_80211_VAP,
-           M_NOWAIT | M_ZERO);
+           M_INTWAIT | M_ZERO);
        if (hs == NULL) {
                kprintf("%s: couldn't alloc HWMP state\n", __func__);
                return;
@@ -1068,7 +1068,7 @@ hwmp_recv_prep(struct ieee80211vap *vap, struct ieee80211_node *ni,
                m->m_nextpkt = NULL;
                IEEE80211_NOTE(vap, IEEE80211_MSG_HWMP, ni,
                    "flush queued frame %p len %d", m, m->m_pkthdr.len);
-               ifp->if_transmit(ifp, m);
+               ieee80211_handoff(ifp, m);
        }
 }
 
index 52c3cc5..cd1f897 100644 (file)
@@ -400,7 +400,7 @@ ieee80211_alloc_challenge(struct ieee80211_node *ni)
 {
        if (ni->ni_challenge == NULL)
                ni->ni_challenge = (uint32_t *) kmalloc(IEEE80211_CHALLENGE_LEN,
-                   M_80211_NODE, M_NOWAIT);
+                   M_80211_NODE, M_INTWAIT);
        if (ni->ni_challenge == NULL) {
                IEEE80211_NOTE(ni->ni_vap,
                    IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, ni,
index c20defd..bdd6b09 100644 (file)
@@ -328,7 +328,7 @@ ieee80211_ioctl_getscanresults(struct ieee80211vap *vap,
 
                space = req.space;
                /* XXX M_WAITOK after driver lock released */
-               p = kmalloc(space, M_TEMP, M_NOWAIT | M_ZERO);
+               p = kmalloc(space, M_TEMP, M_INTWAIT | M_ZERO);
                if (p == NULL)
                        return ENOMEM;
                req.sr = p;
@@ -478,7 +478,7 @@ getstainfo_common(struct ieee80211vap *vap, struct ieee80211req *ireq,
        if (req.space > 0) {
                space = req.space;
                /* XXX M_WAITOK after driver lock released */
-               p = kmalloc(space, M_TEMP, M_NOWAIT | M_ZERO);
+               p = kmalloc(space, M_TEMP, M_INTWAIT | M_ZERO);
                if (p == NULL) {
                        error = ENOMEM;
                        goto bad;
@@ -703,7 +703,7 @@ ieee80211_ioctl_getdevcaps(struct ieee80211com *ic,
                maxchans = 2048;
        dc = (struct ieee80211_devcaps_req *)
            kmalloc(IEEE80211_DEVCAPS_SIZE(maxchans), M_TEMP,
-               M_NOWAIT | M_ZERO);
+               M_INTWAIT | M_ZERO);
        if (dc == NULL)
                return ENOMEM;
        dc->dc_drivercaps = ic->ic_caps;
@@ -1589,7 +1589,7 @@ ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
        if (ireq->i_len > sizeof(ic->ic_chan_active))
                ireq->i_len = sizeof(ic->ic_chan_active);
        list = kmalloc(ireq->i_len + IEEE80211_CHAN_BYTES, M_TEMP,
-           M_NOWAIT | M_ZERO);
+           M_INTWAIT | M_ZERO);
        if (list == NULL)
                return ENOMEM;
        error = copyin(ireq->i_data, list, ireq->i_len);
@@ -2030,7 +2030,7 @@ ieee80211_ioctl_setregdomain(struct ieee80211vap *vap,
                return EINVAL;
        }
        reg = (struct ieee80211_regdomain_req *)
-           kmalloc(IEEE80211_REGDOMAIN_SIZE(nchans), M_TEMP, M_NOWAIT);
+           kmalloc(IEEE80211_REGDOMAIN_SIZE(nchans), M_TEMP, M_INTWAIT);
        if (reg == NULL) {
                IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
                    "%s: no memory, nchans %d\n", __func__, nchans);
@@ -2179,7 +2179,8 @@ setappie(struct ieee80211_appie **aie, const struct ieee80211req *ireq)
         * XXX bad bad bad
         */
        napp = (struct ieee80211_appie *) kmalloc(
-           sizeof(struct ieee80211_appie) + ireq->i_len, M_80211_NODE_IE, M_NOWAIT);
+           sizeof(struct ieee80211_appie) + ireq->i_len, M_80211_NODE_IE,
+           M_INTWAIT);
        if (napp == NULL)
                return ENOMEM;
        /* XXX holding ic lock */
index 48401a4..8652950 100644 (file)
@@ -177,7 +177,7 @@ mesh_rt_add_locked(struct ieee80211_mesh_state *ms,
        MESH_RT_LOCK_ASSERT(ms);
 
        rt = kmalloc(ALIGN(sizeof(struct ieee80211_mesh_route)) +
-           ms->ms_ppath->mpp_privlen, M_80211_MESH_RT, M_NOWAIT | M_ZERO);
+           ms->ms_ppath->mpp_privlen, M_80211_MESH_RT, M_INTWAIT | M_ZERO);
        if (rt != NULL) {
                IEEE80211_ADDR_COPY(rt->rt_dest, dest);
                rt->rt_priv = (void *)ALIGN(&rt[1]);
@@ -522,7 +522,7 @@ mesh_vattach(struct ieee80211vap *vap)
        vap->iv_opdetach = mesh_vdetach;
        vap->iv_recv_mgmt = mesh_recv_mgmt;
        ms = kmalloc(sizeof(struct ieee80211_mesh_state), M_80211_VAP,
-           M_NOWAIT | M_ZERO);
+           M_INTWAIT | M_ZERO);
        if (ms == NULL) {
                kprintf("%s: couldn't alloc MBSS state\n", __func__);
                return;
@@ -916,7 +916,7 @@ mesh_forward(struct ieee80211vap *vap, struct mbuf *m,
 
        /* XXX do we know m_nextpkt is NULL? */
        mcopy->m_pkthdr.rcvif = (void *) ni;
-       err = parent->if_transmit(parent, mcopy);
+       err = ieee80211_handoff(parent, mcopy);
        if (err != 0) {
                /* NB: IFQ_HANDOFF reclaims mbuf */
                ieee80211_free_node(ni);
@@ -2614,7 +2614,7 @@ mesh_ioctl_get80211(struct ieee80211vap *vap, struct ieee80211req *ireq)
                        }
                        ireq->i_len = len;
                        /* XXX M_WAIT? */
-                       p = kmalloc(len, M_TEMP, M_NOWAIT | M_ZERO);
+                       p = kmalloc(len, M_TEMP, M_INTWAIT | M_ZERO);
                        if (p == NULL)
                                return ENOMEM;
                        off = 0;
index e864961..792c6e4 100644 (file)
@@ -171,7 +171,7 @@ ieee80211_node_latevattach(struct ieee80211vap *vap)
                }
                vap->iv_aid_bitmap = (uint32_t *) kmalloc(
                        howmany(vap->iv_max_aid, 32) * sizeof(uint32_t),
-                       M_80211_NODE, M_NOWAIT | M_ZERO);
+                       M_80211_NODE, M_INTWAIT | M_ZERO);
                if (vap->iv_aid_bitmap == NULL) {
                        /* XXX no way to recover */
                        kprintf("%s: no memory for AID bitmap, max aid %d!\n",
@@ -854,7 +854,7 @@ node_alloc(struct ieee80211vap *vap, const uint8_t macaddr[IEEE80211_ADDR_LEN])
        struct ieee80211_node *ni;
 
        ni = (struct ieee80211_node *) kmalloc(sizeof(struct ieee80211_node),
-               M_80211_NODE, M_NOWAIT | M_ZERO);
+               M_80211_NODE, M_INTWAIT | M_ZERO);
        return ni;
 }
 
@@ -875,7 +875,7 @@ ieee80211_ies_init(struct ieee80211_ies *ies, const uint8_t *data, int len)
                ies->data = NULL;
        }
        if (ies->data == NULL) {
-               ies->data = (uint8_t *) kmalloc(len, M_80211_NODE_IE, M_NOWAIT);
+               ies->data = (uint8_t *) kmalloc(len, M_80211_NODE_IE, M_INTWAIT);
                if (ies->data == NULL) {
                        ies->len = 0;
                        /* NB: pointers have already been zero'd above */
@@ -1826,7 +1826,7 @@ ieee80211_node_table_init(struct ieee80211com *ic,
        if (nt->nt_keyixmax > 0) {
                nt->nt_keyixmap = (struct ieee80211_node **) kmalloc(
                        keyixmax * sizeof(struct ieee80211_node *),
-                       M_80211_NODE, M_NOWAIT | M_ZERO);
+                       M_80211_NODE, M_INTWAIT | M_ZERO);
                if (nt->nt_keyixmap == NULL)
                        if_printf(ic->ic_ifp,
                            "Cannot allocate key index map with %u entries\n",
index f4aa649..260aff3 100644 (file)
@@ -86,7 +86,6 @@
 static int ieee80211_fragment(struct ieee80211vap *, struct mbuf *,
        u_int hdrsize, u_int ciphdrsize, u_int mtu);
 static void ieee80211_tx_mgt_cb(struct ieee80211_node *, void *, int);
-static int ieee80211_handoff(struct ifnet *dst_ifp, struct mbuf *m);
 
 #ifdef IEEE80211_DEBUG
 /*
@@ -373,27 +372,6 @@ ieee80211_start(struct ifnet *ifp)
 #undef IS_DWDS
 }
 
-static int
-ieee80211_handoff(struct ifnet *dst_ifp, struct mbuf *m)
-{
-        struct mbuf *m0;
-
-       /* We may be sending a fragment so traverse the mbuf */
-       for (; m; m = m0) {
-               struct altq_pktattr pktattr;
-
-               m0 = m->m_nextpkt;
-               m->m_nextpkt = NULL;
-
-               if (ifq_is_enabled(&dst_ifp->if_snd))
-                       altq_etherclassify(&dst_ifp->if_snd, m, &pktattr);
-
-               ifq_dispatch(dst_ifp, m, &pktattr);
-       }
-
-       return (0);
-}
-
 
 /*
  * 802.11 output routine. This is (currently) used only to
@@ -920,7 +898,7 @@ ieee80211_mbuf_adjust(struct ieee80211vap *vap, int hdrsize,
                 */
 #ifdef __FreeBSD__
                if (key->wk_flags & (IEEE80211_KEY_SWENCRYPT|IEEE80211_KEY_SWENMIC)) {
-                       m = m_unshare(m, M_NOWAIT);
+                       m = m_unshare(m, M_INTWAIT);
                        if (m == NULL) {
                                IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT,
                                    "%s: cannot get writable mbuf\n", __func__);
@@ -940,7 +918,7 @@ ieee80211_mbuf_adjust(struct ieee80211vap *vap, int hdrsize,
         */
        /* XXX check trailing space and copy instead? */
        if (M_LEADINGSPACE(m) < needed_space - TO_BE_RECLAIMED) {
-               struct mbuf *n = m_gethdr(M_NOWAIT, m->m_type);
+               struct mbuf *n = m_gethdr(M_INTWAIT, m->m_type);
                if (n == NULL) {
                        IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT,
                            "%s: cannot expand storage\n", __func__);
index 1b25bea..a3d4541 100644 (file)
@@ -82,7 +82,7 @@ ieee80211_power_latevattach(struct ieee80211vap *vap)
        if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
                vap->iv_tim_len = howmany(vap->iv_max_aid,8) * sizeof(uint8_t);
                vap->iv_tim_bitmap = (uint8_t *) kmalloc(vap->iv_tim_len,
-                       M_80211_POWER, M_NOWAIT | M_ZERO);
+                       M_80211_POWER, M_INTWAIT | M_ZERO);
                if (vap->iv_tim_bitmap == NULL) {
                        kprintf("%s: no memory for TIM bitmap!\n", __func__);
                        /* XXX good enough to keep from crashing? */
index eba3063..4305419 100644 (file)
@@ -242,7 +242,7 @@ ieee80211_alloc_countryie(struct ieee80211com *ic)
        int i, skip, nruns;
 
        aie = kmalloc(IEEE80211_COUNTRY_MAX_SIZE, M_80211_NODE_IE,
-           M_NOWAIT | M_ZERO);
+           M_INTWAIT | M_ZERO);
        if (aie == NULL) {
                if_printf(ic->ic_ifp,
                    "%s: unable to allocate memory for country ie\n", __func__);
index 8490fed..432637a 100644 (file)
@@ -106,7 +106,7 @@ ieee80211_scan_attach(struct ieee80211com *ic)
        struct scan_state *ss;
 
        ss = (struct scan_state *) kmalloc(sizeof(struct scan_state),
-               M_80211_SCAN, M_NOWAIT | M_ZERO);
+               M_80211_SCAN, M_INTWAIT | M_ZERO);
        if (ss == NULL) {
                ic->ic_scan = NULL;
                return;
index 514bc25..15d9ee6 100644 (file)
@@ -160,7 +160,7 @@ sta_attach(struct ieee80211_scan_state *ss)
        struct sta_table *st;
 
        st = (struct sta_table *) kmalloc(sizeof(struct sta_table),
-               M_80211_SCAN, M_NOWAIT | M_ZERO);
+               M_80211_SCAN, M_INTWAIT | M_ZERO);
        if (st == NULL)
                return 0;
        lockinit(&st->st_lock, "scantable", 0, 0);
@@ -251,7 +251,7 @@ sta_add(struct ieee80211_scan_state *ss,
                if (IEEE80211_ADDR_EQ(se->base.se_macaddr, macaddr))
                        goto found;
        se = (struct sta_entry *) kmalloc(sizeof(struct sta_entry),
-               M_80211_SCAN, M_NOWAIT | M_ZERO);
+               M_80211_SCAN, M_INTWAIT | M_ZERO);
        if (se == NULL) {
                lockmgr(&st->st_lock, LK_RELEASE);
                return 0;
index 9fb7aed..7ce64b8 100644 (file)
@@ -100,7 +100,7 @@ ieee80211_superg_attach(struct ieee80211com *ic)
        if (ic->ic_caps & IEEE80211_C_FF) {
                sg = (struct ieee80211_superg *) kmalloc(
                     sizeof(struct ieee80211_superg), M_80211_VAP,
-                    M_NOWAIT | M_ZERO);
+                    M_INTWAIT | M_ZERO);
                if (sg == NULL) {
                        kprintf("%s: cannot allocate SuperG state block\n",
                            __func__);
@@ -300,7 +300,7 @@ ieee80211_ff_decap(struct ieee80211_node *ni, struct mbuf *m)
                vap->iv_stats.is_ff_tooshort++;
                return NULL;
        }
-       n = m_split(m, framelen, M_NOWAIT);
+       n = m_split(m, framelen, M_INTWAIT);
        if (n == NULL) {
                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY,
                    ni->ni_macaddr, "fast-frame",
@@ -508,7 +508,7 @@ ff_transmit(struct ieee80211_node *ni, struct mbuf *m)
                struct ifnet *ifp = vap->iv_ifp;
                struct ifnet *parent = ni->ni_ic->ic_ifp;
 
-               error = parent->if_transmit(parent, m);
+               error = ieee80211_handoff(parent, m);
                if (error != 0) {
                        /* NB: IFQ_HANDOFF reclaims mbuf */
                        ieee80211_free_node(ni);
index c339509..f40e944 100644 (file)
@@ -147,7 +147,8 @@ ieee80211_tdma_vattach(struct ieee80211vap *vap)
             ("not a tdma vap, caps 0x%x", vap->iv_caps));
 
        ts = (struct ieee80211_tdma_state *) kmalloc(
-            sizeof(struct ieee80211_tdma_state), M_80211_VAP, M_NOWAIT | M_ZERO);
+            sizeof(struct ieee80211_tdma_state), M_80211_VAP,
+            M_INTWAIT | M_ZERO);
        if (ts == NULL) {
                kprintf("%s: cannot allocate TDMA state block\n", __func__);
                /* NB: fall back to adhdemo mode */
index bd7a84b..8439987 100644 (file)
@@ -295,7 +295,7 @@ ieee80211_dwds_mcast(struct ieee80211vap *vap0, struct mbuf *m)
                mcopy->m_flags |= M_MCAST;
                mcopy->m_pkthdr.rcvif = (void *) ni;
 
-               err = parent->if_transmit(parent, mcopy);
+               err = ieee80211_handoff(parent, mcopy);
                if (err) {
                        /* NB: IFQ_HANDOFF reclaims mbuf */
                        ifp->if_oerrors++;