xref: /xnu-11215.1.10/bsd/net/pf_pbuf.h (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1*8d741a5dSApple OSS Distributions /*
2*8d741a5dSApple OSS Distributions  * Copyright (c) 2016-2022 Apple Inc. All rights reserved.
3*8d741a5dSApple OSS Distributions  *
4*8d741a5dSApple OSS Distributions  * @APPLE_LICENSE_HEADER_START@
5*8d741a5dSApple OSS Distributions  *
6*8d741a5dSApple OSS Distributions  * This file contains Original Code and/or Modifications of Original Code
7*8d741a5dSApple OSS Distributions  * as defined in and that are subject to the Apple Public Source License
8*8d741a5dSApple OSS Distributions  * Version 2.0 (the 'License'). You may not use this file except in
9*8d741a5dSApple OSS Distributions  * compliance with the License. Please obtain a copy of the License at
10*8d741a5dSApple OSS Distributions  * http://www.opensource.apple.com/apsl/ and read it before using this
11*8d741a5dSApple OSS Distributions  * file.
12*8d741a5dSApple OSS Distributions  *
13*8d741a5dSApple OSS Distributions  * The Original Code and all software distributed under the License are
14*8d741a5dSApple OSS Distributions  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15*8d741a5dSApple OSS Distributions  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16*8d741a5dSApple OSS Distributions  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17*8d741a5dSApple OSS Distributions  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18*8d741a5dSApple OSS Distributions  * Please see the License for the specific language governing rights and
19*8d741a5dSApple OSS Distributions  * limitations under the License.
20*8d741a5dSApple OSS Distributions  *
21*8d741a5dSApple OSS Distributions  * @APPLE_LICENSE_HEADER_END@
22*8d741a5dSApple OSS Distributions  */
23*8d741a5dSApple OSS Distributions 
24*8d741a5dSApple OSS Distributions #ifndef __PBUF_H__
25*8d741a5dSApple OSS Distributions #define __PBUF_H__
26*8d741a5dSApple OSS Distributions 
27*8d741a5dSApple OSS Distributions #include <sys/mbuf.h>
28*8d741a5dSApple OSS Distributions 
29*8d741a5dSApple OSS Distributions enum pbuf_type {
30*8d741a5dSApple OSS Distributions 	PBUF_TYPE_ZOMBIE = 0,
31*8d741a5dSApple OSS Distributions 	PBUF_TYPE_MBUF,
32*8d741a5dSApple OSS Distributions 	PBUF_TYPE_MEMORY
33*8d741a5dSApple OSS Distributions };
34*8d741a5dSApple OSS Distributions 
35*8d741a5dSApple OSS Distributions enum pbuf_action {
36*8d741a5dSApple OSS Distributions 	PBUF_ACTION_DESTROY
37*8d741a5dSApple OSS Distributions };
38*8d741a5dSApple OSS Distributions 
39*8d741a5dSApple OSS Distributions #define PBUF_ACTION_RV_SUCCESS  0
40*8d741a5dSApple OSS Distributions #define PBUF_ACTION_RV_FAILURE  (-1)
41*8d741a5dSApple OSS Distributions 
42*8d741a5dSApple OSS Distributions struct pbuf_memory {
43*8d741a5dSApple OSS Distributions 	uint8_t *__sized_by(pm_buffer_len) pm_buffer;     // Pointer to start of buffer
44*8d741a5dSApple OSS Distributions 	u_int pm_buffer_len;    // Total length of buffer
45*8d741a5dSApple OSS Distributions 	u_int pm_offset;        // Offset to start of payload
46*8d741a5dSApple OSS Distributions 	u_int pm_len;           // Length of payload
47*8d741a5dSApple OSS Distributions 	uint32_t pm_csum_flags;
48*8d741a5dSApple OSS Distributions 	uint32_t pm_csum_data;
49*8d741a5dSApple OSS Distributions 	uint8_t pm_proto;
50*8d741a5dSApple OSS Distributions 	uint8_t pm_flowsrc;
51*8d741a5dSApple OSS Distributions 	uint32_t pm_flowid;
52*8d741a5dSApple OSS Distributions 	uint32_t pm_flow_gencnt;
53*8d741a5dSApple OSS Distributions 	uint32_t pm_flags;
54*8d741a5dSApple OSS Distributions 	struct pf_mtag pm_pftag;
55*8d741a5dSApple OSS Distributions 	struct pf_fragment_tag  pm_pf_fragtag;
56*8d741a5dSApple OSS Distributions 	int (*pm_action)(struct pbuf_memory *, enum pbuf_action);
57*8d741a5dSApple OSS Distributions 	void *pm_action_cookie;
58*8d741a5dSApple OSS Distributions };
59*8d741a5dSApple OSS Distributions 
60*8d741a5dSApple OSS Distributions typedef struct pbuf {
61*8d741a5dSApple OSS Distributions 	enum pbuf_type  pb_type;
62*8d741a5dSApple OSS Distributions 	union {
63*8d741a5dSApple OSS Distributions 		struct mbuf *pbu_mbuf;
64*8d741a5dSApple OSS Distributions 		struct pbuf_memory pbu_memory;
65*8d741a5dSApple OSS Distributions 	} pb_u;
66*8d741a5dSApple OSS Distributions #define pb_mbuf         pb_u.pbu_mbuf
67*8d741a5dSApple OSS Distributions #define pb_memory       pb_u.pbu_memory
68*8d741a5dSApple OSS Distributions 
69*8d741a5dSApple OSS Distributions 	void            *__sized_by(pb_contig_len) pb_data;
70*8d741a5dSApple OSS Distributions 	uint32_t        pb_packet_len;
71*8d741a5dSApple OSS Distributions 	uint32_t        pb_contig_len;
72*8d741a5dSApple OSS Distributions 	uint32_t        *pb_csum_flags;
73*8d741a5dSApple OSS Distributions 	uint32_t        *pb_csum_data;    /* data field used by csum routines */
74*8d741a5dSApple OSS Distributions 	uint8_t         *pb_proto;
75*8d741a5dSApple OSS Distributions 	uint8_t         *pb_flowsrc;
76*8d741a5dSApple OSS Distributions 	uint32_t        *pb_flowid;
77*8d741a5dSApple OSS Distributions 	uint32_t        *pb_flow_gencnt;
78*8d741a5dSApple OSS Distributions 	uint32_t        *pb_flags;
79*8d741a5dSApple OSS Distributions 	struct pf_mtag  *pb_pftag;
80*8d741a5dSApple OSS Distributions 	struct pf_fragment_tag  *pb_pf_fragtag;
81*8d741a5dSApple OSS Distributions 	struct ifnet    *pb_ifp;
82*8d741a5dSApple OSS Distributions 	struct pbuf     *pb_next;
83*8d741a5dSApple OSS Distributions } pbuf_t;
84*8d741a5dSApple OSS Distributions 
85*8d741a5dSApple OSS Distributions #define pbuf_is_valid(pb) (!((pb) == NULL || (pb)->pb_type == PBUF_TYPE_ZOMBIE))
86*8d741a5dSApple OSS Distributions 
87*8d741a5dSApple OSS Distributions void            pbuf_init_mbuf(pbuf_t *, struct mbuf *, struct ifnet *);
88*8d741a5dSApple OSS Distributions void            pbuf_init_memory(pbuf_t *, const struct pbuf_memory *,
89*8d741a5dSApple OSS Distributions     struct ifnet *);
90*8d741a5dSApple OSS Distributions void            pbuf_destroy(pbuf_t *);
91*8d741a5dSApple OSS Distributions void            pbuf_sync(pbuf_t *);
92*8d741a5dSApple OSS Distributions 
93*8d741a5dSApple OSS Distributions struct mbuf     *pbuf_to_mbuf(pbuf_t *, boolean_t);
94*8d741a5dSApple OSS Distributions struct mbuf     *pbuf_clone_to_mbuf(pbuf_t *);
95*8d741a5dSApple OSS Distributions 
96*8d741a5dSApple OSS Distributions void *          pbuf_ensure_contig(pbuf_t *, size_t);
97*8d741a5dSApple OSS Distributions void *          pbuf_ensure_writable(pbuf_t *, size_t);
98*8d741a5dSApple OSS Distributions 
99*8d741a5dSApple OSS Distributions void *          pbuf_resize_segment(pbuf_t *, int off, int olen, int nlen);
100*8d741a5dSApple OSS Distributions void *          pbuf_contig_segment(pbuf_t *, int off, int len);
101*8d741a5dSApple OSS Distributions 
102*8d741a5dSApple OSS Distributions void            pbuf_copy_data(pbuf_t *, int, int, void *__sized_by(buflen), size_t buflen);
103*8d741a5dSApple OSS Distributions void            pbuf_copy_back(pbuf_t *, int, int, void *__sized_by(buflen), size_t buflen);
104*8d741a5dSApple OSS Distributions 
105*8d741a5dSApple OSS Distributions uint16_t        pbuf_inet_cksum(const pbuf_t *, uint32_t, uint32_t, uint32_t);
106*8d741a5dSApple OSS Distributions uint16_t        pbuf_inet6_cksum(const pbuf_t *, uint32_t, uint32_t, uint32_t);
107*8d741a5dSApple OSS Distributions 
108*8d741a5dSApple OSS Distributions mbuf_svc_class_t pbuf_get_service_class(const pbuf_t *);
109*8d741a5dSApple OSS Distributions void *          pbuf_get_packet_buffer_address(const pbuf_t *);
110*8d741a5dSApple OSS Distributions #endif /* __PBUF_H__ */
111