/ duct-tape / xnu / bsd / sys / kpi_mbuf.h
kpi_mbuf.h
   1  /*
   2   * Copyright (c) 2008-2017 Apple Inc. All rights reserved.
   3   *
   4   * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
   5   *
   6   * This file contains Original Code and/or Modifications of Original Code
   7   * as defined in and that are subject to the Apple Public Source License
   8   * Version 2.0 (the 'License'). You may not use this file except in
   9   * compliance with the License. The rights granted to you under the License
  10   * may not be used to create, or enable the creation or redistribution of,
  11   * unlawful or unlicensed copies of an Apple operating system, or to
  12   * circumvent, violate, or enable the circumvention or violation of, any
  13   * terms of an Apple operating system software license agreement.
  14   *
  15   * Please obtain a copy of the License at
  16   * http://www.opensource.apple.com/apsl/ and read it before using this file.
  17   *
  18   * The Original Code and all software distributed under the License are
  19   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  20   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  21   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  22   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  23   * Please see the License for the specific language governing rights and
  24   * limitations under the License.
  25   *
  26   * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  27   */
  28  /*!
  29   *       @header kpi_mbuf.h
  30   *       This header defines an API for interacting with mbufs. mbufs are the
  31   *       primary method of storing packets in the networking stack.
  32   *
  33   *       mbufs are used to store various items in the networking stack. The
  34   *       most common usage of an mbuf is to store a packet or data on a
  35   *       socket waiting to be sent or received. The mbuf is a contiguous
  36   *       structure with some header followed by some data. To store more data
  37   *       than would fit in an mbuf, external data is used. Most mbufs with
  38   *       external data use clusters to store the external data.
  39   *
  40   *       mbufs can be chained, contiguous data in a packet can be found by
  41   *       following the m_next chain. Packets may be bundled together using
  42   *       m_nextpacket. Many parts of the stack do not properly handle chains
  43   *       of packets. When in doubt, don't chain packets.
  44   */
  45  
  46  #ifndef __KPI_MBUF__
  47  #define __KPI_MBUF__
  48  #include <sys/kernel_types.h>
  49  #include <mach/vm_types.h>
  50  
  51  #ifndef PRIVATE
  52  #include <Availability.h>
  53  #define __NKE_API_DEPRECATED __API_DEPRECATED("Network Kernel Extension KPI is deprecated", macos(10.4, 10.15.4))
  54  #else
  55  #define __NKE_API_DEPRECATED
  56  #endif /* PRIVATE */
  57  
  58  #ifdef KERNEL_PRIVATE
  59  #include <mach/kern_return.h>
  60  #endif /* KERNEL_PRIVATE */
  61  
  62  /*!
  63   *       @enum mbuf_flags_t
  64   *       @abstract Constants defining mbuf flags. Only the flags listed below
  65   *               can be set or retrieved.
  66   *       @constant MBUF_EXT Indicates this mbuf has external data.
  67   *       @constant MBUF_PKTHDR Indicates this mbuf has a packet header.
  68   *       @constant MBUF_EOR Indicates this mbuf is the end of a record.
  69   *       @constant MBUF_LOOP Indicates this packet is looped back.
  70   *       @constant MBUF_BCAST Indicates this packet will be sent or was
  71   *               received as a brodcast.
  72   *       @constant MBUF_MCAST Indicates this packet will be sent or was
  73   *               received as a multicast.
  74   *       @constant MBUF_FRAG Indicates this packet is a fragment of a larger
  75   *               packet.
  76   *       @constant MBUF_FIRSTFRAG Indicates this packet is the first fragment.
  77   *       @constant MBUF_LASTFRAG Indicates this packet is the last fragment.
  78   *       @constant MBUF_PROMISC Indicates this packet was only received
  79   *               because the interface is in promiscuous mode. This should be set
  80   *               by the demux function. These packets will be discarded after
  81   *               being passed to any interface filters.
  82   */
  83  enum {
  84  	MBUF_EXT        = 0x0001,       /* has associated external storage */
  85  	MBUF_PKTHDR     = 0x0002,       /* start of record */
  86  	MBUF_EOR        = 0x0004,       /* end of record */
  87  	MBUF_LOOP       = 0x0040,       /* packet is looped back */
  88  
  89  	MBUF_BCAST      = 0x0100,       /* send/received as link-level broadcast */
  90  	MBUF_MCAST      = 0x0200,       /* send/received as link-level multicast */
  91  	MBUF_FRAG       = 0x0400,       /* packet is a fragment of a larger packet */
  92  	MBUF_FIRSTFRAG  = 0x0800,       /* packet is first fragment */
  93  	MBUF_LASTFRAG   = 0x1000,       /* packet is last fragment */
  94  	MBUF_PROMISC    = 0x2000,       /* packet is promiscuous */
  95  	MBUF_HASFCS     = 0x4000        /* packet has FCS */
  96  };
  97  typedef u_int32_t mbuf_flags_t;
  98  
  99  /*!
 100   *       @enum mbuf_type_t
 101   *       @abstract Types of mbufs.
 102   *       @discussion Some mbufs represent packets, some represnt data waiting
 103   *               on sockets. Other mbufs store control data or other various
 104   *               structures. The mbuf type is used to store what sort of data the
 105   *               mbuf contains.
 106   *       @constant MBUF_MT_FREE Indicates the mbuf is free and is
 107   *               sitting on the queue of free mbufs. If you find that an mbuf you
 108   *               have a reference to has this type, something has gone terribly
 109   *               wrong.
 110   *       @constant MBUF_MT_DATA Indicates this mbuf is being used to store
 111   *               data.
 112   *       @constant MBUF_MT_HEADER Indicates this mbuf has a packet header,
 113   *               this is probably a packet.
 114   *       @constant MBUF_MT_SOCKET Socket structure.
 115   *       @constant MBUF_MT_PCB Protocol control block.
 116   *       @constant MBUF_MT_RTABLE Routing table entry.
 117   *       @constant MBUF_MT_HTABLE IMP host tables???.
 118   *       @constant MBUF_MT_ATABLE Address resolution table data.
 119   *       @constant MBUF_MT_SONAME Socket name, usually a sockaddr of some
 120   *               sort.
 121   *       @constant MBUF_MT_FTABLE Fragment reassembly header.
 122   *       @constant MBUF_MT_RIGHTS Access rights.
 123   *       @constant MBUF_MT_IFADDR Interface address.
 124   *       @constant MBUF_MT_CONTROL Extra-data protocol message (control
 125   *               message).
 126   *       @constant MBUF_MT_OOBDATA Out of band data.
 127   */
 128  enum {
 129  	MBUF_TYPE_FREE          = 0,    /* should be on free list */
 130  	MBUF_TYPE_DATA          = 1,    /* dynamic (data) allocation */
 131  	MBUF_TYPE_HEADER        = 2,    /* packet header */
 132  	MBUF_TYPE_SOCKET        = 3,    /* socket structure */
 133  	MBUF_TYPE_PCB           = 4,    /* protocol control block */
 134  	MBUF_TYPE_RTABLE        = 5,    /* routing tables */
 135  	MBUF_TYPE_HTABLE        = 6,    /* IMP host tables */
 136  	MBUF_TYPE_ATABLE        = 7,    /* address resolution tables */
 137  	MBUF_TYPE_SONAME        = 8,    /* socket name */
 138  	MBUF_TYPE_SOOPTS        = 10,   /* socket options */
 139  	MBUF_TYPE_FTABLE        = 11,   /* fragment reassembly header */
 140  	MBUF_TYPE_RIGHTS        = 12,   /* access rights */
 141  	MBUF_TYPE_IFADDR        = 13,   /* interface address */
 142  	MBUF_TYPE_CONTROL       = 14,   /* extra-data protocol message */
 143  	MBUF_TYPE_OOBDATA       = 15    /* expedited data  */
 144  };
 145  typedef u_int32_t mbuf_type_t;
 146  
 147  /*!
 148   *       @enum mbuf_csum_request_flags_t
 149   *       @abstract Checksum performed/requested flags.
 150   *       @discussion Mbufs often contain packets. Some hardware supports
 151   *               performing checksums in hardware. The stack uses these flags to
 152   *               indicate to the driver what sort of checksumming should be
 153   *               handled in by the driver/hardware. These flags will only be set
 154   *               if the driver indicates that it supports the corresponding
 155   *               checksums using ifnet_set_offload.
 156   *       @constant MBUF_CSUM_REQ_IP Indicates the IP checksum has not been
 157   *               calculated yet.
 158   *       @constant MBUF_CSUM_REQ_TCP Indicates the TCP checksum has not been
 159   *               calculated yet.
 160   *       @constant MBUF_CSUM_REQ_UDP Indicates the UDP checksum has not been
 161   *               calculated yet.
 162   *       @constant MBUF_CSUM_REQ_TCPIPV6 Indicates the TCP checksum for IPv6
 163   *               has not been calculated yet.
 164   *       @constant MBUF_CSUM_REQ_UDPIPV6 Indicates the UDP checksum for IPv6
 165   *               has not been calculated yet.
 166   */
 167  enum {
 168  	MBUF_TSO_IPV4           = 0x100000,
 169  	MBUF_TSO_IPV6           = 0x200000
 170  };
 171  typedef u_int32_t mbuf_tso_request_flags_t;
 172  
 173  enum {
 174  #ifdef KERNEL_PRIVATE
 175  	MBUF_CSUM_PARTIAL       = 0x1000,       /* 16-bit 1's complement sum */
 176  	MBUF_CSUM_REQ_SUM16     = MBUF_CSUM_PARTIAL,
 177  	MBUF_CSUM_REQ_ZERO_INVERT = 0x2000,
 178  #endif /* KERNEL_PRIVATE */
 179  	MBUF_CSUM_REQ_IP        = 0x0001,
 180  	MBUF_CSUM_REQ_TCP       = 0x0002,
 181  	MBUF_CSUM_REQ_UDP       = 0x0004,
 182  	MBUF_CSUM_REQ_TCPIPV6   = 0x0020,
 183  	MBUF_CSUM_REQ_UDPIPV6   = 0x0040
 184  };
 185  typedef u_int32_t mbuf_csum_request_flags_t;
 186  
 187  /*!
 188   *       @enum mbuf_csum_performed_flags_t
 189   *       @abstract Checksum performed/requested flags.
 190   *       @discussion Mbufs often contain packets. Some hardware supports
 191   *               performing checksums in hardware. The driver uses these flags to
 192   *               communicate to the stack the checksums that were calculated in
 193   *               hardware.
 194   *       @constant MBUF_CSUM_DID_IP Indicates that the driver/hardware verified
 195   *               the IP checksum in hardware.
 196   *       @constant MBUF_CSUM_IP_GOOD Indicates whether or not the IP checksum
 197   *               was good or bad. Only valid when MBUF_CSUM_DID_IP is set.
 198   *       @constant MBUF_CSUM_DID_DATA Indicates that the TCP or UDP checksum
 199   *               was calculated. The value for the checksum calculated in
 200   *               hardware should be passed as the second parameter of
 201   *               mbuf_set_csum_performed. The hardware calculated checksum value
 202   *               can be retrieved using the second parameter passed to
 203   *               mbuf_get_csum_performed. This should be done for IPv4 or IPv6.
 204   *       @constant MBUF_CSUM_PSEUDO_HDR If set, this indicates that the
 205   *               checksum value for MBUF_CSUM_DID_DATA includes the pseudo header
 206   *               value. If this is not set, the stack will calculate the pseudo
 207   *               header value and add that to the checksum. The value of this bit
 208   *               is only valid when MBUF_CSUM_DID_DATA is set.
 209   */
 210  enum {
 211  #ifdef KERNEL_PRIVATE
 212  	MBUF_CSUM_TCP_SUM16     = MBUF_CSUM_PARTIAL,
 213  #endif /* KERNEL_PRIVATE */
 214  	MBUF_CSUM_DID_IP        = 0x0100,
 215  	MBUF_CSUM_IP_GOOD       = 0x0200,
 216  	MBUF_CSUM_DID_DATA      = 0x0400,
 217  	MBUF_CSUM_PSEUDO_HDR    = 0x0800
 218  };
 219  typedef u_int32_t mbuf_csum_performed_flags_t;
 220  
 221  /*!
 222   *       @enum mbuf_how_t
 223   *       @abstract Method of allocating an mbuf.
 224   *       @discussion Blocking on the input or output path can impact
 225   *               performance. There are some cases where making a blocking call
 226   *               is acceptable. When in doubt, use MBUF_DONTWAIT.
 227   *       @constant MBUF_WAITOK Allow a call to allocate an mbuf to block.
 228   *       @constant MBUF_DONTWAIT Don't allow the mbuf allocation call to
 229   *               block, if blocking is necessary fail and return immediately.
 230   */
 231  enum {
 232  	MBUF_WAITOK     = 0,    /* Ok to block to get memory */
 233  	MBUF_DONTWAIT   = 1     /* Don't block, fail if blocking would be required */
 234  };
 235  typedef u_int32_t mbuf_how_t;
 236  
 237  typedef u_int32_t mbuf_tag_id_t;
 238  typedef u_int16_t mbuf_tag_type_t;
 239  
 240  /*!
 241   *       @struct mbuf_stat
 242   *       @discussion The mbuf_stat contains mbuf statistics.
 243   *       @field mbufs Number of mbufs (free or otherwise).
 244   *       @field clusters Number of clusters (free or otherwise).
 245   *       @field clfree Number of free clusters.
 246   *       @field drops Number of times allocation failed.
 247   *       @field wait Number of times allocation blocked.
 248   *       @field drain Number of times protocol drain functions were called.
 249   *       @field mtypes An array of counts of each type of mbuf allocated.
 250   *       @field mcfail Number of times m_copym failed.
 251   *       @field mpfail Number of times m_pullup failed.
 252   *       @field msize Length of an mbuf.
 253   *       @field mclbytes Length of an mbuf cluster.
 254   *       @field minclsize Minimum length of data to allocate a cluster.
 255   *               Anything smaller than this should be placed in chained mbufs.
 256   *       @field mlen Length of data in an mbuf.
 257   *       @field mhlen Length of data in an mbuf with a packet header.
 258   *       @field bigclusters Number of big clusters.
 259   *       @field bigclfree Number of unused big clusters.
 260   *       @field bigmclbytes Length of a big mbuf cluster.
 261   */
 262  struct mbuf_stat {
 263  	u_int32_t       mbufs;          /* mbufs obtained from page pool */
 264  	u_int32_t       clusters;       /* clusters obtained from page pool */
 265  	u_int32_t       clfree;         /* free clusters */
 266  	u_int32_t       drops;          /* times failed to find space */
 267  	u_int32_t       wait;           /* times waited for space */
 268  	u_int32_t       drain;          /* times drained protocols for space */
 269  	u_short         mtypes[256];    /* type specific mbuf allocations */
 270  	u_int32_t       mcfail;         /* times m_copym failed */
 271  	u_int32_t       mpfail;         /* times m_pullup failed */
 272  	u_int32_t       msize;          /* length of an mbuf */
 273  	u_int32_t       mclbytes;       /* length of an mbuf cluster */
 274  	u_int32_t       minclsize;      /* min length of data to allocate a cluster */
 275  	u_int32_t       mlen;           /* length of data in an mbuf */
 276  	u_int32_t       mhlen;          /* length of data in a header mbuf */
 277  	u_int32_t       bigclusters;    /* number of big clusters */
 278  	u_int32_t       bigclfree;      /* number of big clustser free */
 279  	u_int32_t       bigmclbytes;    /* length of data in a big cluster */
 280  };
 281  
 282  /* Parameter for m_copym to copy all bytes */
 283  #define MBUF_COPYALL    1000000000
 284  
 285  __BEGIN_DECLS
 286  /* Data access */
 287  /*!
 288   *       @function mbuf_data
 289   *       @discussion Returns a pointer to the start of data in this mbuf.
 290   *               There may be additional data on chained mbufs. The data you're
 291   *               looking for may not be virtually contiguous if it spans more
 292   *               than one mbuf.  In addition, data that is virtually contiguous
 293   *               might not be represented by physically contiguous pages; see
 294   *               further comments in mbuf_data_to_physical.  Use mbuf_len to
 295   *               determine the length of data available in this mbuf. If a data
 296   *               structure you want to access stradles two mbufs in a chain,
 297   *               either use mbuf_pullup to get the data contiguous in one mbuf
 298   *               or copy the pieces of data from each mbuf in to a contiguous
 299   *               buffer. Using mbuf_pullup has the advantage of not having to
 300   *               copy the data. On the other hand, if you don't make sure there
 301   *               is space in the mbuf, mbuf_pullup may fail and free the mbuf.
 302   *       @param mbuf The mbuf.
 303   *       @result A pointer to the data in the mbuf.
 304   */
 305  extern void *mbuf_data(mbuf_t mbuf)
 306  __NKE_API_DEPRECATED;
 307  
 308  /*!
 309   *       @function mbuf_datastart
 310   *       @discussion Returns the start of the space set aside for storing
 311   *               data in an mbuf. An mbuf's data may come from a cluster or be
 312   *               embedded in the mbuf structure itself. The data pointer
 313   *               retrieved by mbuf_data may not be at the start of the data
 314   *               (mbuf_leadingspace will be non-zero). This function will return
 315   *               a pointer that matches mbuf_data() - mbuf_leadingspace().
 316   *       @param mbuf The mbuf.
 317   *       @result A pointer to smallest possible value for data.
 318   */
 319  extern void *mbuf_datastart(mbuf_t mbuf)
 320  __NKE_API_DEPRECATED;
 321  
 322  /*!
 323   *       @function mbuf_setdata
 324   *       @discussion Sets the data and length values for an mbuf. The data
 325   *       value must be in a valid range. In the case of an mbuf with a cluster,
 326   *       the data value must point to a location in the cluster and the data
 327   *       value plus the length, must be less than the end of the cluster. For
 328   *       data embedded directly in an mbuf (no cluster), the data value must
 329   *       fall somewhere between the start and end of the data area in the
 330   *       mbuf and the data + length must also be in the same range.
 331   *       @param mbuf The mbuf.
 332   *       @param data The new pointer value for data.
 333   *       @param len The new length of data in the mbuf.
 334   *       @result 0 on success, errno error on failure.
 335   */
 336  extern errno_t mbuf_setdata(mbuf_t mbuf, void *data, size_t len)
 337  __NKE_API_DEPRECATED;
 338  
 339  /*!
 340   *       @function mbuf_align_32
 341   *       @discussion mbuf_align_32 is a replacement for M_ALIGN and MH_ALIGN.
 342   *               mbuf_align_32 will set the data pointer to a location aligned on
 343   *               a four byte boundry with at least 'len' bytes between the data
 344   *               pointer and the end of the data block.
 345   *       @param mbuf The mbuf.
 346   *       @param len The minimum length of space that should follow the new
 347   *               data location.
 348   *       @result 0 on success, errno error on failure.
 349   */
 350  extern errno_t mbuf_align_32(mbuf_t mbuf, size_t len)
 351  __NKE_API_DEPRECATED;
 352  
 353  /*!
 354   *       @function mbuf_data_to_physical
 355   *       @discussion mbuf_data_to_physical is a replacement for mcl_to_paddr.
 356   *               Given a pointer returned from mbuf_data of mbuf_datastart,
 357   *               mbuf_data_to_physical will return the phyical address for that
 358   *               block of data.  Note that even though the data is in virtually
 359   *               contiguous span, the underlying physical pages might not be
 360   *               physically contiguous.  Because of this, callers must ensure
 361   *               to call this routine for each page boundary.  Device drivers
 362   *               that deal with DMA are strongly encouraged to utilize the
 363   *               IOMbufNaturalMemoryCursor and walk down the list of vectors
 364   *               instead of using this interface to obtain the physical address.
 365   *               Use of this routine is therefore discouraged.
 366   *       @param ptr A pointer to data stored in an mbuf.
 367   *       @result The 64 bit physical address of the mbuf data or NULL if ptr
 368   *               does not point to data stored in an mbuf.
 369   */
 370  extern addr64_t mbuf_data_to_physical(void *ptr)
 371  __NKE_API_DEPRECATED;
 372  
 373  
 374  /* Allocation */
 375  
 376  /*!
 377   *       @function mbuf_get
 378   *       @discussion Allocates an mbuf without a cluster for external data.
 379   *       @param how Blocking or non-blocking.
 380   *       @param type The type of the mbuf.
 381   *       @param mbuf The mbuf.
 382   *       @result 0 on success, errno error on failure.
 383   */
 384  extern errno_t mbuf_get(mbuf_how_t how, mbuf_type_t type, mbuf_t *mbuf)
 385  __NKE_API_DEPRECATED;
 386  
 387  /*!
 388   *       @function mbuf_gethdr
 389   *       @discussion Allocates an mbuf without a cluster for external data.
 390   *               Sets a flag to indicate there is a packet header and initializes
 391   *               the packet header.
 392   *       @param how Blocking or non-blocking.
 393   *       @param type The type of the mbuf.
 394   *       @param mbuf The mbuf.
 395   *       @result 0 on success, errno error on failure.
 396   */
 397  extern errno_t mbuf_gethdr(mbuf_how_t how, mbuf_type_t type, mbuf_t *mbuf)
 398  __NKE_API_DEPRECATED;
 399  
 400  /*!
 401   *       @function mbuf_attachcluster
 402   *       @discussion Attach an external buffer as a cluster for an mbuf.  If mbuf
 403   *               points to a NULL mbuf_t, an mbuf will be allocated for you.  If
 404   *               mbuf points to a non-NULL mbuf_t, the user-supplied mbuf will
 405   *               be used instead.  The caller is responsible for allocating the
 406   *               external buffer by calling mbuf_alloccluster().
 407   *       @param how Blocking or non-blocking.
 408   *       @param type The type of the mbuf if mbuf is non-NULL; otherwise ignored.
 409   *       @param mbuf Pointer to the address of the mbuf; if NULL, an mbuf will
 410   *               be allocated, otherwise, it must point to a valid mbuf address.
 411   *               If the user-supplied mbuf is already attached to a cluster, the
 412   *               current cluster will be freed before the mbuf gets attached to
 413   *               the supplied external buffer.  Note that this routine may return
 414   *               a different mbuf_t than the one you passed in.
 415   *       @param extbuf Address of the external buffer.
 416   *       @param extfree Free routine for the external buffer; the caller is
 417   *               required to defined a routine that will be invoked when the
 418   *               mbuf is freed.
 419   *       @param extsize Size of the external buffer.
 420   *       @param extarg Private value that will be passed to the free routine
 421   *               when it is called at the time the mbuf is freed.
 422   *       @result 0 on success
 423   *               EINVAL - Invalid parameter
 424   *               ENOMEM - Not enough memory available
 425   */
 426  extern errno_t mbuf_attachcluster(mbuf_how_t how, mbuf_type_t type,
 427      mbuf_t *mbuf, caddr_t extbuf, void (*extfree)(caddr_t, u_int, caddr_t),
 428      size_t extsize, caddr_t extarg)
 429  __NKE_API_DEPRECATED;
 430  
 431  /*!
 432   *       @function mbuf_alloccluster
 433   *       @discussion Allocate a cluster that can be later attached to an
 434   *               mbuf by calling mbuf_attachcluster().  The allocated cluster
 435   *               can also be freed (without being attached to an mbuf) by
 436   *               calling mbuf_freecluster().  At the moment this routine
 437   *               will either return a cluster of 2048, 4096 or 16384 bytes
 438   *               depending on the requested size.  Note that clusters greater
 439   *               than 4096 bytes might not be available in all configurations;
 440   *               the caller must additionally check for ENOTSUP (see below).
 441   *       @param how Blocking or non-blocking.
 442   *       @param size Pointer to size of requested cluster.  Sizes up to 2048
 443   *               will be rounded up to 2048; sizes greater than 2048 and up
 444   *               to 4096 will be rounded up to 4096.  Sizes greater than 4096
 445   *               will be rounded up to 16384.
 446   *       @param addr Pointer to the address of the requested cluster.
 447   *       @result 0 on success or ENOMEM if failure.  If the caller requests
 448   *               greater than 4096 bytes and the system is unable to fulfill
 449   *               the request due to the lack of jumbo clusters support based
 450   *               on the configuration, this routine will return ENOTSUP.
 451   *               In this case, the caller is advised to use 4096 bytes or
 452   *               smaller during subseqent requests.
 453   */
 454  extern errno_t mbuf_alloccluster(mbuf_how_t how, size_t *size, caddr_t *addr)
 455  __NKE_API_DEPRECATED;
 456  
 457  /*!
 458   *       @function mbuf_freecluster
 459   *       @discussion Free a cluster that was previously allocated by a call
 460   *               to mbuf_alloccluster().  The caller must pass the actual
 461   *               size of the cluster as returned by mbuf_alloccluster(),
 462   *               which at this point must be either 2048, 4096 or 16384 bytes.
 463   *       @param addr The address of the cluster.
 464   *       @param size The actual size of the cluster.
 465   */
 466  extern void mbuf_freecluster(caddr_t addr, size_t size)
 467  __NKE_API_DEPRECATED;
 468  
 469  #ifdef BSD_KERNEL_PRIVATE
 470  /*
 471   * For now, restrict these to BSD kernel privates, since they are
 472   * used only by the Nexus netif compatibility code.
 473   */
 474  extern errno_t mbuf_ring_cluster_alloc(mbuf_how_t how, mbuf_type_t type,
 475      mbuf_t *mbuf, void (*extfree)(caddr_t, u_int, caddr_t), size_t *size);
 476  extern int mbuf_ring_cluster_is_active(mbuf_t mbuf);
 477  extern errno_t mbuf_ring_cluster_activate(mbuf_t mbuf);
 478  extern errno_t mbuf_cluster_set_prop(mbuf_t mbuf, u_int32_t oldprop,
 479      u_int32_t newprop);
 480  extern errno_t mbuf_cluster_get_prop(mbuf_t mbuf, u_int32_t *prop);
 481  #endif /* BSD_KERNEL_PRIVATE */
 482  
 483  /*!
 484   *       @function mbuf_getcluster
 485   *       @discussion Allocate a cluster of the requested size and attach it to
 486   *               an mbuf for use as external data. If mbuf points to a NULL
 487   *               mbuf_t, an mbuf will be allocated for you. If mbuf points to
 488   *               a non-NULL mbuf_t, mbuf_getcluster may return a different
 489   *               mbuf_t than the one you passed in.
 490   *       @param how Blocking or non-blocking.
 491   *       @param type The type of the mbuf.
 492   *       @param size The size of the cluster to be allocated. Supported sizes
 493   *               for a cluster are be 2048, 4096, or 16384. Any other value
 494   *               with return EINVAL.  Note that clusters greater than 4096
 495   *               bytes might not be available in all configurations; the
 496   *               caller must additionally check for ENOTSUP (see below).
 497   *       @param mbuf The mbuf the cluster will be attached to.
 498   *       @result 0 on success, errno error on failure. If you specified NULL
 499   *               for the mbuf, any intermediate mbuf that may have been allocated
 500   *               will be freed. If you specify an mbuf value in *mbuf,
 501   *               mbuf_mclget will not free it.
 502   *               EINVAL - Invalid parameter
 503   *               ENOMEM - Not enough memory available
 504   *               ENOTSUP - The caller had requested greater than 4096 bytes
 505   *                   cluster and the system is unable to fulfill it due to the
 506   *                   lack of jumbo clusters support based on the configuration.
 507   *                   In this case, the caller is advised to use 4096 bytes or
 508   *                   smaller during subsequent requests.
 509   */
 510  extern errno_t mbuf_getcluster(mbuf_how_t how, mbuf_type_t type, size_t size,
 511      mbuf_t *mbuf)
 512  __NKE_API_DEPRECATED;
 513  
 514  /*!
 515   *       @function mbuf_mclget
 516   *       @discussion Allocate a cluster and attach it to an mbuf for use as
 517   *               external data. If mbuf points to a NULL mbuf_t, an mbuf will be
 518   *               allocated for you. If mbuf points to a non-NULL mbuf_t,
 519   *               mbuf_mclget may return a different mbuf_t than the one you
 520   *               passed in.
 521   *       @param how Blocking or non-blocking.
 522   *       @param type The type of the mbuf.
 523   *       @param mbuf The mbuf the cluster will be attached to.
 524   *       @result 0 on success, errno error on failure. If you specified NULL
 525   *               for the mbuf, any intermediate mbuf that may have been allocated
 526   *               will be freed. If you specify an mbuf value in *mbuf,
 527   *               mbuf_mclget will not free it.
 528   */
 529  extern errno_t mbuf_mclget(mbuf_how_t how, mbuf_type_t type, mbuf_t *mbuf)
 530  __NKE_API_DEPRECATED;
 531  
 532  /*!
 533   *       @function mbuf_allocpacket
 534   *       @discussion Allocate an mbuf chain to store a single packet of the
 535   *               requested length.  According to the requested length, a chain
 536   *               of mbufs will be created. The mbuf type will be set to
 537   *               MBUF_TYPE_DATA. The caller may specify the maximum number of
 538   *               buffer.
 539   *       @param how Blocking or non-blocking
 540   *       @param packetlen The total length of the packet mbuf to be allocated.
 541   *               The length must be greater than zero.
 542   *       @param maxchunks An input/output pointer to the maximum number of mbufs
 543   *               segments making up the chain.  On input, if maxchunks is NULL,
 544   *               or the value pointed to by maxchunks is zero, the packet will
 545   *               be made up of as few or as many buffer segments as necessary
 546   *               to fit the length.  The allocation will fail with ENOBUFS if
 547   *               the number of segments requested is too small and the sum of
 548   *               the maximum size of each individual segment is less than the
 549   *               packet length.  On output, if the allocation succeed and
 550   *               maxchunks is non-NULL, it will point to the actual number
 551   *               of segments allocated.
 552   *               Additional notes for packetlen greater than 4096 bytes:
 553   *               the caller may pass a non-NULL maxchunks and initialize it
 554   *               with zero such that upon success, it can find out whether
 555   *               or not the system configuration allows for larger than
 556   *               4096 bytes cluster allocations, by checking on the value
 557   *               pointed to by maxchunks.  E.g. a request for 9018 bytes may
 558   *               result in 1 chunk when jumbo clusters are available, or
 559   *               3 chunks otherwise.
 560   *       @param mbuf Upon success, *mbuf will be a reference to the new mbuf.
 561   *       @result Returns 0 upon success or the following error code:
 562   *               EINVAL - Invalid parameter
 563   *               ENOMEM - Not enough memory available
 564   *               ENOBUFS - Buffers not big enough for the maximum number of
 565   *                   chunks requested
 566   */
 567  extern errno_t mbuf_allocpacket(mbuf_how_t how, size_t packetlen,
 568      unsigned int * maxchunks, mbuf_t *mbuf)
 569  __NKE_API_DEPRECATED;
 570  
 571  /*!
 572   *       @function mbuf_allocpacket_list
 573   *       @discussion Allocate a linked list of packets.  According to the
 574   *               requested length, each packet will made of a chain of one
 575   *               or more mbufs.  The mbuf type will be set to MBUF_TYPE_DATA.
 576   *               The caller may specify the maximum number of element for
 577   *               each mbuf chain making up a packet.
 578   *       @param numpkts Number of packets to allocate
 579   *       @param how Blocking or non-blocking
 580   *       @param packetlen The total length of the packet mbuf to be allocated.
 581   *               The length must be greater than zero.
 582   *       @param maxchunks An input/output pointer to the maximum number of
 583   *               mbufs segments making up the chain.  On input, if maxchunks is
 584   *               zero, or the value pointed to by maxchunks is zero, the packet
 585   *               will be made of as few or as many buffer segments as necessary
 586   *               to fit the length.  The allocation will fail with ENOBUFS if
 587   *               the number of segments requested is too small and the sum of
 588   *               the maximum size of each individual segment is less than the
 589   *               packet length.  On output, if the allocation succeed and
 590   *               maxchunks is non zero, it will point to the actual number
 591   *               of segments allocated.
 592   *               Additional notes for packetlen greater than 4096 bytes:
 593   *               the caller may pass a non-NULL maxchunks and initialize it
 594   *               with zero such that upon success, it can find out whether
 595   *               or not the system configuration allows for larger than
 596   *               4096 bytes cluster allocations, by checking on the value
 597   *               pointed to by maxchunks.  E.g. a request for 9018 bytes may
 598   *               result in 1 chunk when jumbo clusters are available, or
 599   *               3 chunks otherwise.
 600   *       @param mbuf Upon success, *mbuf will be a reference to the new mbuf.
 601   *       @result Returns 0 upon success or the following error code:
 602   *               EINVAL - Invalid parameter
 603   *               ENOMEM - Not enough memory available
 604   *               ENOBUFS - Buffers not big enough for the maximum number of
 605   *                   chunks requested
 606   */
 607  extern errno_t mbuf_allocpacket_list(unsigned int numpkts, mbuf_how_t how,
 608      size_t packetlen, unsigned int * maxchunks, mbuf_t *mbuf)
 609  __NKE_API_DEPRECATED;
 610  
 611  /*!
 612   *       @function mbuf_getpacket
 613   *       @discussion Allocate an mbuf, allocate and attach a cluster, and set
 614   *               the packet header flag.
 615   *       @param how Blocking or non-blocking.
 616   *       @param mbuf Upon success, *mbuf will be a reference to the new mbuf.
 617   *       @result 0 on success, errno error on failure.
 618   */
 619  extern errno_t mbuf_getpacket(mbuf_how_t how, mbuf_t *mbuf)
 620  __NKE_API_DEPRECATED;
 621  
 622  /*!
 623   *       @function mbuf_free
 624   *       @discussion Frees a single mbuf. Not commonly used because it
 625   *               doesn't touch the rest of the mbufs on the chain.
 626   *       @param mbuf The mbuf to free.
 627   *       @result The next mbuf in the chain.
 628   */
 629  extern mbuf_t mbuf_free(mbuf_t mbuf)
 630  __NKE_API_DEPRECATED;
 631  
 632  /*!
 633   *       @function mbuf_freem
 634   *       @discussion Frees a chain of mbufs link through mnext.
 635   *       @param mbuf The first mbuf in the chain to free.
 636   */
 637  extern void mbuf_freem(mbuf_t mbuf)
 638  __NKE_API_DEPRECATED;
 639  
 640  /*!
 641   *       @function mbuf_freem_list
 642   *       @discussion Frees linked list of mbuf chains. Walks through
 643   *               mnextpackt and does the equivalent of mbuf_freem to each.
 644   *       @param mbuf The first mbuf in the linked list to free.
 645   *       @result The number of mbufs freed.
 646   */
 647  extern int mbuf_freem_list(mbuf_t mbuf)
 648  __NKE_API_DEPRECATED;
 649  
 650  /*!
 651   *       @function mbuf_leadingspace
 652   *       @discussion Determines the space available in the mbuf proceeding
 653   *               the current data.
 654   *       @param mbuf The mbuf.
 655   *       @result The number of unused bytes at the start of the mbuf.
 656   */
 657  extern size_t mbuf_leadingspace(const mbuf_t mbuf)
 658  __NKE_API_DEPRECATED;
 659  
 660  /*!
 661   *       @function mbuf_trailingspace
 662   *       @discussion Determines the space available in the mbuf following
 663   *               the current data.
 664   *       @param mbuf The mbuf.
 665   *       @result The number of unused bytes following the current data.
 666   */
 667  extern size_t mbuf_trailingspace(const mbuf_t mbuf)
 668  __NKE_API_DEPRECATED;
 669  
 670  /* Manipulation */
 671  
 672  /*!
 673   *       @function mbuf_copym
 674   *       @discussion Copies len bytes from offset from src to a new mbuf.  If
 675   *           the original mbuf contains a packet header, the new mbuf will
 676   *           contain similar packet header except for any tags which may be
 677   *           associated with the original mbuf.  mbuf_dup() should be used
 678   *           instead if tags are to be copied to the new mbuf.
 679   *       @param src The source mbuf.
 680   *       @param offset The offset in the mbuf to start copying from.
 681   *       @param len The the number of bytes to copy.
 682   *       @param how To block or not to block, that is a question.
 683   *       @param new_mbuf Upon success, the newly allocated mbuf.
 684   *       @result 0 upon success otherwise the errno error.
 685   */
 686  extern errno_t mbuf_copym(const mbuf_t src, size_t offset, size_t len,
 687      mbuf_how_t how, mbuf_t *new_mbuf)
 688  __NKE_API_DEPRECATED;
 689  
 690  /*!
 691   *       @function mbuf_dup
 692   *       @discussion Exactly duplicates an mbuf chain.  If the original mbuf
 693   *           contains a packet header (including tags), the new mbuf will have
 694   *           the same packet header contents and a copy of each tag associated
 695   *           with the original mbuf.
 696   *       @param src The source mbuf.
 697   *       @param how Blocking or non-blocking.
 698   *       @param new_mbuf Upon success, the newly allocated mbuf.
 699   *       @result 0 upon success otherwise the errno error.
 700   */
 701  extern errno_t mbuf_dup(const mbuf_t src, mbuf_how_t how, mbuf_t *new_mbuf)
 702  __NKE_API_DEPRECATED;
 703  
 704  /*!
 705   *       @function mbuf_prepend
 706   *       @discussion Prepend len bytes to an mbuf. If there is space
 707   *               (mbuf_leadingspace >= len), the mbuf's data ptr is changed and
 708   *               the same mbuf is returned. If there is no space, a new mbuf may
 709   *               be allocated and prepended to the mbuf chain. If the operation
 710   *               fails, the mbuf may be freed (*mbuf will be NULL).
 711   *       @param mbuf The mbuf to prepend data to. This may change if a new
 712   *               mbuf must be allocated or may be NULL if the operation fails.
 713   *       @param len The length, in bytes, to be prepended to the mbuf.
 714   *       @param how Blocking or non-blocking.
 715   *       @result 0 upon success otherwise the errno error.
 716   */
 717  extern errno_t mbuf_prepend(mbuf_t *mbuf, size_t len, mbuf_how_t how)
 718  __NKE_API_DEPRECATED;
 719  
 720  /*!
 721   *       @function mbuf_split
 722   *       @discussion Split an mbuf chain at a specific offset.
 723   *       @param src The mbuf to be split.
 724   *       @param offset The offset in the buffer where the mbuf should be
 725   *               split.
 726   *       @param how Blocking or non-blocking.
 727   *       @param new_mbuf Upon success, the second half of the split mbuf
 728   *               chain.
 729   *       @result 0 upon success otherwise the errno error. In the case of
 730   *               failure, the original mbuf chain passed in to src will be
 731   *               preserved.
 732   */
 733  extern errno_t mbuf_split(mbuf_t src, size_t offset, mbuf_how_t how,
 734      mbuf_t *new_mbuf)
 735  __NKE_API_DEPRECATED;
 736  
 737  /*!
 738   *       @function mbuf_pullup
 739   *       @discussion Move the next len bytes in to mbuf from other mbufs in
 740   *               the chain. This is commonly used to get the IP and TCP or UDP
 741   *               header contiguous in the first mbuf. If mbuf_pullup fails, the
 742   *               entire mbuf chain will be freed.
 743   *       @param mbuf The mbuf in the chain the data should be contiguous in.
 744   *       @param len The number of bytes to pull from the next mbuf(s).
 745   *       @result 0 upon success otherwise the errno error. In the case of an
 746   *               error, the mbuf chain has been freed.
 747   */
 748  extern errno_t mbuf_pullup(mbuf_t *mbuf, size_t len)
 749  __NKE_API_DEPRECATED;
 750  
 751  /*!
 752   *       @function mbuf_pulldown
 753   *       @discussion Make length bytes at offset in the mbuf chain
 754   *               contiguous. Nothing before offset bytes in the chain will be
 755   *               modified. Upon return, location will be the mbuf the data is
 756   *               contiguous in and offset will be the offset in that mbuf at
 757   *               which the data is located.  In the case of a failure, the mbuf
 758   *               chain will be freed.
 759   *       @param src The start of the mbuf chain.
 760   *       @param offset Pass in a pointer to a value with the offset of the
 761   *               data you're interested in making contiguous. Upon success, this
 762   *               will be overwritten with the offset from the mbuf returned in
 763   *               location.
 764   *       @param length The length of data that should be made contiguous.
 765   *       @param location Upon success, *location will be the mbuf the data is
 766   *               in.
 767   *       @result 0 upon success otherwise the errno error.
 768   */
 769  extern errno_t mbuf_pulldown(mbuf_t src, size_t *offset, size_t length,
 770      mbuf_t *location)
 771  __NKE_API_DEPRECATED;
 772  
 773  /*!
 774   *       @function mbuf_adj
 775   *       @discussion Trims len bytes from the mbuf. If the length is greater
 776   *               than zero, the bytes are trimmed from the front of the mbuf. If
 777   *               the length is less than zero, the bytes are trimmed from the end
 778   *               of the mbuf chain.
 779   *       @param mbuf The mbuf chain to trim.
 780   *       @param len The number of bytes to trim from the mbuf chain.
 781   */
 782  extern void mbuf_adj(mbuf_t mbuf, int len)
 783  __NKE_API_DEPRECATED;
 784  
 785  /*!
 786   *       @function mbuf_adjustlen
 787   *       @discussion Adds amount to the mbuf len. Verifies that the new
 788   *               length is valid (greater than or equal to zero and less than
 789   *               maximum amount of data that may be stored in the mbuf). This
 790   *               function will not adjust the packet header length field or
 791   *               affect any other mbufs in a chain.
 792   *       @param mbuf The mbuf to adjust.
 793   *       @param amount The number of bytes increment the length by.
 794   *       @result 0 upon success otherwise the errno error.
 795   */
 796  extern errno_t mbuf_adjustlen(mbuf_t mbuf, int amount)
 797  __NKE_API_DEPRECATED;
 798  
 799  /*!
 800   *       @function mbuf_concatenate
 801   *       @discussion Concatenate mbuf chain src to dst using m_next and return
 802   *               a chain which represents the concatenated chain.  The routine
 803   *               does not prevent two chains of different mbuf types to be
 804   *               concatenated, nor does it modify any packet header in the
 805   *               destination chain.  Therefore, it's the responsibility of the
 806   *               caller to ensure that the resulted concatenated mbuf chain is
 807   *               correct for further usages.
 808   *       @param dst The destination mbuf chain.
 809   *       @param src The source mbuf chain.
 810   *       @result A pointer to the head of the concatenated mbuf chain.  This
 811   *               should be treated as the updated destination mbuf chain; the
 812   *               caller must no longer refer to the original src or dst mbuf
 813   *               chain.  Otherwise it returns NULL if the original dst mbuf
 814   *               chain is NULL.
 815   */
 816  extern mbuf_t mbuf_concatenate(mbuf_t dst, mbuf_t src)
 817  __NKE_API_DEPRECATED;
 818  
 819  /*!
 820   *       @function mbuf_copydata
 821   *       @discussion Copies data out of an mbuf in to a specified buffer. If
 822   *               the data is stored in a chain of mbufs, the data will be copied
 823   *               from each mbuf in the chain until length bytes have been copied.
 824   *       @param mbuf The mbuf chain to copy data out of.
 825   *       @param offset The offset in to the mbuf to start copying.
 826   *       @param length The number of bytes to copy.
 827   *       @param out_data A pointer to the location where the data will be
 828   *               copied.
 829   *       @result 0 upon success otherwise the errno error.
 830   */
 831  extern errno_t mbuf_copydata(const mbuf_t mbuf, size_t offset, size_t length,
 832      void *out_data)
 833  __NKE_API_DEPRECATED;
 834  
 835  /*!
 836   *       @function mbuf_copyback
 837   *       @discussion Copies data from a buffer to an mbuf chain.
 838   *               mbuf_copyback will grow the chain to fit the specified buffer.
 839   *
 840   *               If mbuf_copydata is unable to allocate enough mbufs to grow the
 841   *               chain, ENOBUFS will be returned. The mbuf chain will be shorter
 842   *               than expected but all of the data up to the end of the mbuf
 843   *               chain will be valid.
 844   *
 845   *               If an offset is specified, mbuf_copyback will skip that many
 846   *               bytes in the mbuf chain before starting to write the buffer in
 847   *               to the chain. If the mbuf chain does not contain this many
 848   *               bytes, mbufs will be allocated to create the space.
 849   *       @param mbuf The first mbuf in the chain to copy the data in to.
 850   *       @param offset Offset in bytes to skip before copying data.
 851   *       @param length The length, in bytes, of the data to copy in to the mbuf
 852   *               chain.
 853   *       @param data A pointer to data in the kernel's address space.
 854   *       @param how Blocking or non-blocking.
 855   *       @result 0 upon success, EINVAL or ENOBUFS upon failure.
 856   */
 857  extern errno_t mbuf_copyback(mbuf_t mbuf, size_t offset, size_t length,
 858      const void *data, mbuf_how_t how)
 859  __NKE_API_DEPRECATED;
 860  
 861  /*!
 862   *       @function mbuf_mclhasreference
 863   *       @discussion Check if a cluster of an mbuf is referenced by another mbuf.
 864   *               References may be taken, for example, as a result of a call to
 865   *               mbuf_split or mbuf_copym
 866   *       @param mbuf The mbuf with the cluster to test.
 867   *       @result 0 if there is no reference by another mbuf, 1 otherwise.
 868   */
 869  extern int mbuf_mclhasreference(mbuf_t mbuf)
 870  __NKE_API_DEPRECATED;
 871  
 872  
 873  /* mbuf header */
 874  
 875  /*!
 876   *       @function mbuf_next
 877   *       @discussion Returns the next mbuf in the chain.
 878   *       @param mbuf The mbuf.
 879   *       @result The next mbuf in the chain.
 880   */
 881  extern mbuf_t mbuf_next(const mbuf_t mbuf)
 882  __NKE_API_DEPRECATED;
 883  
 884  /*!
 885   *       @function mbuf_setnext
 886   *       @discussion Sets the next mbuf in the chain.
 887   *       @param mbuf The mbuf.
 888   *       @param next The new next mbuf.
 889   *       @result 0 upon success otherwise the errno error.
 890   */
 891  extern errno_t mbuf_setnext(mbuf_t mbuf, mbuf_t next)
 892  __NKE_API_DEPRECATED;
 893  
 894  /*!
 895   *       @function mbuf_nextpkt
 896   *       @discussion Gets the next packet from the mbuf.
 897   *       @param mbuf The mbuf.
 898   *       @result The nextpkt.
 899   */
 900  extern mbuf_t mbuf_nextpkt(const mbuf_t mbuf)
 901  __NKE_API_DEPRECATED;
 902  
 903  /*!
 904   *       @function mbuf_setnextpkt
 905   *       @discussion Sets the next packet attached to this mbuf.
 906   *       @param mbuf The mbuf.
 907   *       @param nextpkt The new next packet.
 908   */
 909  extern void mbuf_setnextpkt(mbuf_t mbuf, mbuf_t nextpkt)
 910  __NKE_API_DEPRECATED;
 911  
 912  /*!
 913   *       @function mbuf_len
 914   *       @discussion Gets the length of data in this mbuf.
 915   *       @param mbuf The mbuf.
 916   *       @result The length.
 917   */
 918  extern size_t mbuf_len(const mbuf_t mbuf)
 919  __NKE_API_DEPRECATED;
 920  
 921  /*!
 922   *       @function mbuf_setlen
 923   *       @discussion Sets the length of data in this packet. Be careful to
 924   *               not set the length over the space available in the mbuf.
 925   *       @param mbuf The mbuf.
 926   *       @param len The new length.
 927   */
 928  extern void mbuf_setlen(mbuf_t mbuf, size_t len)
 929  __NKE_API_DEPRECATED;
 930  
 931  /*!
 932   *       @function mbuf_maxlen
 933   *       @discussion Retrieves the maximum length of data that may be stored
 934   *               in this mbuf. This value assumes that the data pointer was set
 935   *               to the start of the possible range for that pointer
 936   *               (mbuf_data_start).
 937   *       @param mbuf The mbuf.
 938   *       @result The maximum lenght of data for this mbuf.
 939   */
 940  extern size_t mbuf_maxlen(const mbuf_t mbuf)
 941  __NKE_API_DEPRECATED;
 942  
 943  /*!
 944   *       @function mbuf_type
 945   *       @discussion Gets the type of mbuf.
 946   *       @param mbuf The mbuf.
 947   *       @result The type.
 948   */
 949  extern mbuf_type_t mbuf_type(const mbuf_t mbuf)
 950  __NKE_API_DEPRECATED;
 951  
 952  /*!
 953   *       @function mbuf_settype
 954   *       @discussion Sets the type of mbuf.
 955   *       @param mbuf The mbuf.
 956   *       @param new_type The new type.
 957   *       @result 0 upon success otherwise the errno error.
 958   */
 959  extern errno_t mbuf_settype(mbuf_t mbuf, mbuf_type_t new_type)
 960  __NKE_API_DEPRECATED;
 961  
 962  /*!
 963   *       @function mbuf_flags
 964   *       @discussion Returns the set flags.
 965   *       @param mbuf The mbuf.
 966   *       @result The flags.
 967   */
 968  extern mbuf_flags_t mbuf_flags(const mbuf_t mbuf)
 969  __NKE_API_DEPRECATED;
 970  
 971  /*!
 972   *       @function mbuf_setflags
 973   *       @discussion Sets the set of set flags.
 974   *       @param mbuf The mbuf.
 975   *       @param flags The flags that should be set, all other flags will be
 976   *               cleared.  Certain flags such as MBUF_EXT cannot be altered.
 977   *       @result 0 upon success otherwise the errno error.
 978   */
 979  extern errno_t mbuf_setflags(mbuf_t mbuf, mbuf_flags_t flags)
 980  __NKE_API_DEPRECATED;
 981  
 982  /*!
 983   *       @function mbuf_setflags_mask
 984   *       @discussion Useful for setting or clearing individual flags. Easier
 985   *               than calling mbuf_setflags(m, mbuf_flags(m) | M_FLAG).
 986   *       @param mbuf The mbuf.
 987   *       @param flags The flags that should be set or cleared.  Certain flags
 988   *               such as MBUF_EXT cannot be altered.
 989   *       @param mask The mask controlling which flags will be modified.
 990   *       @result 0 upon success otherwise the errno error.
 991   */
 992  extern errno_t mbuf_setflags_mask(mbuf_t mbuf, mbuf_flags_t flags,
 993      mbuf_flags_t mask)
 994  __NKE_API_DEPRECATED;
 995  
 996  /*!
 997   *       @function mbuf_copy_pkthdr
 998   *       @discussion Copies the packet header from src to dest.
 999   *       @param src The mbuf from which the packet header will be copied.
1000   *       @param dest The mbuf to which the packet header will be copied.
1001   *       @result 0 upon success otherwise the errno error.
1002   */
1003  extern errno_t mbuf_copy_pkthdr(mbuf_t dest, const mbuf_t src)
1004  __NKE_API_DEPRECATED;
1005  
1006  /*!
1007   *       @function mbuf_pkthdr_len
1008   *       @discussion Returns the length as reported by the packet header.
1009   *       @param mbuf The mbuf containing the packet header
1010   *       @result The length, in bytes, of the packet.
1011   */
1012  extern size_t mbuf_pkthdr_len(const mbuf_t mbuf)
1013  __NKE_API_DEPRECATED;
1014  
1015  /*!
1016   *       @function mbuf_pkthdr_setlen
1017   *       @discussion Sets the length of the packet in the packet header.
1018   *       @param mbuf The mbuf containing the packet header.
1019   *       @param len The new length of the packet.
1020   */
1021  extern void mbuf_pkthdr_setlen(mbuf_t mbuf, size_t len)
1022  __NKE_API_DEPRECATED;
1023  
1024  #ifdef XNU_KERNEL_PRIVATE
1025  /*!
1026   *       @function mbuf_pkthdr_maxlen
1027   *       @discussion Retrieves the maximum length of data that may be stored
1028   *               in this mbuf packet. This value assumes that the data pointer
1029   *                was set to the start of the possible range for that pointer
1030   *               for each mbuf in the packet chain
1031   *       @param mbuf The mbuf.
1032   *       @result The maximum lenght of data for this mbuf.
1033   */
1034  extern size_t mbuf_pkthdr_maxlen(const mbuf_t mbuf);
1035  #endif /* XNU_KERNEL_PRIVATE */
1036  
1037  /*!
1038   *       @function mbuf_pkthdr_adjustlen
1039   *       @discussion Adjusts the length of the packet in the packet header.
1040   *       @param mbuf The mbuf containing the packet header.
1041   *       @param amount The number of bytes to adjust the packet header length
1042   *               field by.
1043   */
1044  extern void mbuf_pkthdr_adjustlen(mbuf_t mbuf, int amount)
1045  __NKE_API_DEPRECATED;
1046  
1047  /*!
1048   *       @function mbuf_pkthdr_rcvif
1049   *       @discussion Returns the interface the packet was received on. This
1050   *               funciton does not modify the reference count of the interface.
1051   *               The interface is only valid for as long as the mbuf is not freed
1052   *               and the rcvif for the mbuf is not changed. Take a reference on
1053   *               the interface that you will release later before doing any of
1054   *               the following: free the mbuf, change the rcvif, pass the mbuf to
1055   *               any function that may free the mbuf or change the rcvif.
1056   *       @param mbuf The mbuf containing the packet header.
1057   *       @result A reference to the interface.
1058   */
1059  extern ifnet_t mbuf_pkthdr_rcvif(const mbuf_t mbuf)
1060  __NKE_API_DEPRECATED;
1061  
1062  /*!
1063   *       @function mbuf_pkthdr_setrcvif
1064   *       @discussion Sets the interface the packet was received on.
1065   *       @param mbuf The mbuf containing the packet header.
1066   *       @param ifp A reference to an interface.
1067   *       @result 0 upon success otherwise the errno error.
1068   */
1069  extern errno_t mbuf_pkthdr_setrcvif(mbuf_t mbuf, ifnet_t ifp)
1070  __NKE_API_DEPRECATED;
1071  
1072  /*!
1073   *       @function mbuf_pkthdr_header
1074   *       @discussion Returns a pointer to the packet header.
1075   *       @param mbuf The mbuf containing the packet header.
1076   *       @result A pointer to the packet header.
1077   */
1078  extern void *mbuf_pkthdr_header(const mbuf_t mbuf)
1079  __NKE_API_DEPRECATED;
1080  
1081  /*!
1082   *       @function mbuf_pkthdr_setheader
1083   *       @discussion Sets the pointer to the packet header.
1084   *       @param mbuf The mbuf containing the packet header.
1085   *       @param header A pointer to the header.
1086   */
1087  extern void mbuf_pkthdr_setheader(mbuf_t mbuf, void *header)
1088  __NKE_API_DEPRECATED;
1089  
1090  /* Checksums */
1091  
1092  /*!
1093   *       @function mbuf_inbound_modified
1094   *       @discussion This function will clear the checksum flags to indicate
1095   *               that a hardware checksum should not be used. Any filter
1096   *               modifying data should call this function on an mbuf before
1097   *               passing the packet up the stack. If a filter modifies a packet
1098   *               in a way that affects any checksum, the filter is responsible
1099   *               for either modifying the checksum to compensate for the changes
1100   *               or verifying the checksum before making the changes and then
1101   *               modifying the data and calculating a new checksum only if the
1102   *               original checksum was valid.
1103   *       @param mbuf The mbuf that has been modified.
1104   */
1105  extern void mbuf_inbound_modified(mbuf_t mbuf)
1106  __NKE_API_DEPRECATED;
1107  
1108  /*!
1109   *       @function mbuf_outbound_finalize
1110   *       @discussion This function will "finalize" the packet allowing your
1111   *               code to inspect the final packet.
1112   *
1113   *               There are a number of operations that are performed in hardware,
1114   *               such as calculating checksums. This function will perform in
1115   *               software the various opterations that were scheduled to be done
1116   *               in hardware. Future operations may include IPsec processing or
1117   *               vlan support. If you are redirecting a packet to a new interface
1118   *               which may not have the same hardware support or encapsulating
1119   *               the packet, you should call this function to force the stack to
1120   *               calculate and fill out the checksums. This will bypass hardware
1121   *               checksums but give you a complete packet to work with. If you
1122   *               need to inspect aspects of the packet which may be generated by
1123   *               hardware, you must call this function to get an aproximate final
1124   *               packet. If you plan to modify the packet in any way, you should
1125   *               call this function.
1126   *
1127   *               This function should be called before modifying any outbound
1128   *               packets.
1129   *
1130   *               This function may be called at various levels, in some cases
1131   *               additional headers may have already been prepended, such as the
1132   *               case of a packet seen by an interface filter. To handle this,
1133   *               the caller must pass the protocol family of the packet as well
1134   *               as the offset from the start of the packet to the protocol
1135   *               header.
1136   *       @param mbuf The mbuf that should be finalized.
1137   *       @param protocol_family The protocol family of the packet in the
1138   *               mbuf.
1139   *       @param protocol_offset The offset from the start of the mbuf to the
1140   *               protocol header. For an IP packet with an ethernet header, this
1141   *               would be the length of an ethernet header.
1142   */
1143  extern void mbuf_outbound_finalize(mbuf_t mbuf, u_int32_t protocol_family,
1144      size_t protocol_offset)
1145  __NKE_API_DEPRECATED;
1146  
1147  /*!
1148   *       @function mbuf_set_vlan_tag
1149   *       @discussion This function is used by interfaces that support vlan
1150   *               tagging in hardware. This function will set properties in the
1151   *               mbuf to indicate which vlan the packet was received for.
1152   *       @param mbuf The mbuf containing the packet.
1153   *       @param vlan The protocol family of the aux data to add.
1154   *       @result 0 upon success otherwise the errno error.
1155   */
1156  extern errno_t mbuf_set_vlan_tag(mbuf_t mbuf, u_int16_t vlan)
1157  __NKE_API_DEPRECATED;
1158  
1159  /*!
1160   *       @function mbuf_get_vlan_tag
1161   *       @discussion This function is used by drivers that support hardware
1162   *               vlan tagging to determine which vlan this packet belongs to. To
1163   *               differentiate between the case where the vlan tag is zero and
1164   *               the case where there is no vlan tag, this function will return
1165   *               ENXIO when there is no vlan.
1166   *       @param mbuf The mbuf containing the packet.
1167   *       @param vlan The protocol family of the aux data to add.
1168   *       @result 0 upon success otherwise the errno error. ENXIO indicates
1169   *               that the vlan tag is not set.
1170   */
1171  extern errno_t mbuf_get_vlan_tag(mbuf_t mbuf, u_int16_t *vlan)
1172  __NKE_API_DEPRECATED;
1173  
1174  /*!
1175   *       @function mbuf_clear_vlan_tag
1176   *       @discussion This function will clear any vlan tag associated with
1177   *               the mbuf.
1178   *       @param mbuf The mbuf containing the packet.
1179   *       @result 0 upon success otherwise the errno error.
1180   */
1181  extern errno_t mbuf_clear_vlan_tag(mbuf_t mbuf)
1182  __NKE_API_DEPRECATED;
1183  
1184  #ifdef KERNEL_PRIVATE
1185  /*!
1186   *       @function mbuf_set_csum_requested
1187   *       @discussion This function is used by the stack to indicate which
1188   *               checksums should be calculated in hardware. The stack normally
1189   *               sets these flags as the packet is processed in the outbound
1190   *               direction. Just before send the packe to the interface, the
1191   *               stack will look at these flags and perform any checksums in
1192   *               software that are not supported by the interface.
1193   *       @param mbuf The mbuf containing the packet.
1194   *       @param request Flags indicating which checksums are being requested
1195   *               for this packet.
1196   *       @param value This parameter is currently unsupported.
1197   *       @result 0 upon success otherwise the errno error.
1198   */
1199  extern errno_t mbuf_set_csum_requested(mbuf_t mbuf,
1200      mbuf_csum_request_flags_t request, u_int32_t value);
1201  #endif /* KERNEL_PRIVATE */
1202  
1203  /*!
1204   *       @function mbuf_get_csum_requested
1205   *       @discussion This function is used by the driver to determine which
1206   *               checksum operations should be performed in hardware.
1207   *       @param mbuf The mbuf containing the packet.
1208   *       @param request Flags indicating which checksums are being requested
1209   *               for this packet.
1210   *       @param value This parameter is currently unsupported.
1211   *       @result 0 upon success otherwise the errno error.
1212   */
1213  extern errno_t mbuf_get_csum_requested(mbuf_t mbuf,
1214      mbuf_csum_request_flags_t *request, u_int32_t *value)
1215  __NKE_API_DEPRECATED;
1216  
1217  /*!
1218   *       @function mbuf_get_tso_requested
1219   *       @discussion This function is used by the driver to determine which
1220   *               checksum operations should be performed in hardware.
1221   *       @param mbuf The mbuf containing the packet.
1222   *       @param request Flags indicating which values are being requested
1223   *               for this packet.
1224   *       @param value The requested value.
1225   *       @result 0 upon success otherwise the errno error.
1226   */
1227  extern errno_t mbuf_get_tso_requested(mbuf_t mbuf,
1228      mbuf_tso_request_flags_t *request, u_int32_t *value)
1229  __NKE_API_DEPRECATED;
1230  
1231  /*!
1232   *       @function mbuf_clear_csum_requested
1233   *       @discussion This function clears the checksum request flags.
1234   *       @param mbuf The mbuf containing the packet.
1235   *       @result 0 upon success otherwise the errno error.
1236   */
1237  extern errno_t mbuf_clear_csum_requested(mbuf_t mbuf)
1238  __NKE_API_DEPRECATED;
1239  
1240  /*!
1241   *       @function mbuf_set_csum_performed
1242   *       @discussion This is used by the driver to indicate to the stack which
1243   *               checksum operations were performed in hardware.
1244   *       @param mbuf The mbuf containing the packet.
1245   *       @param flags Flags indicating which hardware checksum operations
1246   *               were performed.
1247   *       @param value If the MBUF_CSUM_DID_DATA flag is set, value should be
1248   *               set to the value of the TCP or UDP header as calculated by the
1249   *               hardware.
1250   *       @result 0 upon success otherwise the errno error.
1251   */
1252  extern errno_t mbuf_set_csum_performed(mbuf_t mbuf,
1253      mbuf_csum_performed_flags_t flags, u_int32_t value)
1254  __NKE_API_DEPRECATED;
1255  
1256  #ifdef KERNEL_PRIVATE
1257  /*
1258   *       @function mbuf_get_csum_performed
1259   *       @discussion This is used by the stack to determine which checksums
1260   *               were calculated in hardware on the inbound path.
1261   *       @param mbuf The mbuf containing the packet.
1262   *       @param flags Flags indicating which hardware checksum operations
1263   *               were performed.
1264   *       @param value If the MBUF_CSUM_DID_DATA flag is set, value will be
1265   *               set to the value of the TCP or UDP header as calculated by the
1266   *               hardware.
1267   *       @result 0 upon success otherwise the errno error.
1268   */
1269  extern errno_t mbuf_get_csum_performed(mbuf_t mbuf,
1270      mbuf_csum_performed_flags_t *flags, u_int32_t *value);
1271  #endif /* KERNEL_PRIVATE */
1272  
1273  /*!
1274   *       @function mbuf_get_mlen
1275   *       @discussion This routine returns the number of data bytes in a normal
1276   *               mbuf, i.e. an mbuf that is not a packet header, nor one with
1277   *               an external cluster attached to it.  This is equivalent to the
1278   *               legacy MLEN macro.
1279   *       @result	The number of bytes of available data.
1280   */
1281  extern u_int32_t mbuf_get_mlen(void)
1282  __NKE_API_DEPRECATED;
1283  
1284  /*!
1285   *       @function mbuf_get_mhlen
1286   *       @discussion This routine returns the number of data bytes in a packet
1287   *               header mbuf.  This is equivalent to the legacy MHLEN macro.
1288   *       @result	The number of bytes of available data.
1289   */
1290  extern u_int32_t mbuf_get_mhlen(void)
1291  __NKE_API_DEPRECATED;
1292  
1293  /*!
1294   *       @function mbuf_get_minclsize
1295   *       @discussion This routine returns the minimum number of data bytes
1296   *               before an external cluster is used.  This is equivalent to the
1297   *               legacy MINCLSIZE macro.
1298   *       @result	The minimum number of bytes before a cluster will be used.
1299   */
1300  extern u_int32_t mbuf_get_minclsize(void)
1301  __NKE_API_DEPRECATED;
1302  
1303  /*!
1304   *       @function mbuf_clear_csum_performed
1305   *       @discussion Clears the hardware checksum flags and values.
1306   *       @param mbuf The mbuf containing the packet.
1307   *       @result 0 upon success otherwise the errno error.
1308   */
1309  extern errno_t mbuf_clear_csum_performed(mbuf_t mbuf)
1310  __NKE_API_DEPRECATED;
1311  
1312  /*!
1313   *       @function mbuf_inet_cksum
1314   *       @discussion Calculates 16-bit 1's complement Internet checksum of the
1315   *               transport segment with or without the pseudo header checksum
1316   *               of a given IPv4 packet.  If the caller specifies a non-zero
1317   *               transport protocol, the checksum returned will also include
1318   *               the pseudo header checksum for the corresponding transport
1319   *               header.  Otherwise, no header parsing will be done and the
1320   *               caller may use this to calculate the Internet checksum of
1321   *               an arbitrary span of data.
1322   *
1323   *               This routine does not modify the contents of the packet.  If
1324   *               the caller specifies a non-zero protocol and/or offset, the
1325   *               routine expects the complete protocol header to be present
1326   *               at the beginning of the first mbuf.
1327   *       @param mbuf The mbuf (or chain of mbufs) containing the packet.
1328   *       @param protocol A zero or non-zero value.  A non-zero value specifies
1329   *               the transport protocol used for pseudo header checksum.
1330   *       @param offset A zero or non-zero value; if the latter, it specifies
1331   *               the offset of the transport header from the beginning of mbuf.
1332   *       @param length The total (non-zero) length of the transport segment.
1333   *       @param csum Pointer to the checksum variable; upon success, this
1334   *               routine will return the calculated Internet checksum through
1335   *               this variable.  The caller must set it to a non-NULL value.
1336   *       @result 0 upon success otherwise the errno error.
1337   */
1338  extern errno_t mbuf_inet_cksum(mbuf_t mbuf, int protocol, u_int32_t offset,
1339      u_int32_t length, u_int16_t *csum)
1340  __NKE_API_DEPRECATED;
1341  
1342  /*!
1343   *       @function mbuf_inet6_cksum
1344   *       @discussion Calculates 16-bit 1's complement Internet checksum of the
1345   *               transport segment with or without the pseudo header checksum
1346   *               of a given IPv6 packet.  If the caller specifies a non-zero
1347   *               transport protocol, the checksum returned will also include
1348   *               the pseudo header checksum for the corresponding transport
1349   *               header.  Otherwise, no header parsing will be done and the
1350   *               caller may use this to calculate the Internet checksum of
1351   *               an arbitrary span of data.
1352   *
1353   *               This routine does not modify the contents of the packet.  If
1354   *               the caller specifies a non-zero protocol and/or offset, the
1355   *               routine expects the complete protocol header(s) to be present
1356   *               at the beginning of the first mbuf.
1357   *       @param mbuf The mbuf (or chain of mbufs) containing the packet.
1358   *       @param protocol A zero or non-zero value.  A non-zero value specifies
1359   *               the transport protocol used for pseudo header checksum.
1360   *       @param offset A zero or non-zero value; if the latter, it specifies
1361   *               the offset of the transport header from the beginning of mbuf.
1362   *       @param length The total (non-zero) length of the transport segment.
1363   *       @param csum Pointer to the checksum variable; upon success, this
1364   *               routine will return the calculated Internet checksum through
1365   *               this variable.  The caller must set it to a non-NULL value.
1366   *       @result 0 upon success otherwise the errno error.
1367   */
1368  extern errno_t mbuf_inet6_cksum(mbuf_t mbuf, int protocol, u_int32_t offset,
1369      u_int32_t length, u_int16_t *csum)
1370  __NKE_API_DEPRECATED;
1371  
1372  /* mbuf tags */
1373  
1374  /*!
1375   *       @function mbuf_tag_id_find
1376   *       @discussion Lookup the module id for a string. If there is no module
1377   *               id assigned to this string, a new module id will be assigned.
1378   *               The string should be the bundle id of the kext. In the case of a
1379   *               tag that will be shared across multiple kexts, a common bundle
1380   *               id style string should be used.
1381   *
1382   *               The lookup operation is not optimized. A module should call this
1383   *               function once during startup and chache the module id. The
1384   *               module id will not be resassigned until the machine reboots.
1385   *       @param module_string A unique string identifying your module.
1386   *               Example: com.apple.nke.SharedIP.
1387   *       @param module_id Upon return, a unique identifier for use with
1388   *               mbuf_tag_* functions. This identifier is valid until the machine
1389   *               is rebooted.
1390   *       @result 0 upon success otherwise the errno error.
1391   */
1392  extern errno_t mbuf_tag_id_find(const char *module_string,
1393      mbuf_tag_id_t *module_id)
1394  __NKE_API_DEPRECATED;
1395  
1396  /*!
1397   *       @function mbuf_tag_allocate
1398   *       @discussion Allocate an mbuf tag. Mbuf tags allow various portions
1399   *               of the stack to tag mbufs with data that will travel with the
1400   *               mbuf through the stack.
1401   *
1402   *               Tags may only be added to mbufs with packet headers
1403   *               (MBUF_PKTHDR flag is set). Mbuf tags are freed when the mbuf is
1404   *               freed or when mbuf_tag_free is called.
1405   *       @param mbuf The mbuf to attach this tag to.
1406   *       @param module_id A module identifier returned by mbuf_tag_id_find.
1407   *       @param type A 16 bit type value. For a given module_id, you can use
1408   *               a number of different tag types.
1409   *       @param length The length, in bytes, to allocate for storage that
1410   *               will be associated with this tag on this mbuf.
1411   *       @param how Indicate whether you want to block and wait for memory if
1412   *               memory is not immediately available.
1413   *       @param data_p Upon successful return, *data_p will point to the
1414   *               buffer allocated for the mtag.
1415   *       @result 0 upon success otherwise the errno error.
1416   */
1417  extern errno_t mbuf_tag_allocate(mbuf_t mbuf, mbuf_tag_id_t module_id,
1418      mbuf_tag_type_t type, size_t length, mbuf_how_t how, void **data_p)
1419  __NKE_API_DEPRECATED;
1420  
1421  /*!
1422   *       @function mbuf_tag_find
1423   *       @discussion Find the data associated with an mbuf tag.
1424   *       @param mbuf The mbuf the tag is attached to.
1425   *       @param module_id A module identifier returned by mbuf_tag_id_find.
1426   *       @param type The 16 bit type of the tag to find.
1427   *       @param length Upon success, the length of data will be store in
1428   * length.
1429   *       @param data_p Upon successful return, *data_p will point to the
1430   *               buffer allocated for the mtag.
1431   *       @result 0 upon success otherwise the errno error.
1432   */
1433  extern errno_t mbuf_tag_find(mbuf_t mbuf, mbuf_tag_id_t module_id,
1434      mbuf_tag_type_t type, size_t *length, void **data_p)
1435  __NKE_API_DEPRECATED;
1436  
1437  /*!
1438   *       @function mbuf_tag_free
1439   *       @discussion Frees a previously allocated mbuf tag.
1440   *       @param mbuf The mbuf the tag was allocated on.
1441   *       @param module_id The ID of the tag to free.
1442   *       @param type The type of the tag to free.
1443   */
1444  extern void mbuf_tag_free(mbuf_t mbuf, mbuf_tag_id_t module_id,
1445      mbuf_tag_type_t type)
1446  __NKE_API_DEPRECATED;
1447  
1448  #ifdef KERNEL_PRIVATE
1449  /*!
1450   *       @function mbuf_add_drvaux
1451   *       @discussion Allocate space for driver auxiliary data and attach it
1452   *               to the packet (MBUF_PKTHDR is required.)  This space is freed
1453   *               when the mbuf is freed or when mbuf_del_drvaux is called.
1454   *               Only one instance of driver auxiliary data may be attached to
1455   *               a packet. Any attempt to add it to a packet already associated
1456   *               with one will yield an error, and the existing one must first
1457   *               be removed via mbuf_del_drvaux.  The format and length of the
1458   *               data depend largely on the family and sub-family.  The system
1459   *               makes no attempt to define and/or interpret the contents of
1460   *               the data, and simply acts as a conduit between its producer
1461   *               and consumer.
1462   *       @param mbuf The mbuf to attach the auxiliary data to.
1463   *       @param how Indicate whether you are willing to block and wait for
1464   *               memory, if memory is not immediately available.
1465   *       @param family The interface family as defined in net/kpi_interface.h.
1466   *       @param subfamily The interface sub-family as defined in
1467   *               net/kpi_interface.h.
1468   *       @param length The length of the auxiliary data, must be greater than 0.
1469   *       @param data_p Upon successful return, *data_p will point to the
1470   *               space allocated for the data.  Caller may set this to NULL.
1471   *       @result 0 upon success otherwise the errno error.
1472   */
1473  extern errno_t mbuf_add_drvaux(mbuf_t mbuf, mbuf_how_t how,
1474      u_int32_t family, u_int32_t subfamily, size_t length, void **data_p);
1475  
1476  /*!
1477   *       @function mbuf_find_drvaux
1478   *       @discussion Find the driver auxiliary data associated with a packet.
1479   *       @param mbuf The mbuf the auxiliary data is attached to.
1480   *       @param family_p Upon successful return, *family_p will contain
1481   *               the interface family associated with the data, as defined
1482   *               in net/kpi_interface.h.  Caller may set this to NULL.
1483   *       @param subfamily_p Upon successful return, *subfamily_p will contain
1484   *               the interface family associated with the data, as defined
1485   *               in net/kpi_interface.h.  Caller may set this to NULL.
1486   *       @param length_p Upon successful return, *length_p will contain
1487   *               the length of the driver auxiliary data.  Caller may
1488   *               set this to NULL.
1489   *       @param data_p Upon successful return, *data_p will point to the
1490   *               space allocated for the data.
1491   *       @result 0 upon success otherwise the errno error.
1492   */
1493  extern errno_t mbuf_find_drvaux(mbuf_t mbuf, u_int32_t *family_p,
1494      u_int32_t *subfamily_p, u_int32_t *length_p, void **data_p);
1495  
1496  /*!
1497   *       @function mbuf_del_drvaux
1498   *       @discussion Remove and free any driver auxility data associated
1499   *               with the packet.
1500   *       @param mbuf The mbuf the auxiliary data is attached to.
1501   */
1502  extern void mbuf_del_drvaux(mbuf_t mbuf);
1503  #endif /* KERNEL_PRIVATE */
1504  
1505  /* mbuf stats */
1506  
1507  /*!
1508   *       @function mbuf_stats
1509   *       @discussion Get the mbuf statistics.
1510   *       @param stats Storage to copy the stats in to.
1511   */
1512  extern void mbuf_stats(struct mbuf_stat *stats)
1513  __NKE_API_DEPRECATED;
1514  
1515  
1516  /*!
1517   *       @enum mbuf_traffic_class_t
1518   *       @abstract Traffic class of a packet
1519   *       @discussion Property that represent the category of traffic of a packet.
1520   *               This information may be used by the driver and at the link level.
1521   *       @constant MBUF_TC_BE Best effort, normal class.
1522   *       @constant MBUF_TC_BK Background, low priority or bulk traffic.
1523   *       @constant MBUF_TC_VI Interactive video, constant bit rate, low latency.
1524   *       @constant MBUF_TC_VO Interactive voice, constant bit rate, lowest latency.
1525   */
1526  typedef enum {
1527  #ifdef XNU_KERNEL_PRIVATE
1528  	MBUF_TC_UNSPEC  = -1,           /* Internal: not specified */
1529  #endif
1530  	MBUF_TC_BE              = 0,
1531  	MBUF_TC_BK              = 1,
1532  	MBUF_TC_VI              = 2,
1533  	MBUF_TC_VO              = 3
1534  #ifdef XNU_KERNEL_PRIVATE
1535  	,
1536  	MBUF_TC_MAX             = 4     /* Internal: traffic class count */
1537  #endif
1538  } mbuf_traffic_class_t;
1539  
1540  /*!
1541   *       @function mbuf_get_traffic_class
1542   *       @discussion Get the traffic class of an mbuf packet
1543   *       @param mbuf The mbuf to get the traffic class of.
1544   *       @result The traffic class
1545   */
1546  extern mbuf_traffic_class_t mbuf_get_traffic_class(mbuf_t mbuf)
1547  __NKE_API_DEPRECATED;
1548  
1549  /*!
1550   *       @function mbuf_set_traffic_class
1551   *       @discussion Set the traffic class of an mbuf packet.
1552   *       @param mbuf The mbuf to set the traffic class on.
1553   *       @param tc The traffic class
1554   *       @result 0 on success, EINVAL if bad parameter is passed
1555   */
1556  extern errno_t mbuf_set_traffic_class(mbuf_t mbuf, mbuf_traffic_class_t tc)
1557  __NKE_API_DEPRECATED;
1558  
1559  /*!
1560   *       @function mbuf_is_traffic_class_privileged
1561   *       @discussion Returns the privileged status of the traffic class
1562   *               of the packet specified by the mbuf.
1563   *       @param mbuf The mbuf to retrieve the status from.
1564   *       @result Non-zero if privileged, 0 otherwise.
1565   */
1566  extern int mbuf_is_traffic_class_privileged(mbuf_t mbuf)
1567  __NKE_API_DEPRECATED;
1568  
1569  #ifdef KERNEL_PRIVATE
1570  
1571  /*!
1572   *       @function mbuf_get_traffic_class_max_count
1573   *       @discussion Returns the maximum number of mbuf traffic class types
1574   *       @result The total count of mbuf traffic classes
1575   */
1576  extern u_int32_t mbuf_get_traffic_class_max_count(void);
1577  
1578  /*!
1579   *       @function mbuf_get_traffic_class_index
1580   *       @discussion Returns the zero-based index of an mbuf traffic class value
1581   *       @param tc The traffic class
1582   *       @param index Pointer to the index value
1583   *       @result 0 on success, EINVAL if bad parameter is passed
1584   */
1585  extern errno_t mbuf_get_traffic_class_index(mbuf_traffic_class_t tc,
1586      u_int32_t *index);
1587  
1588  /*!
1589   *       @enum mbuf_svc_class_t
1590   *       @abstract Service class of a packet
1591   *       @discussion Property that represents the category of service
1592   *               of a packet. This information may be used by the driver
1593   *               and at the link level.
1594   *       @constant MBUF_SC_BK_SYS "Background System-Initiated", high delay
1595   *               tolerant, high loss tolerant, elastic flow, variable size &
1596   *               long-lived.
1597   *       @constant MBUF_SC_BK "Background", user-initiated, high delay tolerant,
1598   *               high loss tolerant, elastic flow, variable size.  This level
1599   *               corresponds to WMM access class "BG", or MBUF_TC_BK.
1600   *       @constant MBUF_SC_BE "Best Effort", unclassified/standard.  This is
1601   *               the default service class; pretty much a mix of everything.
1602   *               This level corresponds to WMM access class "BE" or MBUF_TC_BE.
1603   *       @constant MBUF_SC_RD
1604   *               "Responsive Data", a notch higher than "Best Effort", medium
1605   *               delay tolerant, medium loss tolerant, elastic flow, bursty,
1606   *               long-lived.
1607   *       @constant MBUF_SC_OAM "Operations, Administration, and Management",
1608   *               medium delay tolerant, low-medium loss tolerant, elastic &
1609   *               inelastic flows, variable size.
1610   *       @constant MBUF_SC_AV "Multimedia Audio/Video Streaming", medium delay
1611   *               tolerant, low-medium loss tolerant, elastic flow, constant
1612   *               packet interval, variable rate & size.
1613   *       @constant MBUF_SC_RV "Responsive Multimedia Audio/Video", low delay
1614   *               tolerant, low-medium loss tolerant, elastic flow, variable
1615   *               packet interval, rate and size.
1616   *       @constant MBUF_SC_VI "Interactive Video", low delay tolerant, low-
1617   *               medium loss tolerant, elastic flow, constant packet interval,
1618   *               variable rate & size.  This level corresponds to WMM access
1619   *               class "VI" or MBUF_TC_VI.
1620   *       @constant MBUF_SC_SIG "Signaling", low delay tolerant, low loss
1621   *               tolerant, inelastic flow, jitter tolerant, rate is bursty but
1622   *               short, variable size. e.g. SIP.  This level corresponds to WMM
1623   *               access class "VI" or MBUF_TC_VI.
1624   *       @constant MBUF_SC_VO "Interactive Voice", low delay tolerant, low loss
1625   *               tolerant, inelastic flow, constant packet rate, somewhat fixed
1626   *               size.  This level corresponds to WMM access class "VO" or
1627   *               MBUF_TC_VO.
1628   *       @constant MBUF_SC_CTL "Network Control", low delay tolerant, low loss
1629   *               tolerant, inelastic flow, rate is short & burst, variable size.
1630   */
1631  typedef enum {
1632  #ifdef XNU_KERNEL_PRIVATE
1633  	MBUF_SC_UNSPEC          = -1,           /* Internal: not specified */
1634  #endif
1635  	MBUF_SC_BK_SYS          = 0x00080090,   /* lowest class */
1636  	MBUF_SC_BK              = 0x00100080,
1637  
1638  	MBUF_SC_BE              = 0x00000000,
1639  	MBUF_SC_RD              = 0x00180010,
1640  	MBUF_SC_OAM             = 0x00200020,
1641  
1642  	MBUF_SC_AV              = 0x00280120,
1643  	MBUF_SC_RV              = 0x00300110,
1644  	MBUF_SC_VI              = 0x00380100,
1645  	MBUF_SC_SIG             = 0x00380130,
1646  
1647  	MBUF_SC_VO              = 0x00400180,
1648  	MBUF_SC_CTL             = 0x00480190,   /* highest class */
1649  } mbuf_svc_class_t;
1650  
1651  /*!
1652   *       @function mbuf_get_service_class_max_count
1653   *       @discussion Returns the maximum number of mbuf service class types.
1654   *       @result The total count of mbuf service classes.
1655   */
1656  extern u_int32_t mbuf_get_service_class_max_count(void);
1657  
1658  /*!
1659   *       @function mbuf_get_service_class_index
1660   *       @discussion Returns the zero-based index of an mbuf service class value
1661   *       @param sc The service class
1662   *       @param index Pointer to the index value
1663   *       @result 0 on success, EINVAL if bad parameter is passed
1664   */
1665  extern errno_t mbuf_get_service_class_index(mbuf_svc_class_t sc,
1666      u_int32_t *index);
1667  
1668  /*!
1669   *       @function mbuf_get_service_class
1670   *       @discussion Get the service class of an mbuf packet
1671   *       @param mbuf The mbuf to get the service class of.
1672   *       @result The service class
1673   */
1674  extern mbuf_svc_class_t mbuf_get_service_class(mbuf_t mbuf);
1675  
1676  /*!
1677   *       @function mbuf_set_servicec_class
1678   *       @discussion Set the service class of an mbuf packet.
1679   *       @param mbuf The mbuf to set the service class on.
1680   *       @param sc The service class
1681   *       @result 0 on success, EINVAL if bad parameter is passed
1682   */
1683  extern errno_t mbuf_set_service_class(mbuf_t mbuf, mbuf_svc_class_t sc);
1684  
1685  /*!
1686   *       @function mbuf_is_service_class_privileged
1687   *       @discussion Returns the privileged status of the service class
1688   *               of the packet specified by the mbuf.
1689   *       @param mbuf The mbuf to retrieve the status from.
1690   *       @result Non-zero if privileged, 0 otherwise.
1691   */
1692  extern int mbuf_is_service_class_privileged(mbuf_t mbuf);
1693  
1694  /*!
1695   *       @enum mbuf_pkthdr_aux_flags_t
1696   *       @abstract Constants defining mbuf auxiliary flags.  Only the flags
1697   *               listed below can be retrieved.
1698   *       @constant MBUF_PKTAUXF_INET_RESOLVE_RTR Indicates this is an ARP
1699   *               request packet, whose target is the address of the default
1700   *               IPv4 router.
1701   *       @constant MBUF_PKTAUXF_INET6_RESOLVE_RTR Indicates this is an ICMPv6
1702   *               Neighbor Solicitation packet, whose target is the address of
1703   *               the default IPv6 router.
1704   */
1705  enum {
1706  	MBUF_PKTAUXF_INET_RESOLVE_RTR   = 0x0004,
1707  	MBUF_PKTAUXF_INET6_RESOLVE_RTR  = 0x0008,
1708  };
1709  typedef u_int32_t mbuf_pkthdr_aux_flags_t;
1710  
1711  /*!
1712   *       @function mbuf_pkthdr_aux_flags
1713   *       @discussion Returns the auxiliary flags of a packet.
1714   *       @param mbuf The mbuf containing the packet header.
1715   *       @param paux_flags Pointer to mbuf_pkthdr_aux_flags_t variable.
1716   *       @result 0 upon success otherwise the errno error.
1717   */
1718  extern errno_t mbuf_pkthdr_aux_flags(mbuf_t mbuf,
1719      mbuf_pkthdr_aux_flags_t *paux_flags);
1720  
1721  /*!
1722   *       @function mbuf_get_driver_scratch
1723   *       @discussion Returns a pointer to a driver specific area in the mbuf
1724   *       @param m The mbuf whose driver scratch space is to be returned
1725   *       @param area A pointer to a location to store the address of the
1726   *               driver scratch space.  This value is guaranteed to be 32-bit
1727   *               aligned.
1728   *       @param area_ln A pointer to a location to store the total length of
1729   *               the memory location.
1730   */
1731  extern errno_t mbuf_get_driver_scratch(mbuf_t m, u_int8_t **area,
1732      size_t *area_ln);
1733  
1734  /*!
1735   *       @function mbuf_get_unsent_data_bytes
1736   *       @discussion Returns the amount of data that is waiting to be sent
1737   *               on this interface. This is a private SPI used by cellular
1738   *               interface as an indication of future activity on that
1739   *               interface.
1740   *       @param m The mbuf containing the packet header
1741   *       @param unsent_data A pointer to an integer where the value of
1742   *               unsent data will be set.
1743   *       @result 0 upon success otherwise the errno error. If the mbuf
1744   *               packet header does not have valid data bytes, the error
1745   *               code will be EINVAL
1746   */
1747  extern errno_t mbuf_get_unsent_data_bytes(const mbuf_t m,
1748      u_int32_t *unsent_data);
1749  
1750  typedef struct {
1751  	int32_t buf_interface; /* data to send at interface */
1752  	int32_t buf_sndbuf; /* data to send at socket buffer */
1753  } mbuf_buffer_status_t;
1754  
1755  /*!
1756   *       @function mbuf_get_buffer_status
1757   *       @discussion Returns the amount of data that is waiting to be sent
1758   *               on this interface. This is a private SPI used by cellular
1759   *               interface as an indication of future activity on that
1760   *               interface.
1761   *       @param m The mbuf containing the packet header
1762   *       @param buf_status A pointer to the structure where the value of
1763   *               unsent data will be set.
1764   *       @result 0 upon success. If any of the arguments is NULL or if the
1765   *               mbuf packet header does not have valid data bytes,
1766   *               EINVAL will be returned
1767   */
1768  extern errno_t mbuf_get_buffer_status(const mbuf_t m,
1769      mbuf_buffer_status_t *buf_status);
1770  
1771  /*!
1772   *       @function mbuf_pkt_new_flow
1773   *       @discussion This function is used to check if the packet is from a
1774   *               new flow that can be treated with higher priority. This is
1775   *               a private SPI.
1776   *       @param m The mbuf containing the packet header
1777   *       @param retval A pointer to an integer used as an out argument. The
1778   *               value is set to 1 if the packet is from a new flow,
1779   *               otherwise it is set to 0.
1780   *       @result	0 upon success otherwise the errno error. If any of the
1781   *               arguments is NULL or if the mbuf does not have valid packet
1782   *               header, the error code will be EINVAL
1783   */
1784  extern errno_t mbuf_pkt_new_flow(const mbuf_t m, u_int32_t *retval);
1785  
1786  /*!
1787   *       @function mbuf_last_pkt
1788   *       @discussion This function is used to check if the packet is the
1789   *               last one sent on a TCP socket. This is an advisory
1790   *               for the underlying layers.
1791   *       @param m The mbuf containing the packet header
1792   *       @param retval A pointer to an integer whose value will be set to
1793   *               1 if the packet is the last packet, otherwise it will
1794   *               be set to 0.
1795   *       @result 0 upon success otherwise the errno error. If any of the
1796   *               arguments is NULL or if the mbuf does not have valid
1797   *               packet header, the error code will be EINVAL
1798   */
1799  extern errno_t mbuf_last_pkt(const mbuf_t m, u_int32_t *retval);
1800  
1801  #endif /* KERNEL_PRIVATE */
1802  
1803  #ifdef XNU_KERNEL_PRIVATE
1804  /*!
1805   *       @function mbuf_pkt_list_len
1806   *       @discussion Retrieves the length of the list of mbuf packets.
1807   *       @param mbuf The mbuf.
1808   *       @result The length of the mbuf packet list.
1809   */
1810  extern size_t mbuf_pkt_list_len(const mbuf_t mbuf);
1811  
1812  /*!
1813   *       @function mbuf_pkt_list_maxlen
1814   *       @discussion Retrieves the maximum length of data that may be stored
1815   *               in the list of mbuf packet. This value assumes that the data pointer
1816   *               was set to the start of the possible range for that pointer
1817   *               for each mbuf in the packet chain
1818   *       @param mbuf The mbuf.
1819   *       @result The maximum length of data for this mbuf.
1820   */
1821  extern size_t mbuf_pkt_list_maxlen(const mbuf_t mbuf);
1822  #endif /* XNU_KERNEL_PRIVATE */
1823  
1824  #ifdef KERNEL_PRIVATE
1825  /*!
1826   *       @function mbuf_get_timestamp
1827   *       @discussion Retrieves the timestamp of the packet.
1828   *       @param mbuf The mbuf representing the packet.
1829   *       @param ts A pointer where the value of the timestamp will be copied
1830   *               to.
1831   *       @param valid A pointer to a boolean value that indicate if the
1832   *               timestamp is valid (i.e. the packet timestamp has been set).
1833   *               If "false" the value of "ts" is undetermined.
1834   *       @result 0 upon success otherwise the errno error. If the mbuf
1835   *               packet header does not have valid data bytes, the error
1836   *               code will be EINVAL
1837   */
1838  extern errno_t mbuf_get_timestamp(mbuf_t mbuf, u_int64_t *ts, boolean_t *valid);
1839  
1840  /*!
1841   *       @function mbuf_set_timestamp
1842   *       @discussion Set the timestamp of the packet.
1843   *       @param mbuf The mbuf representing the packet.
1844   *       @param ts The value of the timestamp to be stored in the mbuf packet
1845   *               header
1846   *       @param valid A boolean value that indicate if the timestamp is valid.
1847   *               Passing false clears any previous timestamp value.
1848   *       @result 0 upon success otherwise the errno error. If the mbuf
1849   *               packet header does not have valid data bytes, the error
1850   *               code will be EINVAL
1851   */
1852  extern errno_t mbuf_set_timestamp(mbuf_t mbuf, u_int64_t ts, boolean_t valid);
1853  
1854  /*!
1855   *       @typedef mbuf_tx_compl_func
1856   *       @discussion This callback is used to indicate when a driver has
1857   *               transmitted a packet.
1858   *       @param pktid The packet indentifier that was returned by
1859   *               mbuf_set_timestamp_requested()
1860   *       @param ifp The outgoing interface or NULL if the packet was dropped
1861   *               before reaching the driver
1862   *       @param ts The timestamp in nanoseconds when the packet was transmitted
1863   *       @param tx_compl_arg An argument set by the driver
1864   *       @param tx_compl_data Additional data set by the driver
1865   *       @param tx_compl_val The transmission status is expected to be an
1866   *               IOReturn value -- see <IOKit/IOReturn.h>
1867   */
1868  
1869  typedef void (*mbuf_tx_compl_func)(uintptr_t pktid, ifnet_t ifp, u_int64_t ts,
1870      uintptr_t tx_compl_arg, uintptr_t tx_compl_data, kern_return_t tx_compl_val);
1871  
1872  /*!
1873   *       @function mbuf_register_tx_compl_callback
1874   *       @discussion Register a transmit completion callback function. The
1875   *               callback function must be unregistered before the calling
1876   *               module unloads.
1877   *       @param callback The completion callback function to register
1878   *       @result 0 upon success otherwise the errno error. ENOSPC is returned
1879   *               if too many callbacks are registered. EINVAL is returned when
1880   *               the function pointer is invalid. EEXIST is returned when
1881   *               the function pointer is already registered.
1882   */
1883  extern errno_t mbuf_register_tx_compl_callback(
1884  	mbuf_tx_compl_func callback);
1885  
1886  /*!
1887   *       @function mbuf_unregister_tx_compl_callback
1888   *       @discussion Unregister a transmit completion callback function. The
1889   *               callback function must be unregistered before the calling
1890   *               module unloads.
1891   *       @param callback The completion callback function to unregister
1892   *       @result 0 upon success otherwise the errno error. EINVAL is returned
1893   *               when the function pointer is invalid. ENOENT is returned when
1894   *               the function pointer is not registered.
1895   */
1896  extern errno_t mbuf_unregister_tx_compl_callback(
1897  	mbuf_tx_compl_func callback);
1898  
1899  /*!
1900   *       @function mbuf_get_timestamp_requested
1901   *       @discussion Tell if the packet timestamp needs to be set. This is meant
1902   *               to be used by a driver on egress packets.
1903   *       @param mbuf The mbuf representing the packet.
1904   *       @param requested A pointer to a boolean value that indicate if the
1905   *               timestamp was requested to be set.
1906   *       @result 0 upon success otherwise the errno error. If the mbuf
1907   *               packet header does not have valid data bytes, the error
1908   *               code will be EINVAL
1909   */
1910  extern errno_t mbuf_get_timestamp_requested(mbuf_t mbuf, boolean_t *requested);
1911  
1912  /*!
1913   *       @function mbuf_set_timestamp_requested
1914   *       @discussion Indicate the callback is expected to be called with the
1915   *               transmission complete timestamp. This is meant to be used
1916   *               on egress packet by the driver.
1917   *       @param mbuf The mbuf representing the packet.
1918   *       @param callback A previously registered completion callback function.
1919   *       @param pktid An output parameter with an opaque value that can be used
1920   *               to identify the packet.
1921   *       @result 0 upon success otherwise the errno error. EINVAL is retuned
1922   *               if the mbuf is not a valid packet or if one of the parameter
1923   *               is NULL. ENOENT if the callback is not registred.
1924   */
1925  extern errno_t mbuf_set_timestamp_requested(mbuf_t mbuf,
1926      uintptr_t *pktid, mbuf_tx_compl_func callback);
1927  
1928  /*!
1929   *       @function mbuf_get_status
1930   *       @discussion Retrieves the packet completion status.
1931   *       @param mbuf The mbuf representing the packet.
1932   *       @param status A pointer where the value of the completion status will
1933   *               be copied to.
1934   *       @result 0 upon success otherwise the errno error. If the mbuf
1935   *               packet header does not have valid data bytes, the error
1936   *               code will be EINVAL
1937   */
1938  extern errno_t mbuf_get_status(mbuf_t mbuf, kern_return_t *status);
1939  
1940  /*!
1941   *       @function mbuf_set_status
1942   *       @discussion Store the packet completion status in the mbuf packet
1943   *               header.
1944   *       @param mbuf The mbuf representing the packet.
1945   *       @param status The value of the completion status.
1946   *       @result 0 upon success otherwise the errno error. If the mbuf
1947   *               packet header does not have valid data bytes, the error
1948   *               code will be EINVAL
1949   */
1950  extern errno_t mbuf_set_status(mbuf_t mbuf, kern_return_t status);
1951  
1952  /*!
1953   *       @function mbuf_get_tx_compl_data
1954   *       @discussion Retrieves the packet completion status.
1955   *       @param m The mbuf representing the packet.
1956   *       @result 0 upon success otherwise the errno error. If the mbuf
1957   *               packet header does not have valid data bytes, the error
1958   *               code will be EINVAL
1959   */
1960  extern errno_t mbuf_get_tx_compl_data(mbuf_t m, uintptr_t *arg,
1961      uintptr_t *data);
1962  
1963  /*!
1964   *       @function mbuf_set_tx_compl_data
1965   *       @discussion Retrieves the packet completion status.
1966   *       @param m The mbuf representing the packet.
1967   *       @result 0 upon success otherwise the errno error. If the mbuf
1968   *               packet header does not have valid data bytes, the error
1969   *               code will be EINVAL
1970   */
1971  extern errno_t mbuf_set_tx_compl_data(mbuf_t m, uintptr_t arg,
1972      uintptr_t data);
1973  
1974  /*!
1975   *       @function mbuf_get_flowid
1976   *       @discussion Retrieve the flow ID of the packet .
1977   *       @param mbuf The mbuf representing the packet.
1978   *       @param flowid The flow ID of the packet.
1979   *       @result 0 upon success otherwise the errno error. If the mbuf
1980   *               packet header does not have valid data bytes, the error
1981   *               code will be EINVAL
1982   */
1983  extern errno_t mbuf_get_flowid(mbuf_t mbuf, u_int16_t *flowid);
1984  
1985  /*!
1986   *       @function mbuf_set_flowid
1987   *       @discussion Set the flow ID of the packet .
1988   *       @param mbuf The mbuf representing the packet.
1989   *       @param flowid The flow ID to be set.
1990   *       @result 0 upon success otherwise the errno error. If the mbuf
1991   *               packet header does not have valid data bytes, the error
1992   *               code will be EINVAL
1993   */
1994  extern errno_t mbuf_set_flowid(mbuf_t mbuf, u_int16_t flowid);
1995  
1996  /*!
1997   *       @function mbuf_get_keepalive_flag
1998   *       @discussion Tell if it's a keep alive packet.
1999   *       @param mbuf The mbuf representing the packet.
2000   *       @param is_keepalive A pointer that returns the truth value.
2001   *       @result 0 upon success otherwise the errno error. If the mbuf
2002   *               packet header does not have valid data bytes, the error
2003   *               code will be EINVAL
2004   */
2005  extern errno_t mbuf_get_keepalive_flag(mbuf_t mbuf, boolean_t *is_keepalive);
2006  
2007  /*!
2008   *       @function mbuf_set_keepalive_flag
2009   *       @discussion Set or clear the packet keep alive flag.
2010   *       @param mbuf The mbuf representing the packet.
2011   *       @param is_keepalive The boolean value.
2012   *       @result 0 upon success otherwise the errno error. If the mbuf
2013   *               packet header does not have valid data bytes, the error
2014   *               code will be EINVAL
2015   */
2016  extern errno_t mbuf_set_keepalive_flag(mbuf_t mbuf, boolean_t is_keepalive);
2017  
2018  #endif /* KERNEL_PRIVATE */
2019  
2020  /* IF_QUEUE interaction */
2021  
2022  #define IF_ENQUEUE_MBUF(ifq, m) {                                       \
2023  	mbuf_setnextpkt((m), 0);                                        \
2024  	if ((ifq)->ifq_tail == 0)                                       \
2025  	        (ifq)->ifq_head = (m);                                  \
2026  	else                                                            \
2027  	        mbuf_setnextpkt((mbuf_t)(ifq)->ifq_tail, (m));          \
2028  	(ifq)->ifq_tail = (m);                                          \
2029  	(ifq)->ifq_len++;                                               \
2030  }
2031  
2032  #define IF_PREPEND_MBUF(ifq, m) {                                       \
2033  	mbuf_setnextpkt((m), (ifq)->ifq_head);                          \
2034  	if ((ifq)->ifq_tail == 0)                                       \
2035  	        (ifq)->ifq_tail = (m);                                  \
2036  	(ifq)->ifq_head = (m);                                          \
2037  	(ifq)->ifq_len++;                                               \
2038  }
2039  
2040  #define IF_DEQUEUE_MBUF(ifq, m) {                                       \
2041  	(m) = (ifq)->ifq_head;                                          \
2042  	if (m) {                                                        \
2043  	        if (((ifq)->ifq_head = mbuf_nextpkt((m))) == 0)         \
2044  	                (ifq)->ifq_tail = 0;                            \
2045  	        mbuf_setnextpkt((m), 0);                                \
2046  	        (ifq)->ifq_len--;                                       \
2047  	}                                                               \
2048  }
2049  
2050  __END_DECLS
2051  #undef __NKE_API_DEPRECATED
2052  #endif /* __KPI_MBUF__ */