]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - share/man/man9/mbuf.9
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / share / man / man9 / mbuf.9
1 .\" Copyright (c) 2000 FreeBSD Inc.
2 .\" All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\"
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED.  IN NO EVENT SHALL [your name] OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 .\" SUCH DAMAGE.
24 .\"
25 .\" $FreeBSD$
26 .\"
27 .Dd November 13, 2012
28 .Dt MBUF 9
29 .Os
30 .\"
31 .Sh NAME
32 .Nm mbuf
33 .Nd "memory management in the kernel IPC subsystem"
34 .\"
35 .Sh SYNOPSIS
36 .In sys/param.h
37 .In sys/systm.h
38 .In sys/mbuf.h
39 .\"
40 .Ss Mbuf allocation macros
41 .Fn MGET "struct mbuf *mbuf" "int how" "short type"
42 .Fn MGETHDR "struct mbuf *mbuf" "int how" "short type"
43 .Fn MCLGET "struct mbuf *mbuf" "int how"
44 .Fo MEXTADD
45 .Fa "struct mbuf *mbuf"
46 .Fa "caddr_t buf"
47 .Fa "u_int size"
48 .Fa "void (*free)(void *opt_arg1, void *opt_arg2)"
49 .Fa "void *opt_arg1"
50 .Fa "void *opt_arg2"
51 .Fa "short flags"
52 .Fa "int type"
53 .Fc
54 .Fn MEXTFREE "struct mbuf *mbuf"
55 .Fn MFREE "struct mbuf *mbuf" "struct mbuf *successor"
56 .\"
57 .Ss Mbuf utility macros
58 .Fn mtod "struct mbuf *mbuf" "type"
59 .Fn M_ALIGN "struct mbuf *mbuf" "u_int len"
60 .Fn MH_ALIGN "struct mbuf *mbuf" "u_int len"
61 .Ft int
62 .Fn M_LEADINGSPACE "struct mbuf *mbuf"
63 .Ft int
64 .Fn M_TRAILINGSPACE "struct mbuf *mbuf"
65 .Fn M_MOVE_PKTHDR "struct mbuf *to" "struct mbuf *from"
66 .Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how"
67 .Fn MCHTYPE "struct mbuf *mbuf" "u_int type"
68 .Ft int
69 .Fn M_WRITABLE "struct mbuf *mbuf"
70 .\"
71 .Ss Mbuf allocation functions
72 .Ft struct mbuf *
73 .Fn m_get "int how" "int type"
74 .Ft struct mbuf *
75 .Fn m_getm "struct mbuf *orig" "int len" "int how" "int type"
76 .Ft struct mbuf *
77 .Fn m_getcl "int how" "short type" "int flags"
78 .Ft struct mbuf *
79 .Fn m_getclr "int how" "int type"
80 .Ft struct mbuf *
81 .Fn m_gethdr "int how" "int type"
82 .Ft struct mbuf *
83 .Fn m_free "struct mbuf *mbuf"
84 .Ft void
85 .Fn m_freem "struct mbuf *mbuf"
86 .\"
87 .Ss Mbuf utility functions
88 .Ft void
89 .Fn m_adj "struct mbuf *mbuf" "int len"
90 .Ft void
91 .Fn m_align "struct mbuf *mbuf" "int len"
92 .Ft int
93 .Fn m_append "struct mbuf *mbuf" "int len" "c_caddr_t cp"
94 .Ft struct mbuf *
95 .Fn m_prepend "struct mbuf *mbuf" "int len" "int how"
96 .Ft struct mbuf *
97 .Fn m_copyup "struct mbuf *mbuf" "int len" "int dstoff"
98 .Ft struct mbuf *
99 .Fn m_pullup "struct mbuf *mbuf" "int len"
100 .Ft struct mbuf *
101 .Fn m_pulldown "struct mbuf *mbuf" "int offset" "int len" "int *offsetp"
102 .Ft struct mbuf *
103 .Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how"
104 .Ft struct mbuf *
105 .Fn m_copypacket "struct mbuf *mbuf" "int how"
106 .Ft struct mbuf *
107 .Fn m_dup "struct mbuf *mbuf" "int how"
108 .Ft void
109 .Fn m_copydata "const struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
110 .Ft void
111 .Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf"
112 .Ft struct mbuf *
113 .Fo m_devget
114 .Fa "char *buf"
115 .Fa "int len"
116 .Fa "int offset"
117 .Fa "struct ifnet *ifp"
118 .Fa "void (*copy)(char *from, caddr_t to, u_int len)"
119 .Fc
120 .Ft void
121 .Fn m_cat "struct mbuf *m" "struct mbuf *n"
122 .Ft u_int
123 .Fn m_fixhdr "struct mbuf *mbuf"
124 .Ft void
125 .Fn m_dup_pkthdr "struct mbuf *to" "struct mbuf *from"
126 .Ft void
127 .Fn m_move_pkthdr "struct mbuf *to" "struct mbuf *from"
128 .Ft u_int
129 .Fn m_length "struct mbuf *mbuf" "struct mbuf **last"
130 .Ft struct mbuf *
131 .Fn m_split "struct mbuf *mbuf" "int len" "int how"
132 .Ft int
133 .Fn m_apply "struct mbuf *mbuf" "int off" "int len" "int (*f)(void *arg, void *data, u_int len)" "void *arg"
134 .Ft struct mbuf *
135 .Fn m_getptr "struct mbuf *mbuf" "int loc" "int *off"
136 .Ft struct mbuf *
137 .Fn m_defrag "struct mbuf *m0" "int how"
138 .Ft struct mbuf *
139 .Fn m_unshare "struct mbuf *m0" "int how"
140 .\"
141 .Sh DESCRIPTION
142 An
143 .Vt mbuf
144 is a basic unit of memory management in the kernel IPC subsystem.
145 Network packets and socket buffers are stored in
146 .Vt mbufs .
147 A network packet may span multiple
148 .Vt mbufs
149 arranged into a
150 .Vt mbuf chain
151 (linked list),
152 which allows adding or trimming
153 network headers with little overhead.
154 .Pp
155 While a developer should not bother with
156 .Vt mbuf
157 internals without serious
158 reason in order to avoid incompatibilities with future changes, it
159 is useful to understand the general structure of an
160 .Vt mbuf .
161 .Pp
162 An
163 .Vt mbuf
164 consists of a variable-sized header and a small internal
165 buffer for data.
166 The total size of an
167 .Vt mbuf ,
168 .Dv MSIZE ,
169 is a constant defined in
170 .In sys/param.h .
171 The
172 .Vt mbuf
173 header includes:
174 .Bl -tag -width "m_nextpkt" -offset indent
175 .It Va m_next
176 .Pq Vt struct mbuf *
177 A pointer to the next
178 .Vt mbuf
179 in the
180 .Vt mbuf chain .
181 .It Va m_nextpkt
182 .Pq Vt struct mbuf *
183 A pointer to the next
184 .Vt mbuf chain
185 in the queue.
186 .It Va m_data
187 .Pq Vt caddr_t
188 A pointer to data attached to this
189 .Vt mbuf .
190 .It Va m_len
191 .Pq Vt int
192 The length of the data.
193 .It Va m_type
194 .Pq Vt short
195 The type of the data.
196 .It Va m_flags
197 .Pq Vt int
198 The
199 .Vt mbuf
200 flags.
201 .El
202 .Pp
203 The
204 .Vt mbuf
205 flag bits are defined as follows:
206 .Bd -literal
207 /* mbuf flags */
208 #define M_EXT           0x0001  /* has associated external storage */
209 #define M_PKTHDR        0x0002  /* start of record */
210 #define M_EOR           0x0004  /* end of record */
211 #define M_RDONLY        0x0008  /* associated data marked read-only */
212 #define M_PROTO1        0x0010  /* protocol-specific */
213 #define M_PROTO2        0x0020  /* protocol-specific */
214 #define M_PROTO3        0x0040  /* protocol-specific */
215 #define M_PROTO4        0x0080  /* protocol-specific */
216 #define M_PROTO5        0x0100  /* protocol-specific */
217 #define M_PROTO6        0x4000  /* protocol-specific (avoid M_BCAST conflict) */
218 #define M_FREELIST      0x8000  /* mbuf is on the free list */
219
220 /* mbuf pkthdr flags (also stored in m_flags) */
221 #define M_BCAST         0x0200  /* send/received as link-level broadcast */
222 #define M_MCAST         0x0400  /* send/received as link-level multicast */
223 #define M_FRAG          0x0800  /* packet is fragment of larger packet */
224 #define M_FIRSTFRAG     0x1000  /* packet is first fragment */
225 #define M_LASTFRAG      0x2000  /* packet is last fragment */
226 .Ed
227 .Pp
228 The available
229 .Vt mbuf
230 types are defined as follows:
231 .Bd -literal
232 /* mbuf types */
233 #define MT_DATA         1       /* dynamic (data) allocation */
234 #define MT_HEADER       MT_DATA /* packet header */
235 #define MT_SONAME       8       /* socket name */
236 #define MT_CONTROL      14      /* extra-data protocol message */
237 #define MT_OOBDATA      15      /* expedited data */
238 .Ed
239 .Pp
240 The available external buffer types are defined as follows:
241 .Bd -literal
242 /* external buffer types */
243 #define EXT_CLUSTER     1       /* mbuf cluster */
244 #define EXT_SFBUF       2       /* sendfile(2)'s sf_bufs */
245 #define EXT_JUMBOP      3       /* jumbo cluster 4096 bytes */
246 #define EXT_JUMBO9      4       /* jumbo cluster 9216 bytes */
247 #define EXT_JUMBO16     5       /* jumbo cluster 16184 bytes */
248 #define EXT_PACKET      6       /* mbuf+cluster from packet zone */
249 #define EXT_MBUF        7       /* external mbuf reference (M_IOVEC) */
250 #define EXT_NET_DRV     100     /* custom ext_buf provided by net driver(s) */
251 #define EXT_MOD_TYPE    200     /* custom module's ext_buf type */
252 #define EXT_DISPOSABLE  300     /* can throw this buffer away w/page flipping */
253 #define EXT_EXTREF      400     /* has externally maintained ref_cnt ptr */
254 .Ed
255 .Pp
256 If the
257 .Dv M_PKTHDR
258 flag is set, a
259 .Vt struct pkthdr Va m_pkthdr
260 is added to the
261 .Vt mbuf
262 header.
263 It contains a pointer to the interface
264 the packet has been received from
265 .Pq Vt struct ifnet Va *rcvif ,
266 and the total packet length
267 .Pq Vt int Va len .
268 Optionally, it may also contain an attached list of packet tags
269 .Pq Vt "struct m_tag" .
270 See
271 .Xr mbuf_tags 9
272 for details.
273 Fields used in offloading checksum calculation to the hardware are kept in
274 .Va m_pkthdr
275 as well.
276 See
277 .Sx HARDWARE-ASSISTED CHECKSUM CALCULATION
278 for details.
279 .Pp
280 If small enough, data is stored in the internal data buffer of an
281 .Vt mbuf .
282 If the data is sufficiently large, another
283 .Vt mbuf
284 may be added to the
285 .Vt mbuf chain ,
286 or external storage may be associated with the
287 .Vt mbuf .
288 .Dv MHLEN
289 bytes of data can fit into an
290 .Vt mbuf
291 with the
292 .Dv M_PKTHDR
293 flag set,
294 .Dv MLEN
295 bytes can otherwise.
296 .Pp
297 If external storage is being associated with an
298 .Vt mbuf ,
299 the
300 .Va m_ext
301 header is added at the cost of losing the internal data buffer.
302 It includes a pointer to external storage, the size of the storage,
303 a pointer to a function used for freeing the storage,
304 a pointer to an optional argument that can be passed to the function,
305 and a pointer to a reference counter.
306 An
307 .Vt mbuf
308 using external storage has the
309 .Dv M_EXT
310 flag set.
311 .Pp
312 The system supplies a macro for allocating the desired external storage
313 buffer,
314 .Dv MEXTADD .
315 .Pp
316 The allocation and management of the reference counter is handled by the
317 subsystem.
318 .Pp
319 The system also supplies a default type of external storage buffer called an
320 .Vt mbuf cluster .
321 .Vt Mbuf clusters
322 can be allocated and configured with the use of the
323 .Dv MCLGET
324 macro.
325 Each
326 .Vt mbuf cluster
327 is
328 .Dv MCLBYTES
329 in size, where MCLBYTES is a machine-dependent constant.
330 The system defines an advisory macro
331 .Dv MINCLSIZE ,
332 which is the smallest amount of data to put into an
333 .Vt mbuf cluster .
334 It is equal to the sum of
335 .Dv MLEN
336 and
337 .Dv MHLEN .
338 It is typically preferable to store data into the data region of an
339 .Vt mbuf ,
340 if size permits, as opposed to allocating a separate
341 .Vt mbuf cluster
342 to hold the same data.
343 .\"
344 .Ss Macros and Functions
345 There are numerous predefined macros and functions that provide the
346 developer with common utilities.
347 .\"
348 .Bl -ohang -offset indent
349 .It Fn mtod mbuf type
350 Convert an
351 .Fa mbuf
352 pointer to a data pointer.
353 The macro expands to the data pointer cast to the pointer of the specified
354 .Fa type .
355 .Sy Note :
356 It is advisable to ensure that there is enough contiguous data in
357 .Fa mbuf .
358 See
359 .Fn m_pullup
360 for details.
361 .It Fn MGET mbuf how type
362 Allocate an
363 .Vt mbuf
364 and initialize it to contain internal data.
365 .Fa mbuf
366 will point to the allocated
367 .Vt mbuf
368 on success, or be set to
369 .Dv NULL
370 on failure.
371 The
372 .Fa how
373 argument is to be set to
374 .Dv M_WAITOK
375 or
376 .Dv M_NOWAIT .
377 It specifies whether the caller is willing to block if necessary.
378 A number of other functions and macros related to
379 .Vt mbufs
380 have the same argument because they may
381 at some point need to allocate new
382 .Vt mbufs .
383 .Pp
384 Historical
385 .Vt mbuf
386 allocator (See
387 .Sx HISTORY
388 section) used allocation flags
389 .Dv M_WAIT
390 and
391 .Dv M_DONTWAIT .
392 These constants are kept for compatibility
393 and their use in new code is discouraged.
394 .It Fn MGETHDR mbuf how type
395 Allocate an
396 .Vt mbuf
397 and initialize it to contain a packet header
398 and internal data.
399 See
400 .Fn MGET
401 for details.
402 .It Fn MEXTADD mbuf buf size free opt_arg1 opt_arg2 flags type
403 Associate externally managed data with
404 .Fa mbuf .
405 Any internal data contained in the mbuf will be discarded, and the
406 .Dv M_EXT
407 flag will be set.
408 The
409 .Fa buf
410 and
411 .Fa size
412 arguments are the address and length, respectively, of the data.
413 The
414 .Fa free
415 argument points to a function which will be called to free the data
416 when the mbuf is freed; it is only used if
417 .Fa type
418 is
419 .Dv EXT_EXTREF .
420 The
421 .Fa opt_arg1
422 and
423 .Fa opt_arg2
424 arguments will be passed unmodified to
425 .Fa free .
426 The
427 .Fa flags
428 argument specifies additional
429 .Vt mbuf
430 flags; it is not necessary to specify
431 .Dv M_EXT .
432 Finally, the
433 .Fa type
434 argument specifies the type of external data, which controls how it
435 will be disposed of when the
436 .Vt mbuf
437 is freed.
438 In most cases, the correct value is
439 .Dv EXT_EXTREF .
440 .It Fn MCLGET mbuf how
441 Allocate and attach an
442 .Vt mbuf cluster
443 to
444 .Fa mbuf .
445 If the macro fails, the
446 .Dv M_EXT
447 flag will not be set in
448 .Fa mbuf .
449 .It Fn M_ALIGN mbuf len
450 Set the pointer
451 .Fa mbuf->m_data
452 to place an object of the size
453 .Fa len
454 at the end of the internal data area of
455 .Fa mbuf ,
456 long word aligned.
457 Applicable only if
458 .Fa mbuf
459 is newly allocated with
460 .Fn MGET
461 or
462 .Fn m_get .
463 .It Fn MH_ALIGN mbuf len
464 Serves the same purpose as
465 .Fn M_ALIGN
466 does, but only for
467 .Fa mbuf
468 newly allocated with
469 .Fn MGETHDR
470 or
471 .Fn m_gethdr ,
472 or initialized by
473 .Fn m_dup_pkthdr
474 or
475 .Fn m_move_pkthdr .
476 .It Fn m_align mbuf len
477 Services the same purpose as
478 .Fn M_ALIGN
479 but handles any type of mbuf.
480 .It Fn M_LEADINGSPACE mbuf
481 Returns the number of bytes available before the beginning
482 of data in
483 .Fa mbuf .
484 .It Fn M_TRAILINGSPACE mbuf
485 Returns the number of bytes available after the end of data in
486 .Fa mbuf .
487 .It Fn M_PREPEND mbuf len how
488 This macro operates on an
489 .Vt mbuf chain .
490 It is an optimized wrapper for
491 .Fn m_prepend
492 that can make use of possible empty space before data
493 (e.g.\& left after trimming of a link-layer header).
494 The new
495 .Vt mbuf chain
496 pointer or
497 .Dv NULL
498 is in
499 .Fa mbuf
500 after the call.
501 .It Fn M_MOVE_PKTHDR to from
502 Using this macro is equivalent to calling
503 .Fn m_move_pkthdr to from .
504 .It Fn M_WRITABLE mbuf
505 This macro will evaluate true if
506 .Fa mbuf
507 is not marked
508 .Dv M_RDONLY
509 and if either
510 .Fa mbuf
511 does not contain external storage or,
512 if it does,
513 then if the reference count of the storage is not greater than 1.
514 The
515 .Dv M_RDONLY
516 flag can be set in
517 .Fa mbuf->m_flags .
518 This can be achieved during setup of the external storage,
519 by passing the
520 .Dv M_RDONLY
521 bit as a
522 .Fa flags
523 argument to the
524 .Fn MEXTADD
525 macro, or can be directly set in individual
526 .Vt mbufs .
527 .It Fn MCHTYPE mbuf type
528 Change the type of
529 .Fa mbuf
530 to
531 .Fa type .
532 This is a relatively expensive operation and should be avoided.
533 .El
534 .Pp
535 The functions are:
536 .Bl -ohang -offset indent
537 .It Fn m_get how type
538 A function version of
539 .Fn MGET
540 for non-critical paths.
541 .It Fn m_getm orig len how type
542 Allocate
543 .Fa len
544 bytes worth of
545 .Vt mbufs
546 and
547 .Vt mbuf clusters
548 if necessary and append the resulting allocated
549 .Vt mbuf chain
550 to the
551 .Vt mbuf chain
552 .Fa orig ,
553 if it is
554 .No non- Ns Dv NULL .
555 If the allocation fails at any point,
556 free whatever was allocated and return
557 .Dv NULL .
558 If
559 .Fa orig
560 is
561 .No non- Ns Dv NULL ,
562 it will not be freed.
563 It is possible to use
564 .Fn m_getm
565 to either append
566 .Fa len
567 bytes to an existing
568 .Vt mbuf
569 or
570 .Vt mbuf chain
571 (for example, one which may be sitting in a pre-allocated ring)
572 or to simply perform an all-or-nothing
573 .Vt mbuf
574 and
575 .Vt mbuf cluster
576 allocation.
577 .It Fn m_gethdr how type
578 A function version of
579 .Fn MGETHDR
580 for non-critical paths.
581 .It Fn m_getcl how type flags
582 Fetch an
583 .Vt mbuf
584 with a
585 .Vt mbuf cluster
586 attached to it.
587 If one of the allocations fails, the entire allocation fails.
588 This routine is the preferred way of fetching both the
589 .Vt mbuf
590 and
591 .Vt mbuf cluster
592 together, as it avoids having to unlock/relock between allocations.
593 Returns
594 .Dv NULL
595 on failure.
596 .It Fn m_getclr how type
597 Allocate an
598 .Vt mbuf
599 and zero out the data region.
600 .It Fn m_free mbuf
601 Frees
602 .Vt mbuf .
603 Returns
604 .Va m_next
605 of the freed
606 .Vt mbuf .
607 .El
608 .Pp
609 The functions below operate on
610 .Vt mbuf chains .
611 .Bl -ohang -offset indent
612 .It Fn m_freem mbuf
613 Free an entire
614 .Vt mbuf chain ,
615 including any external storage.
616 .\"
617 .It Fn m_adj mbuf len
618 Trim
619 .Fa len
620 bytes from the head of an
621 .Vt mbuf chain
622 if
623 .Fa len
624 is positive, from the tail otherwise.
625 .\"
626 .It Fn m_append mbuf len cp
627 Append
628 .Vt len
629 bytes of data
630 .Vt cp
631 to the
632 .Vt mbuf chain .
633 Extend the mbuf chain if the new data does not fit in
634 existing space.
635 .\"
636 .It Fn m_prepend mbuf len how
637 Allocate a new
638 .Vt mbuf
639 and prepend it to the
640 .Vt mbuf chain ,
641 handle
642 .Dv M_PKTHDR
643 properly.
644 .Sy Note :
645 It does not allocate any
646 .Vt mbuf clusters ,
647 so
648 .Fa len
649 must be less than
650 .Dv MLEN
651 or
652 .Dv MHLEN ,
653 depending on the
654 .Dv M_PKTHDR
655 flag setting.
656 .\"
657 .It Fn m_copyup mbuf len dstoff
658 Similar to
659 .Fn m_pullup
660 but copies
661 .Fa len
662 bytes of data into a new mbuf at
663 .Fa dstoff
664 bytes into the mbuf.
665 The
666 .Fa dstoff
667 argument aligns the data and leaves room for a link layer header.
668 Returns the new
669 .Vt mbuf chain
670 on success,
671 and frees the
672 .Vt mbuf chain
673 and returns
674 .Dv NULL
675 on failure.
676 .Sy Note :
677 The function does not allocate
678 .Vt mbuf clusters ,
679 so
680 .Fa len + dstoff
681 must be less than
682 .Dv MHLEN .
683 .\"
684 .It Fn m_pullup mbuf len
685 Arrange that the first
686 .Fa len
687 bytes of an
688 .Vt mbuf chain
689 are contiguous and lay in the data area of
690 .Fa mbuf ,
691 so they are accessible with
692 .Fn mtod mbuf type .
693 It is important to remember that this may involve
694 reallocating some mbufs and moving data so all pointers
695 referencing data within the old mbuf chain
696 must be recalculated or made invalid.
697 Return the new
698 .Vt mbuf chain
699 on success,
700 .Dv NULL
701 on failure
702 (the
703 .Vt mbuf chain
704 is freed in this case).
705 .Sy Note :
706 It does not allocate any
707 .Vt mbuf clusters ,
708 so
709 .Fa len
710 must be less than
711 .Dv MHLEN .
712 .\"
713 .It Fn m_pulldown mbuf offset len offsetp
714 Arrange that
715 .Fa len
716 bytes between
717 .Fa offset
718 and
719 .Fa offset + len
720 in the
721 .Vt mbuf chain
722 are contiguous and lay in the data area of
723 .Fa mbuf ,
724 so they are accessible with
725 .Fn mtod mbuf type .
726 .Fa len
727 must be smaller than, or equal to, the size of an
728 .Vt mbuf cluster .
729 Return a pointer to an intermediate
730 .Vt mbuf
731 in the chain containing the requested region;
732 the offset in the data region of the
733 .Vt mbuf chain
734 to the data contained in the returned mbuf is stored in
735 .Fa *offsetp .
736 If
737 .Fa offp
738 is NULL, the region may be accessed using
739 .Fn mtod mbuf type .
740 If
741 .Fa offp
742 is non-NULL, the region may be accessed using
743 .Fn mtod mbuf uint8_t + *offsetp .
744 The region of the mbuf chain between its beginning and
745 .Fa off
746 is not modified, therefore it is safe to hold pointers to data within
747 this region before calling
748 .Fn m_pulldown .
749 .\"
750 .It Fn m_copym mbuf offset len how
751 Make a copy of an
752 .Vt mbuf chain
753 starting
754 .Fa offset
755 bytes from the beginning, continuing for
756 .Fa len
757 bytes.
758 If
759 .Fa len
760 is
761 .Dv M_COPYALL ,
762 copy to the end of the
763 .Vt mbuf chain .
764 .Sy Note :
765 The copy is read-only, because the
766 .Vt mbuf clusters
767 are not copied, only their reference counts are incremented.
768 .\"
769 .It Fn m_copypacket mbuf how
770 Copy an entire packet including header, which must be present.
771 This is an optimized version of the common case
772 .Fn m_copym mbuf 0 M_COPYALL how .
773 .Sy Note :
774 the copy is read-only, because the
775 .Vt mbuf clusters
776 are not copied, only their reference counts are incremented.
777 .\"
778 .It Fn m_dup mbuf how
779 Copy a packet header
780 .Vt mbuf chain
781 into a completely new
782 .Vt mbuf chain ,
783 including copying any
784 .Vt mbuf clusters .
785 Use this instead of
786 .Fn m_copypacket
787 when you need a writable copy of an
788 .Vt mbuf chain .
789 .\"
790 .It Fn m_copydata mbuf offset len buf
791 Copy data from an
792 .Vt mbuf chain
793 starting
794 .Fa off
795 bytes from the beginning, continuing for
796 .Fa len
797 bytes, into the indicated buffer
798 .Fa buf .
799 .\"
800 .It Fn m_copyback mbuf offset len buf
801 Copy
802 .Fa len
803 bytes from the buffer
804 .Fa buf
805 back into the indicated
806 .Vt mbuf chain ,
807 starting at
808 .Fa offset
809 bytes from the beginning of the
810 .Vt mbuf chain ,
811 extending the
812 .Vt mbuf chain
813 if necessary.
814 .Sy Note :
815 It does not allocate any
816 .Vt mbuf clusters ,
817 just adds
818 .Vt mbufs
819 to the
820 .Vt mbuf chain .
821 It is safe to set
822 .Fa offset
823 beyond the current
824 .Vt mbuf chain
825 end: zeroed
826 .Vt mbufs
827 will be allocated to fill the space.
828 .\"
829 .It Fn m_length mbuf last
830 Return the length of the
831 .Vt mbuf chain ,
832 and optionally a pointer to the last
833 .Vt mbuf .
834 .\"
835 .It Fn m_dup_pkthdr to from how
836 Upon the function's completion, the
837 .Vt mbuf
838 .Fa to
839 will contain an identical copy of
840 .Fa from->m_pkthdr
841 and the per-packet attributes found in the
842 .Vt mbuf chain
843 .Fa from .
844 The
845 .Vt mbuf
846 .Fa from
847 must have the flag
848 .Dv M_PKTHDR
849 initially set, and
850 .Fa to
851 must be empty on entry.
852 .\"
853 .It Fn m_move_pkthdr to from
854 Move
855 .Va m_pkthdr
856 and the per-packet attributes from the
857 .Vt mbuf chain
858 .Fa from
859 to the
860 .Vt mbuf
861 .Fa to .
862 The
863 .Vt mbuf
864 .Fa from
865 must have the flag
866 .Dv M_PKTHDR
867 initially set, and
868 .Fa to
869 must be empty on entry.
870 Upon the function's completion,
871 .Fa from
872 will have the flag
873 .Dv M_PKTHDR
874 and the per-packet attributes cleared.
875 .\"
876 .It Fn m_fixhdr mbuf
877 Set the packet-header length to the length of the
878 .Vt mbuf chain .
879 .\"
880 .It Fn m_devget buf len offset ifp copy
881 Copy data from a device local memory pointed to by
882 .Fa buf
883 to an
884 .Vt mbuf chain .
885 The copy is done using a specified copy routine
886 .Fa copy ,
887 or
888 .Fn bcopy
889 if
890 .Fa copy
891 is
892 .Dv NULL .
893 .\"
894 .It Fn m_cat m n
895 Concatenate
896 .Fa n
897 to
898 .Fa m .
899 Both
900 .Vt mbuf chains
901 must be of the same type.
902 .Fa N
903 is still valid after the function returned.
904 .Sy Note :
905 It does not handle
906 .Dv M_PKTHDR
907 and friends.
908 .\"
909 .It Fn m_split mbuf len how
910 Partition an
911 .Vt mbuf chain
912 in two pieces, returning the tail:
913 all but the first
914 .Fa len
915 bytes.
916 In case of failure, it returns
917 .Dv NULL
918 and attempts to restore the
919 .Vt mbuf chain
920 to its original state.
921 .\"
922 .It Fn m_apply mbuf off len f arg
923 Apply a function to an
924 .Vt mbuf chain ,
925 at offset
926 .Fa off ,
927 for length
928 .Fa len
929 bytes.
930 Typically used to avoid calls to
931 .Fn m_pullup
932 which would otherwise be unnecessary or undesirable.
933 .Fa arg
934 is a convenience argument which is passed to the callback function
935 .Fa f .
936 .Pp
937 Each time
938 .Fn f
939 is called, it will be passed
940 .Fa arg ,
941 a pointer to the
942 .Fa data
943 in the current mbuf, and the length
944 .Fa len
945 of the data in this mbuf to which the function should be applied.
946 .Pp
947 The function should return zero to indicate success;
948 otherwise, if an error is indicated, then
949 .Fn m_apply
950 will return the error and stop iterating through the
951 .Vt mbuf chain .
952 .\"
953 .It Fn m_getptr mbuf loc off
954 Return a pointer to the mbuf containing the data located at
955 .Fa loc
956 bytes from the beginning of the
957 .Vt mbuf chain .
958 The corresponding offset into the mbuf will be stored in
959 .Fa *off .
960 .It Fn m_defrag m0 how
961 Defragment an mbuf chain, returning the shortest possible
962 chain of mbufs and clusters.
963 If allocation fails and this can not be completed,
964 .Dv NULL
965 will be returned and the original chain will be unchanged.
966 Upon success, the original chain will be freed and the new
967 chain will be returned.
968 .Fa how
969 should be either
970 .Dv M_WAITOK
971 or
972 .Dv M_NOWAIT ,
973 depending on the caller's preference.
974 .Pp
975 This function is especially useful in network drivers, where
976 certain long mbuf chains must be shortened before being added
977 to TX descriptor lists.
978 .It Fn m_unshare m0 how
979 Create a version of the specified mbuf chain whose
980 contents can be safely modified without affecting other users.
981 If allocation fails and this operation can not be completed,
982 .Dv NULL
983 will be returned.
984 The original mbuf chain is always reclaimed and the reference
985 count of any shared mbuf clusters is decremented.
986 .Fa how
987 should be either
988 .Dv M_WAITOK
989 or
990 .Dv M_NOWAIT ,
991 depending on the caller's preference.
992 As a side-effect of this process the returned
993 mbuf chain may be compacted.
994 .Pp
995 This function is especially useful in the transmit path of
996 network code, when data must be encrypted or otherwise
997 altered prior to transmission.
998 .El
999 .Sh HARDWARE-ASSISTED CHECKSUM CALCULATION
1000 This section currently applies to TCP/IP only.
1001 In order to save the host CPU resources, computing checksums is
1002 offloaded to the network interface hardware if possible.
1003 The
1004 .Va m_pkthdr
1005 member of the leading
1006 .Vt mbuf
1007 of a packet contains two fields used for that purpose,
1008 .Vt int Va csum_flags
1009 and
1010 .Vt int Va csum_data .
1011 The meaning of those fields depends on the direction a packet flows in,
1012 and on whether the packet is fragmented.
1013 Henceforth,
1014 .Va csum_flags
1015 or
1016 .Va csum_data
1017 of a packet
1018 will denote the corresponding field of the
1019 .Va m_pkthdr
1020 member of the leading
1021 .Vt mbuf
1022 in the
1023 .Vt mbuf chain
1024 containing the packet.
1025 .Pp
1026 On output, checksum offloading is attempted after the outgoing
1027 interface has been determined for a packet.
1028 The interface-specific field
1029 .Va ifnet.if_data.ifi_hwassist
1030 (see
1031 .Xr ifnet 9 )
1032 is consulted for the capabilities of the interface to assist in
1033 computing checksums.
1034 The
1035 .Va csum_flags
1036 field of the packet header is set to indicate which actions the interface
1037 is supposed to perform on it.
1038 The actions unsupported by the network interface are done in the
1039 software prior to passing the packet down to the interface driver;
1040 such actions will never be requested through
1041 .Va csum_flags .
1042 .Pp
1043 The flags demanding a particular action from an interface are as follows:
1044 .Bl -tag -width ".Dv CSUM_TCP" -offset indent
1045 .It Dv CSUM_IP
1046 The IP header checksum is to be computed and stored in the
1047 corresponding field of the packet.
1048 The hardware is expected to know the format of an IP header
1049 to determine the offset of the IP checksum field.
1050 .It Dv CSUM_TCP
1051 The TCP checksum is to be computed.
1052 (See below.)
1053 .It Dv CSUM_UDP
1054 The UDP checksum is to be computed.
1055 (See below.)
1056 .El
1057 .Pp
1058 Should a TCP or UDP checksum be offloaded to the hardware,
1059 the field
1060 .Va csum_data
1061 will contain the byte offset of the checksum field relative to the
1062 end of the IP header.
1063 In this case, the checksum field will be initially
1064 set by the TCP/IP module to the checksum of the pseudo header
1065 defined by the TCP and UDP specifications.
1066 .Pp
1067 On input, an interface indicates the actions it has performed
1068 on a packet by setting one or more of the following flags in
1069 .Va csum_flags
1070 associated with the packet:
1071 .Bl -tag -width ".Dv CSUM_IP_CHECKED" -offset indent
1072 .It Dv CSUM_IP_CHECKED
1073 The IP header checksum has been computed.
1074 .It Dv CSUM_IP_VALID
1075 The IP header has a valid checksum.
1076 This flag can appear only in combination with
1077 .Dv CSUM_IP_CHECKED .
1078 .It Dv CSUM_DATA_VALID
1079 The checksum of the data portion of the IP packet has been computed
1080 and stored in the field
1081 .Va csum_data
1082 in network byte order.
1083 .It Dv CSUM_PSEUDO_HDR
1084 Can be set only along with
1085 .Dv CSUM_DATA_VALID
1086 to indicate that the IP data checksum found in
1087 .Va csum_data
1088 allows for the pseudo header defined by the TCP and UDP specifications.
1089 Otherwise the checksum of the pseudo header must be calculated by
1090 the host CPU and added to
1091 .Va csum_data
1092 to obtain the final checksum to be used for TCP or UDP validation purposes.
1093 .El
1094 .Pp
1095 If a particular network interface just indicates success or
1096 failure of TCP or UDP checksum validation without returning
1097 the exact value of the checksum to the host CPU, its driver can mark
1098 .Dv CSUM_DATA_VALID
1099 and
1100 .Dv CSUM_PSEUDO_HDR
1101 in
1102 .Va csum_flags ,
1103 and set
1104 .Va csum_data
1105 to
1106 .Li 0xFFFF
1107 hexadecimal to indicate a valid checksum.
1108 It is a peculiarity of the algorithm used that the Internet checksum
1109 calculated over any valid packet will be
1110 .Li 0xFFFF
1111 as long as the original checksum field is included.
1112 .Sh STRESS TESTING
1113 When running a kernel compiled with the option
1114 .Dv MBUF_STRESS_TEST ,
1115 the following
1116 .Xr sysctl 8 Ns
1117 -controlled options may be used to create
1118 various failure/extreme cases for testing of network drivers
1119 and other parts of the kernel that rely on
1120 .Vt mbufs .
1121 .Bl -tag -width ident
1122 .It Va net.inet.ip.mbuf_frag_size
1123 Causes
1124 .Fn ip_output
1125 to fragment outgoing
1126 .Vt mbuf chains
1127 into fragments of the specified size.
1128 Setting this variable to 1 is an excellent way to
1129 test the long
1130 .Vt mbuf chain
1131 handling ability of network drivers.
1132 .It Va kern.ipc.m_defragrandomfailures
1133 Causes the function
1134 .Fn m_defrag
1135 to randomly fail, returning
1136 .Dv NULL .
1137 Any piece of code which uses
1138 .Fn m_defrag
1139 should be tested with this feature.
1140 .El
1141 .Sh RETURN VALUES
1142 See above.
1143 .Sh SEE ALSO
1144 .Xr ifnet 9 ,
1145 .Xr mbuf_tags 9
1146 .Sh HISTORY
1147 .\" Please correct me if I'm wrong
1148 .Vt Mbufs
1149 appeared in an early version of
1150 .Bx .
1151 Besides being used for network packets, they were used
1152 to store various dynamic structures, such as routing table
1153 entries, interface addresses, protocol control blocks, etc.
1154 In more recent
1155 .Fx
1156 use of
1157 .Vt mbufs
1158 is almost entirely limited to packet storage, with
1159 .Xr uma 9
1160 zones being used directly to store other network-related memory.
1161 .Pp
1162 Historically, the
1163 .Vt mbuf
1164 allocator has been a special-purpose memory allocator able to run in
1165 interrupt contexts and allocating from a special kernel address space map.
1166 As of
1167 .Fx 5.3 ,
1168 the
1169 .Vt mbuf
1170 allocator is a wrapper around
1171 .Xr uma 9 ,
1172 allowing caching of
1173 .Vt mbufs ,
1174 clusters, and
1175 .Vt mbuf
1176 + cluster pairs in per-CPU caches, as well as bringing other benefits of
1177 slab allocation.
1178 .Sh AUTHORS
1179 The original
1180 .Nm
1181 manual page was written by Yar Tikhiy.
1182 The
1183 .Xr uma 9
1184 .Vt mbuf
1185 allocator was written by Bosko Milekic.