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 365d4050ccSBosko Milekic.Fd #include <machine/param.h> 37de06f907SNik Clayton.Fd #include <sys/mbuf.h> 38de06f907SNik Clayton.\" 39bfd59721SBosko Milekic.Ss Mbuf allocation macros 40de06f907SNik Clayton.Fn MGET "struct mbuf *mbuf" "int how" "short type" 41de06f907SNik Clayton.Fn MGETHDR "struct mbuf *mbuf" "int how" "short type" 42de06f907SNik Clayton.Fn MCLGET "struct mbuf *mbuf" "int how" 43bfd59721SBosko Milekic.Fo MEXTADD 44bfd59721SBosko Milekic.Fa "struct mbuf *mbuf" 45bfd59721SBosko Milekic.Fa "caddr_t buf" 46bfd59721SBosko Milekic.Fa "u_int size" 47bfd59721SBosko Milekic.Fa "void (*free)(void *opt_args)" 48bfd59721SBosko Milekic.Fa "void *opt_args" 495d4050ccSBosko Milekic.Fa "short flags" 505d4050ccSBosko Milekic.Fa "int type" 51bfd59721SBosko Milekic.Fc 52bfd59721SBosko Milekic.Fn MEXTFREE "struct mbuf *mbuf" 53bfd59721SBosko Milekic.Fn MEXT_ADD_REF "struct mbuf *mbuf" 54bfd59721SBosko Milekic.Fn MEXT_REM_REF "struct mbuf *mbuf" 55bfd59721SBosko Milekic.Fn MFREE "struct mbuf *mbuf" "struct mbuf *successor" 56de06f907SNik Clayton.\" 57bfd59721SBosko Milekic.Ss Mbuf utility macros 58bfd59721SBosko Milekic.Fn mtod "struct mbuf *mbuf" "any type" 59bfd59721SBosko Milekic.Fn MEXT_IS_REF "struct mbuf *mbuf" 60bfd59721SBosko Milekic.Fn M_COPY_PKTHDR "struct mbuf *to" "struct mbuf *from" 61bfd59721SBosko Milekic.Fn M_ALIGN "struct mbuf *mbuf" "u_int len" 62bfd59721SBosko Milekic.Fn MH_ALIGN "struct mbuf *mbuf" "u_int len" 63bfd59721SBosko Milekic.Fn M_LEADINGSPACE "struct mbuf *mbuf" 64bfd59721SBosko Milekic.Fn M_TRAILINGSPACE "struct mbuf *mbuf" 65bfd59721SBosko Milekic.Fn M_PREPEND "struct mbuf *mbuf" "int len" "int how" 66bfd59721SBosko Milekic.Fn MCHTYPE "struct mbuf *mbuf" "u_int type" 675d4050ccSBosko Milekic.Fn M_WRITABLE "struct mbuf *mbuf" 68bfd59721SBosko Milekic.\" 69bfd59721SBosko Milekic.Ss Mbuf allocation functions 70de06f907SNik Clayton.Ft struct mbuf * 71de06f907SNik Clayton.Fn m_get "int how" "int type" 72de06f907SNik Clayton.Ft struct mbuf * 73de06f907SNik Clayton.Fn m_getclr "int how" "int type" 74de06f907SNik Clayton.Ft struct mbuf * 75de06f907SNik Clayton.Fn m_gethdr "int how" "int type" 76bfd59721SBosko Milekic.Ft struct mbuf * 77bfd59721SBosko Milekic.Fn m_free "struct mbuf *mbuf" 78de06f907SNik Clayton.Ft void 79de06f907SNik Clayton.Fn m_freem "struct mbuf *mbuf" 80bfd59721SBosko Milekic.\" 81bfd59721SBosko Milekic.Ss Mbuf utility functions 82de06f907SNik Clayton.Ft void 83de06f907SNik Clayton.Fn m_adj "struct mbuf *mbuf" "int len" 84de06f907SNik Clayton.Ft struct mbuf * 85de06f907SNik Clayton.Fn m_prepend "struct mbuf *mbuf" "int len" "int how" 86de06f907SNik Clayton.Ft struct mbuf * 87de06f907SNik Clayton.Fn m_pullup "struct mbuf *mbuf" "int len" 88de06f907SNik Clayton.Ft struct mbuf * 89de06f907SNik Clayton.Fn m_copym "struct mbuf *mbuf" "int offset" "int len" "int how" 90de06f907SNik Clayton.Ft struct mbuf * 91de06f907SNik Clayton.Fn m_copypacket "struct mbuf *mbuf" "int how" 92de06f907SNik Clayton.Ft struct mbuf * 93de06f907SNik Clayton.Fn m_dup "struct mbuf *mbuf" "int how" 94de06f907SNik Clayton.Ft void 95de06f907SNik Clayton.Fn m_copydata "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf" 96de06f907SNik Clayton.Ft void 97de06f907SNik Clayton.Fn m_copyback "struct mbuf *mbuf" "int offset" "int len" "caddr_t buf" 98de06f907SNik Clayton.Ft struct mbuf * 99de06f907SNik Clayton.Fo m_devget 100de06f907SNik Clayton.Fa "char *buf" 101de06f907SNik Clayton.Fa "int len" 102de06f907SNik Clayton.Fa "int offset" 103de06f907SNik Clayton.Fa "struct ifnet *ifp" 104de06f907SNik Clayton.Fa "void (*copy)(char *from, caddr_t to, u_int len)" 105de06f907SNik Clayton.Fc 106de06f907SNik Clayton.Ft void 107de06f907SNik Clayton.Fn m_cat "struct mbuf *m" "struct mbuf *n" 108de06f907SNik Clayton.Ft struct mbuf * 109de06f907SNik Clayton.Fn m_split "struct mbuf *mbuf" "int len" "int how" 110de06f907SNik Clayton.\" 111de06f907SNik Clayton.Sh DESCRIPTION 112bfd59721SBosko MilekicAn mbuf is a basic unit of memory management in the kernel IPC subsystem. 113e73145f6SSheldon HearnNetwork packets and socket buffers are stored in mbufs. 114e73145f6SSheldon HearnA network packet may span multiple mbufs arranged into a chain 115de06f907SNik Clayton.Pq linked list , 116de06f907SNik Claytonwhich allows adding or trimming 117bfd59721SBosko Milekicnetwork headers with little overhead. 118de06f907SNik Clayton.Pp 119bfd59721SBosko MilekicWhile a developer should not bother with mbuf internals without serious 120de06f907SNik Claytonreason in order to avoid incompatibilities with future changes, it 121bfd59721SBosko Milekicis useful to understand the mbuf's general structure. 122de06f907SNik Clayton.Pp 123bfd59721SBosko MilekicAn mbuf consists of a variable-sized header and a small internal 124e73145f6SSheldon Hearnbuffer for data. 125e73145f6SSheldon HearnThe mbuf's total size, 126bfd59721SBosko Milekic.Dv MSIZE , 127de06f907SNik Claytonis a machine-dependent constant defined in 128de06f907SNik Clayton.Pa machine/param.h . 129de06f907SNik ClaytonThe mbuf header includes: 130de06f907SNik Clayton.Pp 131de06f907SNik Clayton.Bl -tag -width "m_nextpkt" -compact -offset indent 132de06f907SNik Clayton.It Fa m_next 133de06f907SNik Claytona pointer to the next buffer in the chain 134de06f907SNik Clayton.It Fa m_nextpkt 135de06f907SNik Claytona pointer to the next chain in the queue 136de06f907SNik Clayton.It Fa m_data 137de06f907SNik Claytona pointer to the data 138de06f907SNik Clayton.It Fa m_len 139de06f907SNik Claytonthe length of the data 140de06f907SNik Clayton.It Fa m_type 141bfd59721SBosko Milekicthe type of data 142de06f907SNik Clayton.It Fa m_flags 143de06f907SNik Claytonthe mbuf flags 144de06f907SNik Clayton.El 145de06f907SNik Clayton.Pp 146de06f907SNik ClaytonThe mbuf flag bits are defined as follows: 147de06f907SNik Clayton.Bd -literal 148de06f907SNik Clayton/* mbuf flags */ 149de06f907SNik Clayton#define M_EXT 0x0001 /* has associated external storage */ 150de06f907SNik Clayton#define M_PKTHDR 0x0002 /* start of record */ 151de06f907SNik Clayton#define M_EOR 0x0004 /* end of record */ 1525d4050ccSBosko Milekic#define M_RDONLY 0x0008 /* associated data marked read-only */ 1535d4050ccSBosko Milekic#define M_PROTO1 0x0010 /* protocol-specific */ 1545d4050ccSBosko Milekic#define M_PROTO2 0x0020 /* protocol-specific */ 1555d4050ccSBosko Milekic#define M_PROTO3 0x0040 /* protocol-specific */ 1565d4050ccSBosko Milekic#define M_PROTO4 0x0080 /* protocol-specific */ 1575d4050ccSBosko Milekic#define M_PROTO5 0x0100 /* protocol-specific */ 158de06f907SNik Clayton 159de06f907SNik Clayton/* mbuf pkthdr flags, also in m_flags */ 1605d4050ccSBosko Milekic#define M_BCAST 0x0200 /* send/received as link-level broadcast */ 1615d4050ccSBosko Milekic#define M_MCAST 0x0400 /* send/received as link-level multicast */ 1625d4050ccSBosko Milekic#define M_FRAG 0x0800 /* packet is fragment of larger packet */ 1635d4050ccSBosko Milekic#define M_FIRSTFRAG 0x1000 /* packet is first fragment */ 1645d4050ccSBosko Milekic#define M_LASTFRAG 0x2000 /* packet is last fragment */ 165de06f907SNik Clayton.Ed 166de06f907SNik Clayton.Pp 167bfd59721SBosko MilekicThe available mbuf types are defined as follows: 168de06f907SNik Clayton.Bd -literal 169de06f907SNik Clayton/* mbuf types */ 170de06f907SNik Clayton#define MT_FREE 0 /* should be on free list */ 171de06f907SNik Clayton#define MT_DATA 1 /* dynamic (data) allocation */ 172de06f907SNik Clayton#define MT_HEADER 2 /* packet header */ 173de06f907SNik Clayton#define MT_SONAME 8 /* socket name */ 174de06f907SNik Clayton#define MT_FTABLE 11 /* fragment reassembly header */ 175de06f907SNik Clayton#define MT_CONTROL 14 /* extra-data protocol message */ 176de06f907SNik Clayton#define MT_OOBDATA 15 /* expedited data */ 177de06f907SNik Clayton.Ed 178de06f907SNik Clayton.Pp 179de06f907SNik ClaytonIf the 180de06f907SNik Clayton.Dv M_PKTHDR 181de06f907SNik Claytonflag is set, a 18225f1a2e9SSheldon Hearn.Li struct pkthdr m_pkthdr 183e73145f6SSheldon Hearnis added to the mbuf header. 184e73145f6SSheldon HearnIt contains a pointer to the interface 185de06f907SNik Claytonthe packet has been received from 186de06f907SNik Clayton.Pq Fa struct ifnet *rcvif , 187de06f907SNik Claytonand the total packet length 188de06f907SNik Clayton.Pq Fa int len . 189de06f907SNik Clayton.Pp 190e73145f6SSheldon HearnIf small enough, data is stored in the mbuf's internal data buffer. 191e73145f6SSheldon HearnIf the data is sufficiently large, another mbuf may be added to the chain, 192e73145f6SSheldon Hearnor external storage may be associated with the mbuf. 193de06f907SNik Clayton.Dv MHLEN 19425f1a2e9SSheldon Hearnbytes of data can fit into an mbuf with the 195de06f907SNik Clayton.Dv M_PKTHDR 196de06f907SNik Claytonflag set, 197de06f907SNik Clayton.Dv MLEN 198de06f907SNik Claytonbytes can otherwise. 199de06f907SNik Clayton.Pp 200bfd59721SBosko MilekicIf external storage is being associated with an mbuf, the 201bfd59721SBosko Milekic.Dv m_ext 20225f1a2e9SSheldon Hearnheader is added at the cost of losing the internal data buffer. 203e73145f6SSheldon HearnIt includes a pointer to external storage, the size of the storage, 204e73145f6SSheldon Hearna pointer to a function used for freeing the storage, 205e73145f6SSheldon Hearna pointer to an optional argument that can be passed to the function, 206e73145f6SSheldon Hearnand a pointer to a reference counter. 207e73145f6SSheldon HearnAn mbuf using external storage has the 208de06f907SNik Clayton.Dv M_EXT 209de06f907SNik Claytonflag set. 210de06f907SNik Clayton.Pp 211bfd59721SBosko MilekicThe system supplies a macro for allocating the desired external storage 212bfd59721SBosko Milekicbuffer, 213bfd59721SBosko Milekic.Dv MEXTADD . 214bfd59721SBosko Milekic.Pp 215bfd59721SBosko MilekicThe allocation and management of the reference counter is handled by the 216e73145f6SSheldon Hearnsubsystem. 217e73145f6SSheldon HearnThe developer can check whether the reference count for the 218bfd59721SBosko Milekicgiven mbuf's external storage is greater than 1 with the 219bfd59721SBosko Milekic.Dv MEXT_IS_REF 220e73145f6SSheldon Hearnmacro. 221e73145f6SSheldon HearnSimilarly, the developer can directly add and remove references, 222e73145f6SSheldon Hearnif absolutely necessary, with the use of the 223bfd59721SBosko Milekic.Dv MEXT_ADD_REF 224bfd59721SBosko Milekicand 225bfd59721SBosko Milekic.Dv MEXT_REM_REF 226bfd59721SBosko Milekicmacros. 227bfd59721SBosko Milekic.Pp 228bfd59721SBosko MilekicThe system also supplies a default type of external storage buffer called an 229bfd59721SBosko Milekic.Dq mbuf cluster . 230bfd59721SBosko MilekicMbuf clusters can be allocated and configured with the use of the 231bfd59721SBosko Milekic.Dv MCLGET 232e73145f6SSheldon Hearnmacro. 233e73145f6SSheldon HearnEach cluster is 234de06f907SNik Clayton.Dv MCLBYTES 235bfd59721SBosko Milekicin size, where MCLBYTES is a machine-dependent constant. 236bfd59721SBosko MilekicThe system defines an advisory macro 237de06f907SNik Clayton.Dv MINCLSIZE , 238de06f907SNik Claytonwhich is the smallest amount of data to put into a cluster. 239de06f907SNik ClaytonIt's equal to the sum of 240de06f907SNik Clayton.Dv MLEN 241de06f907SNik Claytonand 242de06f907SNik Clayton.Dv MHLEN . 243bfd59721SBosko MilekicIt is typically preferable to store data into an mbuf's data region, if size 244bfd59721SBosko Milekicpermits, as opposed to allocating a separate mbuf cluster to hold the same 245bfd59721SBosko Milekicdata. 246de06f907SNik Clayton.\" 247de06f907SNik Clayton.Ss Macros and Functions 248bfd59721SBosko MilekicThere are numerous predefined macros and functions that provide the 249bfd59721SBosko Milekicdeveloper with common utilities. 250de06f907SNik Clayton.\" 251de06f907SNik Clayton.Bl -ohang -offset indent 252de06f907SNik Clayton.It Fn mtod mbuf type 253bfd59721SBosko MilekicConvert an mbuf pointer to a data pointer. 254bfd59721SBosko MilekicThe macro expands to the data pointer cast to the pointer of the specified type. 255de06f907SNik Clayton.Sy Note : 256bfd59721SBosko MilekicIt is advisable to ensure that there is enough contiguous data in the mbuf. 257de06f907SNik ClaytonSee 258de06f907SNik Clayton.Fn m_pullup 259de06f907SNik Claytonfor details. 260de06f907SNik Clayton.It Fn MGET mbuf how type 261bfd59721SBosko MilekicAllocate an mbuf and initialize it to contain internal data. 26225f1a2e9SSheldon Hearn.Fa mbuf 263bfd59721SBosko Milekicwill point to the allocated mbuf on success, or be set to 264de06f907SNik Clayton.Dv NULL 265e73145f6SSheldon Hearnon failure. 266e73145f6SSheldon HearnThe 267de06f907SNik Clayton.Fa how 268de06f907SNik Claytonargument is to be set to 269f73f120bSBosko Milekic.Dv M_TRYWAIT 270de06f907SNik Claytonor 271de06f907SNik Clayton.Dv M_DONTWAIT . 27225f1a2e9SSheldon HearnIt specifies whether the caller is willing to block if necessary. 273e73145f6SSheldon HearnIf 274de06f907SNik Clayton.Fa how 27525f1a2e9SSheldon Hearnis set to 276f73f120bSBosko Milekic.Dv M_TRYWAIT , 27725f1a2e9SSheldon Hearna failed allocation will result in the caller being put 278bfd59721SBosko Milekicto sleep for a designated 27925f1a2e9SSheldon Hearnkern.ipc.mbuf_wait 28025f1a2e9SSheldon Hearn.Po 28125f1a2e9SSheldon Hearn.Xr sysctl 8 28225f1a2e9SSheldon Hearntunable 28325f1a2e9SSheldon Hearn.Pc 28425f1a2e9SSheldon Hearnnumber of ticks. 285bfd59721SBosko MilekicA number of other mbuf-related 286de06f907SNik Claytonfunctions and macros have the same argument because they may 287bfd59721SBosko Milekicat some point need to allocate new mbufs. 288de06f907SNik Clayton.It Fn MGETHDR mbuf how type 289bfd59721SBosko MilekicAllocate an mbuf and initialize it to contain a packet header 290e73145f6SSheldon Hearnand internal data. 291e73145f6SSheldon HearnSee 292de06f907SNik Clayton.Fn MGET 293de06f907SNik Claytonfor details. 294de06f907SNik Clayton.It Fn MCLGET mbuf how 295e73145f6SSheldon HearnAllocate and attach an mbuf cluster to an mbuf. 296e73145f6SSheldon HearnIf the macro fails, the 297de06f907SNik Clayton.Dv M_EXT 298de06f907SNik Claytonflag won't be set in the mbuf. 299de06f907SNik Clayton.It Fn M_PREPEND mbuf len how 300bfd59721SBosko MilekicThis macro operates on an mbuf chain. 301de06f907SNik ClaytonIt is an optimized wrapper for 302de06f907SNik Clayton.Fn m_prepend 303de06f907SNik Claytonthat can make use of possible empty space before data 304de06f907SNik Clayton.Pq "e.g. left after trimming of a link-layer header" . 305de06f907SNik ClaytonThe new chain pointer or 306de06f907SNik Clayton.Dv NULL 307de06f907SNik Claytonis in 308de06f907SNik Clayton.Fa mbuf 309de06f907SNik Claytonafter the call. 3105d4050ccSBosko Milekic.It Fn M_WRITABLE mbuf 3115d4050ccSBosko MilekicThis macro will evaluate true if the mbuf is not marked 3125d4050ccSBosko Milekic.Dv M_RDONLY 3135d4050ccSBosko Milekicand if either the mbuf does not contain external storage or, 3145d4050ccSBosko Milekicif it does, 3155d4050ccSBosko Milekicthen if the reference count of the storage is not greater than 1. 3165d4050ccSBosko MilekicThe 3175d4050ccSBosko Milekic.Dv M_RDONLY 3185d4050ccSBosko Milekicflag can be set in the mbuf's 3195d4050ccSBosko Milekic.Dv m_flags . 3205d4050ccSBosko MilekicThis can be achieved during setup of the external storage, 3215d4050ccSBosko Milekicby passing the 3225d4050ccSBosko Milekic.Dv M_RDONLY 3235d4050ccSBosko Milekicbit as a 3245d4050ccSBosko Milekic.Ar flags 3255d4050ccSBosko Milekicargument to the 3265d4050ccSBosko Milekic.Fn MEXTADD 3275d4050ccSBosko Milekicmacro, or can be directly set in individual mbufs. 328de06f907SNik Clayton.El 329de06f907SNik Clayton.Pp 330de06f907SNik ClaytonThe functions are: 331de06f907SNik Clayton.Bl -ohang -offset indent 332de06f907SNik Clayton.It Fn m_get how type 333de06f907SNik ClaytonA function version of 334bfd59721SBosko Milekic.Fn MGET 335bfd59721SBosko Milekicfor non-critical paths. 336de06f907SNik Clayton.It Fn m_gethdr how type 337de06f907SNik ClaytonA function version of 338bfd59721SBosko Milekic.Fn MGETHDR 339bfd59721SBosko Milekicfor non-critical paths. 340de06f907SNik Clayton.It Fn m_getclr how type 341bfd59721SBosko MilekicAllocate an mbuf and zero out the data region. 342de06f907SNik Clayton.El 343de06f907SNik Clayton.Pp 344de06f907SNik ClaytonThe functions below operate on mbuf chains. 345de06f907SNik Clayton.Bl -ohang -offset indent 346de06f907SNik Clayton.It Fn m_freem mbuf 347de06f907SNik ClaytonFree an entire mbuf chain, including any external 348de06f907SNik Claytonstorage. 349de06f907SNik Clayton.\" 350de06f907SNik Clayton.It Fn m_adj mbuf len 351de06f907SNik ClaytonTrim 352de06f907SNik Clayton.Fa len 35325f1a2e9SSheldon Hearnbytes from the head of an mbuf chain if 354de06f907SNik Clayton.Fa len 355de06f907SNik Claytonis positive, from the tail otherwise. 356de06f907SNik Clayton.\" 357de06f907SNik Clayton.It Fn m_prepend mbuf len how 358de06f907SNik ClaytonAllocate a new mbuf and prepend it to the chain, handle 359de06f907SNik Clayton.Dv M_PKTHDR 360de06f907SNik Claytonproperly. 361de06f907SNik Clayton.Sy Note : 362de06f907SNik ClaytonIt doesn't allocate any clusters, so 363de06f907SNik Clayton.Fa len 364de06f907SNik Claytonmust be less than 365de06f907SNik Clayton.Dv MLEN 366de06f907SNik Claytonor 367de06f907SNik Clayton.Dv MHLEN , 368de06f907SNik Claytondepending on the 369d0353b83SRuslan Ermilov.Dv M_PKTHDR 370d0353b83SRuslan Ermilovflag setting. 371de06f907SNik Clayton.\" 372de06f907SNik Clayton.It Fn m_pullup mbuf len 373de06f907SNik ClaytonArrange that the first 374de06f907SNik Clayton.Fa len 37525f1a2e9SSheldon Hearnbytes of an mbuf chain are contiguous and lay in the data area of 376de06f907SNik Clayton.Fa mbuf , 377de06f907SNik Claytonso they are accessible with 378de06f907SNik Clayton.Fn mtod mbuf type . 379de06f907SNik ClaytonReturn the new chain on success, 380de06f907SNik Clayton.Dv NULL 381de06f907SNik Claytonon failure 382de06f907SNik Clayton.Pq the chain is freed in this case . 383de06f907SNik Clayton.Sy Note : 384de06f907SNik ClaytonIt doesn't allocate any clusters, so 385de06f907SNik Clayton.Fa len 386de06f907SNik Claytonmust be less than 387de06f907SNik Clayton.Dv MHLEN . 388de06f907SNik Clayton.\" 389de06f907SNik Clayton.It Fn m_copym mbuf offset len how 390de06f907SNik ClaytonMake a copy of an mbuf chain starting 391de06f907SNik Clayton.Fa offset 392de06f907SNik Claytonbytes from the beginning, continuing for 393de06f907SNik Clayton.Fa len 394e73145f6SSheldon Hearnbytes. 395e73145f6SSheldon HearnIf 396de06f907SNik Clayton.Fa len 397de06f907SNik Claytonis 398de06f907SNik Clayton.Dv M_COPYALL , 399de06f907SNik Claytoncopy to the end of the mbuf chain. 400de06f907SNik Clayton.Sy Note : 401de06f907SNik ClaytonThe copy is read-only, because clusters are not 402de06f907SNik Claytoncopied, only their reference counts are incremented. 403de06f907SNik Clayton.\" 404de06f907SNik Clayton.It Fn m_copypacket mbuf how 405de06f907SNik ClaytonCopy an entire packet including header, which must be present. 406de06f907SNik ClaytonThis is an optimized version of the common case 407de06f907SNik Clayton.Fn m_copym mbuf 0 M_COPYALL how . 408de06f907SNik Clayton.Sy Note : 409de06f907SNik Claytonthe copy is read-only, because clusters are not 410de06f907SNik Claytoncopied, only their reference counts are incremented. 411de06f907SNik Clayton.\" 412de06f907SNik Clayton.It Fn m_dup mbuf how 413de06f907SNik ClaytonCopy a packet header mbuf chain into a completely new chain, including 414e73145f6SSheldon Hearncopying any mbuf clusters. 415e73145f6SSheldon HearnUse this instead of 416de06f907SNik Clayton.Fn m_copypacket 417de06f907SNik Claytonwhen you need a writable copy of an mbuf chain. 418de06f907SNik Clayton.\" 419de06f907SNik Clayton.It Fn m_copydata mbuf offset len buf 42025f1a2e9SSheldon HearnCopy data from an mbuf chain starting 421de06f907SNik Clayton.Fa off 422de06f907SNik Claytonbytes from the beginning, continuing for 423de06f907SNik Clayton.Fa len 424de06f907SNik Claytonbytes, into the indicated buffer 425de06f907SNik Clayton.Fa buf . 426de06f907SNik Clayton.\" 427de06f907SNik Clayton.It Fn m_copyback mbuf offset len buf 428de06f907SNik ClaytonCopy 429de06f907SNik Clayton.Fa len 430de06f907SNik Claytonbytes from the buffer 431de06f907SNik Clayton.Fa buf 432de06f907SNik Claytonback into the indicated mbuf chain, 433de06f907SNik Claytonstarting at 434de06f907SNik Clayton.Fa offset 435de06f907SNik Claytonbytes from the beginning of the chain, extending the mbuf chain if necessary. 436de06f907SNik Clayton.Sy Note : 437e73145f6SSheldon HearnIt doesn't allocate any clusters, just adds mbufs to the chain. 438e73145f6SSheldon HearnIt's safe to set 439de06f907SNik Clayton.Fa offset 440de06f907SNik Claytonbeyond the current chain end: zeroed mbufs will be allocated to fill the 441de06f907SNik Claytonspace. 442de06f907SNik Clayton.\" 443de06f907SNik Clayton.It Fn m_devget buf len offset ifp copy 444de06f907SNik ClaytonCopy data from a device local memory pointed to by 445de06f907SNik Clayton.Fa buf 44625f1a2e9SSheldon Hearnto an mbuf chain. 447e73145f6SSheldon HearnThe copy is done using a specified copy routine 448de06f907SNik Clayton.Fa copy , 449de06f907SNik Claytonor 450de06f907SNik Clayton.Fn bcopy 451de06f907SNik Claytonif 452de06f907SNik Clayton.Fa copy 453de06f907SNik Claytonis 454de06f907SNik Clayton.Dv NULL . 455de06f907SNik Clayton.\" 456de06f907SNik Clayton.It Fn m_cat m n 457de06f907SNik ClaytonConcatenate 458de06f907SNik Clayton.Fa n 459de06f907SNik Claytonto 460de06f907SNik Clayton.Fa m . 461de06f907SNik ClaytonBoth chains must be of the same type. 462de06f907SNik Clayton.Fa N 463de06f907SNik Claytonis still valid after the function returned. 464de06f907SNik Clayton.Sy Note : 465de06f907SNik ClaytonIt does not handle 466de06f907SNik Clayton.Dv M_PKTHDR 467de06f907SNik Claytonand friends. 468de06f907SNik Clayton.\" 469de06f907SNik Clayton.It Fn m_split mbuf len how 470de06f907SNik ClaytonPartition an mbuf chain in two pieces, returning the tail: 471de06f907SNik Claytonall but the first 472de06f907SNik Clayton.Fa len 473e73145f6SSheldon Hearnbytes. 474e73145f6SSheldon HearnIn case of failure, it returns 475de06f907SNik Clayton.Dv NULL 476de06f907SNik Claytonand attempts to restore the chain to its original state. 4773136363fSRuslan Ermilov.El 478de06f907SNik Clayton.Sh RETURN VALUES 479de06f907SNik ClaytonSee above. 480de06f907SNik Clayton.Sh HISTORY 481de06f907SNik Clayton.\" Please correct me if I'm wrong 482e73145f6SSheldon HearnMbufs appeared in an early version of BSD. 483e73145f6SSheldon HearnBesides for being used for network packets, they were used 484bfd59721SBosko Milekicto store various dynamic structures, such as routing table 485bfd59721SBosko Milekicentries, interface addresses, protocol control blocks, etc. 486de06f907SNik Clayton.Sh AUTHORS 487bfd59721SBosko MilekicThe original mbuf(9) man page was written by Yar Tikhiy. 488