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