1 /* 2 * Copyright (c) 2008-2023 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 482 #endif /* BSD_KERNEL_PRIVATE */ 483 484 /*! 485 * @function mbuf_getcluster 486 * @discussion Allocate a cluster of the requested size and attach it to 487 * an mbuf for use as external data. If mbuf points to a NULL 488 * mbuf_t, an mbuf will be allocated for you. If mbuf points to 489 * a non-NULL mbuf_t, mbuf_getcluster may return a different 490 * mbuf_t than the one you passed in. 491 * @param how Blocking or non-blocking. 492 * @param type The type of the mbuf. 493 * @param size The size of the cluster to be allocated. Supported sizes 494 * for a cluster are be 2048, 4096, or 16384. Any other value 495 * with return EINVAL. Note that clusters greater than 4096 496 * bytes might not be available in all configurations; the 497 * caller must additionally check for ENOTSUP (see below). 498 * @param mbuf The mbuf the cluster will be attached to. 499 * @result 0 on success, errno error on failure. If you specified NULL 500 * for the mbuf, any intermediate mbuf that may have been allocated 501 * will be freed. If you specify an mbuf value in *mbuf, 502 * mbuf_mclget will not free it. 503 * EINVAL - Invalid parameter 504 * ENOMEM - Not enough memory available 505 * ENOTSUP - The caller had requested greater than 4096 bytes 506 * cluster and the system is unable to fulfill it due to the 507 * lack of jumbo clusters support based on the configuration. 508 * In this case, the caller is advised to use 4096 bytes or 509 * smaller during subsequent requests. 510 */ 511 extern errno_t mbuf_getcluster(mbuf_how_t how, mbuf_type_t type, size_t size, 512 mbuf_t *mbuf) 513 __NKE_API_DEPRECATED; 514 515 /*! 516 * @function mbuf_mclget 517 * @discussion Allocate a cluster and attach it to an mbuf for use as 518 * external data. If mbuf points to a NULL mbuf_t, an mbuf will be 519 * allocated for you. If mbuf points to a non-NULL mbuf_t, 520 * mbuf_mclget may return a different mbuf_t than the one you 521 * passed in. 522 * @param how Blocking or non-blocking. 523 * @param type The type of the mbuf. 524 * @param mbuf The mbuf the cluster will be attached to. 525 * @result 0 on success, errno error on failure. If you specified NULL 526 * for the mbuf, any intermediate mbuf that may have been allocated 527 * will be freed. If you specify an mbuf value in *mbuf, 528 * mbuf_mclget will not free it. 529 */ 530 extern errno_t mbuf_mclget(mbuf_how_t how, mbuf_type_t type, mbuf_t *mbuf) 531 __NKE_API_DEPRECATED; 532 533 /*! 534 * @function mbuf_allocpacket 535 * @discussion Allocate an mbuf chain to store a single packet of the 536 * requested length. According to the requested length, a chain 537 * of mbufs will be created. The mbuf type will be set to 538 * MBUF_TYPE_DATA. The caller may specify the maximum number of 539 * buffer. 540 * @param how Blocking or non-blocking 541 * @param packetlen The total length of the packet mbuf to be allocated. 542 * The length must be greater than zero. 543 * @param maxchunks An input/output pointer to the maximum number of mbufs 544 * segments making up the chain. On input, if maxchunks is NULL, 545 * or the value pointed to by maxchunks is zero, the packet will 546 * be made up of as few or as many buffer segments as necessary 547 * to fit the length. The allocation will fail with ENOBUFS if 548 * the number of segments requested is too small and the sum of 549 * the maximum size of each individual segment is less than the 550 * packet length. On output, if the allocation succeed and 551 * maxchunks is non-NULL, it will point to the actual number 552 * of segments allocated. 553 * Additional notes for packetlen greater than 4096 bytes: 554 * the caller may pass a non-NULL maxchunks and initialize it 555 * with zero such that upon success, it can find out whether 556 * or not the system configuration allows for larger than 557 * 4096 bytes cluster allocations, by checking on the value 558 * pointed to by maxchunks. E.g. a request for 9018 bytes may 559 * result in 1 chunk when jumbo clusters are available, or 560 * 3 chunks otherwise. 561 * @param mbuf Upon success, *mbuf will be a reference to the new mbuf. 562 * @result Returns 0 upon success or the following error code: 563 * EINVAL - Invalid parameter 564 * ENOMEM - Not enough memory available 565 * ENOBUFS - Buffers not big enough for the maximum number of 566 * chunks requested 567 */ 568 extern errno_t mbuf_allocpacket(mbuf_how_t how, size_t packetlen, 569 unsigned int * maxchunks, mbuf_t *mbuf) 570 __NKE_API_DEPRECATED; 571 572 /*! 573 * @function mbuf_allocpacket_list 574 * @discussion Allocate a linked list of packets. According to the 575 * requested length, each packet will made of a chain of one 576 * or more mbufs. The mbuf type will be set to MBUF_TYPE_DATA. 577 * The caller may specify the maximum number of element for 578 * each mbuf chain making up a packet. 579 * @param numpkts Number of packets to allocate 580 * @param how Blocking or non-blocking 581 * @param packetlen The total length of the packet mbuf to be allocated. 582 * The length must be greater than zero. 583 * @param maxchunks An input/output pointer to the maximum number of 584 * mbufs segments making up the chain. On input, if maxchunks is 585 * zero, or the value pointed to by maxchunks is zero, the packet 586 * will be made of as few or as many buffer segments as necessary 587 * to fit the length. The allocation will fail with ENOBUFS if 588 * the number of segments requested is too small and the sum of 589 * the maximum size of each individual segment is less than the 590 * packet length. On output, if the allocation succeed and 591 * maxchunks is non zero, it will point to the actual number 592 * of segments allocated. 593 * Additional notes for packetlen greater than 4096 bytes: 594 * the caller may pass a non-NULL maxchunks and initialize it 595 * with zero such that upon success, it can find out whether 596 * or not the system configuration allows for larger than 597 * 4096 bytes cluster allocations, by checking on the value 598 * pointed to by maxchunks. E.g. a request for 9018 bytes may 599 * result in 1 chunk when jumbo clusters are available, or 600 * 3 chunks otherwise. 601 * @param mbuf Upon success, *mbuf will be a reference to the new mbuf. 602 * @result Returns 0 upon success or the following error code: 603 * EINVAL - Invalid parameter 604 * ENOMEM - Not enough memory available 605 * ENOBUFS - Buffers not big enough for the maximum number of 606 * chunks requested 607 */ 608 extern errno_t mbuf_allocpacket_list(unsigned int numpkts, mbuf_how_t how, 609 size_t packetlen, unsigned int * maxchunks, mbuf_t *mbuf) 610 __NKE_API_DEPRECATED; 611 612 /*! 613 * @function mbuf_getpacket 614 * @discussion Allocate an mbuf, allocate and attach a cluster, and set 615 * the packet header flag. 616 * @param how Blocking or non-blocking. 617 * @param mbuf Upon success, *mbuf will be a reference to the new mbuf. 618 * @result 0 on success, errno error on failure. 619 */ 620 extern errno_t mbuf_getpacket(mbuf_how_t how, mbuf_t *mbuf) 621 __NKE_API_DEPRECATED; 622 623 /*! 624 * @function mbuf_free 625 * @discussion Frees a single mbuf. Not commonly used because it 626 * doesn't touch the rest of the mbufs on the chain. 627 * @param mbuf The mbuf to free. 628 * @result The next mbuf in the chain. 629 */ 630 extern mbuf_t mbuf_free(mbuf_t mbuf) 631 __NKE_API_DEPRECATED; 632 633 /*! 634 * @function mbuf_freem 635 * @discussion Frees a chain of mbufs link through mnext. 636 * @param mbuf The first mbuf in the chain to free. 637 */ 638 extern void mbuf_freem(mbuf_t mbuf) 639 __NKE_API_DEPRECATED; 640 641 /*! 642 * @function mbuf_freem_list 643 * @discussion Frees linked list of mbuf chains. Walks through 644 * mnextpackt and does the equivalent of mbuf_freem to each. 645 * @param mbuf The first mbuf in the linked list to free. 646 * @result The number of mbufs freed. 647 */ 648 extern int mbuf_freem_list(mbuf_t mbuf) 649 __NKE_API_DEPRECATED; 650 651 /*! 652 * @function mbuf_leadingspace 653 * @discussion Determines the space available in the mbuf proceeding 654 * the current data. 655 * @param mbuf The mbuf. 656 * @result The number of unused bytes at the start of the mbuf. 657 */ 658 extern size_t mbuf_leadingspace(const mbuf_t mbuf) 659 __NKE_API_DEPRECATED; 660 661 /*! 662 * @function mbuf_trailingspace 663 * @discussion Determines the space available in the mbuf following 664 * the current data. 665 * @param mbuf The mbuf. 666 * @result The number of unused bytes following the current data. 667 */ 668 extern size_t mbuf_trailingspace(const mbuf_t mbuf) 669 __NKE_API_DEPRECATED; 670 671 /* Manipulation */ 672 673 /*! 674 * @function mbuf_copym 675 * @discussion Copies len bytes from offset from src to a new mbuf. If 676 * the original mbuf contains a packet header, the new mbuf will 677 * contain similar packet header except for any tags which may be 678 * associated with the original mbuf. mbuf_dup() should be used 679 * instead if tags are to be copied to the new mbuf. 680 * @param src The source mbuf. 681 * @param offset The offset in the mbuf to start copying from. 682 * @param len The the number of bytes to copy. 683 * @param how To block or not to block, that is a question. 684 * @param new_mbuf Upon success, the newly allocated mbuf. 685 * @result 0 upon success otherwise the errno error. 686 */ 687 extern errno_t mbuf_copym(const mbuf_t src, size_t offset, size_t len, 688 mbuf_how_t how, mbuf_t *new_mbuf) 689 __NKE_API_DEPRECATED; 690 691 /*! 692 * @function mbuf_dup 693 * @discussion Exactly duplicates an mbuf chain. If the original mbuf 694 * contains a packet header (including tags), the new mbuf will have 695 * the same packet header contents and a copy of each tag associated 696 * with the original mbuf. 697 * @param src The source mbuf. 698 * @param how Blocking or non-blocking. 699 * @param new_mbuf Upon success, the newly allocated mbuf. 700 * @result 0 upon success otherwise the errno error. 701 */ 702 extern errno_t mbuf_dup(const mbuf_t src, mbuf_how_t how, mbuf_t *new_mbuf) 703 __NKE_API_DEPRECATED; 704 705 /*! 706 * @function mbuf_prepend 707 * @discussion Prepend len bytes to an mbuf. If there is space 708 * (mbuf_leadingspace >= len), the mbuf's data ptr is changed and 709 * the same mbuf is returned. If there is no space, a new mbuf may 710 * be allocated and prepended to the mbuf chain. If the operation 711 * fails, the mbuf may be freed (*mbuf will be NULL). 712 * @param mbuf The mbuf to prepend data to. This may change if a new 713 * mbuf must be allocated or may be NULL if the operation fails. 714 * @param len The length, in bytes, to be prepended to the mbuf. 715 * @param how Blocking or non-blocking. 716 * @result 0 upon success otherwise the errno error. 717 */ 718 extern errno_t mbuf_prepend(mbuf_t *mbuf, size_t len, mbuf_how_t how) 719 __NKE_API_DEPRECATED; 720 721 /*! 722 * @function mbuf_split 723 * @discussion Split an mbuf chain at a specific offset. 724 * @param src The mbuf to be split. 725 * @param offset The offset in the buffer where the mbuf should be 726 * split. 727 * @param how Blocking or non-blocking. 728 * @param new_mbuf Upon success, the second half of the split mbuf 729 * chain. 730 * @result 0 upon success otherwise the errno error. In the case of 731 * failure, the original mbuf chain passed in to src will be 732 * preserved. 733 */ 734 extern errno_t mbuf_split(mbuf_t src, size_t offset, mbuf_how_t how, 735 mbuf_t *new_mbuf) 736 __NKE_API_DEPRECATED; 737 738 /*! 739 * @function mbuf_pullup 740 * @discussion Move the next len bytes in to mbuf from other mbufs in 741 * the chain. This is commonly used to get the IP and TCP or UDP 742 * header contiguous in the first mbuf. If mbuf_pullup fails, the 743 * entire mbuf chain will be freed. 744 * @param mbuf The mbuf in the chain the data should be contiguous in. 745 * @param len The number of bytes to pull from the next mbuf(s). 746 * @result 0 upon success otherwise the errno error. In the case of an 747 * error, the mbuf chain has been freed. 748 */ 749 extern errno_t mbuf_pullup(mbuf_t *mbuf, size_t len) 750 __NKE_API_DEPRECATED; 751 752 /*! 753 * @function mbuf_pulldown 754 * @discussion Make length bytes at offset in the mbuf chain 755 * contiguous. Nothing before offset bytes in the chain will be 756 * modified. Upon return, location will be the mbuf the data is 757 * contiguous in and offset will be the offset in that mbuf at 758 * which the data is located. In the case of a failure, the mbuf 759 * chain will be freed. 760 * @param src The start of the mbuf chain. 761 * @param offset Pass in a pointer to a value with the offset of the 762 * data you're interested in making contiguous. Upon success, this 763 * will be overwritten with the offset from the mbuf returned in 764 * location. 765 * @param length The length of data that should be made contiguous. 766 * @param location Upon success, *location will be the mbuf the data is 767 * in. 768 * @result 0 upon success otherwise the errno error. 769 */ 770 extern errno_t mbuf_pulldown(mbuf_t src, size_t *offset, size_t length, 771 mbuf_t *location) 772 __NKE_API_DEPRECATED; 773 774 /*! 775 * @function mbuf_adj 776 * @discussion Trims len bytes from the mbuf. If the length is greater 777 * than zero, the bytes are trimmed from the front of the mbuf. If 778 * the length is less than zero, the bytes are trimmed from the end 779 * of the mbuf chain. 780 * @param mbuf The mbuf chain to trim. 781 * @param len The number of bytes to trim from the mbuf chain. 782 */ 783 extern void mbuf_adj(mbuf_t mbuf, int len) 784 __NKE_API_DEPRECATED; 785 786 /*! 787 * @function mbuf_adjustlen 788 * @discussion Adds amount to the mbuf len. Verifies that the new 789 * length is valid (greater than or equal to zero and less than 790 * maximum amount of data that may be stored in the mbuf). This 791 * function will not adjust the packet header length field or 792 * affect any other mbufs in a chain. 793 * @param mbuf The mbuf to adjust. 794 * @param amount The number of bytes increment the length by. 795 * @result 0 upon success otherwise the errno error. 796 */ 797 extern errno_t mbuf_adjustlen(mbuf_t mbuf, int amount) 798 __NKE_API_DEPRECATED; 799 800 /*! 801 * @function mbuf_concatenate 802 * @discussion Concatenate mbuf chain src to dst using m_next and return 803 * a chain which represents the concatenated chain. The routine 804 * does not prevent two chains of different mbuf types to be 805 * concatenated, nor does it modify any packet header in the 806 * destination chain. Therefore, it's the responsibility of the 807 * caller to ensure that the resulted concatenated mbuf chain is 808 * correct for further usages. 809 * @param dst The destination mbuf chain. 810 * @param src The source mbuf chain. 811 * @result A pointer to the head of the concatenated mbuf chain. This 812 * should be treated as the updated destination mbuf chain; the 813 * caller must no longer refer to the original src or dst mbuf 814 * chain. Otherwise it returns NULL if the original dst mbuf 815 * chain is NULL. 816 */ 817 extern mbuf_t mbuf_concatenate(mbuf_t dst, mbuf_t src) 818 __NKE_API_DEPRECATED; 819 820 /*! 821 * @function mbuf_copydata 822 * @discussion Copies data out of an mbuf in to a specified buffer. If 823 * the data is stored in a chain of mbufs, the data will be copied 824 * from each mbuf in the chain until length bytes have been copied. 825 * @param mbuf The mbuf chain to copy data out of. 826 * @param offset The offset in to the mbuf to start copying. 827 * @param length The number of bytes to copy. 828 * @param out_data A pointer to the location where the data will be 829 * copied. 830 * @result 0 upon success otherwise the errno error. 831 */ 832 extern errno_t mbuf_copydata(const mbuf_t mbuf, size_t offset, size_t length, 833 void *out_data) 834 __NKE_API_DEPRECATED; 835 836 /*! 837 * @function mbuf_copyback 838 * @discussion Copies data from a buffer to an mbuf chain. 839 * mbuf_copyback will grow the chain to fit the specified buffer. 840 * 841 * If mbuf_copydata is unable to allocate enough mbufs to grow the 842 * chain, ENOBUFS will be returned. The mbuf chain will be shorter 843 * than expected but all of the data up to the end of the mbuf 844 * chain will be valid. 845 * 846 * If an offset is specified, mbuf_copyback will skip that many 847 * bytes in the mbuf chain before starting to write the buffer in 848 * to the chain. If the mbuf chain does not contain this many 849 * bytes, mbufs will be allocated to create the space. 850 * @param mbuf The first mbuf in the chain to copy the data in to. 851 * @param offset Offset in bytes to skip before copying data. 852 * @param length The length, in bytes, of the data to copy in to the mbuf 853 * chain. 854 * @param data A pointer to data in the kernel's address space. 855 * @param how Blocking or non-blocking. 856 * @result 0 upon success, EINVAL or ENOBUFS upon failure. 857 */ 858 extern errno_t mbuf_copyback(mbuf_t mbuf, size_t offset, size_t length, 859 const void *data, mbuf_how_t how) 860 __NKE_API_DEPRECATED; 861 862 /*! 863 * @function mbuf_mclhasreference 864 * @discussion Check if a cluster of an mbuf is referenced by another mbuf. 865 * References may be taken, for example, as a result of a call to 866 * mbuf_split or mbuf_copym 867 * @param mbuf The mbuf with the cluster to test. 868 * @result 0 if there is no reference by another mbuf, 1 otherwise. 869 */ 870 extern int mbuf_mclhasreference(mbuf_t mbuf) 871 __NKE_API_DEPRECATED; 872 873 874 /* mbuf header */ 875 876 /*! 877 * @function mbuf_next 878 * @discussion Returns the next mbuf in the chain. 879 * @param mbuf The mbuf. 880 * @result The next mbuf in the chain. 881 */ 882 extern mbuf_t mbuf_next(const mbuf_t mbuf) 883 __NKE_API_DEPRECATED; 884 885 /*! 886 * @function mbuf_setnext 887 * @discussion Sets the next mbuf in the chain. 888 * @param mbuf The mbuf. 889 * @param next The new next mbuf. 890 * @result 0 upon success otherwise the errno error. 891 */ 892 extern errno_t mbuf_setnext(mbuf_t mbuf, mbuf_t next) 893 __NKE_API_DEPRECATED; 894 895 /*! 896 * @function mbuf_nextpkt 897 * @discussion Gets the next packet from the mbuf. 898 * @param mbuf The mbuf. 899 * @result The nextpkt. 900 */ 901 extern mbuf_t mbuf_nextpkt(const mbuf_t mbuf) 902 __NKE_API_DEPRECATED; 903 904 /*! 905 * @function mbuf_setnextpkt 906 * @discussion Sets the next packet attached to this mbuf. 907 * @param mbuf The mbuf. 908 * @param nextpkt The new next packet. 909 */ 910 extern void mbuf_setnextpkt(mbuf_t mbuf, mbuf_t nextpkt) 911 __NKE_API_DEPRECATED; 912 913 /*! 914 * @function mbuf_len 915 * @discussion Gets the length of data in this mbuf. 916 * @param mbuf The mbuf. 917 * @result The length. 918 */ 919 extern size_t mbuf_len(const mbuf_t mbuf) 920 __NKE_API_DEPRECATED; 921 922 /*! 923 * @function mbuf_setlen 924 * @discussion Sets the length of data in this packet. Be careful to 925 * not set the length over the space available in the mbuf. 926 * @param mbuf The mbuf. 927 * @param len The new length. 928 */ 929 extern void mbuf_setlen(mbuf_t mbuf, size_t len) 930 __NKE_API_DEPRECATED; 931 932 /*! 933 * @function mbuf_maxlen 934 * @discussion Retrieves the maximum length of data that may be stored 935 * in this mbuf. This value assumes that the data pointer was set 936 * to the start of the possible range for that pointer 937 * (mbuf_data_start). 938 * @param mbuf The mbuf. 939 * @result The maximum lenght of data for this mbuf. 940 */ 941 extern size_t mbuf_maxlen(const mbuf_t mbuf) 942 __NKE_API_DEPRECATED; 943 944 /*! 945 * @function mbuf_type 946 * @discussion Gets the type of mbuf. 947 * @param mbuf The mbuf. 948 * @result The type. 949 */ 950 extern mbuf_type_t mbuf_type(const mbuf_t mbuf) 951 __NKE_API_DEPRECATED; 952 953 /*! 954 * @function mbuf_settype 955 * @discussion Sets the type of mbuf. 956 * @param mbuf The mbuf. 957 * @param new_type The new type. 958 * @result 0 upon success otherwise the errno error. 959 */ 960 extern errno_t mbuf_settype(mbuf_t mbuf, mbuf_type_t new_type) 961 __NKE_API_DEPRECATED; 962 963 /*! 964 * @function mbuf_flags 965 * @discussion Returns the set flags. 966 * @param mbuf The mbuf. 967 * @result The flags. 968 */ 969 extern mbuf_flags_t mbuf_flags(const mbuf_t mbuf) 970 __NKE_API_DEPRECATED; 971 972 /*! 973 * @function mbuf_setflags 974 * @discussion Sets the set of set flags. 975 * @param mbuf The mbuf. 976 * @param flags The flags that should be set, all other flags will be 977 * cleared. Certain flags such as MBUF_EXT cannot be altered. 978 * @result 0 upon success otherwise the errno error. 979 */ 980 extern errno_t mbuf_setflags(mbuf_t mbuf, mbuf_flags_t flags) 981 __NKE_API_DEPRECATED; 982 983 /*! 984 * @function mbuf_setflags_mask 985 * @discussion Useful for setting or clearing individual flags. Easier 986 * than calling mbuf_setflags(m, mbuf_flags(m) | M_FLAG). 987 * @param mbuf The mbuf. 988 * @param flags The flags that should be set or cleared. Certain flags 989 * such as MBUF_EXT cannot be altered. 990 * @param mask The mask controlling which flags will be modified. 991 * @result 0 upon success otherwise the errno error. 992 */ 993 extern errno_t mbuf_setflags_mask(mbuf_t mbuf, mbuf_flags_t flags, 994 mbuf_flags_t mask) 995 __NKE_API_DEPRECATED; 996 997 /*! 998 * @function mbuf_copy_pkthdr 999 * @discussion Copies the packet header from src to dest. 1000 * @param src The mbuf from which the packet header will be copied. 1001 * @param dest The mbuf to which the packet header will be copied. 1002 * @result 0 upon success otherwise the errno error. 1003 */ 1004 extern errno_t mbuf_copy_pkthdr(mbuf_t dest, const mbuf_t src) 1005 __NKE_API_DEPRECATED; 1006 1007 /*! 1008 * @function mbuf_pkthdr_len 1009 * @discussion Returns the length as reported by the packet header. 1010 * @param mbuf The mbuf containing the packet header 1011 * @result The length, in bytes, of the packet. 1012 */ 1013 extern size_t mbuf_pkthdr_len(const mbuf_t mbuf) 1014 __NKE_API_DEPRECATED; 1015 1016 /*! 1017 * @function mbuf_pkthdr_setlen 1018 * @discussion Sets the length of the packet in the packet header. 1019 * @param mbuf The mbuf containing the packet header. 1020 * @param len The new length of the packet. 1021 */ 1022 extern void mbuf_pkthdr_setlen(mbuf_t mbuf, size_t len) 1023 __NKE_API_DEPRECATED; 1024 1025 #ifdef XNU_KERNEL_PRIVATE 1026 /*! 1027 * @function mbuf_pkthdr_maxlen 1028 * @discussion Retrieves the maximum length of data that may be stored 1029 * in this mbuf packet. This value assumes that the data pointer 1030 * was set to the start of the possible range for that pointer 1031 * for each mbuf in the packet chain 1032 * @param mbuf The mbuf. 1033 * @result The maximum lenght of data for this mbuf. 1034 */ 1035 extern size_t mbuf_pkthdr_maxlen(const mbuf_t mbuf); 1036 #endif /* XNU_KERNEL_PRIVATE */ 1037 1038 /*! 1039 * @function mbuf_pkthdr_adjustlen 1040 * @discussion Adjusts the length of the packet in the packet header. 1041 * @param mbuf The mbuf containing the packet header. 1042 * @param amount The number of bytes to adjust the packet header length 1043 * field by. 1044 */ 1045 extern void mbuf_pkthdr_adjustlen(mbuf_t mbuf, int amount) 1046 __NKE_API_DEPRECATED; 1047 1048 /*! 1049 * @function mbuf_pkthdr_rcvif 1050 * @discussion Returns the interface the packet was received on. This 1051 * funciton does not modify the reference count of the interface. 1052 * The interface is only valid for as long as the mbuf is not freed 1053 * and the rcvif for the mbuf is not changed. Take a reference on 1054 * the interface that you will release later before doing any of 1055 * the following: free the mbuf, change the rcvif, pass the mbuf to 1056 * any function that may free the mbuf or change the rcvif. 1057 * @param mbuf The mbuf containing the packet header. 1058 * @result A reference to the interface. 1059 */ 1060 extern ifnet_t mbuf_pkthdr_rcvif(const mbuf_t mbuf) 1061 __NKE_API_DEPRECATED; 1062 1063 /*! 1064 * @function mbuf_pkthdr_setrcvif 1065 * @discussion Sets the interface the packet was received on. 1066 * @param mbuf The mbuf containing the packet header. 1067 * @param ifp A reference to an interface. 1068 * @result 0 upon success otherwise the errno error. 1069 */ 1070 extern errno_t mbuf_pkthdr_setrcvif(mbuf_t mbuf, ifnet_t ifp) 1071 __NKE_API_DEPRECATED; 1072 1073 /*! 1074 * @function mbuf_pkthdr_header 1075 * @discussion Returns a pointer to the packet header. 1076 * @param mbuf The mbuf containing the packet header. 1077 * @result A pointer to the packet header. 1078 */ 1079 extern void *mbuf_pkthdr_header(const mbuf_t mbuf) 1080 __NKE_API_DEPRECATED; 1081 1082 /*! 1083 * @function mbuf_pkthdr_setheader 1084 * @discussion Sets the pointer to the packet header. 1085 * @param mbuf The mbuf containing the packet header. 1086 * @param header A pointer to the header. 1087 */ 1088 extern void mbuf_pkthdr_setheader(mbuf_t mbuf, void *header) 1089 __NKE_API_DEPRECATED; 1090 1091 /* Checksums */ 1092 1093 /*! 1094 * @function mbuf_inbound_modified 1095 * @discussion This function will clear the checksum flags to indicate 1096 * that a hardware checksum should not be used. Any filter 1097 * modifying data should call this function on an mbuf before 1098 * passing the packet up the stack. If a filter modifies a packet 1099 * in a way that affects any checksum, the filter is responsible 1100 * for either modifying the checksum to compensate for the changes 1101 * or verifying the checksum before making the changes and then 1102 * modifying the data and calculating a new checksum only if the 1103 * original checksum was valid. 1104 * @param mbuf The mbuf that has been modified. 1105 */ 1106 extern void mbuf_inbound_modified(mbuf_t mbuf) 1107 __NKE_API_DEPRECATED; 1108 1109 /*! 1110 * @function mbuf_outbound_finalize 1111 * @discussion This function will "finalize" the packet allowing your 1112 * code to inspect the final packet. 1113 * 1114 * There are a number of operations that are performed in hardware, 1115 * such as calculating checksums. This function will perform in 1116 * software the various opterations that were scheduled to be done 1117 * in hardware. Future operations may include IPsec processing or 1118 * vlan support. If you are redirecting a packet to a new interface 1119 * which may not have the same hardware support or encapsulating 1120 * the packet, you should call this function to force the stack to 1121 * calculate and fill out the checksums. This will bypass hardware 1122 * checksums but give you a complete packet to work with. If you 1123 * need to inspect aspects of the packet which may be generated by 1124 * hardware, you must call this function to get an aproximate final 1125 * packet. If you plan to modify the packet in any way, you should 1126 * call this function. 1127 * 1128 * This function should be called before modifying any outbound 1129 * packets. 1130 * 1131 * This function may be called at various levels, in some cases 1132 * additional headers may have already been prepended, such as the 1133 * case of a packet seen by an interface filter. To handle this, 1134 * the caller must pass the protocol family of the packet as well 1135 * as the offset from the start of the packet to the protocol 1136 * header. 1137 * @param mbuf The mbuf that should be finalized. 1138 * @param protocol_family The protocol family of the packet in the 1139 * mbuf. 1140 * @param protocol_offset The offset from the start of the mbuf to the 1141 * protocol header. For an IP packet with an ethernet header, this 1142 * would be the length of an ethernet header. 1143 */ 1144 extern void mbuf_outbound_finalize(mbuf_t mbuf, u_int32_t protocol_family, 1145 size_t protocol_offset) 1146 __NKE_API_DEPRECATED; 1147 1148 /*! 1149 * @function mbuf_set_vlan_tag 1150 * @discussion This function is used by interfaces that support vlan 1151 * tagging in hardware. This function will set properties in the 1152 * mbuf to indicate which vlan the packet was received for. 1153 * @param mbuf The mbuf containing the packet. 1154 * @param vlan The protocol family of the aux data to add. 1155 * @result 0 upon success otherwise the errno error. 1156 */ 1157 extern errno_t mbuf_set_vlan_tag(mbuf_t mbuf, u_int16_t vlan) 1158 __NKE_API_DEPRECATED; 1159 1160 /*! 1161 * @function mbuf_get_vlan_tag 1162 * @discussion This function is used by drivers that support hardware 1163 * vlan tagging to determine which vlan this packet belongs to. To 1164 * differentiate between the case where the vlan tag is zero and 1165 * the case where there is no vlan tag, this function will return 1166 * ENXIO when there is no vlan. 1167 * @param mbuf The mbuf containing the packet. 1168 * @param vlan The protocol family of the aux data to add. 1169 * @result 0 upon success otherwise the errno error. ENXIO indicates 1170 * that the vlan tag is not set. 1171 */ 1172 extern errno_t mbuf_get_vlan_tag(mbuf_t mbuf, u_int16_t *vlan) 1173 __NKE_API_DEPRECATED; 1174 1175 /*! 1176 * @function mbuf_clear_vlan_tag 1177 * @discussion This function will clear any vlan tag associated with 1178 * the mbuf. 1179 * @param mbuf The mbuf containing the packet. 1180 * @result 0 upon success otherwise the errno error. 1181 */ 1182 extern errno_t mbuf_clear_vlan_tag(mbuf_t mbuf) 1183 __NKE_API_DEPRECATED; 1184 1185 #ifdef KERNEL_PRIVATE 1186 /*! 1187 * @function mbuf_set_csum_requested 1188 * @discussion This function is used by the stack to indicate which 1189 * checksums should be calculated in hardware. The stack normally 1190 * sets these flags as the packet is processed in the outbound 1191 * direction. Just before send the packe to the interface, the 1192 * stack will look at these flags and perform any checksums in 1193 * software that are not supported by the interface. 1194 * @param mbuf The mbuf containing the packet. 1195 * @param request Flags indicating which checksums are being requested 1196 * for this packet. 1197 * @param value This parameter is currently unsupported. 1198 * @result 0 upon success otherwise the errno error. 1199 */ 1200 extern errno_t mbuf_set_csum_requested(mbuf_t mbuf, 1201 mbuf_csum_request_flags_t request, u_int32_t value); 1202 #endif /* KERNEL_PRIVATE */ 1203 1204 /*! 1205 * @function mbuf_get_csum_requested 1206 * @discussion This function is used by the driver to determine which 1207 * checksum operations should be performed in hardware. 1208 * @param mbuf The mbuf containing the packet. 1209 * @param request Flags indicating which checksums are being requested 1210 * for this packet. 1211 * @param value This parameter is currently unsupported. 1212 * @result 0 upon success otherwise the errno error. 1213 */ 1214 extern errno_t mbuf_get_csum_requested(mbuf_t mbuf, 1215 mbuf_csum_request_flags_t *request, u_int32_t *value) 1216 __NKE_API_DEPRECATED; 1217 1218 /*! 1219 * @function mbuf_get_tso_requested 1220 * @discussion This function is used by the driver to determine which 1221 * checksum operations should be performed in hardware. 1222 * @param mbuf The mbuf containing the packet. 1223 * @param request Flags indicating which values are being requested 1224 * for this packet. 1225 * @param value The requested value. 1226 * @result 0 upon success otherwise the errno error. 1227 */ 1228 extern errno_t mbuf_get_tso_requested(mbuf_t mbuf, 1229 mbuf_tso_request_flags_t *request, u_int32_t *value) 1230 __NKE_API_DEPRECATED; 1231 1232 /*! 1233 * @function mbuf_clear_csum_requested 1234 * @discussion This function clears the checksum request flags. 1235 * @param mbuf The mbuf containing the packet. 1236 * @result 0 upon success otherwise the errno error. 1237 */ 1238 extern errno_t mbuf_clear_csum_requested(mbuf_t mbuf) 1239 __NKE_API_DEPRECATED; 1240 1241 /*! 1242 * @function mbuf_set_csum_performed 1243 * @discussion This is used by the driver to indicate to the stack which 1244 * checksum operations were performed in hardware. 1245 * @param mbuf The mbuf containing the packet. 1246 * @param flags Flags indicating which hardware checksum operations 1247 * were performed. 1248 * @param value If the MBUF_CSUM_DID_DATA flag is set, value should be 1249 * set to the value of the TCP or UDP header as calculated by the 1250 * hardware. 1251 * @result 0 upon success otherwise the errno error. 1252 */ 1253 extern errno_t mbuf_set_csum_performed(mbuf_t mbuf, 1254 mbuf_csum_performed_flags_t flags, u_int32_t value) 1255 __NKE_API_DEPRECATED; 1256 1257 #ifdef KERNEL_PRIVATE 1258 /* 1259 * @function mbuf_get_csum_performed 1260 * @discussion This is used by the stack to determine which checksums 1261 * were calculated in hardware on the inbound path. 1262 * @param mbuf The mbuf containing the packet. 1263 * @param flags Flags indicating which hardware checksum operations 1264 * were performed. 1265 * @param value If the MBUF_CSUM_DID_DATA flag is set, value will be 1266 * set to the value of the TCP or UDP header as calculated by the 1267 * hardware. 1268 * @result 0 upon success otherwise the errno error. 1269 */ 1270 extern errno_t mbuf_get_csum_performed(mbuf_t mbuf, 1271 mbuf_csum_performed_flags_t *flags, u_int32_t *value); 1272 #endif /* KERNEL_PRIVATE */ 1273 1274 /*! 1275 * @function mbuf_get_mlen 1276 * @discussion This routine returns the number of data bytes in a normal 1277 * mbuf, i.e. an mbuf that is not a packet header, nor one with 1278 * an external cluster attached to it. This is equivalent to the 1279 * legacy MLEN macro. 1280 * @result The number of bytes of available data. 1281 */ 1282 extern u_int32_t mbuf_get_mlen(void) 1283 __NKE_API_DEPRECATED; 1284 1285 /*! 1286 * @function mbuf_get_mhlen 1287 * @discussion This routine returns the number of data bytes in a packet 1288 * header mbuf. This is equivalent to the legacy MHLEN macro. 1289 * @result The number of bytes of available data. 1290 */ 1291 extern u_int32_t mbuf_get_mhlen(void) 1292 __NKE_API_DEPRECATED; 1293 1294 /*! 1295 * @function mbuf_get_minclsize 1296 * @discussion This routine returns the minimum number of data bytes 1297 * before an external cluster is used. This is equivalent to the 1298 * legacy MINCLSIZE macro. 1299 * @result The minimum number of bytes before a cluster will be used. 1300 */ 1301 extern u_int32_t mbuf_get_minclsize(void) 1302 __NKE_API_DEPRECATED; 1303 1304 #ifdef XNU_KERNEL_PRIVATE 1305 /* 1306 * @function mbuf_get_minclsize 1307 * @discussion Kernel internal function that returns the size of an mbuf 1308 * @result The size of an mbuf 1309 */ 1310 extern u_int32_t mbuf_get_msize(void); 1311 #endif /* XNU_KERNEL_PRIVATE */ 1312 1313 /*! 1314 * @function mbuf_clear_csum_performed 1315 * @discussion Clears the hardware checksum flags and values. 1316 * @param mbuf The mbuf containing the packet. 1317 * @result 0 upon success otherwise the errno error. 1318 */ 1319 extern errno_t mbuf_clear_csum_performed(mbuf_t mbuf) 1320 __NKE_API_DEPRECATED; 1321 1322 /*! 1323 * @function mbuf_inet_cksum 1324 * @discussion Calculates 16-bit 1's complement Internet checksum of the 1325 * transport segment with or without the pseudo header checksum 1326 * of a given IPv4 packet. If the caller specifies a non-zero 1327 * transport protocol, the checksum returned will also include 1328 * the pseudo header checksum for the corresponding transport 1329 * header. Otherwise, no header parsing will be done and the 1330 * caller may use this to calculate the Internet checksum of 1331 * an arbitrary span of data. 1332 * 1333 * This routine does not modify the contents of the packet. If 1334 * the caller specifies a non-zero protocol and/or offset, the 1335 * routine expects the complete protocol header to be present 1336 * at the beginning of the first mbuf. 1337 * @param mbuf The mbuf (or chain of mbufs) containing the packet. 1338 * @param protocol A zero or non-zero value. A non-zero value specifies 1339 * the transport protocol used for pseudo header checksum. 1340 * @param offset A zero or non-zero value; if the latter, it specifies 1341 * the offset of the transport header from the beginning of mbuf. 1342 * @param length The total (non-zero) length of the transport segment. 1343 * @param csum Pointer to the checksum variable; upon success, this 1344 * routine will return the calculated Internet checksum through 1345 * this variable. The caller must set it to a non-NULL value. 1346 * @result 0 upon success otherwise the errno error. 1347 */ 1348 extern errno_t mbuf_inet_cksum(mbuf_t mbuf, int protocol, u_int32_t offset, 1349 u_int32_t length, u_int16_t *csum) 1350 __NKE_API_DEPRECATED; 1351 1352 /*! 1353 * @function mbuf_inet6_cksum 1354 * @discussion Calculates 16-bit 1's complement Internet checksum of the 1355 * transport segment with or without the pseudo header checksum 1356 * of a given IPv6 packet. If the caller specifies a non-zero 1357 * transport protocol, the checksum returned will also include 1358 * the pseudo header checksum for the corresponding transport 1359 * header. Otherwise, no header parsing will be done and the 1360 * caller may use this to calculate the Internet checksum of 1361 * an arbitrary span of data. 1362 * 1363 * This routine does not modify the contents of the packet. If 1364 * the caller specifies a non-zero protocol and/or offset, the 1365 * routine expects the complete protocol header(s) to be present 1366 * at the beginning of the first mbuf. 1367 * @param mbuf The mbuf (or chain of mbufs) containing the packet. 1368 * @param protocol A zero or non-zero value. A non-zero value specifies 1369 * the transport protocol used for pseudo header checksum. 1370 * @param offset A zero or non-zero value; if the latter, it specifies 1371 * the offset of the transport header from the beginning of mbuf. 1372 * @param length The total (non-zero) length of the transport segment. 1373 * @param csum Pointer to the checksum variable; upon success, this 1374 * routine will return the calculated Internet checksum through 1375 * this variable. The caller must set it to a non-NULL value. 1376 * @result 0 upon success otherwise the errno error. 1377 */ 1378 extern errno_t mbuf_inet6_cksum(mbuf_t mbuf, int protocol, u_int32_t offset, 1379 u_int32_t length, u_int16_t *csum) 1380 __NKE_API_DEPRECATED; 1381 1382 /* mbuf tags */ 1383 1384 /*! 1385 * @function mbuf_tag_id_find 1386 * @discussion Lookup the module id for a string. If there is no module 1387 * id assigned to this string, a new module id will be assigned. 1388 * The string should be the bundle id of the kext. In the case of a 1389 * tag that will be shared across multiple kexts, a common bundle 1390 * id style string should be used. 1391 * 1392 * The lookup operation is not optimized. A module should call this 1393 * function once during startup and chache the module id. The 1394 * module id will not be resassigned until the machine reboots. 1395 * @param module_string A unique string identifying your module. 1396 * Example: com.apple.nke.SharedIP. 1397 * @param module_id Upon return, a unique identifier for use with 1398 * mbuf_tag_* functions. This identifier is valid until the machine 1399 * is rebooted. 1400 * @result 0 upon success otherwise the errno error. 1401 */ 1402 extern errno_t mbuf_tag_id_find(const char *module_string, 1403 mbuf_tag_id_t *module_id) 1404 __NKE_API_DEPRECATED; 1405 1406 /*! 1407 * @function mbuf_tag_allocate 1408 * @discussion Allocate an mbuf tag. Mbuf tags allow various portions 1409 * of the stack to tag mbufs with data that will travel with the 1410 * mbuf through the stack. 1411 * 1412 * Tags may only be added to mbufs with packet headers 1413 * (MBUF_PKTHDR flag is set). Mbuf tags are freed when the mbuf is 1414 * freed or when mbuf_tag_free is called. 1415 * @param mbuf The mbuf to attach this tag to. 1416 * @param module_id A module identifier returned by mbuf_tag_id_find. 1417 * @param type A 16 bit type value. For a given module_id, you can use 1418 * a number of different tag types. 1419 * @param length The length, in bytes, to allocate for storage that 1420 * will be associated with this tag on this mbuf. 1421 * @param how Indicate whether you want to block and wait for memory if 1422 * memory is not immediately available. 1423 * @param data_p Upon successful return, *data_p will point to the 1424 * buffer allocated for the mtag. 1425 * @result 0 upon success otherwise the errno error. 1426 */ 1427 extern errno_t mbuf_tag_allocate(mbuf_t mbuf, mbuf_tag_id_t module_id, 1428 mbuf_tag_type_t type, size_t length, mbuf_how_t how, void **data_p) 1429 __NKE_API_DEPRECATED; 1430 1431 /*! 1432 * @function mbuf_tag_find 1433 * @discussion Find the data associated with an mbuf tag. 1434 * @param mbuf The mbuf the tag is attached to. 1435 * @param module_id A module identifier returned by mbuf_tag_id_find. 1436 * @param type The 16 bit type of the tag to find. 1437 * @param length Upon success, the length of data will be store in 1438 * length. 1439 * @param data_p Upon successful return, *data_p will point to the 1440 * buffer allocated for the mtag. 1441 * @result 0 upon success otherwise the errno error. 1442 */ 1443 extern errno_t mbuf_tag_find(mbuf_t mbuf, mbuf_tag_id_t module_id, 1444 mbuf_tag_type_t type, size_t *length, void **data_p) 1445 __NKE_API_DEPRECATED; 1446 1447 /*! 1448 * @function mbuf_tag_free 1449 * @discussion Frees a previously allocated mbuf tag. 1450 * @param mbuf The mbuf the tag was allocated on. 1451 * @param module_id The ID of the tag to free. 1452 * @param type The type of the tag to free. 1453 */ 1454 extern void mbuf_tag_free(mbuf_t mbuf, mbuf_tag_id_t module_id, 1455 mbuf_tag_type_t type) 1456 __NKE_API_DEPRECATED; 1457 1458 #ifdef KERNEL_PRIVATE 1459 /*! 1460 * @function mbuf_add_drvaux 1461 * @discussion Allocate space for driver auxiliary data and attach it 1462 * to the packet (MBUF_PKTHDR is required.) This space is freed 1463 * when the mbuf is freed or when mbuf_del_drvaux is called. 1464 * Only one instance of driver auxiliary data may be attached to 1465 * a packet. Any attempt to add it to a packet already associated 1466 * with one will yield an error, and the existing one must first 1467 * be removed via mbuf_del_drvaux. The format and length of the 1468 * data depend largely on the family and sub-family. The system 1469 * makes no attempt to define and/or interpret the contents of 1470 * the data, and simply acts as a conduit between its producer 1471 * and consumer. 1472 * @param mbuf The mbuf to attach the auxiliary data to. 1473 * @param how Indicate whether you are willing to block and wait for 1474 * memory, if memory is not immediately available. 1475 * @param family The interface family as defined in net/kpi_interface.h. 1476 * @param subfamily The interface sub-family as defined in 1477 * net/kpi_interface.h. 1478 * @param length The length of the auxiliary data, must be greater than 0. 1479 * @param data_p Upon successful return, *data_p will point to the 1480 * space allocated for the data. Caller may set this to NULL. 1481 * @result 0 upon success otherwise the errno error. 1482 */ 1483 extern errno_t mbuf_add_drvaux(mbuf_t mbuf, mbuf_how_t how, 1484 u_int32_t family, u_int32_t subfamily, size_t length, void **data_p); 1485 1486 /*! 1487 * @function mbuf_find_drvaux 1488 * @discussion Find the driver auxiliary data associated with a packet. 1489 * @param mbuf The mbuf the auxiliary data is attached to. 1490 * @param family_p Upon successful return, *family_p will contain 1491 * the interface family associated with the data, as defined 1492 * in net/kpi_interface.h. Caller may set this to NULL. 1493 * @param subfamily_p Upon successful return, *subfamily_p will contain 1494 * the interface family associated with the data, as defined 1495 * in net/kpi_interface.h. Caller may set this to NULL. 1496 * @param length_p Upon successful return, *length_p will contain 1497 * the length of the driver auxiliary data. Caller may 1498 * set this to NULL. 1499 * @param data_p Upon successful return, *data_p will point to the 1500 * space allocated for the data. 1501 * @result 0 upon success otherwise the errno error. 1502 */ 1503 extern errno_t mbuf_find_drvaux(mbuf_t mbuf, u_int32_t *family_p, 1504 u_int32_t *subfamily_p, u_int32_t *length_p, void **data_p); 1505 1506 /*! 1507 * @function mbuf_del_drvaux 1508 * @discussion Remove and free any driver auxility data associated 1509 * with the packet. 1510 * @param mbuf The mbuf the auxiliary data is attached to. 1511 */ 1512 extern void mbuf_del_drvaux(mbuf_t mbuf); 1513 #endif /* KERNEL_PRIVATE */ 1514 1515 /* mbuf stats */ 1516 1517 /*! 1518 * @function mbuf_stats 1519 * @discussion Get the mbuf statistics. 1520 * @param stats Storage to copy the stats in to. 1521 */ 1522 extern void mbuf_stats(struct mbuf_stat *stats) 1523 __NKE_API_DEPRECATED; 1524 1525 1526 /*! 1527 * @enum mbuf_traffic_class_t 1528 * @abstract Traffic class of a packet 1529 * @discussion Property that represent the category of traffic of a packet. 1530 * This information may be used by the driver and at the link level. 1531 * @constant MBUF_TC_BE Best effort, normal class. 1532 * @constant MBUF_TC_BK Background, low priority or bulk traffic. 1533 * @constant MBUF_TC_VI Interactive video, constant bit rate, low latency. 1534 * @constant MBUF_TC_VO Interactive voice, constant bit rate, lowest latency. 1535 */ 1536 typedef enum { 1537 #ifdef XNU_KERNEL_PRIVATE 1538 MBUF_TC_UNSPEC = -1, /* Internal: not specified */ 1539 #endif 1540 MBUF_TC_BE = 0, 1541 MBUF_TC_BK = 1, 1542 MBUF_TC_VI = 2, 1543 MBUF_TC_VO = 3 1544 #ifdef XNU_KERNEL_PRIVATE 1545 , 1546 MBUF_TC_MAX = 4 /* Internal: traffic class count */ 1547 #endif 1548 } mbuf_traffic_class_t; 1549 1550 /*! 1551 * @function mbuf_get_traffic_class 1552 * @discussion Get the traffic class of an mbuf packet 1553 * @param mbuf The mbuf to get the traffic class of. 1554 * @result The traffic class 1555 */ 1556 extern mbuf_traffic_class_t mbuf_get_traffic_class(mbuf_t mbuf) 1557 __NKE_API_DEPRECATED; 1558 1559 /*! 1560 * @function mbuf_set_traffic_class 1561 * @discussion Set the traffic class of an mbuf packet. 1562 * @param mbuf The mbuf to set the traffic class on. 1563 * @param tc The traffic class 1564 * @result 0 on success, EINVAL if bad parameter is passed 1565 */ 1566 extern errno_t mbuf_set_traffic_class(mbuf_t mbuf, mbuf_traffic_class_t tc) 1567 __NKE_API_DEPRECATED; 1568 1569 /*! 1570 * @function mbuf_is_traffic_class_privileged 1571 * @discussion Returns the privileged status of the traffic class 1572 * of the packet specified by the mbuf. 1573 * @param mbuf The mbuf to retrieve the status from. 1574 * @result Non-zero if privileged, 0 otherwise. 1575 */ 1576 extern int mbuf_is_traffic_class_privileged(mbuf_t mbuf) 1577 __NKE_API_DEPRECATED; 1578 1579 #ifdef KERNEL_PRIVATE 1580 1581 /*! 1582 * @function mbuf_get_traffic_class_max_count 1583 * @discussion Returns the maximum number of mbuf traffic class types 1584 * @result The total count of mbuf traffic classes 1585 */ 1586 extern u_int32_t mbuf_get_traffic_class_max_count(void); 1587 1588 /*! 1589 * @function mbuf_get_traffic_class_index 1590 * @discussion Returns the zero-based index of an mbuf traffic class value 1591 * @param tc The traffic class 1592 * @param index Pointer to the index value 1593 * @result 0 on success, EINVAL if bad parameter is passed 1594 */ 1595 extern errno_t mbuf_get_traffic_class_index(mbuf_traffic_class_t tc, 1596 u_int32_t *index); 1597 1598 /*! 1599 * @enum mbuf_svc_class_t 1600 * @abstract Service class of a packet 1601 * @discussion Property that represents the category of service 1602 * of a packet. This information may be used by the driver 1603 * and at the link level. 1604 * @constant MBUF_SC_BK_SYS "Background System-Initiated", high delay 1605 * tolerant, high loss tolerant, elastic flow, variable size & 1606 * long-lived. 1607 * @constant MBUF_SC_BK "Background", user-initiated, high delay tolerant, 1608 * high loss tolerant, elastic flow, variable size. This level 1609 * corresponds to WMM access class "BG", or MBUF_TC_BK. 1610 * @constant MBUF_SC_BE "Best Effort", unclassified/standard. This is 1611 * the default service class; pretty much a mix of everything. 1612 * This level corresponds to WMM access class "BE" or MBUF_TC_BE. 1613 * @constant MBUF_SC_RD 1614 * "Responsive Data", a notch higher than "Best Effort", medium 1615 * delay tolerant, medium loss tolerant, elastic flow, bursty, 1616 * long-lived. 1617 * @constant MBUF_SC_OAM "Operations, Administration, and Management", 1618 * medium delay tolerant, low-medium loss tolerant, elastic & 1619 * inelastic flows, variable size. 1620 * @constant MBUF_SC_AV "Multimedia Audio/Video Streaming", medium delay 1621 * tolerant, low-medium loss tolerant, elastic flow, constant 1622 * packet interval, variable rate & size. 1623 * @constant MBUF_SC_RV "Responsive Multimedia Audio/Video", low delay 1624 * tolerant, low-medium loss tolerant, elastic flow, variable 1625 * packet interval, rate and size. 1626 * @constant MBUF_SC_VI "Interactive Video", low delay tolerant, low- 1627 * medium loss tolerant, elastic flow, constant packet interval, 1628 * variable rate & size. This level corresponds to WMM access 1629 * class "VI" or MBUF_TC_VI. 1630 * @constant MBUF_SC_SIG "Signaling", low delay tolerant, low loss 1631 * tolerant, inelastic flow, jitter tolerant, rate is bursty but 1632 * short, variable size. e.g. SIP. This level corresponds to WMM 1633 * access class "VI" or MBUF_TC_VI. 1634 * @constant MBUF_SC_VO "Interactive Voice", low delay tolerant, low loss 1635 * tolerant, inelastic flow, constant packet rate, somewhat fixed 1636 * size. This level corresponds to WMM access class "VO" or 1637 * MBUF_TC_VO. 1638 * @constant MBUF_SC_CTL "Network Control", low delay tolerant, low loss 1639 * tolerant, inelastic flow, rate is short & burst, variable size. 1640 */ 1641 typedef enum { 1642 #ifdef XNU_KERNEL_PRIVATE 1643 MBUF_SC_UNSPEC = -1, /* Internal: not specified */ 1644 #endif 1645 MBUF_SC_BK_SYS = 0x00080090, /* lowest class */ 1646 MBUF_SC_BK = 0x00100080, 1647 1648 MBUF_SC_BE = 0x00000000, 1649 MBUF_SC_RD = 0x00180010, 1650 MBUF_SC_OAM = 0x00200020, 1651 1652 MBUF_SC_AV = 0x00280120, 1653 MBUF_SC_RV = 0x00300110, 1654 MBUF_SC_VI = 0x00380100, 1655 MBUF_SC_SIG = 0x00380130, 1656 1657 MBUF_SC_VO = 0x00400180, 1658 MBUF_SC_CTL = 0x00480190, /* highest class */ 1659 } mbuf_svc_class_t; 1660 1661 /*! 1662 * @function mbuf_get_service_class_max_count 1663 * @discussion Returns the maximum number of mbuf service class types. 1664 * @result The total count of mbuf service classes. 1665 */ 1666 extern u_int32_t mbuf_get_service_class_max_count(void); 1667 1668 /*! 1669 * @function mbuf_get_service_class_index 1670 * @discussion Returns the zero-based index of an mbuf service class value 1671 * @param sc The service class 1672 * @param index Pointer to the index value 1673 * @result 0 on success, EINVAL if bad parameter is passed 1674 */ 1675 extern errno_t mbuf_get_service_class_index(mbuf_svc_class_t sc, 1676 u_int32_t *index); 1677 1678 /*! 1679 * @function mbuf_get_service_class 1680 * @discussion Get the service class of an mbuf packet 1681 * @param mbuf The mbuf to get the service class of. 1682 * @result The service class 1683 */ 1684 extern mbuf_svc_class_t mbuf_get_service_class(mbuf_t mbuf); 1685 1686 /*! 1687 * @function mbuf_set_servicec_class 1688 * @discussion Set the service class of an mbuf packet. 1689 * @param mbuf The mbuf to set the service class on. 1690 * @param sc The service class 1691 * @result 0 on success, EINVAL if bad parameter is passed 1692 */ 1693 extern errno_t mbuf_set_service_class(mbuf_t mbuf, mbuf_svc_class_t sc); 1694 1695 /*! 1696 * @function mbuf_is_service_class_privileged 1697 * @discussion Returns the privileged status of the service class 1698 * of the packet specified by the mbuf. 1699 * @param mbuf The mbuf to retrieve the status from. 1700 * @result Non-zero if privileged, 0 otherwise. 1701 */ 1702 extern int mbuf_is_service_class_privileged(mbuf_t mbuf); 1703 1704 /*! 1705 * @enum mbuf_pkthdr_aux_flags_t 1706 * @abstract Constants defining mbuf auxiliary flags. Only the flags 1707 * listed below can be retrieved. 1708 * @constant MBUF_PKTAUXF_INET_RESOLVE_RTR Indicates this is an ARP 1709 * request packet, whose target is the address of the default 1710 * IPv4 router. 1711 * @constant MBUF_PKTAUXF_INET6_RESOLVE_RTR Indicates this is an ICMPv6 1712 * Neighbor Solicitation packet, whose target is the address of 1713 * the default IPv6 router. 1714 */ 1715 enum { 1716 MBUF_PKTAUXF_INET_RESOLVE_RTR = 0x0004, 1717 MBUF_PKTAUXF_INET6_RESOLVE_RTR = 0x0008, 1718 }; 1719 typedef u_int32_t mbuf_pkthdr_aux_flags_t; 1720 1721 /*! 1722 * @function mbuf_pkthdr_aux_flags 1723 * @discussion Returns the auxiliary flags of a packet. 1724 * @param mbuf The mbuf containing the packet header. 1725 * @param paux_flags Pointer to mbuf_pkthdr_aux_flags_t variable. 1726 * @result 0 upon success otherwise the errno error. 1727 */ 1728 extern errno_t mbuf_pkthdr_aux_flags(mbuf_t mbuf, 1729 mbuf_pkthdr_aux_flags_t *paux_flags); 1730 1731 /*! 1732 * @function mbuf_get_driver_scratch 1733 * @discussion Returns a pointer to a driver specific area in the mbuf 1734 * @param m The mbuf whose driver scratch space is to be returned 1735 * @param area A pointer to a location to store the address of the 1736 * driver scratch space. This value is guaranteed to be 32-bit 1737 * aligned. 1738 * @param area_ln A pointer to a location to store the total length of 1739 * the memory location. 1740 */ 1741 extern errno_t mbuf_get_driver_scratch(mbuf_t m, u_int8_t **area, 1742 size_t *area_ln); 1743 1744 /*! 1745 * @function mbuf_get_unsent_data_bytes 1746 * @discussion Returns the amount of data that is waiting to be sent 1747 * on this interface. This is a private SPI used by cellular 1748 * interface as an indication of future activity on that 1749 * interface. 1750 * @param m The mbuf containing the packet header 1751 * @param unsent_data A pointer to an integer where the value of 1752 * unsent data will be set. 1753 * @result 0 upon success otherwise the errno error. If the mbuf 1754 * packet header does not have valid data bytes, the error 1755 * code will be EINVAL 1756 */ 1757 extern errno_t mbuf_get_unsent_data_bytes(const mbuf_t m, 1758 u_int32_t *unsent_data); 1759 1760 typedef struct { 1761 int32_t buf_interface; /* data to send at interface */ 1762 int32_t buf_sndbuf; /* data to send at socket buffer */ 1763 } mbuf_buffer_status_t; 1764 1765 /*! 1766 * @function mbuf_get_buffer_status 1767 * @discussion Returns the amount of data that is waiting to be sent 1768 * on this interface. This is a private SPI used by cellular 1769 * interface as an indication of future activity on that 1770 * interface. 1771 * @param m The mbuf containing the packet header 1772 * @param buf_status A pointer to the structure where the value of 1773 * unsent data will be set. 1774 * @result 0 upon success. If any of the arguments is NULL or if the 1775 * mbuf packet header does not have valid data bytes, 1776 * EINVAL will be returned 1777 */ 1778 extern errno_t mbuf_get_buffer_status(const mbuf_t m, 1779 mbuf_buffer_status_t *buf_status); 1780 1781 /*! 1782 * @function mbuf_pkt_new_flow 1783 * @discussion This function is used to check if the packet is from a 1784 * new flow that can be treated with higher priority. This is 1785 * a private SPI. 1786 * @param m The mbuf containing the packet header 1787 * @param retval A pointer to an integer used as an out argument. The 1788 * value is set to 1 if the packet is from a new flow, 1789 * otherwise it is set to 0. 1790 * @result 0 upon success otherwise the errno error. If any of the 1791 * arguments is NULL or if the mbuf does not have valid packet 1792 * header, the error code will be EINVAL 1793 */ 1794 extern errno_t mbuf_pkt_new_flow(const mbuf_t m, u_int32_t *retval); 1795 1796 /*! 1797 * @function mbuf_last_pkt 1798 * @discussion This function is used to check if the packet is the 1799 * last one sent on a TCP socket. This is an advisory 1800 * for the underlying layers. 1801 * @param m The mbuf containing the packet header 1802 * @param retval A pointer to an integer whose value will be set to 1803 * 1 if the packet is the last packet, otherwise it will 1804 * be set to 0. 1805 * @result 0 upon success otherwise the errno error. If any of the 1806 * arguments is NULL or if the mbuf does not have valid 1807 * packet header, the error code will be EINVAL 1808 */ 1809 extern errno_t mbuf_last_pkt(const mbuf_t m, u_int32_t *retval); 1810 1811 #endif /* KERNEL_PRIVATE */ 1812 1813 #ifdef XNU_KERNEL_PRIVATE 1814 /*! 1815 * @function mbuf_pkt_list_len 1816 * @discussion Retrieves the length of the list of mbuf packets. 1817 * @param mbuf The mbuf. 1818 * @result The length of the mbuf packet list. 1819 */ 1820 extern size_t mbuf_pkt_list_len(const mbuf_t mbuf); 1821 1822 /*! 1823 * @function mbuf_pkt_list_maxlen 1824 * @discussion Retrieves the maximum length of data that may be stored 1825 * in the list of mbuf packet. This value assumes that the data pointer 1826 * was set to the start of the possible range for that pointer 1827 * for each mbuf in the packet chain 1828 * @param mbuf The mbuf. 1829 * @result The maximum length of data for this mbuf. 1830 */ 1831 extern size_t mbuf_pkt_list_maxlen(const mbuf_t mbuf); 1832 #endif /* XNU_KERNEL_PRIVATE */ 1833 1834 #ifdef KERNEL_PRIVATE 1835 /*! 1836 * @function mbuf_get_timestamp 1837 * @discussion Retrieves the timestamp of the packet. 1838 * @param mbuf The mbuf representing the packet. 1839 * @param ts A pointer where the value of the timestamp will be copied 1840 * to. 1841 * @param valid A pointer to a boolean value that indicate if the 1842 * timestamp is valid (i.e. the packet timestamp has been set). 1843 * If "false" the value of "ts" is undetermined. 1844 * @result 0 upon success otherwise the errno error. If the mbuf 1845 * packet header does not have valid data bytes, the error 1846 * code will be EINVAL 1847 */ 1848 extern errno_t mbuf_get_timestamp(mbuf_t mbuf, u_int64_t *ts, boolean_t *valid); 1849 1850 /*! 1851 * @function mbuf_set_timestamp 1852 * @discussion Set the timestamp of the packet. 1853 * @param mbuf The mbuf representing the packet. 1854 * @param ts The value of the timestamp to be stored in the mbuf packet 1855 * header 1856 * @param valid A boolean value that indicate if the timestamp is valid. 1857 * Passing false clears any previous timestamp value. 1858 * @result 0 upon success otherwise the errno error. If the mbuf 1859 * packet header does not have valid data bytes, the error 1860 * code will be EINVAL 1861 */ 1862 extern errno_t mbuf_set_timestamp(mbuf_t mbuf, u_int64_t ts, boolean_t valid); 1863 1864 /*! 1865 * @typedef mbuf_tx_compl_func 1866 * @discussion This callback is used to indicate when a driver has 1867 * transmitted a packet. 1868 * @param pktid The packet indentifier that was returned by 1869 * mbuf_set_timestamp_requested() 1870 * @param ifp The outgoing interface or NULL if the packet was dropped 1871 * before reaching the driver 1872 * @param ts The timestamp in nanoseconds when the packet was transmitted 1873 * @param tx_compl_arg An argument set by the driver 1874 * @param tx_compl_data Additional data set by the driver 1875 * @param tx_compl_val The transmission status is expected to be an 1876 * IOReturn value -- see <IOKit/IOReturn.h> 1877 */ 1878 1879 typedef void (*mbuf_tx_compl_func)(uintptr_t pktid, ifnet_t ifp, u_int64_t ts, 1880 uintptr_t tx_compl_arg, uintptr_t tx_compl_data, kern_return_t tx_compl_val); 1881 1882 /*! 1883 * @function mbuf_register_tx_compl_callback 1884 * @discussion Register a transmit completion callback function. The 1885 * callback function must be unregistered before the calling 1886 * module unloads. 1887 * @param callback The completion callback function to register 1888 * @result 0 upon success otherwise the errno error. ENOSPC is returned 1889 * if too many callbacks are registered. EINVAL is returned when 1890 * the function pointer is invalid. EEXIST is returned when 1891 * the function pointer is already registered. 1892 */ 1893 extern errno_t mbuf_register_tx_compl_callback( 1894 mbuf_tx_compl_func callback); 1895 1896 /*! 1897 * @function mbuf_unregister_tx_compl_callback 1898 * @discussion Unregister a transmit completion callback function. The 1899 * callback function must be unregistered before the calling 1900 * module unloads. 1901 * @param callback The completion callback function to unregister 1902 * @result 0 upon success otherwise the errno error. EINVAL is returned 1903 * when the function pointer is invalid. ENOENT is returned when 1904 * the function pointer is not registered. 1905 */ 1906 extern errno_t mbuf_unregister_tx_compl_callback( 1907 mbuf_tx_compl_func callback); 1908 1909 /*! 1910 * @function mbuf_get_timestamp_requested 1911 * @discussion Tell if the packet timestamp needs to be set. This is meant 1912 * to be used by a driver on egress packets. 1913 * @param mbuf The mbuf representing the packet. 1914 * @param requested A pointer to a boolean value that indicate if the 1915 * timestamp was requested to be set. 1916 * @result 0 upon success otherwise the errno error. If the mbuf 1917 * packet header does not have valid data bytes, the error 1918 * code will be EINVAL 1919 */ 1920 extern errno_t mbuf_get_timestamp_requested(mbuf_t mbuf, boolean_t *requested); 1921 1922 /*! 1923 * @function mbuf_set_timestamp_requested 1924 * @discussion Indicate the callback is expected to be called with the 1925 * transmission complete timestamp. This is meant to be used 1926 * on egress packet by the driver. 1927 * @param mbuf The mbuf representing the packet. 1928 * @param callback A previously registered completion callback function. 1929 * @param pktid An output parameter with an opaque value that can be used 1930 * to identify the packet. 1931 * @result 0 upon success otherwise the errno error. EINVAL is retuned 1932 * if the mbuf is not a valid packet or if one of the parameter 1933 * is NULL. ENOENT if the callback is not registred. 1934 */ 1935 extern errno_t mbuf_set_timestamp_requested(mbuf_t mbuf, 1936 uintptr_t *pktid, mbuf_tx_compl_func callback); 1937 1938 /*! 1939 * @function mbuf_get_status 1940 * @discussion Retrieves the packet completion status. 1941 * @param mbuf The mbuf representing the packet. 1942 * @param status A pointer where the value of the completion status will 1943 * be copied to. 1944 * @result 0 upon success otherwise the errno error. If the mbuf 1945 * packet header does not have valid data bytes, the error 1946 * code will be EINVAL 1947 */ 1948 extern errno_t mbuf_get_status(mbuf_t mbuf, kern_return_t *status); 1949 1950 /*! 1951 * @function mbuf_set_status 1952 * @discussion Store the packet completion status in the mbuf packet 1953 * header. 1954 * @param mbuf The mbuf representing the packet. 1955 * @param status The value of the completion status. 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_set_status(mbuf_t mbuf, kern_return_t status); 1961 1962 /*! 1963 * @function mbuf_get_tx_compl_data 1964 * @discussion Retrieves the packet completion status. 1965 * @param m The mbuf representing the packet. 1966 * @result 0 upon success otherwise the errno error. If the mbuf 1967 * packet header does not have valid data bytes, the error 1968 * code will be EINVAL 1969 */ 1970 extern errno_t mbuf_get_tx_compl_data(mbuf_t m, uintptr_t *arg, 1971 uintptr_t *data); 1972 1973 /*! 1974 * @function mbuf_set_tx_compl_data 1975 * @discussion Retrieves the packet completion status. 1976 * @param m The mbuf representing the packet. 1977 * @result 0 upon success otherwise the errno error. If the mbuf 1978 * packet header does not have valid data bytes, the error 1979 * code will be EINVAL 1980 */ 1981 extern errno_t mbuf_set_tx_compl_data(mbuf_t m, uintptr_t arg, 1982 uintptr_t data); 1983 1984 /*! 1985 * @function mbuf_get_flowid 1986 * @discussion Retrieve the flow ID of the packet . 1987 * @param mbuf The mbuf representing the packet. 1988 * @param flowid The flow ID of the packet. 1989 * @result 0 upon success otherwise the errno error. If the mbuf 1990 * packet header does not have valid data bytes, the error 1991 * code will be EINVAL 1992 */ 1993 extern errno_t mbuf_get_flowid(mbuf_t mbuf, u_int16_t *flowid); 1994 1995 /*! 1996 * @function mbuf_set_flowid 1997 * @discussion Set the flow ID of the packet . 1998 * @param mbuf The mbuf representing the packet. 1999 * @param flowid The flow ID to be set. 2000 * @result 0 upon success otherwise the errno error. If the mbuf 2001 * packet header does not have valid data bytes, the error 2002 * code will be EINVAL 2003 */ 2004 extern errno_t mbuf_set_flowid(mbuf_t mbuf, u_int16_t flowid); 2005 2006 /*! 2007 * @function mbuf_get_keepalive_flag 2008 * @discussion Tell if it's a keep alive packet. 2009 * @param mbuf The mbuf representing the packet. 2010 * @param is_keepalive A pointer that returns the truth value. 2011 * @result 0 upon success otherwise the errno error. If the mbuf 2012 * packet header does not have valid data bytes, the error 2013 * code will be EINVAL 2014 */ 2015 extern errno_t mbuf_get_keepalive_flag(mbuf_t mbuf, boolean_t *is_keepalive); 2016 2017 /*! 2018 * @function mbuf_set_keepalive_flag 2019 * @discussion Set or clear the packet keep alive flag. 2020 * @param mbuf The mbuf representing the packet. 2021 * @param is_keepalive The boolean value. 2022 * @result 0 upon success otherwise the errno error. If the mbuf 2023 * packet header does not have valid data bytes, the error 2024 * code will be EINVAL 2025 */ 2026 extern errno_t mbuf_set_keepalive_flag(mbuf_t mbuf, boolean_t is_keepalive); 2027 2028 /*! 2029 * @function mbuf_get_wake_packet_flag 2030 * @discussion Tell if the wake packet flag is set. 2031 * @param mbuf The mbuf representing the packet. 2032 * @param is_wake_packet A pointer that returns the truth value. 2033 * @result 0 upon success otherwise the errno error. If the mbuf 2034 * packet header does not have valid data bytes, the error 2035 * code will be EINVAL. 2036 */ 2037 extern errno_t mbuf_get_wake_packet_flag(mbuf_t mbuf, boolean_t *is_wake_packet); 2038 2039 /*! 2040 * @function mbuf_set_wake_packet_flag 2041 * @discussion Set or clear the wake packet flag. 2042 * @param mbuf The mbuf representing the packet. 2043 * @param is_wake_packet The boolean value. 2044 * @result 0 upon success otherwise the errno error. If the mbuf 2045 * packet header does not have valid data bytes, the error 2046 * code will be EINVAL. 2047 */ 2048 extern errno_t mbuf_set_wake_packet_flag(mbuf_t mbuf, boolean_t is_wake_packet); 2049 2050 #endif /* KERNEL_PRIVATE */ 2051 2052 /* IF_QUEUE interaction */ 2053 2054 #define IF_ENQUEUE_MBUF(ifq, m) { \ 2055 mbuf_setnextpkt((m), 0); \ 2056 if ((ifq)->ifq_tail == 0) \ 2057 (ifq)->ifq_head = (m); \ 2058 else \ 2059 mbuf_setnextpkt((mbuf_t)(ifq)->ifq_tail, (m)); \ 2060 (ifq)->ifq_tail = (m); \ 2061 (ifq)->ifq_len++; \ 2062 } 2063 2064 #define IF_PREPEND_MBUF(ifq, m) { \ 2065 mbuf_setnextpkt((m), (ifq)->ifq_head); \ 2066 if ((ifq)->ifq_tail == 0) \ 2067 (ifq)->ifq_tail = (m); \ 2068 (ifq)->ifq_head = (m); \ 2069 (ifq)->ifq_len++; \ 2070 } 2071 2072 #define IF_DEQUEUE_MBUF(ifq, m) { \ 2073 (m) = (ifq)->ifq_head; \ 2074 if (m) { \ 2075 if (((ifq)->ifq_head = mbuf_nextpkt((m))) == 0) \ 2076 (ifq)->ifq_tail = 0; \ 2077 mbuf_setnextpkt((m), 0); \ 2078 (ifq)->ifq_len--; \ 2079 } \ 2080 } 2081 2082 __END_DECLS 2083 #undef __NKE_API_DEPRECATED 2084 #endif /* __KPI_MBUF__ */ 2085