xref: /freebsd/share/man/man9/mbuf.9 (revision 33d8df4b31dd7017cea534fea503c2a23a1b158c)
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*33d8df4bSKevin Lo.Dd June 5, 2014
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"
67ada46fe9SKevin Lo.Fn MCHTYPE "struct mbuf *mbuf" "short 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 *
73ada46fe9SKevin Lo.Fn m_get "int how" "short type"
74de06f907SNik Clayton.Ft struct mbuf *
7518f169afSKevin Lo.Fn m_get2 "int size" "int how" "short type" "int flags"
7618f169afSKevin Lo.Ft struct mbuf *
77ada46fe9SKevin Lo.Fn m_getm "struct mbuf *orig" "int len" "int how" "short type"
78328c0bbcSBosko Milekic.Ft struct mbuf *
795c35eb22SJohn-Mark Gurney.Fn m_getjcl "int how" "short type" "int flags" "int size"
805c35eb22SJohn-Mark Gurney.Ft struct mbuf *
816c013706SMaxim Konovalov.Fn m_getcl "int how" "short type" "int flags"
826c013706SMaxim Konovalov.Ft struct mbuf *
83ada46fe9SKevin Lo.Fn m_getclr "int how" "short type"
84de06f907SNik Clayton.Ft struct mbuf *
85ada46fe9SKevin Lo.Fn m_gethdr "int how" "short type"
86bfd59721SBosko Milekic.Ft struct mbuf *
87bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf"
88de06f907SNik Clayton.Ft void
89de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf"
90bfd59721SBosko Milekic.\"
91bfd59721SBosko Milekic.Ss Mbuf utility functions
92de06f907SNik Clayton.Ft void
93de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len"
949c3fd404SSam Leffler.Ft void
959c3fd404SSam Leffler.Fn m_align "struct mbuf *mbuf" "int len"
96b9def06bSSam Leffler.Ft int
97b9def06bSSam Leffler.Fn m_append "struct mbuf *mbuf" "int len" "c_caddr_t cp"
98de06f907SNik Clayton.Ft struct mbuf *
99de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how"
100de06f907SNik Clayton.Ft struct mbuf *
1017ac139a9SJohn-Mark Gurney.Fn m_copyup "struct mbuf *mbuf" "int len" "int dstoff"
1027ac139a9SJohn-Mark Gurney.Ft struct mbuf *
103de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len"
104de06f907SNik Clayton.Ft struct mbuf *
105d305f4b9SBruce M Simpson.Fn m_pulldown "struct mbuf *mbuf" "int offset" "int len" "int *offsetp"
106d305f4b9SBruce M Simpson.Ft struct mbuf *
107de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how"
108de06f907SNik Clayton.Ft struct mbuf *
109de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how"
110de06f907SNik Clayton.Ft struct mbuf *
111de06f907SNik Clayton.Fn m_dup "struct mbuf *mbuf" "int how"
112de06f907SNik Clayton.Ft void
1130d8e4c57SBruce Evans.Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
114de06f907SNik Clayton.Ft void
115de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
116de06f907SNik Clayton.Ft struct mbuf *
117de06f907SNik Clayton.Fo m_devget
118de06f907SNik Clayton.Fa "char *buf"
119de06f907SNik Clayton.Fa "int len"
120de06f907SNik Clayton.Fa "int offset"
121de06f907SNik Clayton.Fa "struct ifnet *ifp"
122de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)"
123de06f907SNik Clayton.Fc
124de06f907SNik Clayton.Ft void
125de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n"
126e60fa837SRuslan Ermilov.Ft u_int
1270b1c0994SPoul-Henning Kamp.Fn m_fixhdr "struct mbuf *mbuf"
128da72b998SYaroslav Tykhiy.Ft void
129da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr "struct mbuf *to" "struct mbuf *from"
130da72b998SYaroslav Tykhiy.Ft void
131da72b998SYaroslav Tykhiy.Fn m_move_pkthdr "struct mbuf *to" "struct mbuf *from"
132e60fa837SRuslan Ermilov.Ft u_int
1330b1c0994SPoul-Henning Kamp.Fn m_length "struct mbuf *mbuf" "struct mbuf **last"
134de06f907SNik Clayton.Ft struct mbuf *
135de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how"
13602312219SBruce M Simpson.Ft int
13702312219SBruce M Simpson.Fn m_apply "struct mbuf *mbuf" "int off" "int len" "int (*f)(void *arg, void *data, u_int len)" "void *arg"
13802312219SBruce M Simpson.Ft struct mbuf *
13902312219SBruce M Simpson.Fn m_getptr "struct mbuf *mbuf" "int loc" "int *off"
140a61bc764SMike Silbersack.Ft struct mbuf *
141a61bc764SMike Silbersack.Fn m_defrag "struct mbuf *m0" "int how"
14247e2996eSSam Leffler.Ft struct mbuf *
14347e2996eSSam Leffler.Fn m_unshare "struct mbuf *m0" "int how"
144de06f907SNik Clayton.\"
145de06f907SNik Clayton.Sh DESCRIPTION
1467b2fd183SYaroslav TykhiyAn
1477b2fd183SYaroslav Tykhiy.Vt mbuf
1487b2fd183SYaroslav Tykhiyis a basic unit of memory management in the kernel IPC subsystem.
1497b2fd183SYaroslav TykhiyNetwork packets and socket buffers are stored in
1507b2fd183SYaroslav Tykhiy.Vt mbufs .
1517b2fd183SYaroslav TykhiyA network packet may span multiple
1527b2fd183SYaroslav Tykhiy.Vt mbufs
1537b2fd183SYaroslav Tykhiyarranged into a
1547b2fd183SYaroslav Tykhiy.Vt mbuf chain
155c4d9468eSRuslan Ermilov(linked list),
156de06f907SNik Claytonwhich allows adding or trimming
157bfd59721SBosko Milekicnetwork headers with little overhead.
158de06f907SNik Clayton.Pp
1597b2fd183SYaroslav TykhiyWhile a developer should not bother with
1607b2fd183SYaroslav Tykhiy.Vt mbuf
1617b2fd183SYaroslav Tykhiyinternals without serious
162de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it
1637b2fd183SYaroslav Tykhiyis useful to understand the general structure of an
1647b2fd183SYaroslav Tykhiy.Vt mbuf .
165de06f907SNik Clayton.Pp
1667b2fd183SYaroslav TykhiyAn
1677b2fd183SYaroslav Tykhiy.Vt mbuf
1687b2fd183SYaroslav Tykhiyconsists of a variable-sized header and a small internal
169e73145f6SSheldon Hearnbuffer for data.
1707b2fd183SYaroslav TykhiyThe total size of an
1717b2fd183SYaroslav Tykhiy.Vt mbuf ,
172bfd59721SBosko Milekic.Dv MSIZE ,
173feccf50cSAlex Dupreis a constant defined in
174feccf50cSAlex Dupre.In sys/param.h .
1757b2fd183SYaroslav TykhiyThe
1767b2fd183SYaroslav Tykhiy.Vt mbuf
1777b2fd183SYaroslav Tykhiyheader includes:
178238d9c59SYaroslav Tykhiy.Bl -tag -width "m_nextpkt" -offset indent
179be82a0bcSYaroslav Tykhiy.It Va m_next
180238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
181238d9c59SYaroslav TykhiyA pointer to the next
1827b2fd183SYaroslav Tykhiy.Vt mbuf
1837b2fd183SYaroslav Tykhiyin the
184238d9c59SYaroslav Tykhiy.Vt mbuf chain .
185be82a0bcSYaroslav Tykhiy.It Va m_nextpkt
186238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
187238d9c59SYaroslav TykhiyA pointer to the next
1887b2fd183SYaroslav Tykhiy.Vt mbuf chain
189238d9c59SYaroslav Tykhiyin the queue.
190be82a0bcSYaroslav Tykhiy.It Va m_data
191238d9c59SYaroslav Tykhiy.Pq Vt caddr_t
192238d9c59SYaroslav TykhiyA pointer to data attached to this
193238d9c59SYaroslav Tykhiy.Vt mbuf .
194be82a0bcSYaroslav Tykhiy.It Va m_len
195238d9c59SYaroslav Tykhiy.Pq Vt int
196238d9c59SYaroslav TykhiyThe length of the data.
197be82a0bcSYaroslav Tykhiy.It Va m_type
198238d9c59SYaroslav Tykhiy.Pq Vt short
199238d9c59SYaroslav TykhiyThe type of the data.
200be82a0bcSYaroslav Tykhiy.It Va m_flags
201238d9c59SYaroslav Tykhiy.Pq Vt int
202238d9c59SYaroslav TykhiyThe
2037b2fd183SYaroslav Tykhiy.Vt mbuf
204238d9c59SYaroslav Tykhiyflags.
205de06f907SNik Clayton.El
206de06f907SNik Clayton.Pp
2077b2fd183SYaroslav TykhiyThe
2087b2fd183SYaroslav Tykhiy.Vt mbuf
2097b2fd183SYaroslav Tykhiyflag bits are defined as follows:
210de06f907SNik Clayton.Bd -literal
211de06f907SNik Clayton/* mbuf flags */
212*33d8df4bSKevin Lo#define	M_EXT		0x00000001 /* has associated external storage */
213*33d8df4bSKevin Lo#define	M_PKTHDR	0x00000002 /* start of record */
214*33d8df4bSKevin Lo#define	M_EOR		0x00000004 /* end of record */
215*33d8df4bSKevin Lo#define	M_RDONLY	0x00000008 /* associated data marked read-only */
216*33d8df4bSKevin Lo#define	M_PROTO1	0x00001000 /* protocol-specific */
217*33d8df4bSKevin Lo#define	M_PROTO2	0x00002000 /* protocol-specific */
218*33d8df4bSKevin Lo#define	M_PROTO3	0x00004000 /* protocol-specific */
219*33d8df4bSKevin Lo#define	M_PROTO4	0x00008000 /* protocol-specific */
220*33d8df4bSKevin Lo#define	M_PROTO5	0x00010000 /* protocol-specific */
221*33d8df4bSKevin Lo#define	M_PROTO6	0x00020000 /* protocol-specific */
222*33d8df4bSKevin Lo#define	M_PROTO7	0x00040000 /* protocol-specific */
223*33d8df4bSKevin Lo#define	M_PROTO8	0x00080000 /* protocol-specific */
224*33d8df4bSKevin Lo#define	M_PROTO9	0x00100000 /* protocol-specific */
225*33d8df4bSKevin Lo#define	M_PROTO10	0x00200000 /* protocol-specific */
226*33d8df4bSKevin Lo#define	M_PROTO11	0x00400000 /* protocol-specific */
227*33d8df4bSKevin Lo#define	M_PROTO12	0x00800000 /* protocol-specific */
228de06f907SNik Clayton
229f434362aSYaroslav Tykhiy/* mbuf pkthdr flags (also stored in m_flags) */
230*33d8df4bSKevin Lo#define	M_BCAST		0x00000010 /* send/received as link-level broadcast */
231*33d8df4bSKevin Lo#define	M_MCAST		0x00000020 /* send/received as link-level multicast */
232de06f907SNik Clayton.Ed
233de06f907SNik Clayton.Pp
2347b2fd183SYaroslav TykhiyThe available
2357b2fd183SYaroslav Tykhiy.Vt mbuf
2367b2fd183SYaroslav Tykhiytypes are defined as follows:
237de06f907SNik Clayton.Bd -literal
238de06f907SNik Clayton/* mbuf types */
239de06f907SNik Clayton#define	MT_DATA		1	/* dynamic (data) allocation */
2401cb58a07SMaxim Konovalov#define	MT_HEADER	MT_DATA	/* packet header */
241de06f907SNik Clayton#define	MT_SONAME	8	/* socket name */
242de06f907SNik Clayton#define	MT_CONTROL	14	/* extra-data protocol message */
243de06f907SNik Clayton#define	MT_OOBDATA	15	/* expedited data */
244de06f907SNik Clayton.Ed
245de06f907SNik Clayton.Pp
246c3a2dbe9SDag-Erling SmørgravThe available external buffer types are defined as follows:
247c3a2dbe9SDag-Erling Smørgrav.Bd -literal
248c3a2dbe9SDag-Erling Smørgrav/* external buffer types */
249c3a2dbe9SDag-Erling Smørgrav#define EXT_CLUSTER	1	/* mbuf cluster */
250c3a2dbe9SDag-Erling Smørgrav#define EXT_SFBUF	2	/* sendfile(2)'s sf_bufs */
251c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBOP	3	/* jumbo cluster 4096 bytes */
252c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO9	4	/* jumbo cluster 9216 bytes */
253c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO16	5	/* jumbo cluster 16184 bytes */
254c3a2dbe9SDag-Erling Smørgrav#define EXT_PACKET	6	/* mbuf+cluster from packet zone */
255c3a2dbe9SDag-Erling Smørgrav#define EXT_MBUF	7	/* external mbuf reference (M_IOVEC) */
256*33d8df4bSKevin Lo#define EXT_NET_DRV	252	/* custom ext_buf provided by net driver(s) */
257*33d8df4bSKevin Lo#define EXT_MOD_TYPE	253	/* custom module's ext_buf type */
258*33d8df4bSKevin Lo#define EXT_DISPOSABLE	254	/* can throw this buffer away w/page flipping */
259*33d8df4bSKevin Lo#define EXT_EXTREF	255	/* has externally maintained ref_cnt ptr */
260c3a2dbe9SDag-Erling Smørgrav.Ed
261c3a2dbe9SDag-Erling Smørgrav.Pp
262de06f907SNik ClaytonIf the
263de06f907SNik Clayton.Dv M_PKTHDR
264de06f907SNik Claytonflag is set, a
2657b2fd183SYaroslav Tykhiy.Vt struct pkthdr Va m_pkthdr
2667b2fd183SYaroslav Tykhiyis added to the
2677b2fd183SYaroslav Tykhiy.Vt mbuf
2687b2fd183SYaroslav Tykhiyheader.
269e73145f6SSheldon HearnIt contains a pointer to the interface
270de06f907SNik Claytonthe packet has been received from
2717b2fd183SYaroslav Tykhiy.Pq Vt struct ifnet Va *rcvif ,
272de06f907SNik Claytonand the total packet length
2737b2fd183SYaroslav Tykhiy.Pq Vt int Va len .
274e85cc3f5SRuslan ErmilovOptionally, it may also contain an attached list of packet tags
275e85cc3f5SRuslan Ermilov.Pq Vt "struct m_tag" .
276e85cc3f5SRuslan ErmilovSee
277e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
278e85cc3f5SRuslan Ermilovfor details.
2790193eb5eSYaroslav TykhiyFields used in offloading checksum calculation to the hardware are kept in
2800193eb5eSYaroslav Tykhiy.Va m_pkthdr
2810193eb5eSYaroslav Tykhiyas well.
2820193eb5eSYaroslav TykhiySee
2830193eb5eSYaroslav Tykhiy.Sx HARDWARE-ASSISTED CHECKSUM CALCULATION
2840193eb5eSYaroslav Tykhiyfor details.
285de06f907SNik Clayton.Pp
2867b2fd183SYaroslav TykhiyIf small enough, data is stored in the internal data buffer of an
2877b2fd183SYaroslav Tykhiy.Vt mbuf .
2887b2fd183SYaroslav TykhiyIf the data is sufficiently large, another
2897b2fd183SYaroslav Tykhiy.Vt mbuf
2907b2fd183SYaroslav Tykhiymay be added to the
2917b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
2927b2fd183SYaroslav Tykhiyor external storage may be associated with the
2937b2fd183SYaroslav Tykhiy.Vt mbuf .
294de06f907SNik Clayton.Dv MHLEN
2957b2fd183SYaroslav Tykhiybytes of data can fit into an
2967b2fd183SYaroslav Tykhiy.Vt mbuf
2977b2fd183SYaroslav Tykhiywith the
298de06f907SNik Clayton.Dv M_PKTHDR
299de06f907SNik Claytonflag set,
300de06f907SNik Clayton.Dv MLEN
301de06f907SNik Claytonbytes can otherwise.
302de06f907SNik Clayton.Pp
3037b2fd183SYaroslav TykhiyIf external storage is being associated with an
3047b2fd183SYaroslav Tykhiy.Vt mbuf ,
3057b2fd183SYaroslav Tykhiythe
306be82a0bcSYaroslav Tykhiy.Va m_ext
30725f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer.
308e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage,
309e73145f6SSheldon Hearna pointer to a function used for freeing the storage,
310e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function,
311e73145f6SSheldon Hearnand a pointer to a reference counter.
3127b2fd183SYaroslav TykhiyAn
3137b2fd183SYaroslav Tykhiy.Vt mbuf
3147b2fd183SYaroslav Tykhiyusing external storage has the
315de06f907SNik Clayton.Dv M_EXT
316de06f907SNik Claytonflag set.
317de06f907SNik Clayton.Pp
318bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage
319bfd59721SBosko Milekicbuffer,
320bfd59721SBosko Milekic.Dv MEXTADD .
321bfd59721SBosko Milekic.Pp
322bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the
323e73145f6SSheldon Hearnsubsystem.
324bfd59721SBosko Milekic.Pp
325bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an
3267b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3277b2fd183SYaroslav Tykhiy.Vt Mbuf clusters
3287b2fd183SYaroslav Tykhiycan be allocated and configured with the use of the
329bfd59721SBosko Milekic.Dv MCLGET
330e73145f6SSheldon Hearnmacro.
3317b2fd183SYaroslav TykhiyEach
3327b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3337b2fd183SYaroslav Tykhiyis
334de06f907SNik Clayton.Dv MCLBYTES
335bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant.
336bfd59721SBosko MilekicThe system defines an advisory macro
337de06f907SNik Clayton.Dv MINCLSIZE ,
3387b2fd183SYaroslav Tykhiywhich is the smallest amount of data to put into an
3397b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3402e3ee239SKevin LoIt is equal to
3412e3ee239SKevin Lo.Dv MHLEN
3422e3ee239SKevin Loplus one.
3437b2fd183SYaroslav TykhiyIt is typically preferable to store data into the data region of an
3447b2fd183SYaroslav Tykhiy.Vt mbuf ,
3457b2fd183SYaroslav Tykhiyif size permits, as opposed to allocating a separate
3467b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3477b2fd183SYaroslav Tykhiyto hold the same data.
348de06f907SNik Clayton.\"
349de06f907SNik Clayton.Ss Macros and Functions
350bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the
351bfd59721SBosko Milekicdeveloper with common utilities.
352de06f907SNik Clayton.\"
353de06f907SNik Clayton.Bl -ohang -offset indent
354de06f907SNik Clayton.It Fn mtod mbuf type
3557b2fd183SYaroslav TykhiyConvert an
3567b2fd183SYaroslav Tykhiy.Fa mbuf
3577b2fd183SYaroslav Tykhiypointer to a data pointer.
3587b2fd183SYaroslav TykhiyThe macro expands to the data pointer cast to the pointer of the specified
3597b2fd183SYaroslav Tykhiy.Fa type .
360de06f907SNik Clayton.Sy Note :
3617b2fd183SYaroslav TykhiyIt is advisable to ensure that there is enough contiguous data in
3627b2fd183SYaroslav Tykhiy.Fa mbuf .
363de06f907SNik ClaytonSee
364de06f907SNik Clayton.Fn m_pullup
365de06f907SNik Claytonfor details.
366de06f907SNik Clayton.It Fn MGET mbuf how type
3677b2fd183SYaroslav TykhiyAllocate an
3687b2fd183SYaroslav Tykhiy.Vt mbuf
3697b2fd183SYaroslav Tykhiyand initialize it to contain internal data.
37025f1a2e9SSheldon Hearn.Fa mbuf
3717b2fd183SYaroslav Tykhiywill point to the allocated
3727b2fd183SYaroslav Tykhiy.Vt mbuf
3737b2fd183SYaroslav Tykhiyon success, or be set to
374de06f907SNik Clayton.Dv NULL
375e73145f6SSheldon Hearnon failure.
376e73145f6SSheldon HearnThe
377de06f907SNik Clayton.Fa how
378de06f907SNik Claytonargument is to be set to
379fa05d215SGleb Smirnoff.Dv M_WAITOK
380de06f907SNik Claytonor
381fa05d215SGleb Smirnoff.Dv M_NOWAIT .
38225f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary.
3837b2fd183SYaroslav TykhiyA number of other functions and macros related to
3847b2fd183SYaroslav Tykhiy.Vt mbufs
3857b2fd183SYaroslav Tykhiyhave the same argument because they may
3867b2fd183SYaroslav Tykhiyat some point need to allocate new
3877b2fd183SYaroslav Tykhiy.Vt mbufs .
388de06f907SNik Clayton.It Fn MGETHDR mbuf how type
3897b2fd183SYaroslav TykhiyAllocate an
3907b2fd183SYaroslav Tykhiy.Vt mbuf
3917b2fd183SYaroslav Tykhiyand initialize it to contain a packet header
392e73145f6SSheldon Hearnand internal data.
393e73145f6SSheldon HearnSee
394de06f907SNik Clayton.Fn MGET
395de06f907SNik Claytonfor details.
396c3a2dbe9SDag-Erling Smørgrav.It Fn MEXTADD mbuf buf size free opt_arg1 opt_arg2 flags type
397c3a2dbe9SDag-Erling SmørgravAssociate externally managed data with
398c3a2dbe9SDag-Erling Smørgrav.Fa mbuf .
399c3a2dbe9SDag-Erling SmørgravAny internal data contained in the mbuf will be discarded, and the
40073bbeaa5SGlen Barber.Dv M_EXT
40173bbeaa5SGlen Barberflag will be set.
402c3a2dbe9SDag-Erling SmørgravThe
403c3a2dbe9SDag-Erling Smørgrav.Fa buf
404c3a2dbe9SDag-Erling Smørgravand
405c3a2dbe9SDag-Erling Smørgrav.Fa size
406c3a2dbe9SDag-Erling Smørgravarguments are the address and length, respectively, of the data.
407c3a2dbe9SDag-Erling SmørgravThe
408c3a2dbe9SDag-Erling Smørgrav.Fa free
409c3a2dbe9SDag-Erling Smørgravargument points to a function which will be called to free the data
410c3a2dbe9SDag-Erling Smørgravwhen the mbuf is freed; it is only used if
411c3a2dbe9SDag-Erling Smørgrav.Fa type
412c3a2dbe9SDag-Erling Smørgravis
413c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
414c3a2dbe9SDag-Erling SmørgravThe
415c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg1
416c3a2dbe9SDag-Erling Smørgravand
417c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg2
418c3a2dbe9SDag-Erling Smørgravarguments will be passed unmodified to
419c3a2dbe9SDag-Erling Smørgrav.Fa free .
420c3a2dbe9SDag-Erling SmørgravThe
421c3a2dbe9SDag-Erling Smørgrav.Fa flags
422c3a2dbe9SDag-Erling Smørgravargument specifies additional
423c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
424c3a2dbe9SDag-Erling Smørgravflags; it is not necessary to specify
425c3a2dbe9SDag-Erling Smørgrav.Dv M_EXT .
426c3a2dbe9SDag-Erling SmørgravFinally, the
427c3a2dbe9SDag-Erling Smørgrav.Fa type
428c3a2dbe9SDag-Erling Smørgravargument specifies the type of external data, which controls how it
429c3a2dbe9SDag-Erling Smørgravwill be disposed of when the
430c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
431c3a2dbe9SDag-Erling Smørgravis freed.
432c3a2dbe9SDag-Erling SmørgravIn most cases, the correct value is
433c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
434de06f907SNik Clayton.It Fn MCLGET mbuf how
4357b2fd183SYaroslav TykhiyAllocate and attach an
4367b2fd183SYaroslav Tykhiy.Vt mbuf cluster
4377b2fd183SYaroslav Tykhiyto
4387b2fd183SYaroslav Tykhiy.Fa mbuf .
439e73145f6SSheldon HearnIf the macro fails, the
440de06f907SNik Clayton.Dv M_EXT
4410227791bSRuslan Ermilovflag will not be set in
4427b2fd183SYaroslav Tykhiy.Fa mbuf .
443da72b998SYaroslav Tykhiy.It Fn M_ALIGN mbuf len
444da72b998SYaroslav TykhiySet the pointer
445da72b998SYaroslav Tykhiy.Fa mbuf->m_data
446da72b998SYaroslav Tykhiyto place an object of the size
447da72b998SYaroslav Tykhiy.Fa len
448da72b998SYaroslav Tykhiyat the end of the internal data area of
449da72b998SYaroslav Tykhiy.Fa mbuf ,
450da72b998SYaroslav Tykhiylong word aligned.
451da72b998SYaroslav TykhiyApplicable only if
452da72b998SYaroslav Tykhiy.Fa mbuf
453da72b998SYaroslav Tykhiyis newly allocated with
454da72b998SYaroslav Tykhiy.Fn MGET
455da72b998SYaroslav Tykhiyor
456da72b998SYaroslav Tykhiy.Fn m_get .
457da72b998SYaroslav Tykhiy.It Fn MH_ALIGN mbuf len
458da72b998SYaroslav TykhiyServes the same purpose as
459da72b998SYaroslav Tykhiy.Fn M_ALIGN
460da72b998SYaroslav Tykhiydoes, but only for
461da72b998SYaroslav Tykhiy.Fa mbuf
462da72b998SYaroslav Tykhiynewly allocated with
463da72b998SYaroslav Tykhiy.Fn MGETHDR
464da72b998SYaroslav Tykhiyor
465da72b998SYaroslav Tykhiy.Fn m_gethdr ,
466da72b998SYaroslav Tykhiyor initialized by
467da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr
468da72b998SYaroslav Tykhiyor
469da72b998SYaroslav Tykhiy.Fn m_move_pkthdr .
4709c3fd404SSam Leffler.It Fn m_align mbuf len
4719c3fd404SSam LefflerServices the same purpose as
4729c3fd404SSam Leffler.Fn M_ALIGN
4739c3fd404SSam Lefflerbut handles any type of mbuf.
474da72b998SYaroslav Tykhiy.It Fn M_LEADINGSPACE mbuf
475da72b998SYaroslav TykhiyReturns the number of bytes available before the beginning
476da72b998SYaroslav Tykhiyof data in
477da72b998SYaroslav Tykhiy.Fa mbuf .
478da72b998SYaroslav Tykhiy.It Fn M_TRAILINGSPACE mbuf
479da72b998SYaroslav TykhiyReturns the number of bytes available after the end of data in
480da72b998SYaroslav Tykhiy.Fa mbuf .
481de06f907SNik Clayton.It Fn M_PREPEND mbuf len how
4827b2fd183SYaroslav TykhiyThis macro operates on an
4837b2fd183SYaroslav Tykhiy.Vt mbuf chain .
484de06f907SNik ClaytonIt is an optimized wrapper for
485de06f907SNik Clayton.Fn m_prepend
486de06f907SNik Claytonthat can make use of possible empty space before data
4875203edcdSRuslan Ermilov(e.g.\& left after trimming of a link-layer header).
4887b2fd183SYaroslav TykhiyThe new
4897b2fd183SYaroslav Tykhiy.Vt mbuf chain
4907b2fd183SYaroslav Tykhiypointer or
491de06f907SNik Clayton.Dv NULL
492de06f907SNik Claytonis in
493de06f907SNik Clayton.Fa mbuf
494de06f907SNik Claytonafter the call.
495da72b998SYaroslav Tykhiy.It Fn M_MOVE_PKTHDR to from
496da72b998SYaroslav TykhiyUsing this macro is equivalent to calling
497da72b998SYaroslav Tykhiy.Fn m_move_pkthdr to from .
4985d4050ccSBosko Milekic.It Fn M_WRITABLE mbuf
4997b2fd183SYaroslav TykhiyThis macro will evaluate true if
5007b2fd183SYaroslav Tykhiy.Fa mbuf
5017b2fd183SYaroslav Tykhiyis not marked
5025d4050ccSBosko Milekic.Dv M_RDONLY
5037b2fd183SYaroslav Tykhiyand if either
5047b2fd183SYaroslav Tykhiy.Fa mbuf
5057b2fd183SYaroslav Tykhiydoes not contain external storage or,
5065d4050ccSBosko Milekicif it does,
5075d4050ccSBosko Milekicthen if the reference count of the storage is not greater than 1.
5085d4050ccSBosko MilekicThe
5095d4050ccSBosko Milekic.Dv M_RDONLY
5107b2fd183SYaroslav Tykhiyflag can be set in
5117b2fd183SYaroslav Tykhiy.Fa mbuf->m_flags .
5125d4050ccSBosko MilekicThis can be achieved during setup of the external storage,
5135d4050ccSBosko Milekicby passing the
5145d4050ccSBosko Milekic.Dv M_RDONLY
5155d4050ccSBosko Milekicbit as a
5160b39b3ffSRuslan Ermilov.Fa flags
5175d4050ccSBosko Milekicargument to the
5185d4050ccSBosko Milekic.Fn MEXTADD
5197b2fd183SYaroslav Tykhiymacro, or can be directly set in individual
5207b2fd183SYaroslav Tykhiy.Vt mbufs .
521da72b998SYaroslav Tykhiy.It Fn MCHTYPE mbuf type
522da72b998SYaroslav TykhiyChange the type of
523da72b998SYaroslav Tykhiy.Fa mbuf
524da72b998SYaroslav Tykhiyto
525da72b998SYaroslav Tykhiy.Fa type .
526da72b998SYaroslav TykhiyThis is a relatively expensive operation and should be avoided.
527de06f907SNik Clayton.El
528de06f907SNik Clayton.Pp
529de06f907SNik ClaytonThe functions are:
530de06f907SNik Clayton.Bl -ohang -offset indent
531de06f907SNik Clayton.It Fn m_get how type
532de06f907SNik ClaytonA function version of
533bfd59721SBosko Milekic.Fn MGET
534bfd59721SBosko Milekicfor non-critical paths.
53518f169afSKevin Lo.It Fn m_get2 size how type flags
53618f169afSKevin LoAllocate an
53718f169afSKevin Lo.Vt mbuf
53818f169afSKevin Lowith enough space to hold specified amount of data.
539328c0bbcSBosko Milekic.It Fn m_getm orig len how type
540328c0bbcSBosko MilekicAllocate
5410b39b3ffSRuslan Ermilov.Fa len
5427b2fd183SYaroslav Tykhiybytes worth of
5437b2fd183SYaroslav Tykhiy.Vt mbufs
5447b2fd183SYaroslav Tykhiyand
5457b2fd183SYaroslav Tykhiy.Vt mbuf clusters
5467b2fd183SYaroslav Tykhiyif necessary and append the resulting allocated
5477b2fd183SYaroslav Tykhiy.Vt mbuf chain
5487b2fd183SYaroslav Tykhiyto the
5497b2fd183SYaroslav Tykhiy.Vt mbuf chain
5507b2fd183SYaroslav Tykhiy.Fa orig ,
5517b2fd183SYaroslav Tykhiyif it is
5520b39b3ffSRuslan Ermilov.No non- Ns Dv NULL .
553328c0bbcSBosko MilekicIf the allocation fails at any point,
5540b39b3ffSRuslan Ermilovfree whatever was allocated and return
5550b39b3ffSRuslan Ermilov.Dv NULL .
556328c0bbcSBosko MilekicIf
5570b39b3ffSRuslan Ermilov.Fa orig
5580b39b3ffSRuslan Ermilovis
5590b39b3ffSRuslan Ermilov.No non- Ns Dv NULL ,
560328c0bbcSBosko Milekicit will not be freed.
561328c0bbcSBosko MilekicIt is possible to use
562328c0bbcSBosko Milekic.Fn m_getm
563328c0bbcSBosko Milekicto either append
5640b39b3ffSRuslan Ermilov.Fa len
5657b2fd183SYaroslav Tykhiybytes to an existing
5667b2fd183SYaroslav Tykhiy.Vt mbuf
5677b2fd183SYaroslav Tykhiyor
5687b2fd183SYaroslav Tykhiy.Vt mbuf chain
569328c0bbcSBosko Milekic(for example, one which may be sitting in a pre-allocated ring)
5707b2fd183SYaroslav Tykhiyor to simply perform an all-or-nothing
5717b2fd183SYaroslav Tykhiy.Vt mbuf
5727b2fd183SYaroslav Tykhiyand
5737b2fd183SYaroslav Tykhiy.Vt mbuf cluster
5747b2fd183SYaroslav Tykhiyallocation.
575de06f907SNik Clayton.It Fn m_gethdr how type
576de06f907SNik ClaytonA function version of
577bfd59721SBosko Milekic.Fn MGETHDR
578bfd59721SBosko Milekicfor non-critical paths.
5796c013706SMaxim Konovalov.It Fn m_getcl how type flags
5806c013706SMaxim KonovalovFetch an
5816c013706SMaxim Konovalov.Vt mbuf
5826c013706SMaxim Konovalovwith a
5836c013706SMaxim Konovalov.Vt mbuf cluster
5846c013706SMaxim Konovalovattached to it.
5856c013706SMaxim KonovalovIf one of the allocations fails, the entire allocation fails.
5866c013706SMaxim KonovalovThis routine is the preferred way of fetching both the
5876c013706SMaxim Konovalov.Vt mbuf
5886c013706SMaxim Konovalovand
5896c013706SMaxim Konovalov.Vt mbuf cluster
5906c013706SMaxim Konovalovtogether, as it avoids having to unlock/relock between allocations.
5916c013706SMaxim KonovalovReturns
5926c013706SMaxim Konovalov.Dv NULL
5936c013706SMaxim Konovalovon failure.
5945c35eb22SJohn-Mark Gurney.It Fn m_getjcl how type flags size
5955c35eb22SJohn-Mark GurneyThis is like
5965c35eb22SJohn-Mark Gurney.Fn m_getcl
5975c35eb22SJohn-Mark Gurneybut it the size of the cluster allocated will be large enough for
5985c35eb22SJohn-Mark Gurney.Fa size
5995c35eb22SJohn-Mark Gurneybytes.
600de06f907SNik Clayton.It Fn m_getclr how type
6017b2fd183SYaroslav TykhiyAllocate an
6027b2fd183SYaroslav Tykhiy.Vt mbuf
6037b2fd183SYaroslav Tykhiyand zero out the data region.
60401e7fdafSMaxim Konovalov.It Fn m_free mbuf
60501e7fdafSMaxim KonovalovFrees
60601e7fdafSMaxim Konovalov.Vt mbuf .
607b7131a26SJohn-Mark GurneyReturns
608b7131a26SJohn-Mark Gurney.Va m_next
609b7131a26SJohn-Mark Gurneyof the freed
610b7131a26SJohn-Mark Gurney.Vt mbuf .
611de06f907SNik Clayton.El
612de06f907SNik Clayton.Pp
6137b2fd183SYaroslav TykhiyThe functions below operate on
6147b2fd183SYaroslav Tykhiy.Vt mbuf chains .
615de06f907SNik Clayton.Bl -ohang -offset indent
616de06f907SNik Clayton.It Fn m_freem mbuf
6177b2fd183SYaroslav TykhiyFree an entire
6187b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6197b2fd183SYaroslav Tykhiyincluding any external storage.
620de06f907SNik Clayton.\"
621de06f907SNik Clayton.It Fn m_adj mbuf len
622de06f907SNik ClaytonTrim
623de06f907SNik Clayton.Fa len
6247b2fd183SYaroslav Tykhiybytes from the head of an
6257b2fd183SYaroslav Tykhiy.Vt mbuf chain
6267b2fd183SYaroslav Tykhiyif
627de06f907SNik Clayton.Fa len
628de06f907SNik Claytonis positive, from the tail otherwise.
629de06f907SNik Clayton.\"
630b9def06bSSam Leffler.It Fn m_append mbuf len cp
631b9def06bSSam LefflerAppend
632b9def06bSSam Leffler.Vt len
633b9def06bSSam Lefflerbytes of data
634b9def06bSSam Leffler.Vt cp
635b9def06bSSam Lefflerto the
636b9def06bSSam Leffler.Vt mbuf chain .
637b9def06bSSam LefflerExtend the mbuf chain if the new data does not fit in
638b9def06bSSam Lefflerexisting space.
639b9def06bSSam Leffler.\"
640de06f907SNik Clayton.It Fn m_prepend mbuf len how
6417b2fd183SYaroslav TykhiyAllocate a new
6427b2fd183SYaroslav Tykhiy.Vt mbuf
6437b2fd183SYaroslav Tykhiyand prepend it to the
6447b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6457b2fd183SYaroslav Tykhiyhandle
646de06f907SNik Clayton.Dv M_PKTHDR
647de06f907SNik Claytonproperly.
648de06f907SNik Clayton.Sy Note :
6490227791bSRuslan ErmilovIt does not allocate any
6507b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
6517b2fd183SYaroslav Tykhiyso
652de06f907SNik Clayton.Fa len
653de06f907SNik Claytonmust be less than
654de06f907SNik Clayton.Dv MLEN
655de06f907SNik Claytonor
656de06f907SNik Clayton.Dv MHLEN ,
657de06f907SNik Claytondepending on the
658d0353b83SRuslan Ermilov.Dv M_PKTHDR
659d0353b83SRuslan Ermilovflag setting.
660de06f907SNik Clayton.\"
6617ac139a9SJohn-Mark Gurney.It Fn m_copyup mbuf len dstoff
6627ac139a9SJohn-Mark GurneySimilar to
6637ac139a9SJohn-Mark Gurney.Fn m_pullup
6647ac139a9SJohn-Mark Gurneybut copies
6657ac139a9SJohn-Mark Gurney.Fa len
6667ac139a9SJohn-Mark Gurneybytes of data into a new mbuf at
6677ac139a9SJohn-Mark Gurney.Fa dstoff
6687ac139a9SJohn-Mark Gurneybytes into the mbuf.
6697ac139a9SJohn-Mark GurneyThe
6707ac139a9SJohn-Mark Gurney.Fa dstoff
6717ac139a9SJohn-Mark Gurneyargument aligns the data and leaves room for a link layer header.
6724f068961SRuslan ErmilovReturns the new
6737ac139a9SJohn-Mark Gurney.Vt mbuf chain
6747ac139a9SJohn-Mark Gurneyon success,
6757ac139a9SJohn-Mark Gurneyand frees the
6767ac139a9SJohn-Mark Gurney.Vt mbuf chain
6777ac139a9SJohn-Mark Gurneyand returns
6787ac139a9SJohn-Mark Gurney.Dv NULL
6797ac139a9SJohn-Mark Gurneyon failure.
6807ac139a9SJohn-Mark Gurney.Sy Note :
6817ac139a9SJohn-Mark GurneyThe function does not allocate
6827ac139a9SJohn-Mark Gurney.Vt mbuf clusters ,
6837ac139a9SJohn-Mark Gurneyso
6847ac139a9SJohn-Mark Gurney.Fa len + dstoff
6857ac139a9SJohn-Mark Gurneymust be less than
6867ac139a9SJohn-Mark Gurney.Dv MHLEN .
6877ac139a9SJohn-Mark Gurney.\"
688de06f907SNik Clayton.It Fn m_pullup mbuf len
689de06f907SNik ClaytonArrange that the first
690de06f907SNik Clayton.Fa len
6917b2fd183SYaroslav Tykhiybytes of an
6927b2fd183SYaroslav Tykhiy.Vt mbuf chain
6937b2fd183SYaroslav Tykhiyare contiguous and lay in the data area of
694de06f907SNik Clayton.Fa mbuf ,
695de06f907SNik Claytonso they are accessible with
696de06f907SNik Clayton.Fn mtod mbuf type .
6971009bd1bSJulian ElischerIt is important to remember that this may involve
6981009bd1bSJulian Elischerreallocating some mbufs and moving data so all pointers
6991009bd1bSJulian Elischerreferencing data within the old mbuf chain
7001009bd1bSJulian Elischermust be recalculated or made invalid.
7017b2fd183SYaroslav TykhiyReturn the new
7027b2fd183SYaroslav Tykhiy.Vt mbuf chain
7037b2fd183SYaroslav Tykhiyon success,
704de06f907SNik Clayton.Dv NULL
705de06f907SNik Claytonon failure
7067b2fd183SYaroslav Tykhiy(the
7077b2fd183SYaroslav Tykhiy.Vt mbuf chain
7087b2fd183SYaroslav Tykhiyis freed in this case).
709de06f907SNik Clayton.Sy Note :
7100227791bSRuslan ErmilovIt does not allocate any
7117b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
7127b2fd183SYaroslav Tykhiyso
713de06f907SNik Clayton.Fa len
714969ed8f7SKevin Lomust be less than or equal to
715de06f907SNik Clayton.Dv MHLEN .
716de06f907SNik Clayton.\"
717d305f4b9SBruce M Simpson.It Fn m_pulldown mbuf offset len offsetp
718d305f4b9SBruce M SimpsonArrange that
719d305f4b9SBruce M Simpson.Fa len
720d305f4b9SBruce M Simpsonbytes between
721d305f4b9SBruce M Simpson.Fa offset
722d305f4b9SBruce M Simpsonand
723d305f4b9SBruce M Simpson.Fa offset + len
724d305f4b9SBruce M Simpsonin the
725d305f4b9SBruce M Simpson.Vt mbuf chain
726d305f4b9SBruce M Simpsonare contiguous and lay in the data area of
727d305f4b9SBruce M Simpson.Fa mbuf ,
728d305f4b9SBruce M Simpsonso they are accessible with
729d305f4b9SBruce M Simpson.Fn mtod mbuf type .
73073bbeaa5SGlen Barber.Fa len
73173bbeaa5SGlen Barbermust be smaller than, or equal to, the size of an
732d305f4b9SBruce M Simpson.Vt mbuf cluster .
733d305f4b9SBruce M SimpsonReturn a pointer to an intermediate
734d305f4b9SBruce M Simpson.Vt mbuf
735d305f4b9SBruce M Simpsonin the chain containing the requested region;
736d305f4b9SBruce M Simpsonthe offset in the data region of the
737d305f4b9SBruce M Simpson.Vt mbuf chain
738d305f4b9SBruce M Simpsonto the data contained in the returned mbuf is stored in
739d305f4b9SBruce M Simpson.Fa *offsetp .
740d305f4b9SBruce M SimpsonIf
741d305f4b9SBruce M Simpson.Fa offp
742d305f4b9SBruce M Simpsonis NULL, the region may be accessed using
743d305f4b9SBruce M Simpson.Fn mtod mbuf type .
744d305f4b9SBruce M SimpsonIf
745d305f4b9SBruce M Simpson.Fa offp
746d305f4b9SBruce M Simpsonis non-NULL, the region may be accessed using
747d305f4b9SBruce M Simpson.Fn mtod mbuf uint8_t + *offsetp .
748d305f4b9SBruce M SimpsonThe region of the mbuf chain between its beginning and
749d305f4b9SBruce M Simpson.Fa off
750d305f4b9SBruce M Simpsonis not modified, therefore it is safe to hold pointers to data within
751d305f4b9SBruce M Simpsonthis region before calling
752d305f4b9SBruce M Simpson.Fn m_pulldown .
753d305f4b9SBruce M Simpson.\"
754de06f907SNik Clayton.It Fn m_copym mbuf offset len how
7557b2fd183SYaroslav TykhiyMake a copy of an
7567b2fd183SYaroslav Tykhiy.Vt mbuf chain
7577b2fd183SYaroslav Tykhiystarting
758de06f907SNik Clayton.Fa offset
759de06f907SNik Claytonbytes from the beginning, continuing for
760de06f907SNik Clayton.Fa len
761e73145f6SSheldon Hearnbytes.
762e73145f6SSheldon HearnIf
763de06f907SNik Clayton.Fa len
764de06f907SNik Claytonis
765de06f907SNik Clayton.Dv M_COPYALL ,
7667b2fd183SYaroslav Tykhiycopy to the end of the
7677b2fd183SYaroslav Tykhiy.Vt mbuf chain .
768de06f907SNik Clayton.Sy Note :
7697b2fd183SYaroslav TykhiyThe copy is read-only, because the
7707b2fd183SYaroslav Tykhiy.Vt mbuf clusters
7717b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
772de06f907SNik Clayton.\"
773de06f907SNik Clayton.It Fn m_copypacket mbuf how
774de06f907SNik ClaytonCopy an entire packet including header, which must be present.
775de06f907SNik ClaytonThis is an optimized version of the common case
776de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how .
777de06f907SNik Clayton.Sy Note :
7787b2fd183SYaroslav Tykhiythe copy is read-only, because the
7797b2fd183SYaroslav Tykhiy.Vt mbuf clusters
7807b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
781de06f907SNik Clayton.\"
782de06f907SNik Clayton.It Fn m_dup mbuf how
7837b2fd183SYaroslav TykhiyCopy a packet header
7847b2fd183SYaroslav Tykhiy.Vt mbuf chain
7857b2fd183SYaroslav Tykhiyinto a completely new
7867b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
7877b2fd183SYaroslav Tykhiyincluding copying any
7887b2fd183SYaroslav Tykhiy.Vt mbuf clusters .
789e73145f6SSheldon HearnUse this instead of
790de06f907SNik Clayton.Fn m_copypacket
7917b2fd183SYaroslav Tykhiywhen you need a writable copy of an
7927b2fd183SYaroslav Tykhiy.Vt mbuf chain .
793de06f907SNik Clayton.\"
794de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf
7957b2fd183SYaroslav TykhiyCopy data from an
7967b2fd183SYaroslav Tykhiy.Vt mbuf chain
7977b2fd183SYaroslav Tykhiystarting
798de06f907SNik Clayton.Fa off
799de06f907SNik Claytonbytes from the beginning, continuing for
800de06f907SNik Clayton.Fa len
801de06f907SNik Claytonbytes, into the indicated buffer
802de06f907SNik Clayton.Fa buf .
803de06f907SNik Clayton.\"
804de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf
805de06f907SNik ClaytonCopy
806de06f907SNik Clayton.Fa len
807de06f907SNik Claytonbytes from the buffer
808de06f907SNik Clayton.Fa buf
8097b2fd183SYaroslav Tykhiyback into the indicated
8107b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
811de06f907SNik Claytonstarting at
812de06f907SNik Clayton.Fa offset
8137b2fd183SYaroslav Tykhiybytes from the beginning of the
8147b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8157b2fd183SYaroslav Tykhiyextending the
8167b2fd183SYaroslav Tykhiy.Vt mbuf chain
8177b2fd183SYaroslav Tykhiyif necessary.
818de06f907SNik Clayton.Sy Note :
8190227791bSRuslan ErmilovIt does not allocate any
8207b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
8217b2fd183SYaroslav Tykhiyjust adds
8227b2fd183SYaroslav Tykhiy.Vt mbufs
8237b2fd183SYaroslav Tykhiyto the
8247b2fd183SYaroslav Tykhiy.Vt mbuf chain .
82536a142c4SRuslan ErmilovIt is safe to set
826de06f907SNik Clayton.Fa offset
8277b2fd183SYaroslav Tykhiybeyond the current
8287b2fd183SYaroslav Tykhiy.Vt mbuf chain
8297b2fd183SYaroslav Tykhiyend: zeroed
8307b2fd183SYaroslav Tykhiy.Vt mbufs
8317b2fd183SYaroslav Tykhiywill be allocated to fill the space.
832de06f907SNik Clayton.\"
8335d96084fSYaroslav Tykhiy.It Fn m_length mbuf last
8347b2fd183SYaroslav TykhiyReturn the length of the
8357b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8367b2fd183SYaroslav Tykhiyand optionally a pointer to the last
8377b2fd183SYaroslav Tykhiy.Vt mbuf .
8380b1c0994SPoul-Henning Kamp.\"
839da72b998SYaroslav Tykhiy.It Fn m_dup_pkthdr to from how
840da72b998SYaroslav TykhiyUpon the function's completion, the
841da72b998SYaroslav Tykhiy.Vt mbuf
842da72b998SYaroslav Tykhiy.Fa to
843da72b998SYaroslav Tykhiywill contain an identical copy of
844da72b998SYaroslav Tykhiy.Fa from->m_pkthdr
845da72b998SYaroslav Tykhiyand the per-packet attributes found in the
846da72b998SYaroslav Tykhiy.Vt mbuf chain
847da72b998SYaroslav Tykhiy.Fa from .
848da72b998SYaroslav TykhiyThe
849da72b998SYaroslav Tykhiy.Vt mbuf
850da72b998SYaroslav Tykhiy.Fa from
851da72b998SYaroslav Tykhiymust have the flag
852da72b998SYaroslav Tykhiy.Dv M_PKTHDR
853da72b998SYaroslav Tykhiyinitially set, and
854da72b998SYaroslav Tykhiy.Fa to
855da72b998SYaroslav Tykhiymust be empty on entry.
856da72b998SYaroslav Tykhiy.\"
857da72b998SYaroslav Tykhiy.It Fn m_move_pkthdr to from
858da72b998SYaroslav TykhiyMove
859da72b998SYaroslav Tykhiy.Va m_pkthdr
860da72b998SYaroslav Tykhiyand the per-packet attributes from the
861da72b998SYaroslav Tykhiy.Vt mbuf chain
862da72b998SYaroslav Tykhiy.Fa from
863da72b998SYaroslav Tykhiyto the
864da72b998SYaroslav Tykhiy.Vt mbuf
865da72b998SYaroslav Tykhiy.Fa to .
866da72b998SYaroslav TykhiyThe
867da72b998SYaroslav Tykhiy.Vt mbuf
868da72b998SYaroslav Tykhiy.Fa from
869da72b998SYaroslav Tykhiymust have the flag
870da72b998SYaroslav Tykhiy.Dv M_PKTHDR
871da72b998SYaroslav Tykhiyinitially set, and
872da72b998SYaroslav Tykhiy.Fa to
873da72b998SYaroslav Tykhiymust be empty on entry.
874da72b998SYaroslav TykhiyUpon the function's completion,
875da72b998SYaroslav Tykhiy.Fa from
876da72b998SYaroslav Tykhiywill have the flag
877da72b998SYaroslav Tykhiy.Dv M_PKTHDR
878da72b998SYaroslav Tykhiyand the per-packet attributes cleared.
879da72b998SYaroslav Tykhiy.\"
8805d96084fSYaroslav Tykhiy.It Fn m_fixhdr mbuf
8817b2fd183SYaroslav TykhiySet the packet-header length to the length of the
8827b2fd183SYaroslav Tykhiy.Vt mbuf chain .
8830b1c0994SPoul-Henning Kamp.\"
884de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy
885de06f907SNik ClaytonCopy data from a device local memory pointed to by
886de06f907SNik Clayton.Fa buf
8877b2fd183SYaroslav Tykhiyto an
8887b2fd183SYaroslav Tykhiy.Vt mbuf chain .
889e73145f6SSheldon HearnThe copy is done using a specified copy routine
890de06f907SNik Clayton.Fa copy ,
891de06f907SNik Claytonor
892de06f907SNik Clayton.Fn bcopy
893de06f907SNik Claytonif
894de06f907SNik Clayton.Fa copy
895de06f907SNik Claytonis
896de06f907SNik Clayton.Dv NULL .
897de06f907SNik Clayton.\"
898de06f907SNik Clayton.It Fn m_cat m n
899de06f907SNik ClaytonConcatenate
900de06f907SNik Clayton.Fa n
901de06f907SNik Claytonto
902de06f907SNik Clayton.Fa m .
9037b2fd183SYaroslav TykhiyBoth
9047b2fd183SYaroslav Tykhiy.Vt mbuf chains
9057b2fd183SYaroslav Tykhiymust be of the same type.
906de06f907SNik Clayton.Fa N
907de06f907SNik Claytonis still valid after the function returned.
908de06f907SNik Clayton.Sy Note :
909de06f907SNik ClaytonIt does not handle
910de06f907SNik Clayton.Dv M_PKTHDR
911de06f907SNik Claytonand friends.
912de06f907SNik Clayton.\"
913de06f907SNik Clayton.It Fn m_split mbuf len how
9147b2fd183SYaroslav TykhiyPartition an
9157b2fd183SYaroslav Tykhiy.Vt mbuf chain
9167b2fd183SYaroslav Tykhiyin two pieces, returning the tail:
917de06f907SNik Claytonall but the first
918de06f907SNik Clayton.Fa len
919e73145f6SSheldon Hearnbytes.
920e73145f6SSheldon HearnIn case of failure, it returns
921de06f907SNik Clayton.Dv NULL
9227b2fd183SYaroslav Tykhiyand attempts to restore the
9237b2fd183SYaroslav Tykhiy.Vt mbuf chain
9247b2fd183SYaroslav Tykhiyto its original state.
92502312219SBruce M Simpson.\"
92602312219SBruce M Simpson.It Fn m_apply mbuf off len f arg
92702312219SBruce M SimpsonApply a function to an
92802312219SBruce M Simpson.Vt mbuf chain ,
92902312219SBruce M Simpsonat offset
93002312219SBruce M Simpson.Fa off ,
93102312219SBruce M Simpsonfor length
932f48cbcdeSRuslan Ermilov.Fa len
933f48cbcdeSRuslan Ermilovbytes.
93402312219SBruce M SimpsonTypically used to avoid calls to
93502312219SBruce M Simpson.Fn m_pullup
93602312219SBruce M Simpsonwhich would otherwise be unnecessary or undesirable.
93702312219SBruce M Simpson.Fa arg
93802312219SBruce M Simpsonis a convenience argument which is passed to the callback function
93902312219SBruce M Simpson.Fa f .
94002312219SBruce M Simpson.Pp
94102312219SBruce M SimpsonEach time
94202312219SBruce M Simpson.Fn f
94302312219SBruce M Simpsonis called, it will be passed
94402312219SBruce M Simpson.Fa arg ,
94502312219SBruce M Simpsona pointer to the
94602312219SBruce M Simpson.Fa data
94702312219SBruce M Simpsonin the current mbuf, and the length
94802312219SBruce M Simpson.Fa len
94902312219SBruce M Simpsonof the data in this mbuf to which the function should be applied.
95002312219SBruce M Simpson.Pp
95102312219SBruce M SimpsonThe function should return zero to indicate success;
95202312219SBruce M Simpsonotherwise, if an error is indicated, then
95302312219SBruce M Simpson.Fn m_apply
95402312219SBruce M Simpsonwill return the error and stop iterating through the
95502312219SBruce M Simpson.Vt mbuf chain .
95602312219SBruce M Simpson.\"
95702312219SBruce M Simpson.It Fn m_getptr mbuf loc off
95802312219SBruce M SimpsonReturn a pointer to the mbuf containing the data located at
95902312219SBruce M Simpson.Fa loc
96002312219SBruce M Simpsonbytes from the beginning of the
96102312219SBruce M Simpson.Vt mbuf chain .
96202312219SBruce M SimpsonThe corresponding offset into the mbuf will be stored in
96302312219SBruce M Simpson.Fa *off .
964a61bc764SMike Silbersack.It Fn m_defrag m0 how
965f48cbcdeSRuslan ErmilovDefragment an mbuf chain, returning the shortest possible
966bdf86185SMike Silbersackchain of mbufs and clusters.
967bdf86185SMike SilbersackIf allocation fails and this can not be completed,
968bdf86185SMike Silbersack.Dv NULL
969bdf86185SMike Silbersackwill be returned and the original chain will be unchanged.
970bdf86185SMike SilbersackUpon success, the original chain will be freed and the new
971bdf86185SMike Silbersackchain will be returned.
972a61bc764SMike Silbersack.Fa how
973a61bc764SMike Silbersackshould be either
974fa05d215SGleb Smirnoff.Dv M_WAITOK
975a61bc764SMike Silbersackor
976fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
977a61bc764SMike Silbersackdepending on the caller's preference.
978a61bc764SMike Silbersack.Pp
979a61bc764SMike SilbersackThis function is especially useful in network drivers, where
980a61bc764SMike Silbersackcertain long mbuf chains must be shortened before being added
981a61bc764SMike Silbersackto TX descriptor lists.
98247e2996eSSam Leffler.It Fn m_unshare m0 how
98347e2996eSSam LefflerCreate a version of the specified mbuf chain whose
98447e2996eSSam Lefflercontents can be safely modified without affecting other users.
98547e2996eSSam LefflerIf allocation fails and this operation can not be completed,
98647e2996eSSam Leffler.Dv NULL
98747e2996eSSam Lefflerwill be returned.
98847e2996eSSam LefflerThe original mbuf chain is always reclaimed and the reference
98947e2996eSSam Lefflercount of any shared mbuf clusters is decremented.
99047e2996eSSam Leffler.Fa how
99147e2996eSSam Lefflershould be either
992fa05d215SGleb Smirnoff.Dv M_WAITOK
99347e2996eSSam Leffleror
994fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
99547e2996eSSam Lefflerdepending on the caller's preference.
99647e2996eSSam LefflerAs a side-effect of this process the returned
99747e2996eSSam Lefflermbuf chain may be compacted.
99847e2996eSSam Leffler.Pp
99947e2996eSSam LefflerThis function is especially useful in the transmit path of
100047e2996eSSam Lefflernetwork code, when data must be encrypted or otherwise
100147e2996eSSam Leffleraltered prior to transmission.
10023136363fSRuslan Ermilov.El
10030193eb5eSYaroslav Tykhiy.Sh HARDWARE-ASSISTED CHECKSUM CALCULATION
10040193eb5eSYaroslav TykhiyThis section currently applies to TCP/IP only.
10050193eb5eSYaroslav TykhiyIn order to save the host CPU resources, computing checksums is
10060193eb5eSYaroslav Tykhiyoffloaded to the network interface hardware if possible.
10070193eb5eSYaroslav TykhiyThe
10080193eb5eSYaroslav Tykhiy.Va m_pkthdr
10090193eb5eSYaroslav Tykhiymember of the leading
10100193eb5eSYaroslav Tykhiy.Vt mbuf
10110193eb5eSYaroslav Tykhiyof a packet contains two fields used for that purpose,
10120193eb5eSYaroslav Tykhiy.Vt int Va csum_flags
10130193eb5eSYaroslav Tykhiyand
10140193eb5eSYaroslav Tykhiy.Vt int Va csum_data .
10150193eb5eSYaroslav TykhiyThe meaning of those fields depends on the direction a packet flows in,
10160193eb5eSYaroslav Tykhiyand on whether the packet is fragmented.
10170193eb5eSYaroslav TykhiyHenceforth,
10180193eb5eSYaroslav Tykhiy.Va csum_flags
10190193eb5eSYaroslav Tykhiyor
10200193eb5eSYaroslav Tykhiy.Va csum_data
10210193eb5eSYaroslav Tykhiyof a packet
10220193eb5eSYaroslav Tykhiywill denote the corresponding field of the
10230193eb5eSYaroslav Tykhiy.Va m_pkthdr
10240193eb5eSYaroslav Tykhiymember of the leading
10250193eb5eSYaroslav Tykhiy.Vt mbuf
10260193eb5eSYaroslav Tykhiyin the
10270193eb5eSYaroslav Tykhiy.Vt mbuf chain
10280193eb5eSYaroslav Tykhiycontaining the packet.
10290193eb5eSYaroslav Tykhiy.Pp
10300193eb5eSYaroslav TykhiyOn output, checksum offloading is attempted after the outgoing
10310193eb5eSYaroslav Tykhiyinterface has been determined for a packet.
10320193eb5eSYaroslav TykhiyThe interface-specific field
10330193eb5eSYaroslav Tykhiy.Va ifnet.if_data.ifi_hwassist
10340193eb5eSYaroslav Tykhiy(see
10350193eb5eSYaroslav Tykhiy.Xr ifnet 9 )
10360193eb5eSYaroslav Tykhiyis consulted for the capabilities of the interface to assist in
10370193eb5eSYaroslav Tykhiycomputing checksums.
10380193eb5eSYaroslav TykhiyThe
10390193eb5eSYaroslav Tykhiy.Va csum_flags
1040f48cbcdeSRuslan Ermilovfield of the packet header is set to indicate which actions the interface
10410193eb5eSYaroslav Tykhiyis supposed to perform on it.
10420193eb5eSYaroslav TykhiyThe actions unsupported by the network interface are done in the
10430193eb5eSYaroslav Tykhiysoftware prior to passing the packet down to the interface driver;
10440193eb5eSYaroslav Tykhiysuch actions will never be requested through
10450193eb5eSYaroslav Tykhiy.Va csum_flags .
10460193eb5eSYaroslav Tykhiy.Pp
10470193eb5eSYaroslav TykhiyThe flags demanding a particular action from an interface are as follows:
10480193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_TCP" -offset indent
10490193eb5eSYaroslav Tykhiy.It Dv CSUM_IP
10500193eb5eSYaroslav TykhiyThe IP header checksum is to be computed and stored in the
10510193eb5eSYaroslav Tykhiycorresponding field of the packet.
10520193eb5eSYaroslav TykhiyThe hardware is expected to know the format of an IP header
10530193eb5eSYaroslav Tykhiyto determine the offset of the IP checksum field.
10540193eb5eSYaroslav Tykhiy.It Dv CSUM_TCP
1055f48cbcdeSRuslan ErmilovThe TCP checksum is to be computed.
1056f48cbcdeSRuslan Ermilov(See below.)
10570193eb5eSYaroslav Tykhiy.It Dv CSUM_UDP
1058f48cbcdeSRuslan ErmilovThe UDP checksum is to be computed.
1059f48cbcdeSRuslan Ermilov(See below.)
10600193eb5eSYaroslav Tykhiy.El
10610193eb5eSYaroslav Tykhiy.Pp
1062fbde705aSYaroslav TykhiyShould a TCP or UDP checksum be offloaded to the hardware,
10630193eb5eSYaroslav Tykhiythe field
10640193eb5eSYaroslav Tykhiy.Va csum_data
10650193eb5eSYaroslav Tykhiywill contain the byte offset of the checksum field relative to the
10660193eb5eSYaroslav Tykhiyend of the IP header.
10670193eb5eSYaroslav TykhiyIn this case, the checksum field will be initially
10680193eb5eSYaroslav Tykhiyset by the TCP/IP module to the checksum of the pseudo header
1069fbde705aSYaroslav Tykhiydefined by the TCP and UDP specifications.
10700193eb5eSYaroslav Tykhiy.Pp
10710193eb5eSYaroslav TykhiyOn input, an interface indicates the actions it has performed
10720193eb5eSYaroslav Tykhiyon a packet by setting one or more of the following flags in
10730193eb5eSYaroslav Tykhiy.Va csum_flags
10740193eb5eSYaroslav Tykhiyassociated with the packet:
10750193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_IP_CHECKED" -offset indent
10760193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_CHECKED
10770193eb5eSYaroslav TykhiyThe IP header checksum has been computed.
10780193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_VALID
10790193eb5eSYaroslav TykhiyThe IP header has a valid checksum.
10800193eb5eSYaroslav TykhiyThis flag can appear only in combination with
10810193eb5eSYaroslav Tykhiy.Dv CSUM_IP_CHECKED .
10820193eb5eSYaroslav Tykhiy.It Dv CSUM_DATA_VALID
10830193eb5eSYaroslav TykhiyThe checksum of the data portion of the IP packet has been computed
10840193eb5eSYaroslav Tykhiyand stored in the field
10850193eb5eSYaroslav Tykhiy.Va csum_data
10860193eb5eSYaroslav Tykhiyin network byte order.
10870193eb5eSYaroslav Tykhiy.It Dv CSUM_PSEUDO_HDR
10880193eb5eSYaroslav TykhiyCan be set only along with
10890193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
10900193eb5eSYaroslav Tykhiyto indicate that the IP data checksum found in
10910193eb5eSYaroslav Tykhiy.Va csum_data
1092fbde705aSYaroslav Tykhiyallows for the pseudo header defined by the TCP and UDP specifications.
10930193eb5eSYaroslav TykhiyOtherwise the checksum of the pseudo header must be calculated by
10940193eb5eSYaroslav Tykhiythe host CPU and added to
10950193eb5eSYaroslav Tykhiy.Va csum_data
1096fbde705aSYaroslav Tykhiyto obtain the final checksum to be used for TCP or UDP validation purposes.
10970193eb5eSYaroslav Tykhiy.El
10980193eb5eSYaroslav Tykhiy.Pp
10990193eb5eSYaroslav TykhiyIf a particular network interface just indicates success or
11000193eb5eSYaroslav Tykhiyfailure of TCP or UDP checksum validation without returning
11010193eb5eSYaroslav Tykhiythe exact value of the checksum to the host CPU, its driver can mark
11020193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
11030193eb5eSYaroslav Tykhiyand
11040193eb5eSYaroslav Tykhiy.Dv CSUM_PSEUDO_HDR
11050193eb5eSYaroslav Tykhiyin
11060193eb5eSYaroslav Tykhiy.Va csum_flags ,
11070193eb5eSYaroslav Tykhiyand set
11080193eb5eSYaroslav Tykhiy.Va csum_data
11090193eb5eSYaroslav Tykhiyto
11100193eb5eSYaroslav Tykhiy.Li 0xFFFF
11110193eb5eSYaroslav Tykhiyhexadecimal to indicate a valid checksum.
1112f48cbcdeSRuslan ErmilovIt is a peculiarity of the algorithm used that the Internet checksum
11130193eb5eSYaroslav Tykhiycalculated over any valid packet will be
11140193eb5eSYaroslav Tykhiy.Li 0xFFFF
11150193eb5eSYaroslav Tykhiyas long as the original checksum field is included.
11163cab047eSMike Silbersack.Sh STRESS TESTING
1117c8185672SRuslan ErmilovWhen running a kernel compiled with the option
1118c8185672SRuslan Ermilov.Dv MBUF_STRESS_TEST ,
1119c8185672SRuslan Ermilovthe following
1120c8185672SRuslan Ermilov.Xr sysctl 8 Ns
1121c8185672SRuslan Ermilov-controlled options may be used to create
11223cab047eSMike Silbersackvarious failure/extreme cases for testing of network drivers
11237b2fd183SYaroslav Tykhiyand other parts of the kernel that rely on
11247b2fd183SYaroslav Tykhiy.Vt mbufs .
1125c8185672SRuslan Ermilov.Bl -tag -width ident
1126c8185672SRuslan Ermilov.It Va net.inet.ip.mbuf_frag_size
1127c8185672SRuslan ErmilovCauses
1128c8185672SRuslan Ermilov.Fn ip_output
11297b2fd183SYaroslav Tykhiyto fragment outgoing
11307b2fd183SYaroslav Tykhiy.Vt mbuf chains
11317b2fd183SYaroslav Tykhiyinto fragments of the specified size.
1132c8185672SRuslan ErmilovSetting this variable to 1 is an excellent way to
11337b2fd183SYaroslav Tykhiytest the long
11347b2fd183SYaroslav Tykhiy.Vt mbuf chain
11357b2fd183SYaroslav Tykhiyhandling ability of network drivers.
1136c8185672SRuslan Ermilov.It Va kern.ipc.m_defragrandomfailures
1137c8185672SRuslan ErmilovCauses the function
1138c8185672SRuslan Ermilov.Fn m_defrag
1139c8185672SRuslan Ermilovto randomly fail, returning
1140c8185672SRuslan Ermilov.Dv NULL .
1141c8185672SRuslan ErmilovAny piece of code which uses
1142c8185672SRuslan Ermilov.Fn m_defrag
1143c8185672SRuslan Ermilovshould be tested with this feature.
1144c8185672SRuslan Ermilov.El
1145de06f907SNik Clayton.Sh RETURN VALUES
1146de06f907SNik ClaytonSee above.
11470193eb5eSYaroslav Tykhiy.Sh SEE ALSO
1148e85cc3f5SRuslan Ermilov.Xr ifnet 9 ,
1149e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
1150de06f907SNik Clayton.Sh HISTORY
1151de06f907SNik Clayton.\" Please correct me if I'm wrong
11527b2fd183SYaroslav Tykhiy.Vt Mbufs
11537b2fd183SYaroslav Tykhiyappeared in an early version of
1154753d686dSRuslan Ermilov.Bx .
115553b2520dSTom RhodesBesides being used for network packets, they were used
1156bfd59721SBosko Milekicto store various dynamic structures, such as routing table
1157bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc.
1158db430f97SRobert WatsonIn more recent
1159db430f97SRobert Watson.Fx
1160db430f97SRobert Watsonuse of
1161db430f97SRobert Watson.Vt mbufs
1162db430f97SRobert Watsonis almost entirely limited to packet storage, with
1163db430f97SRobert Watson.Xr uma 9
1164db430f97SRobert Watsonzones being used directly to store other network-related memory.
1165db430f97SRobert Watson.Pp
1166db430f97SRobert WatsonHistorically, the
1167db430f97SRobert Watson.Vt mbuf
1168db430f97SRobert Watsonallocator has been a special-purpose memory allocator able to run in
1169db430f97SRobert Watsoninterrupt contexts and allocating from a special kernel address space map.
1170db430f97SRobert WatsonAs of
1171db430f97SRobert Watson.Fx 5.3 ,
1172db430f97SRobert Watsonthe
1173db430f97SRobert Watson.Vt mbuf
1174db430f97SRobert Watsonallocator is a wrapper around
1175db430f97SRobert Watson.Xr uma 9 ,
1176db430f97SRobert Watsonallowing caching of
1177db430f97SRobert Watson.Vt mbufs ,
1178db430f97SRobert Watsonclusters, and
1179db430f97SRobert Watson.Vt mbuf
1180db430f97SRobert Watson+ cluster pairs in per-CPU caches, as well as bringing other benefits of
1181db430f97SRobert Watsonslab allocation.
1182de06f907SNik Clayton.Sh AUTHORS
11836575e6daSRuslan ErmilovThe original
11846575e6daSRuslan Ermilov.Nm
1185571dba6eSHiten Pandyamanual page was written by Yar Tikhiy.
1186db430f97SRobert WatsonThe
1187db430f97SRobert Watson.Xr uma 9
1188db430f97SRobert Watson.Vt mbuf
1189db430f97SRobert Watsonallocator was written by Bosko Milekic.
1190