nft.h 8.62 KB
Newer Older
1
2
3
4
5
#ifndef _NFT_H_
#define _NFT_H_

#include "xshared.h"
#include "nft-shared.h"
6
#include "nft-cache.h"
7
#include "nft-chain.h"
8
#include "nft-cmd.h"
9
10
#include <libiptc/linux_list.h>

11
enum nft_table_type {
12
	NFT_TABLE_MANGLE	= 0,
13
	NFT_TABLE_SECURITY,
14
15
	NFT_TABLE_RAW,
	NFT_TABLE_FILTER,
16
17
18
	NFT_TABLE_NAT,
};
#define NFT_TABLE_MAX	(NFT_TABLE_NAT + 1)
19
20
21
22
23
24
25
26
27
28

struct builtin_chain {
	const char *name;
	const char *type;
	uint32_t prio;
	uint32_t hook;
};

struct builtin_table {
	const char *name;
29
	enum nft_table_type type;
30
	struct builtin_chain chains[NF_INET_NUMHOOKS];
31
32
};

33
34
35
36
enum nft_cache_level {
	NFT_CL_TABLES,
	NFT_CL_CHAINS,
	NFT_CL_SETS,
37
38
	NFT_CL_RULES,
	NFT_CL_FAKE	/* must be last entry */
39
40
};

41
42
struct nft_cache {
	struct {
43
44
		struct nft_chain	*base_chains[NF_INET_NUMHOOKS];
		struct nft_chain_list	*chains;
45
		struct nftnl_set_list	*sets;
46
		bool			exists;
47
	} table[NFT_TABLE_MAX];
48
49
};

50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
enum obj_update_type {
	NFT_COMPAT_TABLE_ADD,
	NFT_COMPAT_TABLE_FLUSH,
	NFT_COMPAT_CHAIN_ADD,
	NFT_COMPAT_CHAIN_USER_ADD,
	NFT_COMPAT_CHAIN_USER_DEL,
	NFT_COMPAT_CHAIN_USER_FLUSH,
	NFT_COMPAT_CHAIN_UPDATE,
	NFT_COMPAT_CHAIN_RENAME,
	NFT_COMPAT_CHAIN_ZERO,
	NFT_COMPAT_RULE_APPEND,
	NFT_COMPAT_RULE_INSERT,
	NFT_COMPAT_RULE_REPLACE,
	NFT_COMPAT_RULE_DELETE,
	NFT_COMPAT_RULE_FLUSH,
	NFT_COMPAT_SET_ADD,
	NFT_COMPAT_RULE_LIST,
	NFT_COMPAT_RULE_CHECK,
	NFT_COMPAT_CHAIN_RESTORE,
	NFT_COMPAT_RULE_SAVE,
	NFT_COMPAT_RULE_ZERO,
	NFT_COMPAT_BRIDGE_USER_CHAIN_UPDATE,
};

struct cache_chain {
	struct list_head head;
	char *name;
};

struct nft_cache_req {
	enum nft_cache_level	level;
	char			*table;
	bool			all_chains;
	struct list_head	chain_list;
};

86
87
88
struct nft_handle {
	int			family;
	struct mnl_socket	*nl;
89
90
	int			nlsndbuffsiz;
	int			nlrcvbuffsiz;
91
92
	uint32_t		portid;
	uint32_t		seq;
93
94
	uint32_t		nft_genid;
	uint32_t		rule_id;
95
96
	struct list_head	obj_list;
	int			obj_list_num;
97
98
	struct nftnl_batch	*batch;
	struct list_head	err_list;
99
	struct nft_family_ops	*ops;
100
101
102
103
	const struct builtin_table *tables;
	unsigned int		cache_index;
	struct nft_cache	__cache[2];
	struct nft_cache	*cache;
104
	struct nft_cache_req	cache_req;
105
	bool			restore;
106
	bool			noflush;
107
	int8_t			config_done;
108
109
	struct list_head	cmd_list;
	bool			cache_init;
110
111
112
113
114

