diff options
author | glebius <glebius@FreeBSD.org> | 2004-10-31 17:39:46 +0000 |
---|---|---|
committer | glebius <glebius@FreeBSD.org> | 2004-10-31 17:39:46 +0000 |
commit | 08501005ec8ab1e5d44c27c83e0ba0166796e495 (patch) | |
tree | 7b80eaa6e0949aa12a046fdaeac3657646e92dac /sys/net/if_tap.c | |
parent | f915b81562a8efc72df0b8d31c07d15630050c91 (diff) | |
download | FreeBSD-src-08501005ec8ab1e5d44c27c83e0ba0166796e495.zip FreeBSD-src-08501005ec8ab1e5d44c27c83e0ba0166796e495.tar.gz |
Utilize m_uiotombuf() in device write method, instead of home-grown
implementation. This also gives a performance improvement, because
m_uiotombuf() utilizes clusters.
Approved by: julian (mentor)
MFC after: 1 month
Diffstat (limited to 'sys/net/if_tap.c')
-rw-r--r-- | sys/net/if_tap.c | 38 |
1 files changed, 6 insertions, 32 deletions
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c index 59b1780..05b037f 100644 --- a/sys/net/if_tap.c +++ b/sys/net/if_tap.c @@ -800,8 +800,8 @@ tapwrite(dev, uio, flag) { struct tap_softc *tp = dev->si_drv1; struct ifnet *ifp = &tp->tap_if; - struct mbuf *top = NULL, **mp = NULL, *m = NULL; - int error = 0, tlen, mlen; + struct mbuf *m; + int error = 0; TAPDEBUG("%s writting, minor = %#x\n", ifp->if_xname, minor(dev)); @@ -815,42 +815,16 @@ tapwrite(dev, uio, flag) return (EIO); } - tlen = uio->uio_resid; - - /* get a header mbuf */ - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) - return (ENOBUFS); - mlen = MHLEN; - - top = 0; - mp = ⊤ - while ((error == 0) && (uio->uio_resid > 0)) { - m->m_len = min(mlen, uio->uio_resid); - error = uiomove(mtod(m, void *), m->m_len, uio); - *mp = m; - mp = &m->m_next; - if (uio->uio_resid > 0) { - MGET(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { - error = ENOBUFS; - break; - } - mlen = MLEN; - } - } - if (error) { + + if ((m = m_uiotombuf(uio, M_DONTWAIT, 0)) == NULL) { ifp->if_ierrors ++; - if (top) - m_freem(top); return (error); } - top->m_pkthdr.len = tlen; - top->m_pkthdr.rcvif = ifp; + m->m_pkthdr.rcvif = ifp; /* Pass packet up to parent. */ - (*ifp->if_input)(ifp, top); + (*ifp->if_input)(ifp, m); ifp->if_ipackets ++; /* ibytes are counted in parent */ return (0); |