]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
net80211: free node reference in the ieee80211_parent_xmitpkt() when error happened.
authoradrian <adrian@FreeBSD.org>
Mon, 12 Oct 2015 04:30:38 +0000 (04:30 +0000)
committeradrian <adrian@FreeBSD.org>
Mon, 12 Oct 2015 04:30:38 +0000 (04:30 +0000)
Move error handling into ieee80211_parent_xmitpkt() instead of spreading it
between functions.

Submitted by: <s3erios@gmail.com>
Differential Revision: https://reviews.freebsd.org/D3772

sys/dev/iwn/if_iwn.c
sys/net80211/ieee80211_freebsd.c
sys/net80211/ieee80211_hostap.c
sys/net80211/ieee80211_mesh.c
sys/net80211/ieee80211_output.c
sys/net80211/ieee80211_power.c
sys/net80211/ieee80211_superg.c
sys/net80211/ieee80211_wds.c

index c1ed6ab0048113eefe454b5429a97f0864905e42..fe36294bbeba28dd3cff5f1332e8f43dfac194c6 100644 (file)
@@ -4950,9 +4950,7 @@ iwn_transmit(struct ieee80211com *ic, struct mbuf *m)
        }
 
        error = iwn_tx_data(sc, m, ni);
-       if (error) {
-               if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
-       } else
+       if (!error)
                sc->sc_tx_timer = 5;
        IWN_UNLOCK(sc);
        return (error);
index 5b2c103aaa210221c570909891f5707d22bb7f6e..7f2eae5dcfc16fdb6266dd425aada8c180138b69 100644 (file)
@@ -529,9 +529,6 @@ ieee80211_get_rx_params(struct mbuf *m, struct ieee80211_rx_stats *rxs)
 
 /*
  * Transmit a frame to the parent interface.
- *
- * TODO: if the transmission fails, make sure the parent node is freed
- *   (the callers will first need modifying.)
  */
 int
 ieee80211_parent_xmitpkt(struct ieee80211com *ic, struct mbuf *m)
@@ -544,8 +541,16 @@ ieee80211_parent_xmitpkt(struct ieee80211com *ic, struct mbuf *m)
         */
        IEEE80211_TX_LOCK_ASSERT(ic);
        error = ic->ic_transmit(ic, m);
-       if (error)
+       if (error) {
+               struct ieee80211_node *ni;
+
+               ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
+
+               /* XXX number of fragments */
+               if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
+               ieee80211_free_node(ni);
                ieee80211_free_mbuf(m);
+       }
        return (error);
 }
 
index ccb31abc66665b25ad3ee9354cf0e6eaa0c67a16..34d1b4ef5bb69e5977a2226e2a52b76de1e6a8ee 100644 (file)
@@ -2327,12 +2327,11 @@ ieee80211_recv_pspoll(struct ieee80211_node *ni, struct mbuf *m0)
 
        /*
         * Do the right thing; if it's an encap'ed frame then
-        * call ieee80211_parent_xmitpkt() (and free the ref) else
+        * call ieee80211_parent_xmitpkt() else
         * call ieee80211_vap_xmitpkt().
         */
        if (m->m_flags & M_ENCAP) {
-               if (ieee80211_parent_xmitpkt(ic, m) != 0)
-                       ieee80211_free_node(ni);
+               (void) ieee80211_parent_xmitpkt(ic, m);
        } else {
                (void) ieee80211_vap_xmitpkt(vap, m);
        }
index cb6ab81ff138873fe00aa7b810afb81ff84d6f1c..1778c091adc79048117fbd0959aed556616cf220 100644 (file)
@@ -1239,12 +1239,8 @@ mesh_forward(struct ieee80211vap *vap, struct mbuf *m,
        IEEE80211_TX_LOCK(ic);
        err = ieee80211_parent_xmitpkt(ic, mcopy);
        IEEE80211_TX_UNLOCK(ic);
-       if (err != 0) {
-               /* NB: IFQ_HANDOFF reclaims mbuf */
-               ieee80211_free_node(ni);
-       } else {
+       if (!err)
                if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
-       }
 }
 
 static struct mbuf *
index 149b726ce1fbf1b876e8af57f49a0d2135bfa7ae..81d9eb192e363b0fe0e2c4a53031f0dd4dcfe671 100644 (file)
@@ -132,7 +132,7 @@ ieee80211_vap_pkt_send_dest(struct ieee80211vap *vap, struct mbuf *m,
 {
        struct ieee80211com *ic = vap->iv_ic;
        struct ifnet *ifp = vap->iv_ifp;
-       int error, len, mcast;
+       int len, mcast;
 
        if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) &&
            (m->m_flags & M_PWR_SAV) == 0) {
@@ -264,18 +264,13 @@ ieee80211_vap_pkt_send_dest(struct ieee80211vap *vap, struct mbuf *m,
                        return (ENOBUFS);
                }
        }
-       error = ieee80211_parent_xmitpkt(ic, m);
+       (void) ieee80211_parent_xmitpkt(ic, m);
 
        /*
         * Unlock at this point - no need to hold it across
         * ieee80211_free_node() (ie, the comlock)
         */
        IEEE80211_TX_UNLOCK(ic);
-       if (error != 0) {
-               /* NB: IFQ_HANDOFF reclaims mbuf */
-               ieee80211_free_node(ni);
-               if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
-       }
        ic->ic_lastdata = ticks;
 
        return (0);
index 2d216c2ac7c89f4c8f4f91c3c74a2951d034c79d..73c1382b1218816b4b7366490936c24dedd00f7b 100644 (file)
@@ -457,12 +457,7 @@ pwrsave_flushq(struct ieee80211_node *ni)
                KASSERT((m->m_flags & M_ENCAP),
                    ("%s: parentq with non-M_ENCAP frame!\n",
                    __func__));
-               /*
-                * For encaped frames, we need to free the node
-                * reference upon failure.
-                */
-               if (ieee80211_parent_xmitpkt(ic, m) != 0)
-                       ieee80211_free_node(ni);
+               (void) ieee80211_parent_xmitpkt(ic, m);
        }
 
        /* VAP frames, aren't encapsulated */
index e91da017c8a5a3b0bb87789805597a309965a674..8be098a0fcacb147698b9ecf6b99a4b4df094b27 100644 (file)
@@ -475,13 +475,9 @@ ff_transmit(struct ieee80211_node *ni, struct mbuf *m)
        if (m != NULL) {
                struct ifnet *ifp = vap->iv_ifp;
 
-               error = ieee80211_parent_xmitpkt(ic, m);;
-               if (error != 0) {
-                       /* NB: IFQ_HANDOFF reclaims mbuf */
-                       ieee80211_free_node(ni);
-               } else {
+               error = ieee80211_parent_xmitpkt(ic, m);
+               if (!error)
                        if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
-               }
        } else
                ieee80211_free_node(ni);
 }
index 1d3f30a7a48e4dc69c2773793e0ebf7b82d0c3b1..a444b790bb7b89bb1f2cd40b882159b256d61155 100644 (file)
@@ -298,11 +298,7 @@ ieee80211_dwds_mcast(struct ieee80211vap *vap0, struct mbuf *m)
                mcopy->m_pkthdr.rcvif = (void *) ni;
 
                err = ieee80211_parent_xmitpkt(ic, mcopy);
-               if (err) {
-                       /* NB: IFQ_HANDOFF reclaims mbuf */
-                       if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
-                       ieee80211_free_node(ni);
-               } else {
+               if (!err) {
                        if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
                        if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
                        if_inc_counter(ifp, IFCOUNTER_OBYTES,