1de06f907SNik Clayton.\" Copyright (c) 2000 FreeBSD Inc. 2de06f907SNik Clayton.\" All rights reserved. 3de06f907SNik Clayton.\" 4de06f907SNik Clayton.\" Redistribution and use in source and binary forms, with or without 5de06f907SNik Clayton.\" modification, are permitted provided that the following conditions 6de06f907SNik Clayton.\" are met: 7de06f907SNik Clayton.\" 1. Redistributions of source code must retain the above copyright 8de06f907SNik Clayton.\" notice, this list of conditions and the following disclaimer. 9de06f907SNik Clayton.\" 2. Redistributions in binary form must reproduce the above copyright 10de06f907SNik Clayton.\" notice, this list of conditions and the following disclaimer in the 11de06f907SNik Clayton.\" documentation and/or other materials provided with the distribution. 12de06f907SNik Clayton.\" 13de06f907SNik Clayton.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14de06f907SNik Clayton.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15de06f907SNik Clayton.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16de06f907SNik Clayton.\" ARE DISCLAIMED. IN NO EVENT SHALL [your name] OR CONTRIBUTORS BE LIABLE 17de06f907SNik Clayton.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18de06f907SNik Clayton.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19de06f907SNik Clayton.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20de06f907SNik Clayton.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21de06f907SNik Clayton.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22de06f907SNik Clayton.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23de06f907SNik Clayton.\" SUCH DAMAGE. 24de06f907SNik Clayton.\" 25de06f907SNik Clayton.\" $FreeBSD$ 26de06f907SNik Clayton.\" 27*c3a2dbe9SDag-Erling Smørgrav.Dd August 7, 2010 28de06f907SNik Clayton.Dt MBUF 9 29de06f907SNik Clayton.Os 30de06f907SNik Clayton.\" 31de06f907SNik Clayton.Sh NAME 32de06f907SNik Clayton.Nm mbuf 33de06f907SNik Clayton.Nd "memory management in the kernel IPC subsystem" 34de06f907SNik Clayton.\" 35de06f907SNik Clayton.Sh SYNOPSIS 3632eef9aeSRuslan Ermilov.In sys/param.h 37f16b3c0dSChad David.In sys/systm.h 3832eef9aeSRuslan Ermilov.In sys/mbuf.h 39de06f907SNik Clayton.\" 40bfd59721SBosko Milekic.Ss Mbuf allocation macros 41de06f907SNik Clayton.Fn MGET "struct mbuf *mbuf" "int how" "short type" 42de06f907SNik Clayton.Fn MGETHDR "struct mbuf *mbuf" "int how" "short type" 43de06f907SNik Clayton.Fn MCLGET "struct mbuf *mbuf" "int how" 44bfd59721SBosko Milekic.Fo MEXTADD 45bfd59721SBosko Milekic.Fa "struct mbuf *mbuf" 46bfd59721SBosko Milekic.Fa "caddr_t buf" 47bfd59721SBosko Milekic.Fa "u_int size" 48cf827063SPoul-Henning Kamp.Fa "void (*free)(void *opt_arg1, void *opt_arg2)" 49cf827063SPoul-Henning Kamp.Fa "void *opt_arg1" 50cf827063SPoul-Henning Kamp.Fa "void *opt_arg2" 515d4050ccSBosko Milekic.Fa "short flags" 525d4050ccSBosko Milekic.Fa "int type" 53bfd59721SBosko Milekic.Fc 54bfd59721SBosko Milekic.Fn MEXTFREE "struct mbuf *mbuf" 55bfd59721SBosko Milekic.Fn MFREE "struct mbuf *mbuf" "struct mbuf *successor" 56de06f907SNik Clayton.\" 57bfd59721SBosko Milekic.Ss Mbuf utility macros 58f16b3c0dSChad David.Fn mtod "struct mbuf *mbuf" "type" 59bfd59721SBosko Milekic.Fn M_ALIGN "struct mbuf *mbuf" "u_int len" 60bfd59721SBosko Milekic.Fn MH_ALIGN "struct mbuf *mbuf" "u_int len" 61f16b3c0dSChad David.Ft int 62bfd59721SBosko Milekic.Fn M_LEADINGSPACE "struct mbuf *mbuf" 63f16b3c0dSChad David.Ft int 64bfd59721SBosko Milekic.Fn M_TRAILINGSPACE "struct mbuf *mbuf" 65da72b998SYaroslav Tykhiy.Fn M_MOVE_PKTHDR "struct mbuf *to" "struct mbuf *from" 66bfd59721SBosko Milekic.Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how" 67bfd59721SBosko Milekic.Fn MCHTYPE "struct mbuf *mbuf" "u_int type" 68f16b3c0dSChad David.Ft int 695d4050ccSBosko Milekic.Fn M_WRITABLE "struct mbuf *mbuf" 70bfd59721SBosko Milekic.\" 71bfd59721SBosko Milekic.Ss Mbuf allocation functions 72de06f907SNik Clayton.Ft struct mbuf * 73de06f907SNik Clayton.Fn m_get "int how" "int type" 74de06f907SNik Clayton.Ft struct mbuf * 75328c0bbcSBosko Milekic.Fn m_getm "struct mbuf *orig" "int len" "int how" "int type" 76328c0bbcSBosko Milekic.Ft struct mbuf * 776c013706SMaxim Konovalov.Fn m_getcl "int how" "short type" "int flags" 786c013706SMaxim Konovalov.Ft struct mbuf * 79de06f907SNik Clayton.Fn m_getclr "int how" "int type" 80de06f907SNik Clayton.Ft struct mbuf * 81de06f907SNik Clayton.Fn m_gethdr "int how" "int type" 82bfd59721SBosko Milekic.Ft struct mbuf * 83bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf" 84de06f907SNik Clayton.Ft void 85de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf" 86bfd59721SBosko Milekic.\" 87bfd59721SBosko Milekic.Ss Mbuf utility functions 88de06f907SNik Clayton.Ft void 89de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len" 909c3fd404SSam Leffler.Ft void 919c3fd404SSam Leffler.Fn m_align "struct mbuf *mbuf" "int len" 92b9def06bSSam Leffler.Ft int 93b9def06bSSam Leffler.Fn m_append "struct mbuf *mbuf" "int len" "c_caddr_t cp" 94de06f907SNik Clayton.Ft struct mbuf * 95de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how" 96de06f907SNik Clayton.Ft struct mbuf * 977ac139a9SJohn-Mark Gurney.Fn m_copyup "struct mbuf *mbuf" "int len" "int dstoff" 987ac139a9SJohn-Mark Gurney.Ft struct mbuf * 99de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len" 100de06f907SNik Clayton.Ft struct mbuf * 101d305f4b9SBruce M Simpson.Fn m_pulldown "struct mbuf *mbuf" "int offset" "int len" "int *offsetp" 102d305f4b9SBruce M Simpson.Ft struct mbuf * 103de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how" 104de06f907SNik Clayton.Ft struct mbuf * 105de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how" 106de06f907SNik Clayton.Ft struct mbuf * 107de06f907SNik Clayton.Fn m_dup "struct mbuf *mbuf" "int how" 108de06f907SNik Clayton.Ft void 1090d8e4c57SBruce Evans.Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf" 110de06f907SNik Clayton.Ft void 111de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf" 112de06f907SNik Clayton.Ft struct mbuf * 113de06f907SNik Clayton.Fo m_devget 114de06f907SNik Clayton.Fa "char *buf" 115de06f907SNik Clayton.Fa "int len" 116de06f907SNik Clayton.Fa "int offset" 117de06f907SNik Clayton.Fa "struct ifnet *ifp" 118de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)" 119de06f907SNik Clayton.Fc 120de06f907SNik Clayton.Ft void 121de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n" 122e60fa837SRuslan Ermilov.Ft u_int 1230b1c0994SPoul-Henning Kamp.Fn m_fixhdr "struct mbuf *mbuf" 124da72b998SYaroslav Tykhiy.Ft void 125da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr "struct mbuf *to" "struct mbuf *from" 126da72b998SYaroslav Tykhiy.Ft void 127da72b998SYaroslav Tykhiy.Fn m_move_pkthdr "struct mbuf *to" "struct mbuf *from" 128e60fa837SRuslan Ermilov.Ft u_int 1290b1c0994SPoul-Henning Kamp.Fn m_length "struct mbuf *mbuf" "struct mbuf **last" 130de06f907SNik Clayton.Ft struct mbuf * 131de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how" 13202312219SBruce M Simpson.Ft int 13302312219SBruce M Simpson.Fn m_apply "struct mbuf *mbuf" "int off" "int len" "int (*f)(void *arg, void *data, u_int len)" "void *arg" 13402312219SBruce M Simpson.Ft struct mbuf * 13502312219SBruce M Simpson.Fn m_getptr "struct mbuf *mbuf" "int loc" "int *off" 136a61bc764SMike Silbersack.Ft struct mbuf * 137a61bc764SMike Silbersack.Fn m_defrag "struct mbuf *m0" "int how" 13847e2996eSSam Leffler.Ft struct mbuf * 13947e2996eSSam Leffler.Fn m_unshare "struct mbuf *m0" "int how" 140de06f907SNik Clayton.\" 141de06f907SNik Clayton.Sh DESCRIPTION 1427b2fd183SYaroslav TykhiyAn 1437b2fd183SYaroslav Tykhiy.Vt mbuf 1447b2fd183SYaroslav Tykhiyis a basic unit of memory management in the kernel IPC subsystem. 1457b2fd183SYaroslav TykhiyNetwork packets and socket buffers are stored in 1467b2fd183SYaroslav Tykhiy.Vt mbufs . 1477b2fd183SYaroslav TykhiyA network packet may span multiple 1487b2fd183SYaroslav Tykhiy.Vt mbufs 1497b2fd183SYaroslav Tykhiyarranged into a 1507b2fd183SYaroslav Tykhiy.Vt mbuf chain 151c4d9468eSRuslan Ermilov(linked list), 152de06f907SNik Claytonwhich allows adding or trimming 153bfd59721SBosko Milekicnetwork headers with little overhead. 154de06f907SNik Clayton.Pp 1557b2fd183SYaroslav TykhiyWhile a developer should not bother with 1567b2fd183SYaroslav Tykhiy.Vt mbuf 1577b2fd183SYaroslav Tykhiyinternals without serious 158de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it 1597b2fd183SYaroslav Tykhiyis useful to understand the general structure of an 1607b2fd183SYaroslav Tykhiy.Vt mbuf . 161de06f907SNik Clayton.Pp 1627b2fd183SYaroslav TykhiyAn 1637b2fd183SYaroslav Tykhiy.Vt mbuf 1647b2fd183SYaroslav Tykhiyconsists of a variable-sized header and a small internal 165e73145f6SSheldon Hearnbuffer for data. 1667b2fd183SYaroslav TykhiyThe total size of an 1677b2fd183SYaroslav Tykhiy.Vt mbuf , 168bfd59721SBosko Milekic.Dv MSIZE , 169feccf50cSAlex Dupreis a constant defined in 170feccf50cSAlex Dupre.In sys/param.h . 1717b2fd183SYaroslav TykhiyThe 1727b2fd183SYaroslav Tykhiy.Vt mbuf 1737b2fd183SYaroslav Tykhiyheader includes: 174de06f907SNik Clayton.Pp 175238d9c59SYaroslav Tykhiy.Bl -tag -width "m_nextpkt" -offset indent 176be82a0bcSYaroslav Tykhiy.It Va m_next 177238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf * 178238d9c59SYaroslav TykhiyA pointer to the next 1797b2fd183SYaroslav Tykhiy.Vt mbuf 1807b2fd183SYaroslav Tykhiyin the 181238d9c59SYaroslav Tykhiy.Vt mbuf chain . 182be82a0bcSYaroslav Tykhiy.It Va m_nextpkt 183238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf * 184238d9c59SYaroslav TykhiyA pointer to the next 1857b2fd183SYaroslav Tykhiy.Vt mbuf chain 186238d9c59SYaroslav Tykhiyin the queue. 187be82a0bcSYaroslav Tykhiy.It Va m_data 188238d9c59SYaroslav Tykhiy.Pq Vt caddr_t 189238d9c59SYaroslav TykhiyA pointer to data attached to this 190238d9c59SYaroslav Tykhiy.Vt mbuf . 191be82a0bcSYaroslav Tykhiy.It Va m_len 192238d9c59SYaroslav Tykhiy.Pq Vt int 193238d9c59SYaroslav TykhiyThe length of the data. 194be82a0bcSYaroslav Tykhiy.It Va m_type 195238d9c59SYaroslav Tykhiy.Pq Vt short 196238d9c59SYaroslav TykhiyThe type of the data. 197be82a0bcSYaroslav Tykhiy.It Va m_flags 198238d9c59SYaroslav Tykhiy.Pq Vt int 199238d9c59SYaroslav TykhiyThe 2007b2fd183SYaroslav Tykhiy.Vt mbuf 201238d9c59SYaroslav Tykhiyflags. 202de06f907SNik Clayton.El 203de06f907SNik Clayton.Pp 2047b2fd183SYaroslav TykhiyThe 2057b2fd183SYaroslav Tykhiy.Vt mbuf 2067b2fd183SYaroslav Tykhiyflag bits are defined as follows: 207de06f907SNik Clayton.Bd -literal 208de06f907SNik Clayton/* mbuf flags */ 209de06f907SNik Clayton#define M_EXT 0x0001 /* has associated external storage */ 210de06f907SNik Clayton#define M_PKTHDR 0x0002 /* start of record */ 211de06f907SNik Clayton#define M_EOR 0x0004 /* end of record */ 2125d4050ccSBosko Milekic#define M_RDONLY 0x0008 /* associated data marked read-only */ 2135d4050ccSBosko Milekic#define M_PROTO1 0x0010 /* protocol-specific */ 2145d4050ccSBosko Milekic#define M_PROTO2 0x0020 /* protocol-specific */ 2155d4050ccSBosko Milekic#define M_PROTO3 0x0040 /* protocol-specific */ 2165d4050ccSBosko Milekic#define M_PROTO4 0x0080 /* protocol-specific */ 2175d4050ccSBosko Milekic#define M_PROTO5 0x0100 /* protocol-specific */ 218f434362aSYaroslav Tykhiy#define M_PROTO6 0x4000 /* protocol-specific (avoid M_BCAST conflict) */ 219f434362aSYaroslav Tykhiy#define M_FREELIST 0x8000 /* mbuf is on the free list */ 220de06f907SNik Clayton 221f434362aSYaroslav Tykhiy/* mbuf pkthdr flags (also stored in m_flags) */ 2225d4050ccSBosko Milekic#define M_BCAST 0x0200 /* send/received as link-level broadcast */ 2235d4050ccSBosko Milekic#define M_MCAST 0x0400 /* send/received as link-level multicast */ 2245d4050ccSBosko Milekic#define M_FRAG 0x0800 /* packet is fragment of larger packet */ 2255d4050ccSBosko Milekic#define M_FIRSTFRAG 0x1000 /* packet is first fragment */ 2265d4050ccSBosko Milekic#define M_LASTFRAG 0x2000 /* packet is last fragment */ 227de06f907SNik Clayton.Ed 228de06f907SNik Clayton.Pp 2297b2fd183SYaroslav TykhiyThe available 2307b2fd183SYaroslav Tykhiy.Vt mbuf 2317b2fd183SYaroslav Tykhiytypes are defined as follows: 232de06f907SNik Clayton.Bd -literal 233de06f907SNik Clayton/* mbuf types */ 234de06f907SNik Clayton#define MT_DATA 1 /* dynamic (data) allocation */ 2351cb58a07SMaxim Konovalov#define MT_HEADER MT_DATA /* packet header */ 236de06f907SNik Clayton#define MT_SONAME 8 /* socket name */ 237de06f907SNik Clayton#define MT_CONTROL 14 /* extra-data protocol message */ 238de06f907SNik Clayton#define MT_OOBDATA 15 /* expedited data */ 239de06f907SNik Clayton.Ed 240de06f907SNik Clayton.Pp 241*c3a2dbe9SDag-Erling SmørgravThe available external buffer types are defined as follows: 242*c3a2dbe9SDag-Erling Smørgrav.Bd -literal 243*c3a2dbe9SDag-Erling Smørgrav/* external buffer types */ 244*c3a2dbe9SDag-Erling Smørgrav#define EXT_CLUSTER 1 /* mbuf cluster */ 245*c3a2dbe9SDag-Erling Smørgrav#define EXT_SFBUF 2 /* sendfile(2)'s sf_bufs */ 246*c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBOP 3 /* jumbo cluster 4096 bytes */ 247*c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO9 4 /* jumbo cluster 9216 bytes */ 248*c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO16 5 /* jumbo cluster 16184 bytes */ 249*c3a2dbe9SDag-Erling Smørgrav#define EXT_PACKET 6 /* mbuf+cluster from packet zone */ 250*c3a2dbe9SDag-Erling Smørgrav#define EXT_MBUF 7 /* external mbuf reference (M_IOVEC) */ 251*c3a2dbe9SDag-Erling Smørgrav#define EXT_NET_DRV 100 /* custom ext_buf provided by net driver(s) */ 252*c3a2dbe9SDag-Erling Smørgrav#define EXT_MOD_TYPE 200 /* custom module's ext_buf type */ 253*c3a2dbe9SDag-Erling Smørgrav#define EXT_DISPOSABLE 300 /* can throw this buffer away w/page flipping */ 254*c3a2dbe9SDag-Erling Smørgrav#define EXT_EXTREF 400 /* has externally maintained ref_cnt ptr */ 255*c3a2dbe9SDag-Erling Smørgrav.Ed 256*c3a2dbe9SDag-Erling Smørgrav.Pp 257de06f907SNik ClaytonIf the 258de06f907SNik Clayton.Dv M_PKTHDR 259de06f907SNik Claytonflag is set, a 2607b2fd183SYaroslav Tykhiy.Vt struct pkthdr Va m_pkthdr 2617b2fd183SYaroslav Tykhiyis added to the 2627b2fd183SYaroslav Tykhiy.Vt mbuf 2637b2fd183SYaroslav Tykhiyheader. 264e73145f6SSheldon HearnIt contains a pointer to the interface 265de06f907SNik Claytonthe packet has been received from 2667b2fd183SYaroslav Tykhiy.Pq Vt struct ifnet Va *rcvif , 267de06f907SNik Claytonand the total packet length 2687b2fd183SYaroslav Tykhiy.Pq Vt int Va len . 269e85cc3f5SRuslan ErmilovOptionally, it may also contain an attached list of packet tags 270e85cc3f5SRuslan Ermilov.Pq Vt "struct m_tag" . 271e85cc3f5SRuslan ErmilovSee 272e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9 273e85cc3f5SRuslan Ermilovfor details. 2740193eb5eSYaroslav TykhiyFields used in offloading checksum calculation to the hardware are kept in 2750193eb5eSYaroslav Tykhiy.Va m_pkthdr 2760193eb5eSYaroslav Tykhiyas well. 2770193eb5eSYaroslav TykhiySee 2780193eb5eSYaroslav Tykhiy.Sx HARDWARE-ASSISTED CHECKSUM CALCULATION 2790193eb5eSYaroslav Tykhiyfor details. 280de06f907SNik Clayton.Pp 2817b2fd183SYaroslav TykhiyIf small enough, data is stored in the internal data buffer of an 2827b2fd183SYaroslav Tykhiy.Vt mbuf . 2837b2fd183SYaroslav TykhiyIf the data is sufficiently large, another 2847b2fd183SYaroslav Tykhiy.Vt mbuf 2857b2fd183SYaroslav Tykhiymay be added to the 2867b2fd183SYaroslav Tykhiy.Vt mbuf chain , 2877b2fd183SYaroslav Tykhiyor external storage may be associated with the 2887b2fd183SYaroslav Tykhiy.Vt mbuf . 289de06f907SNik Clayton.Dv MHLEN 2907b2fd183SYaroslav Tykhiybytes of data can fit into an 2917b2fd183SYaroslav Tykhiy.Vt mbuf 2927b2fd183SYaroslav Tykhiywith the 293de06f907SNik Clayton.Dv M_PKTHDR 294de06f907SNik Claytonflag set, 295de06f907SNik Clayton.Dv MLEN 296de06f907SNik Claytonbytes can otherwise. 297de06f907SNik Clayton.Pp 2987b2fd183SYaroslav TykhiyIf external storage is being associated with an 2997b2fd183SYaroslav Tykhiy.Vt mbuf , 3007b2fd183SYaroslav Tykhiythe 301be82a0bcSYaroslav Tykhiy.Va m_ext 30225f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer. 303e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage, 304e73145f6SSheldon Hearna pointer to a function used for freeing the storage, 305e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function, 306e73145f6SSheldon Hearnand a pointer to a reference counter. 3077b2fd183SYaroslav TykhiyAn 3087b2fd183SYaroslav Tykhiy.Vt mbuf 3097b2fd183SYaroslav Tykhiyusing external storage has the 310de06f907SNik Clayton.Dv M_EXT 311de06f907SNik Claytonflag set. 312de06f907SNik Clayton.Pp 313bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage 314bfd59721SBosko Milekicbuffer, 315bfd59721SBosko Milekic.Dv MEXTADD . 316bfd59721SBosko Milekic.Pp 317bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the 318e73145f6SSheldon Hearnsubsystem. 319bfd59721SBosko Milekic.Pp 320bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an 3217b2fd183SYaroslav Tykhiy.Vt mbuf cluster . 3227b2fd183SYaroslav Tykhiy.Vt Mbuf clusters 3237b2fd183SYaroslav Tykhiycan be allocated and configured with the use of the 324bfd59721SBosko Milekic.Dv MCLGET 325e73145f6SSheldon Hearnmacro. 3267b2fd183SYaroslav TykhiyEach 3277b2fd183SYaroslav Tykhiy.Vt mbuf cluster 3287b2fd183SYaroslav Tykhiyis 329de06f907SNik Clayton.Dv MCLBYTES 330bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant. 331bfd59721SBosko MilekicThe system defines an advisory macro 332de06f907SNik Clayton.Dv MINCLSIZE , 3337b2fd183SYaroslav Tykhiywhich is the smallest amount of data to put into an 3347b2fd183SYaroslav Tykhiy.Vt mbuf cluster . 33536a142c4SRuslan ErmilovIt is equal to the sum of 336de06f907SNik Clayton.Dv MLEN 337de06f907SNik Claytonand 338de06f907SNik Clayton.Dv MHLEN . 3397b2fd183SYaroslav TykhiyIt is typically preferable to store data into the data region of an 3407b2fd183SYaroslav Tykhiy.Vt mbuf , 3417b2fd183SYaroslav Tykhiyif size permits, as opposed to allocating a separate 3427b2fd183SYaroslav Tykhiy.Vt mbuf cluster 3437b2fd183SYaroslav Tykhiyto hold the same data. 344de06f907SNik Clayton.\" 345de06f907SNik Clayton.Ss Macros and Functions 346bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the 347bfd59721SBosko Milekicdeveloper with common utilities. 348de06f907SNik Clayton.\" 349de06f907SNik Clayton.Bl -ohang -offset indent 350de06f907SNik Clayton.It Fn mtod mbuf type 3517b2fd183SYaroslav TykhiyConvert an 3527b2fd183SYaroslav Tykhiy.Fa mbuf 3537b2fd183SYaroslav Tykhiypointer to a data pointer. 3547b2fd183SYaroslav TykhiyThe macro expands to the data pointer cast to the pointer of the specified 3557b2fd183SYaroslav Tykhiy.Fa type . 356de06f907SNik Clayton.Sy Note : 3577b2fd183SYaroslav TykhiyIt is advisable to ensure that there is enough contiguous data in 3587b2fd183SYaroslav Tykhiy.Fa mbuf . 359de06f907SNik ClaytonSee 360de06f907SNik Clayton.Fn m_pullup 361de06f907SNik Claytonfor details. 362de06f907SNik Clayton.It Fn MGET mbuf how type 3637b2fd183SYaroslav TykhiyAllocate an 3647b2fd183SYaroslav Tykhiy.Vt mbuf 3657b2fd183SYaroslav Tykhiyand initialize it to contain internal data. 36625f1a2e9SSheldon Hearn.Fa mbuf 3677b2fd183SYaroslav Tykhiywill point to the allocated 3687b2fd183SYaroslav Tykhiy.Vt mbuf 3697b2fd183SYaroslav Tykhiyon success, or be set to 370de06f907SNik Clayton.Dv NULL 371e73145f6SSheldon Hearnon failure. 372e73145f6SSheldon HearnThe 373de06f907SNik Clayton.Fa how 374de06f907SNik Claytonargument is to be set to 375ea26d587SRuslan Ermilov.Dv M_WAIT 376de06f907SNik Claytonor 377c65b53c5STom Rhodes.Dv M_DONTWAIT . 37825f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary. 3797b2fd183SYaroslav TykhiyA number of other functions and macros related to 3807b2fd183SYaroslav Tykhiy.Vt mbufs 3817b2fd183SYaroslav Tykhiyhave the same argument because they may 3827b2fd183SYaroslav Tykhiyat some point need to allocate new 3837b2fd183SYaroslav Tykhiy.Vt mbufs . 384c65b53c5STom Rhodes.Pp 3857b2fd183SYaroslav TykhiyProgrammers should be careful not to confuse the 3867b2fd183SYaroslav Tykhiy.Vt mbuf 3877b2fd183SYaroslav Tykhiyallocation flag 388c65b53c5STom Rhodes.Dv M_DONTWAIT 389c65b53c5STom Rhodeswith the 390c65b53c5STom Rhodes.Xr malloc 9 391c65b53c5STom Rhodesallocation flag, 392c65b53c5STom Rhodes.Dv M_NOWAIT . 393c65b53c5STom RhodesThey are not the same. 394de06f907SNik Clayton.It Fn MGETHDR mbuf how type 3957b2fd183SYaroslav TykhiyAllocate an 3967b2fd183SYaroslav Tykhiy.Vt mbuf 3977b2fd183SYaroslav Tykhiyand initialize it to contain a packet header 398e73145f6SSheldon Hearnand internal data. 399e73145f6SSheldon HearnSee 400de06f907SNik Clayton.Fn MGET 401de06f907SNik Claytonfor details. 402*c3a2dbe9SDag-Erling Smørgrav.It Fn MEXTADD mbuf buf size free opt_arg1 opt_arg2 flags type 403*c3a2dbe9SDag-Erling SmørgravAssociate externally managed data with 404*c3a2dbe9SDag-Erling Smørgrav.Fa mbuf . 405*c3a2dbe9SDag-Erling SmørgravAny internal data contained in the mbuf will be discarded, and the 406*c3a2dbe9SDag-Erling Smørgrav.Dv M_EXT flag will be set. 407*c3a2dbe9SDag-Erling SmørgravThe 408*c3a2dbe9SDag-Erling Smørgrav.Fa buf 409*c3a2dbe9SDag-Erling Smørgravand 410*c3a2dbe9SDag-Erling Smørgrav.Fa size 411*c3a2dbe9SDag-Erling Smørgravarguments are the address and length, respectively, of the data. 412*c3a2dbe9SDag-Erling SmørgravThe 413*c3a2dbe9SDag-Erling Smørgrav.Fa free 414*c3a2dbe9SDag-Erling Smørgravargument points to a function which will be called to free the data 415*c3a2dbe9SDag-Erling Smørgravwhen the mbuf is freed; it is only used if 416*c3a2dbe9SDag-Erling Smørgrav.Fa type 417*c3a2dbe9SDag-Erling Smørgravis 418*c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF . 419*c3a2dbe9SDag-Erling SmørgravThe 420*c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg1 421*c3a2dbe9SDag-Erling Smørgravand 422*c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg2 423*c3a2dbe9SDag-Erling Smørgravarguments will be passed unmodified to 424*c3a2dbe9SDag-Erling Smørgrav.Fa free . 425*c3a2dbe9SDag-Erling SmørgravThe 426*c3a2dbe9SDag-Erling Smørgrav.Fa flags 427*c3a2dbe9SDag-Erling Smørgravargument specifies additional 428*c3a2dbe9SDag-Erling Smørgrav.Vt mbuf 429*c3a2dbe9SDag-Erling Smørgravflags; it is not necessary to specify 430*c3a2dbe9SDag-Erling Smørgrav.Dv M_EXT . 431*c3a2dbe9SDag-Erling SmørgravFinally, the 432*c3a2dbe9SDag-Erling Smørgrav.Fa type 433*c3a2dbe9SDag-Erling Smørgravargument specifies the type of external data, which controls how it 434*c3a2dbe9SDag-Erling Smørgravwill be disposed of when the 435*c3a2dbe9SDag-Erling Smørgrav.Vt mbuf 436*c3a2dbe9SDag-Erling Smørgravis freed. 437*c3a2dbe9SDag-Erling SmørgravIn most cases, the correct value is 438*c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF . 439de06f907SNik Clayton.It Fn MCLGET mbuf how 4407b2fd183SYaroslav TykhiyAllocate and attach an 4417b2fd183SYaroslav Tykhiy.Vt mbuf cluster 4427b2fd183SYaroslav Tykhiyto 4437b2fd183SYaroslav Tykhiy.Fa mbuf . 444e73145f6SSheldon HearnIf the macro fails, the 445de06f907SNik Clayton.Dv M_EXT 4460227791bSRuslan Ermilovflag will not be set in 4477b2fd183SYaroslav Tykhiy.Fa mbuf . 448da72b998SYaroslav Tykhiy.It Fn M_ALIGN mbuf len 449da72b998SYaroslav TykhiySet the pointer 450da72b998SYaroslav Tykhiy.Fa mbuf->m_data 451da72b998SYaroslav Tykhiyto place an object of the size 452da72b998SYaroslav Tykhiy.Fa len 453da72b998SYaroslav Tykhiyat the end of the internal data area of 454da72b998SYaroslav Tykhiy.Fa mbuf , 455da72b998SYaroslav Tykhiylong word aligned. 456da72b998SYaroslav TykhiyApplicable only if 457da72b998SYaroslav Tykhiy.Fa mbuf 458da72b998SYaroslav Tykhiyis newly allocated with 459da72b998SYaroslav Tykhiy.Fn MGET 460da72b998SYaroslav Tykhiyor 461da72b998SYaroslav Tykhiy.Fn m_get . 462da72b998SYaroslav Tykhiy.It Fn MH_ALIGN mbuf len 463da72b998SYaroslav TykhiyServes the same purpose as 464da72b998SYaroslav Tykhiy.Fn M_ALIGN 465da72b998SYaroslav Tykhiydoes, but only for 466da72b998SYaroslav Tykhiy.Fa mbuf 467da72b998SYaroslav Tykhiynewly allocated with 468da72b998SYaroslav Tykhiy.Fn MGETHDR 469da72b998SYaroslav Tykhiyor 470da72b998SYaroslav Tykhiy.Fn m_gethdr , 471da72b998SYaroslav Tykhiyor initialized by 472da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr 473da72b998SYaroslav Tykhiyor 474da72b998SYaroslav Tykhiy.Fn m_move_pkthdr . 4759c3fd404SSam Leffler.It Fn m_align mbuf len 4769c3fd404SSam LefflerServices the same purpose as 4779c3fd404SSam Leffler.Fn M_ALIGN 4789c3fd404SSam Lefflerbut handles any type of mbuf. 479da72b998SYaroslav Tykhiy.It Fn M_LEADINGSPACE mbuf 480da72b998SYaroslav TykhiyReturns the number of bytes available before the beginning 481da72b998SYaroslav Tykhiyof data in 482da72b998SYaroslav Tykhiy.Fa mbuf . 483da72b998SYaroslav Tykhiy.It Fn M_TRAILINGSPACE mbuf 484da72b998SYaroslav TykhiyReturns the number of bytes available after the end of data in 485da72b998SYaroslav Tykhiy.Fa mbuf . 486de06f907SNik Clayton.It Fn M_PREPEND mbuf len how 4877b2fd183SYaroslav TykhiyThis macro operates on an 4887b2fd183SYaroslav Tykhiy.Vt mbuf chain . 489de06f907SNik ClaytonIt is an optimized wrapper for 490de06f907SNik Clayton.Fn m_prepend 491de06f907SNik Claytonthat can make use of possible empty space before data 4925203edcdSRuslan Ermilov(e.g.\& left after trimming of a link-layer header). 4937b2fd183SYaroslav TykhiyThe new 4947b2fd183SYaroslav Tykhiy.Vt mbuf chain 4957b2fd183SYaroslav Tykhiypointer or 496de06f907SNik Clayton.Dv NULL 497de06f907SNik Claytonis in 498de06f907SNik Clayton.Fa mbuf 499de06f907SNik Claytonafter the call. 500da72b998SYaroslav Tykhiy.It Fn M_MOVE_PKTHDR to from 501da72b998SYaroslav TykhiyUsing this macro is equivalent to calling 502da72b998SYaroslav Tykhiy.Fn m_move_pkthdr to from . 5035d4050ccSBosko Milekic.It Fn M_WRITABLE mbuf 5047b2fd183SYaroslav TykhiyThis macro will evaluate true if 5057b2fd183SYaroslav Tykhiy.Fa mbuf 5067b2fd183SYaroslav Tykhiyis not marked 5075d4050ccSBosko Milekic.Dv M_RDONLY 5087b2fd183SYaroslav Tykhiyand if either 5097b2fd183SYaroslav Tykhiy.Fa mbuf 5107b2fd183SYaroslav Tykhiydoes not contain external storage or, 5115d4050ccSBosko Milekicif it does, 5125d4050ccSBosko Milekicthen if the reference count of the storage is not greater than 1. 5135d4050ccSBosko MilekicThe 5145d4050ccSBosko Milekic.Dv M_RDONLY 5157b2fd183SYaroslav Tykhiyflag can be set in 5167b2fd183SYaroslav Tykhiy.Fa mbuf->m_flags . 5175d4050ccSBosko MilekicThis can be achieved during setup of the external storage, 5185d4050ccSBosko Milekicby passing the 5195d4050ccSBosko Milekic.Dv M_RDONLY 5205d4050ccSBosko Milekicbit as a 5210b39b3ffSRuslan Ermilov.Fa flags 5225d4050ccSBosko Milekicargument to the 5235d4050ccSBosko Milekic.Fn MEXTADD 5247b2fd183SYaroslav Tykhiymacro, or can be directly set in individual 5257b2fd183SYaroslav Tykhiy.Vt mbufs . 526da72b998SYaroslav Tykhiy.It Fn MCHTYPE mbuf type 527da72b998SYaroslav TykhiyChange the type of 528da72b998SYaroslav Tykhiy.Fa mbuf 529da72b998SYaroslav Tykhiyto 530da72b998SYaroslav Tykhiy.Fa type . 531da72b998SYaroslav TykhiyThis is a relatively expensive operation and should be avoided. 532de06f907SNik Clayton.El 533de06f907SNik Clayton.Pp 534de06f907SNik ClaytonThe functions are: 535de06f907SNik Clayton.Bl -ohang -offset indent 536de06f907SNik Clayton.It Fn m_get how type 537de06f907SNik ClaytonA function version of 538bfd59721SBosko Milekic.Fn MGET 539bfd59721SBosko Milekicfor non-critical paths. 540328c0bbcSBosko Milekic.It Fn m_getm orig len how type 541328c0bbcSBosko MilekicAllocate 5420b39b3ffSRuslan Ermilov.Fa len 5437b2fd183SYaroslav Tykhiybytes worth of 5447b2fd183SYaroslav Tykhiy.Vt mbufs 5457b2fd183SYaroslav Tykhiyand 5467b2fd183SYaroslav Tykhiy.Vt mbuf clusters 5477b2fd183SYaroslav Tykhiyif necessary and append the resulting allocated 5487b2fd183SYaroslav Tykhiy.Vt mbuf chain 5497b2fd183SYaroslav Tykhiyto the 5507b2fd183SYaroslav Tykhiy.Vt mbuf chain 5517b2fd183SYaroslav Tykhiy.Fa orig , 5527b2fd183SYaroslav Tykhiyif it is 5530b39b3ffSRuslan Ermilov.No non- Ns Dv NULL . 554328c0bbcSBosko MilekicIf the allocation fails at any point, 5550b39b3ffSRuslan Ermilovfree whatever was allocated and return 5560b39b3ffSRuslan Ermilov.Dv NULL . 557328c0bbcSBosko MilekicIf 5580b39b3ffSRuslan Ermilov.Fa orig 5590b39b3ffSRuslan Ermilovis 5600b39b3ffSRuslan Ermilov.No non- Ns Dv NULL , 561328c0bbcSBosko Milekicit will not be freed. 562328c0bbcSBosko MilekicIt is possible to use 563328c0bbcSBosko Milekic.Fn m_getm 564328c0bbcSBosko Milekicto either append 5650b39b3ffSRuslan Ermilov.Fa len 5667b2fd183SYaroslav Tykhiybytes to an existing 5677b2fd183SYaroslav Tykhiy.Vt mbuf 5687b2fd183SYaroslav Tykhiyor 5697b2fd183SYaroslav Tykhiy.Vt mbuf chain 570328c0bbcSBosko Milekic(for example, one which may be sitting in a pre-allocated ring) 5717b2fd183SYaroslav Tykhiyor to simply perform an all-or-nothing 5727b2fd183SYaroslav Tykhiy.Vt mbuf 5737b2fd183SYaroslav Tykhiyand 5747b2fd183SYaroslav Tykhiy.Vt mbuf cluster 5757b2fd183SYaroslav Tykhiyallocation. 576de06f907SNik Clayton.It Fn m_gethdr how type 577de06f907SNik ClaytonA function version of 578bfd59721SBosko Milekic.Fn MGETHDR 579bfd59721SBosko Milekicfor non-critical paths. 5806c013706SMaxim Konovalov.It Fn m_getcl how type flags 5816c013706SMaxim KonovalovFetch an 5826c013706SMaxim Konovalov.Vt mbuf 5836c013706SMaxim Konovalovwith a 5846c013706SMaxim Konovalov.Vt mbuf cluster 5856c013706SMaxim Konovalovattached to it. 5866c013706SMaxim KonovalovIf one of the allocations fails, the entire allocation fails. 5876c013706SMaxim KonovalovThis routine is the preferred way of fetching both the 5886c013706SMaxim Konovalov.Vt mbuf 5896c013706SMaxim Konovalovand 5906c013706SMaxim Konovalov.Vt mbuf cluster 5916c013706SMaxim Konovalovtogether, as it avoids having to unlock/relock between allocations. 5926c013706SMaxim KonovalovReturns 5936c013706SMaxim Konovalov.Dv NULL 5946c013706SMaxim Konovalovon failure. 595de06f907SNik Clayton.It Fn m_getclr how type 5967b2fd183SYaroslav TykhiyAllocate an 5977b2fd183SYaroslav Tykhiy.Vt mbuf 5987b2fd183SYaroslav Tykhiyand zero out the data region. 59901e7fdafSMaxim Konovalov.It Fn m_free mbuf 60001e7fdafSMaxim KonovalovFrees 60101e7fdafSMaxim Konovalov.Vt mbuf . 602b7131a26SJohn-Mark GurneyReturns 603b7131a26SJohn-Mark Gurney.Va m_next 604b7131a26SJohn-Mark Gurneyof the freed 605b7131a26SJohn-Mark Gurney.Vt mbuf . 606de06f907SNik Clayton.El 607de06f907SNik Clayton.Pp 6087b2fd183SYaroslav TykhiyThe functions below operate on 6097b2fd183SYaroslav Tykhiy.Vt mbuf chains . 610de06f907SNik Clayton.Bl -ohang -offset indent 611de06f907SNik Clayton.It Fn m_freem mbuf 6127b2fd183SYaroslav TykhiyFree an entire 6137b2fd183SYaroslav Tykhiy.Vt mbuf chain , 6147b2fd183SYaroslav Tykhiyincluding any external storage. 615de06f907SNik Clayton.\" 616de06f907SNik Clayton.It Fn m_adj mbuf len 617de06f907SNik ClaytonTrim 618de06f907SNik Clayton.Fa len 6197b2fd183SYaroslav Tykhiybytes from the head of an 6207b2fd183SYaroslav Tykhiy.Vt mbuf chain 6217b2fd183SYaroslav Tykhiyif 622de06f907SNik Clayton.Fa len 623de06f907SNik Claytonis positive, from the tail otherwise. 624de06f907SNik Clayton.\" 625b9def06bSSam Leffler.It Fn m_append mbuf len cp 626b9def06bSSam LefflerAppend 627b9def06bSSam Leffler.Vt len 628b9def06bSSam Lefflerbytes of data 629b9def06bSSam Leffler.Vt cp 630b9def06bSSam Lefflerto the 631b9def06bSSam Leffler.Vt mbuf chain . 632b9def06bSSam LefflerExtend the mbuf chain if the new data does not fit in 633b9def06bSSam Lefflerexisting space. 634b9def06bSSam Leffler.\" 635de06f907SNik Clayton.It Fn m_prepend mbuf len how 6367b2fd183SYaroslav TykhiyAllocate a new 6377b2fd183SYaroslav Tykhiy.Vt mbuf 6387b2fd183SYaroslav Tykhiyand prepend it to the 6397b2fd183SYaroslav Tykhiy.Vt mbuf chain , 6407b2fd183SYaroslav Tykhiyhandle 641de06f907SNik Clayton.Dv M_PKTHDR 642de06f907SNik Claytonproperly. 643de06f907SNik Clayton.Sy Note : 6440227791bSRuslan ErmilovIt does not allocate any 6457b2fd183SYaroslav Tykhiy.Vt mbuf clusters , 6467b2fd183SYaroslav Tykhiyso 647de06f907SNik Clayton.Fa len 648de06f907SNik Claytonmust be less than 649de06f907SNik Clayton.Dv MLEN 650de06f907SNik Claytonor 651de06f907SNik Clayton.Dv MHLEN , 652de06f907SNik Claytondepending on the 653d0353b83SRuslan Ermilov.Dv M_PKTHDR 654d0353b83SRuslan Ermilovflag setting. 655de06f907SNik Clayton.\" 6567ac139a9SJohn-Mark Gurney.It Fn m_copyup mbuf len dstoff 6577ac139a9SJohn-Mark GurneySimilar to 6587ac139a9SJohn-Mark Gurney.Fn m_pullup 6597ac139a9SJohn-Mark Gurneybut copies 6607ac139a9SJohn-Mark Gurney.Fa len 6617ac139a9SJohn-Mark Gurneybytes of data into a new mbuf at 6627ac139a9SJohn-Mark Gurney.Fa dstoff 6637ac139a9SJohn-Mark Gurneybytes into the mbuf. 6647ac139a9SJohn-Mark GurneyThe 6657ac139a9SJohn-Mark Gurney.Fa dstoff 6667ac139a9SJohn-Mark Gurneyargument aligns the data and leaves room for a link layer header. 6674f068961SRuslan ErmilovReturns the new 6687ac139a9SJohn-Mark Gurney.Vt mbuf chain 6697ac139a9SJohn-Mark Gurneyon success, 6707ac139a9SJohn-Mark Gurneyand frees the 6717ac139a9SJohn-Mark Gurney.Vt mbuf chain 6727ac139a9SJohn-Mark Gurneyand returns 6737ac139a9SJohn-Mark Gurney.Dv NULL 6747ac139a9SJohn-Mark Gurneyon failure. 6757ac139a9SJohn-Mark Gurney.Sy Note : 6767ac139a9SJohn-Mark GurneyThe function does not allocate 6777ac139a9SJohn-Mark Gurney.Vt mbuf clusters , 6787ac139a9SJohn-Mark Gurneyso 6797ac139a9SJohn-Mark Gurney.Fa len + dstoff 6807ac139a9SJohn-Mark Gurneymust be less than 6817ac139a9SJohn-Mark Gurney.Dv MHLEN . 6827ac139a9SJohn-Mark Gurney.\" 683de06f907SNik Clayton.It Fn m_pullup mbuf len 684de06f907SNik ClaytonArrange that the first 685de06f907SNik Clayton.Fa len 6867b2fd183SYaroslav Tykhiybytes of an 6877b2fd183SYaroslav Tykhiy.Vt mbuf chain 6887b2fd183SYaroslav Tykhiyare contiguous and lay in the data area of 689de06f907SNik Clayton.Fa mbuf , 690de06f907SNik Claytonso they are accessible with 691de06f907SNik Clayton.Fn mtod mbuf type . 6921009bd1bSJulian ElischerIt is important to remember that this may involve 6931009bd1bSJulian Elischerreallocating some mbufs and moving data so all pointers 6941009bd1bSJulian Elischerreferencing data within the old mbuf chain 6951009bd1bSJulian Elischermust be recalculated or made invalid. 6967b2fd183SYaroslav TykhiyReturn the new 6977b2fd183SYaroslav Tykhiy.Vt mbuf chain 6987b2fd183SYaroslav Tykhiyon success, 699de06f907SNik Clayton.Dv NULL 700de06f907SNik Claytonon failure 7017b2fd183SYaroslav Tykhiy(the 7027b2fd183SYaroslav Tykhiy.Vt mbuf chain 7037b2fd183SYaroslav Tykhiyis freed in this case). 704de06f907SNik Clayton.Sy Note : 7050227791bSRuslan ErmilovIt does not allocate any 7067b2fd183SYaroslav Tykhiy.Vt mbuf clusters , 7077b2fd183SYaroslav Tykhiyso 708de06f907SNik Clayton.Fa len 709de06f907SNik Claytonmust be less than 710de06f907SNik Clayton.Dv MHLEN . 711de06f907SNik Clayton.\" 712d305f4b9SBruce M Simpson.It Fn m_pulldown mbuf offset len offsetp 713d305f4b9SBruce M SimpsonArrange that 714d305f4b9SBruce M Simpson.Fa len 715d305f4b9SBruce M Simpsonbytes between 716d305f4b9SBruce M Simpson.Fa offset 717d305f4b9SBruce M Simpsonand 718d305f4b9SBruce M Simpson.Fa offset + len 719d305f4b9SBruce M Simpsonin the 720d305f4b9SBruce M Simpson.Vt mbuf chain 721d305f4b9SBruce M Simpsonare contiguous and lay in the data area of 722d305f4b9SBruce M Simpson.Fa mbuf , 723d305f4b9SBruce M Simpsonso they are accessible with 724d305f4b9SBruce M Simpson.Fn mtod mbuf type . 725d305f4b9SBruce M Simpson.Fa len must be smaller than, or equal to, the size of an 726d305f4b9SBruce M Simpson.Vt mbuf cluster . 727d305f4b9SBruce M SimpsonReturn a pointer to an intermediate 728d305f4b9SBruce M Simpson.Vt mbuf 729d305f4b9SBruce M Simpsonin the chain containing the requested region; 730d305f4b9SBruce M Simpsonthe offset in the data region of the 731d305f4b9SBruce M Simpson.Vt mbuf chain 732d305f4b9SBruce M Simpsonto the data contained in the returned mbuf is stored in 733d305f4b9SBruce M Simpson.Fa *offsetp . 734d305f4b9SBruce M SimpsonIf 735d305f4b9SBruce M Simpson.Fa offp 736d305f4b9SBruce M Simpsonis NULL, the region may be accessed using 737d305f4b9SBruce M Simpson.Fn mtod mbuf type . 738d305f4b9SBruce M SimpsonIf 739d305f4b9SBruce M Simpson.Fa offp 740d305f4b9SBruce M Simpsonis non-NULL, the region may be accessed using 741d305f4b9SBruce M Simpson.Fn mtod mbuf uint8_t + *offsetp . 742d305f4b9SBruce M SimpsonThe region of the mbuf chain between its beginning and 743d305f4b9SBruce M Simpson.Fa off 744d305f4b9SBruce M Simpsonis not modified, therefore it is safe to hold pointers to data within 745d305f4b9SBruce M Simpsonthis region before calling 746d305f4b9SBruce M Simpson.Fn m_pulldown . 747d305f4b9SBruce M Simpson.\" 748de06f907SNik Clayton.It Fn m_copym mbuf offset len how 7497b2fd183SYaroslav TykhiyMake a copy of an 7507b2fd183SYaroslav Tykhiy.Vt mbuf chain 7517b2fd183SYaroslav Tykhiystarting 752de06f907SNik Clayton.Fa offset 753de06f907SNik Claytonbytes from the beginning, continuing for 754de06f907SNik Clayton.Fa len 755e73145f6SSheldon Hearnbytes. 756e73145f6SSheldon HearnIf 757de06f907SNik Clayton.Fa len 758de06f907SNik Claytonis 759de06f907SNik Clayton.Dv M_COPYALL , 7607b2fd183SYaroslav Tykhiycopy to the end of the 7617b2fd183SYaroslav Tykhiy.Vt mbuf chain . 762de06f907SNik Clayton.Sy Note : 7637b2fd183SYaroslav TykhiyThe copy is read-only, because the 7647b2fd183SYaroslav Tykhiy.Vt mbuf clusters 7657b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented. 766de06f907SNik Clayton.\" 767de06f907SNik Clayton.It Fn m_copypacket mbuf how 768de06f907SNik ClaytonCopy an entire packet including header, which must be present. 769de06f907SNik ClaytonThis is an optimized version of the common case 770de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how . 771de06f907SNik Clayton.Sy Note : 7727b2fd183SYaroslav Tykhiythe copy is read-only, because the 7737b2fd183SYaroslav Tykhiy.Vt mbuf clusters 7747b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented. 775de06f907SNik Clayton.\" 776de06f907SNik Clayton.It Fn m_dup mbuf how 7777b2fd183SYaroslav TykhiyCopy a packet header 7787b2fd183SYaroslav Tykhiy.Vt mbuf chain 7797b2fd183SYaroslav Tykhiyinto a completely new 7807b2fd183SYaroslav Tykhiy.Vt mbuf chain , 7817b2fd183SYaroslav Tykhiyincluding copying any 7827b2fd183SYaroslav Tykhiy.Vt mbuf clusters . 783e73145f6SSheldon HearnUse this instead of 784de06f907SNik Clayton.Fn m_copypacket 7857b2fd183SYaroslav Tykhiywhen you need a writable copy of an 7867b2fd183SYaroslav Tykhiy.Vt mbuf chain . 787de06f907SNik Clayton.\" 788de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf 7897b2fd183SYaroslav TykhiyCopy data from an 7907b2fd183SYaroslav Tykhiy.Vt mbuf chain 7917b2fd183SYaroslav Tykhiystarting 792de06f907SNik Clayton.Fa off 793de06f907SNik Claytonbytes from the beginning, continuing for 794de06f907SNik Clayton.Fa len 795de06f907SNik Claytonbytes, into the indicated buffer 796de06f907SNik Clayton.Fa buf . 797de06f907SNik Clayton.\" 798de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf 799de06f907SNik ClaytonCopy 800de06f907SNik Clayton.Fa len 801de06f907SNik Claytonbytes from the buffer 802de06f907SNik Clayton.Fa buf 8037b2fd183SYaroslav Tykhiyback into the indicated 8047b2fd183SYaroslav Tykhiy.Vt mbuf chain , 805de06f907SNik Claytonstarting at 806de06f907SNik Clayton.Fa offset 8077b2fd183SYaroslav Tykhiybytes from the beginning of the 8087b2fd183SYaroslav Tykhiy.Vt mbuf chain , 8097b2fd183SYaroslav Tykhiyextending the 8107b2fd183SYaroslav Tykhiy.Vt mbuf chain 8117b2fd183SYaroslav Tykhiyif necessary. 812de06f907SNik Clayton.Sy Note : 8130227791bSRuslan ErmilovIt does not allocate any 8147b2fd183SYaroslav Tykhiy.Vt mbuf clusters , 8157b2fd183SYaroslav Tykhiyjust adds 8167b2fd183SYaroslav Tykhiy.Vt mbufs 8177b2fd183SYaroslav Tykhiyto the 8187b2fd183SYaroslav Tykhiy.Vt mbuf chain . 81936a142c4SRuslan ErmilovIt is safe to set 820de06f907SNik Clayton.Fa offset 8217b2fd183SYaroslav Tykhiybeyond the current 8227b2fd183SYaroslav Tykhiy.Vt mbuf chain 8237b2fd183SYaroslav Tykhiyend: zeroed 8247b2fd183SYaroslav Tykhiy.Vt mbufs 8257b2fd183SYaroslav Tykhiywill be allocated to fill the space. 826de06f907SNik Clayton.\" 8275d96084fSYaroslav Tykhiy.It Fn m_length mbuf last 8287b2fd183SYaroslav TykhiyReturn the length of the 8297b2fd183SYaroslav Tykhiy.Vt mbuf chain , 8307b2fd183SYaroslav Tykhiyand optionally a pointer to the last 8317b2fd183SYaroslav Tykhiy.Vt mbuf . 8320b1c0994SPoul-Henning Kamp.\" 833da72b998SYaroslav Tykhiy.It Fn m_dup_pkthdr to from how 834da72b998SYaroslav TykhiyUpon the function's completion, the 835da72b998SYaroslav Tykhiy.Vt mbuf 836da72b998SYaroslav Tykhiy.Fa to 837da72b998SYaroslav Tykhiywill contain an identical copy of 838da72b998SYaroslav Tykhiy.Fa from->m_pkthdr 839da72b998SYaroslav Tykhiyand the per-packet attributes found in the 840da72b998SYaroslav Tykhiy.Vt mbuf chain 841da72b998SYaroslav Tykhiy.Fa from . 842da72b998SYaroslav TykhiyThe 843da72b998SYaroslav Tykhiy.Vt mbuf 844da72b998SYaroslav Tykhiy.Fa from 845da72b998SYaroslav Tykhiymust have the flag 846da72b998SYaroslav Tykhiy.Dv M_PKTHDR 847da72b998SYaroslav Tykhiyinitially set, and 848da72b998SYaroslav Tykhiy.Fa to 849da72b998SYaroslav Tykhiymust be empty on entry. 850da72b998SYaroslav Tykhiy.\" 851da72b998SYaroslav Tykhiy.It Fn m_move_pkthdr to from 852da72b998SYaroslav TykhiyMove 853da72b998SYaroslav Tykhiy.Va m_pkthdr 854da72b998SYaroslav Tykhiyand the per-packet attributes from the 855da72b998SYaroslav Tykhiy.Vt mbuf chain 856da72b998SYaroslav Tykhiy.Fa from 857da72b998SYaroslav Tykhiyto the 858da72b998SYaroslav Tykhiy.Vt mbuf 859da72b998SYaroslav Tykhiy.Fa to . 860da72b998SYaroslav TykhiyThe 861da72b998SYaroslav Tykhiy.Vt mbuf 862da72b998SYaroslav Tykhiy.Fa from 863da72b998SYaroslav Tykhiymust have the flag 864da72b998SYaroslav Tykhiy.Dv M_PKTHDR 865da72b998SYaroslav Tykhiyinitially set, and 866da72b998SYaroslav Tykhiy.Fa to 867da72b998SYaroslav Tykhiymust be empty on entry. 868da72b998SYaroslav TykhiyUpon the function's completion, 869da72b998SYaroslav Tykhiy.Fa from 870da72b998SYaroslav Tykhiywill have the flag 871da72b998SYaroslav Tykhiy.Dv M_PKTHDR 872da72b998SYaroslav Tykhiyand the per-packet attributes cleared. 873da72b998SYaroslav Tykhiy.\" 8745d96084fSYaroslav Tykhiy.It Fn m_fixhdr mbuf 8757b2fd183SYaroslav TykhiySet the packet-header length to the length of the 8767b2fd183SYaroslav Tykhiy.Vt mbuf chain . 8770b1c0994SPoul-Henning Kamp.\" 878de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy 879de06f907SNik ClaytonCopy data from a device local memory pointed to by 880de06f907SNik Clayton.Fa buf 8817b2fd183SYaroslav Tykhiyto an 8827b2fd183SYaroslav Tykhiy.Vt mbuf chain . 883e73145f6SSheldon HearnThe copy is done using a specified copy routine 884de06f907SNik Clayton.Fa copy , 885de06f907SNik Claytonor 886de06f907SNik Clayton.Fn bcopy 887de06f907SNik Claytonif 888de06f907SNik Clayton.Fa copy 889de06f907SNik Claytonis 890de06f907SNik Clayton.Dv NULL . 891de06f907SNik Clayton.\" 892de06f907SNik Clayton.It Fn m_cat m n 893de06f907SNik ClaytonConcatenate 894de06f907SNik Clayton.Fa n 895de06f907SNik Claytonto 896de06f907SNik Clayton.Fa m . 8977b2fd183SYaroslav TykhiyBoth 8987b2fd183SYaroslav Tykhiy.Vt mbuf chains 8997b2fd183SYaroslav Tykhiymust be of the same type. 900de06f907SNik Clayton.Fa N 901de06f907SNik Claytonis still valid after the function returned. 902de06f907SNik Clayton.Sy Note : 903de06f907SNik ClaytonIt does not handle 904de06f907SNik Clayton.Dv M_PKTHDR 905de06f907SNik Claytonand friends. 906de06f907SNik Clayton.\" 907de06f907SNik Clayton.It Fn m_split mbuf len how 9087b2fd183SYaroslav TykhiyPartition an 9097b2fd183SYaroslav Tykhiy.Vt mbuf chain 9107b2fd183SYaroslav Tykhiyin two pieces, returning the tail: 911de06f907SNik Claytonall but the first 912de06f907SNik Clayton.Fa len 913e73145f6SSheldon Hearnbytes. 914e73145f6SSheldon HearnIn case of failure, it returns 915de06f907SNik Clayton.Dv NULL 9167b2fd183SYaroslav Tykhiyand attempts to restore the 9177b2fd183SYaroslav Tykhiy.Vt mbuf chain 9187b2fd183SYaroslav Tykhiyto its original state. 91902312219SBruce M Simpson.\" 92002312219SBruce M Simpson.It Fn m_apply mbuf off len f arg 92102312219SBruce M SimpsonApply a function to an 92202312219SBruce M Simpson.Vt mbuf chain , 92302312219SBruce M Simpsonat offset 92402312219SBruce M Simpson.Fa off , 92502312219SBruce M Simpsonfor length 926f48cbcdeSRuslan Ermilov.Fa len 927f48cbcdeSRuslan Ermilovbytes. 92802312219SBruce M SimpsonTypically used to avoid calls to 92902312219SBruce M Simpson.Fn m_pullup 93002312219SBruce M Simpsonwhich would otherwise be unnecessary or undesirable. 93102312219SBruce M Simpson.Fa arg 93202312219SBruce M Simpsonis a convenience argument which is passed to the callback function 93302312219SBruce M Simpson.Fa f . 93402312219SBruce M Simpson.Pp 93502312219SBruce M SimpsonEach time 93602312219SBruce M Simpson.Fn f 93702312219SBruce M Simpsonis called, it will be passed 93802312219SBruce M Simpson.Fa arg , 93902312219SBruce M Simpsona pointer to the 94002312219SBruce M Simpson.Fa data 94102312219SBruce M Simpsonin the current mbuf, and the length 94202312219SBruce M Simpson.Fa len 94302312219SBruce M Simpsonof the data in this mbuf to which the function should be applied. 94402312219SBruce M Simpson.Pp 94502312219SBruce M SimpsonThe function should return zero to indicate success; 94602312219SBruce M Simpsonotherwise, if an error is indicated, then 94702312219SBruce M Simpson.Fn m_apply 94802312219SBruce M Simpsonwill return the error and stop iterating through the 94902312219SBruce M Simpson.Vt mbuf chain . 95002312219SBruce M Simpson.\" 95102312219SBruce M Simpson.It Fn m_getptr mbuf loc off 95202312219SBruce M SimpsonReturn a pointer to the mbuf containing the data located at 95302312219SBruce M Simpson.Fa loc 95402312219SBruce M Simpsonbytes from the beginning of the 95502312219SBruce M Simpson.Vt mbuf chain . 95602312219SBruce M SimpsonThe corresponding offset into the mbuf will be stored in 95702312219SBruce M Simpson.Fa *off . 958a61bc764SMike Silbersack.It Fn m_defrag m0 how 959f48cbcdeSRuslan ErmilovDefragment an mbuf chain, returning the shortest possible 960bdf86185SMike Silbersackchain of mbufs and clusters. 961bdf86185SMike SilbersackIf allocation fails and this can not be completed, 962bdf86185SMike Silbersack.Dv NULL 963bdf86185SMike Silbersackwill be returned and the original chain will be unchanged. 964bdf86185SMike SilbersackUpon success, the original chain will be freed and the new 965bdf86185SMike Silbersackchain will be returned. 966a61bc764SMike Silbersack.Fa how 967a61bc764SMike Silbersackshould be either 968ea26d587SRuslan Ermilov.Dv M_WAIT 969a61bc764SMike Silbersackor 970a61bc764SMike Silbersack.Dv M_DONTWAIT , 971a61bc764SMike Silbersackdepending on the caller's preference. 972a61bc764SMike Silbersack.Pp 973a61bc764SMike SilbersackThis function is especially useful in network drivers, where 974a61bc764SMike Silbersackcertain long mbuf chains must be shortened before being added 975a61bc764SMike Silbersackto TX descriptor lists. 97647e2996eSSam Leffler.It Fn m_unshare m0 how 97747e2996eSSam LefflerCreate a version of the specified mbuf chain whose 97847e2996eSSam Lefflercontents can be safely modified without affecting other users. 97947e2996eSSam LefflerIf allocation fails and this operation can not be completed, 98047e2996eSSam Leffler.Dv NULL 98147e2996eSSam Lefflerwill be returned. 98247e2996eSSam LefflerThe original mbuf chain is always reclaimed and the reference 98347e2996eSSam Lefflercount of any shared mbuf clusters is decremented. 98447e2996eSSam Leffler.Fa how 98547e2996eSSam Lefflershould be either 986ea26d587SRuslan Ermilov.Dv M_WAIT 98747e2996eSSam Leffleror 98847e2996eSSam Leffler.Dv M_DONTWAIT , 98947e2996eSSam Lefflerdepending on the caller's preference. 99047e2996eSSam LefflerAs a side-effect of this process the returned 99147e2996eSSam Lefflermbuf chain may be compacted. 99247e2996eSSam Leffler.Pp 99347e2996eSSam LefflerThis function is especially useful in the transmit path of 99447e2996eSSam Lefflernetwork code, when data must be encrypted or otherwise 99547e2996eSSam Leffleraltered prior to transmission. 9963136363fSRuslan Ermilov.El 9970193eb5eSYaroslav Tykhiy.Sh HARDWARE-ASSISTED CHECKSUM CALCULATION 9980193eb5eSYaroslav TykhiyThis section currently applies to TCP/IP only. 9990193eb5eSYaroslav TykhiyIn order to save the host CPU resources, computing checksums is 10000193eb5eSYaroslav Tykhiyoffloaded to the network interface hardware if possible. 10010193eb5eSYaroslav TykhiyThe 10020193eb5eSYaroslav Tykhiy.Va m_pkthdr 10030193eb5eSYaroslav Tykhiymember of the leading 10040193eb5eSYaroslav Tykhiy.Vt mbuf 10050193eb5eSYaroslav Tykhiyof a packet contains two fields used for that purpose, 10060193eb5eSYaroslav Tykhiy.Vt int Va csum_flags 10070193eb5eSYaroslav Tykhiyand 10080193eb5eSYaroslav Tykhiy.Vt int Va csum_data . 10090193eb5eSYaroslav TykhiyThe meaning of those fields depends on the direction a packet flows in, 10100193eb5eSYaroslav Tykhiyand on whether the packet is fragmented. 10110193eb5eSYaroslav TykhiyHenceforth, 10120193eb5eSYaroslav Tykhiy.Va csum_flags 10130193eb5eSYaroslav Tykhiyor 10140193eb5eSYaroslav Tykhiy.Va csum_data 10150193eb5eSYaroslav Tykhiyof a packet 10160193eb5eSYaroslav Tykhiywill denote the corresponding field of the 10170193eb5eSYaroslav Tykhiy.Va m_pkthdr 10180193eb5eSYaroslav Tykhiymember of the leading 10190193eb5eSYaroslav Tykhiy.Vt mbuf 10200193eb5eSYaroslav Tykhiyin the 10210193eb5eSYaroslav Tykhiy.Vt mbuf chain 10220193eb5eSYaroslav Tykhiycontaining the packet. 10230193eb5eSYaroslav Tykhiy.Pp 10240193eb5eSYaroslav TykhiyOn output, checksum offloading is attempted after the outgoing 10250193eb5eSYaroslav Tykhiyinterface has been determined for a packet. 10260193eb5eSYaroslav TykhiyThe interface-specific field 10270193eb5eSYaroslav Tykhiy.Va ifnet.if_data.ifi_hwassist 10280193eb5eSYaroslav Tykhiy(see 10290193eb5eSYaroslav Tykhiy.Xr ifnet 9 ) 10300193eb5eSYaroslav Tykhiyis consulted for the capabilities of the interface to assist in 10310193eb5eSYaroslav Tykhiycomputing checksums. 10320193eb5eSYaroslav TykhiyThe 10330193eb5eSYaroslav Tykhiy.Va csum_flags 1034f48cbcdeSRuslan Ermilovfield of the packet header is set to indicate which actions the interface 10350193eb5eSYaroslav Tykhiyis supposed to perform on it. 10360193eb5eSYaroslav TykhiyThe actions unsupported by the network interface are done in the 10370193eb5eSYaroslav Tykhiysoftware prior to passing the packet down to the interface driver; 10380193eb5eSYaroslav Tykhiysuch actions will never be requested through 10390193eb5eSYaroslav Tykhiy.Va csum_flags . 10400193eb5eSYaroslav Tykhiy.Pp 10410193eb5eSYaroslav TykhiyThe flags demanding a particular action from an interface are as follows: 10420193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_TCP" -offset indent 10430193eb5eSYaroslav Tykhiy.It Dv CSUM_IP 10440193eb5eSYaroslav TykhiyThe IP header checksum is to be computed and stored in the 10450193eb5eSYaroslav Tykhiycorresponding field of the packet. 10460193eb5eSYaroslav TykhiyThe hardware is expected to know the format of an IP header 10470193eb5eSYaroslav Tykhiyto determine the offset of the IP checksum field. 10480193eb5eSYaroslav Tykhiy.It Dv CSUM_TCP 1049f48cbcdeSRuslan ErmilovThe TCP checksum is to be computed. 1050f48cbcdeSRuslan Ermilov(See below.) 10510193eb5eSYaroslav Tykhiy.It Dv CSUM_UDP 1052f48cbcdeSRuslan ErmilovThe UDP checksum is to be computed. 1053f48cbcdeSRuslan Ermilov(See below.) 10540193eb5eSYaroslav Tykhiy.El 10550193eb5eSYaroslav Tykhiy.Pp 1056fbde705aSYaroslav TykhiyShould a TCP or UDP checksum be offloaded to the hardware, 10570193eb5eSYaroslav Tykhiythe field 10580193eb5eSYaroslav Tykhiy.Va csum_data 10590193eb5eSYaroslav Tykhiywill contain the byte offset of the checksum field relative to the 10600193eb5eSYaroslav Tykhiyend of the IP header. 10610193eb5eSYaroslav TykhiyIn this case, the checksum field will be initially 10620193eb5eSYaroslav Tykhiyset by the TCP/IP module to the checksum of the pseudo header 1063fbde705aSYaroslav Tykhiydefined by the TCP and UDP specifications. 10640193eb5eSYaroslav Tykhiy.Pp 10650193eb5eSYaroslav TykhiyFor outbound packets which have been fragmented 10660193eb5eSYaroslav Tykhiyby the host CPU, the following will also be true, 10670193eb5eSYaroslav Tykhiyregardless of the checksum flag settings: 10680193eb5eSYaroslav Tykhiy.Bl -bullet -offset indent 10690193eb5eSYaroslav Tykhiy.It 10700193eb5eSYaroslav Tykhiyall fragments will have the flag 10710193eb5eSYaroslav Tykhiy.Dv M_FRAG 10720193eb5eSYaroslav Tykhiyset in their 10730193eb5eSYaroslav Tykhiy.Va m_flags 10740193eb5eSYaroslav Tykhiyfield; 10750193eb5eSYaroslav Tykhiy.It 10760193eb5eSYaroslav Tykhiythe first and the last fragments in the chain will have 10770193eb5eSYaroslav Tykhiy.Dv M_FIRSTFRAG 10780193eb5eSYaroslav Tykhiyor 10790193eb5eSYaroslav Tykhiy.Dv M_LASTFRAG 10800193eb5eSYaroslav Tykhiyset in their 10810193eb5eSYaroslav Tykhiy.Va m_flags , 10820193eb5eSYaroslav Tykhiycorrespondingly; 10830193eb5eSYaroslav Tykhiy.It 10840193eb5eSYaroslav Tykhiythe first fragment in the chain will have the total number 10850193eb5eSYaroslav Tykhiyof fragments contained in its 10860193eb5eSYaroslav Tykhiy.Va csum_data 10870193eb5eSYaroslav Tykhiyfield. 10880193eb5eSYaroslav Tykhiy.El 10890193eb5eSYaroslav Tykhiy.Pp 109076f80df6SYaroslav TykhiyThe last rule for fragmented packets takes precedence over the one 109176f80df6SYaroslav Tykhiyfor a TCP or UDP checksum. 109276f80df6SYaroslav TykhiyNevertheless, offloading a TCP or UDP checksum is possible for a 109376f80df6SYaroslav Tykhiyfragmented packet if the flag 109476f80df6SYaroslav Tykhiy.Dv CSUM_IP_FRAGS 109576f80df6SYaroslav Tykhiyis set in the field 109676f80df6SYaroslav Tykhiy.Va ifnet.if_data.ifi_hwassist 109776f80df6SYaroslav Tykhiyassociated with the network interface. 109876f80df6SYaroslav TykhiyHowever, in this case the interface is expected to figure out 109976f80df6SYaroslav Tykhiythe location of the checksum field within the sequence of fragments 110076f80df6SYaroslav Tykhiyby itself because 11010193eb5eSYaroslav Tykhiy.Va csum_data 110276f80df6SYaroslav Tykhiycontains a fragment count instead of a checksum offset value. 11030193eb5eSYaroslav Tykhiy.Pp 11040193eb5eSYaroslav TykhiyOn input, an interface indicates the actions it has performed 11050193eb5eSYaroslav Tykhiyon a packet by setting one or more of the following flags in 11060193eb5eSYaroslav Tykhiy.Va csum_flags 11070193eb5eSYaroslav Tykhiyassociated with the packet: 11080193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_IP_CHECKED" -offset indent 11090193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_CHECKED 11100193eb5eSYaroslav TykhiyThe IP header checksum has been computed. 11110193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_VALID 11120193eb5eSYaroslav TykhiyThe IP header has a valid checksum. 11130193eb5eSYaroslav TykhiyThis flag can appear only in combination with 11140193eb5eSYaroslav Tykhiy.Dv CSUM_IP_CHECKED . 11150193eb5eSYaroslav Tykhiy.It Dv CSUM_DATA_VALID 11160193eb5eSYaroslav TykhiyThe checksum of the data portion of the IP packet has been computed 11170193eb5eSYaroslav Tykhiyand stored in the field 11180193eb5eSYaroslav Tykhiy.Va csum_data 11190193eb5eSYaroslav Tykhiyin network byte order. 11200193eb5eSYaroslav Tykhiy.It Dv CSUM_PSEUDO_HDR 11210193eb5eSYaroslav TykhiyCan be set only along with 11220193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID 11230193eb5eSYaroslav Tykhiyto indicate that the IP data checksum found in 11240193eb5eSYaroslav Tykhiy.Va csum_data 1125fbde705aSYaroslav Tykhiyallows for the pseudo header defined by the TCP and UDP specifications. 11260193eb5eSYaroslav TykhiyOtherwise the checksum of the pseudo header must be calculated by 11270193eb5eSYaroslav Tykhiythe host CPU and added to 11280193eb5eSYaroslav Tykhiy.Va csum_data 1129fbde705aSYaroslav Tykhiyto obtain the final checksum to be used for TCP or UDP validation purposes. 11300193eb5eSYaroslav Tykhiy.El 11310193eb5eSYaroslav Tykhiy.Pp 11320193eb5eSYaroslav TykhiyIf a particular network interface just indicates success or 11330193eb5eSYaroslav Tykhiyfailure of TCP or UDP checksum validation without returning 11340193eb5eSYaroslav Tykhiythe exact value of the checksum to the host CPU, its driver can mark 11350193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID 11360193eb5eSYaroslav Tykhiyand 11370193eb5eSYaroslav Tykhiy.Dv CSUM_PSEUDO_HDR 11380193eb5eSYaroslav Tykhiyin 11390193eb5eSYaroslav Tykhiy.Va csum_flags , 11400193eb5eSYaroslav Tykhiyand set 11410193eb5eSYaroslav Tykhiy.Va csum_data 11420193eb5eSYaroslav Tykhiyto 11430193eb5eSYaroslav Tykhiy.Li 0xFFFF 11440193eb5eSYaroslav Tykhiyhexadecimal to indicate a valid checksum. 1145f48cbcdeSRuslan ErmilovIt is a peculiarity of the algorithm used that the Internet checksum 11460193eb5eSYaroslav Tykhiycalculated over any valid packet will be 11470193eb5eSYaroslav Tykhiy.Li 0xFFFF 11480193eb5eSYaroslav Tykhiyas long as the original checksum field is included. 11490193eb5eSYaroslav Tykhiy.Pp 11500193eb5eSYaroslav TykhiyFor inbound packets which are IP fragments, all 11510193eb5eSYaroslav Tykhiy.Va csum_data 11520193eb5eSYaroslav Tykhiyfields will be summed during reassembly to obtain the final checksum 11530193eb5eSYaroslav Tykhiyvalue passed to an upper layer in the 11540193eb5eSYaroslav Tykhiy.Va csum_data 11550193eb5eSYaroslav Tykhiyfield of the reassembled packet. 11560193eb5eSYaroslav TykhiyThe 11570193eb5eSYaroslav Tykhiy.Va csum_flags 11580193eb5eSYaroslav Tykhiyfields of all fragments will be consolidated using logical AND 11590193eb5eSYaroslav Tykhiyto obtain the final value for 11600193eb5eSYaroslav Tykhiy.Va csum_flags . 11610193eb5eSYaroslav TykhiyThus, in order to successfully 11620193eb5eSYaroslav Tykhiyoffload checksum computation for fragmented data, 11630193eb5eSYaroslav Tykhiyall fragments should have the same value of 11640193eb5eSYaroslav Tykhiy.Va csum_flags . 11653cab047eSMike Silbersack.Sh STRESS TESTING 1166c8185672SRuslan ErmilovWhen running a kernel compiled with the option 1167c8185672SRuslan Ermilov.Dv MBUF_STRESS_TEST , 1168c8185672SRuslan Ermilovthe following 1169c8185672SRuslan Ermilov.Xr sysctl 8 Ns 1170c8185672SRuslan Ermilov-controlled options may be used to create 11713cab047eSMike Silbersackvarious failure/extreme cases for testing of network drivers 11727b2fd183SYaroslav Tykhiyand other parts of the kernel that rely on 11737b2fd183SYaroslav Tykhiy.Vt mbufs . 1174c8185672SRuslan Ermilov.Bl -tag -width ident 1175c8185672SRuslan Ermilov.It Va net.inet.ip.mbuf_frag_size 1176c8185672SRuslan ErmilovCauses 1177c8185672SRuslan Ermilov.Fn ip_output 11787b2fd183SYaroslav Tykhiyto fragment outgoing 11797b2fd183SYaroslav Tykhiy.Vt mbuf chains 11807b2fd183SYaroslav Tykhiyinto fragments of the specified size. 1181c8185672SRuslan ErmilovSetting this variable to 1 is an excellent way to 11827b2fd183SYaroslav Tykhiytest the long 11837b2fd183SYaroslav Tykhiy.Vt mbuf chain 11847b2fd183SYaroslav Tykhiyhandling ability of network drivers. 1185c8185672SRuslan Ermilov.It Va kern.ipc.m_defragrandomfailures 1186c8185672SRuslan ErmilovCauses the function 1187c8185672SRuslan Ermilov.Fn m_defrag 1188c8185672SRuslan Ermilovto randomly fail, returning 1189c8185672SRuslan Ermilov.Dv NULL . 1190c8185672SRuslan ErmilovAny piece of code which uses 1191c8185672SRuslan Ermilov.Fn m_defrag 1192c8185672SRuslan Ermilovshould be tested with this feature. 1193c8185672SRuslan Ermilov.El 1194de06f907SNik Clayton.Sh RETURN VALUES 1195de06f907SNik ClaytonSee above. 11960193eb5eSYaroslav Tykhiy.Sh SEE ALSO 1197e85cc3f5SRuslan Ermilov.Xr ifnet 9 , 1198e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9 1199de06f907SNik Clayton.Sh HISTORY 1200de06f907SNik Clayton.\" Please correct me if I'm wrong 12017b2fd183SYaroslav Tykhiy.Vt Mbufs 12027b2fd183SYaroslav Tykhiyappeared in an early version of 1203753d686dSRuslan Ermilov.Bx . 120453b2520dSTom RhodesBesides being used for network packets, they were used 1205bfd59721SBosko Milekicto store various dynamic structures, such as routing table 1206bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc. 1207db430f97SRobert WatsonIn more recent 1208db430f97SRobert Watson.Fx 1209db430f97SRobert Watsonuse of 1210db430f97SRobert Watson.Vt mbufs 1211db430f97SRobert Watsonis almost entirely limited to packet storage, with 1212db430f97SRobert Watson.Xr uma 9 1213db430f97SRobert Watsonzones being used directly to store other network-related memory. 1214db430f97SRobert Watson.Pp 1215db430f97SRobert WatsonHistorically, the 1216db430f97SRobert Watson.Vt mbuf 1217db430f97SRobert Watsonallocator has been a special-purpose memory allocator able to run in 1218db430f97SRobert Watsoninterrupt contexts and allocating from a special kernel address space map. 1219db430f97SRobert WatsonAs of 1220db430f97SRobert Watson.Fx 5.3 , 1221db430f97SRobert Watsonthe 1222db430f97SRobert Watson.Vt mbuf 1223db430f97SRobert Watsonallocator is a wrapper around 1224db430f97SRobert Watson.Xr uma 9 , 1225db430f97SRobert Watsonallowing caching of 1226db430f97SRobert Watson.Vt mbufs , 1227db430f97SRobert Watsonclusters, and 1228db430f97SRobert Watson.Vt mbuf 1229db430f97SRobert Watson+ cluster pairs in per-CPU caches, as well as bringing other benefits of 1230db430f97SRobert Watsonslab allocation. 1231de06f907SNik Clayton.Sh AUTHORS 12326575e6daSRuslan ErmilovThe original 12336575e6daSRuslan Ermilov.Nm 1234571dba6eSHiten Pandyamanual page was written by Yar Tikhiy. 1235db430f97SRobert WatsonThe 1236db430f97SRobert Watson.Xr uma 9 1237db430f97SRobert Watson.Vt mbuf 1238db430f97SRobert Watsonallocator was written by Bosko Milekic. 1239