diff options
author | Christian Weisgerber <naddy@cvs.openbsd.org> | 2008-10-14 18:01:54 +0000 |
---|---|---|
committer | Christian Weisgerber <naddy@cvs.openbsd.org> | 2008-10-14 18:01:54 +0000 |
commit | cbc88b3c14c04595503ce45046c13a37f77b5385 (patch) | |
tree | 71c6224ee28a75e73b9d01d08760ae100cbe250b /sys | |
parent | 8e9707c8a7ef0ba1ba66f02dfad7dda445bf55c5 (diff) |
Change m_devget()'s outdated and unused "offset" argument: It is
now the offset into the first mbuf of the target chain before copying
the source data over. From FreeBSD.
Convert drivers' use of m_devget(). Mostly from thib@.
Update mbuf(9) man page.
ok claudio@, thib@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/sparc/dev/hme.c | 7 | ||||
-rw-r--r-- | sys/dev/ic/dc.c | 7 | ||||
-rw-r--r-- | sys/dev/ic/mtd8xx.c | 7 | ||||
-rw-r--r-- | sys/dev/ic/rtl81x9.c | 19 | ||||
-rw-r--r-- | sys/dev/pci/if_bge.c | 9 | ||||
-rw-r--r-- | sys/dev/pci/if_cas.c | 13 | ||||
-rw-r--r-- | sys/dev/pci/if_msk.c | 7 | ||||
-rw-r--r-- | sys/dev/pci/if_sis.c | 7 | ||||
-rw-r--r-- | sys/dev/pci/if_sk.c | 7 | ||||
-rw-r--r-- | sys/dev/pci/if_ti.c | 7 | ||||
-rw-r--r-- | sys/dev/pci/if_vge.c | 8 | ||||
-rw-r--r-- | sys/dev/pci/if_vr.c | 7 | ||||
-rw-r--r-- | sys/dev/pci/if_wb.c | 7 | ||||
-rw-r--r-- | sys/dev/pcmcia/if_malo.c | 7 | ||||
-rw-r--r-- | sys/dev/usb/if_upgt.c | 6 | ||||
-rw-r--r-- | sys/kern/uipc_mbuf.c | 75 |
16 files changed, 87 insertions, 113 deletions
diff --git a/sys/arch/sparc/dev/hme.c b/sys/arch/sparc/dev/hme.c index a9984cb6b21..ef974a765cd 100644 --- a/sys/arch/sparc/dev/hme.c +++ b/sys/arch/sparc/dev/hme.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hme.c,v 1.56 2008/10/02 20:21:13 brad Exp $ */ +/* $OpenBSD: hme.c,v 1.57 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1998 Jason L. Wright (jason@thought.net) @@ -953,13 +953,12 @@ hme_read(sc, idx, len, flags) } /* Pull packet off interface. */ - m = m_devget(sc->sc_bufs->rx_buf[idx], len + HME_RX_OFFSET, 0, - &sc->sc_arpcom.ac_if, NULL); + m = m_devget(sc->sc_bufs->rx_buf[idx] + HME_RX_OFFSET, len, + HME_RX_OFFSET, &sc->sc_arpcom.ac_if, NULL); if (m == NULL) { ifp->if_ierrors++; return; } - m_adj(m, HME_RX_OFFSET); ifp->if_ipackets++; hme_rxcksum(m, flags); diff --git a/sys/dev/ic/dc.c b/sys/dev/ic/dc.c index 1f6be3b776e..232494a990b 100644 --- a/sys/dev/ic/dc.c +++ b/sys/dev/ic/dc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dc.c,v 1.104 2008/10/02 20:21:13 brad Exp $ */ +/* $OpenBSD: dc.c,v 1.105 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -2183,15 +2183,14 @@ dc_rxeof(struct dc_softc *sc) total_len -= ETHER_CRC_LEN; m->m_pkthdr.rcvif = ifp; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); dc_newbuf(sc, i, m); DC_INC(i, DC_RX_LIST_CNT); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; ifp->if_ipackets++; diff --git a/sys/dev/ic/mtd8xx.c b/sys/dev/ic/mtd8xx.c index 0256e67a490..3fa3f8daa8b 100644 --- a/sys/dev/ic/mtd8xx.c +++ b/sys/dev/ic/mtd8xx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mtd8xx.c,v 1.14 2008/10/02 20:21:13 brad Exp $ */ +/* $OpenBSD: mtd8xx.c,v 1.15 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 2003 Oleg Safiullin <form@pdp11.org.ru> @@ -945,15 +945,14 @@ mtd_rxeof(struct mtd_softc *sc) 0, sc->mtd_cdata.mtd_rx_chain[i].sd_map->dm_mapsize, BUS_DMASYNC_POSTREAD); - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, total_len + ETHER_ALIGN, - 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); mtd_newbuf(sc, i, m); i = (i + 1) % MTD_RX_LIST_CNT; if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; ifp->if_ipackets++; diff --git a/sys/dev/ic/rtl81x9.c b/sys/dev/ic/rtl81x9.c index f7e9c98f9d9..3a0256f699e 100644 --- a/sys/dev/ic/rtl81x9.c +++ b/sys/dev/ic/rtl81x9.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtl81x9.c,v 1.60 2008/10/02 20:21:13 brad Exp $ */ +/* $OpenBSD: rtl81x9.c,v 1.61 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998 @@ -676,27 +676,22 @@ rl_rxeof(sc) wrap = (sc->rl_cdata.rl_rx_buf + RL_RXBUFLEN) - rxbufpos; if (total_len > wrap) { - m = m_devget(rxbufpos - ETHER_ALIGN, - wrap + ETHER_ALIGN, 0, ifp, NULL); + m = m_devget(rxbufpos, wrap, ETHER_ALIGN, ifp, NULL); if (m == NULL) ifp->if_ierrors++; else { - m_copyback(m, wrap + ETHER_ALIGN, - total_len - wrap, sc->rl_cdata.rl_rx_buf); - m = m_pullup(m, sizeof(struct ip) +ETHER_ALIGN); + m_copyback(m, wrap, total_len - wrap, + sc->rl_cdata.rl_rx_buf); + m = m_pullup(m, sizeof(struct ip)); if (m == NULL) ifp->if_ierrors++; - else - m_adj(m, ETHER_ALIGN); } cur_rx = (total_len - wrap + ETHER_CRC_LEN); } else { - m = m_devget(rxbufpos - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m = m_devget(rxbufpos, total_len, ETHER_ALIGN, ifp, + NULL); if (m == NULL) ifp->if_ierrors++; - else - m_adj(m, ETHER_ALIGN); cur_rx += total_len + 4 + ETHER_CRC_LEN; } diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c index 539479badda..7ef02187d77 100644 --- a/sys/dev/pci/if_bge.c +++ b/sys/dev/pci/if_bge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bge.c,v 1.246 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_bge.c,v 1.247 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -2468,15 +2468,14 @@ bge_rxeof(struct bge_softc *sc) if (bge_newbuf_jumbo(sc, sc->bge_jumbo, NULL) == ENOBUFS) { struct mbuf *m0; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - cur_rx->bge_len - ETHER_CRC_LEN + - ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), + cur_rx->bge_len - ETHER_CRC_LEN, + ETHER_ALIGN, ifp, NULL); bge_newbuf_jumbo(sc, sc->bge_jumbo, m); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; } } else { diff --git a/sys/dev/pci/if_cas.c b/sys/dev/pci/if_cas.c index a6cfd556c05..4c42eb8bbe0 100644 --- a/sys/dev/pci/if_cas.c +++ b/sys/dev/pci/if_cas.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_cas.c,v 1.22 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_cas.c,v 1.23 2008/10/14 18:01:53 naddy Exp $ */ /* * @@ -1205,14 +1205,13 @@ cas_rint(struct cas_softc *sc) bus_dmamap_sync(sc->sc_dmatag, rxs->rxs_dmamap, 0, rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); - cp = rxs->rxs_kva + off * 256; - m = m_devget(cp, len + ETHER_ALIGN, 0, ifp, NULL); + cp = rxs->rxs_kva + off * 256 + ETHER_ALIGN; + m = m_devget(cp, len, ETHER_ALIGN, ifp, NULL); if (word[0] & CAS_RC0_RELEASE_HDR) cas_add_rxbuf(sc, idx); if (m != NULL) { - m_adj(m, ETHER_ALIGN); #if NBPFILTER > 0 /* @@ -1242,15 +1241,13 @@ cas_rint(struct cas_softc *sc) rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD); /* XXX We should not be copying the packet here. */ - cp = rxs->rxs_kva + off; - m = m_devget(cp, len + ETHER_ALIGN, 0, ifp, NULL); + cp = rxs->rxs_kva + off + ETHER_ALIGN; + m = m_devget(cp, len, ETHER_ALIGN, ifp, NULL); if (word[0] & CAS_RC0_RELEASE_DATA) cas_add_rxbuf(sc, idx); if (m != NULL) { - m_adj(m, ETHER_ALIGN); - #if NBPFILTER > 0 /* * Pass this up to any BPF listeners, but only diff --git a/sys/dev/pci/if_msk.c b/sys/dev/pci/if_msk.c index 489ef5e9b96..ad9c0958fad 100644 --- a/sys/dev/pci/if_msk.c +++ b/sys/dev/pci/if_msk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_msk.c,v 1.66 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_msk.c,v 1.67 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -1702,14 +1702,13 @@ msk_rxeof(struct sk_if_softc *sc_if, u_int16_t len, u_int32_t rxstat) */ if (msk_newbuf(sc_if, cur, NULL, dmamap) == ENOBUFS) { struct mbuf *m0; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); msk_newbuf(sc_if, cur, m, dmamap); if (m0 == NULL) { ifp->if_ierrors++; return; } - m_adj(m0, ETHER_ALIGN); m = m0; } else { m->m_pkthdr.rcvif = ifp; diff --git a/sys/dev/pci/if_sis.c b/sys/dev/pci/if_sis.c index 34fd7dac425..d1d94d5b1fc 100644 --- a/sys/dev/pci/if_sis.c +++ b/sys/dev/pci/if_sis.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_sis.c,v 1.82 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_sis.c,v 1.83 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998, 1999 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. @@ -1344,14 +1344,13 @@ sis_rxeof(struct sis_softc *sc) #endif { struct mbuf *m0; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); sis_newbuf(sc, cur_rx, m); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; } diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index 13c3b8b0e4c..40466aa83f7 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_sk.c,v 1.148 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_sk.c,v 1.149 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 @@ -1777,14 +1777,13 @@ sk_rxeof(struct sk_if_softc *sc_if) */ if (sk_newbuf(sc_if, cur, NULL, dmamap) == ENOBUFS) { struct mbuf *m0; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); sk_newbuf(sc_if, cur, m, dmamap); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; } else { m->m_pkthdr.rcvif = ifp; diff --git a/sys/dev/pci/if_ti.c b/sys/dev/pci/if_ti.c index a0045948c75..4520179b368 100644 --- a/sys/dev/pci/if_ti.c +++ b/sys/dev/pci/if_ti.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ti.c,v 1.88 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_ti.c,v 1.89 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -1787,14 +1787,13 @@ ti_rxeof(struct ti_softc *sc) if (ti_newbuf_jumbo(sc, sc->ti_jumbo, NULL) == ENOBUFS) { struct mbuf *m0; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - cur_rx->ti_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), cur_rx->ti_len, + ETHER_ALIGN, ifp, NULL); ti_newbuf_jumbo(sc, sc->ti_jumbo, m); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; } } else if (cur_rx->ti_flags & TI_BDFLAG_MINI_RING) { diff --git a/sys/dev/pci/if_vge.c b/sys/dev/pci/if_vge.c index 8259c41a1bf..1c1de93f34c 100644 --- a/sys/dev/pci/if_vge.c +++ b/sys/dev/pci/if_vge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_vge.c,v 1.39 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_vge.c,v 1.40 2008/10/14 18:01:53 naddy Exp $ */ /* $FreeBSD: if_vge.c,v 1.3 2004/09/11 22:13:25 wpaul Exp $ */ /* * Copyright (c) 2004 @@ -1031,15 +1031,13 @@ vge_rxeof(struct vge_softc *sc) sc->vge_head = sc->vge_tail = NULL; } - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len - ETHER_CRC_LEN + ETHER_ALIGN, - 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), + total_len - ETHER_CRC_LEN, ETHER_ALIGN, ifp, NULL); vge_newbuf(sc, i, m); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; VGE_RX_DESC_INC(i); diff --git a/sys/dev/pci/if_vr.c b/sys/dev/pci/if_vr.c index e4def20edf5..90d0d884645 100644 --- a/sys/dev/pci/if_vr.c +++ b/sys/dev/pci/if_vr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_vr.c,v 1.78 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_vr.c,v 1.79 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998 @@ -806,14 +806,13 @@ vr_rxeof(struct vr_softc *sc) } else #endif { - m0 = m_devget(mtod(m, caddr_t) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, caddr_t), total_len, + ETHER_ALIGN, ifp, NULL); vr_alloc_mbuf(sc, cur_rx, m); if (m0 == NULL) { ifp->if_ierrors++; continue; } - m_adj(m0, ETHER_ALIGN); m = m0; } diff --git a/sys/dev/pci/if_wb.c b/sys/dev/pci/if_wb.c index e94485747a7..4b3d36dc0e4 100644 --- a/sys/dev/pci/if_wb.c +++ b/sys/dev/pci/if_wb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_wb.c,v 1.40 2008/10/02 20:21:14 brad Exp $ */ +/* $OpenBSD: if_wb.c,v 1.41 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 1997, 1998 @@ -1050,14 +1050,13 @@ void wb_rxeof(sc) */ total_len -= ETHER_CRC_LEN; - m0 = m_devget(mtod(m, char *) - ETHER_ALIGN, - total_len + ETHER_ALIGN, 0, ifp, NULL); + m0 = m_devget(mtod(m, char *), total_len, ETHER_ALIGN, + ifp, NULL); wb_newbuf(sc, cur_rx, m); if (m0 == NULL) { ifp->if_ierrors++; break; } - m_adj(m0, ETHER_ALIGN); m = m0; ifp->if_ipackets++; diff --git a/sys/dev/pcmcia/if_malo.c b/sys/dev/pcmcia/if_malo.c index d8ff907f818..ba2395d7a66 100644 --- a/sys/dev/pcmcia/if_malo.c +++ b/sys/dev/pcmcia/if_malo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_malo.c,v 1.63 2008/07/29 10:05:38 thib Exp $ */ +/* $OpenBSD: if_malo.c,v 1.64 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org> @@ -927,14 +927,13 @@ cmalo_rx(struct malo_softc *sc) rxdesc->pkglen -= sizeof(struct llc); /* prepare mbuf */ - m = m_devget(sc->sc_data + rxdesc->pkgoffset - ETHER_ALIGN, - rxdesc->pkglen + ETHER_ALIGN, 0, ifp, NULL); + m = m_devget(sc->sc_data + rxdesc->pkgoffset, + rxdesc->pkglen, ETHER_ALIGN, ifp, NULL); if (m == NULL) { DPRINTF(1, "RX m_devget failed!\n"); ifp->if_ierrors++; return; } - m_adj(m, ETHER_ALIGN); #if NBPFILTER > 0 if (ifp->if_bpf) diff --git a/sys/dev/usb/if_upgt.c b/sys/dev/usb/if_upgt.c index a7496e3319f..3981c81c901 100644 --- a/sys/dev/usb/if_upgt.c +++ b/sys/dev/usb/if_upgt.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_upgt.c,v 1.38 2008/08/27 10:34:24 damien Exp $ */ +/* $OpenBSD: if_upgt.c,v 1.39 2008/10/14 18:01:53 naddy Exp $ */ /* * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org> @@ -1780,14 +1780,12 @@ upgt_rx(struct upgt_softc *sc, uint8_t *data, int pkglen) rxdesc = (struct upgt_lmac_rx_desc *)data; /* create mbuf which is suitable for strict alignment archs */ - m = m_devget(rxdesc->data - ETHER_ALIGN, pkglen + ETHER_ALIGN, 0, ifp, - NULL); + m = m_devget(rxdesc->data, pkglen, ETHER_ALIGN, ifp, NULL); if (m == NULL) { DPRINTF(1, "%s: could not create RX mbuf!\n", sc->sc_dev.dv_xname); ifp->if_ierrors++; return; } - m_adj(m, ETHER_ALIGN); s = splnet(); diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index 7c46413419f..7db45a81cff 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_mbuf.c,v 1.93 2008/09/28 14:08:51 naddy Exp $ */ +/* $OpenBSD: uipc_mbuf.c,v 1.94 2008/10/14 18:01:53 naddy Exp $ */ /* $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $ */ /* @@ -922,28 +922,24 @@ struct mbuf * m_devget(char *buf, int totlen, int off, struct ifnet *ifp, void (*copy)(const void *, void *, size_t)) { - struct mbuf *m; - struct mbuf *top = NULL, **mp = ⊤ - int len; - char *cp; - char *epkt; - - cp = buf; - epkt = cp + totlen; - if (off) { - /* - * If 'off' is non-zero, packet is trailer-encapsulated, - * so we have to skip the type and length fields. - */ - cp += off + 2 * sizeof(u_int16_t); - totlen -= 2 * sizeof(u_int16_t); - } + struct mbuf *m; + struct mbuf *top, **mp; + int len; + + top = NULL; + mp = ⊤ + + if (off < 0 || off > MHLEN) + return (NULL); + MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) return (NULL); + m->m_pkthdr.rcvif = ifp; m->m_pkthdr.len = totlen; - m->m_len = MHLEN; + + len = MHLEN; while (totlen > 0) { if (top != NULL) { @@ -952,37 +948,38 @@ m_devget(char *buf, int totlen, int off, struct ifnet *ifp, m_freem(top); return (NULL); } - m->m_len = MLEN; + len = MLEN; } - len = min(totlen, epkt - cp); - if (len >= MINCLSIZE) { + + if (totlen + off >= MINCLSIZE) { MCLGET(m, M_DONTWAIT); if (m->m_flags & M_EXT) - m->m_len = len = min(len, MCLBYTES); - else - len = m->m_len; + len = MCLBYTES; } else { - /* - * Place initial small packet/header at end of mbuf. - */ - if (len < m->m_len) { - if (top == NULL && - len + max_linkhdr <= m->m_len) - m->m_data += max_linkhdr; - m->m_len = len; - } else - len = m->m_len; + /* Place initial small packet/header at end of mbuf. */ + if (top == NULL && totlen + off + max_linkhdr <= len) { + m->m_data += max_linkhdr; + len -= max_linkhdr; + } + } + + if (off) { + m->m_data += off; + len -= off; + off = 0; } + + m->m_len = len = min(totlen, len); + if (copy) - copy(cp, mtod(m, caddr_t), (size_t)len); + copy(buf, mtod(m, caddr_t), (size_t)len); else - bcopy(cp, mtod(m, caddr_t), (size_t)len); - cp += len; + bcopy(buf, mtod(m, caddr_t), (size_t)len); + + buf += len; *mp = m; mp = &m->m_next; totlen -= len; - if (cp == epkt) - cp = buf; } return (top); } |