xref: /f-stack/freebsd/netgraph/ng_patch.h (revision 22ce4aff)
1a1fd9364Slogwang /*-
2*22ce4affSfengbojiang  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*22ce4affSfengbojiang  *
4*22ce4affSfengbojiang  * Copyright (c) 2010 Maxim Ignatenko <[email protected]>
5*22ce4affSfengbojiang  * Copyright (c) 2015 Dmitry Vagin <[email protected]>
6a1fd9364Slogwang  * All rights reserved.
7a1fd9364Slogwang  *
8a1fd9364Slogwang  * Redistribution and use in source and binary forms, with or without
9a1fd9364Slogwang  * modification, are permitted provided that the following conditions
10a1fd9364Slogwang  * are met:
11a1fd9364Slogwang  * 1. Redistributions of source code must retain the above copyright
12a1fd9364Slogwang  *    notice, this list of conditions and the following disclaimer.
13a1fd9364Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
14a1fd9364Slogwang  *    notice, this list of conditions and the following disclaimer in the
15a1fd9364Slogwang  *    documentation and/or other materials provided with the distribution.
16a1fd9364Slogwang  *
17a1fd9364Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18a1fd9364Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19a1fd9364Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20a1fd9364Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21a1fd9364Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22a1fd9364Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23a1fd9364Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24a1fd9364Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25a1fd9364Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26a1fd9364Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27a1fd9364Slogwang  * SUCH DAMAGE.
28a1fd9364Slogwang  *
29a1fd9364Slogwang  * $FreeBSD$
30a1fd9364Slogwang  */
31a1fd9364Slogwang 
32a1fd9364Slogwang #ifndef _NETGRAPH_NG_PATCH_H_
33a1fd9364Slogwang #define _NETGRAPH_NG_PATCH_H_
34a1fd9364Slogwang 
35a1fd9364Slogwang /* Node type name. */
36a1fd9364Slogwang #define	NG_PATCH_NODE_TYPE	"patch"
37a1fd9364Slogwang 
38a1fd9364Slogwang /* Node type cookie. */
39a1fd9364Slogwang #define	NGM_PATCH_COOKIE	1262445509
40a1fd9364Slogwang 
41a1fd9364Slogwang /* Hook names */
42a1fd9364Slogwang #define	NG_PATCH_HOOK_IN	"in"
43a1fd9364Slogwang #define	NG_PATCH_HOOK_OUT	"out"
44a1fd9364Slogwang 
45*22ce4affSfengbojiang /* Checksum flags */
46*22ce4affSfengbojiang #define NG_PATCH_CSUM_IPV4	(CSUM_IP|CSUM_TCP|CSUM_UDP|CSUM_SCTP)
47*22ce4affSfengbojiang #define NG_PATCH_CSUM_IPV6	(CSUM_TCP_IPV6|CSUM_UDP_IPV6|CSUM_SCTP_IPV6)
48*22ce4affSfengbojiang 
49a1fd9364Slogwang /* Netgraph commands understood by this node type */
50a1fd9364Slogwang enum {
51a1fd9364Slogwang 	NGM_PATCH_SETCONFIG = 1,
52a1fd9364Slogwang 	NGM_PATCH_GETCONFIG,
53a1fd9364Slogwang 	NGM_PATCH_GET_STATS,
54a1fd9364Slogwang 	NGM_PATCH_CLR_STATS,
55*22ce4affSfengbojiang 	NGM_PATCH_GETCLR_STATS,
56*22ce4affSfengbojiang 	NGM_PATCH_GETDLT,
57*22ce4affSfengbojiang 	NGM_PATCH_SETDLT
58a1fd9364Slogwang };
59a1fd9364Slogwang 
60a1fd9364Slogwang /* Patching modes */
61a1fd9364Slogwang enum {
62a1fd9364Slogwang 	NG_PATCH_MODE_SET = 1,
63a1fd9364Slogwang 	NG_PATCH_MODE_ADD = 2,
64a1fd9364Slogwang 	NG_PATCH_MODE_SUB = 3,
65a1fd9364Slogwang 	NG_PATCH_MODE_MUL = 4,
66a1fd9364Slogwang 	NG_PATCH_MODE_DIV = 5,
67a1fd9364Slogwang 	NG_PATCH_MODE_NEG = 6,
68a1fd9364Slogwang 	NG_PATCH_MODE_AND = 7,
69a1fd9364Slogwang 	NG_PATCH_MODE_OR  = 8,
70a1fd9364Slogwang 	NG_PATCH_MODE_XOR = 9,
71a1fd9364Slogwang 	NG_PATCH_MODE_SHL = 10,
72a1fd9364Slogwang 	NG_PATCH_MODE_SHR = 11
73a1fd9364Slogwang };
74a1fd9364Slogwang 
75*22ce4affSfengbojiang /* Parsing declarations */
76a1fd9364Slogwang 
77*22ce4affSfengbojiang #define	NG_PATCH_CONFIG_TYPE {						\
78*22ce4affSfengbojiang 	{ "count",		&ng_parse_uint32_type		},	\
79*22ce4affSfengbojiang 	{ "csum_flags",		&ng_parse_uint64_type		},	\
80*22ce4affSfengbojiang 	{ "relative_offset",	&ng_parse_uint32_type		},	\
81*22ce4affSfengbojiang 	{ "ops",		&ng_patch_ops_array_type	},	\
82*22ce4affSfengbojiang 	{ NULL }							\
83*22ce4affSfengbojiang }
84*22ce4affSfengbojiang 
85*22ce4affSfengbojiang #define	NG_PATCH_OP_TYPE {				\
86a1fd9364Slogwang 	{ "offset",	&ng_parse_uint32_type	},	\
87a1fd9364Slogwang 	{ "length",	&ng_parse_uint16_type	},	\
88a1fd9364Slogwang 	{ "mode",	&ng_parse_uint16_type	},	\
89*22ce4affSfengbojiang 	{ "value",	&ng_parse_uint64_type	},	\
90a1fd9364Slogwang 	{ NULL }					\
91a1fd9364Slogwang }
92a1fd9364Slogwang 
93*22ce4affSfengbojiang #define	NG_PATCH_STATS_TYPE {				\
94*22ce4affSfengbojiang 	{ "Received",	&ng_parse_uint64_type	},	\
95*22ce4affSfengbojiang 	{ "Patched",	&ng_parse_uint64_type	},	\
96*22ce4affSfengbojiang 	{ "Dropped",	&ng_parse_uint64_type	},	\
97*22ce4affSfengbojiang 	{ NULL }					\
98*22ce4affSfengbojiang }
99*22ce4affSfengbojiang 
100*22ce4affSfengbojiang union ng_patch_op_val {
101*22ce4affSfengbojiang 	uint8_t		v1;
102*22ce4affSfengbojiang 	uint16_t	v2;
103*22ce4affSfengbojiang 	uint32_t	v4;
104*22ce4affSfengbojiang 	uint64_t	v8;
105*22ce4affSfengbojiang };
106*22ce4affSfengbojiang 
107*22ce4affSfengbojiang struct ng_patch_op {
108*22ce4affSfengbojiang 	uint32_t	offset;
109*22ce4affSfengbojiang 	uint16_t	length;	/* 1, 2, 4 or 8 (bytes) */
110*22ce4affSfengbojiang 	uint16_t	mode;
111*22ce4affSfengbojiang 	union ng_patch_op_val val;
112*22ce4affSfengbojiang };
113*22ce4affSfengbojiang 
114a1fd9364Slogwang struct ng_patch_config {
115a1fd9364Slogwang 	uint32_t	count;
116*22ce4affSfengbojiang 	uint64_t	csum_flags;
117*22ce4affSfengbojiang 	uint32_t	relative_offset;
118a1fd9364Slogwang 	struct ng_patch_op ops[];
119a1fd9364Slogwang };
120a1fd9364Slogwang 
121a1fd9364Slogwang struct ng_patch_stats {
122a1fd9364Slogwang 	uint64_t	received;
123a1fd9364Slogwang 	uint64_t	patched;
124a1fd9364Slogwang 	uint64_t	dropped;
125a1fd9364Slogwang };
126a1fd9364Slogwang 
127*22ce4affSfengbojiang struct ng_patch_vlan_header {
128*22ce4affSfengbojiang 	u_int16_t tag;
129*22ce4affSfengbojiang 	u_int16_t etype;
130*22ce4affSfengbojiang };
131*22ce4affSfengbojiang 
132*22ce4affSfengbojiang #define NG_PATCH_CONF_SIZE(count) (sizeof(struct ng_patch_config) + \
133*22ce4affSfengbojiang 	(count) * sizeof(struct ng_patch_op))
134a1fd9364Slogwang 
135a1fd9364Slogwang #endif /* _NETGRAPH_NG_PATCH_H_ */
136