summaryrefslogtreecommitdiffstats
path: root/sys/net/if_tap.c
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2004-10-31 17:39:46 +0000
committerglebius <glebius@FreeBSD.org>2004-10-31 17:39:46 +0000
commit08501005ec8ab1e5d44c27c83e0ba0166796e495 (patch)
tree7b80eaa6e0949aa12a046fdaeac3657646e92dac /sys/net/if_tap.c
parentf915b81562a8efc72df0b8d31c07d15630050c91 (diff)
downloadFreeBSD-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.c38
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 = &top;
- 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);
OpenPOWER on IntegriCloud