xref: /freebsd/share/man/man9/mbuf.9 (revision f66b6464c69228af840a18684fc9002b947471b5)
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*f66b6464SMark Johnston.Dd March 11, 2015
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"
432a8c860fSRobert Watson.Ft int
44de06f907SNik Clayton.Fn MCLGET "struct mbuf *mbuf" "int how"
45bfd59721SBosko Milekic.Fo MEXTADD
46bfd59721SBosko Milekic.Fa "struct mbuf *mbuf"
47bfd59721SBosko Milekic.Fa "caddr_t buf"
48bfd59721SBosko Milekic.Fa "u_int size"
49cf827063SPoul-Henning Kamp.Fa "void (*free)(void *opt_arg1, void *opt_arg2)"
50cf827063SPoul-Henning Kamp.Fa "void *opt_arg1"
51cf827063SPoul-Henning Kamp.Fa "void *opt_arg2"
525d4050ccSBosko Milekic.Fa "short flags"
535d4050ccSBosko Milekic.Fa "int type"
54bfd59721SBosko Milekic.Fc
55bfd59721SBosko Milekic.Fn MEXTFREE "struct mbuf *mbuf"
56bfd59721SBosko Milekic.Fn MFREE "struct mbuf *mbuf" "struct mbuf *successor"
57de06f907SNik Clayton.\"
58bfd59721SBosko Milekic.Ss Mbuf utility macros
59f16b3c0dSChad David.Fn mtod "struct mbuf *mbuf" "type"
60bfd59721SBosko Milekic.Fn M_ALIGN "struct mbuf *mbuf" "u_int len"
61bfd59721SBosko Milekic.Fn MH_ALIGN "struct mbuf *mbuf" "u_int len"
62f16b3c0dSChad David.Ft int
63bfd59721SBosko Milekic.Fn M_LEADINGSPACE "struct mbuf *mbuf"
64f16b3c0dSChad David.Ft int
65bfd59721SBosko Milekic.Fn M_TRAILINGSPACE "struct mbuf *mbuf"
66da72b998SYaroslav Tykhiy.Fn M_MOVE_PKTHDR "struct mbuf *to" "struct mbuf *from"
67bfd59721SBosko Milekic.Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how"
68ada46fe9SKevin Lo.Fn MCHTYPE "struct mbuf *mbuf" "short type"
69f16b3c0dSChad David.Ft int
705d4050ccSBosko Milekic.Fn M_WRITABLE "struct mbuf *mbuf"
71bfd59721SBosko Milekic.\"
72bfd59721SBosko Milekic.Ss Mbuf allocation functions
73de06f907SNik Clayton.Ft struct mbuf *
74ada46fe9SKevin Lo.Fn m_get "int how" "short type"
75de06f907SNik Clayton.Ft struct mbuf *
7618f169afSKevin Lo.Fn m_get2 "int size" "int how" "short type" "int flags"
7718f169afSKevin Lo.Ft struct mbuf *
78ada46fe9SKevin Lo.Fn m_getm "struct mbuf *orig" "int len" "int how" "short type"
79328c0bbcSBosko Milekic.Ft struct mbuf *
805c35eb22SJohn-Mark Gurney.Fn m_getjcl "int how" "short type" "int flags" "int size"
815c35eb22SJohn-Mark Gurney.Ft struct mbuf *
826c013706SMaxim Konovalov.Fn m_getcl "int how" "short type" "int flags"
836c013706SMaxim Konovalov.Ft struct mbuf *
84ada46fe9SKevin Lo.Fn m_getclr "int how" "short type"
85de06f907SNik Clayton.Ft struct mbuf *
86ada46fe9SKevin Lo.Fn m_gethdr "int how" "short type"
87bfd59721SBosko Milekic.Ft struct mbuf *
88bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf"
89de06f907SNik Clayton.Ft void
90de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf"
91bfd59721SBosko Milekic.\"
92bfd59721SBosko Milekic.Ss Mbuf utility functions
93de06f907SNik Clayton.Ft void
94de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len"
959c3fd404SSam Leffler.Ft void
969c3fd404SSam Leffler.Fn m_align "struct mbuf *mbuf" "int len"
97b9def06bSSam Leffler.Ft int
98b9def06bSSam Leffler.Fn m_append "struct mbuf *mbuf" "int len" "c_caddr_t cp"
99de06f907SNik Clayton.Ft struct mbuf *
100de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how"
101de06f907SNik Clayton.Ft struct mbuf *
1027ac139a9SJohn-Mark Gurney.Fn m_copyup "struct mbuf *mbuf" "int len" "int dstoff"
1037ac139a9SJohn-Mark Gurney.Ft struct mbuf *
104de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len"
105de06f907SNik Clayton.Ft struct mbuf *
106d305f4b9SBruce M Simpson.Fn m_pulldown "struct mbuf *mbuf" "int offset" "int len" "int *offsetp"
107d305f4b9SBruce M Simpson.Ft struct mbuf *
108de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how"
109de06f907SNik Clayton.Ft struct mbuf *
110de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how"
111de06f907SNik Clayton.Ft struct mbuf *
112de06f907SNik Clayton.Fn m_dup "struct mbuf *mbuf" "int how"
113de06f907SNik Clayton.Ft void
1140d8e4c57SBruce Evans.Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
115de06f907SNik Clayton.Ft void
116de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
117de06f907SNik Clayton.Ft struct mbuf *
118de06f907SNik Clayton.Fo m_devget
119de06f907SNik Clayton.Fa "char *buf"
120de06f907SNik Clayton.Fa "int len"
121de06f907SNik Clayton.Fa "int offset"
122de06f907SNik Clayton.Fa "struct ifnet *ifp"
123de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)"
124de06f907SNik Clayton.Fc
125de06f907SNik Clayton.Ft void
126de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n"
127e60fa837SRuslan Ermilov.Ft u_int
1280b1c0994SPoul-Henning Kamp.Fn m_fixhdr "struct mbuf *mbuf"
129da72b998SYaroslav Tykhiy.Ft void
130da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr "struct mbuf *to" "struct mbuf *from"
131da72b998SYaroslav Tykhiy.Ft void
132da72b998SYaroslav Tykhiy.Fn m_move_pkthdr "struct mbuf *to" "struct mbuf *from"
133e60fa837SRuslan Ermilov.Ft u_int
1340b1c0994SPoul-Henning Kamp.Fn m_length "struct mbuf *mbuf" "struct mbuf **last"
135de06f907SNik Clayton.Ft struct mbuf *
136de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how"
13702312219SBruce M Simpson.Ft int
13802312219SBruce M Simpson.Fn m_apply "struct mbuf *mbuf" "int off" "int len" "int (*f)(void *arg, void *data, u_int len)" "void *arg"
13902312219SBruce M Simpson.Ft struct mbuf *
14002312219SBruce M Simpson.Fn m_getptr "struct mbuf *mbuf" "int loc" "int *off"
141a61bc764SMike Silbersack.Ft struct mbuf *
142a61bc764SMike Silbersack.Fn m_defrag "struct mbuf *m0" "int how"
14347e2996eSSam Leffler.Ft struct mbuf *
144*f66b6464SMark Johnston.Fn m_collapse "struct mbuf *m0" "int how" "int maxfrags"
145*f66b6464SMark Johnston.Ft struct mbuf *
14647e2996eSSam Leffler.Fn m_unshare "struct mbuf *m0" "int how"
147de06f907SNik Clayton.\"
148de06f907SNik Clayton.Sh DESCRIPTION
1497b2fd183SYaroslav TykhiyAn
1507b2fd183SYaroslav Tykhiy.Vt mbuf
1517b2fd183SYaroslav Tykhiyis a basic unit of memory management in the kernel IPC subsystem.
1527b2fd183SYaroslav TykhiyNetwork packets and socket buffers are stored in
1537b2fd183SYaroslav Tykhiy.Vt mbufs .
1547b2fd183SYaroslav TykhiyA network packet may span multiple
1557b2fd183SYaroslav Tykhiy.Vt mbufs
1567b2fd183SYaroslav Tykhiyarranged into a
1577b2fd183SYaroslav Tykhiy.Vt mbuf chain
158c4d9468eSRuslan Ermilov(linked list),
159de06f907SNik Claytonwhich allows adding or trimming
160bfd59721SBosko Milekicnetwork headers with little overhead.
161de06f907SNik Clayton.Pp
1627b2fd183SYaroslav TykhiyWhile a developer should not bother with
1637b2fd183SYaroslav Tykhiy.Vt mbuf
1647b2fd183SYaroslav Tykhiyinternals without serious
165de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it
1667b2fd183SYaroslav Tykhiyis useful to understand the general structure of an
1677b2fd183SYaroslav Tykhiy.Vt mbuf .
168de06f907SNik Clayton.Pp
1697b2fd183SYaroslav TykhiyAn
1707b2fd183SYaroslav Tykhiy.Vt mbuf
1717b2fd183SYaroslav Tykhiyconsists of a variable-sized header and a small internal
172e73145f6SSheldon Hearnbuffer for data.
1737b2fd183SYaroslav TykhiyThe total size of an
1747b2fd183SYaroslav Tykhiy.Vt mbuf ,
175bfd59721SBosko Milekic.Dv MSIZE ,
176feccf50cSAlex Dupreis a constant defined in
177feccf50cSAlex Dupre.In sys/param.h .
1787b2fd183SYaroslav TykhiyThe
1797b2fd183SYaroslav Tykhiy.Vt mbuf
1807b2fd183SYaroslav Tykhiyheader includes:
181238d9c59SYaroslav Tykhiy.Bl -tag -width "m_nextpkt" -offset indent
182be82a0bcSYaroslav Tykhiy.It Va m_next
183238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
184238d9c59SYaroslav TykhiyA pointer to the next
1857b2fd183SYaroslav Tykhiy.Vt mbuf
1867b2fd183SYaroslav Tykhiyin the
187238d9c59SYaroslav Tykhiy.Vt mbuf chain .
188be82a0bcSYaroslav Tykhiy.It Va m_nextpkt
189238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
190238d9c59SYaroslav TykhiyA pointer to the next
1917b2fd183SYaroslav Tykhiy.Vt mbuf chain
192238d9c59SYaroslav Tykhiyin the queue.
193be82a0bcSYaroslav Tykhiy.It Va m_data
194238d9c59SYaroslav Tykhiy.Pq Vt caddr_t
195238d9c59SYaroslav TykhiyA pointer to data attached to this
196238d9c59SYaroslav Tykhiy.Vt mbuf .
197be82a0bcSYaroslav Tykhiy.It Va m_len
198238d9c59SYaroslav Tykhiy.Pq Vt int
199238d9c59SYaroslav TykhiyThe length of the data.
200be82a0bcSYaroslav Tykhiy.It Va m_type
201238d9c59SYaroslav Tykhiy.Pq Vt short
202238d9c59SYaroslav TykhiyThe type of the data.
203be82a0bcSYaroslav Tykhiy.It Va m_flags
204238d9c59SYaroslav Tykhiy.Pq Vt int
205238d9c59SYaroslav TykhiyThe
2067b2fd183SYaroslav Tykhiy.Vt mbuf
207238d9c59SYaroslav Tykhiyflags.
208de06f907SNik Clayton.El
209de06f907SNik Clayton.Pp
2107b2fd183SYaroslav TykhiyThe
2117b2fd183SYaroslav Tykhiy.Vt mbuf
2127b2fd183SYaroslav Tykhiyflag bits are defined as follows:
213de06f907SNik Clayton.Bd -literal
214de06f907SNik Clayton/* mbuf flags */
21533d8df4bSKevin Lo#define	M_EXT		0x00000001 /* has associated external storage */
21633d8df4bSKevin Lo#define	M_PKTHDR	0x00000002 /* start of record */
21733d8df4bSKevin Lo#define	M_EOR		0x00000004 /* end of record */
21833d8df4bSKevin Lo#define	M_RDONLY	0x00000008 /* associated data marked read-only */
21933d8df4bSKevin Lo#define	M_PROTO1	0x00001000 /* protocol-specific */
22033d8df4bSKevin Lo#define	M_PROTO2	0x00002000 /* protocol-specific */
22133d8df4bSKevin Lo#define	M_PROTO3	0x00004000 /* protocol-specific */
22233d8df4bSKevin Lo#define	M_PROTO4	0x00008000 /* protocol-specific */
22333d8df4bSKevin Lo#define	M_PROTO5	0x00010000 /* protocol-specific */
22433d8df4bSKevin Lo#define	M_PROTO6	0x00020000 /* protocol-specific */
22533d8df4bSKevin Lo#define	M_PROTO7	0x00040000 /* protocol-specific */
22633d8df4bSKevin Lo#define	M_PROTO8	0x00080000 /* protocol-specific */
22733d8df4bSKevin Lo#define	M_PROTO9	0x00100000 /* protocol-specific */
22833d8df4bSKevin Lo#define	M_PROTO10	0x00200000 /* protocol-specific */
22933d8df4bSKevin Lo#define	M_PROTO11	0x00400000 /* protocol-specific */
23033d8df4bSKevin Lo#define	M_PROTO12	0x00800000 /* protocol-specific */
231de06f907SNik Clayton
232f434362aSYaroslav Tykhiy/* mbuf pkthdr flags (also stored in m_flags) */
23333d8df4bSKevin Lo#define	M_BCAST		0x00000010 /* send/received as link-level broadcast */
23433d8df4bSKevin Lo#define	M_MCAST		0x00000020 /* send/received as link-level multicast */
235de06f907SNik Clayton.Ed
236de06f907SNik Clayton.Pp
2377b2fd183SYaroslav TykhiyThe available
2387b2fd183SYaroslav Tykhiy.Vt mbuf
2397b2fd183SYaroslav Tykhiytypes are defined as follows:
240de06f907SNik Clayton.Bd -literal
241de06f907SNik Clayton/* mbuf types */
242de06f907SNik Clayton#define	MT_DATA		1	/* dynamic (data) allocation */
2431cb58a07SMaxim Konovalov#define	MT_HEADER	MT_DATA	/* packet header */
244de06f907SNik Clayton#define	MT_SONAME	8	/* socket name */
245de06f907SNik Clayton#define	MT_CONTROL	14	/* extra-data protocol message */
246de06f907SNik Clayton#define	MT_OOBDATA	15	/* expedited data */
247de06f907SNik Clayton.Ed
248de06f907SNik Clayton.Pp
249c3a2dbe9SDag-Erling SmørgravThe available external buffer types are defined as follows:
250c3a2dbe9SDag-Erling Smørgrav.Bd -literal
251c3a2dbe9SDag-Erling Smørgrav/* external buffer types */
252c3a2dbe9SDag-Erling Smørgrav#define EXT_CLUSTER	1	/* mbuf cluster */
253c3a2dbe9SDag-Erling Smørgrav#define EXT_SFBUF	2	/* sendfile(2)'s sf_bufs */
254c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBOP	3	/* jumbo cluster 4096 bytes */
255c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO9	4	/* jumbo cluster 9216 bytes */
256c3a2dbe9SDag-Erling Smørgrav#define EXT_JUMBO16	5	/* jumbo cluster 16184 bytes */
257c3a2dbe9SDag-Erling Smørgrav#define EXT_PACKET	6	/* mbuf+cluster from packet zone */
258c3a2dbe9SDag-Erling Smørgrav#define EXT_MBUF	7	/* external mbuf reference (M_IOVEC) */
25933d8df4bSKevin Lo#define EXT_NET_DRV	252	/* custom ext_buf provided by net driver(s) */
26033d8df4bSKevin Lo#define EXT_MOD_TYPE	253	/* custom module's ext_buf type */
26133d8df4bSKevin Lo#define EXT_DISPOSABLE	254	/* can throw this buffer away w/page flipping */
26233d8df4bSKevin Lo#define EXT_EXTREF	255	/* has externally maintained ref_cnt ptr */
263c3a2dbe9SDag-Erling Smørgrav.Ed
264c3a2dbe9SDag-Erling Smørgrav.Pp
265de06f907SNik ClaytonIf the
266de06f907SNik Clayton.Dv M_PKTHDR
267de06f907SNik Claytonflag is set, a
2687b2fd183SYaroslav Tykhiy.Vt struct pkthdr Va m_pkthdr
2697b2fd183SYaroslav Tykhiyis added to the
2707b2fd183SYaroslav Tykhiy.Vt mbuf
2717b2fd183SYaroslav Tykhiyheader.
272e73145f6SSheldon HearnIt contains a pointer to the interface
273de06f907SNik Claytonthe packet has been received from
2747b2fd183SYaroslav Tykhiy.Pq Vt struct ifnet Va *rcvif ,
275de06f907SNik Claytonand the total packet length
2767b2fd183SYaroslav Tykhiy.Pq Vt int Va len .
277e85cc3f5SRuslan ErmilovOptionally, it may also contain an attached list of packet tags
278e85cc3f5SRuslan Ermilov.Pq Vt "struct m_tag" .
279e85cc3f5SRuslan ErmilovSee
280e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
281e85cc3f5SRuslan Ermilovfor details.
2820193eb5eSYaroslav TykhiyFields used in offloading checksum calculation to the hardware are kept in
2830193eb5eSYaroslav Tykhiy.Va m_pkthdr
2840193eb5eSYaroslav Tykhiyas well.
2850193eb5eSYaroslav TykhiySee
2860193eb5eSYaroslav Tykhiy.Sx HARDWARE-ASSISTED CHECKSUM CALCULATION
2870193eb5eSYaroslav Tykhiyfor details.
288de06f907SNik Clayton.Pp
2897b2fd183SYaroslav TykhiyIf small enough, data is stored in the internal data buffer of an
2907b2fd183SYaroslav Tykhiy.Vt mbuf .
2917b2fd183SYaroslav TykhiyIf the data is sufficiently large, another
2927b2fd183SYaroslav Tykhiy.Vt mbuf
2937b2fd183SYaroslav Tykhiymay be added to the
2947b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
2957b2fd183SYaroslav Tykhiyor external storage may be associated with the
2967b2fd183SYaroslav Tykhiy.Vt mbuf .
297de06f907SNik Clayton.Dv MHLEN
2987b2fd183SYaroslav Tykhiybytes of data can fit into an
2997b2fd183SYaroslav Tykhiy.Vt mbuf
3007b2fd183SYaroslav Tykhiywith the
301de06f907SNik Clayton.Dv M_PKTHDR
302de06f907SNik Claytonflag set,
303de06f907SNik Clayton.Dv MLEN
304de06f907SNik Claytonbytes can otherwise.
305de06f907SNik Clayton.Pp
3067b2fd183SYaroslav TykhiyIf external storage is being associated with an
3077b2fd183SYaroslav Tykhiy.Vt mbuf ,
3087b2fd183SYaroslav Tykhiythe
309be82a0bcSYaroslav Tykhiy.Va m_ext
31025f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer.
311e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage,
312e73145f6SSheldon Hearna pointer to a function used for freeing the storage,
313e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function,
314e73145f6SSheldon Hearnand a pointer to a reference counter.
3157b2fd183SYaroslav TykhiyAn
3167b2fd183SYaroslav Tykhiy.Vt mbuf
3177b2fd183SYaroslav Tykhiyusing external storage has the
318de06f907SNik Clayton.Dv M_EXT
319de06f907SNik Claytonflag set.
320de06f907SNik Clayton.Pp
321bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage
322bfd59721SBosko Milekicbuffer,
323bfd59721SBosko Milekic.Dv MEXTADD .
324bfd59721SBosko Milekic.Pp
325bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the
326e73145f6SSheldon Hearnsubsystem.
327bfd59721SBosko Milekic.Pp
328bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an
3297b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3307b2fd183SYaroslav Tykhiy.Vt Mbuf clusters
3317b2fd183SYaroslav Tykhiycan be allocated and configured with the use of the
332bfd59721SBosko Milekic.Dv MCLGET
333e73145f6SSheldon Hearnmacro.
3347b2fd183SYaroslav TykhiyEach
3357b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3367b2fd183SYaroslav Tykhiyis
337de06f907SNik Clayton.Dv MCLBYTES
338bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant.
339bfd59721SBosko MilekicThe system defines an advisory macro
340de06f907SNik Clayton.Dv MINCLSIZE ,
3417b2fd183SYaroslav Tykhiywhich is the smallest amount of data to put into an
3427b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3432e3ee239SKevin LoIt is equal to
3442e3ee239SKevin Lo.Dv MHLEN
3452e3ee239SKevin Loplus one.
3467b2fd183SYaroslav TykhiyIt is typically preferable to store data into the data region of an
3477b2fd183SYaroslav Tykhiy.Vt mbuf ,
3487b2fd183SYaroslav Tykhiyif size permits, as opposed to allocating a separate
3497b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3507b2fd183SYaroslav Tykhiyto hold the same data.
351de06f907SNik Clayton.\"
352de06f907SNik Clayton.Ss Macros and Functions
353bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the
354bfd59721SBosko Milekicdeveloper with common utilities.
355de06f907SNik Clayton.\"
356de06f907SNik Clayton.Bl -ohang -offset indent
357de06f907SNik Clayton.It Fn mtod mbuf type
3587b2fd183SYaroslav TykhiyConvert an
3597b2fd183SYaroslav Tykhiy.Fa mbuf
3607b2fd183SYaroslav Tykhiypointer to a data pointer.
361d31a9760SJohn-Mark GurneyThe macro expands to the data pointer cast to the specified
3627b2fd183SYaroslav Tykhiy.Fa type .
363de06f907SNik Clayton.Sy Note :
3647b2fd183SYaroslav TykhiyIt is advisable to ensure that there is enough contiguous data in
3657b2fd183SYaroslav Tykhiy.Fa mbuf .
366de06f907SNik ClaytonSee
367de06f907SNik Clayton.Fn m_pullup
368de06f907SNik Claytonfor details.
369de06f907SNik Clayton.It Fn MGET mbuf how type
3707b2fd183SYaroslav TykhiyAllocate an
3717b2fd183SYaroslav Tykhiy.Vt mbuf
3727b2fd183SYaroslav Tykhiyand initialize it to contain internal data.
37325f1a2e9SSheldon Hearn.Fa mbuf
3747b2fd183SYaroslav Tykhiywill point to the allocated
3757b2fd183SYaroslav Tykhiy.Vt mbuf
3767b2fd183SYaroslav Tykhiyon success, or be set to
377de06f907SNik Clayton.Dv NULL
378e73145f6SSheldon Hearnon failure.
379e73145f6SSheldon HearnThe
380de06f907SNik Clayton.Fa how
381de06f907SNik Claytonargument is to be set to
382fa05d215SGleb Smirnoff.Dv M_WAITOK
383de06f907SNik Claytonor
384fa05d215SGleb Smirnoff.Dv M_NOWAIT .
38525f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary.
3867b2fd183SYaroslav TykhiyA number of other functions and macros related to
3877b2fd183SYaroslav Tykhiy.Vt mbufs
3887b2fd183SYaroslav Tykhiyhave the same argument because they may
3897b2fd183SYaroslav Tykhiyat some point need to allocate new
3907b2fd183SYaroslav Tykhiy.Vt mbufs .
391de06f907SNik Clayton.It Fn MGETHDR mbuf how type
3927b2fd183SYaroslav TykhiyAllocate an
3937b2fd183SYaroslav Tykhiy.Vt mbuf
3947b2fd183SYaroslav Tykhiyand initialize it to contain a packet header
395e73145f6SSheldon Hearnand internal data.
396e73145f6SSheldon HearnSee
397de06f907SNik Clayton.Fn MGET
398de06f907SNik Claytonfor details.
399c3a2dbe9SDag-Erling Smørgrav.It Fn MEXTADD mbuf buf size free opt_arg1 opt_arg2 flags type
400c3a2dbe9SDag-Erling SmørgravAssociate externally managed data with
401c3a2dbe9SDag-Erling Smørgrav.Fa mbuf .
402c3a2dbe9SDag-Erling SmørgravAny internal data contained in the mbuf will be discarded, and the
40373bbeaa5SGlen Barber.Dv M_EXT
40473bbeaa5SGlen Barberflag will be set.
405c3a2dbe9SDag-Erling SmørgravThe
406c3a2dbe9SDag-Erling Smørgrav.Fa buf
407c3a2dbe9SDag-Erling Smørgravand
408c3a2dbe9SDag-Erling Smørgrav.Fa size
409c3a2dbe9SDag-Erling Smørgravarguments are the address and length, respectively, of the data.
410c3a2dbe9SDag-Erling SmørgravThe
411c3a2dbe9SDag-Erling Smørgrav.Fa free
412c3a2dbe9SDag-Erling Smørgravargument points to a function which will be called to free the data
413c3a2dbe9SDag-Erling Smørgravwhen the mbuf is freed; it is only used if
414c3a2dbe9SDag-Erling Smørgrav.Fa type
415c3a2dbe9SDag-Erling Smørgravis
416c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
417c3a2dbe9SDag-Erling SmørgravThe
418c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg1
419c3a2dbe9SDag-Erling Smørgravand
420c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg2
421c3a2dbe9SDag-Erling Smørgravarguments will be passed unmodified to
422c3a2dbe9SDag-Erling Smørgrav.Fa free .
423c3a2dbe9SDag-Erling SmørgravThe
424c3a2dbe9SDag-Erling Smørgrav.Fa flags
425c3a2dbe9SDag-Erling Smørgravargument specifies additional
426c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
427c3a2dbe9SDag-Erling Smørgravflags; it is not necessary to specify
428c3a2dbe9SDag-Erling Smørgrav.Dv M_EXT .
429c3a2dbe9SDag-Erling SmørgravFinally, the
430c3a2dbe9SDag-Erling Smørgrav.Fa type
431c3a2dbe9SDag-Erling Smørgravargument specifies the type of external data, which controls how it
432c3a2dbe9SDag-Erling Smørgravwill be disposed of when the
433c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
434c3a2dbe9SDag-Erling Smørgravis freed.
435c3a2dbe9SDag-Erling SmørgravIn most cases, the correct value is
436c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
437de06f907SNik Clayton.It Fn MCLGET mbuf how
4387b2fd183SYaroslav TykhiyAllocate and attach an
4397b2fd183SYaroslav Tykhiy.Vt mbuf cluster
4407b2fd183SYaroslav Tykhiyto
4417b2fd183SYaroslav Tykhiy.Fa mbuf .
4422a8c860fSRobert WatsonOn success, a non-zero value returned; otherwise, 0.
4432a8c860fSRobert WatsonHistorically, consumers would check for success by testing the
444de06f907SNik Clayton.Dv M_EXT
4452a8c860fSRobert Watsonflag on the mbuf, but this is now discouraged to avoid unnecessary awareness
4462a8c860fSRobert Watsonof the implementation of external storage in protocol stacks and device
4472a8c860fSRobert Watsondrivers.
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.
54018f169afSKevin Lo.It Fn m_get2 size how type flags
54118f169afSKevin LoAllocate an
54218f169afSKevin Lo.Vt mbuf
54318f169afSKevin Lowith enough space to hold specified amount of data.
544328c0bbcSBosko Milekic.It Fn m_getm orig len how type
545328c0bbcSBosko MilekicAllocate
5460b39b3ffSRuslan Ermilov.Fa len
5477b2fd183SYaroslav Tykhiybytes worth of
5487b2fd183SYaroslav Tykhiy.Vt mbufs
5497b2fd183SYaroslav Tykhiyand
5507b2fd183SYaroslav Tykhiy.Vt mbuf clusters
5517b2fd183SYaroslav Tykhiyif necessary and append the resulting allocated
5527b2fd183SYaroslav Tykhiy.Vt mbuf chain
5537b2fd183SYaroslav Tykhiyto the
5547b2fd183SYaroslav Tykhiy.Vt mbuf chain
5557b2fd183SYaroslav Tykhiy.Fa orig ,
5567b2fd183SYaroslav Tykhiyif it is
5570b39b3ffSRuslan Ermilov.No non- Ns Dv NULL .
558328c0bbcSBosko MilekicIf the allocation fails at any point,
5590b39b3ffSRuslan Ermilovfree whatever was allocated and return
5600b39b3ffSRuslan Ermilov.Dv NULL .
561328c0bbcSBosko MilekicIf
5620b39b3ffSRuslan Ermilov.Fa orig
5630b39b3ffSRuslan Ermilovis
5640b39b3ffSRuslan Ermilov.No non- Ns Dv NULL ,
565328c0bbcSBosko Milekicit will not be freed.
566328c0bbcSBosko MilekicIt is possible to use
567328c0bbcSBosko Milekic.Fn m_getm
568328c0bbcSBosko Milekicto either append
5690b39b3ffSRuslan Ermilov.Fa len
5707b2fd183SYaroslav Tykhiybytes to an existing
5717b2fd183SYaroslav Tykhiy.Vt mbuf
5727b2fd183SYaroslav Tykhiyor
5737b2fd183SYaroslav Tykhiy.Vt mbuf chain
574328c0bbcSBosko Milekic(for example, one which may be sitting in a pre-allocated ring)
5757b2fd183SYaroslav Tykhiyor to simply perform an all-or-nothing
5767b2fd183SYaroslav Tykhiy.Vt mbuf
5777b2fd183SYaroslav Tykhiyand
5787b2fd183SYaroslav Tykhiy.Vt mbuf cluster
5797b2fd183SYaroslav Tykhiyallocation.
580de06f907SNik Clayton.It Fn m_gethdr how type
581de06f907SNik ClaytonA function version of
582bfd59721SBosko Milekic.Fn MGETHDR
583bfd59721SBosko Milekicfor non-critical paths.
5846c013706SMaxim Konovalov.It Fn m_getcl how type flags
5856c013706SMaxim KonovalovFetch an
5866c013706SMaxim Konovalov.Vt mbuf
5876c013706SMaxim Konovalovwith a
5886c013706SMaxim Konovalov.Vt mbuf cluster
5896c013706SMaxim Konovalovattached to it.
5906c013706SMaxim KonovalovIf one of the allocations fails, the entire allocation fails.
5916c013706SMaxim KonovalovThis routine is the preferred way of fetching both the
5926c013706SMaxim Konovalov.Vt mbuf
5936c013706SMaxim Konovalovand
5946c013706SMaxim Konovalov.Vt mbuf cluster
5956c013706SMaxim Konovalovtogether, as it avoids having to unlock/relock between allocations.
5966c013706SMaxim KonovalovReturns
5976c013706SMaxim Konovalov.Dv NULL
5986c013706SMaxim Konovalovon failure.
5995c35eb22SJohn-Mark Gurney.It Fn m_getjcl how type flags size
6005c35eb22SJohn-Mark GurneyThis is like
6015c35eb22SJohn-Mark Gurney.Fn m_getcl
6025c35eb22SJohn-Mark Gurneybut it the size of the cluster allocated will be large enough for
6035c35eb22SJohn-Mark Gurney.Fa size
6045c35eb22SJohn-Mark Gurneybytes.
605de06f907SNik Clayton.It Fn m_getclr how type
6067b2fd183SYaroslav TykhiyAllocate an
6077b2fd183SYaroslav Tykhiy.Vt mbuf
6087b2fd183SYaroslav Tykhiyand zero out the data region.
60901e7fdafSMaxim Konovalov.It Fn m_free mbuf
61001e7fdafSMaxim KonovalovFrees
61101e7fdafSMaxim Konovalov.Vt mbuf .
612b7131a26SJohn-Mark GurneyReturns
613b7131a26SJohn-Mark Gurney.Va m_next
614b7131a26SJohn-Mark Gurneyof the freed
615b7131a26SJohn-Mark Gurney.Vt mbuf .
616de06f907SNik Clayton.El
617de06f907SNik Clayton.Pp
6187b2fd183SYaroslav TykhiyThe functions below operate on
6197b2fd183SYaroslav Tykhiy.Vt mbuf chains .
620de06f907SNik Clayton.Bl -ohang -offset indent
621de06f907SNik Clayton.It Fn m_freem mbuf
6227b2fd183SYaroslav TykhiyFree an entire
6237b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6247b2fd183SYaroslav Tykhiyincluding any external storage.
625de06f907SNik Clayton.\"
626de06f907SNik Clayton.It Fn m_adj mbuf len
627de06f907SNik ClaytonTrim
628de06f907SNik Clayton.Fa len
6297b2fd183SYaroslav Tykhiybytes from the head of an
6307b2fd183SYaroslav Tykhiy.Vt mbuf chain
6317b2fd183SYaroslav Tykhiyif
632de06f907SNik Clayton.Fa len
633de06f907SNik Claytonis positive, from the tail otherwise.
634de06f907SNik Clayton.\"
635b9def06bSSam Leffler.It Fn m_append mbuf len cp
636b9def06bSSam LefflerAppend
637b9def06bSSam Leffler.Vt len
638b9def06bSSam Lefflerbytes of data
639b9def06bSSam Leffler.Vt cp
640b9def06bSSam Lefflerto the
641b9def06bSSam Leffler.Vt mbuf chain .
642b9def06bSSam LefflerExtend the mbuf chain if the new data does not fit in
643b9def06bSSam Lefflerexisting space.
644b9def06bSSam Leffler.\"
645de06f907SNik Clayton.It Fn m_prepend mbuf len how
6467b2fd183SYaroslav TykhiyAllocate a new
6477b2fd183SYaroslav Tykhiy.Vt mbuf
6487b2fd183SYaroslav Tykhiyand prepend it to the
6497b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6507b2fd183SYaroslav Tykhiyhandle
651de06f907SNik Clayton.Dv M_PKTHDR
652de06f907SNik Claytonproperly.
653de06f907SNik Clayton.Sy Note :
6540227791bSRuslan ErmilovIt does not allocate any
6557b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
6567b2fd183SYaroslav Tykhiyso
657de06f907SNik Clayton.Fa len
658de06f907SNik Claytonmust be less than
659de06f907SNik Clayton.Dv MLEN
660de06f907SNik Claytonor
661de06f907SNik Clayton.Dv MHLEN ,
662de06f907SNik Claytondepending on the
663d0353b83SRuslan Ermilov.Dv M_PKTHDR
664d0353b83SRuslan Ermilovflag setting.
665de06f907SNik Clayton.\"
6667ac139a9SJohn-Mark Gurney.It Fn m_copyup mbuf len dstoff
6677ac139a9SJohn-Mark GurneySimilar to
6687ac139a9SJohn-Mark Gurney.Fn m_pullup
6697ac139a9SJohn-Mark Gurneybut copies
6707ac139a9SJohn-Mark Gurney.Fa len
6717ac139a9SJohn-Mark Gurneybytes of data into a new mbuf at
6727ac139a9SJohn-Mark Gurney.Fa dstoff
6737ac139a9SJohn-Mark Gurneybytes into the mbuf.
6747ac139a9SJohn-Mark GurneyThe
6757ac139a9SJohn-Mark Gurney.Fa dstoff
6767ac139a9SJohn-Mark Gurneyargument aligns the data and leaves room for a link layer header.
6774f068961SRuslan ErmilovReturns the new
6787ac139a9SJohn-Mark Gurney.Vt mbuf chain
6797ac139a9SJohn-Mark Gurneyon success,
6807ac139a9SJohn-Mark Gurneyand frees the
6817ac139a9SJohn-Mark Gurney.Vt mbuf chain
6827ac139a9SJohn-Mark Gurneyand returns
6837ac139a9SJohn-Mark Gurney.Dv NULL
6847ac139a9SJohn-Mark Gurneyon failure.
6857ac139a9SJohn-Mark Gurney.Sy Note :
6867ac139a9SJohn-Mark GurneyThe function does not allocate
6877ac139a9SJohn-Mark Gurney.Vt mbuf clusters ,
6887ac139a9SJohn-Mark Gurneyso
6897ac139a9SJohn-Mark Gurney.Fa len + dstoff
6907ac139a9SJohn-Mark Gurneymust be less than
6917ac139a9SJohn-Mark Gurney.Dv MHLEN .
6927ac139a9SJohn-Mark Gurney.\"
693de06f907SNik Clayton.It Fn m_pullup mbuf len
694de06f907SNik ClaytonArrange that the first
695de06f907SNik Clayton.Fa len
6967b2fd183SYaroslav Tykhiybytes of an
6977b2fd183SYaroslav Tykhiy.Vt mbuf chain
6987b2fd183SYaroslav Tykhiyare contiguous and lay in the data area of
699de06f907SNik Clayton.Fa mbuf ,
700de06f907SNik Claytonso they are accessible with
701de06f907SNik Clayton.Fn mtod mbuf type .
7021009bd1bSJulian ElischerIt is important to remember that this may involve
7031009bd1bSJulian Elischerreallocating some mbufs and moving data so all pointers
7041009bd1bSJulian Elischerreferencing data within the old mbuf chain
7051009bd1bSJulian Elischermust be recalculated or made invalid.
7067b2fd183SYaroslav TykhiyReturn the new
7077b2fd183SYaroslav Tykhiy.Vt mbuf chain
7087b2fd183SYaroslav Tykhiyon success,
709de06f907SNik Clayton.Dv NULL
710de06f907SNik Claytonon failure
7117b2fd183SYaroslav Tykhiy(the
7127b2fd183SYaroslav Tykhiy.Vt mbuf chain
7137b2fd183SYaroslav Tykhiyis freed in this case).
714de06f907SNik Clayton.Sy Note :
7150227791bSRuslan ErmilovIt does not allocate any
7167b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
7177b2fd183SYaroslav Tykhiyso
718de06f907SNik Clayton.Fa len
719969ed8f7SKevin Lomust be less than or equal to
720de06f907SNik Clayton.Dv MHLEN .
721de06f907SNik Clayton.\"
722d305f4b9SBruce M Simpson.It Fn m_pulldown mbuf offset len offsetp
723d305f4b9SBruce M SimpsonArrange that
724d305f4b9SBruce M Simpson.Fa len
725d305f4b9SBruce M Simpsonbytes between
726d305f4b9SBruce M Simpson.Fa offset
727d305f4b9SBruce M Simpsonand
728d305f4b9SBruce M Simpson.Fa offset + len
729d305f4b9SBruce M Simpsonin the
730d305f4b9SBruce M Simpson.Vt mbuf chain
731d305f4b9SBruce M Simpsonare contiguous and lay in the data area of
732d305f4b9SBruce M Simpson.Fa mbuf ,
733d305f4b9SBruce M Simpsonso they are accessible with
734d305f4b9SBruce M Simpson.Fn mtod mbuf type .
73573bbeaa5SGlen Barber.Fa len
73673bbeaa5SGlen Barbermust be smaller than, or equal to, the size of an
737d305f4b9SBruce M Simpson.Vt mbuf cluster .
738d305f4b9SBruce M SimpsonReturn a pointer to an intermediate
739d305f4b9SBruce M Simpson.Vt mbuf
740d305f4b9SBruce M Simpsonin the chain containing the requested region;
741d305f4b9SBruce M Simpsonthe offset in the data region of the
742d305f4b9SBruce M Simpson.Vt mbuf chain
743d305f4b9SBruce M Simpsonto the data contained in the returned mbuf is stored in
744d305f4b9SBruce M Simpson.Fa *offsetp .
745d305f4b9SBruce M SimpsonIf
746e0912e08SJohn-Mark Gurney.Fa offsetp
747d305f4b9SBruce M Simpsonis NULL, the region may be accessed using
748d305f4b9SBruce M Simpson.Fn mtod mbuf type .
749d305f4b9SBruce M SimpsonIf
750e0912e08SJohn-Mark Gurney.Fa offsetp
751d305f4b9SBruce M Simpsonis non-NULL, the region may be accessed using
752e0912e08SJohn-Mark Gurney.Fn mtod mbuf uint8_t
753e0912e08SJohn-Mark Gurney+ *offsetp.
754d305f4b9SBruce M SimpsonThe region of the mbuf chain between its beginning and
755e0912e08SJohn-Mark Gurney.Fa offset
756d305f4b9SBruce M Simpsonis not modified, therefore it is safe to hold pointers to data within
757d305f4b9SBruce M Simpsonthis region before calling
758d305f4b9SBruce M Simpson.Fn m_pulldown .
759d305f4b9SBruce M Simpson.\"
760de06f907SNik Clayton.It Fn m_copym mbuf offset len how
7617b2fd183SYaroslav TykhiyMake a copy of an
7627b2fd183SYaroslav Tykhiy.Vt mbuf chain
7637b2fd183SYaroslav Tykhiystarting
764de06f907SNik Clayton.Fa offset
765de06f907SNik Claytonbytes from the beginning, continuing for
766de06f907SNik Clayton.Fa len
767e73145f6SSheldon Hearnbytes.
768e73145f6SSheldon HearnIf
769de06f907SNik Clayton.Fa len
770de06f907SNik Claytonis
771de06f907SNik Clayton.Dv M_COPYALL ,
7727b2fd183SYaroslav Tykhiycopy to the end of the
7737b2fd183SYaroslav Tykhiy.Vt mbuf chain .
774de06f907SNik Clayton.Sy Note :
7757b2fd183SYaroslav TykhiyThe copy is read-only, because the
7767b2fd183SYaroslav Tykhiy.Vt mbuf clusters
7777b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
778de06f907SNik Clayton.\"
779de06f907SNik Clayton.It Fn m_copypacket mbuf how
780de06f907SNik ClaytonCopy an entire packet including header, which must be present.
781de06f907SNik ClaytonThis is an optimized version of the common case
782de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how .
783de06f907SNik Clayton.Sy Note :
7847b2fd183SYaroslav Tykhiythe copy is read-only, because the
7857b2fd183SYaroslav Tykhiy.Vt mbuf clusters
7867b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
787de06f907SNik Clayton.\"
788de06f907SNik Clayton.It Fn m_dup mbuf how
7897b2fd183SYaroslav TykhiyCopy a packet header
7907b2fd183SYaroslav Tykhiy.Vt mbuf chain
7917b2fd183SYaroslav Tykhiyinto a completely new
7927b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
7937b2fd183SYaroslav Tykhiyincluding copying any
7947b2fd183SYaroslav Tykhiy.Vt mbuf clusters .
795e73145f6SSheldon HearnUse this instead of
796de06f907SNik Clayton.Fn m_copypacket
7977b2fd183SYaroslav Tykhiywhen you need a writable copy of an
7987b2fd183SYaroslav Tykhiy.Vt mbuf chain .
799de06f907SNik Clayton.\"
800de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf
8017b2fd183SYaroslav TykhiyCopy data from an
8027b2fd183SYaroslav Tykhiy.Vt mbuf chain
8037b2fd183SYaroslav Tykhiystarting
804de06f907SNik Clayton.Fa off
805de06f907SNik Claytonbytes from the beginning, continuing for
806de06f907SNik Clayton.Fa len
807de06f907SNik Claytonbytes, into the indicated buffer
808de06f907SNik Clayton.Fa buf .
809de06f907SNik Clayton.\"
810de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf
811de06f907SNik ClaytonCopy
812de06f907SNik Clayton.Fa len
813de06f907SNik Claytonbytes from the buffer
814de06f907SNik Clayton.Fa buf
8157b2fd183SYaroslav Tykhiyback into the indicated
8167b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
817de06f907SNik Claytonstarting at
818de06f907SNik Clayton.Fa offset
8197b2fd183SYaroslav Tykhiybytes from the beginning of the
8207b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8217b2fd183SYaroslav Tykhiyextending the
8227b2fd183SYaroslav Tykhiy.Vt mbuf chain
8237b2fd183SYaroslav Tykhiyif necessary.
824de06f907SNik Clayton.Sy Note :
8250227791bSRuslan ErmilovIt does not allocate any
8267b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
8277b2fd183SYaroslav Tykhiyjust adds
8287b2fd183SYaroslav Tykhiy.Vt mbufs
8297b2fd183SYaroslav Tykhiyto the
8307b2fd183SYaroslav Tykhiy.Vt mbuf chain .
83136a142c4SRuslan ErmilovIt is safe to set
832de06f907SNik Clayton.Fa offset
8337b2fd183SYaroslav Tykhiybeyond the current
8347b2fd183SYaroslav Tykhiy.Vt mbuf chain
8357b2fd183SYaroslav Tykhiyend: zeroed
8367b2fd183SYaroslav Tykhiy.Vt mbufs
8377b2fd183SYaroslav Tykhiywill be allocated to fill the space.
838de06f907SNik Clayton.\"
8395d96084fSYaroslav Tykhiy.It Fn m_length mbuf last
8407b2fd183SYaroslav TykhiyReturn the length of the
8417b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8427b2fd183SYaroslav Tykhiyand optionally a pointer to the last
8437b2fd183SYaroslav Tykhiy.Vt mbuf .
8440b1c0994SPoul-Henning Kamp.\"
845da72b998SYaroslav Tykhiy.It Fn m_dup_pkthdr to from how
846da72b998SYaroslav TykhiyUpon the function's completion, the
847da72b998SYaroslav Tykhiy.Vt mbuf
848da72b998SYaroslav Tykhiy.Fa to
849da72b998SYaroslav Tykhiywill contain an identical copy of
850da72b998SYaroslav Tykhiy.Fa from->m_pkthdr
851da72b998SYaroslav Tykhiyand the per-packet attributes found in the
852da72b998SYaroslav Tykhiy.Vt mbuf chain
853da72b998SYaroslav Tykhiy.Fa from .
854da72b998SYaroslav TykhiyThe
855da72b998SYaroslav Tykhiy.Vt mbuf
856da72b998SYaroslav Tykhiy.Fa from
857da72b998SYaroslav Tykhiymust have the flag
858da72b998SYaroslav Tykhiy.Dv M_PKTHDR
859da72b998SYaroslav Tykhiyinitially set, and
860da72b998SYaroslav Tykhiy.Fa to
861da72b998SYaroslav Tykhiymust be empty on entry.
862da72b998SYaroslav Tykhiy.\"
863da72b998SYaroslav Tykhiy.It Fn m_move_pkthdr to from
864da72b998SYaroslav TykhiyMove
865da72b998SYaroslav Tykhiy.Va m_pkthdr
866da72b998SYaroslav Tykhiyand the per-packet attributes from the
867da72b998SYaroslav Tykhiy.Vt mbuf chain
868da72b998SYaroslav Tykhiy.Fa from
869da72b998SYaroslav Tykhiyto the
870da72b998SYaroslav Tykhiy.Vt mbuf
871da72b998SYaroslav Tykhiy.Fa to .
872da72b998SYaroslav TykhiyThe
873da72b998SYaroslav Tykhiy.Vt mbuf
874da72b998SYaroslav Tykhiy.Fa from
875da72b998SYaroslav Tykhiymust have the flag
876da72b998SYaroslav Tykhiy.Dv M_PKTHDR
877da72b998SYaroslav Tykhiyinitially set, and
878da72b998SYaroslav Tykhiy.Fa to
879da72b998SYaroslav Tykhiymust be empty on entry.
880da72b998SYaroslav TykhiyUpon the function's completion,
881da72b998SYaroslav Tykhiy.Fa from
882da72b998SYaroslav Tykhiywill have the flag
883da72b998SYaroslav Tykhiy.Dv M_PKTHDR
884da72b998SYaroslav Tykhiyand the per-packet attributes cleared.
885da72b998SYaroslav Tykhiy.\"
8865d96084fSYaroslav Tykhiy.It Fn m_fixhdr mbuf
8877b2fd183SYaroslav TykhiySet the packet-header length to the length of the
8887b2fd183SYaroslav Tykhiy.Vt mbuf chain .
8890b1c0994SPoul-Henning Kamp.\"
890de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy
891de06f907SNik ClaytonCopy data from a device local memory pointed to by
892de06f907SNik Clayton.Fa buf
8937b2fd183SYaroslav Tykhiyto an
8947b2fd183SYaroslav Tykhiy.Vt mbuf chain .
895e73145f6SSheldon HearnThe copy is done using a specified copy routine
896de06f907SNik Clayton.Fa copy ,
897de06f907SNik Claytonor
898de06f907SNik Clayton.Fn bcopy
899de06f907SNik Claytonif
900de06f907SNik Clayton.Fa copy
901de06f907SNik Claytonis
902de06f907SNik Clayton.Dv NULL .
903de06f907SNik Clayton.\"
904de06f907SNik Clayton.It Fn m_cat m n
905de06f907SNik ClaytonConcatenate
906de06f907SNik Clayton.Fa n
907de06f907SNik Claytonto
908de06f907SNik Clayton.Fa m .
9097b2fd183SYaroslav TykhiyBoth
9107b2fd183SYaroslav Tykhiy.Vt mbuf chains
9117b2fd183SYaroslav Tykhiymust be of the same type.
912de06f907SNik Clayton.Fa N
913de06f907SNik Claytonis still valid after the function returned.
914de06f907SNik Clayton.Sy Note :
915de06f907SNik ClaytonIt does not handle
916de06f907SNik Clayton.Dv M_PKTHDR
917de06f907SNik Claytonand friends.
918de06f907SNik Clayton.\"
919de06f907SNik Clayton.It Fn m_split mbuf len how
9207b2fd183SYaroslav TykhiyPartition an
9217b2fd183SYaroslav Tykhiy.Vt mbuf chain
9227b2fd183SYaroslav Tykhiyin two pieces, returning the tail:
923de06f907SNik Claytonall but the first
924de06f907SNik Clayton.Fa len
925e73145f6SSheldon Hearnbytes.
926e73145f6SSheldon HearnIn case of failure, it returns
927de06f907SNik Clayton.Dv NULL
9287b2fd183SYaroslav Tykhiyand attempts to restore the
9297b2fd183SYaroslav Tykhiy.Vt mbuf chain
9307b2fd183SYaroslav Tykhiyto its original state.
93102312219SBruce M Simpson.\"
93202312219SBruce M Simpson.It Fn m_apply mbuf off len f arg
93302312219SBruce M SimpsonApply a function to an
93402312219SBruce M Simpson.Vt mbuf chain ,
93502312219SBruce M Simpsonat offset
93602312219SBruce M Simpson.Fa off ,
93702312219SBruce M Simpsonfor length
938f48cbcdeSRuslan Ermilov.Fa len
939f48cbcdeSRuslan Ermilovbytes.
94002312219SBruce M SimpsonTypically used to avoid calls to
94102312219SBruce M Simpson.Fn m_pullup
94202312219SBruce M Simpsonwhich would otherwise be unnecessary or undesirable.
94302312219SBruce M Simpson.Fa arg
94402312219SBruce M Simpsonis a convenience argument which is passed to the callback function
94502312219SBruce M Simpson.Fa f .
94602312219SBruce M Simpson.Pp
94702312219SBruce M SimpsonEach time
94802312219SBruce M Simpson.Fn f
94902312219SBruce M Simpsonis called, it will be passed
95002312219SBruce M Simpson.Fa arg ,
95102312219SBruce M Simpsona pointer to the
95202312219SBruce M Simpson.Fa data
95302312219SBruce M Simpsonin the current mbuf, and the length
95402312219SBruce M Simpson.Fa len
95502312219SBruce M Simpsonof the data in this mbuf to which the function should be applied.
95602312219SBruce M Simpson.Pp
95702312219SBruce M SimpsonThe function should return zero to indicate success;
95802312219SBruce M Simpsonotherwise, if an error is indicated, then
95902312219SBruce M Simpson.Fn m_apply
96002312219SBruce M Simpsonwill return the error and stop iterating through the
96102312219SBruce M Simpson.Vt mbuf chain .
96202312219SBruce M Simpson.\"
96302312219SBruce M Simpson.It Fn m_getptr mbuf loc off
96402312219SBruce M SimpsonReturn a pointer to the mbuf containing the data located at
96502312219SBruce M Simpson.Fa loc
96602312219SBruce M Simpsonbytes from the beginning of the
96702312219SBruce M Simpson.Vt mbuf chain .
96802312219SBruce M SimpsonThe corresponding offset into the mbuf will be stored in
96902312219SBruce M Simpson.Fa *off .
970a61bc764SMike Silbersack.It Fn m_defrag m0 how
971f48cbcdeSRuslan ErmilovDefragment an mbuf chain, returning the shortest possible
972bdf86185SMike Silbersackchain of mbufs and clusters.
973bdf86185SMike SilbersackIf allocation fails and this can not be completed,
974bdf86185SMike Silbersack.Dv NULL
975bdf86185SMike Silbersackwill be returned and the original chain will be unchanged.
976bdf86185SMike SilbersackUpon success, the original chain will be freed and the new
977bdf86185SMike Silbersackchain will be returned.
978a61bc764SMike Silbersack.Fa how
979a61bc764SMike Silbersackshould be either
980fa05d215SGleb Smirnoff.Dv M_WAITOK
981a61bc764SMike Silbersackor
982fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
983a61bc764SMike Silbersackdepending on the caller's preference.
984a61bc764SMike Silbersack.Pp
985a61bc764SMike SilbersackThis function is especially useful in network drivers, where
986a61bc764SMike Silbersackcertain long mbuf chains must be shortened before being added
987a61bc764SMike Silbersackto TX descriptor lists.
988*f66b6464SMark Johnston.It Fn m_collapse m0 how maxfrags
989*f66b6464SMark JohnstonDefragment an mbuf chain, returning a chain of at most
990*f66b6464SMark Johnston.Fa maxfrags
991*f66b6464SMark Johnstonmbufs and clusters.
992*f66b6464SMark JohnstonIf allocation fails or the chain cannot be collapsed as requested,
993*f66b6464SMark Johnston.Dv NULL
994*f66b6464SMark Johnstonwill be returned, with the original chain possibly modified.
995*f66b6464SMark JohnstonAs with
996*f66b6464SMark Johnston.Fn m_defrag ,
997*f66b6464SMark Johnston.Fa how
998*f66b6464SMark Johnstonshould be one of
999*f66b6464SMark Johnston.Dv M_WAITOK
1000*f66b6464SMark Johnstonor
1001*f66b6464SMark Johnston.Dv M_NOWAIT .
100247e2996eSSam Leffler.It Fn m_unshare m0 how
100347e2996eSSam LefflerCreate a version of the specified mbuf chain whose
100447e2996eSSam Lefflercontents can be safely modified without affecting other users.
100547e2996eSSam LefflerIf allocation fails and this operation can not be completed,
100647e2996eSSam Leffler.Dv NULL
100747e2996eSSam Lefflerwill be returned.
100847e2996eSSam LefflerThe original mbuf chain is always reclaimed and the reference
100947e2996eSSam Lefflercount of any shared mbuf clusters is decremented.
101047e2996eSSam Leffler.Fa how
101147e2996eSSam Lefflershould be either
1012fa05d215SGleb Smirnoff.Dv M_WAITOK
101347e2996eSSam Leffleror
1014fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
101547e2996eSSam Lefflerdepending on the caller's preference.
101647e2996eSSam LefflerAs a side-effect of this process the returned
101747e2996eSSam Lefflermbuf chain may be compacted.
101847e2996eSSam Leffler.Pp
101947e2996eSSam LefflerThis function is especially useful in the transmit path of
102047e2996eSSam Lefflernetwork code, when data must be encrypted or otherwise
102147e2996eSSam Leffleraltered prior to transmission.
10223136363fSRuslan Ermilov.El
10230193eb5eSYaroslav Tykhiy.Sh HARDWARE-ASSISTED CHECKSUM CALCULATION
10240193eb5eSYaroslav TykhiyThis section currently applies to TCP/IP only.
10250193eb5eSYaroslav TykhiyIn order to save the host CPU resources, computing checksums is
10260193eb5eSYaroslav Tykhiyoffloaded to the network interface hardware if possible.
10270193eb5eSYaroslav TykhiyThe
10280193eb5eSYaroslav Tykhiy.Va m_pkthdr
10290193eb5eSYaroslav Tykhiymember of the leading
10300193eb5eSYaroslav Tykhiy.Vt mbuf
10310193eb5eSYaroslav Tykhiyof a packet contains two fields used for that purpose,
10320193eb5eSYaroslav Tykhiy.Vt int Va csum_flags
10330193eb5eSYaroslav Tykhiyand
10340193eb5eSYaroslav Tykhiy.Vt int Va csum_data .
10350193eb5eSYaroslav TykhiyThe meaning of those fields depends on the direction a packet flows in,
10360193eb5eSYaroslav Tykhiyand on whether the packet is fragmented.
10370193eb5eSYaroslav TykhiyHenceforth,
10380193eb5eSYaroslav Tykhiy.Va csum_flags
10390193eb5eSYaroslav Tykhiyor
10400193eb5eSYaroslav Tykhiy.Va csum_data
10410193eb5eSYaroslav Tykhiyof a packet
10420193eb5eSYaroslav Tykhiywill denote the corresponding field of the
10430193eb5eSYaroslav Tykhiy.Va m_pkthdr
10440193eb5eSYaroslav Tykhiymember of the leading
10450193eb5eSYaroslav Tykhiy.Vt mbuf
10460193eb5eSYaroslav Tykhiyin the
10470193eb5eSYaroslav Tykhiy.Vt mbuf chain
10480193eb5eSYaroslav Tykhiycontaining the packet.
10490193eb5eSYaroslav Tykhiy.Pp
10500193eb5eSYaroslav TykhiyOn output, checksum offloading is attempted after the outgoing
10510193eb5eSYaroslav Tykhiyinterface has been determined for a packet.
10520193eb5eSYaroslav TykhiyThe interface-specific field
10530193eb5eSYaroslav Tykhiy.Va ifnet.if_data.ifi_hwassist
10540193eb5eSYaroslav Tykhiy(see
10550193eb5eSYaroslav Tykhiy.Xr ifnet 9 )
10560193eb5eSYaroslav Tykhiyis consulted for the capabilities of the interface to assist in
10570193eb5eSYaroslav Tykhiycomputing checksums.
10580193eb5eSYaroslav TykhiyThe
10590193eb5eSYaroslav Tykhiy.Va csum_flags
1060f48cbcdeSRuslan Ermilovfield of the packet header is set to indicate which actions the interface
10610193eb5eSYaroslav Tykhiyis supposed to perform on it.
10620193eb5eSYaroslav TykhiyThe actions unsupported by the network interface are done in the
10630193eb5eSYaroslav Tykhiysoftware prior to passing the packet down to the interface driver;
10640193eb5eSYaroslav Tykhiysuch actions will never be requested through
10650193eb5eSYaroslav Tykhiy.Va csum_flags .
10660193eb5eSYaroslav Tykhiy.Pp
10670193eb5eSYaroslav TykhiyThe flags demanding a particular action from an interface are as follows:
10680193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_TCP" -offset indent
10690193eb5eSYaroslav Tykhiy.It Dv CSUM_IP
10700193eb5eSYaroslav TykhiyThe IP header checksum is to be computed and stored in the
10710193eb5eSYaroslav Tykhiycorresponding field of the packet.
10720193eb5eSYaroslav TykhiyThe hardware is expected to know the format of an IP header
10730193eb5eSYaroslav Tykhiyto determine the offset of the IP checksum field.
10740193eb5eSYaroslav Tykhiy.It Dv CSUM_TCP
1075f48cbcdeSRuslan ErmilovThe TCP checksum is to be computed.
1076f48cbcdeSRuslan Ermilov(See below.)
10770193eb5eSYaroslav Tykhiy.It Dv CSUM_UDP
1078f48cbcdeSRuslan ErmilovThe UDP checksum is to be computed.
1079f48cbcdeSRuslan Ermilov(See below.)
10800193eb5eSYaroslav Tykhiy.El
10810193eb5eSYaroslav Tykhiy.Pp
1082fbde705aSYaroslav TykhiyShould a TCP or UDP checksum be offloaded to the hardware,
10830193eb5eSYaroslav Tykhiythe field
10840193eb5eSYaroslav Tykhiy.Va csum_data
10850193eb5eSYaroslav Tykhiywill contain the byte offset of the checksum field relative to the
10860193eb5eSYaroslav Tykhiyend of the IP header.
10870193eb5eSYaroslav TykhiyIn this case, the checksum field will be initially
10880193eb5eSYaroslav Tykhiyset by the TCP/IP module to the checksum of the pseudo header
1089fbde705aSYaroslav Tykhiydefined by the TCP and UDP specifications.
10900193eb5eSYaroslav Tykhiy.Pp
10910193eb5eSYaroslav TykhiyOn input, an interface indicates the actions it has performed
10920193eb5eSYaroslav Tykhiyon a packet by setting one or more of the following flags in
10930193eb5eSYaroslav Tykhiy.Va csum_flags
10940193eb5eSYaroslav Tykhiyassociated with the packet:
10950193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_IP_CHECKED" -offset indent
10960193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_CHECKED
10970193eb5eSYaroslav TykhiyThe IP header checksum has been computed.
10980193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_VALID
10990193eb5eSYaroslav TykhiyThe IP header has a valid checksum.
11000193eb5eSYaroslav TykhiyThis flag can appear only in combination with
11010193eb5eSYaroslav Tykhiy.Dv CSUM_IP_CHECKED .
11020193eb5eSYaroslav Tykhiy.It Dv CSUM_DATA_VALID
11030193eb5eSYaroslav TykhiyThe checksum of the data portion of the IP packet has been computed
11040193eb5eSYaroslav Tykhiyand stored in the field
11050193eb5eSYaroslav Tykhiy.Va csum_data
11060193eb5eSYaroslav Tykhiyin network byte order.
11070193eb5eSYaroslav Tykhiy.It Dv CSUM_PSEUDO_HDR
11080193eb5eSYaroslav TykhiyCan be set only along with
11090193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
11100193eb5eSYaroslav Tykhiyto indicate that the IP data checksum found in
11110193eb5eSYaroslav Tykhiy.Va csum_data
1112fbde705aSYaroslav Tykhiyallows for the pseudo header defined by the TCP and UDP specifications.
11130193eb5eSYaroslav TykhiyOtherwise the checksum of the pseudo header must be calculated by
11140193eb5eSYaroslav Tykhiythe host CPU and added to
11150193eb5eSYaroslav Tykhiy.Va csum_data
1116fbde705aSYaroslav Tykhiyto obtain the final checksum to be used for TCP or UDP validation purposes.
11170193eb5eSYaroslav Tykhiy.El
11180193eb5eSYaroslav Tykhiy.Pp
11190193eb5eSYaroslav TykhiyIf a particular network interface just indicates success or
11200193eb5eSYaroslav Tykhiyfailure of TCP or UDP checksum validation without returning
11210193eb5eSYaroslav Tykhiythe exact value of the checksum to the host CPU, its driver can mark
11220193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
11230193eb5eSYaroslav Tykhiyand
11240193eb5eSYaroslav Tykhiy.Dv CSUM_PSEUDO_HDR
11250193eb5eSYaroslav Tykhiyin
11260193eb5eSYaroslav Tykhiy.Va csum_flags ,
11270193eb5eSYaroslav Tykhiyand set
11280193eb5eSYaroslav Tykhiy.Va csum_data
11290193eb5eSYaroslav Tykhiyto
11300193eb5eSYaroslav Tykhiy.Li 0xFFFF
11310193eb5eSYaroslav Tykhiyhexadecimal to indicate a valid checksum.
1132f48cbcdeSRuslan ErmilovIt is a peculiarity of the algorithm used that the Internet checksum
11330193eb5eSYaroslav Tykhiycalculated over any valid packet will be
11340193eb5eSYaroslav Tykhiy.Li 0xFFFF
11350193eb5eSYaroslav Tykhiyas long as the original checksum field is included.
11363cab047eSMike Silbersack.Sh STRESS TESTING
1137c8185672SRuslan ErmilovWhen running a kernel compiled with the option
1138c8185672SRuslan Ermilov.Dv MBUF_STRESS_TEST ,
1139c8185672SRuslan Ermilovthe following
1140c8185672SRuslan Ermilov.Xr sysctl 8 Ns
1141c8185672SRuslan Ermilov-controlled options may be used to create
11423cab047eSMike Silbersackvarious failure/extreme cases for testing of network drivers
11437b2fd183SYaroslav Tykhiyand other parts of the kernel that rely on
11447b2fd183SYaroslav Tykhiy.Vt mbufs .
1145c8185672SRuslan Ermilov.Bl -tag -width ident
1146c8185672SRuslan Ermilov.It Va net.inet.ip.mbuf_frag_size
1147c8185672SRuslan ErmilovCauses
1148c8185672SRuslan Ermilov.Fn ip_output
11497b2fd183SYaroslav Tykhiyto fragment outgoing
11507b2fd183SYaroslav Tykhiy.Vt mbuf chains
11517b2fd183SYaroslav Tykhiyinto fragments of the specified size.
1152c8185672SRuslan ErmilovSetting this variable to 1 is an excellent way to
11537b2fd183SYaroslav Tykhiytest the long
11547b2fd183SYaroslav Tykhiy.Vt mbuf chain
11557b2fd183SYaroslav Tykhiyhandling ability of network drivers.
1156c8185672SRuslan Ermilov.It Va kern.ipc.m_defragrandomfailures
1157c8185672SRuslan ErmilovCauses the function
1158c8185672SRuslan Ermilov.Fn m_defrag
1159c8185672SRuslan Ermilovto randomly fail, returning
1160c8185672SRuslan Ermilov.Dv NULL .
1161c8185672SRuslan ErmilovAny piece of code which uses
1162c8185672SRuslan Ermilov.Fn m_defrag
1163c8185672SRuslan Ermilovshould be tested with this feature.
1164c8185672SRuslan Ermilov.El
1165de06f907SNik Clayton.Sh RETURN VALUES
1166de06f907SNik ClaytonSee above.
11670193eb5eSYaroslav Tykhiy.Sh SEE ALSO
1168e85cc3f5SRuslan Ermilov.Xr ifnet 9 ,
1169e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
1170de06f907SNik Clayton.Sh HISTORY
1171de06f907SNik Clayton.\" Please correct me if I'm wrong
11727b2fd183SYaroslav Tykhiy.Vt Mbufs
11737b2fd183SYaroslav Tykhiyappeared in an early version of
1174753d686dSRuslan Ermilov.Bx .
117553b2520dSTom RhodesBesides being used for network packets, they were used
1176bfd59721SBosko Milekicto store various dynamic structures, such as routing table
1177bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc.
1178db430f97SRobert WatsonIn more recent
1179db430f97SRobert Watson.Fx
1180db430f97SRobert Watsonuse of
1181db430f97SRobert Watson.Vt mbufs
1182db430f97SRobert Watsonis almost entirely limited to packet storage, with
1183db430f97SRobert Watson.Xr uma 9
1184db430f97SRobert Watsonzones being used directly to store other network-related memory.
1185db430f97SRobert Watson.Pp
1186db430f97SRobert WatsonHistorically, the
1187db430f97SRobert Watson.Vt mbuf
1188db430f97SRobert Watsonallocator has been a special-purpose memory allocator able to run in
1189db430f97SRobert Watsoninterrupt contexts and allocating from a special kernel address space map.
1190db430f97SRobert WatsonAs of
1191db430f97SRobert Watson.Fx 5.3 ,
1192db430f97SRobert Watsonthe
1193db430f97SRobert Watson.Vt mbuf
1194db430f97SRobert Watsonallocator is a wrapper around
1195db430f97SRobert Watson.Xr uma 9 ,
1196db430f97SRobert Watsonallowing caching of
1197db430f97SRobert Watson.Vt mbufs ,
1198db430f97SRobert Watsonclusters, and
1199db430f97SRobert Watson.Vt mbuf
1200db430f97SRobert Watson+ cluster pairs in per-CPU caches, as well as bringing other benefits of
1201db430f97SRobert Watsonslab allocation.
1202de06f907SNik Clayton.Sh AUTHORS
12036575e6daSRuslan ErmilovThe original
12046575e6daSRuslan Ermilov.Nm
12051e9469d1SChristian Brueffermanual page was written by
12061e9469d1SChristian Brueffer.An Yar Tikhiy .
1207db430f97SRobert WatsonThe
1208db430f97SRobert Watson.Xr uma 9
1209db430f97SRobert Watson.Vt mbuf
12101e9469d1SChristian Bruefferallocator was written by
12111e9469d1SChristian Brueffer.An Bosko Milekic .
1212