1*3b2bd0f6Slogwang /*-
2*3b2bd0f6Slogwang  * Copyright (C) 2010 by Maxim Ignatenko <[email protected]>
3*3b2bd0f6Slogwang  * All rights reserved.
4*3b2bd0f6Slogwang  *
5*3b2bd0f6Slogwang  * Redistribution and use in source and binary forms, with or without
6*3b2bd0f6Slogwang  * modification, are permitted provided that the following conditions
7*3b2bd0f6Slogwang  * are met:
8*3b2bd0f6Slogwang  * 1. Redistributions of source code must retain the above copyright
9*3b2bd0f6Slogwang  *    notice, this list of conditions and the following disclaimer.
10*3b2bd0f6Slogwang  * 2. Redistributions in binary form must reproduce the above copyright
11*3b2bd0f6Slogwang  *    notice, this list of conditions and the following disclaimer in the
12*3b2bd0f6Slogwang  *    documentation and/or other materials provided with the distribution.
13*3b2bd0f6Slogwang  *
14*3b2bd0f6Slogwang  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*3b2bd0f6Slogwang  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*3b2bd0f6Slogwang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*3b2bd0f6Slogwang  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*3b2bd0f6Slogwang  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*3b2bd0f6Slogwang  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*3b2bd0f6Slogwang  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*3b2bd0f6Slogwang  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*3b2bd0f6Slogwang  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*3b2bd0f6Slogwang  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*3b2bd0f6Slogwang  * SUCH DAMAGE.
25*3b2bd0f6Slogwang  *
26*3b2bd0f6Slogwang  * $FreeBSD$
27*3b2bd0f6Slogwang  */
28*3b2bd0f6Slogwang 
29*3b2bd0f6Slogwang #ifndef _NETGRAPH_NG_PATCH_H_
30*3b2bd0f6Slogwang #define _NETGRAPH_NG_PATCH_H_
31*3b2bd0f6Slogwang 
32*3b2bd0f6Slogwang /* Node type name. */
33*3b2bd0f6Slogwang #define	NG_PATCH_NODE_TYPE	"patch"
34*3b2bd0f6Slogwang 
35*3b2bd0f6Slogwang /* Node type cookie. */
36*3b2bd0f6Slogwang #define	NGM_PATCH_COOKIE	1262445509
37*3b2bd0f6Slogwang 
38*3b2bd0f6Slogwang /* Hook names */
39*3b2bd0f6Slogwang #define	NG_PATCH_HOOK_IN	"in"
40*3b2bd0f6Slogwang #define	NG_PATCH_HOOK_OUT	"out"
41*3b2bd0f6Slogwang 
42*3b2bd0f6Slogwang /* Netgraph commands understood by this node type */
43*3b2bd0f6Slogwang enum {
44*3b2bd0f6Slogwang 	NGM_PATCH_SETCONFIG = 1,
45*3b2bd0f6Slogwang 	NGM_PATCH_GETCONFIG,
46*3b2bd0f6Slogwang 	NGM_PATCH_GET_STATS,
47*3b2bd0f6Slogwang 	NGM_PATCH_CLR_STATS,
48*3b2bd0f6Slogwang 	NGM_PATCH_GETCLR_STATS
49*3b2bd0f6Slogwang };
50*3b2bd0f6Slogwang 
51*3b2bd0f6Slogwang /* Patching modes */
52*3b2bd0f6Slogwang enum {
53*3b2bd0f6Slogwang 	NG_PATCH_MODE_SET = 1,
54*3b2bd0f6Slogwang 	NG_PATCH_MODE_ADD = 2,
55*3b2bd0f6Slogwang 	NG_PATCH_MODE_SUB = 3,
56*3b2bd0f6Slogwang 	NG_PATCH_MODE_MUL = 4,
57*3b2bd0f6Slogwang 	NG_PATCH_MODE_DIV = 5,
58*3b2bd0f6Slogwang 	NG_PATCH_MODE_NEG = 6,
59*3b2bd0f6Slogwang 	NG_PATCH_MODE_AND = 7,
60*3b2bd0f6Slogwang 	NG_PATCH_MODE_OR = 8,
61*3b2bd0f6Slogwang 	NG_PATCH_MODE_XOR = 9,
62*3b2bd0f6Slogwang 	NG_PATCH_MODE_SHL = 10,
63*3b2bd0f6Slogwang 	NG_PATCH_MODE_SHR = 11
64*3b2bd0f6Slogwang };
65*3b2bd0f6Slogwang 
66*3b2bd0f6Slogwang struct ng_patch_op {
67*3b2bd0f6Slogwang 	uint64_t	value;
68*3b2bd0f6Slogwang 	uint32_t	offset;
69*3b2bd0f6Slogwang 	uint16_t	length;	/* 1,2,4 or 8 (bytes) */
70*3b2bd0f6Slogwang 	uint16_t	mode;
71*3b2bd0f6Slogwang };
72*3b2bd0f6Slogwang 
73*3b2bd0f6Slogwang #define	NG_PATCH_OP_TYPE_INFO	{	\
74*3b2bd0f6Slogwang 		{ "value",	&ng_parse_uint64_type	},	\
75*3b2bd0f6Slogwang 		{ "offset",	&ng_parse_uint32_type	},	\
76*3b2bd0f6Slogwang 		{ "length",	&ng_parse_uint16_type	},	\
77*3b2bd0f6Slogwang 		{ "mode",	&ng_parse_uint16_type	},	\
78*3b2bd0f6Slogwang 		{ NULL } \
79*3b2bd0f6Slogwang }
80*3b2bd0f6Slogwang 
81*3b2bd0f6Slogwang struct ng_patch_config {
82*3b2bd0f6Slogwang 	uint32_t	count;
83*3b2bd0f6Slogwang 	uint32_t	csum_flags;
84*3b2bd0f6Slogwang 	struct ng_patch_op ops[];
85*3b2bd0f6Slogwang };
86*3b2bd0f6Slogwang 
87*3b2bd0f6Slogwang #define	NG_PATCH_CONFIG_TYPE_INFO	{	\
88*3b2bd0f6Slogwang 		{ "count",	&ng_parse_uint32_type	},	\
89*3b2bd0f6Slogwang 		{ "csum_flags",	&ng_parse_uint32_type	},	\
90*3b2bd0f6Slogwang 		{ "ops",	&ng_patch_confarr_type	},	\
91*3b2bd0f6Slogwang 		{ NULL } \
92*3b2bd0f6Slogwang }
93*3b2bd0f6Slogwang 
94*3b2bd0f6Slogwang struct ng_patch_stats {
95*3b2bd0f6Slogwang 	uint64_t	received;
96*3b2bd0f6Slogwang 	uint64_t	patched;
97*3b2bd0f6Slogwang 	uint64_t	dropped;
98*3b2bd0f6Slogwang };
99*3b2bd0f6Slogwang 
100*3b2bd0f6Slogwang #define	NG_PATCH_STATS_TYPE_INFO {	\
101*3b2bd0f6Slogwang 		{ "received",	&ng_parse_uint64_type	},	\
102*3b2bd0f6Slogwang 		{ "patched",	&ng_parse_uint64_type	},	\
103*3b2bd0f6Slogwang 		{ "dropped",	&ng_parse_uint64_type	},	\
104*3b2bd0f6Slogwang 		{ NULL } \
105*3b2bd0f6Slogwang }
106*3b2bd0f6Slogwang 
107*3b2bd0f6Slogwang #endif /* _NETGRAPH_NG_PATCH_H_ */
108