Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src-draft/trunk]: src/sys/dev/usb Use ieee80211_tx_complete() to free mbuf/n...



details:   https://anonhg.NetBSD.org/src-all/rev/58bb87ec3185
branches:  trunk
changeset: 367147:58bb87ec3185
user:      Martin Husemann <martin%NetBSD.org@localhost>
date:      Thu Feb 11 18:22:40 2021 +0100

description:
Use ieee80211_tx_complete() to free mbuf/node info.

Freeing them manually may bypass "tx complete" callbacks and break
timeout handling.

diffstat:

 sys/dev/usb/if_urtwn.c    |  11 +++++++++--
 sys/dev/usb/if_urtwnvar.h |   2 ++
 2 files changed, 11 insertions(+), 2 deletions(-)

diffs (54 lines):

diff -r 8a44775147d8 -r 58bb87ec3185 sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c    Thu Feb 11 18:20:29 2021 +0100
+++ b/sys/dev/usb/if_urtwn.c    Thu Feb 11 18:22:40 2021 +0100
@@ -850,6 +850,8 @@
 
                        data->sc = sc;  /* Backpointer for callbacks. */
                        data->pidx = j;
+                       data->m = NULL;
+                       data->ni = NULL;
 
                        error = usbd_create_xfer(sc->tx_pipe[j],
                            URTWN_TXBUFSZ, USBD_FORCE_SHORT_XFER, 0,
@@ -2997,6 +2999,11 @@
        DPRINTFN(DBG_FN|DBG_TX, ("%s: %s: status=%d\n",
            device_xname(sc->sc_dev), __func__, status));
 
+       if (data->m) {
+               ieee80211_tx_complete(data->ni, data->m, 0);
+               data->m = NULL;
+               data->ni = NULL;
+       }
        urtwn_put_tx_data(sc, data);
 
        s = splnet();
@@ -3218,6 +3225,8 @@
 
        xferlen = txd_len + m->m_pkthdr.len + padsize;
        m_copydata(m, 0, m->m_pkthdr.len, (char *)&txd[0] + txd_len + padsize);
+       data->m = m;
+       data->ni = ni;
 
        if (data->xfer == NULL) {
                /* NNN Don't crash ... but what is going on! */
@@ -3347,8 +3356,6 @@
                        urtwn_put_tx_data(sc, data);
                        continue;
                }
-               m_freem(m);
-               ieee80211_free_node(ni);
                sc->tx_timer = 5;
                callout_schedule(&sc->sc_watchdog_to, hz);
        }
diff -r 8a44775147d8 -r 58bb87ec3185 sys/dev/usb/if_urtwnvar.h
--- a/sys/dev/usb/if_urtwnvar.h Thu Feb 11 18:20:29 2021 +0100
+++ b/sys/dev/usb/if_urtwnvar.h Thu Feb 11 18:22:40 2021 +0100
@@ -80,6 +80,8 @@
        size_t                          pidx;
        struct usbd_xfer                *xfer;
        uint8_t                         *buf;
+       struct mbuf                     *m;
+       struct ieee80211_node           *ni;
        TAILQ_ENTRY(urtwn_tx_data)      next;
 };
 



Home | Main Index | Thread Index | Old Index