xref: /freebsd/share/man/man9/mbuf.9 (revision 7b2fd1831feff3149edd09030e5fbafedce5fb51)
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.\"
27de06f907SNik Clayton.Dd October 17, 2000
28de06f907SNik Clayton.Dt MBUF 9
29de06f907SNik Clayton.Os
30de06f907SNik Clayton.\"
31de06f907SNik Clayton.Sh NAME
32de06f907SNik Clayton.Nm mbuf
33de06f907SNik Clayton.Nd "memory management in the kernel IPC subsystem"
34de06f907SNik Clayton.\"
35de06f907SNik Clayton.Sh SYNOPSIS
3632eef9aeSRuslan Ermilov.In sys/param.h
37f16b3c0dSChad David.In sys/systm.h
3832eef9aeSRuslan Ermilov.In sys/mbuf.h
39de06f907SNik Clayton.\"
40bfd59721SBosko Milekic.Ss Mbuf allocation macros
41de06f907SNik Clayton.Fn MGET "struct mbuf *mbuf" "int how" "short type"
42de06f907SNik Clayton.Fn MGETHDR "struct mbuf *mbuf" "int how" "short type"
43de06f907SNik Clayton.Fn MCLGET "struct mbuf *mbuf" "int how"
44bfd59721SBosko Milekic.Fo MEXTADD
45bfd59721SBosko Milekic.Fa "struct mbuf *mbuf"
46bfd59721SBosko Milekic.Fa "caddr_t buf"
47bfd59721SBosko Milekic.Fa "u_int size"
48bfd59721SBosko Milekic.Fa "void (*free)(void *opt_args)"
49bfd59721SBosko Milekic.Fa "void *opt_args"
505d4050ccSBosko Milekic.Fa "short flags"
515d4050ccSBosko Milekic.Fa "int type"
52bfd59721SBosko Milekic.Fc
53bfd59721SBosko Milekic.Fn MEXTFREE "struct mbuf *mbuf"
54bfd59721SBosko Milekic.Fn MEXT_ADD_REF "struct mbuf *mbuf"
55bfd59721SBosko Milekic.Fn MEXT_REM_REF "struct mbuf *mbuf"
56bfd59721SBosko Milekic.Fn MFREE "struct mbuf *mbuf" "struct mbuf *successor"
57de06f907SNik Clayton.\"
58bfd59721SBosko Milekic.Ss Mbuf utility macros
59f16b3c0dSChad David.Ft void *
60f16b3c0dSChad David.Fn mtod "struct mbuf *mbuf" "type"
61f16b3c0dSChad David.Ft int
62bfd59721SBosko Milekic.Fn MEXT_IS_REF "struct mbuf *mbuf"
63bfd59721SBosko Milekic.Fn M_COPY_PKTHDR "struct mbuf *to" "struct mbuf *from"
64bfd59721SBosko Milekic.Fn M_ALIGN "struct mbuf *mbuf" "u_int len"
65bfd59721SBosko Milekic.Fn MH_ALIGN "struct mbuf *mbuf" "u_int len"
66f16b3c0dSChad David.Ft int
67bfd59721SBosko Milekic.Fn M_LEADINGSPACE "struct mbuf *mbuf"
68f16b3c0dSChad David.Ft int
69bfd59721SBosko Milekic.Fn M_TRAILINGSPACE "struct mbuf *mbuf"
70bfd59721SBosko Milekic.Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how"
71bfd59721SBosko Milekic.Fn MCHTYPE "struct mbuf *mbuf" "u_int type"
72f16b3c0dSChad David.Ft int
735d4050ccSBosko Milekic.Fn M_WRITABLE "struct mbuf *mbuf"
74bfd59721SBosko Milekic.\"
75bfd59721SBosko Milekic.Ss Mbuf allocation functions
76de06f907SNik Clayton.Ft struct mbuf *
77de06f907SNik Clayton.Fn m_get "int how" "int type"
78de06f907SNik Clayton.Ft struct mbuf *
79328c0bbcSBosko Milekic.Fn m_getm "struct mbuf *orig" "int len" "int how" "int type"
80328c0bbcSBosko Milekic.Ft struct mbuf *
81de06f907SNik Clayton.Fn m_getclr "int how" "int type"
82de06f907SNik Clayton.Ft struct mbuf *
83de06f907SNik Clayton.Fn m_gethdr "int how" "int type"
84bfd59721SBosko Milekic.Ft struct mbuf *
85bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf"
86de06f907SNik Clayton.Ft void
87de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf"
88bfd59721SBosko Milekic.\"
89bfd59721SBosko Milekic.Ss Mbuf utility functions
90de06f907SNik Clayton.Ft void
91de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len"
92de06f907SNik Clayton.Ft struct mbuf *
93de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how"
94de06f907SNik Clayton.Ft struct mbuf *
95de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len"
96de06f907SNik Clayton.Ft struct mbuf *
97de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how"
98de06f907SNik Clayton.Ft struct mbuf *
99de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how"
100de06f907SNik Clayton.Ft struct mbuf *
101de06f907SNik Clayton.Fn m_dup "struct mbuf *mbuf" "int how"
102de06f907SNik Clayton.Ft void
1030d8e4c57SBruce Evans.Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
104de06f907SNik Clayton.Ft void
105de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
106de06f907SNik Clayton.Ft struct mbuf *
107de06f907SNik Clayton.Fo m_devget
108de06f907SNik Clayton.Fa "char *buf"
109de06f907SNik Clayton.Fa "int len"
110de06f907SNik Clayton.Fa "int offset"
111de06f907SNik Clayton.Fa "struct ifnet *ifp"
112de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)"
113de06f907SNik Clayton.Fc
114de06f907SNik Clayton.Ft void
115de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n"
116e60fa837SRuslan Ermilov.Ft u_int
1170b1c0994SPoul-Henning Kamp.Fn m_fixhdr "struct mbuf *mbuf"
118e60fa837SRuslan Ermilov.Ft u_int
1190b1c0994SPoul-Henning Kamp.Fn m_length "struct mbuf *mbuf" "struct mbuf **last"
120de06f907SNik Clayton.Ft struct mbuf *
121de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how"
122de06f907SNik Clayton.\"
123de06f907SNik Clayton.Sh DESCRIPTION
1247b2fd183SYaroslav TykhiyAn
1257b2fd183SYaroslav Tykhiy.Vt mbuf
1267b2fd183SYaroslav Tykhiyis a basic unit of memory management in the kernel IPC subsystem.
1277b2fd183SYaroslav TykhiyNetwork packets and socket buffers are stored in
1287b2fd183SYaroslav Tykhiy.Vt mbufs .
1297b2fd183SYaroslav TykhiyA network packet may span multiple
1307b2fd183SYaroslav Tykhiy.Vt mbufs
1317b2fd183SYaroslav Tykhiyarranged into a
1327b2fd183SYaroslav Tykhiy.Vt mbuf chain
133c4d9468eSRuslan Ermilov(linked list),
134de06f907SNik Claytonwhich allows adding or trimming
135bfd59721SBosko Milekicnetwork headers with little overhead.
136de06f907SNik Clayton.Pp
1377b2fd183SYaroslav TykhiyWhile a developer should not bother with
1387b2fd183SYaroslav Tykhiy.Vt mbuf
1397b2fd183SYaroslav Tykhiyinternals without serious
140de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it
1417b2fd183SYaroslav Tykhiyis useful to understand the general structure of an
1427b2fd183SYaroslav Tykhiy.Vt mbuf .
143de06f907SNik Clayton.Pp
1447b2fd183SYaroslav TykhiyAn
1457b2fd183SYaroslav Tykhiy.Vt mbuf
1467b2fd183SYaroslav Tykhiyconsists of a variable-sized header and a small internal
147e73145f6SSheldon Hearnbuffer for data.
1487b2fd183SYaroslav TykhiyThe total size of an
1497b2fd183SYaroslav Tykhiy.Vt mbuf ,
150bfd59721SBosko Milekic.Dv MSIZE ,
151de06f907SNik Claytonis a machine-dependent constant defined in
152de06f907SNik Clayton.Pa machine/param.h .
1537b2fd183SYaroslav TykhiyThe
1547b2fd183SYaroslav Tykhiy.Vt mbuf
1557b2fd183SYaroslav Tykhiyheader includes:
156de06f907SNik Clayton.Pp
157de06f907SNik Clayton.Bl -tag -width "m_nextpkt" -compact -offset indent
158be82a0bcSYaroslav Tykhiy.It Va m_next
1597b2fd183SYaroslav Tykhiya pointer to the next
1607b2fd183SYaroslav Tykhiy.Vt mbuf
1617b2fd183SYaroslav Tykhiyin the
1627b2fd183SYaroslav Tykhiy.Vt mbuf chain
163be82a0bcSYaroslav Tykhiy.It Va m_nextpkt
1647b2fd183SYaroslav Tykhiya pointer to the next
1657b2fd183SYaroslav Tykhiy.Vt mbuf chain
1667b2fd183SYaroslav Tykhiyin the queue
167be82a0bcSYaroslav Tykhiy.It Va m_data
168de06f907SNik Claytona pointer to the data
169be82a0bcSYaroslav Tykhiy.It Va m_len
170de06f907SNik Claytonthe length of the data
171be82a0bcSYaroslav Tykhiy.It Va m_type
172bfd59721SBosko Milekicthe type of data
173be82a0bcSYaroslav Tykhiy.It Va m_flags
1747b2fd183SYaroslav Tykhiythe
1757b2fd183SYaroslav Tykhiy.Vt mbuf
1767b2fd183SYaroslav Tykhiyflags
177de06f907SNik Clayton.El
178de06f907SNik Clayton.Pp
1797b2fd183SYaroslav TykhiyThe
1807b2fd183SYaroslav Tykhiy.Vt mbuf
1817b2fd183SYaroslav Tykhiyflag bits are defined as follows:
182de06f907SNik Clayton.Bd -literal
183de06f907SNik Clayton/* mbuf flags */
184de06f907SNik Clayton#define	M_EXT		0x0001	/* has associated external storage */
185de06f907SNik Clayton#define	M_PKTHDR	0x0002	/* start of record */
186de06f907SNik Clayton#define	M_EOR		0x0004	/* end of record */
1875d4050ccSBosko Milekic#define	M_RDONLY	0x0008	/* associated data marked read-only */
1885d4050ccSBosko Milekic#define	M_PROTO1	0x0010	/* protocol-specific */
1895d4050ccSBosko Milekic#define	M_PROTO2	0x0020 	/* protocol-specific */
1905d4050ccSBosko Milekic#define	M_PROTO3	0x0040	/* protocol-specific */
1915d4050ccSBosko Milekic#define	M_PROTO4	0x0080	/* protocol-specific */
1925d4050ccSBosko Milekic#define	M_PROTO5	0x0100	/* protocol-specific */
193de06f907SNik Clayton
194de06f907SNik Clayton/* mbuf pkthdr flags, also in m_flags */
1955d4050ccSBosko Milekic#define	M_BCAST		0x0200	/* send/received as link-level broadcast */
1965d4050ccSBosko Milekic#define	M_MCAST		0x0400	/* send/received as link-level multicast */
1975d4050ccSBosko Milekic#define	M_FRAG		0x0800	/* packet is fragment of larger packet */
1985d4050ccSBosko Milekic#define	M_FIRSTFRAG	0x1000	/* packet is first fragment */
1995d4050ccSBosko Milekic#define	M_LASTFRAG	0x2000	/* packet is last fragment */
200de06f907SNik Clayton.Ed
201de06f907SNik Clayton.Pp
2027b2fd183SYaroslav TykhiyThe available
2037b2fd183SYaroslav Tykhiy.Vt mbuf
2047b2fd183SYaroslav Tykhiytypes are defined as follows:
205de06f907SNik Clayton.Bd -literal
206de06f907SNik Clayton/* mbuf types */
207de06f907SNik Clayton#define	MT_FREE		0	/* should be on free list */
208de06f907SNik Clayton#define	MT_DATA		1	/* dynamic (data) allocation */
209de06f907SNik Clayton#define	MT_HEADER	2	/* packet header */
210de06f907SNik Clayton#define	MT_SONAME	8	/* socket name */
211de06f907SNik Clayton#define	MT_FTABLE	11	/* fragment reassembly header */
212de06f907SNik Clayton#define	MT_CONTROL	14	/* extra-data protocol message */
213de06f907SNik Clayton#define	MT_OOBDATA	15	/* expedited data  */
214de06f907SNik Clayton.Ed
215de06f907SNik Clayton.Pp
216de06f907SNik ClaytonIf the
217de06f907SNik Clayton.Dv M_PKTHDR
218de06f907SNik Claytonflag is set, a
2197b2fd183SYaroslav Tykhiy.Vt struct pkthdr Va m_pkthdr
2207b2fd183SYaroslav Tykhiyis added to the
2217b2fd183SYaroslav Tykhiy.Vt mbuf
2227b2fd183SYaroslav Tykhiyheader.
223e73145f6SSheldon HearnIt contains a pointer to the interface
224de06f907SNik Claytonthe packet has been received from
2257b2fd183SYaroslav Tykhiy.Pq Vt struct ifnet Va *rcvif ,
226de06f907SNik Claytonand the total packet length
2277b2fd183SYaroslav Tykhiy.Pq Vt int Va len .
228de06f907SNik Clayton.Pp
2297b2fd183SYaroslav TykhiyIf small enough, data is stored in the internal data buffer of an
2307b2fd183SYaroslav Tykhiy.Vt mbuf .
2317b2fd183SYaroslav TykhiyIf the data is sufficiently large, another
2327b2fd183SYaroslav Tykhiy.Vt mbuf
2337b2fd183SYaroslav Tykhiymay be added to the
2347b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
2357b2fd183SYaroslav Tykhiyor external storage may be associated with the
2367b2fd183SYaroslav Tykhiy.Vt mbuf .
237de06f907SNik Clayton.Dv MHLEN
2387b2fd183SYaroslav Tykhiybytes of data can fit into an
2397b2fd183SYaroslav Tykhiy.Vt mbuf
2407b2fd183SYaroslav Tykhiywith the
241de06f907SNik Clayton.Dv M_PKTHDR
242de06f907SNik Claytonflag set,
243de06f907SNik Clayton.Dv MLEN
244de06f907SNik Claytonbytes can otherwise.
245de06f907SNik Clayton.Pp
2467b2fd183SYaroslav TykhiyIf external storage is being associated with an
2477b2fd183SYaroslav Tykhiy.Vt mbuf ,
2487b2fd183SYaroslav Tykhiythe
249be82a0bcSYaroslav Tykhiy.Va m_ext
25025f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer.
251e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage,
252e73145f6SSheldon Hearna pointer to a function used for freeing the storage,
253e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function,
254e73145f6SSheldon Hearnand a pointer to a reference counter.
2557b2fd183SYaroslav TykhiyAn
2567b2fd183SYaroslav Tykhiy.Vt mbuf
2577b2fd183SYaroslav Tykhiyusing external storage has the
258de06f907SNik Clayton.Dv M_EXT
259de06f907SNik Claytonflag set.
260de06f907SNik Clayton.Pp
261bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage
262bfd59721SBosko Milekicbuffer,
263bfd59721SBosko Milekic.Dv MEXTADD .
264bfd59721SBosko Milekic.Pp
265bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the
266e73145f6SSheldon Hearnsubsystem.
267e73145f6SSheldon HearnThe developer can check whether the reference count for the
2687b2fd183SYaroslav Tykhiyexternal storage of a given
2697b2fd183SYaroslav Tykhiy.Vt mbuf
2707b2fd183SYaroslav Tykhiyis greater than 1 with the
271bfd59721SBosko Milekic.Dv MEXT_IS_REF
272e73145f6SSheldon Hearnmacro.
273e73145f6SSheldon HearnSimilarly, the developer can directly add and remove references,
274e73145f6SSheldon Hearnif absolutely necessary, with the use of the
275bfd59721SBosko Milekic.Dv MEXT_ADD_REF
276bfd59721SBosko Milekicand
277bfd59721SBosko Milekic.Dv MEXT_REM_REF
278bfd59721SBosko Milekicmacros.
279bfd59721SBosko Milekic.Pp
280bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an
2817b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
2827b2fd183SYaroslav Tykhiy.Vt Mbuf clusters
2837b2fd183SYaroslav Tykhiycan be allocated and configured with the use of the
284bfd59721SBosko Milekic.Dv MCLGET
285e73145f6SSheldon Hearnmacro.
2867b2fd183SYaroslav TykhiyEach
2877b2fd183SYaroslav Tykhiy.Vt mbuf cluster
2887b2fd183SYaroslav Tykhiyis
289de06f907SNik Clayton.Dv MCLBYTES
290bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant.
291bfd59721SBosko MilekicThe system defines an advisory macro
292de06f907SNik Clayton.Dv MINCLSIZE ,
2937b2fd183SYaroslav Tykhiywhich is the smallest amount of data to put into an
2947b2fd183SYaroslav Tykhiy.Vt mbuf cluster .
295de06f907SNik ClaytonIt's equal to the sum of
296de06f907SNik Clayton.Dv MLEN
297de06f907SNik Claytonand
298de06f907SNik Clayton.Dv MHLEN .
2997b2fd183SYaroslav TykhiyIt is typically preferable to store data into the data region of an
3007b2fd183SYaroslav Tykhiy.Vt mbuf ,
3017b2fd183SYaroslav Tykhiyif size permits, as opposed to allocating a separate
3027b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3037b2fd183SYaroslav Tykhiyto hold the same data.
304de06f907SNik Clayton.\"
305de06f907SNik Clayton.Ss Macros and Functions
306bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the
307bfd59721SBosko Milekicdeveloper with common utilities.
308de06f907SNik Clayton.\"
309de06f907SNik Clayton.Bl -ohang -offset indent
310de06f907SNik Clayton.It Fn mtod mbuf type
3117b2fd183SYaroslav TykhiyConvert an
3127b2fd183SYaroslav Tykhiy.Fa mbuf
3137b2fd183SYaroslav Tykhiypointer to a data pointer.
3147b2fd183SYaroslav TykhiyThe macro expands to the data pointer cast to the pointer of the specified
3157b2fd183SYaroslav Tykhiy.Fa type .
316de06f907SNik Clayton.Sy Note :
3177b2fd183SYaroslav TykhiyIt is advisable to ensure that there is enough contiguous data in
3187b2fd183SYaroslav Tykhiy.Fa mbuf .
319de06f907SNik ClaytonSee
320de06f907SNik Clayton.Fn m_pullup
321de06f907SNik Claytonfor details.
322de06f907SNik Clayton.It Fn MGET mbuf how type
3237b2fd183SYaroslav TykhiyAllocate an
3247b2fd183SYaroslav Tykhiy.Vt mbuf
3257b2fd183SYaroslav Tykhiyand initialize it to contain internal data.
32625f1a2e9SSheldon Hearn.Fa mbuf
3277b2fd183SYaroslav Tykhiywill point to the allocated
3287b2fd183SYaroslav Tykhiy.Vt mbuf
3297b2fd183SYaroslav Tykhiyon success, or be set to
330de06f907SNik Clayton.Dv NULL
331e73145f6SSheldon Hearnon failure.
332e73145f6SSheldon HearnThe
333de06f907SNik Clayton.Fa how
334de06f907SNik Claytonargument is to be set to
335c65b53c5STom Rhodes.Dv M_TRYWAIT
336de06f907SNik Claytonor
337c65b53c5STom Rhodes.Dv M_DONTWAIT .
33825f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary.
339e73145f6SSheldon HearnIf
340de06f907SNik Clayton.Fa how
34125f1a2e9SSheldon Hearnis set to
342c65b53c5STom Rhodes.Dv M_TRYWAIT ,
34325f1a2e9SSheldon Hearna failed allocation will result in the caller being put
344bfd59721SBosko Milekicto sleep for a designated
34525f1a2e9SSheldon Hearnkern.ipc.mbuf_wait
346c4d9468eSRuslan Ermilov.Xr ( sysctl 8
347c4d9468eSRuslan Ermilovtunable)
34825f1a2e9SSheldon Hearnnumber of ticks.
3497b2fd183SYaroslav TykhiyA number of other functions and macros related to
3507b2fd183SYaroslav Tykhiy.Vt mbufs
3517b2fd183SYaroslav Tykhiyhave the same argument because they may
3527b2fd183SYaroslav Tykhiyat some point need to allocate new
3537b2fd183SYaroslav Tykhiy.Vt mbufs .
354c65b53c5STom Rhodes.Pp
3557b2fd183SYaroslav TykhiyProgrammers should be careful not to confuse the
3567b2fd183SYaroslav Tykhiy.Vt mbuf
3577b2fd183SYaroslav Tykhiyallocation flag
358c65b53c5STom Rhodes.Dv M_DONTWAIT
359c65b53c5STom Rhodeswith the
360c65b53c5STom Rhodes.Xr malloc 9
361c65b53c5STom Rhodesallocation flag,
362c65b53c5STom Rhodes.Dv M_NOWAIT .
363c65b53c5STom RhodesThey are not the same.
364de06f907SNik Clayton.It Fn MGETHDR mbuf how type
3657b2fd183SYaroslav TykhiyAllocate an
3667b2fd183SYaroslav Tykhiy.Vt mbuf
3677b2fd183SYaroslav Tykhiyand initialize it to contain a packet header
368e73145f6SSheldon Hearnand internal data.
369e73145f6SSheldon HearnSee
370de06f907SNik Clayton.Fn MGET
371de06f907SNik Claytonfor details.
372de06f907SNik Clayton.It Fn MCLGET mbuf how
3737b2fd183SYaroslav TykhiyAllocate and attach an
3747b2fd183SYaroslav Tykhiy.Vt mbuf cluster
3757b2fd183SYaroslav Tykhiyto
3767b2fd183SYaroslav Tykhiy.Fa mbuf .
377e73145f6SSheldon HearnIf the macro fails, the
378de06f907SNik Clayton.Dv M_EXT
3797b2fd183SYaroslav Tykhiyflag won't be set in
3807b2fd183SYaroslav Tykhiy.Fa mbuf .
381de06f907SNik Clayton.It Fn M_PREPEND mbuf len how
3827b2fd183SYaroslav TykhiyThis macro operates on an
3837b2fd183SYaroslav Tykhiy.Vt mbuf chain .
384de06f907SNik ClaytonIt is an optimized wrapper for
385de06f907SNik Clayton.Fn m_prepend
386de06f907SNik Claytonthat can make use of possible empty space before data
387c4d9468eSRuslan Ermilov(e.g. left after trimming of a link-layer header).
3887b2fd183SYaroslav TykhiyThe new
3897b2fd183SYaroslav Tykhiy.Vt mbuf chain
3907b2fd183SYaroslav Tykhiypointer or
391de06f907SNik Clayton.Dv NULL
392de06f907SNik Claytonis in
393de06f907SNik Clayton.Fa mbuf
394de06f907SNik Claytonafter the call.
3955d4050ccSBosko Milekic.It Fn M_WRITABLE mbuf
3967b2fd183SYaroslav TykhiyThis macro will evaluate true if
3977b2fd183SYaroslav Tykhiy.Fa mbuf
3987b2fd183SYaroslav Tykhiyis not marked
3995d4050ccSBosko Milekic.Dv M_RDONLY
4007b2fd183SYaroslav Tykhiyand if either
4017b2fd183SYaroslav Tykhiy.Fa mbuf
4027b2fd183SYaroslav Tykhiydoes not contain external storage or,
4035d4050ccSBosko Milekicif it does,
4045d4050ccSBosko Milekicthen if the reference count of the storage is not greater than 1.
4055d4050ccSBosko MilekicThe
4065d4050ccSBosko Milekic.Dv M_RDONLY
4077b2fd183SYaroslav Tykhiyflag can be set in
4087b2fd183SYaroslav Tykhiy.Fa mbuf->m_flags .
4095d4050ccSBosko MilekicThis can be achieved during setup of the external storage,
4105d4050ccSBosko Milekicby passing the
4115d4050ccSBosko Milekic.Dv M_RDONLY
4125d4050ccSBosko Milekicbit as a
4130b39b3ffSRuslan Ermilov.Fa flags
4145d4050ccSBosko Milekicargument to the
4155d4050ccSBosko Milekic.Fn MEXTADD
4167b2fd183SYaroslav Tykhiymacro, or can be directly set in individual
4177b2fd183SYaroslav Tykhiy.Vt mbufs .
418de06f907SNik Clayton.El
419de06f907SNik Clayton.Pp
420de06f907SNik ClaytonThe functions are:
421de06f907SNik Clayton.Bl -ohang -offset indent
422de06f907SNik Clayton.It Fn m_get how type
423de06f907SNik ClaytonA function version of
424bfd59721SBosko Milekic.Fn MGET
425bfd59721SBosko Milekicfor non-critical paths.
426328c0bbcSBosko Milekic.It Fn m_getm orig len how type
427328c0bbcSBosko MilekicAllocate
4280b39b3ffSRuslan Ermilov.Fa len
4297b2fd183SYaroslav Tykhiybytes worth of
4307b2fd183SYaroslav Tykhiy.Vt mbufs
4317b2fd183SYaroslav Tykhiyand
4327b2fd183SYaroslav Tykhiy.Vt mbuf clusters
4337b2fd183SYaroslav Tykhiyif necessary and append the resulting allocated
4347b2fd183SYaroslav Tykhiy.Vt mbuf chain
4357b2fd183SYaroslav Tykhiyto the
4367b2fd183SYaroslav Tykhiy.Vt mbuf chain
4377b2fd183SYaroslav Tykhiy.Fa orig ,
4387b2fd183SYaroslav Tykhiyif it is
4390b39b3ffSRuslan Ermilov.No non- Ns Dv NULL .
440328c0bbcSBosko MilekicIf the allocation fails at any point,
4410b39b3ffSRuslan Ermilovfree whatever was allocated and return
4420b39b3ffSRuslan Ermilov.Dv NULL .
443328c0bbcSBosko MilekicIf
4440b39b3ffSRuslan Ermilov.Fa orig
4450b39b3ffSRuslan Ermilovis
4460b39b3ffSRuslan Ermilov.No non- Ns Dv NULL ,
447328c0bbcSBosko Milekicit will not be freed.
448328c0bbcSBosko MilekicIt is possible to use
449328c0bbcSBosko Milekic.Fn m_getm
450328c0bbcSBosko Milekicto either append
4510b39b3ffSRuslan Ermilov.Fa len
4527b2fd183SYaroslav Tykhiybytes to an existing
4537b2fd183SYaroslav Tykhiy.Vt mbuf
4547b2fd183SYaroslav Tykhiyor
4557b2fd183SYaroslav Tykhiy.Vt mbuf chain
456328c0bbcSBosko Milekic(for example, one which may be sitting in a pre-allocated ring)
4577b2fd183SYaroslav Tykhiyor to simply perform an all-or-nothing
4587b2fd183SYaroslav Tykhiy.Vt mbuf
4597b2fd183SYaroslav Tykhiyand
4607b2fd183SYaroslav Tykhiy.Vt mbuf cluster
4617b2fd183SYaroslav Tykhiyallocation.
462de06f907SNik Clayton.It Fn m_gethdr how type
463de06f907SNik ClaytonA function version of
464bfd59721SBosko Milekic.Fn MGETHDR
465bfd59721SBosko Milekicfor non-critical paths.
466de06f907SNik Clayton.It Fn m_getclr how type
4677b2fd183SYaroslav TykhiyAllocate an
4687b2fd183SYaroslav Tykhiy.Vt mbuf
4697b2fd183SYaroslav Tykhiyand zero out the data region.
470de06f907SNik Clayton.El
471de06f907SNik Clayton.Pp
4727b2fd183SYaroslav TykhiyThe functions below operate on
4737b2fd183SYaroslav Tykhiy.Vt mbuf chains .
474de06f907SNik Clayton.Bl -ohang -offset indent
475de06f907SNik Clayton.It Fn m_freem mbuf
4767b2fd183SYaroslav TykhiyFree an entire
4777b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
4787b2fd183SYaroslav Tykhiyincluding any external storage.
479de06f907SNik Clayton.\"
480de06f907SNik Clayton.It Fn m_adj mbuf len
481de06f907SNik ClaytonTrim
482de06f907SNik Clayton.Fa len
4837b2fd183SYaroslav Tykhiybytes from the head of an
4847b2fd183SYaroslav Tykhiy.Vt mbuf chain
4857b2fd183SYaroslav Tykhiyif
486de06f907SNik Clayton.Fa len
487de06f907SNik Claytonis positive, from the tail otherwise.
488de06f907SNik Clayton.\"
489de06f907SNik Clayton.It Fn m_prepend mbuf len how
4907b2fd183SYaroslav TykhiyAllocate a new
4917b2fd183SYaroslav Tykhiy.Vt mbuf
4927b2fd183SYaroslav Tykhiyand prepend it to the
4937b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
4947b2fd183SYaroslav Tykhiyhandle
495de06f907SNik Clayton.Dv M_PKTHDR
496de06f907SNik Claytonproperly.
497de06f907SNik Clayton.Sy Note :
4987b2fd183SYaroslav TykhiyIt doesn't allocate any
4997b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
5007b2fd183SYaroslav Tykhiyso
501de06f907SNik Clayton.Fa len
502de06f907SNik Claytonmust be less than
503de06f907SNik Clayton.Dv MLEN
504de06f907SNik Claytonor
505de06f907SNik Clayton.Dv MHLEN ,
506de06f907SNik Claytondepending on the
507d0353b83SRuslan Ermilov.Dv M_PKTHDR
508d0353b83SRuslan Ermilovflag setting.
509de06f907SNik Clayton.\"
510de06f907SNik Clayton.It Fn m_pullup mbuf len
511de06f907SNik ClaytonArrange that the first
512de06f907SNik Clayton.Fa len
5137b2fd183SYaroslav Tykhiybytes of an
5147b2fd183SYaroslav Tykhiy.Vt mbuf chain
5157b2fd183SYaroslav Tykhiyare contiguous and lay in the data area of
516de06f907SNik Clayton.Fa mbuf ,
517de06f907SNik Claytonso they are accessible with
518de06f907SNik Clayton.Fn mtod mbuf type .
5197b2fd183SYaroslav TykhiyReturn the new
5207b2fd183SYaroslav Tykhiy.Vt mbuf chain
5217b2fd183SYaroslav Tykhiyon success,
522de06f907SNik Clayton.Dv NULL
523de06f907SNik Claytonon failure
5247b2fd183SYaroslav Tykhiy(the
5257b2fd183SYaroslav Tykhiy.Vt mbuf chain
5267b2fd183SYaroslav Tykhiyis freed in this case).
527de06f907SNik Clayton.Sy Note :
5287b2fd183SYaroslav TykhiyIt doesn't allocate any
5297b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
5307b2fd183SYaroslav Tykhiyso
531de06f907SNik Clayton.Fa len
532de06f907SNik Claytonmust be less than
533de06f907SNik Clayton.Dv MHLEN .
534de06f907SNik Clayton.\"
535de06f907SNik Clayton.It Fn m_copym mbuf offset len how
5367b2fd183SYaroslav TykhiyMake a copy of an
5377b2fd183SYaroslav Tykhiy.Vt mbuf chain
5387b2fd183SYaroslav Tykhiystarting
539de06f907SNik Clayton.Fa offset
540de06f907SNik Claytonbytes from the beginning, continuing for
541de06f907SNik Clayton.Fa len
542e73145f6SSheldon Hearnbytes.
543e73145f6SSheldon HearnIf
544de06f907SNik Clayton.Fa len
545de06f907SNik Claytonis
546de06f907SNik Clayton.Dv M_COPYALL ,
5477b2fd183SYaroslav Tykhiycopy to the end of the
5487b2fd183SYaroslav Tykhiy.Vt mbuf chain .
549de06f907SNik Clayton.Sy Note :
5507b2fd183SYaroslav TykhiyThe copy is read-only, because the
5517b2fd183SYaroslav Tykhiy.Vt mbuf clusters
5527b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
553de06f907SNik Clayton.\"
554de06f907SNik Clayton.It Fn m_copypacket mbuf how
555de06f907SNik ClaytonCopy an entire packet including header, which must be present.
556de06f907SNik ClaytonThis is an optimized version of the common case
557de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how .
558de06f907SNik Clayton.Sy Note :
5597b2fd183SYaroslav Tykhiythe copy is read-only, because the
5607b2fd183SYaroslav Tykhiy.Vt mbuf clusters
5617b2fd183SYaroslav Tykhiyare not copied, only their reference counts are incremented.
562de06f907SNik Clayton.\"
563de06f907SNik Clayton.It Fn m_dup mbuf how
5647b2fd183SYaroslav TykhiyCopy a packet header
5657b2fd183SYaroslav Tykhiy.Vt mbuf chain
5667b2fd183SYaroslav Tykhiyinto a completely new
5677b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
5687b2fd183SYaroslav Tykhiyincluding copying any
5697b2fd183SYaroslav Tykhiy.Vt mbuf clusters .
570e73145f6SSheldon HearnUse this instead of
571de06f907SNik Clayton.Fn m_copypacket
5727b2fd183SYaroslav Tykhiywhen you need a writable copy of an
5737b2fd183SYaroslav Tykhiy.Vt mbuf chain .
574de06f907SNik Clayton.\"
575de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf
5767b2fd183SYaroslav TykhiyCopy data from an
5777b2fd183SYaroslav Tykhiy.Vt mbuf chain
5787b2fd183SYaroslav Tykhiystarting
579de06f907SNik Clayton.Fa off
580de06f907SNik Claytonbytes from the beginning, continuing for
581de06f907SNik Clayton.Fa len
582de06f907SNik Claytonbytes, into the indicated buffer
583de06f907SNik Clayton.Fa buf .
584de06f907SNik Clayton.\"
585de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf
586de06f907SNik ClaytonCopy
587de06f907SNik Clayton.Fa len
588de06f907SNik Claytonbytes from the buffer
589de06f907SNik Clayton.Fa buf
5907b2fd183SYaroslav Tykhiyback into the indicated
5917b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
592de06f907SNik Claytonstarting at
593de06f907SNik Clayton.Fa offset
5947b2fd183SYaroslav Tykhiybytes from the beginning of the
5957b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
5967b2fd183SYaroslav Tykhiyextending the
5977b2fd183SYaroslav Tykhiy.Vt mbuf chain
5987b2fd183SYaroslav Tykhiyif necessary.
599de06f907SNik Clayton.Sy Note :
6007b2fd183SYaroslav TykhiyIt doesn't allocate any
6017b2fd183SYaroslav Tykhiy.Vt mbuf clusters ,
6027b2fd183SYaroslav Tykhiyjust adds
6037b2fd183SYaroslav Tykhiy.Vt mbufs
6047b2fd183SYaroslav Tykhiyto the
6057b2fd183SYaroslav Tykhiy.Vt mbuf chain .
606e73145f6SSheldon HearnIt's safe to set
607de06f907SNik Clayton.Fa offset
6087b2fd183SYaroslav Tykhiybeyond the current
6097b2fd183SYaroslav Tykhiy.Vt mbuf chain
6107b2fd183SYaroslav Tykhiyend: zeroed
6117b2fd183SYaroslav Tykhiy.Vt mbufs
6127b2fd183SYaroslav Tykhiywill be allocated to fill the space.
613de06f907SNik Clayton.\"
6140b1c0994SPoul-Henning Kamp.It Fn m_length buf last
6157b2fd183SYaroslav TykhiyReturn the length of the
6167b2fd183SYaroslav Tykhiy.Vt mbuf chain ,
6177b2fd183SYaroslav Tykhiyand optionally a pointer to the last
6187b2fd183SYaroslav Tykhiy.Vt mbuf .
6190b1c0994SPoul-Henning Kamp.\"
6200b1c0994SPoul-Henning Kamp.It Fn m_fixhdr buf
6217b2fd183SYaroslav TykhiySet the packet-header length to the length of the
6227b2fd183SYaroslav Tykhiy.Vt mbuf chain .
6230b1c0994SPoul-Henning Kamp.\"
624de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy
625de06f907SNik ClaytonCopy data from a device local memory pointed to by
626de06f907SNik Clayton.Fa buf
6277b2fd183SYaroslav Tykhiyto an
6287b2fd183SYaroslav Tykhiy.Vt mbuf chain .
629e73145f6SSheldon HearnThe copy is done using a specified copy routine
630de06f907SNik Clayton.Fa copy ,
631de06f907SNik Claytonor
632de06f907SNik Clayton.Fn bcopy
633de06f907SNik Claytonif
634de06f907SNik Clayton.Fa copy
635de06f907SNik Claytonis
636de06f907SNik Clayton.Dv NULL .
637de06f907SNik Clayton.\"
638de06f907SNik Clayton.It Fn m_cat m n
639de06f907SNik ClaytonConcatenate
640de06f907SNik Clayton.Fa n
641de06f907SNik Claytonto
642de06f907SNik Clayton.Fa m .
6437b2fd183SYaroslav TykhiyBoth
6447b2fd183SYaroslav Tykhiy.Vt mbuf chains
6457b2fd183SYaroslav Tykhiymust be of the same type.
646de06f907SNik Clayton.Fa N
647de06f907SNik Claytonis still valid after the function returned.
648de06f907SNik Clayton.Sy Note :
649de06f907SNik ClaytonIt does not handle
650de06f907SNik Clayton.Dv M_PKTHDR
651de06f907SNik Claytonand friends.
652de06f907SNik Clayton.\"
653de06f907SNik Clayton.It Fn m_split mbuf len how
6547b2fd183SYaroslav TykhiyPartition an
6557b2fd183SYaroslav Tykhiy.Vt mbuf chain
6567b2fd183SYaroslav Tykhiyin two pieces, returning the tail:
657de06f907SNik Claytonall but the first
658de06f907SNik Clayton.Fa len
659e73145f6SSheldon Hearnbytes.
660e73145f6SSheldon HearnIn case of failure, it returns
661de06f907SNik Clayton.Dv NULL
6627b2fd183SYaroslav Tykhiyand attempts to restore the
6637b2fd183SYaroslav Tykhiy.Vt mbuf chain
6647b2fd183SYaroslav Tykhiyto its original state.
6653136363fSRuslan Ermilov.El
6663cab047eSMike Silbersack.Sh STRESS TESTING
667c8185672SRuslan ErmilovWhen running a kernel compiled with the option
668c8185672SRuslan Ermilov.Dv MBUF_STRESS_TEST ,
669c8185672SRuslan Ermilovthe following
670c8185672SRuslan Ermilov.Xr sysctl 8 Ns
671c8185672SRuslan Ermilov-controlled options may be used to create
6723cab047eSMike Silbersackvarious failure/extreme cases for testing of network drivers
6737b2fd183SYaroslav Tykhiyand other parts of the kernel that rely on
6747b2fd183SYaroslav Tykhiy.Vt mbufs .
675c8185672SRuslan Ermilov.Bl -tag -width ident
676c8185672SRuslan Ermilov.It Va net.inet.ip.mbuf_frag_size
677c8185672SRuslan ErmilovCauses
678c8185672SRuslan Ermilov.Fn ip_output
6797b2fd183SYaroslav Tykhiyto fragment outgoing
6807b2fd183SYaroslav Tykhiy.Vt mbuf chains
6817b2fd183SYaroslav Tykhiyinto fragments of the specified size.
682c8185672SRuslan ErmilovSetting this variable to 1 is an excellent way to
6837b2fd183SYaroslav Tykhiytest the long
6847b2fd183SYaroslav Tykhiy.Vt mbuf chain
6857b2fd183SYaroslav Tykhiyhandling ability of network drivers.
686c8185672SRuslan Ermilov.It Va kern.ipc.m_defragrandomfailures
687c8185672SRuslan ErmilovCauses the function
688c8185672SRuslan Ermilov.Fn m_defrag
689c8185672SRuslan Ermilovto randomly fail, returning
690c8185672SRuslan Ermilov.Dv NULL .
691c8185672SRuslan ErmilovAny piece of code which uses
692c8185672SRuslan Ermilov.Fn m_defrag
693c8185672SRuslan Ermilovshould be tested with this feature.
694c8185672SRuslan Ermilov.El
695de06f907SNik Clayton.Sh RETURN VALUES
696de06f907SNik ClaytonSee above.
697de06f907SNik Clayton.Sh HISTORY
698de06f907SNik Clayton.\" Please correct me if I'm wrong
6997b2fd183SYaroslav Tykhiy.Vt Mbufs
7007b2fd183SYaroslav Tykhiyappeared in an early version of
701753d686dSRuslan Ermilov.Bx .
702e73145f6SSheldon HearnBesides for being used for network packets, they were used
703bfd59721SBosko Milekicto store various dynamic structures, such as routing table
704bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc.
705de06f907SNik Clayton.Sh AUTHORS
7066575e6daSRuslan ErmilovThe original
7076575e6daSRuslan Ermilov.Nm
7086575e6daSRuslan Ermilovman page was written by Yar Tikhiy.
709