	/* meta data, for error reporting */
	struct {
		unsigned int	lineno;
	} error;
115
116
};

117
118
119
extern const struct builtin_table xtables_ipv4[NFT_TABLE_MAX];
extern const struct builtin_table xtables_arp[NFT_TABLE_MAX];
extern const struct builtin_table xtables_bridge[NFT_TABLE_MAX];
120
121
122
123

int mnl_talk(struct nft_handle *h, struct nlmsghdr *nlh,
	     int (*cb)(const struct nlmsghdr *nlh, void *data),
	     void *data);
124
int nft_init(struct nft_handle *h, int family, const struct builtin_table *t);
125
void nft_fini(struct nft_handle *h);
126
int nft_restart(struct nft_handle *h);
127
128
129
130
131
132
133

/*
 * Operations with tables.
 */
struct nftnl_table;
struct nftnl_chain_list;

134
int nft_for_each_table(struct nft_handle *h, int (*func)(struct nft_handle *h, const char *tablename, void *data), void *data);
135
136
bool nft_table_find(struct nft_handle *h, const char *tablename);
int nft_table_purge_chains(struct nft_handle *h, const char *table, struct nftnl_chain_list *list);
137
int nft_table_flush(struct nft_handle *h, const char *table);
138
const struct builtin_table *nft_table_builtin_find(struct nft_handle *h, const char *table);
139
int nft_xt_fake_builtin_chains(struct nft_handle *h, const char *table, const char *chain);
140
141
142
143
144
145
146

/*
 * Operations with chains.
 */
struct nftnl_chain;

int nft_chain_set(struct nft_handle *h, const char *table, const char *chain, const char *policy, const struct xt_counters *counters);
147
int nft_chain_save(struct nft_chain *c, void *data);
148
int nft_chain_user_add(struct nft_handle *h, const char *chain, const char *table);
149
int nft_chain_user_del(struct nft_handle *h, const char *chain, const char *table, bool verbose);
150
int nft_chain_restore(struct nft_handle *h, const char *chain, const char *table);
151
int nft_chain_user_rename(struct nft_handle *h, const char *chain, const char *table, const char *newname);
152
int nft_chain_zero_counters(struct nft_handle *h, const char *chain, const char *table, bool verbose);
153
const struct builtin_chain *nft_chain_builtin_find(const struct builtin_table *t, const char *chain);
154
bool nft_chain_exists(struct nft_handle *h, const char *table, const char *chain);
155
156
void nft_bridge_chain_postprocess(struct nft_handle *h,
				  struct nftnl_chain *c);
157
158
159
int nft_chain_foreach(struct nft_handle *h, const char *table,
		      int (*cb)(struct nft_chain *c, void *data),
		      void *data);
160

161

162
163
164
165
166
167
/*
 * Operations with sets.
 */
struct nftnl_set *nft_set_batch_lookup_byid(struct nft_handle *h,
					    uint32_t set_id);

168
169
170
171
172
/*
 * Operations with rule-set.
 */
struct nftnl_rule;

173
174
175
176
177
struct nftnl_rule *nft_rule_new(struct nft_handle *h, const char *chain, const char *table, void *data);
int nft_rule_append(struct nft_handle *h, const char *chain, const char *table, struct nftnl_rule *r, struct nftnl_rule *ref, bool verbose);
int nft_rule_insert(struct nft_handle *h, const char *chain, const char *table, struct nftnl_rule *r, int rulenum, bool verbose);
int nft_rule_check(struct nft_handle *h, const char *chain, const char *table, struct nftnl_rule *r, bool verbose);
int nft_rule_delete(struct nft_handle *h, const char *chain, const char *table, struct nftnl_rule *r, bool verbose);
178
int nft_rule_delete_num(struct nft_handle *h, const char *chain, const char *table, int rulenum, bool verbose);
179
int nft_rule_replace(struct nft_handle *h, const char *chain, const char *table, struct nftnl_rule *r, int rulenum, bool verbose);
180
181
int nft_rule_list(struct nft_handle *h, const char *chain, const char *table, int rulenum, unsigned int format);
int nft_rule_list_save(struct nft_handle *h, const char *chain, const char *table, int rulenum, int counters);
182
183
int nft_rule_save(struct nft_handle *h, const char *table, unsigned int format);
int nft_rule_flush(struct nft_handle *h, const char *chain, const char *table, bool verbose);
184
185
186
187
188
189
190
int nft_rule_zero_counters(struct nft_handle *h, const char *chain, const char *table, int rulenum);

