xref: /freebsd/share/man/man9/mbuf.9 (revision 82334850ea451f7f6903be20e4836118e6a77460)
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.\"
277b29ab7eSJohn Baldwin.Dd June 28, 2019
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"
47e8fd18f3SGleb Smirnoff.Fa "char *buf"
48bfd59721SBosko Milekic.Fa "u_int size"
49e8fd18f3SGleb Smirnoff.Fa "void (*free)(struct mbuf *)"
50cf827063SPoul-Henning Kamp.Fa "void *opt_arg1"
51cf827063SPoul-Henning Kamp.Fa "void *opt_arg2"
52e8fd18f3SGleb Smirnoff.Fa "int flags"
535d4050ccSBosko Milekic.Fa "int type"
54bfd59721SBosko Milekic.Fc
55de06f907SNik Clayton.\"
56bfd59721SBosko Milekic.Ss Mbuf utility macros
57f16b3c0dSChad David.Fn mtod "struct mbuf *mbuf" "type"
58bfd59721SBosko Milekic.Fn M_ALIGN "struct mbuf *mbuf" "u_int len"
59bfd59721SBosko Milekic.Fn MH_ALIGN "struct mbuf *mbuf" "u_int len"
60f16b3c0dSChad David.Ft int
61bfd59721SBosko Milekic.Fn M_LEADINGSPACE "struct mbuf *mbuf"
62f16b3c0dSChad David.Ft int
63bfd59721SBosko Milekic.Fn M_TRAILINGSPACE "struct mbuf *mbuf"
64da72b998SYaroslav Tykhiy.Fn M_MOVE_PKTHDR "struct mbuf *to" "struct mbuf *from"
65bfd59721SBosko Milekic.Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how"
66ada46fe9SKevin Lo.Fn MCHTYPE "struct mbuf *mbuf" "short type"
67f16b3c0dSChad David.Ft int
685d4050ccSBosko Milekic.Fn M_WRITABLE "struct mbuf *mbuf"
69bfd59721SBosko Milekic.\"
70bfd59721SBosko Milekic.Ss Mbuf allocation functions
71de06f907SNik Clayton.Ft struct mbuf *
72ada46fe9SKevin Lo.Fn m_get "int how" "short type"
73de06f907SNik Clayton.Ft struct mbuf *
7418f169afSKevin Lo.Fn m_get2 "int size" "int how" "short type" "int flags"
7518f169afSKevin Lo.Ft struct mbuf *
76ada46fe9SKevin Lo.Fn m_getm "struct mbuf *orig" "int len" "int how" "short type"
77328c0bbcSBosko Milekic.Ft struct mbuf *
785c35eb22SJohn-Mark Gurney.Fn m_getjcl "int how" "short type" "int flags" "int size"
795c35eb22SJohn-Mark Gurney.Ft struct mbuf *
806c013706SMaxim Konovalov.Fn m_getcl "int how" "short type" "int flags"
816c013706SMaxim Konovalov.Ft struct mbuf *
82ada46fe9SKevin Lo.Fn m_gethdr "int how" "short type"
83bfd59721SBosko Milekic.Ft struct mbuf *
84bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf"
85de06f907SNik Clayton.Ft void
86de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf"
87bfd59721SBosko Milekic.\"
88bfd59721SBosko Milekic.Ss Mbuf utility functions
89de06f907SNik Clayton.Ft void
90de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len"
919c3fd404SSam Leffler.Ft void
929c3fd404SSam Leffler.Fn m_align "struct mbuf *mbuf" "int len"
93b9def06bSSam Leffler.Ft int
94b9def06bSSam Leffler.Fn m_append "struct mbuf *mbuf" "int len" "c_caddr_t cp"
95de06f907SNik Clayton.Ft struct mbuf *
96de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how"
97de06f907SNik Clayton.Ft struct mbuf *
987ac139a9SJohn-Mark Gurney.Fn m_copyup "struct mbuf *mbuf" "int len" "int dstoff"
997ac139a9SJohn-Mark Gurney.Ft struct mbuf *
100de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len"
101de06f907SNik Clayton.Ft struct mbuf *
102d305f4b9SBruce M Simpson.Fn m_pulldown "struct mbuf *mbuf" "int offset" "int len" "int *offsetp"
103d305f4b9SBruce M Simpson.Ft struct mbuf *
104de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how"
105de06f907SNik Clayton.Ft struct mbuf *
106de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how"
107de06f907SNik Clayton.Ft struct mbuf *
1081af4a585SAndriy Voskoboinyk.Fn m_dup "const struct mbuf *mbuf" "int how"
109de06f907SNik Clayton.Ft void
1100d8e4c57SBruce Evans.Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
111de06f907SNik Clayton.Ft void
112de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
113de06f907SNik Clayton.Ft struct mbuf *
114de06f907SNik Clayton.Fo m_devget
115de06f907SNik Clayton.Fa "char *buf"
116de06f907SNik Clayton.Fa "int len"
117de06f907SNik Clayton.Fa "int offset"
118de06f907SNik Clayton.Fa "struct ifnet *ifp"
119de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)"
120de06f907SNik Clayton.Fc
121de06f907SNik Clayton.Ft void
122de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n"
123a3f6b029SMark Johnston.Ft void
124a3f6b029SMark Johnston.Fn m_catpkt "struct mbuf *m" "struct mbuf *n"
125e60fa837SRuslan Ermilov.Ft u_int
1260b1c0994SPoul-Henning Kamp.Fn m_fixhdr "struct mbuf *mbuf"
1271af4a585SAndriy Voskoboinyk.Ft int
1281af4a585SAndriy Voskoboinyk.Fn m_dup_pkthdr "struct mbuf *to" "const struct mbuf *from" "int how"
129da72b998SYaroslav Tykhiy.Ft void
130da72b998SYaroslav Tykhiy.Fn m_move_pkthdr "struct mbuf *to" "struct mbuf *from"
131e60fa837SRuslan Ermilov.Ft u_int
1320b1c0994SPoul-Henning Kamp.Fn m_length "struct mbuf *mbuf" "struct mbuf **last"
133de06f907SNik Clayton.Ft struct mbuf *
134de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how"
13502312219SBruce M Simpson.Ft int
13602312219SBruce M Simpson.Fn m_apply "struct mbuf *mbuf" "int off" "int len" "int (*f)(void *arg, void *data, u_int len)" "void *arg"
13702312219SBruce M Simpson.Ft struct mbuf *
13802312219SBruce M Simpson.Fn m_getptr "struct mbuf *mbuf" "int loc" "int *off"
139a61bc764SMike Silbersack.Ft struct mbuf *
140a61bc764SMike Silbersack.Fn m_defrag "struct mbuf *m0" "int how"
14147e2996eSSam Leffler.Ft struct mbuf *
142f66b6464SMark Johnston.Fn m_collapse "struct mbuf *m0" "int how" "int maxfrags"
143f66b6464SMark Johnston.Ft struct mbuf *
14447e2996eSSam Leffler.Fn m_unshare "struct mbuf *m0" "int how"
145de06f907SNik Clayton.\"
146de06f907SNik Clayton.Sh DESCRIPTION
1477b2fd183SYaroslav TykhiyAn
1487b2fd183SYaroslav Tykhiy.Vt mbuf
1497b2fd183SYaroslav Tykhiyis a basic unit of memory management in the kernel IPC subsystem.
1507b2fd183SYaroslav TykhiyNetwork packets and socket buffers are stored in
1517b2fd183SYaroslav Tykhiy.Vt mbufs .
1527b2fd183SYaroslav TykhiyA network packet may span multiple
1537b2fd183SYaroslav Tykhiy.Vt mbufs
1547b2fd183SYaroslav Tykhiyarranged into a
1557b2fd183SYaroslav Tykhiy.Vt mbuf chain
156c4d9468eSRuslan Ermilov(linked list),
157de06f907SNik Claytonwhich allows adding or trimming
158bfd59721SBosko Milekicnetwork headers with little overhead.
159de06f907SNik Clayton.Pp
1607b2fd183SYaroslav TykhiyWhile a developer should not bother with
1617b2fd183SYaroslav Tykhiy.Vt mbuf
1627b2fd183SYaroslav Tykhiyinternals without serious
163de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it
1647b2fd183SYaroslav Tykhiyis useful to understand the general structure of an
1657b2fd183SYaroslav Tykhiy.Vt mbuf .
166de06f907SNik Clayton.Pp
1677b2fd183SYaroslav TykhiyAn
1687b2fd183SYaroslav Tykhiy.Vt mbuf
1697b2fd183SYaroslav Tykhiyconsists of a variable-sized header and a small internal
170e73145f6SSheldon Hearnbuffer for data.
1717b2fd183SYaroslav TykhiyThe total size of an
1727b2fd183SYaroslav Tykhiy.Vt mbuf ,
173bfd59721SBosko Milekic.Dv MSIZE ,
174feccf50cSAlex Dupreis a constant defined in
175feccf50cSAlex Dupre.In sys/param.h .
1767b2fd183SYaroslav TykhiyThe
1777b2fd183SYaroslav Tykhiy.Vt mbuf
1787b2fd183SYaroslav Tykhiyheader includes:
179238d9c59SYaroslav Tykhiy.Bl -tag -width "m_nextpkt" -offset indent
180be82a0bcSYaroslav Tykhiy.It Va m_next
181238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
182238d9c59SYaroslav TykhiyA pointer to the next
1837b2fd183SYaroslav Tykhiy.Vt mbuf
1847b2fd183SYaroslav Tykhiyin the
185238d9c59SYaroslav Tykhiy.Vt mbuf chain .
186be82a0bcSYaroslav Tykhiy.It Va m_nextpkt
187238d9c59SYaroslav Tykhiy.Pq Vt struct mbuf *
188238d9c59SYaroslav TykhiyA pointer to the next
1897b2fd183SYaroslav Tykhiy.Vt mbuf chain
190238d9c59SYaroslav Tykhiyin the queue.
191be82a0bcSYaroslav Tykhiy.It Va m_data
192238d9c59SYaroslav Tykhiy.Pq Vt caddr_t
193238d9c59SYaroslav TykhiyA pointer to data attached to this
194238d9c59SYaroslav Tykhiy.Vt mbuf .
195be82a0bcSYaroslav Tykhiy.It Va m_len
196238d9c59SYaroslav Tykhiy.Pq Vt int
197238d9c59SYaroslav TykhiyThe length of the data.
198be82a0bcSYaroslav Tykhiy.It Va m_type
199238d9c59SYaroslav Tykhiy.Pq Vt short
200238d9c59SYaroslav TykhiyThe type of the data.
201be82a0bcSYaroslav Tykhiy.It Va m_flags
202238d9c59SYaroslav Tykhiy.Pq Vt int
203238d9c59SYaroslav TykhiyThe
2047b2fd183SYaroslav Tykhiy.Vt mbuf
205238d9c59SYaroslav Tykhiyflags.
206de06f907SNik Clayton.El
207de06f907SNik Clayton.Pp
2087b2fd183SYaroslav TykhiyThe
2097b2fd183SYaroslav Tykhiy.Vt mbuf
2107b2fd183SYaroslav Tykhiyflag bits are defined as follows:
211de06f907SNik Clayton.Bd -literal
21233d8df4bSKevin Lo#define	M_EXT		0x00000001 /* has associated external storage */
21333d8df4bSKevin Lo#define	M_PKTHDR	0x00000002 /* start of record */
21433d8df4bSKevin Lo#define	M_EOR		0x00000004 /* end of record */
21533d8df4bSKevin Lo#define	M_RDONLY	0x00000008 /* associated data marked read-only */
216*82334850SJohn Baldwin#define	M_NOMAP		0x00000100 /* mbuf data is unmapped */
21777312354SJohn Baldwin#define	M_NOFREE	0x00000200 /* do not free mbuf, embedded in cluster */
21877312354SJohn Baldwin#define	M_BCAST		0x00000010 /* send/received as link-level broadcast */
21977312354SJohn Baldwin#define	M_MCAST		0x00000020 /* send/received as link-level multicast */
22077312354SJohn Baldwin#define	M_PROMISC	0x00000040 /* packet was not for us */
22177312354SJohn Baldwin#define	M_VLANTAG	0x00000080 /* ether_vtag is valid */
22277312354SJohn Baldwin#define	M_TSTMP		0x00000400 /* rcv_tstmp field is valid */
22377312354SJohn Baldwin#define	M_TSTMP_HPREC	0x00000800 /* rcv_tstmp is high-prec, typically
22477312354SJohn Baldwin				      hw-stamped on port (useful for IEEE 1588
22577312354SJohn Baldwin				      and 802.1AS) */
22677312354SJohn Baldwin
22733d8df4bSKevin Lo#define	M_PROTO1	0x00001000 /* protocol-specific */
22833d8df4bSKevin Lo#define	M_PROTO2	0x00002000 /* protocol-specific */
22933d8df4bSKevin Lo#define	M_PROTO3	0x00004000 /* protocol-specific */
23033d8df4bSKevin Lo#define	M_PROTO4	0x00008000 /* protocol-specific */
23133d8df4bSKevin Lo#define	M_PROTO5	0x00010000 /* protocol-specific */
23233d8df4bSKevin Lo#define	M_PROTO6	0x00020000 /* protocol-specific */
23333d8df4bSKevin Lo#define	M_PROTO7	0x00040000 /* protocol-specific */
23433d8df4bSKevin Lo#define	M_PROTO8	0x00080000 /* protocol-specific */
23533d8df4bSKevin Lo#define	M_PROTO9	0x00100000 /* protocol-specific */
23633d8df4bSKevin Lo#define	M_PROTO10	0x00200000 /* protocol-specific */
23733d8df4bSKevin Lo#define	M_PROTO11	0x00400000 /* protocol-specific */
23833d8df4bSKevin Lo#define	M_PROTO12	0x00800000 /* protocol-specific */
239de06f907SNik Clayton.Ed
240de06f907SNik Clayton.Pp
2417b2fd183SYaroslav TykhiyThe available
2427b2fd183SYaroslav Tykhiy.Vt mbuf
2437b2fd183SYaroslav Tykhiytypes are defined as follows:
244de06f907SNik Clayton.Bd -literal
245de06f907SNik Clayton#define	MT_DATA		1	/* dynamic (data) allocation */
2461cb58a07SMaxim Konovalov#define	MT_HEADER	MT_DATA	/* packet header */
24777312354SJohn Baldwin
24877312354SJohn Baldwin#define	MT_VENDOR1	4	/* for vendor-internal use */
24977312354SJohn Baldwin#define	MT_VENDOR2	5	/* for vendor-internal use */
25077312354SJohn Baldwin#define	MT_VENDOR3	6	/* for vendor-internal use */
25177312354SJohn Baldwin#define	MT_VENDOR4	7	/* for vendor-internal use */
25277312354SJohn Baldwin
253de06f907SNik Clayton#define	MT_SONAME	8	/* socket name */
25477312354SJohn Baldwin
25577312354SJohn Baldwin#define	MT_EXP1		9	/* for experimental use */
25677312354SJohn Baldwin#define	MT_EXP2		10	/* for experimental use */
25777312354SJohn Baldwin#define	MT_EXP3		11	/* for experimental use */
25877312354SJohn Baldwin#define	MT_EXP4		12	/* for experimental use */
25977312354SJohn Baldwin
260de06f907SNik Clayton#define	MT_CONTROL	14	/* extra-data protocol message */
26177312354SJohn Baldwin#define	MT_EXTCONTROL	15	/* control message with externalized contents */
26277312354SJohn Baldwin#define	MT_OOBDATA	16	/* expedited data  */
263de06f907SNik Clayton.Ed
264de06f907SNik Clayton.Pp
265c3a2dbe9SDag-Erling SmørgravThe available external buffer types are defined as follows:
266c3a2dbe9SDag-Erling Smørgrav.Bd -literal
267c3a2dbe9SDag-Erling Smørgrav#define	EXT_CLUSTER	1	/* mbuf cluster */
268c3a2dbe9SDag-Erling Smørgrav#define	EXT_SFBUF	2	/* sendfile(2)'s sf_bufs */
269c3a2dbe9SDag-Erling Smørgrav#define	EXT_JUMBOP	3	/* jumbo cluster 4096 bytes */
270c3a2dbe9SDag-Erling Smørgrav#define	EXT_JUMBO9	4	/* jumbo cluster 9216 bytes */
271c3a2dbe9SDag-Erling Smørgrav#define	EXT_JUMBO16	5	/* jumbo cluster 16184 bytes */
272c3a2dbe9SDag-Erling Smørgrav#define	EXT_PACKET	6	/* mbuf+cluster from packet zone */
273a951a788SKevin Lo#define	EXT_MBUF	7	/* external mbuf reference */
27477312354SJohn Baldwin#define	EXT_RXRING	8	/* data in NIC receive ring */
275*82334850SJohn Baldwin#define	EXT_PGS		9	/* array of unmapped pages */
27677312354SJohn Baldwin
27777312354SJohn Baldwin#define	EXT_VENDOR1	224	/* for vendor-internal use */
27877312354SJohn Baldwin#define	EXT_VENDOR2	225	/* for vendor-internal use */
27977312354SJohn Baldwin#define	EXT_VENDOR3	226	/* for vendor-internal use */
28077312354SJohn Baldwin#define	EXT_VENDOR4	227	/* for vendor-internal use */
28177312354SJohn Baldwin
28277312354SJohn Baldwin#define	EXT_EXP1	244	/* for experimental use */
28377312354SJohn Baldwin#define	EXT_EXP2	245	/* for experimental use */
28477312354SJohn Baldwin#define	EXT_EXP3	246	/* for experimental use */
28577312354SJohn Baldwin#define	EXT_EXP4	247	/* for experimental use */
28677312354SJohn Baldwin
28733d8df4bSKevin Lo#define	EXT_NET_DRV	252	/* custom ext_buf provided by net driver(s) */
28833d8df4bSKevin Lo#define	EXT_MOD_TYPE	253	/* custom module's ext_buf type */
28933d8df4bSKevin Lo#define	EXT_DISPOSABLE	254	/* can throw this buffer away w/page flipping */
29033d8df4bSKevin Lo#define	EXT_EXTREF	255	/* has externally maintained ref_cnt ptr */
291c3a2dbe9SDag-Erling Smørgrav.Ed
292c3a2dbe9SDag-Erling Smørgrav.Pp
293de06f907SNik ClaytonIf the
294de06f907SNik Clayton.Dv M_PKTHDR
295de06f907SNik Claytonflag is set, a
2967b2fd183SYaroslav Tykhiy.Vt struct pkthdr Va m_pkthdr
2977b2fd183SYaroslav Tykhiyis added to the
2987b2fd183SYaroslav Tykhiy.Vt mbuf
2997b2fd183SYaroslav Tykhiyheader.
300e73145f6SSheldon HearnIt contains a pointer to the interface
301de06f907SNik Claytonthe packet has been received from
3027b2fd183SYaroslav Tykhiy.Pq Vt struct ifnet Va *rcvif ,
303de06f907SNik Claytonand the total packet length
3047b2fd183SYaroslav Tykhiy.Pq Vt int Va len .
305e85cc3f5SRuslan ErmilovOptionally, it may also contain an attached list of packet tags
306e85cc3f5SRuslan Ermilov.Pq Vt "struct m_tag" .
307e85cc3f5SRuslan ErmilovSee
308e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
309e85cc3f5SRuslan Ermilovfor details.
3100193eb5eSYaroslav TykhiyFields used in offloading checksum calculation to the hardware are kept in
3110193eb5eSYaroslav Tykhiy.Va m_pkthdr
3120193eb5eSYaroslav Tykhiyas well.
3130193eb5eSYaroslav TykhiySee
3140193eb5eSYaroslav Tykhiy.Sx HARDWARE-ASSISTED CHECKSUM CALCULATION
3150193eb5eSYaroslav Tykhiyfor details.
316de06f907SNik Clayton.Pp
3177b2fd183SYaroslav TykhiyIf small enough, data is stored in the internal data buffer of an
3187b2fd183SYaroslav Tykhiy.Vt mbuf .
3197b2fd183SYaroslav TykhiyIf the data is sufficiently large, another
3207b2fd183SYaroslav Tykhiy.Vt mbuf
3217b2fd183SYaroslav Tykhiymay be added to the
3227b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
3237b2fd183SYaroslav Tykhiyor external storage may be associated with the
3247b2fd183SYaroslav Tykhiy.Vt mbuf .
325de06f907SNik Clayton.Dv MHLEN
3267b2fd183SYaroslav Tykhiybytes of data can fit into an
3277b2fd183SYaroslav Tykhiy.Vt mbuf
3287b2fd183SYaroslav Tykhiywith the
329de06f907SNik Clayton.Dv M_PKTHDR
330de06f907SNik Claytonflag set,
331de06f907SNik Clayton.Dv MLEN
332de06f907SNik Claytonbytes can otherwise.
333de06f907SNik Clayton.Pp
3347b2fd183SYaroslav TykhiyIf external storage is being associated with an
3357b2fd183SYaroslav Tykhiy.Vt mbuf ,
3367b2fd183SYaroslav Tykhiythe
337be82a0bcSYaroslav Tykhiy.Va m_ext
33825f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer.
339e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage,
340e73145f6SSheldon Hearna pointer to a function used for freeing the storage,
341e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function,
342e73145f6SSheldon Hearnand a pointer to a reference counter.
3437b2fd183SYaroslav TykhiyAn
3447b2fd183SYaroslav Tykhiy.Vt mbuf
3457b2fd183SYaroslav Tykhiyusing external storage has the
346de06f907SNik Clayton.Dv M_EXT
347de06f907SNik Claytonflag set.
348de06f907SNik Clayton.Pp
349bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage
350bfd59721SBosko Milekicbuffer,
351bfd59721SBosko Milekic.Dv MEXTADD .
352bfd59721SBosko Milekic.Pp
353bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the
354e73145f6SSheldon Hearnsubsystem.
355bfd59721SBosko Milekic.Pp
356bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an
3577b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3587b2fd183SYaroslav Tykhiy.Vt Mbuf clusters
3597b2fd183SYaroslav Tykhiycan be allocated and configured with the use of the
360bfd59721SBosko Milekic.Dv MCLGET
361e73145f6SSheldon Hearnmacro.
3627b2fd183SYaroslav TykhiyEach
3637b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3647b2fd183SYaroslav Tykhiyis
365de06f907SNik Clayton.Dv MCLBYTES
366bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant.
367bfd59721SBosko MilekicThe system defines an advisory macro
368de06f907SNik Clayton.Dv MINCLSIZE ,
3697b2fd183SYaroslav Tykhiywhich is the smallest amount of data to put into an
3707b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
3712e3ee239SKevin LoIt is equal to
3722e3ee239SKevin Lo.Dv MHLEN
3732e3ee239SKevin Loplus one.
3747b2fd183SYaroslav TykhiyIt is typically preferable to store data into the data region of an
3757b2fd183SYaroslav Tykhiy.Vt mbuf ,
3767b2fd183SYaroslav Tykhiyif size permits, as opposed to allocating a separate
3777b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3787b2fd183SYaroslav Tykhiyto hold the same data.
379de06f907SNik Clayton.\"
380de06f907SNik Clayton.Ss Macros and Functions
381bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the
382bfd59721SBosko Milekicdeveloper with common utilities.
383de06f907SNik Clayton.\"
384de06f907SNik Clayton.Bl -ohang -offset indent
385de06f907SNik Clayton.It Fn mtod mbuf type
3867b2fd183SYaroslav TykhiyConvert an
3877b2fd183SYaroslav Tykhiy.Fa mbuf
3887b2fd183SYaroslav Tykhiypointer to a data pointer.
389d31a9760SJohn-Mark GurneyThe macro expands to the data pointer cast to the specified
3907b2fd183SYaroslav Tykhiy.Fa type .
391de06f907SNik Clayton.Sy Note :
3927b2fd183SYaroslav TykhiyIt is advisable to ensure that there is enough contiguous data in
3937b2fd183SYaroslav Tykhiy.Fa mbuf .
394de06f907SNik ClaytonSee
395de06f907SNik Clayton.Fn m_pullup
396de06f907SNik Claytonfor details.
397de06f907SNik Clayton.It Fn MGET mbuf how type
3987b2fd183SYaroslav TykhiyAllocate an
3997b2fd183SYaroslav Tykhiy.Vt mbuf
4007b2fd183SYaroslav Tykhiyand initialize it to contain internal data.
40125f1a2e9SSheldon Hearn.Fa mbuf
4027b2fd183SYaroslav Tykhiywill point to the allocated
4037b2fd183SYaroslav Tykhiy.Vt mbuf
4047b2fd183SYaroslav Tykhiyon success, or be set to
405de06f907SNik Clayton.Dv NULL
406e73145f6SSheldon Hearnon failure.
407e73145f6SSheldon HearnThe
408de06f907SNik Clayton.Fa how
409de06f907SNik Claytonargument is to be set to
410fa05d215SGleb Smirnoff.Dv M_WAITOK
411de06f907SNik Claytonor
412fa05d215SGleb Smirnoff.Dv M_NOWAIT .
41325f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary.
4147b2fd183SYaroslav TykhiyA number of other functions and macros related to
4157b2fd183SYaroslav Tykhiy.Vt mbufs
4167b2fd183SYaroslav Tykhiyhave the same argument because they may
4177b2fd183SYaroslav Tykhiyat some point need to allocate new
4187b2fd183SYaroslav Tykhiy.Vt mbufs .
419de06f907SNik Clayton.It Fn MGETHDR mbuf how type
4207b2fd183SYaroslav TykhiyAllocate an
4217b2fd183SYaroslav Tykhiy.Vt mbuf
4227b2fd183SYaroslav Tykhiyand initialize it to contain a packet header
423e73145f6SSheldon Hearnand internal data.
424e73145f6SSheldon HearnSee
425de06f907SNik Clayton.Fn MGET
426de06f907SNik Claytonfor details.
427c3a2dbe9SDag-Erling Smørgrav.It Fn MEXTADD mbuf buf size free opt_arg1 opt_arg2 flags type
428c3a2dbe9SDag-Erling SmørgravAssociate externally managed data with
429c3a2dbe9SDag-Erling Smørgrav.Fa mbuf .
430c3a2dbe9SDag-Erling SmørgravAny internal data contained in the mbuf will be discarded, and the
43173bbeaa5SGlen Barber.Dv M_EXT
43273bbeaa5SGlen Barberflag will be set.
433c3a2dbe9SDag-Erling SmørgravThe
434c3a2dbe9SDag-Erling Smørgrav.Fa buf
435c3a2dbe9SDag-Erling Smørgravand
436c3a2dbe9SDag-Erling Smørgrav.Fa size
437c3a2dbe9SDag-Erling Smørgravarguments are the address and length, respectively, of the data.
438c3a2dbe9SDag-Erling SmørgravThe
439c3a2dbe9SDag-Erling Smørgrav.Fa free
440c3a2dbe9SDag-Erling Smørgravargument points to a function which will be called to free the data
441c3a2dbe9SDag-Erling Smørgravwhen the mbuf is freed; it is only used if
442c3a2dbe9SDag-Erling Smørgrav.Fa type
443c3a2dbe9SDag-Erling Smørgravis
444c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
445c3a2dbe9SDag-Erling SmørgravThe
446c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg1
447c3a2dbe9SDag-Erling Smørgravand
448c3a2dbe9SDag-Erling Smørgrav.Fa opt_arg2
449e8fd18f3SGleb Smirnoffarguments will be saved in
450e8fd18f3SGleb Smirnoff.Va ext_arg1
451e8fd18f3SGleb Smirnoffand
452e8fd18f3SGleb Smirnoff.Va ext_arg2
453e8fd18f3SGleb Smirnofffields of the
454e8fd18f3SGleb Smirnoff.Va struct m_ext
455e8fd18f3SGleb Smirnoffof the mbuf.
456c3a2dbe9SDag-Erling SmørgravThe
457c3a2dbe9SDag-Erling Smørgrav.Fa flags
458c3a2dbe9SDag-Erling Smørgravargument specifies additional
459c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
460c3a2dbe9SDag-Erling Smørgravflags; it is not necessary to specify
461c3a2dbe9SDag-Erling Smørgrav.Dv M_EXT .
462c3a2dbe9SDag-Erling SmørgravFinally, the
463c3a2dbe9SDag-Erling Smørgrav.Fa type
464c3a2dbe9SDag-Erling Smørgravargument specifies the type of external data, which controls how it
465c3a2dbe9SDag-Erling Smørgravwill be disposed of when the
466c3a2dbe9SDag-Erling Smørgrav.Vt mbuf
467c3a2dbe9SDag-Erling Smørgravis freed.
468c3a2dbe9SDag-Erling SmørgravIn most cases, the correct value is
469c3a2dbe9SDag-Erling Smørgrav.Dv EXT_EXTREF .
470de06f907SNik Clayton.It Fn MCLGET mbuf how
4717b2fd183SYaroslav TykhiyAllocate and attach an
4727b2fd183SYaroslav Tykhiy.Vt mbuf cluster
4737b2fd183SYaroslav Tykhiyto
4747b2fd183SYaroslav Tykhiy.Fa mbuf .
4752a8c860fSRobert WatsonOn success, a non-zero value returned; otherwise, 0.
4762a8c860fSRobert WatsonHistorically, consumers would check for success by testing the
477de06f907SNik Clayton.Dv M_EXT
4782a8c860fSRobert Watsonflag on the mbuf, but this is now discouraged to avoid unnecessary awareness
4792a8c860fSRobert Watsonof the implementation of external storage in protocol stacks and device
4802a8c860fSRobert Watsondrivers.
481da72b998SYaroslav Tykhiy.It Fn M_ALIGN mbuf len
482da72b998SYaroslav TykhiySet the pointer
483da72b998SYaroslav Tykhiy.Fa mbuf->m_data
484da72b998SYaroslav Tykhiyto place an object of the size
485da72b998SYaroslav Tykhiy.Fa len
486da72b998SYaroslav Tykhiyat the end of the internal data area of
487da72b998SYaroslav Tykhiy.Fa mbuf ,
488da72b998SYaroslav Tykhiylong word aligned.
489da72b998SYaroslav TykhiyApplicable only if
490da72b998SYaroslav Tykhiy.Fa mbuf
491da72b998SYaroslav Tykhiyis newly allocated with
492da72b998SYaroslav Tykhiy.Fn MGET
493da72b998SYaroslav Tykhiyor
494da72b998SYaroslav Tykhiy.Fn m_get .
495da72b998SYaroslav Tykhiy.It Fn MH_ALIGN mbuf len
496da72b998SYaroslav TykhiyServes the same purpose as
497da72b998SYaroslav Tykhiy.Fn M_ALIGN
498da72b998SYaroslav Tykhiydoes, but only for
499da72b998SYaroslav Tykhiy.Fa mbuf
500da72b998SYaroslav Tykhiynewly allocated with
501da72b998SYaroslav Tykhiy.Fn MGETHDR
502da72b998SYaroslav Tykhiyor
503da72b998SYaroslav Tykhiy.Fn m_gethdr ,
504da72b998SYaroslav Tykhiyor initialized by
505da72b998SYaroslav Tykhiy.Fn m_dup_pkthdr
506da72b998SYaroslav Tykhiyor
507da72b998SYaroslav Tykhiy.Fn m_move_pkthdr .
5089c3fd404SSam Leffler.It Fn m_align mbuf len
5099c3fd404SSam LefflerServices the same purpose as
5109c3fd404SSam Leffler.Fn M_ALIGN
5119c3fd404SSam Lefflerbut handles any type of mbuf.
512da72b998SYaroslav Tykhiy.It Fn M_LEADINGSPACE mbuf
513da72b998SYaroslav TykhiyReturns the number of bytes available before the beginning
514da72b998SYaroslav Tykhiyof data in
515da72b998SYaroslav Tykhiy.Fa mbuf .
516da72b998SYaroslav Tykhiy.It Fn M_TRAILINGSPACE mbuf
517da72b998SYaroslav TykhiyReturns the number of bytes available after the end of data in
518da72b998SYaroslav Tykhiy.Fa mbuf .
519de06f907SNik Clayton.It Fn M_PREPEND mbuf len how
5207b2fd183SYaroslav TykhiyThis macro operates on an
5217b2fd183SYaroslav Tykhiy.Vt mbuf chain .
522de06f907SNik ClaytonIt is an optimized wrapper for
523de06f907SNik Clayton.Fn m_prepend
524de06f907SNik Claytonthat can make use of possible empty space before data
5255203edcdSRuslan Ermilov(e.g.\& left after trimming of a link-layer header).
5267b2fd183SYaroslav TykhiyThe new
5277b2fd183SYaroslav Tykhiy.Vt mbuf chain
5287b2fd183SYaroslav Tykhiypointer or
529de06f907SNik Clayton.Dv NULL
530de06f907SNik Claytonis in
531de06f907SNik Clayton.Fa mbuf
532de06f907SNik Claytonafter the call.
533da72b998SYaroslav Tykhiy.It Fn M_MOVE_PKTHDR to from
534da72b998SYaroslav TykhiyUsing this macro is equivalent to calling
535da72b998SYaroslav Tykhiy.Fn m_move_pkthdr to from .
5365d4050ccSBosko Milekic.It Fn M_WRITABLE mbuf
5377b2fd183SYaroslav TykhiyThis macro will evaluate true if
5387b2fd183SYaroslav Tykhiy.Fa mbuf
5397b2fd183SYaroslav Tykhiyis not marked
5405d4050ccSBosko Milekic.Dv M_RDONLY
5417b2fd183SYaroslav Tykhiyand if either
5427b2fd183SYaroslav Tykhiy.Fa mbuf
5437b2fd183SYaroslav Tykhiydoes not contain external storage or,
5445d4050ccSBosko Milekicif it does,
5455d4050ccSBosko Milekicthen if the reference count of the storage is not greater than 1.
5465d4050ccSBosko MilekicThe
5475d4050ccSBosko Milekic.Dv M_RDONLY
5487b2fd183SYaroslav Tykhiyflag can be set in
5497b2fd183SYaroslav Tykhiy.Fa mbuf->m_flags .
5505d4050ccSBosko MilekicThis can be achieved during setup of the external storage,
5515d4050ccSBosko Milekicby passing the
5525d4050ccSBosko Milekic.Dv M_RDONLY
5535d4050ccSBosko Milekicbit as a
5540b39b3ffSRuslan Ermilov.Fa flags
5555d4050ccSBosko Milekicargument to the
5565d4050ccSBosko Milekic.Fn MEXTADD
5577b2fd183SYaroslav Tykhiymacro, or can be directly set in individual
5587b2fd183SYaroslav Tykhiy.Vt mbufs .
559da72b998SYaroslav Tykhiy.It Fn MCHTYPE mbuf type
560da72b998SYaroslav TykhiyChange the type of
561da72b998SYaroslav Tykhiy.Fa mbuf
562da72b998SYaroslav Tykhiyto
563da72b998SYaroslav Tykhiy.Fa type .
564da72b998SYaroslav TykhiyThis is a relatively expensive operation and should be avoided.
565de06f907SNik Clayton.El
566de06f907SNik Clayton.Pp
567de06f907SNik ClaytonThe functions are:
568de06f907SNik Clayton.Bl -ohang -offset indent
569de06f907SNik Clayton.It Fn m_get how type
570de06f907SNik ClaytonA function version of
571bfd59721SBosko Milekic.Fn MGET
572bfd59721SBosko Milekicfor non-critical paths.
57318f169afSKevin Lo.It Fn m_get2 size how type flags
57418f169afSKevin LoAllocate an
57518f169afSKevin Lo.Vt mbuf
57618f169afSKevin Lowith enough space to hold specified amount of data.
577328c0bbcSBosko Milekic.It Fn m_getm orig len how type
578328c0bbcSBosko MilekicAllocate
5790b39b3ffSRuslan Ermilov.Fa len
5807b2fd183SYaroslav Tykhiybytes worth of
5817b2fd183SYaroslav Tykhiy.Vt mbufs
5827b2fd183SYaroslav Tykhiyand
5837b2fd183SYaroslav Tykhiy.Vt mbuf clusters
5847b2fd183SYaroslav Tykhiyif necessary and append the resulting allocated
5857b2fd183SYaroslav Tykhiy.Vt mbuf chain
5867b2fd183SYaroslav Tykhiyto the
5877b2fd183SYaroslav Tykhiy.Vt mbuf chain
5887b2fd183SYaroslav Tykhiy.Fa orig ,
5897b2fd183SYaroslav Tykhiyif it is
5900b39b3ffSRuslan Ermilov.No non- Ns Dv NULL .
591328c0bbcSBosko MilekicIf the allocation fails at any point,
5920b39b3ffSRuslan Ermilovfree whatever was allocated and return
5930b39b3ffSRuslan Ermilov.Dv NULL .
594328c0bbcSBosko MilekicIf
5950b39b3ffSRuslan Ermilov.Fa orig
5960b39b3ffSRuslan Ermilovis
5970b39b3ffSRuslan Ermilov.No non- Ns Dv NULL ,
598328c0bbcSBosko Milekicit will not be freed.
599328c0bbcSBosko MilekicIt is possible to use
600328c0bbcSBosko Milekic.Fn m_getm
601328c0bbcSBosko Milekicto either append
6020b39b3ffSRuslan Ermilov.Fa len
6037b2fd183SYaroslav Tykhiybytes to an existing
6047b2fd183SYaroslav Tykhiy.Vt mbuf
6057b2fd183SYaroslav Tykhiyor
6067b2fd183SYaroslav Tykhiy.Vt mbuf chain
607328c0bbcSBosko Milekic(for example, one which may be sitting in a pre-allocated ring)
6087b2fd183SYaroslav Tykhiyor to simply perform an all-or-nothing
6097b2fd183SYaroslav Tykhiy.Vt mbuf
6107b2fd183SYaroslav Tykhiyand
6117b2fd183SYaroslav Tykhiy.Vt mbuf cluster
6127b2fd183SYaroslav Tykhiyallocation.
613de06f907SNik Clayton.It Fn m_gethdr how type
614de06f907SNik ClaytonA function version of
615bfd59721SBosko Milekic.Fn MGETHDR
616bfd59721SBosko Milekicfor non-critical paths.
6176c013706SMaxim Konovalov.It Fn m_getcl how type flags
6186c013706SMaxim KonovalovFetch an
6196c013706SMaxim Konovalov.Vt mbuf
6206c013706SMaxim Konovalovwith a
6216c013706SMaxim Konovalov.Vt mbuf cluster
6226c013706SMaxim Konovalovattached to it.
6236c013706SMaxim KonovalovIf one of the allocations fails, the entire allocation fails.
6246c013706SMaxim KonovalovThis routine is the preferred way of fetching both the
6256c013706SMaxim Konovalov.Vt mbuf
6266c013706SMaxim Konovalovand
6276c013706SMaxim Konovalov.Vt mbuf cluster
6286c013706SMaxim Konovalovtogether, as it avoids having to unlock/relock between allocations.
6296c013706SMaxim KonovalovReturns
6306c013706SMaxim Konovalov.Dv NULL
6316c013706SMaxim Konovalovon failure.
6325c35eb22SJohn-Mark Gurney.It Fn m_getjcl how type flags size
6335c35eb22SJohn-Mark GurneyThis is like
6345c35eb22SJohn-Mark Gurney.Fn m_getcl
6355c35eb22SJohn-Mark Gurneybut it the size of the cluster allocated will be large enough for
6365c35eb22SJohn-Mark Gurney.Fa size
6375c35eb22SJohn-Mark Gurneybytes.
63801e7fdafSMaxim Konovalov.It Fn m_free mbuf
63901e7fdafSMaxim KonovalovFrees
64001e7fdafSMaxim Konovalov.Vt mbuf .
641b7131a26SJohn-Mark GurneyReturns
642b7131a26SJohn-Mark Gurney.Va m_next
643b7131a26SJohn-Mark Gurneyof the freed
644b7131a26SJohn-Mark Gurney.Vt mbuf .
645de06f907SNik Clayton.El
646de06f907SNik Clayton.Pp
6477b2fd183SYaroslav TykhiyThe functions below operate on
6487b2fd183SYaroslav Tykhiy.Vt mbuf chains .
649de06f907SNik Clayton.Bl -ohang -offset indent
650de06f907SNik Clayton.It Fn m_freem mbuf
6517b2fd183SYaroslav TykhiyFree an entire
6527b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6537b2fd183SYaroslav Tykhiyincluding any external storage.
654de06f907SNik Clayton.\"
655de06f907SNik Clayton.It Fn m_adj mbuf len
656de06f907SNik ClaytonTrim
657de06f907SNik Clayton.Fa len
6587b2fd183SYaroslav Tykhiybytes from the head of an
6597b2fd183SYaroslav Tykhiy.Vt mbuf chain
6607b2fd183SYaroslav Tykhiyif
661de06f907SNik Clayton.Fa len
662de06f907SNik Claytonis positive, from the tail otherwise.
663de06f907SNik Clayton.\"
664b9def06bSSam Leffler.It Fn m_append mbuf len cp
665b9def06bSSam LefflerAppend
666b9def06bSSam Leffler.Vt len
667b9def06bSSam Lefflerbytes of data
668b9def06bSSam Leffler.Vt cp
669b9def06bSSam Lefflerto the
670b9def06bSSam Leffler.Vt mbuf chain .
671b9def06bSSam LefflerExtend the mbuf chain if the new data does not fit in
672b9def06bSSam Lefflerexisting space.
673b9def06bSSam Leffler.\"
674de06f907SNik Clayton.It Fn m_prepend mbuf len how
6757b2fd183SYaroslav TykhiyAllocate a new
6767b2fd183SYaroslav Tykhiy.Vt mbuf
6777b2fd183SYaroslav Tykhiyand prepend it to the
6787b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6797b2fd183SYaroslav Tykhiyhandle
680de06f907SNik Clayton.Dv M_PKTHDR
681de06f907SNik Claytonproperly.
682de06f907SNik Clayton.Sy Note :
6830227791bSRuslan ErmilovIt does not allocate any
6847b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
6857b2fd183SYaroslav Tykhiyso
686de06f907SNik Clayton.Fa len
687de06f907SNik Claytonmust be less than
688de06f907SNik Clayton.Dv MLEN
689de06f907SNik Claytonor
690de06f907SNik Clayton.Dv MHLEN ,
691de06f907SNik Claytondepending on the
692d0353b83SRuslan Ermilov.Dv M_PKTHDR
693d0353b83SRuslan Ermilovflag setting.
694de06f907SNik Clayton.\"
6957ac139a9SJohn-Mark Gurney.It Fn m_copyup mbuf len dstoff
6967ac139a9SJohn-Mark GurneySimilar to
6977ac139a9SJohn-Mark Gurney.Fn m_pullup
6987ac139a9SJohn-Mark Gurneybut copies
6997ac139a9SJohn-Mark Gurney.Fa len
7007ac139a9SJohn-Mark Gurneybytes of data into a new mbuf at
7017ac139a9SJohn-Mark Gurney.Fa dstoff
7027ac139a9SJohn-Mark Gurneybytes into the mbuf.
7037ac139a9SJohn-Mark GurneyThe
7047ac139a9SJohn-Mark Gurney.Fa dstoff
7057ac139a9SJohn-Mark Gurneyargument aligns the data and leaves room for a link layer header.
7064f068961SRuslan ErmilovReturns the new
7077ac139a9SJohn-Mark Gurney.Vt mbuf chain
7087ac139a9SJohn-Mark Gurneyon success,
7097ac139a9SJohn-Mark Gurneyand frees the
7107ac139a9SJohn-Mark Gurney.Vt mbuf chain
7117ac139a9SJohn-Mark Gurneyand returns
7127ac139a9SJohn-Mark Gurney.Dv NULL
7137ac139a9SJohn-Mark Gurneyon failure.
7147ac139a9SJohn-Mark Gurney.Sy Note :
7157ac139a9SJohn-Mark GurneyThe function does not allocate
7167ac139a9SJohn-Mark Gurney.Vt mbuf clusters ,
7177ac139a9SJohn-Mark Gurneyso
7187ac139a9SJohn-Mark Gurney.Fa len + dstoff
7197ac139a9SJohn-Mark Gurneymust be less than
7207ac139a9SJohn-Mark Gurney.Dv MHLEN .
7217ac139a9SJohn-Mark Gurney.\"
722de06f907SNik Clayton.It Fn m_pullup mbuf len
723de06f907SNik ClaytonArrange that the first
724de06f907SNik Clayton.Fa len
7257b2fd183SYaroslav Tykhiybytes of an
7267b2fd183SYaroslav Tykhiy.Vt mbuf chain
7277b2fd183SYaroslav Tykhiyare contiguous and lay in the data area of
728de06f907SNik Clayton.Fa mbuf ,
729de06f907SNik Claytonso they are accessible with
730de06f907SNik Clayton.Fn mtod mbuf type .
7311009bd1bSJulian ElischerIt is important to remember that this may involve
7321009bd1bSJulian Elischerreallocating some mbufs and moving data so all pointers
7331009bd1bSJulian Elischerreferencing data within the old mbuf chain
7341009bd1bSJulian Elischermust be recalculated or made invalid.
7357b2fd183SYaroslav TykhiyReturn the new
7367b2fd183SYaroslav Tykhiy.Vt mbuf chain
7377b2fd183SYaroslav Tykhiyon success,
738de06f907SNik Clayton.Dv NULL
739de06f907SNik Claytonon failure
7407b2fd183SYaroslav Tykhiy(the
7417b2fd183SYaroslav Tykhiy.Vt mbuf chain
7427b2fd183SYaroslav Tykhiyis freed in this case).
743de06f907SNik Clayton.Sy Note :
7440227791bSRuslan ErmilovIt does not allocate any
7457b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
7467b2fd183SYaroslav Tykhiyso
747de06f907SNik Clayton.Fa len
748969ed8f7SKevin Lomust be less than or equal to
749de06f907SNik Clayton.Dv MHLEN .
750de06f907SNik Clayton.\"
751d305f4b9SBruce M Simpson.It Fn m_pulldown mbuf offset len offsetp
752d305f4b9SBruce M SimpsonArrange that
753d305f4b9SBruce M Simpson.Fa len
754d305f4b9SBruce M Simpsonbytes between
755d305f4b9SBruce M Simpson.Fa offset
756d305f4b9SBruce M Simpsonand
757d305f4b9SBruce M Simpson.Fa offset + len
758d305f4b9SBruce M Simpsonin the
759d305f4b9SBruce M Simpson.Vt mbuf chain
760d305f4b9SBruce M Simpsonare contiguous and lay in the data area of
761d305f4b9SBruce M Simpson.Fa mbuf ,
762d305f4b9SBruce M Simpsonso they are accessible with
763d305f4b9SBruce M Simpson.Fn mtod mbuf type .
76473bbeaa5SGlen Barber.Fa len
76573bbeaa5SGlen Barbermust be smaller than, or equal to, the size of an
766d305f4b9SBruce M Simpson.Vt mbuf cluster .
767d305f4b9SBruce M SimpsonReturn a pointer to an intermediate
768d305f4b9SBruce M Simpson.Vt mbuf
769d305f4b9SBruce M Simpsonin the chain containing the requested region;
770d305f4b9SBruce M Simpsonthe offset in the data region of the
771d305f4b9SBruce M Simpson.Vt mbuf chain
772d305f4b9SBruce M Simpsonto the data contained in the returned mbuf is stored in
773d305f4b9SBruce M Simpson.Fa *offsetp .
774d305f4b9SBruce M SimpsonIf
775e0912e08SJohn-Mark Gurney.Fa offsetp
776d305f4b9SBruce M Simpsonis NULL, the region may be accessed using
777d305f4b9SBruce M Simpson.Fn mtod mbuf type .
778d305f4b9SBruce M SimpsonIf
779e0912e08SJohn-Mark Gurney.Fa offsetp
780d305f4b9SBruce M Simpsonis non-NULL, the region may be accessed using
781e0912e08SJohn-Mark Gurney.Fn mtod mbuf uint8_t
782e0912e08SJohn-Mark Gurney+ *offsetp.
783d305f4b9SBruce M SimpsonThe region of the mbuf chain between its beginning and
784e0912e08SJohn-Mark Gurney.Fa offset
785d305f4b9SBruce M Simpsonis not modified, therefore it is safe to hold pointers to data within
786d305f4b9SBruce M Simpsonthis region before calling
787d305f4b9SBruce M Simpson.Fn m_pulldown .
788d305f4b9SBruce M Simpson.\"
789de06f907SNik Clayton.It Fn m_copym mbuf offset len how
7907b2fd183SYaroslav TykhiyMake a copy of an
7917b2fd183SYaroslav Tykhiy.Vt mbuf chain
7927b2fd183SYaroslav Tykhiystarting
793de06f907SNik Clayton.Fa offset
794de06f907SNik Claytonbytes from the beginning, continuing for
795de06f907SNik Clayton.Fa len
796e73145f6SSheldon Hearnbytes.
797e73145f6SSheldon HearnIf
798de06f907SNik Clayton.Fa len
799de06f907SNik Claytonis
800de06f907SNik Clayton.Dv M_COPYALL ,
8017b2fd183SYaroslav Tykhiycopy to the end of the
8027b2fd183SYaroslav Tykhiy.Vt mbuf chain .
803de06f907SNik Clayton.Sy Note :
8047b2fd183SYaroslav TykhiyThe copy is read-only, because the
8057b2fd183SYaroslav Tykhiy.Vt mbuf clusters
8067b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
807de06f907SNik Clayton.\"
808de06f907SNik Clayton.It Fn m_copypacket mbuf how
809de06f907SNik ClaytonCopy an entire packet including header, which must be present.
810de06f907SNik ClaytonThis is an optimized version of the common case
811de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how .
812de06f907SNik Clayton.Sy Note :
8137b2fd183SYaroslav Tykhiythe copy is read-only, because the
8147b2fd183SYaroslav Tykhiy.Vt mbuf clusters
8157b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
816de06f907SNik Clayton.\"
817de06f907SNik Clayton.It Fn m_dup mbuf how
8187b2fd183SYaroslav TykhiyCopy a packet header
8197b2fd183SYaroslav Tykhiy.Vt mbuf chain
8207b2fd183SYaroslav Tykhiyinto a completely new
8217b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8227b2fd183SYaroslav Tykhiyincluding copying any
8237b2fd183SYaroslav Tykhiy.Vt mbuf clusters .
824e73145f6SSheldon HearnUse this instead of
825de06f907SNik Clayton.Fn m_copypacket
8267b2fd183SYaroslav Tykhiywhen you need a writable copy of an
8277b2fd183SYaroslav Tykhiy.Vt mbuf chain .
828de06f907SNik Clayton.\"
829de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf
8307b2fd183SYaroslav TykhiyCopy data from an
8317b2fd183SYaroslav Tykhiy.Vt mbuf chain
8327b2fd183SYaroslav Tykhiystarting
833de06f907SNik Clayton.Fa off
834de06f907SNik Claytonbytes from the beginning, continuing for
835de06f907SNik Clayton.Fa len
836de06f907SNik Claytonbytes, into the indicated buffer
837de06f907SNik Clayton.Fa buf .
838de06f907SNik Clayton.\"
839de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf
840de06f907SNik ClaytonCopy
841de06f907SNik Clayton.Fa len
842de06f907SNik Claytonbytes from the buffer
843de06f907SNik Clayton.Fa buf
8447b2fd183SYaroslav Tykhiyback into the indicated
8457b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
846de06f907SNik Claytonstarting at
847de06f907SNik Clayton.Fa offset
8487b2fd183SYaroslav Tykhiybytes from the beginning of the
8497b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8507b2fd183SYaroslav Tykhiyextending the
8517b2fd183SYaroslav Tykhiy.Vt mbuf chain
8527b2fd183SYaroslav Tykhiyif necessary.
853de06f907SNik Clayton.Sy Note :
8540227791bSRuslan ErmilovIt does not allocate any
8557b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
8567b2fd183SYaroslav Tykhiyjust adds
8577b2fd183SYaroslav Tykhiy.Vt mbufs
8587b2fd183SYaroslav Tykhiyto the
8597b2fd183SYaroslav Tykhiy.Vt mbuf chain .
86036a142c4SRuslan ErmilovIt is safe to set
861de06f907SNik Clayton.Fa offset
8627b2fd183SYaroslav Tykhiybeyond the current
8637b2fd183SYaroslav Tykhiy.Vt mbuf chain
8647b2fd183SYaroslav Tykhiyend: zeroed
8657b2fd183SYaroslav Tykhiy.Vt mbufs
8667b2fd183SYaroslav Tykhiywill be allocated to fill the space.
867de06f907SNik Clayton.\"
8685d96084fSYaroslav Tykhiy.It Fn m_length mbuf last
8697b2fd183SYaroslav TykhiyReturn the length of the
8707b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
8717b2fd183SYaroslav Tykhiyand optionally a pointer to the last
8727b2fd183SYaroslav Tykhiy.Vt mbuf .
8730b1c0994SPoul-Henning Kamp.\"
874da72b998SYaroslav Tykhiy.It Fn m_dup_pkthdr to from how
875da72b998SYaroslav TykhiyUpon the function's completion, the
876da72b998SYaroslav Tykhiy.Vt mbuf
877da72b998SYaroslav Tykhiy.Fa to
878da72b998SYaroslav Tykhiywill contain an identical copy of
879da72b998SYaroslav Tykhiy.Fa from->m_pkthdr
880da72b998SYaroslav Tykhiyand the per-packet attributes found in the
881da72b998SYaroslav Tykhiy.Vt mbuf chain
882da72b998SYaroslav Tykhiy.Fa from .
883da72b998SYaroslav TykhiyThe
884da72b998SYaroslav Tykhiy.Vt mbuf
885da72b998SYaroslav Tykhiy.Fa from
886da72b998SYaroslav Tykhiymust have the flag
887da72b998SYaroslav Tykhiy.Dv M_PKTHDR
888da72b998SYaroslav Tykhiyinitially set, and
889da72b998SYaroslav Tykhiy.Fa to
890da72b998SYaroslav Tykhiymust be empty on entry.
891da72b998SYaroslav Tykhiy.\"
892da72b998SYaroslav Tykhiy.It Fn m_move_pkthdr to from
893da72b998SYaroslav TykhiyMove
894da72b998SYaroslav Tykhiy.Va m_pkthdr
895da72b998SYaroslav Tykhiyand the per-packet attributes from the
896da72b998SYaroslav Tykhiy.Vt mbuf chain
897da72b998SYaroslav Tykhiy.Fa from
898da72b998SYaroslav Tykhiyto the
899da72b998SYaroslav Tykhiy.Vt mbuf
900da72b998SYaroslav Tykhiy.Fa to .
901da72b998SYaroslav TykhiyThe
902da72b998SYaroslav Tykhiy.Vt mbuf
903da72b998SYaroslav Tykhiy.Fa from
904da72b998SYaroslav Tykhiymust have the flag
905da72b998SYaroslav Tykhiy.Dv M_PKTHDR
906da72b998SYaroslav Tykhiyinitially set, and
907da72b998SYaroslav Tykhiy.Fa to
908da72b998SYaroslav Tykhiymust be empty on entry.
909da72b998SYaroslav TykhiyUpon the function's completion,
910da72b998SYaroslav Tykhiy.Fa from
911da72b998SYaroslav Tykhiywill have the flag
912da72b998SYaroslav Tykhiy.Dv M_PKTHDR
913da72b998SYaroslav Tykhiyand the per-packet attributes cleared.
914da72b998SYaroslav Tykhiy.\"
9155d96084fSYaroslav Tykhiy.It Fn m_fixhdr mbuf
9167b2fd183SYaroslav TykhiySet the packet-header length to the length of the
9177b2fd183SYaroslav Tykhiy.Vt mbuf chain .
9180b1c0994SPoul-Henning Kamp.\"
919de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy
920de06f907SNik ClaytonCopy data from a device local memory pointed to by
921de06f907SNik Clayton.Fa buf
9227b2fd183SYaroslav Tykhiyto an
9237b2fd183SYaroslav Tykhiy.Vt mbuf chain .
924e73145f6SSheldon HearnThe copy is done using a specified copy routine
925de06f907SNik Clayton.Fa copy ,
926de06f907SNik Claytonor
927de06f907SNik Clayton.Fn bcopy
928de06f907SNik Claytonif
929de06f907SNik Clayton.Fa copy
930de06f907SNik Claytonis
931de06f907SNik Clayton.Dv NULL .
932de06f907SNik Clayton.\"
933de06f907SNik Clayton.It Fn m_cat m n
934de06f907SNik ClaytonConcatenate
935de06f907SNik Clayton.Fa n
936de06f907SNik Claytonto
937de06f907SNik Clayton.Fa m .
9387b2fd183SYaroslav TykhiyBoth
9397b2fd183SYaroslav Tykhiy.Vt mbuf chains
9407b2fd183SYaroslav Tykhiymust be of the same type.
941a3f6b029SMark Johnston.Fa n
942a3f6b029SMark Johnstonis not guaranteed to be valid after
943a3f6b029SMark Johnston.Fn m_cat
944a3f6b029SMark Johnstonreturns.
945a3f6b029SMark Johnston.Fn m_cat
946a3f6b029SMark Johnstondoes not update any packet header fields or free mbuf tags.
947a3f6b029SMark Johnston.\"
948a3f6b029SMark Johnston.It Fn m_catpkt m n
949a3f6b029SMark JohnstonA variant of
950a3f6b029SMark Johnston.Fn m_cat
951a3f6b029SMark Johnstonthat operates on packets.
952a3f6b029SMark JohnstonBoth
953a3f6b029SMark Johnston.Fa m
954a3f6b029SMark Johnstonand
955a3f6b029SMark Johnston.Fa n
956a3f6b029SMark Johnstonmust contain packet headers.
957a3f6b029SMark Johnston.Fa n
958a3f6b029SMark Johnstonis not guaranteed to be valid after
959a3f6b029SMark Johnston.Fn m_catpkt
960a3f6b029SMark Johnstonreturns.
961de06f907SNik Clayton.\"
962de06f907SNik Clayton.It Fn m_split mbuf len how
9637b2fd183SYaroslav TykhiyPartition an
9647b2fd183SYaroslav Tykhiy.Vt mbuf chain
9657b2fd183SYaroslav Tykhiyin two pieces, returning the tail:
966de06f907SNik Claytonall but the first
967de06f907SNik Clayton.Fa len
968e73145f6SSheldon Hearnbytes.
969e73145f6SSheldon HearnIn case of failure, it returns
970de06f907SNik Clayton.Dv NULL
9717b2fd183SYaroslav Tykhiyand attempts to restore the
9727b2fd183SYaroslav Tykhiy.Vt mbuf chain
9737b2fd183SYaroslav Tykhiyto its original state.
97402312219SBruce M Simpson.\"
97502312219SBruce M Simpson.It Fn m_apply mbuf off len f arg
97602312219SBruce M SimpsonApply a function to an
97702312219SBruce M Simpson.Vt mbuf chain ,
97802312219SBruce M Simpsonat offset
97902312219SBruce M Simpson.Fa off ,
98002312219SBruce M Simpsonfor length
981f48cbcdeSRuslan Ermilov.Fa len
982f48cbcdeSRuslan Ermilovbytes.
98302312219SBruce M SimpsonTypically used to avoid calls to
98402312219SBruce M Simpson.Fn m_pullup
98502312219SBruce M Simpsonwhich would otherwise be unnecessary or undesirable.
98602312219SBruce M Simpson.Fa arg
98702312219SBruce M Simpsonis a convenience argument which is passed to the callback function
98802312219SBruce M Simpson.Fa f .
98902312219SBruce M Simpson.Pp
99002312219SBruce M SimpsonEach time
99102312219SBruce M Simpson.Fn f
99202312219SBruce M Simpsonis called, it will be passed
99302312219SBruce M Simpson.Fa arg ,
99402312219SBruce M Simpsona pointer to the
99502312219SBruce M Simpson.Fa data
99602312219SBruce M Simpsonin the current mbuf, and the length
99702312219SBruce M Simpson.Fa len
99802312219SBruce M Simpsonof the data in this mbuf to which the function should be applied.
99902312219SBruce M Simpson.Pp
100002312219SBruce M SimpsonThe function should return zero to indicate success;
100102312219SBruce M Simpsonotherwise, if an error is indicated, then
100202312219SBruce M Simpson.Fn m_apply
100302312219SBruce M Simpsonwill return the error and stop iterating through the
100402312219SBruce M Simpson.Vt mbuf chain .
100502312219SBruce M Simpson.\"
100602312219SBruce M Simpson.It Fn m_getptr mbuf loc off
100702312219SBruce M SimpsonReturn a pointer to the mbuf containing the data located at
100802312219SBruce M Simpson.Fa loc
100902312219SBruce M Simpsonbytes from the beginning of the
101002312219SBruce M Simpson.Vt mbuf chain .
101102312219SBruce M SimpsonThe corresponding offset into the mbuf will be stored in
101202312219SBruce M Simpson.Fa *off .
1013a61bc764SMike Silbersack.It Fn m_defrag m0 how
1014f48cbcdeSRuslan ErmilovDefragment an mbuf chain, returning the shortest possible
1015bdf86185SMike Silbersackchain of mbufs and clusters.
1016bdf86185SMike SilbersackIf allocation fails and this can not be completed,
1017bdf86185SMike Silbersack.Dv NULL
1018bdf86185SMike Silbersackwill be returned and the original chain will be unchanged.
1019bdf86185SMike SilbersackUpon success, the original chain will be freed and the new
1020bdf86185SMike Silbersackchain will be returned.
1021a61bc764SMike Silbersack.Fa how
1022a61bc764SMike Silbersackshould be either
1023fa05d215SGleb Smirnoff.Dv M_WAITOK
1024a61bc764SMike Silbersackor
1025fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
1026a61bc764SMike Silbersackdepending on the caller's preference.
1027a61bc764SMike Silbersack.Pp
1028a61bc764SMike SilbersackThis function is especially useful in network drivers, where
1029a61bc764SMike Silbersackcertain long mbuf chains must be shortened before being added
1030a61bc764SMike Silbersackto TX descriptor lists.
1031f66b6464SMark Johnston.It Fn m_collapse m0 how maxfrags
1032f66b6464SMark JohnstonDefragment an mbuf chain, returning a chain of at most
1033f66b6464SMark Johnston.Fa maxfrags
1034f66b6464SMark Johnstonmbufs and clusters.
1035f66b6464SMark JohnstonIf allocation fails or the chain cannot be collapsed as requested,
1036f66b6464SMark Johnston.Dv NULL
1037f66b6464SMark Johnstonwill be returned, with the original chain possibly modified.
1038f66b6464SMark JohnstonAs with
1039f66b6464SMark Johnston.Fn m_defrag ,
1040f66b6464SMark Johnston.Fa how
1041f66b6464SMark Johnstonshould be one of
1042f66b6464SMark Johnston.Dv M_WAITOK
1043f66b6464SMark Johnstonor
1044f66b6464SMark Johnston.Dv M_NOWAIT .
104547e2996eSSam Leffler.It Fn m_unshare m0 how
104647e2996eSSam LefflerCreate a version of the specified mbuf chain whose
104747e2996eSSam Lefflercontents can be safely modified without affecting other users.
104847e2996eSSam LefflerIf allocation fails and this operation can not be completed,
104947e2996eSSam Leffler.Dv NULL
105047e2996eSSam Lefflerwill be returned.
105147e2996eSSam LefflerThe original mbuf chain is always reclaimed and the reference
105247e2996eSSam Lefflercount of any shared mbuf clusters is decremented.
105347e2996eSSam Leffler.Fa how
105447e2996eSSam Lefflershould be either
1055fa05d215SGleb Smirnoff.Dv M_WAITOK
105647e2996eSSam Leffleror
1057fa05d215SGleb Smirnoff.Dv M_NOWAIT ,
105847e2996eSSam Lefflerdepending on the caller's preference.
105947e2996eSSam LefflerAs a side-effect of this process the returned
106047e2996eSSam Lefflermbuf chain may be compacted.
106147e2996eSSam Leffler.Pp
106247e2996eSSam LefflerThis function is especially useful in the transmit path of
106347e2996eSSam Lefflernetwork code, when data must be encrypted or otherwise
106447e2996eSSam Leffleraltered prior to transmission.
10653136363fSRuslan Ermilov.El
10660193eb5eSYaroslav Tykhiy.Sh HARDWARE-ASSISTED CHECKSUM CALCULATION
10670193eb5eSYaroslav TykhiyThis section currently applies to TCP/IP only.
10680193eb5eSYaroslav TykhiyIn order to save the host CPU resources, computing checksums is
10690193eb5eSYaroslav Tykhiyoffloaded to the network interface hardware if possible.
10700193eb5eSYaroslav TykhiyThe
10710193eb5eSYaroslav Tykhiy.Va m_pkthdr
10720193eb5eSYaroslav Tykhiymember of the leading
10730193eb5eSYaroslav Tykhiy.Vt mbuf
10740193eb5eSYaroslav Tykhiyof a packet contains two fields used for that purpose,
10750193eb5eSYaroslav Tykhiy.Vt int Va csum_flags
10760193eb5eSYaroslav Tykhiyand
10770193eb5eSYaroslav Tykhiy.Vt int Va csum_data .
10780193eb5eSYaroslav TykhiyThe meaning of those fields depends on the direction a packet flows in,
10790193eb5eSYaroslav Tykhiyand on whether the packet is fragmented.
10800193eb5eSYaroslav TykhiyHenceforth,
10810193eb5eSYaroslav Tykhiy.Va csum_flags
10820193eb5eSYaroslav Tykhiyor
10830193eb5eSYaroslav Tykhiy.Va csum_data
10840193eb5eSYaroslav Tykhiyof a packet
10850193eb5eSYaroslav Tykhiywill denote the corresponding field of the
10860193eb5eSYaroslav Tykhiy.Va m_pkthdr
10870193eb5eSYaroslav Tykhiymember of the leading
10880193eb5eSYaroslav Tykhiy.Vt mbuf
10890193eb5eSYaroslav Tykhiyin the
10900193eb5eSYaroslav Tykhiy.Vt mbuf chain
10910193eb5eSYaroslav Tykhiycontaining the packet.
10920193eb5eSYaroslav Tykhiy.Pp
10930193eb5eSYaroslav TykhiyOn output, checksum offloading is attempted after the outgoing
10940193eb5eSYaroslav Tykhiyinterface has been determined for a packet.
10950193eb5eSYaroslav TykhiyThe interface-specific field
10960193eb5eSYaroslav Tykhiy.Va ifnet.if_data.ifi_hwassist
10970193eb5eSYaroslav Tykhiy(see
10980193eb5eSYaroslav Tykhiy.Xr ifnet 9 )
10990193eb5eSYaroslav Tykhiyis consulted for the capabilities of the interface to assist in
11000193eb5eSYaroslav Tykhiycomputing checksums.
11010193eb5eSYaroslav TykhiyThe
11020193eb5eSYaroslav Tykhiy.Va csum_flags
1103f48cbcdeSRuslan Ermilovfield of the packet header is set to indicate which actions the interface
11040193eb5eSYaroslav Tykhiyis supposed to perform on it.
11050193eb5eSYaroslav TykhiyThe actions unsupported by the network interface are done in the
11060193eb5eSYaroslav Tykhiysoftware prior to passing the packet down to the interface driver;
11070193eb5eSYaroslav Tykhiysuch actions will never be requested through
11080193eb5eSYaroslav Tykhiy.Va csum_flags .
11090193eb5eSYaroslav Tykhiy.Pp
11100193eb5eSYaroslav TykhiyThe flags demanding a particular action from an interface are as follows:
11110193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_TCP" -offset indent
11120193eb5eSYaroslav Tykhiy.It Dv CSUM_IP
11130193eb5eSYaroslav TykhiyThe IP header checksum is to be computed and stored in the
11140193eb5eSYaroslav Tykhiycorresponding field of the packet.
11150193eb5eSYaroslav TykhiyThe hardware is expected to know the format of an IP header
11160193eb5eSYaroslav Tykhiyto determine the offset of the IP checksum field.
11170193eb5eSYaroslav Tykhiy.It Dv CSUM_TCP
1118f48cbcdeSRuslan ErmilovThe TCP checksum is to be computed.
1119f48cbcdeSRuslan Ermilov(See below.)
11200193eb5eSYaroslav Tykhiy.It Dv CSUM_UDP
1121f48cbcdeSRuslan ErmilovThe UDP checksum is to be computed.
1122f48cbcdeSRuslan Ermilov(See below.)
11230193eb5eSYaroslav Tykhiy.El
11240193eb5eSYaroslav Tykhiy.Pp
1125fbde705aSYaroslav TykhiyShould a TCP or UDP checksum be offloaded to the hardware,
11260193eb5eSYaroslav Tykhiythe field
11270193eb5eSYaroslav Tykhiy.Va csum_data
11280193eb5eSYaroslav Tykhiywill contain the byte offset of the checksum field relative to the
11290193eb5eSYaroslav Tykhiyend of the IP header.
11300193eb5eSYaroslav TykhiyIn this case, the checksum field will be initially
11310193eb5eSYaroslav Tykhiyset by the TCP/IP module to the checksum of the pseudo header
1132fbde705aSYaroslav Tykhiydefined by the TCP and UDP specifications.
11330193eb5eSYaroslav Tykhiy.Pp
11340193eb5eSYaroslav TykhiyOn input, an interface indicates the actions it has performed
11350193eb5eSYaroslav Tykhiyon a packet by setting one or more of the following flags in
11360193eb5eSYaroslav Tykhiy.Va csum_flags
11370193eb5eSYaroslav Tykhiyassociated with the packet:
11380193eb5eSYaroslav Tykhiy.Bl -tag -width ".Dv CSUM_IP_CHECKED" -offset indent
11390193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_CHECKED
11400193eb5eSYaroslav TykhiyThe IP header checksum has been computed.
11410193eb5eSYaroslav Tykhiy.It Dv CSUM_IP_VALID
11420193eb5eSYaroslav TykhiyThe IP header has a valid checksum.
11430193eb5eSYaroslav TykhiyThis flag can appear only in combination with
11440193eb5eSYaroslav Tykhiy.Dv CSUM_IP_CHECKED .
11450193eb5eSYaroslav Tykhiy.It Dv CSUM_DATA_VALID
11460193eb5eSYaroslav TykhiyThe checksum of the data portion of the IP packet has been computed
11470193eb5eSYaroslav Tykhiyand stored in the field
11480193eb5eSYaroslav Tykhiy.Va csum_data
11490193eb5eSYaroslav Tykhiyin network byte order.
11500193eb5eSYaroslav Tykhiy.It Dv CSUM_PSEUDO_HDR
11510193eb5eSYaroslav TykhiyCan be set only along with
11520193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
11530193eb5eSYaroslav Tykhiyto indicate that the IP data checksum found in
11540193eb5eSYaroslav Tykhiy.Va csum_data
1155fbde705aSYaroslav Tykhiyallows for the pseudo header defined by the TCP and UDP specifications.
11560193eb5eSYaroslav TykhiyOtherwise the checksum of the pseudo header must be calculated by
11570193eb5eSYaroslav Tykhiythe host CPU and added to
11580193eb5eSYaroslav Tykhiy.Va csum_data
1159fbde705aSYaroslav Tykhiyto obtain the final checksum to be used for TCP or UDP validation purposes.
11600193eb5eSYaroslav Tykhiy.El
11610193eb5eSYaroslav Tykhiy.Pp
11620193eb5eSYaroslav TykhiyIf a particular network interface just indicates success or
11630193eb5eSYaroslav Tykhiyfailure of TCP or UDP checksum validation without returning
11640193eb5eSYaroslav Tykhiythe exact value of the checksum to the host CPU, its driver can mark
11650193eb5eSYaroslav Tykhiy.Dv CSUM_DATA_VALID
11660193eb5eSYaroslav Tykhiyand
11670193eb5eSYaroslav Tykhiy.Dv CSUM_PSEUDO_HDR
11680193eb5eSYaroslav Tykhiyin
11690193eb5eSYaroslav Tykhiy.Va csum_flags ,
11700193eb5eSYaroslav Tykhiyand set
11710193eb5eSYaroslav Tykhiy.Va csum_data
11720193eb5eSYaroslav Tykhiyto
11730193eb5eSYaroslav Tykhiy.Li 0xFFFF
11740193eb5eSYaroslav Tykhiyhexadecimal to indicate a valid checksum.
1175f48cbcdeSRuslan ErmilovIt is a peculiarity of the algorithm used that the Internet checksum
11760193eb5eSYaroslav Tykhiycalculated over any valid packet will be
11770193eb5eSYaroslav Tykhiy.Li 0xFFFF
11780193eb5eSYaroslav Tykhiyas long as the original checksum field is included.
11793cab047eSMike Silbersack.Sh STRESS TESTING
1180c8185672SRuslan ErmilovWhen running a kernel compiled with the option
1181c8185672SRuslan Ermilov.Dv MBUF_STRESS_TEST ,
1182c8185672SRuslan Ermilovthe following
1183c8185672SRuslan Ermilov.Xr sysctl 8 Ns
1184c8185672SRuslan Ermilov-controlled options may be used to create
11853cab047eSMike Silbersackvarious failure/extreme cases for testing of network drivers
11867b2fd183SYaroslav Tykhiyand other parts of the kernel that rely on
11877b2fd183SYaroslav Tykhiy.Vt mbufs .
1188c8185672SRuslan Ermilov.Bl -tag -width ident
1189c8185672SRuslan Ermilov.It Va net.inet.ip.mbuf_frag_size
1190c8185672SRuslan ErmilovCauses
1191c8185672SRuslan Ermilov.Fn ip_output
11927b2fd183SYaroslav Tykhiyto fragment outgoing
11937b2fd183SYaroslav Tykhiy.Vt mbuf chains
11947b2fd183SYaroslav Tykhiyinto fragments of the specified size.
1195c8185672SRuslan ErmilovSetting this variable to 1 is an excellent way to
11967b2fd183SYaroslav Tykhiytest the long
11977b2fd183SYaroslav Tykhiy.Vt mbuf chain
11987b2fd183SYaroslav Tykhiyhandling ability of network drivers.
1199c8185672SRuslan Ermilov.It Va kern.ipc.m_defragrandomfailures
1200c8185672SRuslan ErmilovCauses the function
1201c8185672SRuslan Ermilov.Fn m_defrag
1202c8185672SRuslan Ermilovto randomly fail, returning
1203c8185672SRuslan Ermilov.Dv NULL .
1204c8185672SRuslan ErmilovAny piece of code which uses
1205c8185672SRuslan Ermilov.Fn m_defrag
1206c8185672SRuslan Ermilovshould be tested with this feature.
1207c8185672SRuslan Ermilov.El
1208de06f907SNik Clayton.Sh RETURN VALUES
1209de06f907SNik ClaytonSee above.
12100193eb5eSYaroslav Tykhiy.Sh SEE ALSO
1211e85cc3f5SRuslan Ermilov.Xr ifnet 9 ,
1212e85cc3f5SRuslan Ermilov.Xr mbuf_tags 9
1213de06f907SNik Clayton.Sh HISTORY
1214de06f907SNik Clayton.\" Please correct me if I'm wrong
12157b2fd183SYaroslav Tykhiy.Vt Mbufs
12167b2fd183SYaroslav Tykhiyappeared in an early version of
1217753d686dSRuslan Ermilov.Bx .
121853b2520dSTom RhodesBesides being used for network packets, they were used
1219bfd59721SBosko Milekicto store various dynamic structures, such as routing table
1220bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc.
1221db430f97SRobert WatsonIn more recent
1222db430f97SRobert Watson.Fx
1223db430f97SRobert Watsonuse of
1224db430f97SRobert Watson.Vt mbufs
1225db430f97SRobert Watsonis almost entirely limited to packet storage, with
1226db430f97SRobert Watson.Xr uma 9
1227db430f97SRobert Watsonzones being used directly to store other network-related memory.
1228db430f97SRobert Watson.Pp
1229db430f97SRobert WatsonHistorically, the
1230db430f97SRobert Watson.Vt mbuf
1231db430f97SRobert Watsonallocator has been a special-purpose memory allocator able to run in
1232db430f97SRobert Watsoninterrupt contexts and allocating from a special kernel address space map.
1233db430f97SRobert WatsonAs of
1234db430f97SRobert Watson.Fx 5.3 ,
1235db430f97SRobert Watsonthe
1236db430f97SRobert Watson.Vt mbuf
1237db430f97SRobert Watsonallocator is a wrapper around
1238db430f97SRobert Watson.Xr uma 9 ,
1239db430f97SRobert Watsonallowing caching of
1240db430f97SRobert Watson.Vt mbufs ,
1241db430f97SRobert Watsonclusters, and
1242db430f97SRobert Watson.Vt mbuf
1243db430f97SRobert Watson+ cluster pairs in per-CPU caches, as well as bringing other benefits of
1244db430f97SRobert Watsonslab allocation.
1245de06f907SNik Clayton.Sh AUTHORS
12466575e6daSRuslan ErmilovThe original
12476575e6daSRuslan Ermilov.Nm
12481e9469d1SChristian Brueffermanual page was written by
12491e9469d1SChristian Brueffer.An Yar Tikhiy .
1250db430f97SRobert WatsonThe
1251db430f97SRobert Watson.Xr uma 9
1252db430f97SRobert Watson.Vt mbuf
12531e9469d1SChristian Bruefferallocator was written by
12541e9469d1SChristian Brueffer.An Bosko Milekic .
1255