1b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifndef _XTABLES_H
2b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define _XTABLES_H
3b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
4b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/*
5b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * Changing any structs/functions may incur a needed change
6b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * in libxtables_vcurrent/vage too.
7b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
8b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
9b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <sys/socket.h> /* PF_* */
10b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <sys/types.h>
11b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <limits.h>
12b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <stdbool.h>
13b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <stddef.h>
14b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <stdint.h>
15b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <netinet/in.h>
16b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <net/if.h>
17b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <linux/types.h>
18b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <linux/netfilter.h>
19b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#include <linux/netfilter/x_tables.h>
20b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
21b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifndef IPPROTO_SCTP
22b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define IPPROTO_SCTP 132
23b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
24b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifndef IPPROTO_DCCP
25b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define IPPROTO_DCCP 33
26b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
27b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifndef IPPROTO_MH
28b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	define IPPROTO_MH 135
29b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
30b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifndef IPPROTO_UDPLITE
31b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define IPPROTO_UDPLITE	136
32b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
33b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
34b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define XTABLES_VERSION "libxtables.so.6"
35b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define XTABLES_VERSION_CODE 6
36b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
37b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct in_addr;
38b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
39b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/*
40b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * .size is here so that there is a somewhat reasonable check
41b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * against the chosen .type.
42b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
43b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define XTOPT_POINTER(stype, member) \
44b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	.ptroff = offsetof(stype, member), \
45b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	.size = sizeof(((stype *)NULL)->member)
46b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define XTOPT_TABLEEND {.name = NULL}
47b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
48b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
49b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * Select the format the input has to conform to, as well as the target type
50b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * (area pointed to with XTOPT_POINTER). Note that the storing is not always
51b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * uniform. @cb->val will be populated with as much as there is space, i.e.
52b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * exactly 2 items for ranges, but the target area can receive more values
53b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * (e.g. in case of ranges), or less values (e.g. %XTTYPE_HOSTMASK).
54b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall *
55b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_NONE:	option takes no argument
56b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_UINT*:	standard integer
57b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_UINT*RC:	colon-separated range of standard integers
58b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_DOUBLE:	double-precision floating point number
59b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_STRING:	arbitrary string
60b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_TOSMASK:	8-bit TOS value with optional mask
61b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_MARKMASK32:	32-bit mark with optional mask
62b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_SYSLOGLEVEL:	syslog level by name or number
63b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_HOST:	one host or address (ptr: union nf_inet_addr)
64b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_HOSTMASK:	one host or address, with an optional prefix length
65b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * 			(ptr: union nf_inet_addr; only host portion is stored)
66b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_PROTOCOL:	protocol number/name from /etc/protocols (ptr: uint8_t)
678b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall * %XTTYPE_PORT:	16-bit port name or number (supports %XTOPT_NBO)
688b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall * %XTTYPE_PORTRC:	colon-separated port range (names acceptable),
698b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall * 			(supports %XTOPT_NBO)
70b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_PLEN:	prefix length
71b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_PLENMASK:	prefix length (ptr: union nf_inet_addr)
72b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTTYPE_ETHERMAC:	Ethernet MAC address in hex form
73b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
74b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallenum xt_option_type {
75b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_NONE,
76b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT8,
77b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT16,
78b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT32,
79b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT64,
80b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT8RC,
81b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT16RC,
82b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT32RC,
83b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_UINT64RC,
84b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_DOUBLE,
85b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_STRING,
86b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_TOSMASK,
87b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_MARKMASK32,
88b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_SYSLOGLEVEL,
89b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_HOST,
90b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_HOSTMASK,
91b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_PROTOCOL,
92b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_PORT,
93b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_PORTRC,
94b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_PLEN,
95b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_PLENMASK,
96b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTTYPE_ETHERMAC,
97b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
98b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
99b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
100b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTOPT_INVERT:	option is invertible (usable with !)
101b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTOPT_MAND:		option is mandatory
102b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTOPT_MULTI:	option may be specified multiple times
103b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * %XTOPT_PUT:		store value into memory at @ptroff
1048b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall * %XTOPT_NBO:		store value in network-byte order
1058b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall * 			(only certain XTTYPEs recognize this)
106b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
107b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallenum xt_option_flags {
108b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTOPT_INVERT = 1 << 0,
109b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTOPT_MAND   = 1 << 1,
110b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTOPT_MULTI  = 1 << 2,
111b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTOPT_PUT    = 1 << 3,
1128b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall	XTOPT_NBO    = 1 << 4,
113b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
114b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
115b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
116b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @name:	name of option
117b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @type:	type of input and validation method, see %XTTYPE_*
118b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @id:		unique number (within extension) for option, 0-31
119b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @excl:	bitmask of flags that cannot be used with this option
120b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @also:	bitmask of flags that must be used with this option
121b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @flags:	bitmask of option flags, see %XTOPT_*
122b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @ptroff:	offset into private structure for member
123b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @size:	size of the item pointed to by @ptroff; this is a safeguard
124b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @min:	lowest allowed value (for singular integral types)
125b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @max:	highest allowed value (for singular integral types)
126b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
127b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xt_option_entry {
128b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *name;
129b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	enum xt_option_type type;
130b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int id, excl, also, flags;
131b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int ptroff;
132b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	size_t size;
133b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int min, max;
134b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
135b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
136b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
137b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @arg:	input from command line
138b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @ext_name:	name of extension currently being processed
139b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @entry:	current option being processed
140b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @data:	per-extension data block
141b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @xflags:	options of the extension that have been used
142b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @invert:	whether option was used with !
143b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @nvals:	number of results in uXX_multi
144b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @val:	parsed result
145b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
146b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xt_option_call {
147b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *arg, *ext_name;
148b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const struct xt_option_entry *entry;
149b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void *data;
150b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int xflags;
151b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	bool invert;
152b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	uint8_t nvals;
153b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	union {
154b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		uint8_t u8, u8_range[2], syslog_level, protocol;
155b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		uint16_t u16, u16_range[2], port, port_range[2];
156b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		uint32_t u32, u32_range[2];
157b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		uint64_t u64, u64_range[2];
158b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		double dbl;
159b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		struct {
160b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall			union nf_inet_addr haddr, hmask;
161b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall			uint8_t hlen;
162b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		};
163b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		struct {
164b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall			uint8_t tos_value, tos_mask;
165b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		};
166b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		struct {
167b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall			uint32_t mark, mask;
168b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		};
169b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		uint8_t ethermac[6];
170b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	} val;
171b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Wished for a world where the ones below were gone: */
172b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	union {
173b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		struct xt_entry_match **match;
174b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		struct xt_entry_target **target;
175b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	};
176b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void *xt_entry;
177b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
178b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
179b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
180b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @ext_name:	name of extension currently being processed
181b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @data:	per-extension data block
182b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * @xflags:	options of the extension that have been used
183b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
184b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xt_fcheck_call {
185b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *ext_name;
186b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void *data;
187b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int xflags;
188b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
189b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
190b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
191b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * A "linear"/linked-list based name<->id map, for files similar to
192b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * /etc/iproute2/.
193b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
194b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_lmap {
195b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	char *name;
196b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	int id;
197b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xtables_lmap *next;
198b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
199b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
200b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/* Include file for additions: new matches and targets. */
201b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_match
202b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall{
203b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/*
204b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 * ABI/API version this module requires. Must be first member,
205b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 * as the rest of this struct may be subject to ABI changes.
206b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 */
207b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *version;
208b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
209b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xtables_match *next;
210b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
211b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *name;
212b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
213b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Revision of match (0 by default). */
214b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	u_int8_t revision;
215b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
216b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	u_int16_t family;
217b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
218b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Size of match data. */
219b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	size_t size;
220b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
221b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Size of match data relevent for userspace comparison purposes */
222b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	size_t userspacesize;
223b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
224b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Function which prints out usage message. */
225b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*help)(void);
226b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
227b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Initialize the match. */
228b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*init)(struct xt_entry_match *m);
229b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
230b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Function which parses command options; returns true if it
231b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall           ate an option */
232b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* entry is struct ipt_entry for example */
233b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	int (*parse)(int c, char **argv, int invert, unsigned int *flags,
234b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		     const void *entry,
235b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		     struct xt_entry_match **match);
236b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
237b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Final check; exit if not ok. */
238b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*final_check)(unsigned int flags);
239b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
240b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Prints out the match iff non-NULL: put space at end */
241b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* ip is struct ipt_ip * for example */
242b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*print)(const void *ip,
243b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		      const struct xt_entry_match *match, int numeric);
244b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
245b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Saves the match info in parsable form to stdout. */
246b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* ip is struct ipt_ip * for example */
247b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*save)(const void *ip, const struct xt_entry_match *match);
248b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
249b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Pointer to list of extra command-line options */
250b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const struct option *extra_opts;
251b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
252b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* New parser */
253b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*x6_parse)(struct xt_option_call *);
254b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*x6_fcheck)(struct xt_fcheck_call *);
255b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const struct xt_option_entry *x6_options;
256b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
257b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Ignore these men behind the curtain: */
258b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int option_offset;
259b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xt_entry_match *m;
260b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int mflags;
261b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int loaded; /* simulate loading so options are merged properly */
262b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
263b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
264b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_target
265b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall{
266b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/*
267b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 * ABI/API version this module requires. Must be first member,
268b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 * as the rest of this struct may be subject to ABI changes.
269b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	 */
270b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *version;
271b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
272b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xtables_target *next;
273b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
274b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
275b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *name;
276b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
277b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Revision of target (0 by default). */
278b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	u_int8_t revision;
279b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
280b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	u_int16_t family;
281b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
282b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
283b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Size of target data. */
284b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	size_t size;
285b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
286b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Size of target data relevent for userspace comparison purposes */
287b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	size_t userspacesize;
288b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
289b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Function which prints out usage message. */
290b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*help)(void);
291b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
292b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Initialize the target. */
293b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*init)(struct xt_entry_target *t);
294b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
295b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Function which parses command options; returns true if it
296b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall           ate an option */
297b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* entry is struct ipt_entry for example */
298b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	int (*parse)(int c, char **argv, int invert, unsigned int *flags,
299b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		     const void *entry,
300b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		     struct xt_entry_target **targetinfo);
301b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
302b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Final check; exit if not ok. */
303b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*final_check)(unsigned int flags);
304b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
305b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Prints out the target iff non-NULL: put space at end */
306b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*print)(const void *ip,
307b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		      const struct xt_entry_target *target, int numeric);
308b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
309b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Saves the targinfo in parsable form to stdout. */
310b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*save)(const void *ip,
311b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall		     const struct xt_entry_target *target);
312b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
313b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Pointer to list of extra command-line options */
314b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const struct option *extra_opts;
315b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
316b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* New parser */
317b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*x6_parse)(struct xt_option_call *);
318b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*x6_fcheck)(struct xt_fcheck_call *);
319b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const struct xt_option_entry *x6_options;
320b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
321b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Ignore these men behind the curtain: */
322b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int option_offset;
323b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xt_entry_target *t;
324b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int tflags;
325b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int used;
326b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int loaded; /* simulate loading so options are merged properly */
327b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
328b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
329b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_rule_match {
330b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xtables_rule_match *next;
331b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct xtables_match *match;
332b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	/* Multiple matches of the same type: the ones before
333b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	   the current one are completed from parsing point of view */
334b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	bool completed;
335b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
336b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
337b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
338b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * struct xtables_pprot -
339b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall *
340b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * A few hardcoded protocols for 'all' and in case the user has no
341b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * /etc/protocols.
342b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
343b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_pprot {
344b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *name;
345b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	u_int8_t num;
346b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
347b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
348b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallenum xtables_tryload {
349b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_DONT_LOAD,
350b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_DURING_LOAD,
351b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_TRY_LOAD,
352b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_LOAD_MUST_SUCCEED,
353b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
354b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
355b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallenum xtables_exittype {
356b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	OTHER_PROBLEM = 1,
357b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	PARAMETER_PROBLEM,
358b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	VERSION_PROBLEM,
359b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	RESOURCE_PROBLEM,
360b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_ONLY_ONCE,
361b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_NO_INVERT,
362b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_BAD_VALUE,
363b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	XTF_ONE_ACTION,
364b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
365b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
366b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallstruct xtables_globals
367b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall{
368b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int option_offset;
369b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	const char *program_name, *program_version;
370b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct option *orig_opts;
371b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct option *opts;
372b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	void (*exit_err)(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
373b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall};
374b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
375b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define XT_GETOPT_TABLEEND {.name = NULL, .has_arg = false}
376b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
377b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifdef __cplusplus
378b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern "C" {
379b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
380b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
381b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_modprobe_program;
382b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_match *xtables_matches;
383b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_target *xtables_targets;
384b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
385b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_init(void);
386b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_set_nfproto(uint8_t);
387b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void *xtables_calloc(size_t, size_t);
388b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void *xtables_malloc(size_t);
389b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void *xtables_realloc(void *, size_t);
390b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
391b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_insmod(const char *, const char *, bool);
392b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_load_ko(const char *, bool);
393b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_set_params(struct xtables_globals *xtp);
394b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_free_opts(int reset_offset);
395b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct option *xtables_merge_options(struct option *origopts,
396b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct option *oldopts, const struct option *newopts,
397b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int *option_offset);
398b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
399b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto);
400b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_match *xtables_find_match(const char *name,
401b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	enum xtables_tryload, struct xtables_rule_match **match);
402b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_target *xtables_find_target(const char *name,
403b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	enum xtables_tryload);
404b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
405b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/* Your shared library should call one of these. */
406b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_register_match(struct xtables_match *me);
407b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_register_matches(struct xtables_match *, unsigned int);
408b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_register_target(struct xtables_target *me);
409b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_register_targets(struct xtables_target *, unsigned int);
410b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
4118b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrallextern bool xtables_strtoul(const char *, char **, uintmax_t *,
4128b4807f0a1d98f1d980d3d616ad565c9b72d7c49JP Abgrall	uintmax_t, uintmax_t);
413b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern bool xtables_strtoui(const char *, char **, unsigned int *,
414b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	unsigned int, unsigned int);
415b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_service_to_port(const char *name, const char *proto);
416b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern u_int16_t xtables_parse_port(const char *port, const char *proto);
417b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void
418b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallxtables_parse_interface(const char *arg, char *vianame, unsigned char *mask);
419b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
420b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/* this is a special 64bit data type that is 8-byte aligned */
421b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define aligned_u64 u_int64_t __attribute__((aligned(8)))
422b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
423b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallint xtables_check_inverse(const char option[], int *invert,
424b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	int *my_optind, int argc, char **argv);
425b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_globals *xt_params;
426b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#define xtables_error (xt_params->exit_err)
427b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
428b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_param_act(unsigned int, const char *, ...);
429b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
430b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ipaddr_to_numeric(const struct in_addr *);
431b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ipaddr_to_anyname(const struct in_addr *);
432b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ipmask_to_numeric(const struct in_addr *);
433b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct in_addr *xtables_numeric_to_ipaddr(const char *);
434b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct in_addr *xtables_numeric_to_ipmask(const char *);
435b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_ipparse_any(const char *, struct in_addr **,
436b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct in_addr *, unsigned int *);
437b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_ipparse_multiple(const char *, struct in_addr **,
438b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct in_addr **, unsigned int *);
439b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
440b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct in6_addr *xtables_numeric_to_ip6addr(const char *);
441b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ip6addr_to_numeric(const struct in6_addr *);
442b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ip6addr_to_anyname(const struct in6_addr *);
443b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_ip6mask_to_numeric(const struct in6_addr *);
444b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_ip6parse_any(const char *, struct in6_addr **,
445b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct in6_addr *, unsigned int *);
446b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_ip6parse_multiple(const char *, struct in6_addr **,
447b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	struct in6_addr **, unsigned int *);
448b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
449b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/**
450b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * Print the specified value to standard output, quoting dangerous
451b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall * characters if required.
452b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall */
453b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_save_string(const char *value);
454b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
455b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#if defined(ALL_INCLUSIVE) || defined(NO_SHARED_LIBS)
456b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	ifdef _INIT
457b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#		undef _init
458b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#		define _init _INIT
459b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	endif
460b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	extern void init_extensions(void);
461b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	extern void init_extensions4(void);
462b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall	extern void init_extensions6(void);
463b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#else
464b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	define _init __attribute__((constructor)) _INIT
465b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
466b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
467b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const struct xtables_pprot xtables_chain_protos[];
468b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern u_int16_t xtables_parse_protocol(const char *s);
469b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
470b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/* xtoptions.c */
471b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_metavalidate(const char *,
472b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall					const struct xt_option_entry *);
473b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct option *xtables_options_xfrm(struct option *, struct option *,
474b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall					   const struct xt_option_entry *,
475b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall					   unsigned int *);
476b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_parse(struct xt_option_call *);
477b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_tpcall(unsigned int, char **, bool,
478b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall				  struct xtables_target *, void *);
479b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_mpcall(unsigned int, char **, bool,
480b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall				  struct xtables_match *, void *);
481b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_tfcall(struct xtables_target *);
482b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_option_mfcall(struct xtables_match *);
483b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_options_fcheck(const char *, unsigned int,
484b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall				   const struct xt_option_entry *);
485b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
486b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern struct xtables_lmap *xtables_lmap_init(const char *);
487b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void xtables_lmap_free(struct xtables_lmap *);
488b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern int xtables_lmap_name2id(const struct xtables_lmap *, const char *);
489b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern const char *xtables_lmap_id2name(const struct xtables_lmap *, int);
490b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
491b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifdef XTABLES_INTERNAL
492b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
493b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall/* Shipped modules rely on this... */
494b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
495b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	ifndef ARRAY_SIZE
496b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#		define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
497b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#	endif
498b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
499b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrallextern void _init(void);
500b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
501b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
502b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
503b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#ifdef __cplusplus
504b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall} /* extern "C" */
505b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif
506b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall
507b3d101788ebac83cdf7aa71f78069cf1af4a748dJP Abgrall#endif /* _XTABLES_H */
508