/*
 * Operations used in userspace tools
 */
int add_counters(struct nftnl_rule *r, uint64_t packets, uint64_t bytes);
int add_verdict(struct nftnl_rule *r, int verdict);
191
int add_match(struct nft_handle *h, struct nftnl_rule *r, struct xt_entry_match *m);
192
193
194
int add_target(struct nftnl_rule *r, struct xt_entry_target *t);
int add_jumpto(struct nftnl_rule *r, const char *name, int verdict);
int add_action(struct nftnl_rule *r, struct iptables_command_state *cs, bool goto_set);
195
char *get_comment(const void *data, uint32_t data_len);
196
197
198
199
200
201

enum nft_rule_print {
	NFT_RULE_APPEND,
	NFT_RULE_DEL,
};

202
203
void nft_rule_print_save(struct nft_handle *h, const struct nftnl_rule *r,
			 enum nft_rule_print type, unsigned int format);
204
205
206
207
208
209
210

uint32_t nft_invflags2cmp(uint32_t invflags, uint32_t flag);

/*
 * global commit and abort
 */
int nft_commit(struct nft_handle *h);
211
int nft_bridge_commit(struct nft_handle *h);
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
int nft_abort(struct nft_handle *h);

/*
 * revision compatibility.
 */
int nft_compatible_revision(const char *name, uint8_t rev, int opt);

/*
 * Error reporting.
 */
const char *nft_strerror(int err);

/* For xtables.c */
int do_commandx(struct nft_handle *h, int argc, char *argv[], char **table, bool restore);
/* For xtables-arptables.c */
227
228
int nft_init_arp(struct nft_handle *h, const char *pname);
int do_commandarp(struct nft_handle *h, int argc, char *argv[], char **table, bool restore);
229
/* For xtables-eb.c */
230
int nft_init_eb(struct nft_handle *h, const char *pname);
231
void nft_fini_eb(struct nft_handle *h);
232
233
int ebt_get_current_chain(const char *chain);
int do_commandeb(struct nft_handle *h, int argc, char *argv[], char **table, bool restore);
234

235
236
237
238
239
240
241
242
243
244
245
246
/*
 * Translation from iptables to nft
 */
struct xt_buf;

bool xlate_find_match(const struct iptables_command_state *cs, const char *p_name);
int xlate_matches(const struct iptables_command_state *cs, struct xt_xlate *xl);
int xlate_action(const struct iptables_command_state *cs, bool goto_set,
		 struct xt_xlate *xl);
void xlate_ifname(struct xt_xlate *xl, const char *nftmeta, const char *ifname,
		  bool invert);

247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/*
 * ARP
 */

struct arpt_entry;

int nft_arp_rule_append(struct nft_handle *h, const char *chain,
			const char *table, struct arpt_entry *fw,
			bool verbose);
int nft_arp_rule_insert(struct nft_handle *h, const char *chain,
			const char *table, struct arpt_entry *fw,
			int rulenum, bool verbose);

void nft_rule_to_arpt_entry(struct nftnl_rule *r, struct arpt_entry *fw);

262
263
264
265
bool nft_is_table_compatible(struct nft_handle *h,
			     const char *table, const char *chain);
void nft_assert_table_compatible(struct nft_handle *h,
				 const char *table, const char *chain);
266

267
268
269
int ebt_set_user_chain_policy(struct nft_handle *h, const char *table,
			      const char *chain, const char *policy);

270
#endif