xref: /netbsd-src/share/man/man9/mbuf.9 (revision d710132b4b8ce7f7cccaaf660cb16aa16b4077a0)
1.\"	$NetBSD: mbuf.9,v 1.28 2003/05/27 13:04:25 yamt Exp $
2.\"
3.\" Copyright (c) 1997 The NetBSD Foundation, Inc.
4.\" All rights reserved.
5.\"
6.\" This documentation is derived from text contributed to The NetBSD Foundation
7.\" by S.P.Zeidler (aka stargazer).
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\"    notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\"    notice, this list of conditions and the following disclaimer in the
16.\"    documentation and/or other materials provided with the distribution.
17.\" 3. All advertising materials mentioning features or use of this software
18.\"    must display the following acknowledgement:
19.\"        This product includes software developed by the NetBSD
20.\"        Foundation, Inc. and its contributors.
21.\" 4. Neither the name of The NetBSD Foundation nor the names of its
22.\"    contributors may be used to endorse or promote products derived
23.\"    from this software without specific prior written permission.
24.\"
25.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35.\" POSSIBILITY OF SUCH DAMAGE.
36.\"
37.Dd May 27, 2003
38.Dt MBUF 9
39.Os
40.Sh NAME
41.Nm mbuf ,
42.Nm m_get ,
43.Nm m_getclr ,
44.Nm m_gethdr ,
45.Nm m_devget ,
46.Nm m_copym ,
47.Nm m_copypacket ,
48.Nm m_copydata ,
49.Nm m_copyback ,
50.Nm m_cat ,
51.Nm m_dup ,
52.Nm m_prepend ,
53.Nm m_pulldown ,
54.Nm m_pullup ,
55.Nm m_split ,
56.Nm m_adj ,
57.Nm m_free ,
58.Nm m_freem ,
59.Nm mtod ,
60.Nm mtocl ,
61.Nm cltom ,
62.Nm MGET ,
63.Nm MGETHDR ,
64.Nm MEXTMALLOC ,
65.Nm MEXTADD ,
66.Nm MCLGET ,
67.Nm M_COPY_PKTHDR ,
68.Nm M_ALIGN ,
69.Nm MH_ALIGN ,
70.Nm M_LEADINGSPACE ,
71.Nm M_TRAILINGSPACE ,
72.Nm M_PREPEND ,
73.Nm MCHTYPE ,
74.Nm MEXTREMOVE ,
75.Nm MFREE ,
76.Nd "functions and macros for managing memory used by networking code"
77.Sh SYNOPSIS
78.In sys/mbuf.h
79.Ft struct mbuf *
80.Fn m_get "int nowait" "int type"
81.Ft struct mbuf *
82.Fn m_getclr "int nowait" "int type"
83.Ft struct mbuf *
84.Fn m_gethdr "int nowait" "int type"
85.Ft struct mbuf *
86.Fn m_devget "char *buf" "int totlen" "int off0" "struct ifnet *ifp" "void (*copy)(const void *, void *, size_t)"
87.Ft struct mbuf *
88.Fn m_copym "struct mbuf *m" "int off0" "int len" "int wait"
89.Ft struct mbuf *
90.Fn m_copypacket "struct mbuf *m" "int how"
91.Ft void
92.Fn m_copydata "struct mbuf *m" "int off" "int len" "caddr_t cp"
93.Ft void
94.Fn m_copyback "struct mbuf *m0" "int off" "int len" "caddr_t cp"
95.Ft void
96.Fn m_cat "struct mbuf *m" "struct mbuf *n"
97.Ft struct mbuf *
98.Fn m_dup "struct mbuf *m" "int off0" "int len" "int wait"
99.Ft struct mbuf *
100.Fn m_prepend "struct mbuf *m" "int len" "int how"
101.Ft struct mbuf *
102.Fn m_pulldown "struct mbuf *m" "int off" "int len" "int *offp"
103.Ft struct mbuf *
104.Fn m_pullup "struct mbuf *n" "int len"
105.Ft struct mbuf *
106.Fn m_split "struct mbuf *m0" "int len0" "int wait"
107.Ft void
108.Fn m_adj "struct mbuf *mp" "int req_len"
109.Ft struct mbuf *
110.Fn m_free "struct mbuf *m"
111.Ft void
112.Fn m_freem "struct mbuf *m"
113.Ft datatype
114.Fn mtod "struct mbuf *m" "datatype"
115.Ft u_long
116.Fn mtocl "void *datapointer"
117.Ft caddr_t
118.Fn cltom "u_long clusternum"
119.Ft void
120.Fn MGET "struct mbuf *m" "int how" "int type"
121.Ft void
122.Fn MGETHDR "struct mbuf *m" "int how" "int type"
123.Ft void
124.Fn MEXTMALLOC "struct mbuf *m" "int len" "int how"
125.Ft void
126.Fn MEXTADD "struct mbuf *m" "caddr_t buf" "int size" "int type" "void (*free)(struct mbuf *, caddr_t, size_t, void *)" "void *arg"
127.Ft void
128.Fn MCLGET "struct mbuf *m" "int how"
129.Ft void
130.Fn M_COPY_PKTHDR "struct mbuf *to" "struct mbuf *from"
131.Ft void
132.Fn M_ALIGN "struct mbuf *m" "int len"
133.Ft void
134.Fn MH_ALIGN "struct mbuf *m" "int len"
135.Ft int
136.Fn M_LEADINGSPACE "struct mbuf *m"
137.Ft int
138.Fn M_TRAILINGSPACE "struct mbuf *m"
139.Ft void
140.Fn M_PREPEND "struct mbuf *m" "int plen" "int how"
141.Ft void
142.Fn MCHTYPE "struct mbuf *m" "int type"
143.Ft void
144.Fn MEXTREMOVE "struct mbuf *m"
145.Ft void
146.Fn MFREE "struct mbuf *m" "struct mbuf *n"
147.Sh DESCRIPTION
148The
149.Nm
150functions and macros provide an easy and consistent way to handle
151a networking stack's memory management needs.
152An
153.Nm
154consists of a header and a data area.
155It is of a fixed size,
156.Dv MSIZE
157.Pq defined in Aq Pa machine/param.h ,
158which includes overhead.
159The header contains a pointer to the next
160.Nm
161in the
162.Sq "mbuf chain" ,
163a pointer to the next
164.Sq "mbuf chain" ,
165a pointer to the data area, the amount of data in this mbuf, its type
166and a
167.Dv flags
168field.
169.Pp
170The
171.Dv type
172variable can signify:
173.Bl -tag -compact -offset indent -width "XXXXXXXXXXX"
174.It Dv MT_FREE
175the mbuf should be on the ``free'' list
176.It Dv MT_DATA
177data was dynamically allocated
178.It Dv MT_HEADER
179data is a packet header
180.It Dv MT_SONAME
181data is a socket name
182.It Dv MT_SOOPTS
183data is socket options
184.It Dv MT_FTABLE
185data is the fragment reassembly header
186.It Dv MT_CONTROL
187mbuf contains ancillary \&(protocol control\&) data
188.It Dv MT_OOBDATA
189mbuf contains out-of-band data.
190.El
191.Pp
192The
193.Dv flags
194variable contains information describing the
195.Nm ,
196notably:
197.Bl -tag -compact -offset indent -width "XXXXXXXXXXX"
198.It Dv M_EXT
199has external storage
200.It Dv M_PKTHDR
201is start of record
202.It Dv M_EOR
203is end of record
204.It Dv M_CLUSTER
205external storage is a cluster.
206.El
207.Pp
208If an
209.Nm
210designates the start of a record
211.Pq Dv M_PKTHDR ,
212its
213.Dv flags
214field may contain additional information describing the content of
215the record:
216.Bl -tag -compact -offset indent -width "XXXXXXXXXXX"
217.It Dv M_BCAST
218sent/received as link-level broadcast
219.It Dv M_MCAST
220sent/received as link-level multicast
221.It Dv M_LINK0 ,
222.It Dv M_LINK1 ,
223.It Dv M_LINK2
224three link-level specific flags.
225.El
226.Pp
227An
228.Nm
229may add a single
230.Sq "mbuf cluster"
231of
232.Dv MCLBYTES
233bytes
234.Pq also defined in Aq Pa machine/param.h ,
235which has no additional overhead
236and is used instead of the internal data area; this is done when at least
237.Dv MINCLSIZE
238bytes of data must be stored.
239.Pp
240When the
241.Dv M_EXT
242flag is raised for an mbuf,
243the external storage area could be shared among multiple mbufs.
244Be careful when you attempt to overwrite the data content of the mbuf.
245.Bl -tag -width compact
246.It Fn m_get "int nowait" "int type"
247Allocates an mbuf and initializes it to contain internal data.
248The
249.Fa nowait
250parameter is a choice of
251.Dv M_WAIT / M_DONTWAIT
252from caller.
253.Dv M_WAIT
254means the call cannot fail, but may take forever.
255The
256.Fa type
257parameter is an mbuf type.
258.It Fn m_getclr "int nowait" "int type"
259Allocates an mbuf and initializes it to contain internal data, then
260zeros the data area.
261The
262.Fa nowait
263parameter is a choice of
264.Dv M_WAIT / M_DONTWAIT
265from caller.
266The
267.Fa type
268parameter is an mbuf type.
269.It Fn m_gethdr "int nowait" "int type"
270Allocates an mbuf and initializes it to contain a packet header and internal
271data.
272The
273.Fa nowait
274parameter is a choice of
275.Dv M_WAIT / M_DONTWAIT
276from caller.
277The
278.Fa type
279parameter is an mbuf type.
280.It Fn m_devget "char *buf" "int totlen" "int off0" "struct ifnet *ifp" "void (*copy)(const void *, void *, size_t)"
281Copies
282.Fa len
283bytes from device local memory into mbufs using copy routine
284.Fa copy .
285If parameter
286.Fa off
287is non-zero, the packet is supposed to be trailer-encapsulated and
288.Fa off
289bytes plus the type and length fields will be skipped before copying.
290Returns the top of the mbuf chain it created.
291.It Fn m_copym "struct mbuf *m" "int off0" "int len" "int wait"
292Creates a copy of an mbuf chain starting
293.Fa off0
294bytes from the beginning, continuing for
295.Fa len
296bytes.
297If the
298.Fa len
299requested is
300.Dv M_COPYALL ,
301the complete mbuf chain will be copied.
302The
303.Fa wait
304parameter is a choice of
305.Dv M_WAIT / M_DONTWAIT
306from caller.
307.It Fn m_copypacket "struct mbuf *m" "int how"
308Copies an entire packet, including header (which must be present).
309This function is an optimization of the common case
310.Li m_copym(m, 0, Dv M_COPYALL, Fa how ) .
311.It Fn m_copydata "struct mbuf *m" "int off" "int len" "caddr_t cp"
312Copies
313.Fa len
314bytes data from mbuf chain
315.Fa m
316into the buffer
317.Fa cp ,
318starting
319.Fa off
320bytes from the beginning.
321.It Fn m_copyback "struct mbuf *m0" "int off" "int len" "caddr_t cp"
322Copies
323.Fa len
324bytes data from buffer
325.Fa cp
326back into the mbuf chain
327.Fa m0 ,
328starting
329.Fa off
330bytes from the beginning, extending the mbuf chain if necessary.
331.It Fn m_cat "struct mbuf *m" "struct mbuf *n"
332Concatenates mbuf chain
333.Fa n
334to
335.Fa m .
336Both chains must be of the same type; packet headers will
337.Em not
338be updated if present.
339.It Fn m_dup "struct mbuf *m" "int off0" "int len" "int wait"
340Similarly to
341.Fn m_copym ,
342the function creates a copy of an mbuf chain starting
343.Fa off0
344bytes from the beginning, continuing for
345.Fa len
346bytes.
347While
348.Fn m_copym
349tries to share external storage for mbufs with
350.Dv M_EXT
351flag,
352.Fn m_dup
353will deep-copy the whole data content into new mbuf chain
354and avoids shared external storage.
355.It Fn m_prepend "struct mbuf *m" "int len" "int how"
356Lesser-used path for
357.Fn M_PREPEND :
358allocates new mbuf
359.Fa m
360of size
361.Fa len
362to prepend to the chain, copying junk along.
363The
364.Fa how
365parameter is a choice of
366.Dv M_WAIT / M_DONTWAIT
367from caller.
368.It Fn m_pulldown "struct mbuf *m" "int off" "int len" "int *offp"
369Rearranges an mbuf chain so that
370.Fa len
371bytes from offset
372.Fa off
373are contiguous and in the data area of an mbuf.
374The return value points to an mbuf in the middle of the mbuf chain
375.Fa m .
376If we call the return value
377.Fa n ,
378the contiguous data region is available at
379.Li "mtod(n, caddr_t) + *offp" ,
380or
381.Li "mtod(n, caddr_t)"
382if
383.Fa offp
384is
385.Dv NULL .
386The top of the mbuf chain
387.Fa m ,
388and mbufs up to
389.Fa off ,
390will not be modified.
391On successful return, it is guaranteed that the mbuf pointed to by
392.Fa n
393does not have a shared external storage,
394therefore it is safe to update the contiguous region.
395Returns
396.Dv NULL
397and frees the mbuf chain on failure.
398.Fa len
399must be smaller or equal than
400.Dv MCLBYTES .
401.It Fn m_pullup "struct mbuf *m" "int len"
402Rearranges an mbuf chain so that
403.Fa len
404bytes are contiguous
405and in the data area of an mbuf (so that
406.Fn mtod
407will work for a structure of size
408.Fa len ) .
409Returns the resulting
410mbuf chain on success, frees it and returns
411.Dv NULL
412on failure.
413If there is room, it will add up to
414.Dv max_protohdr
415-
416.Fa len
417extra bytes to the
418contiguous region to possibly avoid being called again.
419.Fa len
420must be smaller or equal than
421.Dv MHLEN .
422.It Fn m_split "struct mbuf *m0" "int len0" "int wait"
423Partitions an mbuf chain in two pieces, returning the tail,
424which is all but the first
425.Fa len0
426bytes.
427In case of failure, it returns
428.Dv NULL
429and attempts to
430restore the chain to its original state.
431.It Fn m_adj "struct mbuf *mp" "int req_len"
432Shaves off
433.Fa req_len
434bytes from head or tail of the (valid) data area.
435If
436.Fa req_len
437is greater than zero, front bytes are being shaved off, if it's smaller,
438from the back (and if it is zero, the mbuf will stay bearded).
439This function does not move data in any way, but is used to manipulate the
440data area pointer and data length variable of the mbuf in a non-clobbering
441way.
442.It Fn m_free "struct mbuf *m"
443Frees mbuf
444.Fa m .
445.It Fn m_freem "struct mbuf *m"
446Frees the mbuf chain beginning with
447.Fa m .
448This function contains the elementary sanity check for a
449.Dv NULL
450pointer.
451.It Fn mtod "struct mbuf *m" "datatype"
452Returns a pointer to the data contained in the specified mbuf
453.Fa m ,
454type-casted to the specified data type
455.Fa datatype .
456Implemented as a macro.
457.It Fn mtocl "void *datapointer"
458Takes a
459.Fa datapointer
460within an mbuf cluster and returns the cluster index number of the mbuf
461owning the data.
462Avoid this; it may be deprecated in the future.
463Implemented as a macro.
464.It Fn cltom "u_long clusternum"
465Takes an mbuf cluster index number
466.Fa clusternum
467and returns a pointer to the beginning of the cluster.
468Avoid this; it may be deprecated in the future.
469Implemented as a macro.
470.It Fn MGET "struct mbuf *m" "int how" "int type"
471Allocates mbuf
472.Fa m
473and initializes it to contain internal data.
474See
475.Fn m_get .
476Implemented as a macro.
477.It Fn MGETHDR "struct mbuf *m" "int how" "int type"
478Allocates mbuf
479.Fa m
480and initializes it to contain a packet header.
481See
482.Fn m_gethdr .
483Implemented as a macro.
484.It Fn MEXTMALLOC "struct mbuf *m" "int len" "int how"
485Allocates external storage of size
486.Fa len
487for mbuf
488.Fa m .
489The
490.Fa how
491parameter is a choice of
492.Dv M_WAIT / M_DONTWAIT
493from caller.
494The flag
495.Dv M_EXT
496is set upon success.
497Implemented as a macro.
498.It Fn MEXTADD "struct mbuf *m" "caddr_t buf" "int size" "int type" "void (*free)(struct mbuf *, caddr_t, size_t, void *)" "void *arg"
499Adds pre-allocated external storage
500.Fa buf
501to a normal mbuf
502.Fa m ;
503the parameters
504.Fa size ,
505.Fa type ,
506.Fa free
507and
508.Fa arg
509describe the external storage.
510.Fa size
511is the size of the storage,
512.Fa type
513describes its
514.Xr malloc 9
515type,
516.Fa free
517is a free routine (if not the usual one), and
518.Fa arg
519is a possible argument to the free routine.
520The flag
521.Dv M_EXT
522is set upon success.
523Implemented as a macro.
524If a free routine is specified, it will be called when the mbuf is freed or
525when MEXTREMOVE is called for the mbuf.
526In the case of former, the first argument for a free routine is the mbuf
527.Fa m
528and the routine is expected to free it in addition to the external storage
529pointed by second argument.
530In the case of latter, the first argument for the routine is NULL.
531.It Fn MCLGET "struct mbuf *m" "int how"
532Allocates and adds an mbuf cluster to a normal mbuf
533.Fa m .
534The
535.Fa how
536parameter is a choice of
537.Dv M_WAIT / M_DONTWAIT
538from caller.
539The flag
540.Dv M_EXT
541is set upon success.
542Implemented as a macro.
543.It Fn M_COPY_PKTHDR "struct mbuf *to" "struct mbuf *from"
544Copies the mbuf pkthdr from mbuf
545.Fa from
546to mbuf
547.Fa to .
548.Fa from
549must have the type flag
550.Dv M_PKTHDR
551set, and
552.Fa to
553must be empty.
554Implemented as a macro.
555.It Fn M_ALIGN "struct mbuf *m" "int len"
556Sets the data pointer of a newly allocated mbuf
557.Fa m
558to
559.Fa len
560bytes from the end of the mbuf data area, so that
561.Fa len
562bytes of data written to the mbuf
563.Fa m ,
564starting at the data pointer, will be aligned to the end of the data area.
565Implemented as a macro.
566.It Fn MH_ALIGN "struct mbuf *m" "int len"
567Sets the data pointer of a newly allocated packetheader mbuf
568.Fa m
569to
570.Fa len
571bytes from the end of the mbuf data area, so that
572.Fa len
573bytes of data written to the mbuf
574.Fa m ,
575starting at the data pointer, will be aligned to the end of the data area.
576Implemented as a macro.
577.It Fn M_LEADINGSPACE "struct mbuf *m"
578Returns the amount of space available before the current start of valid
579data in mbuf
580.Fa m .
581Returns 0 if the mbuf data part is shared across multiple mbufs
582.Pq i.e. not writable .
583Implemented as a macro.
584.It Fn M_TRAILINGSPACE "struct mbuf *m"
585Returns the amount of space available after the current end of valid
586data in mbuf
587.Fa m .
588Returns 0 if the mbuf data part is shared across multiple mbufs
589.Pq i.e. not writable .
590Implemented as a macro.
591.It Fn M_PREPEND "struct mbuf *m" "int plen" "int how"
592Prepends space of size
593.Fa plen
594to mbuf
595.Fa m .
596If a new mbuf must be allocated,
597.Fa how
598specifies whether to wait.
599If
600.Fa how
601is
602.Dv M_DONTWAIT
603and allocation fails, the original mbuf chain is freed and
604.Fa m
605is set to
606.Dv NULL .
607Implemented as a macro.
608.It Fn MCHTYPE "struct mbuf *m" "int type"
609Change mbuf
610.Fa m
611to new type
612.Fa type .
613Implemented as a macro.
614.It Fn MEXTREMOVE "struct mbuf *m"
615Removes external storage from mbuf
616.Fa m .
617The flag
618.Dv M_EXT
619is removed.
620Implemented as a macro.
621.It Fn MFREE "struct mbuf *m" "struct mbuf *n"
622Frees a single mbuf
623.Fa m
624and places the successor, if any, in mbuf
625.Fa n .
626Implemented as a macro.
627.El
628.Sh FILES
629The
630.Nm
631management functions are implemented within the file
632.Pa sys/kern/uipc_mbuf.c .
633Function prototypes, and the functions implemented as macros
634are located in
635.Pa sys/sys/mbuf.h .
636Both pathnames are relative to the root of the
637.Nx
638source tree,
639.Pa /usr/src .
640.Sh SEE ALSO
641.Pa /usr/share/doc/smm/18.net ,
642.Xr netstat 1 ,
643.Xr malloc 9
644.Rs
645.%A Jun-ichiro Hagino
646.%T "Mbuf issues in 4.4BSD IPv6/IPsec support (experiences from KAME IPv6/IPsec implementation)"
647.%B "Proceedings of the freenix track: 2000 USENIX annual technical conference"
648.%D June 2000
649.Re
650.Sh AUTHORS
651The original mbuf data structures were designed by Rob Gurwitz
652when he did the initial TCP/IP implementation at BBN.
653.br
654Further extensions and enhancements were made by Bill Joy, Sam Leffler,
655and Mike Karels at CSRG.
656.br
657Current implementation of external storage by
658.An Matt Thomas
659.Aq matt@3am-software.com
660and
661.An Jason R. Thorpe
662.Aq thorpej@NetBSD.org .
663