• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * Development of this code funded by Astaro AG (http://www.astaro.com/)
9  */
10 
11 #include <linux/module.h>
12 #include <linux/init.h>
13 #include <linux/list.h>
14 #include <linux/skbuff.h>
15 #include <linux/netlink.h>
16 #include <linux/netfilter.h>
17 #include <linux/netfilter/nfnetlink.h>
18 #include <linux/netfilter/nf_tables.h>
19 #include <net/netfilter/nf_tables_core.h>
20 #include <net/netfilter/nf_tables.h>
21 #include <net/net_namespace.h>
22 #include <net/sock.h>
23 
24 static LIST_HEAD(nf_tables_expressions);
25 
26 /**
27  *	nft_register_afinfo - register nf_tables address family info
28  *
29  *	@afi: address family info to register
30  *
31  *	Register the address family for use with nf_tables. Returns zero on
32  *	success or a negative errno code otherwise.
33  */
nft_register_afinfo(struct net * net,struct nft_af_info * afi)34 int nft_register_afinfo(struct net *net, struct nft_af_info *afi)
35 {
36 	INIT_LIST_HEAD(&afi->tables);
37 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
38 	list_add_tail_rcu(&afi->list, &net->nft.af_info);
39 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
40 	return 0;
41 }
42 EXPORT_SYMBOL_GPL(nft_register_afinfo);
43 
44 static void __nft_release_afinfo(struct net *net, struct nft_af_info *afi);
45 
46 /**
47  *	nft_unregister_afinfo - unregister nf_tables address family info
48  *
49  *	@afi: address family info to unregister
50  *
51  *	Unregister the address family for use with nf_tables.
52  */
nft_unregister_afinfo(struct net * net,struct nft_af_info * afi)53 void nft_unregister_afinfo(struct net *net, struct nft_af_info *afi)
54 {
55 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
56 	__nft_release_afinfo(net, afi);
57 	list_del_rcu(&afi->list);
58 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
59 }
60 EXPORT_SYMBOL_GPL(nft_unregister_afinfo);
61 
nft_afinfo_lookup(struct net * net,int family)62 static struct nft_af_info *nft_afinfo_lookup(struct net *net, int family)
63 {
64 	struct nft_af_info *afi;
65 
66 	list_for_each_entry(afi, &net->nft.af_info, list) {
67 		if (afi->family == family)
68 			return afi;
69 	}
70 	return NULL;
71 }
72 
73 static struct nft_af_info *
nf_tables_afinfo_lookup(struct net * net,int family,bool autoload)74 nf_tables_afinfo_lookup(struct net *net, int family, bool autoload)
75 {
76 	struct nft_af_info *afi;
77 
78 	afi = nft_afinfo_lookup(net, family);
79 	if (afi != NULL)
80 		return afi;
81 #ifdef CONFIG_MODULES
82 	if (autoload) {
83 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
84 		request_module("nft-afinfo-%u", family);
85 		nfnl_lock(NFNL_SUBSYS_NFTABLES);
86 		afi = nft_afinfo_lookup(net, family);
87 		if (afi != NULL)
88 			return ERR_PTR(-EAGAIN);
89 	}
90 #endif
91 	return ERR_PTR(-EAFNOSUPPORT);
92 }
93 
nft_ctx_init(struct nft_ctx * ctx,struct net * net,const struct sk_buff * skb,const struct nlmsghdr * nlh,struct nft_af_info * afi,struct nft_table * table,struct nft_chain * chain,const struct nlattr * const * nla)94 static void nft_ctx_init(struct nft_ctx *ctx,
95 			 struct net *net,
96 			 const struct sk_buff *skb,
97 			 const struct nlmsghdr *nlh,
98 			 struct nft_af_info *afi,
99 			 struct nft_table *table,
100 			 struct nft_chain *chain,
101 			 const struct nlattr * const *nla)
102 {
103 	ctx->net	= net;
104 	ctx->afi	= afi;
105 	ctx->table	= table;
106 	ctx->chain	= chain;
107 	ctx->nla   	= nla;
108 	ctx->portid	= NETLINK_CB(skb).portid;
109 	ctx->report	= nlmsg_report(nlh);
110 	ctx->seq	= nlh->nlmsg_seq;
111 }
112 
nft_trans_alloc(struct nft_ctx * ctx,int msg_type,u32 size)113 static struct nft_trans *nft_trans_alloc(struct nft_ctx *ctx, int msg_type,
114 					 u32 size)
115 {
116 	struct nft_trans *trans;
117 
118 	trans = kzalloc(sizeof(struct nft_trans) + size, GFP_KERNEL);
119 	if (trans == NULL)
120 		return NULL;
121 
122 	trans->msg_type = msg_type;
123 	trans->ctx	= *ctx;
124 
125 	return trans;
126 }
127 
nft_trans_destroy(struct nft_trans * trans)128 static void nft_trans_destroy(struct nft_trans *trans)
129 {
130 	list_del(&trans->list);
131 	kfree(trans);
132 }
133 
nf_tables_register_hooks(struct net * net,const struct nft_table * table,struct nft_chain * chain,unsigned int hook_nops)134 static int nf_tables_register_hooks(struct net *net,
135 				    const struct nft_table *table,
136 				    struct nft_chain *chain,
137 				    unsigned int hook_nops)
138 {
139 	if (table->flags & NFT_TABLE_F_DORMANT ||
140 	    !(chain->flags & NFT_BASE_CHAIN))
141 		return 0;
142 
143 	return nf_register_net_hooks(net, nft_base_chain(chain)->ops,
144 				     hook_nops);
145 }
146 
nf_tables_unregister_hooks(struct net * net,const struct nft_table * table,struct nft_chain * chain,unsigned int hook_nops)147 static void nf_tables_unregister_hooks(struct net *net,
148 				       const struct nft_table *table,
149 				       struct nft_chain *chain,
150 				       unsigned int hook_nops)
151 {
152 	if (table->flags & NFT_TABLE_F_DORMANT ||
153 	    !(chain->flags & NFT_BASE_CHAIN))
154 		return;
155 
156 	nf_unregister_net_hooks(net, nft_base_chain(chain)->ops, hook_nops);
157 }
158 
nft_trans_table_add(struct nft_ctx * ctx,int msg_type)159 static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type)
160 {
161 	struct nft_trans *trans;
162 
163 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_table));
164 	if (trans == NULL)
165 		return -ENOMEM;
166 
167 	if (msg_type == NFT_MSG_NEWTABLE)
168 		nft_activate_next(ctx->net, ctx->table);
169 
170 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
171 	return 0;
172 }
173 
nft_deltable(struct nft_ctx * ctx)174 static int nft_deltable(struct nft_ctx *ctx)
175 {
176 	int err;
177 
178 	err = nft_trans_table_add(ctx, NFT_MSG_DELTABLE);
179 	if (err < 0)
180 		return err;
181 
182 	nft_deactivate_next(ctx->net, ctx->table);
183 	return err;
184 }
185 
nft_trans_chain_add(struct nft_ctx * ctx,int msg_type)186 static int nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
187 {
188 	struct nft_trans *trans;
189 
190 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_chain));
191 	if (trans == NULL)
192 		return -ENOMEM;
193 
194 	if (msg_type == NFT_MSG_NEWCHAIN)
195 		nft_activate_next(ctx->net, ctx->chain);
196 
197 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
198 	return 0;
199 }
200 
nft_delchain(struct nft_ctx * ctx)201 static int nft_delchain(struct nft_ctx *ctx)
202 {
203 	int err;
204 
205 	err = nft_trans_chain_add(ctx, NFT_MSG_DELCHAIN);
206 	if (err < 0)
207 		return err;
208 
209 	ctx->table->use--;
210 	nft_deactivate_next(ctx->net, ctx->chain);
211 
212 	return err;
213 }
214 
215 static int
nf_tables_delrule_deactivate(struct nft_ctx * ctx,struct nft_rule * rule)216 nf_tables_delrule_deactivate(struct nft_ctx *ctx, struct nft_rule *rule)
217 {
218 	/* You cannot delete the same rule twice */
219 	if (nft_is_active_next(ctx->net, rule)) {
220 		nft_deactivate_next(ctx->net, rule);
221 		ctx->chain->use--;
222 		return 0;
223 	}
224 	return -ENOENT;
225 }
226 
nft_trans_rule_add(struct nft_ctx * ctx,int msg_type,struct nft_rule * rule)227 static struct nft_trans *nft_trans_rule_add(struct nft_ctx *ctx, int msg_type,
228 					    struct nft_rule *rule)
229 {
230 	struct nft_trans *trans;
231 
232 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_rule));
233 	if (trans == NULL)
234 		return NULL;
235 
236 	nft_trans_rule(trans) = rule;
237 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
238 
239 	return trans;
240 }
241 
nft_delrule(struct nft_ctx * ctx,struct nft_rule * rule)242 static int nft_delrule(struct nft_ctx *ctx, struct nft_rule *rule)
243 {
244 	struct nft_trans *trans;
245 	int err;
246 
247 	trans = nft_trans_rule_add(ctx, NFT_MSG_DELRULE, rule);
248 	if (trans == NULL)
249 		return -ENOMEM;
250 
251 	err = nf_tables_delrule_deactivate(ctx, rule);
252 	if (err < 0) {
253 		nft_trans_destroy(trans);
254 		return err;
255 	}
256 
257 	return 0;
258 }
259 
nft_delrule_by_chain(struct nft_ctx * ctx)260 static int nft_delrule_by_chain(struct nft_ctx *ctx)
261 {
262 	struct nft_rule *rule;
263 	int err;
264 
265 	list_for_each_entry(rule, &ctx->chain->rules, list) {
266 		err = nft_delrule(ctx, rule);
267 		if (err < 0)
268 			return err;
269 	}
270 	return 0;
271 }
272 
nft_trans_set_add(struct nft_ctx * ctx,int msg_type,struct nft_set * set)273 static int nft_trans_set_add(struct nft_ctx *ctx, int msg_type,
274 			     struct nft_set *set)
275 {
276 	struct nft_trans *trans;
277 
278 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_set));
279 	if (trans == NULL)
280 		return -ENOMEM;
281 
282 	if (msg_type == NFT_MSG_NEWSET && ctx->nla[NFTA_SET_ID] != NULL) {
283 		nft_trans_set_id(trans) =
284 			ntohl(nla_get_be32(ctx->nla[NFTA_SET_ID]));
285 		nft_activate_next(ctx->net, set);
286 	}
287 	nft_trans_set(trans) = set;
288 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
289 
290 	return 0;
291 }
292 
nft_delset(struct nft_ctx * ctx,struct nft_set * set)293 static int nft_delset(struct nft_ctx *ctx, struct nft_set *set)
294 {
295 	int err;
296 
297 	err = nft_trans_set_add(ctx, NFT_MSG_DELSET, set);
298 	if (err < 0)
299 		return err;
300 
301 	nft_deactivate_next(ctx->net, set);
302 	ctx->table->use--;
303 
304 	return err;
305 }
306 
307 /*
308  * Tables
309  */
310 
nft_table_lookup(const struct nft_af_info * afi,const struct nlattr * nla,u8 genmask)311 static struct nft_table *nft_table_lookup(const struct nft_af_info *afi,
312 					  const struct nlattr *nla,
313 					  u8 genmask)
314 {
315 	struct nft_table *table;
316 
317 	list_for_each_entry(table, &afi->tables, list) {
318 		if (!nla_strcmp(nla, table->name) &&
319 		    nft_active_genmask(table, genmask))
320 			return table;
321 	}
322 	return NULL;
323 }
324 
nf_tables_table_lookup(const struct nft_af_info * afi,const struct nlattr * nla,u8 genmask)325 static struct nft_table *nf_tables_table_lookup(const struct nft_af_info *afi,
326 						const struct nlattr *nla,
327 						u8 genmask)
328 {
329 	struct nft_table *table;
330 
331 	if (nla == NULL)
332 		return ERR_PTR(-EINVAL);
333 
334 	table = nft_table_lookup(afi, nla, genmask);
335 	if (table != NULL)
336 		return table;
337 
338 	return ERR_PTR(-ENOENT);
339 }
340 
nf_tables_alloc_handle(struct nft_table * table)341 static inline u64 nf_tables_alloc_handle(struct nft_table *table)
342 {
343 	return ++table->hgenerator;
344 }
345 
346 static const struct nf_chain_type *chain_type[AF_MAX][NFT_CHAIN_T_MAX];
347 
348 static const struct nf_chain_type *
__nf_tables_chain_type_lookup(int family,const struct nlattr * nla)349 __nf_tables_chain_type_lookup(int family, const struct nlattr *nla)
350 {
351 	int i;
352 
353 	for (i = 0; i < NFT_CHAIN_T_MAX; i++) {
354 		if (chain_type[family][i] != NULL &&
355 		    !nla_strcmp(nla, chain_type[family][i]->name))
356 			return chain_type[family][i];
357 	}
358 	return NULL;
359 }
360 
361 static const struct nf_chain_type *
nf_tables_chain_type_lookup(const struct nft_af_info * afi,const struct nlattr * nla,bool autoload)362 nf_tables_chain_type_lookup(const struct nft_af_info *afi,
363 			    const struct nlattr *nla,
364 			    bool autoload)
365 {
366 	const struct nf_chain_type *type;
367 
368 	type = __nf_tables_chain_type_lookup(afi->family, nla);
369 	if (type != NULL)
370 		return type;
371 #ifdef CONFIG_MODULES
372 	if (autoload) {
373 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
374 		request_module("nft-chain-%u-%.*s", afi->family,
375 			       nla_len(nla), (const char *)nla_data(nla));
376 		nfnl_lock(NFNL_SUBSYS_NFTABLES);
377 		type = __nf_tables_chain_type_lookup(afi->family, nla);
378 		if (type != NULL)
379 			return ERR_PTR(-EAGAIN);
380 	}
381 #endif
382 	return ERR_PTR(-ENOENT);
383 }
384 
385 static const struct nla_policy nft_table_policy[NFTA_TABLE_MAX + 1] = {
386 	[NFTA_TABLE_NAME]	= { .type = NLA_STRING,
387 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
388 	[NFTA_TABLE_FLAGS]	= { .type = NLA_U32 },
389 };
390 
nf_tables_fill_table_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table)391 static int nf_tables_fill_table_info(struct sk_buff *skb, struct net *net,
392 				     u32 portid, u32 seq, int event, u32 flags,
393 				     int family, const struct nft_table *table)
394 {
395 	struct nlmsghdr *nlh;
396 	struct nfgenmsg *nfmsg;
397 
398 	event |= NFNL_SUBSYS_NFTABLES << 8;
399 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
400 	if (nlh == NULL)
401 		goto nla_put_failure;
402 
403 	nfmsg = nlmsg_data(nlh);
404 	nfmsg->nfgen_family	= family;
405 	nfmsg->version		= NFNETLINK_V0;
406 	nfmsg->res_id		= htons(net->nft.base_seq & 0xffff);
407 
408 	if (nla_put_string(skb, NFTA_TABLE_NAME, table->name) ||
409 	    nla_put_be32(skb, NFTA_TABLE_FLAGS, htonl(table->flags)) ||
410 	    nla_put_be32(skb, NFTA_TABLE_USE, htonl(table->use)))
411 		goto nla_put_failure;
412 
413 	nlmsg_end(skb, nlh);
414 	return 0;
415 
416 nla_put_failure:
417 	nlmsg_trim(skb, nlh);
418 	return -1;
419 }
420 
nf_tables_table_notify(const struct nft_ctx * ctx,int event)421 static int nf_tables_table_notify(const struct nft_ctx *ctx, int event)
422 {
423 	struct sk_buff *skb;
424 	int err;
425 
426 	if (!ctx->report &&
427 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
428 		return 0;
429 
430 	err = -ENOBUFS;
431 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
432 	if (skb == NULL)
433 		goto err;
434 
435 	err = nf_tables_fill_table_info(skb, ctx->net, ctx->portid, ctx->seq,
436 					event, 0, ctx->afi->family, ctx->table);
437 	if (err < 0) {
438 		kfree_skb(skb);
439 		goto err;
440 	}
441 
442 	err = nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
443 			     ctx->report, GFP_KERNEL);
444 err:
445 	if (err < 0) {
446 		nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES,
447 				  err);
448 	}
449 	return err;
450 }
451 
nf_tables_dump_tables(struct sk_buff * skb,struct netlink_callback * cb)452 static int nf_tables_dump_tables(struct sk_buff *skb,
453 				 struct netlink_callback *cb)
454 {
455 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
456 	const struct nft_af_info *afi;
457 	const struct nft_table *table;
458 	unsigned int idx = 0, s_idx = cb->args[0];
459 	struct net *net = sock_net(skb->sk);
460 	int family = nfmsg->nfgen_family;
461 
462 	rcu_read_lock();
463 	cb->seq = net->nft.base_seq;
464 
465 	list_for_each_entry_rcu(afi, &net->nft.af_info, list) {
466 		if (family != NFPROTO_UNSPEC && family != afi->family)
467 			continue;
468 
469 		list_for_each_entry_rcu(table, &afi->tables, list) {
470 			if (idx < s_idx)
471 				goto cont;
472 			if (idx > s_idx)
473 				memset(&cb->args[1], 0,
474 				       sizeof(cb->args) - sizeof(cb->args[0]));
475 			if (!nft_is_active(net, table))
476 				continue;
477 			if (nf_tables_fill_table_info(skb, net,
478 						      NETLINK_CB(cb->skb).portid,
479 						      cb->nlh->nlmsg_seq,
480 						      NFT_MSG_NEWTABLE,
481 						      NLM_F_MULTI,
482 						      afi->family, table) < 0)
483 				goto done;
484 
485 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
486 cont:
487 			idx++;
488 		}
489 	}
490 done:
491 	rcu_read_unlock();
492 	cb->args[0] = idx;
493 	return skb->len;
494 }
495 
nf_tables_gettable(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])496 static int nf_tables_gettable(struct net *net, struct sock *nlsk,
497 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
498 			      const struct nlattr * const nla[])
499 {
500 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
501 	u8 genmask = nft_genmask_cur(net);
502 	const struct nft_af_info *afi;
503 	const struct nft_table *table;
504 	struct sk_buff *skb2;
505 	int family = nfmsg->nfgen_family;
506 	int err;
507 
508 	if (nlh->nlmsg_flags & NLM_F_DUMP) {
509 		struct netlink_dump_control c = {
510 			.dump = nf_tables_dump_tables,
511 		};
512 		return netlink_dump_start(nlsk, skb, nlh, &c);
513 	}
514 
515 	afi = nf_tables_afinfo_lookup(net, family, false);
516 	if (IS_ERR(afi))
517 		return PTR_ERR(afi);
518 
519 	table = nf_tables_table_lookup(afi, nla[NFTA_TABLE_NAME], genmask);
520 	if (IS_ERR(table))
521 		return PTR_ERR(table);
522 
523 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
524 	if (!skb2)
525 		return -ENOMEM;
526 
527 	err = nf_tables_fill_table_info(skb2, net, NETLINK_CB(skb).portid,
528 					nlh->nlmsg_seq, NFT_MSG_NEWTABLE, 0,
529 					family, table);
530 	if (err < 0)
531 		goto err;
532 
533 	return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
534 
535 err:
536 	kfree_skb(skb2);
537 	return err;
538 }
539 
nf_tables_table_enable(struct net * net,const struct nft_af_info * afi,struct nft_table * table)540 static int nf_tables_table_enable(struct net *net,
541 				  const struct nft_af_info *afi,
542 				  struct nft_table *table)
543 {
544 	struct nft_chain *chain;
545 	int err, i = 0;
546 
547 	list_for_each_entry(chain, &table->chains, list) {
548 		if (!nft_is_active_next(net, chain))
549 			continue;
550 		if (!(chain->flags & NFT_BASE_CHAIN))
551 			continue;
552 
553 		err = nf_register_net_hooks(net, nft_base_chain(chain)->ops,
554 					    afi->nops);
555 		if (err < 0)
556 			goto err;
557 
558 		i++;
559 	}
560 	return 0;
561 err:
562 	list_for_each_entry(chain, &table->chains, list) {
563 		if (!nft_is_active_next(net, chain))
564 			continue;
565 		if (!(chain->flags & NFT_BASE_CHAIN))
566 			continue;
567 
568 		if (i-- <= 0)
569 			break;
570 
571 		nf_unregister_net_hooks(net, nft_base_chain(chain)->ops,
572 					afi->nops);
573 	}
574 	return err;
575 }
576 
nf_tables_table_disable(struct net * net,const struct nft_af_info * afi,struct nft_table * table)577 static void nf_tables_table_disable(struct net *net,
578 				    const struct nft_af_info *afi,
579 				    struct nft_table *table)
580 {
581 	struct nft_chain *chain;
582 
583 	list_for_each_entry(chain, &table->chains, list) {
584 		if (!nft_is_active_next(net, chain))
585 			continue;
586 		if (!(chain->flags & NFT_BASE_CHAIN))
587 			continue;
588 
589 		nf_unregister_net_hooks(net, nft_base_chain(chain)->ops,
590 					afi->nops);
591 	}
592 }
593 
nf_tables_updtable(struct nft_ctx * ctx)594 static int nf_tables_updtable(struct nft_ctx *ctx)
595 {
596 	struct nft_trans *trans;
597 	u32 flags;
598 	int ret = 0;
599 
600 	if (!ctx->nla[NFTA_TABLE_FLAGS])
601 		return 0;
602 
603 	flags = ntohl(nla_get_be32(ctx->nla[NFTA_TABLE_FLAGS]));
604 	if (flags & ~NFT_TABLE_F_DORMANT)
605 		return -EINVAL;
606 
607 	if (flags == ctx->table->flags)
608 		return 0;
609 
610 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
611 				sizeof(struct nft_trans_table));
612 	if (trans == NULL)
613 		return -ENOMEM;
614 
615 	if ((flags & NFT_TABLE_F_DORMANT) &&
616 	    !(ctx->table->flags & NFT_TABLE_F_DORMANT)) {
617 		nft_trans_table_enable(trans) = false;
618 	} else if (!(flags & NFT_TABLE_F_DORMANT) &&
619 		   ctx->table->flags & NFT_TABLE_F_DORMANT) {
620 		ret = nf_tables_table_enable(ctx->net, ctx->afi, ctx->table);
621 		if (ret >= 0) {
622 			ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
623 			nft_trans_table_enable(trans) = true;
624 		}
625 	}
626 	if (ret < 0)
627 		goto err;
628 
629 	nft_trans_table_update(trans) = true;
630 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
631 	return 0;
632 err:
633 	nft_trans_destroy(trans);
634 	return ret;
635 }
636 
nf_tables_newtable(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])637 static int nf_tables_newtable(struct net *net, struct sock *nlsk,
638 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
639 			      const struct nlattr * const nla[])
640 {
641 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
642 	u8 genmask = nft_genmask_next(net);
643 	const struct nlattr *name;
644 	struct nft_af_info *afi;
645 	struct nft_table *table;
646 	int family = nfmsg->nfgen_family;
647 	u32 flags = 0;
648 	struct nft_ctx ctx;
649 	int err;
650 
651 	afi = nf_tables_afinfo_lookup(net, family, true);
652 	if (IS_ERR(afi))
653 		return PTR_ERR(afi);
654 
655 	name = nla[NFTA_TABLE_NAME];
656 	table = nf_tables_table_lookup(afi, name, genmask);
657 	if (IS_ERR(table)) {
658 		if (PTR_ERR(table) != -ENOENT)
659 			return PTR_ERR(table);
660 		table = NULL;
661 	}
662 
663 	if (table != NULL) {
664 		if (nlh->nlmsg_flags & NLM_F_EXCL)
665 			return -EEXIST;
666 		if (nlh->nlmsg_flags & NLM_F_REPLACE)
667 			return -EOPNOTSUPP;
668 
669 		nft_ctx_init(&ctx, net, skb, nlh, afi, table, NULL, nla);
670 		return nf_tables_updtable(&ctx);
671 	}
672 
673 	if (nla[NFTA_TABLE_FLAGS]) {
674 		flags = ntohl(nla_get_be32(nla[NFTA_TABLE_FLAGS]));
675 		if (flags & ~NFT_TABLE_F_DORMANT)
676 			return -EINVAL;
677 	}
678 
679 	err = -EAFNOSUPPORT;
680 	if (!try_module_get(afi->owner))
681 		goto err1;
682 
683 	err = -ENOMEM;
684 	table = kzalloc(sizeof(*table), GFP_KERNEL);
685 	if (table == NULL)
686 		goto err2;
687 
688 	nla_strlcpy(table->name, name, NFT_TABLE_MAXNAMELEN);
689 	INIT_LIST_HEAD(&table->chains);
690 	INIT_LIST_HEAD(&table->sets);
691 	table->flags = flags;
692 
693 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, NULL, nla);
694 	err = nft_trans_table_add(&ctx, NFT_MSG_NEWTABLE);
695 	if (err < 0)
696 		goto err3;
697 
698 	list_add_tail_rcu(&table->list, &afi->tables);
699 	return 0;
700 err3:
701 	kfree(table);
702 err2:
703 	module_put(afi->owner);
704 err1:
705 	return err;
706 }
707 
nft_flush_table(struct nft_ctx * ctx)708 static int nft_flush_table(struct nft_ctx *ctx)
709 {
710 	int err;
711 	struct nft_chain *chain, *nc;
712 	struct nft_set *set, *ns;
713 
714 	list_for_each_entry(chain, &ctx->table->chains, list) {
715 		if (!nft_is_active_next(ctx->net, chain))
716 			continue;
717 
718 		ctx->chain = chain;
719 
720 		err = nft_delrule_by_chain(ctx);
721 		if (err < 0)
722 			goto out;
723 	}
724 
725 	list_for_each_entry_safe(set, ns, &ctx->table->sets, list) {
726 		if (!nft_is_active_next(ctx->net, set))
727 			continue;
728 
729 		if (set->flags & NFT_SET_ANONYMOUS &&
730 		    !list_empty(&set->bindings))
731 			continue;
732 
733 		err = nft_delset(ctx, set);
734 		if (err < 0)
735 			goto out;
736 	}
737 
738 	list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
739 		if (!nft_is_active_next(ctx->net, chain))
740 			continue;
741 
742 		ctx->chain = chain;
743 
744 		err = nft_delchain(ctx);
745 		if (err < 0)
746 			goto out;
747 	}
748 
749 	err = nft_deltable(ctx);
750 out:
751 	return err;
752 }
753 
nft_flush(struct nft_ctx * ctx,int family)754 static int nft_flush(struct nft_ctx *ctx, int family)
755 {
756 	struct nft_af_info *afi;
757 	struct nft_table *table, *nt;
758 	const struct nlattr * const *nla = ctx->nla;
759 	int err = 0;
760 
761 	list_for_each_entry(afi, &ctx->net->nft.af_info, list) {
762 		if (family != AF_UNSPEC && afi->family != family)
763 			continue;
764 
765 		ctx->afi = afi;
766 		list_for_each_entry_safe(table, nt, &afi->tables, list) {
767 			if (!nft_is_active_next(ctx->net, table))
768 				continue;
769 
770 			if (nla[NFTA_TABLE_NAME] &&
771 			    nla_strcmp(nla[NFTA_TABLE_NAME], table->name) != 0)
772 				continue;
773 
774 			ctx->table = table;
775 
776 			err = nft_flush_table(ctx);
777 			if (err < 0)
778 				goto out;
779 		}
780 	}
781 out:
782 	return err;
783 }
784 
nf_tables_deltable(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])785 static int nf_tables_deltable(struct net *net, struct sock *nlsk,
786 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
787 			      const struct nlattr * const nla[])
788 {
789 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
790 	u8 genmask = nft_genmask_next(net);
791 	struct nft_af_info *afi;
792 	struct nft_table *table;
793 	int family = nfmsg->nfgen_family;
794 	struct nft_ctx ctx;
795 
796 	nft_ctx_init(&ctx, net, skb, nlh, NULL, NULL, NULL, nla);
797 	if (family == AF_UNSPEC || nla[NFTA_TABLE_NAME] == NULL)
798 		return nft_flush(&ctx, family);
799 
800 	afi = nf_tables_afinfo_lookup(net, family, false);
801 	if (IS_ERR(afi))
802 		return PTR_ERR(afi);
803 
804 	table = nf_tables_table_lookup(afi, nla[NFTA_TABLE_NAME], genmask);
805 	if (IS_ERR(table))
806 		return PTR_ERR(table);
807 
808 	ctx.afi = afi;
809 	ctx.table = table;
810 
811 	return nft_flush_table(&ctx);
812 }
813 
nf_tables_table_destroy(struct nft_ctx * ctx)814 static void nf_tables_table_destroy(struct nft_ctx *ctx)
815 {
816 	BUG_ON(ctx->table->use > 0);
817 
818 	kfree(ctx->table);
819 	module_put(ctx->afi->owner);
820 }
821 
nft_register_chain_type(const struct nf_chain_type * ctype)822 int nft_register_chain_type(const struct nf_chain_type *ctype)
823 {
824 	int err = 0;
825 
826 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
827 	if (chain_type[ctype->family][ctype->type] != NULL) {
828 		err = -EBUSY;
829 		goto out;
830 	}
831 	chain_type[ctype->family][ctype->type] = ctype;
832 out:
833 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
834 	return err;
835 }
836 EXPORT_SYMBOL_GPL(nft_register_chain_type);
837 
nft_unregister_chain_type(const struct nf_chain_type * ctype)838 void nft_unregister_chain_type(const struct nf_chain_type *ctype)
839 {
840 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
841 	chain_type[ctype->family][ctype->type] = NULL;
842 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
843 }
844 EXPORT_SYMBOL_GPL(nft_unregister_chain_type);
845 
846 /*
847  * Chains
848  */
849 
850 static struct nft_chain *
nf_tables_chain_lookup_byhandle(const struct nft_table * table,u64 handle,u8 genmask)851 nf_tables_chain_lookup_byhandle(const struct nft_table *table, u64 handle,
852 				u8 genmask)
853 {
854 	struct nft_chain *chain;
855 
856 	list_for_each_entry(chain, &table->chains, list) {
857 		if (chain->handle == handle &&
858 		    nft_active_genmask(chain, genmask))
859 			return chain;
860 	}
861 
862 	return ERR_PTR(-ENOENT);
863 }
864 
nf_tables_chain_lookup(const struct nft_table * table,const struct nlattr * nla,u8 genmask)865 static struct nft_chain *nf_tables_chain_lookup(const struct nft_table *table,
866 						const struct nlattr *nla,
867 						u8 genmask)
868 {
869 	struct nft_chain *chain;
870 
871 	if (nla == NULL)
872 		return ERR_PTR(-EINVAL);
873 
874 	list_for_each_entry(chain, &table->chains, list) {
875 		if (!nla_strcmp(nla, chain->name) &&
876 		    nft_active_genmask(chain, genmask))
877 			return chain;
878 	}
879 
880 	return ERR_PTR(-ENOENT);
881 }
882 
883 static const struct nla_policy nft_chain_policy[NFTA_CHAIN_MAX + 1] = {
884 	[NFTA_CHAIN_TABLE]	= { .type = NLA_STRING },
885 	[NFTA_CHAIN_HANDLE]	= { .type = NLA_U64 },
886 	[NFTA_CHAIN_NAME]	= { .type = NLA_STRING,
887 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
888 	[NFTA_CHAIN_HOOK]	= { .type = NLA_NESTED },
889 	[NFTA_CHAIN_POLICY]	= { .type = NLA_U32 },
890 	[NFTA_CHAIN_TYPE]	= { .type = NLA_STRING },
891 	[NFTA_CHAIN_COUNTERS]	= { .type = NLA_NESTED },
892 };
893 
894 static const struct nla_policy nft_hook_policy[NFTA_HOOK_MAX + 1] = {
895 	[NFTA_HOOK_HOOKNUM]	= { .type = NLA_U32 },
896 	[NFTA_HOOK_PRIORITY]	= { .type = NLA_U32 },
897 	[NFTA_HOOK_DEV]		= { .type = NLA_STRING,
898 				    .len = IFNAMSIZ - 1 },
899 };
900 
nft_dump_stats(struct sk_buff * skb,struct nft_stats __percpu * stats)901 static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats)
902 {
903 	struct nft_stats *cpu_stats, total;
904 	struct nlattr *nest;
905 	unsigned int seq;
906 	u64 pkts, bytes;
907 	int cpu;
908 
909 	memset(&total, 0, sizeof(total));
910 	for_each_possible_cpu(cpu) {
911 		cpu_stats = per_cpu_ptr(stats, cpu);
912 		do {
913 			seq = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
914 			pkts = cpu_stats->pkts;
915 			bytes = cpu_stats->bytes;
916 		} while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, seq));
917 		total.pkts += pkts;
918 		total.bytes += bytes;
919 	}
920 	nest = nla_nest_start(skb, NFTA_CHAIN_COUNTERS);
921 	if (nest == NULL)
922 		goto nla_put_failure;
923 
924 	if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts),
925 			 NFTA_COUNTER_PAD) ||
926 	    nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes),
927 			 NFTA_COUNTER_PAD))
928 		goto nla_put_failure;
929 
930 	nla_nest_end(skb, nest);
931 	return 0;
932 
933 nla_put_failure:
934 	return -ENOSPC;
935 }
936 
nf_tables_fill_chain_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table,const struct nft_chain * chain)937 static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net,
938 				     u32 portid, u32 seq, int event, u32 flags,
939 				     int family, const struct nft_table *table,
940 				     const struct nft_chain *chain)
941 {
942 	struct nlmsghdr *nlh;
943 	struct nfgenmsg *nfmsg;
944 
945 	event |= NFNL_SUBSYS_NFTABLES << 8;
946 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
947 	if (nlh == NULL)
948 		goto nla_put_failure;
949 
950 	nfmsg = nlmsg_data(nlh);
951 	nfmsg->nfgen_family	= family;
952 	nfmsg->version		= NFNETLINK_V0;
953 	nfmsg->res_id		= htons(net->nft.base_seq & 0xffff);
954 
955 	if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name))
956 		goto nla_put_failure;
957 	if (nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle),
958 			 NFTA_CHAIN_PAD))
959 		goto nla_put_failure;
960 	if (nla_put_string(skb, NFTA_CHAIN_NAME, chain->name))
961 		goto nla_put_failure;
962 
963 	if (chain->flags & NFT_BASE_CHAIN) {
964 		const struct nft_base_chain *basechain = nft_base_chain(chain);
965 		const struct nf_hook_ops *ops = &basechain->ops[0];
966 		struct nlattr *nest;
967 
968 		nest = nla_nest_start(skb, NFTA_CHAIN_HOOK);
969 		if (nest == NULL)
970 			goto nla_put_failure;
971 		if (nla_put_be32(skb, NFTA_HOOK_HOOKNUM, htonl(ops->hooknum)))
972 			goto nla_put_failure;
973 		if (nla_put_be32(skb, NFTA_HOOK_PRIORITY, htonl(ops->priority)))
974 			goto nla_put_failure;
975 		if (basechain->dev_name[0] &&
976 		    nla_put_string(skb, NFTA_HOOK_DEV, basechain->dev_name))
977 			goto nla_put_failure;
978 		nla_nest_end(skb, nest);
979 
980 		if (nla_put_be32(skb, NFTA_CHAIN_POLICY,
981 				 htonl(basechain->policy)))
982 			goto nla_put_failure;
983 
984 		if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name))
985 			goto nla_put_failure;
986 
987 		if (nft_dump_stats(skb, nft_base_chain(chain)->stats))
988 			goto nla_put_failure;
989 	}
990 
991 	if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use)))
992 		goto nla_put_failure;
993 
994 	nlmsg_end(skb, nlh);
995 	return 0;
996 
997 nla_put_failure:
998 	nlmsg_trim(skb, nlh);
999 	return -1;
1000 }
1001 
nf_tables_chain_notify(const struct nft_ctx * ctx,int event)1002 static int nf_tables_chain_notify(const struct nft_ctx *ctx, int event)
1003 {
1004 	struct sk_buff *skb;
1005 	int err;
1006 
1007 	if (!ctx->report &&
1008 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1009 		return 0;
1010 
1011 	err = -ENOBUFS;
1012 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1013 	if (skb == NULL)
1014 		goto err;
1015 
1016 	err = nf_tables_fill_chain_info(skb, ctx->net, ctx->portid, ctx->seq,
1017 					event, 0, ctx->afi->family, ctx->table,
1018 					ctx->chain);
1019 	if (err < 0) {
1020 		kfree_skb(skb);
1021 		goto err;
1022 	}
1023 
1024 	err = nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
1025 			     ctx->report, GFP_KERNEL);
1026 err:
1027 	if (err < 0) {
1028 		nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES,
1029 				  err);
1030 	}
1031 	return err;
1032 }
1033 
nf_tables_dump_chains(struct sk_buff * skb,struct netlink_callback * cb)1034 static int nf_tables_dump_chains(struct sk_buff *skb,
1035 				 struct netlink_callback *cb)
1036 {
1037 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1038 	const struct nft_af_info *afi;
1039 	const struct nft_table *table;
1040 	const struct nft_chain *chain;
1041 	unsigned int idx = 0, s_idx = cb->args[0];
1042 	struct net *net = sock_net(skb->sk);
1043 	int family = nfmsg->nfgen_family;
1044 
1045 	rcu_read_lock();
1046 	cb->seq = net->nft.base_seq;
1047 
1048 	list_for_each_entry_rcu(afi, &net->nft.af_info, list) {
1049 		if (family != NFPROTO_UNSPEC && family != afi->family)
1050 			continue;
1051 
1052 		list_for_each_entry_rcu(table, &afi->tables, list) {
1053 			list_for_each_entry_rcu(chain, &table->chains, list) {
1054 				if (idx < s_idx)
1055 					goto cont;
1056 				if (idx > s_idx)
1057 					memset(&cb->args[1], 0,
1058 					       sizeof(cb->args) - sizeof(cb->args[0]));
1059 				if (!nft_is_active(net, chain))
1060 					continue;
1061 				if (nf_tables_fill_chain_info(skb, net,
1062 							      NETLINK_CB(cb->skb).portid,
1063 							      cb->nlh->nlmsg_seq,
1064 							      NFT_MSG_NEWCHAIN,
1065 							      NLM_F_MULTI,
1066 							      afi->family, table, chain) < 0)
1067 					goto done;
1068 
1069 				nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1070 cont:
1071 				idx++;
1072 			}
1073 		}
1074 	}
1075 done:
1076 	rcu_read_unlock();
1077 	cb->args[0] = idx;
1078 	return skb->len;
1079 }
1080 
nf_tables_getchain(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])1081 static int nf_tables_getchain(struct net *net, struct sock *nlsk,
1082 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
1083 			      const struct nlattr * const nla[])
1084 {
1085 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1086 	u8 genmask = nft_genmask_cur(net);
1087 	const struct nft_af_info *afi;
1088 	const struct nft_table *table;
1089 	const struct nft_chain *chain;
1090 	struct sk_buff *skb2;
1091 	int family = nfmsg->nfgen_family;
1092 	int err;
1093 
1094 	if (nlh->nlmsg_flags & NLM_F_DUMP) {
1095 		struct netlink_dump_control c = {
1096 			.dump = nf_tables_dump_chains,
1097 		};
1098 		return netlink_dump_start(nlsk, skb, nlh, &c);
1099 	}
1100 
1101 	afi = nf_tables_afinfo_lookup(net, family, false);
1102 	if (IS_ERR(afi))
1103 		return PTR_ERR(afi);
1104 
1105 	table = nf_tables_table_lookup(afi, nla[NFTA_CHAIN_TABLE], genmask);
1106 	if (IS_ERR(table))
1107 		return PTR_ERR(table);
1108 
1109 	chain = nf_tables_chain_lookup(table, nla[NFTA_CHAIN_NAME], genmask);
1110 	if (IS_ERR(chain))
1111 		return PTR_ERR(chain);
1112 
1113 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
1114 	if (!skb2)
1115 		return -ENOMEM;
1116 
1117 	err = nf_tables_fill_chain_info(skb2, net, NETLINK_CB(skb).portid,
1118 					nlh->nlmsg_seq, NFT_MSG_NEWCHAIN, 0,
1119 					family, table, chain);
1120 	if (err < 0)
1121 		goto err;
1122 
1123 	return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
1124 
1125 err:
1126 	kfree_skb(skb2);
1127 	return err;
1128 }
1129 
1130 static const struct nla_policy nft_counter_policy[NFTA_COUNTER_MAX + 1] = {
1131 	[NFTA_COUNTER_PACKETS]	= { .type = NLA_U64 },
1132 	[NFTA_COUNTER_BYTES]	= { .type = NLA_U64 },
1133 };
1134 
nft_stats_alloc(const struct nlattr * attr)1135 static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
1136 {
1137 	struct nlattr *tb[NFTA_COUNTER_MAX+1];
1138 	struct nft_stats __percpu *newstats;
1139 	struct nft_stats *stats;
1140 	int err;
1141 
1142 	err = nla_parse_nested(tb, NFTA_COUNTER_MAX, attr, nft_counter_policy);
1143 	if (err < 0)
1144 		return ERR_PTR(err);
1145 
1146 	if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS])
1147 		return ERR_PTR(-EINVAL);
1148 
1149 	newstats = netdev_alloc_pcpu_stats(struct nft_stats);
1150 	if (newstats == NULL)
1151 		return ERR_PTR(-ENOMEM);
1152 
1153 	/* Restore old counters on this cpu, no problem. Per-cpu statistics
1154 	 * are not exposed to userspace.
1155 	 */
1156 	preempt_disable();
1157 	stats = this_cpu_ptr(newstats);
1158 	stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES]));
1159 	stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS]));
1160 	preempt_enable();
1161 
1162 	return newstats;
1163 }
1164 
nft_chain_stats_replace(struct nft_base_chain * chain,struct nft_stats __percpu * newstats)1165 static void nft_chain_stats_replace(struct nft_base_chain *chain,
1166 				    struct nft_stats __percpu *newstats)
1167 {
1168 	if (newstats == NULL)
1169 		return;
1170 
1171 	if (chain->stats) {
1172 		struct nft_stats __percpu *oldstats =
1173 				nft_dereference(chain->stats);
1174 
1175 		rcu_assign_pointer(chain->stats, newstats);
1176 		synchronize_rcu();
1177 		free_percpu(oldstats);
1178 	} else
1179 		rcu_assign_pointer(chain->stats, newstats);
1180 }
1181 
nf_tables_chain_destroy(struct nft_chain * chain)1182 static void nf_tables_chain_destroy(struct nft_chain *chain)
1183 {
1184 	BUG_ON(chain->use > 0);
1185 
1186 	if (chain->flags & NFT_BASE_CHAIN) {
1187 		struct nft_base_chain *basechain = nft_base_chain(chain);
1188 
1189 		module_put(basechain->type->owner);
1190 		free_percpu(basechain->stats);
1191 		if (basechain->ops[0].dev != NULL)
1192 			dev_put(basechain->ops[0].dev);
1193 		kfree(basechain);
1194 	} else {
1195 		kfree(chain);
1196 	}
1197 }
1198 
1199 struct nft_chain_hook {
1200 	u32				num;
1201 	u32				priority;
1202 	const struct nf_chain_type	*type;
1203 	struct net_device		*dev;
1204 };
1205 
nft_chain_parse_hook(struct net * net,const struct nlattr * const nla[],struct nft_af_info * afi,struct nft_chain_hook * hook,bool create)1206 static int nft_chain_parse_hook(struct net *net,
1207 				const struct nlattr * const nla[],
1208 				struct nft_af_info *afi,
1209 				struct nft_chain_hook *hook, bool create)
1210 {
1211 	struct nlattr *ha[NFTA_HOOK_MAX + 1];
1212 	const struct nf_chain_type *type;
1213 	struct net_device *dev;
1214 	int err;
1215 
1216 	err = nla_parse_nested(ha, NFTA_HOOK_MAX, nla[NFTA_CHAIN_HOOK],
1217 			       nft_hook_policy);
1218 	if (err < 0)
1219 		return err;
1220 
1221 	if (ha[NFTA_HOOK_HOOKNUM] == NULL ||
1222 	    ha[NFTA_HOOK_PRIORITY] == NULL)
1223 		return -EINVAL;
1224 
1225 	hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
1226 	if (hook->num >= afi->nhooks)
1227 		return -EINVAL;
1228 
1229 	hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
1230 
1231 	type = chain_type[afi->family][NFT_CHAIN_T_DEFAULT];
1232 	if (nla[NFTA_CHAIN_TYPE]) {
1233 		type = nf_tables_chain_type_lookup(afi, nla[NFTA_CHAIN_TYPE],
1234 						   create);
1235 		if (IS_ERR(type))
1236 			return PTR_ERR(type);
1237 	}
1238 	if (!(type->hook_mask & (1 << hook->num)))
1239 		return -EOPNOTSUPP;
1240 	if (!try_module_get(type->owner))
1241 		return -ENOENT;
1242 
1243 	hook->type = type;
1244 
1245 	hook->dev = NULL;
1246 	if (afi->flags & NFT_AF_NEEDS_DEV) {
1247 		char ifname[IFNAMSIZ];
1248 
1249 		if (!ha[NFTA_HOOK_DEV]) {
1250 			module_put(type->owner);
1251 			return -EOPNOTSUPP;
1252 		}
1253 
1254 		nla_strlcpy(ifname, ha[NFTA_HOOK_DEV], IFNAMSIZ);
1255 		dev = dev_get_by_name(net, ifname);
1256 		if (!dev) {
1257 			module_put(type->owner);
1258 			return -ENOENT;
1259 		}
1260 		hook->dev = dev;
1261 	} else if (ha[NFTA_HOOK_DEV]) {
1262 		module_put(type->owner);
1263 		return -EOPNOTSUPP;
1264 	}
1265 
1266 	return 0;
1267 }
1268 
nft_chain_release_hook(struct nft_chain_hook * hook)1269 static void nft_chain_release_hook(struct nft_chain_hook *hook)
1270 {
1271 	module_put(hook->type->owner);
1272 	if (hook->dev != NULL)
1273 		dev_put(hook->dev);
1274 }
1275 
nf_tables_newchain(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])1276 static int nf_tables_newchain(struct net *net, struct sock *nlsk,
1277 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
1278 			      const struct nlattr * const nla[])
1279 {
1280 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1281 	const struct nlattr * uninitialized_var(name);
1282 	struct nft_af_info *afi;
1283 	struct nft_table *table;
1284 	struct nft_chain *chain;
1285 	struct nft_base_chain *basechain = NULL;
1286 	u8 genmask = nft_genmask_next(net);
1287 	int family = nfmsg->nfgen_family;
1288 	u8 policy = NF_ACCEPT;
1289 	u64 handle = 0;
1290 	unsigned int i;
1291 	struct nft_stats __percpu *stats;
1292 	int err;
1293 	bool create;
1294 	struct nft_ctx ctx;
1295 
1296 	create = nlh->nlmsg_flags & NLM_F_CREATE ? true : false;
1297 
1298 	afi = nf_tables_afinfo_lookup(net, family, true);
1299 	if (IS_ERR(afi))
1300 		return PTR_ERR(afi);
1301 
1302 	table = nf_tables_table_lookup(afi, nla[NFTA_CHAIN_TABLE], genmask);
1303 	if (IS_ERR(table))
1304 		return PTR_ERR(table);
1305 
1306 	chain = NULL;
1307 	name = nla[NFTA_CHAIN_NAME];
1308 
1309 	if (nla[NFTA_CHAIN_HANDLE]) {
1310 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_CHAIN_HANDLE]));
1311 		chain = nf_tables_chain_lookup_byhandle(table, handle, genmask);
1312 		if (IS_ERR(chain))
1313 			return PTR_ERR(chain);
1314 	} else {
1315 		chain = nf_tables_chain_lookup(table, name, genmask);
1316 		if (IS_ERR(chain)) {
1317 			if (PTR_ERR(chain) != -ENOENT)
1318 				return PTR_ERR(chain);
1319 			chain = NULL;
1320 		}
1321 	}
1322 
1323 	if (nla[NFTA_CHAIN_POLICY]) {
1324 		if ((chain != NULL &&
1325 		    !(chain->flags & NFT_BASE_CHAIN)))
1326 			return -EOPNOTSUPP;
1327 
1328 		if (chain == NULL &&
1329 		    nla[NFTA_CHAIN_HOOK] == NULL)
1330 			return -EOPNOTSUPP;
1331 
1332 		policy = ntohl(nla_get_be32(nla[NFTA_CHAIN_POLICY]));
1333 		switch (policy) {
1334 		case NF_DROP:
1335 		case NF_ACCEPT:
1336 			break;
1337 		default:
1338 			return -EINVAL;
1339 		}
1340 	}
1341 
1342 	if (chain != NULL) {
1343 		struct nft_stats *stats = NULL;
1344 		struct nft_trans *trans;
1345 
1346 		if (nlh->nlmsg_flags & NLM_F_EXCL)
1347 			return -EEXIST;
1348 		if (nlh->nlmsg_flags & NLM_F_REPLACE)
1349 			return -EOPNOTSUPP;
1350 
1351 		if (nla[NFTA_CHAIN_HOOK]) {
1352 			struct nft_base_chain *basechain;
1353 			struct nft_chain_hook hook;
1354 			struct nf_hook_ops *ops;
1355 
1356 			if (!(chain->flags & NFT_BASE_CHAIN))
1357 				return -EBUSY;
1358 
1359 			err = nft_chain_parse_hook(net, nla, afi, &hook,
1360 						   create);
1361 			if (err < 0)
1362 				return err;
1363 
1364 			basechain = nft_base_chain(chain);
1365 			if (basechain->type != hook.type) {
1366 				nft_chain_release_hook(&hook);
1367 				return -EBUSY;
1368 			}
1369 
1370 			for (i = 0; i < afi->nops; i++) {
1371 				ops = &basechain->ops[i];
1372 				if (ops->hooknum != hook.num ||
1373 				    ops->priority != hook.priority ||
1374 				    ops->dev != hook.dev) {
1375 					nft_chain_release_hook(&hook);
1376 					return -EBUSY;
1377 				}
1378 			}
1379 			nft_chain_release_hook(&hook);
1380 		}
1381 
1382 		if (nla[NFTA_CHAIN_HANDLE] && name) {
1383 			struct nft_chain *chain2;
1384 
1385 			chain2 = nf_tables_chain_lookup(table,
1386 							nla[NFTA_CHAIN_NAME],
1387 							genmask);
1388 			if (IS_ERR(chain2))
1389 				return PTR_ERR(chain2);
1390 		}
1391 
1392 		if (nla[NFTA_CHAIN_COUNTERS]) {
1393 			if (!(chain->flags & NFT_BASE_CHAIN))
1394 				return -EOPNOTSUPP;
1395 
1396 			stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
1397 			if (IS_ERR(stats))
1398 				return PTR_ERR(stats);
1399 		}
1400 
1401 		nft_ctx_init(&ctx, net, skb, nlh, afi, table, chain, nla);
1402 		trans = nft_trans_alloc(&ctx, NFT_MSG_NEWCHAIN,
1403 					sizeof(struct nft_trans_chain));
1404 		if (trans == NULL) {
1405 			free_percpu(stats);
1406 			return -ENOMEM;
1407 		}
1408 
1409 		nft_trans_chain_stats(trans) = stats;
1410 		nft_trans_chain_update(trans) = true;
1411 
1412 		if (nla[NFTA_CHAIN_POLICY])
1413 			nft_trans_chain_policy(trans) = policy;
1414 		else
1415 			nft_trans_chain_policy(trans) = -1;
1416 
1417 		if (nla[NFTA_CHAIN_HANDLE] && name) {
1418 			nla_strlcpy(nft_trans_chain_name(trans), name,
1419 				    NFT_CHAIN_MAXNAMELEN);
1420 		}
1421 		list_add_tail(&trans->list, &net->nft.commit_list);
1422 		return 0;
1423 	}
1424 
1425 	if (table->use == UINT_MAX)
1426 		return -EOVERFLOW;
1427 
1428 	if (nla[NFTA_CHAIN_HOOK]) {
1429 		struct nft_chain_hook hook;
1430 		struct nf_hook_ops *ops;
1431 		nf_hookfn *hookfn;
1432 
1433 		err = nft_chain_parse_hook(net, nla, afi, &hook, create);
1434 		if (err < 0)
1435 			return err;
1436 
1437 		basechain = kzalloc(sizeof(*basechain), GFP_KERNEL);
1438 		if (basechain == NULL) {
1439 			nft_chain_release_hook(&hook);
1440 			return -ENOMEM;
1441 		}
1442 
1443 		if (hook.dev != NULL)
1444 			strncpy(basechain->dev_name, hook.dev->name, IFNAMSIZ);
1445 
1446 		if (nla[NFTA_CHAIN_COUNTERS]) {
1447 			stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
1448 			if (IS_ERR(stats)) {
1449 				nft_chain_release_hook(&hook);
1450 				kfree(basechain);
1451 				return PTR_ERR(stats);
1452 			}
1453 			basechain->stats = stats;
1454 		} else {
1455 			stats = netdev_alloc_pcpu_stats(struct nft_stats);
1456 			if (stats == NULL) {
1457 				nft_chain_release_hook(&hook);
1458 				kfree(basechain);
1459 				return -ENOMEM;
1460 			}
1461 			rcu_assign_pointer(basechain->stats, stats);
1462 		}
1463 
1464 		hookfn = hook.type->hooks[hook.num];
1465 		basechain->type = hook.type;
1466 		chain = &basechain->chain;
1467 
1468 		for (i = 0; i < afi->nops; i++) {
1469 			ops = &basechain->ops[i];
1470 			ops->pf		= family;
1471 			ops->hooknum	= hook.num;
1472 			ops->priority	= hook.priority;
1473 			ops->priv	= chain;
1474 			ops->hook	= afi->hooks[ops->hooknum];
1475 			ops->dev	= hook.dev;
1476 			if (hookfn)
1477 				ops->hook = hookfn;
1478 			if (afi->hook_ops_init)
1479 				afi->hook_ops_init(ops, i);
1480 		}
1481 
1482 		chain->flags |= NFT_BASE_CHAIN;
1483 		basechain->policy = policy;
1484 	} else {
1485 		chain = kzalloc(sizeof(*chain), GFP_KERNEL);
1486 		if (chain == NULL)
1487 			return -ENOMEM;
1488 	}
1489 
1490 	INIT_LIST_HEAD(&chain->rules);
1491 	chain->handle = nf_tables_alloc_handle(table);
1492 	chain->table = table;
1493 	nla_strlcpy(chain->name, name, NFT_CHAIN_MAXNAMELEN);
1494 
1495 	err = nf_tables_register_hooks(net, table, chain, afi->nops);
1496 	if (err < 0)
1497 		goto err1;
1498 
1499 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, chain, nla);
1500 	err = nft_trans_chain_add(&ctx, NFT_MSG_NEWCHAIN);
1501 	if (err < 0)
1502 		goto err2;
1503 
1504 	table->use++;
1505 	list_add_tail_rcu(&chain->list, &table->chains);
1506 	return 0;
1507 err2:
1508 	nf_tables_unregister_hooks(net, table, chain, afi->nops);
1509 err1:
1510 	nf_tables_chain_destroy(chain);
1511 	return err;
1512 }
1513 
nf_tables_delchain(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])1514 static int nf_tables_delchain(struct net *net, struct sock *nlsk,
1515 			      struct sk_buff *skb, const struct nlmsghdr *nlh,
1516 			      const struct nlattr * const nla[])
1517 {
1518 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1519 	u8 genmask = nft_genmask_next(net);
1520 	struct nft_af_info *afi;
1521 	struct nft_table *table;
1522 	struct nft_chain *chain;
1523 	int family = nfmsg->nfgen_family;
1524 	struct nft_ctx ctx;
1525 
1526 	afi = nf_tables_afinfo_lookup(net, family, false);
1527 	if (IS_ERR(afi))
1528 		return PTR_ERR(afi);
1529 
1530 	table = nf_tables_table_lookup(afi, nla[NFTA_CHAIN_TABLE], genmask);
1531 	if (IS_ERR(table))
1532 		return PTR_ERR(table);
1533 
1534 	chain = nf_tables_chain_lookup(table, nla[NFTA_CHAIN_NAME], genmask);
1535 	if (IS_ERR(chain))
1536 		return PTR_ERR(chain);
1537 	if (chain->use > 0)
1538 		return -EBUSY;
1539 
1540 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, chain, nla);
1541 
1542 	return nft_delchain(&ctx);
1543 }
1544 
1545 /*
1546  * Expressions
1547  */
1548 
1549 /**
1550  *	nft_register_expr - register nf_tables expr type
1551  *	@ops: expr type
1552  *
1553  *	Registers the expr type for use with nf_tables. Returns zero on
1554  *	success or a negative errno code otherwise.
1555  */
nft_register_expr(struct nft_expr_type * type)1556 int nft_register_expr(struct nft_expr_type *type)
1557 {
1558 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1559 	if (type->family == NFPROTO_UNSPEC)
1560 		list_add_tail_rcu(&type->list, &nf_tables_expressions);
1561 	else
1562 		list_add_rcu(&type->list, &nf_tables_expressions);
1563 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1564 	return 0;
1565 }
1566 EXPORT_SYMBOL_GPL(nft_register_expr);
1567 
1568 /**
1569  *	nft_unregister_expr - unregister nf_tables expr type
1570  *	@ops: expr type
1571  *
1572  * 	Unregisters the expr typefor use with nf_tables.
1573  */
nft_unregister_expr(struct nft_expr_type * type)1574 void nft_unregister_expr(struct nft_expr_type *type)
1575 {
1576 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1577 	list_del_rcu(&type->list);
1578 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1579 }
1580 EXPORT_SYMBOL_GPL(nft_unregister_expr);
1581 
__nft_expr_type_get(u8 family,struct nlattr * nla)1582 static const struct nft_expr_type *__nft_expr_type_get(u8 family,
1583 						       struct nlattr *nla)
1584 {
1585 	const struct nft_expr_type *type;
1586 
1587 	list_for_each_entry(type, &nf_tables_expressions, list) {
1588 		if (!nla_strcmp(nla, type->name) &&
1589 		    (!type->family || type->family == family))
1590 			return type;
1591 	}
1592 	return NULL;
1593 }
1594 
nft_expr_type_get(u8 family,struct nlattr * nla)1595 static const struct nft_expr_type *nft_expr_type_get(u8 family,
1596 						     struct nlattr *nla)
1597 {
1598 	const struct nft_expr_type *type;
1599 
1600 	if (nla == NULL)
1601 		return ERR_PTR(-EINVAL);
1602 
1603 	type = __nft_expr_type_get(family, nla);
1604 	if (type != NULL && try_module_get(type->owner))
1605 		return type;
1606 
1607 #ifdef CONFIG_MODULES
1608 	if (type == NULL) {
1609 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1610 		request_module("nft-expr-%u-%.*s", family,
1611 			       nla_len(nla), (char *)nla_data(nla));
1612 		nfnl_lock(NFNL_SUBSYS_NFTABLES);
1613 		if (__nft_expr_type_get(family, nla))
1614 			return ERR_PTR(-EAGAIN);
1615 
1616 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1617 		request_module("nft-expr-%.*s",
1618 			       nla_len(nla), (char *)nla_data(nla));
1619 		nfnl_lock(NFNL_SUBSYS_NFTABLES);
1620 		if (__nft_expr_type_get(family, nla))
1621 			return ERR_PTR(-EAGAIN);
1622 	}
1623 #endif
1624 	return ERR_PTR(-ENOENT);
1625 }
1626 
1627 static const struct nla_policy nft_expr_policy[NFTA_EXPR_MAX + 1] = {
1628 	[NFTA_EXPR_NAME]	= { .type = NLA_STRING },
1629 	[NFTA_EXPR_DATA]	= { .type = NLA_NESTED },
1630 };
1631 
nf_tables_fill_expr_info(struct sk_buff * skb,const struct nft_expr * expr)1632 static int nf_tables_fill_expr_info(struct sk_buff *skb,
1633 				    const struct nft_expr *expr)
1634 {
1635 	if (nla_put_string(skb, NFTA_EXPR_NAME, expr->ops->type->name))
1636 		goto nla_put_failure;
1637 
1638 	if (expr->ops->dump) {
1639 		struct nlattr *data = nla_nest_start(skb, NFTA_EXPR_DATA);
1640 		if (data == NULL)
1641 			goto nla_put_failure;
1642 		if (expr->ops->dump(skb, expr) < 0)
1643 			goto nla_put_failure;
1644 		nla_nest_end(skb, data);
1645 	}
1646 
1647 	return skb->len;
1648 
1649 nla_put_failure:
1650 	return -1;
1651 };
1652 
nft_expr_dump(struct sk_buff * skb,unsigned int attr,const struct nft_expr * expr)1653 int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
1654 		  const struct nft_expr *expr)
1655 {
1656 	struct nlattr *nest;
1657 
1658 	nest = nla_nest_start(skb, attr);
1659 	if (!nest)
1660 		goto nla_put_failure;
1661 	if (nf_tables_fill_expr_info(skb, expr) < 0)
1662 		goto nla_put_failure;
1663 	nla_nest_end(skb, nest);
1664 	return 0;
1665 
1666 nla_put_failure:
1667 	return -1;
1668 }
1669 
1670 struct nft_expr_info {
1671 	const struct nft_expr_ops	*ops;
1672 	struct nlattr			*tb[NFT_EXPR_MAXATTR + 1];
1673 };
1674 
nf_tables_expr_parse(const struct nft_ctx * ctx,const struct nlattr * nla,struct nft_expr_info * info)1675 static int nf_tables_expr_parse(const struct nft_ctx *ctx,
1676 				const struct nlattr *nla,
1677 				struct nft_expr_info *info)
1678 {
1679 	const struct nft_expr_type *type;
1680 	const struct nft_expr_ops *ops;
1681 	struct nlattr *tb[NFTA_EXPR_MAX + 1];
1682 	int err;
1683 
1684 	err = nla_parse_nested(tb, NFTA_EXPR_MAX, nla, nft_expr_policy);
1685 	if (err < 0)
1686 		return err;
1687 
1688 	type = nft_expr_type_get(ctx->afi->family, tb[NFTA_EXPR_NAME]);
1689 	if (IS_ERR(type))
1690 		return PTR_ERR(type);
1691 
1692 	if (tb[NFTA_EXPR_DATA]) {
1693 		err = nla_parse_nested(info->tb, type->maxattr,
1694 				       tb[NFTA_EXPR_DATA], type->policy);
1695 		if (err < 0)
1696 			goto err1;
1697 	} else
1698 		memset(info->tb, 0, sizeof(info->tb[0]) * (type->maxattr + 1));
1699 
1700 	if (type->select_ops != NULL) {
1701 		ops = type->select_ops(ctx,
1702 				       (const struct nlattr * const *)info->tb);
1703 		if (IS_ERR(ops)) {
1704 			err = PTR_ERR(ops);
1705 			goto err1;
1706 		}
1707 	} else
1708 		ops = type->ops;
1709 
1710 	info->ops = ops;
1711 	return 0;
1712 
1713 err1:
1714 	module_put(type->owner);
1715 	return err;
1716 }
1717 
nf_tables_newexpr(const struct nft_ctx * ctx,const struct nft_expr_info * info,struct nft_expr * expr)1718 static int nf_tables_newexpr(const struct nft_ctx *ctx,
1719 			     const struct nft_expr_info *info,
1720 			     struct nft_expr *expr)
1721 {
1722 	const struct nft_expr_ops *ops = info->ops;
1723 	int err;
1724 
1725 	expr->ops = ops;
1726 	if (ops->init) {
1727 		err = ops->init(ctx, expr, (const struct nlattr **)info->tb);
1728 		if (err < 0)
1729 			goto err1;
1730 	}
1731 
1732 	return 0;
1733 
1734 err1:
1735 	expr->ops = NULL;
1736 	return err;
1737 }
1738 
nf_tables_expr_destroy(const struct nft_ctx * ctx,struct nft_expr * expr)1739 static void nf_tables_expr_destroy(const struct nft_ctx *ctx,
1740 				   struct nft_expr *expr)
1741 {
1742 	if (expr->ops->destroy)
1743 		expr->ops->destroy(ctx, expr);
1744 	module_put(expr->ops->type->owner);
1745 }
1746 
nft_expr_init(const struct nft_ctx * ctx,const struct nlattr * nla)1747 struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
1748 			       const struct nlattr *nla)
1749 {
1750 	struct nft_expr_info info;
1751 	struct nft_expr *expr;
1752 	int err;
1753 
1754 	err = nf_tables_expr_parse(ctx, nla, &info);
1755 	if (err < 0)
1756 		goto err1;
1757 
1758 	err = -ENOMEM;
1759 	expr = kzalloc(info.ops->size, GFP_KERNEL);
1760 	if (expr == NULL)
1761 		goto err2;
1762 
1763 	err = nf_tables_newexpr(ctx, &info, expr);
1764 	if (err < 0)
1765 		goto err3;
1766 
1767 	return expr;
1768 err3:
1769 	kfree(expr);
1770 err2:
1771 	module_put(info.ops->type->owner);
1772 err1:
1773 	return ERR_PTR(err);
1774 }
1775 
nft_expr_destroy(const struct nft_ctx * ctx,struct nft_expr * expr)1776 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr)
1777 {
1778 	nf_tables_expr_destroy(ctx, expr);
1779 	kfree(expr);
1780 }
1781 
1782 /*
1783  * Rules
1784  */
1785 
__nf_tables_rule_lookup(const struct nft_chain * chain,u64 handle)1786 static struct nft_rule *__nf_tables_rule_lookup(const struct nft_chain *chain,
1787 						u64 handle)
1788 {
1789 	struct nft_rule *rule;
1790 
1791 	// FIXME: this sucks
1792 	list_for_each_entry(rule, &chain->rules, list) {
1793 		if (handle == rule->handle)
1794 			return rule;
1795 	}
1796 
1797 	return ERR_PTR(-ENOENT);
1798 }
1799 
nf_tables_rule_lookup(const struct nft_chain * chain,const struct nlattr * nla)1800 static struct nft_rule *nf_tables_rule_lookup(const struct nft_chain *chain,
1801 					      const struct nlattr *nla)
1802 {
1803 	if (nla == NULL)
1804 		return ERR_PTR(-EINVAL);
1805 
1806 	return __nf_tables_rule_lookup(chain, be64_to_cpu(nla_get_be64(nla)));
1807 }
1808 
1809 static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = {
1810 	[NFTA_RULE_TABLE]	= { .type = NLA_STRING },
1811 	[NFTA_RULE_CHAIN]	= { .type = NLA_STRING,
1812 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
1813 	[NFTA_RULE_HANDLE]	= { .type = NLA_U64 },
1814 	[NFTA_RULE_EXPRESSIONS]	= { .type = NLA_NESTED },
1815 	[NFTA_RULE_COMPAT]	= { .type = NLA_NESTED },
1816 	[NFTA_RULE_POSITION]	= { .type = NLA_U64 },
1817 	[NFTA_RULE_USERDATA]	= { .type = NLA_BINARY,
1818 				    .len = NFT_USERDATA_MAXLEN },
1819 };
1820 
nf_tables_fill_rule_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table,const struct nft_chain * chain,const struct nft_rule * rule)1821 static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
1822 				    u32 portid, u32 seq, int event,
1823 				    u32 flags, int family,
1824 				    const struct nft_table *table,
1825 				    const struct nft_chain *chain,
1826 				    const struct nft_rule *rule)
1827 {
1828 	struct nlmsghdr *nlh;
1829 	struct nfgenmsg *nfmsg;
1830 	const struct nft_expr *expr, *next;
1831 	struct nlattr *list;
1832 	const struct nft_rule *prule;
1833 	int type = event | NFNL_SUBSYS_NFTABLES << 8;
1834 
1835 	nlh = nlmsg_put(skb, portid, seq, type, sizeof(struct nfgenmsg),
1836 			flags);
1837 	if (nlh == NULL)
1838 		goto nla_put_failure;
1839 
1840 	nfmsg = nlmsg_data(nlh);
1841 	nfmsg->nfgen_family	= family;
1842 	nfmsg->version		= NFNETLINK_V0;
1843 	nfmsg->res_id		= htons(net->nft.base_seq & 0xffff);
1844 
1845 	if (nla_put_string(skb, NFTA_RULE_TABLE, table->name))
1846 		goto nla_put_failure;
1847 	if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name))
1848 		goto nla_put_failure;
1849 	if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle),
1850 			 NFTA_RULE_PAD))
1851 		goto nla_put_failure;
1852 
1853 	if ((event != NFT_MSG_DELRULE) && (rule->list.prev != &chain->rules)) {
1854 		prule = list_entry(rule->list.prev, struct nft_rule, list);
1855 		if (nla_put_be64(skb, NFTA_RULE_POSITION,
1856 				 cpu_to_be64(prule->handle),
1857 				 NFTA_RULE_PAD))
1858 			goto nla_put_failure;
1859 	}
1860 
1861 	list = nla_nest_start(skb, NFTA_RULE_EXPRESSIONS);
1862 	if (list == NULL)
1863 		goto nla_put_failure;
1864 	nft_rule_for_each_expr(expr, next, rule) {
1865 		if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr) < 0)
1866 			goto nla_put_failure;
1867 	}
1868 	nla_nest_end(skb, list);
1869 
1870 	if (rule->udata) {
1871 		struct nft_userdata *udata = nft_userdata(rule);
1872 		if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1,
1873 			    udata->data) < 0)
1874 			goto nla_put_failure;
1875 	}
1876 
1877 	nlmsg_end(skb, nlh);
1878 	return 0;
1879 
1880 nla_put_failure:
1881 	nlmsg_trim(skb, nlh);
1882 	return -1;
1883 }
1884 
nf_tables_rule_notify(const struct nft_ctx * ctx,const struct nft_rule * rule,int event)1885 static int nf_tables_rule_notify(const struct nft_ctx *ctx,
1886 				 const struct nft_rule *rule,
1887 				 int event)
1888 {
1889 	struct sk_buff *skb;
1890 	int err;
1891 
1892 	if (!ctx->report &&
1893 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1894 		return 0;
1895 
1896 	err = -ENOBUFS;
1897 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1898 	if (skb == NULL)
1899 		goto err;
1900 
1901 	err = nf_tables_fill_rule_info(skb, ctx->net, ctx->portid, ctx->seq,
1902 				       event, 0, ctx->afi->family, ctx->table,
1903 				       ctx->chain, rule);
1904 	if (err < 0) {
1905 		kfree_skb(skb);
1906 		goto err;
1907 	}
1908 
1909 	err = nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
1910 			     ctx->report, GFP_KERNEL);
1911 err:
1912 	if (err < 0) {
1913 		nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES,
1914 				  err);
1915 	}
1916 	return err;
1917 }
1918 
1919 struct nft_rule_dump_ctx {
1920 	char table[NFT_TABLE_MAXNAMELEN];
1921 	char chain[NFT_CHAIN_MAXNAMELEN];
1922 };
1923 
nf_tables_dump_rules(struct sk_buff * skb,struct netlink_callback * cb)1924 static int nf_tables_dump_rules(struct sk_buff *skb,
1925 				struct netlink_callback *cb)
1926 {
1927 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1928 	const struct nft_rule_dump_ctx *ctx = cb->data;
1929 	const struct nft_af_info *afi;
1930 	const struct nft_table *table;
1931 	const struct nft_chain *chain;
1932 	const struct nft_rule *rule;
1933 	unsigned int idx = 0, s_idx = cb->args[0];
1934 	struct net *net = sock_net(skb->sk);
1935 	int family = nfmsg->nfgen_family;
1936 
1937 	rcu_read_lock();
1938 	cb->seq = net->nft.base_seq;
1939 
1940 	list_for_each_entry_rcu(afi, &net->nft.af_info, list) {
1941 		if (family != NFPROTO_UNSPEC && family != afi->family)
1942 			continue;
1943 
1944 		list_for_each_entry_rcu(table, &afi->tables, list) {
1945 			if (ctx && ctx->table[0] &&
1946 			    strcmp(ctx->table, table->name) != 0)
1947 				continue;
1948 
1949 			list_for_each_entry_rcu(chain, &table->chains, list) {
1950 				if (ctx && ctx->chain[0] &&
1951 				    strcmp(ctx->chain, chain->name) != 0)
1952 					continue;
1953 
1954 				list_for_each_entry_rcu(rule, &chain->rules, list) {
1955 					if (!nft_is_active(net, rule))
1956 						goto cont;
1957 					if (idx < s_idx)
1958 						goto cont;
1959 					if (idx > s_idx)
1960 						memset(&cb->args[1], 0,
1961 						       sizeof(cb->args) - sizeof(cb->args[0]));
1962 					if (nf_tables_fill_rule_info(skb, net, NETLINK_CB(cb->skb).portid,
1963 								      cb->nlh->nlmsg_seq,
1964 								      NFT_MSG_NEWRULE,
1965 								      NLM_F_MULTI | NLM_F_APPEND,
1966 								      afi->family, table, chain, rule) < 0)
1967 						goto done;
1968 
1969 					nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1970 cont:
1971 					idx++;
1972 				}
1973 			}
1974 		}
1975 	}
1976 done:
1977 	rcu_read_unlock();
1978 
1979 	cb->args[0] = idx;
1980 	return skb->len;
1981 }
1982 
nf_tables_dump_rules_done(struct netlink_callback * cb)1983 static int nf_tables_dump_rules_done(struct netlink_callback *cb)
1984 {
1985 	kfree(cb->data);
1986 	return 0;
1987 }
1988 
nf_tables_getrule(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])1989 static int nf_tables_getrule(struct net *net, struct sock *nlsk,
1990 			     struct sk_buff *skb, const struct nlmsghdr *nlh,
1991 			     const struct nlattr * const nla[])
1992 {
1993 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1994 	u8 genmask = nft_genmask_cur(net);
1995 	const struct nft_af_info *afi;
1996 	const struct nft_table *table;
1997 	const struct nft_chain *chain;
1998 	const struct nft_rule *rule;
1999 	struct sk_buff *skb2;
2000 	int family = nfmsg->nfgen_family;
2001 	int err;
2002 
2003 	if (nlh->nlmsg_flags & NLM_F_DUMP) {
2004 		struct netlink_dump_control c = {
2005 			.dump = nf_tables_dump_rules,
2006 			.done = nf_tables_dump_rules_done,
2007 		};
2008 
2009 		if (nla[NFTA_RULE_TABLE] || nla[NFTA_RULE_CHAIN]) {
2010 			struct nft_rule_dump_ctx *ctx;
2011 
2012 			ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2013 			if (!ctx)
2014 				return -ENOMEM;
2015 
2016 			if (nla[NFTA_RULE_TABLE])
2017 				nla_strlcpy(ctx->table, nla[NFTA_RULE_TABLE],
2018 					    sizeof(ctx->table));
2019 			if (nla[NFTA_RULE_CHAIN])
2020 				nla_strlcpy(ctx->chain, nla[NFTA_RULE_CHAIN],
2021 					    sizeof(ctx->chain));
2022 			c.data = ctx;
2023 		}
2024 
2025 		return netlink_dump_start(nlsk, skb, nlh, &c);
2026 	}
2027 
2028 	afi = nf_tables_afinfo_lookup(net, family, false);
2029 	if (IS_ERR(afi))
2030 		return PTR_ERR(afi);
2031 
2032 	table = nf_tables_table_lookup(afi, nla[NFTA_RULE_TABLE], genmask);
2033 	if (IS_ERR(table))
2034 		return PTR_ERR(table);
2035 
2036 	chain = nf_tables_chain_lookup(table, nla[NFTA_RULE_CHAIN], genmask);
2037 	if (IS_ERR(chain))
2038 		return PTR_ERR(chain);
2039 
2040 	rule = nf_tables_rule_lookup(chain, nla[NFTA_RULE_HANDLE]);
2041 	if (IS_ERR(rule))
2042 		return PTR_ERR(rule);
2043 
2044 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
2045 	if (!skb2)
2046 		return -ENOMEM;
2047 
2048 	err = nf_tables_fill_rule_info(skb2, net, NETLINK_CB(skb).portid,
2049 				       nlh->nlmsg_seq, NFT_MSG_NEWRULE, 0,
2050 				       family, table, chain, rule);
2051 	if (err < 0)
2052 		goto err;
2053 
2054 	return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
2055 
2056 err:
2057 	kfree_skb(skb2);
2058 	return err;
2059 }
2060 
nf_tables_rule_destroy(const struct nft_ctx * ctx,struct nft_rule * rule)2061 static void nf_tables_rule_destroy(const struct nft_ctx *ctx,
2062 				   struct nft_rule *rule)
2063 {
2064 	struct nft_expr *expr;
2065 
2066 	/*
2067 	 * Careful: some expressions might not be initialized in case this
2068 	 * is called on error from nf_tables_newrule().
2069 	 */
2070 	expr = nft_expr_first(rule);
2071 	while (expr != nft_expr_last(rule) && expr->ops) {
2072 		nf_tables_expr_destroy(ctx, expr);
2073 		expr = nft_expr_next(expr);
2074 	}
2075 	kfree(rule);
2076 }
2077 
2078 #define NFT_RULE_MAXEXPRS	128
2079 
2080 static struct nft_expr_info *info;
2081 
nf_tables_newrule(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])2082 static int nf_tables_newrule(struct net *net, struct sock *nlsk,
2083 			     struct sk_buff *skb, const struct nlmsghdr *nlh,
2084 			     const struct nlattr * const nla[])
2085 {
2086 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2087 	u8 genmask = nft_genmask_next(net);
2088 	struct nft_af_info *afi;
2089 	struct nft_table *table;
2090 	struct nft_chain *chain;
2091 	struct nft_rule *rule, *old_rule = NULL;
2092 	struct nft_userdata *udata;
2093 	struct nft_trans *trans = NULL;
2094 	struct nft_expr *expr;
2095 	struct nft_ctx ctx;
2096 	struct nlattr *tmp;
2097 	unsigned int size, i, n, ulen = 0, usize = 0;
2098 	int err, rem;
2099 	bool create;
2100 	u64 handle, pos_handle;
2101 
2102 	create = nlh->nlmsg_flags & NLM_F_CREATE ? true : false;
2103 
2104 	afi = nf_tables_afinfo_lookup(net, nfmsg->nfgen_family, create);
2105 	if (IS_ERR(afi))
2106 		return PTR_ERR(afi);
2107 
2108 	table = nf_tables_table_lookup(afi, nla[NFTA_RULE_TABLE], genmask);
2109 	if (IS_ERR(table))
2110 		return PTR_ERR(table);
2111 
2112 	chain = nf_tables_chain_lookup(table, nla[NFTA_RULE_CHAIN], genmask);
2113 	if (IS_ERR(chain))
2114 		return PTR_ERR(chain);
2115 
2116 	if (nla[NFTA_RULE_HANDLE]) {
2117 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE]));
2118 		rule = __nf_tables_rule_lookup(chain, handle);
2119 		if (IS_ERR(rule))
2120 			return PTR_ERR(rule);
2121 
2122 		if (nlh->nlmsg_flags & NLM_F_EXCL)
2123 			return -EEXIST;
2124 		if (nlh->nlmsg_flags & NLM_F_REPLACE)
2125 			old_rule = rule;
2126 		else
2127 			return -EOPNOTSUPP;
2128 	} else {
2129 		if (!create || nlh->nlmsg_flags & NLM_F_REPLACE)
2130 			return -EINVAL;
2131 		handle = nf_tables_alloc_handle(table);
2132 
2133 		if (chain->use == UINT_MAX)
2134 			return -EOVERFLOW;
2135 	}
2136 
2137 	if (nla[NFTA_RULE_POSITION]) {
2138 		if (!(nlh->nlmsg_flags & NLM_F_CREATE))
2139 			return -EOPNOTSUPP;
2140 
2141 		pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
2142 		old_rule = __nf_tables_rule_lookup(chain, pos_handle);
2143 		if (IS_ERR(old_rule))
2144 			return PTR_ERR(old_rule);
2145 	}
2146 
2147 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, chain, nla);
2148 
2149 	n = 0;
2150 	size = 0;
2151 	if (nla[NFTA_RULE_EXPRESSIONS]) {
2152 		nla_for_each_nested(tmp, nla[NFTA_RULE_EXPRESSIONS], rem) {
2153 			err = -EINVAL;
2154 			if (nla_type(tmp) != NFTA_LIST_ELEM)
2155 				goto err1;
2156 			if (n == NFT_RULE_MAXEXPRS)
2157 				goto err1;
2158 			err = nf_tables_expr_parse(&ctx, tmp, &info[n]);
2159 			if (err < 0)
2160 				goto err1;
2161 			size += info[n].ops->size;
2162 			n++;
2163 		}
2164 	}
2165 	/* Check for overflow of dlen field */
2166 	err = -EFBIG;
2167 	if (size >= 1 << 12)
2168 		goto err1;
2169 
2170 	if (nla[NFTA_RULE_USERDATA]) {
2171 		ulen = nla_len(nla[NFTA_RULE_USERDATA]);
2172 		if (ulen > 0)
2173 			usize = sizeof(struct nft_userdata) + ulen;
2174 	}
2175 
2176 	err = -ENOMEM;
2177 	rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL);
2178 	if (rule == NULL)
2179 		goto err1;
2180 
2181 	nft_activate_next(net, rule);
2182 
2183 	rule->handle = handle;
2184 	rule->dlen   = size;
2185 	rule->udata  = ulen ? 1 : 0;
2186 
2187 	if (ulen) {
2188 		udata = nft_userdata(rule);
2189 		udata->len = ulen - 1;
2190 		nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen);
2191 	}
2192 
2193 	expr = nft_expr_first(rule);
2194 	for (i = 0; i < n; i++) {
2195 		err = nf_tables_newexpr(&ctx, &info[i], expr);
2196 		if (err < 0)
2197 			goto err2;
2198 		info[i].ops = NULL;
2199 		expr = nft_expr_next(expr);
2200 	}
2201 
2202 	if (nlh->nlmsg_flags & NLM_F_REPLACE) {
2203 		if (nft_is_active_next(net, old_rule)) {
2204 			trans = nft_trans_rule_add(&ctx, NFT_MSG_DELRULE,
2205 						   old_rule);
2206 			if (trans == NULL) {
2207 				err = -ENOMEM;
2208 				goto err2;
2209 			}
2210 			nft_deactivate_next(net, old_rule);
2211 			chain->use--;
2212 			list_add_tail_rcu(&rule->list, &old_rule->list);
2213 		} else {
2214 			err = -ENOENT;
2215 			goto err2;
2216 		}
2217 	} else if (nlh->nlmsg_flags & NLM_F_APPEND)
2218 		if (old_rule)
2219 			list_add_rcu(&rule->list, &old_rule->list);
2220 		else
2221 			list_add_tail_rcu(&rule->list, &chain->rules);
2222 	else {
2223 		if (old_rule)
2224 			list_add_tail_rcu(&rule->list, &old_rule->list);
2225 		else
2226 			list_add_rcu(&rule->list, &chain->rules);
2227 	}
2228 
2229 	if (nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule) == NULL) {
2230 		err = -ENOMEM;
2231 		goto err3;
2232 	}
2233 	chain->use++;
2234 	return 0;
2235 
2236 err3:
2237 	list_del_rcu(&rule->list);
2238 err2:
2239 	nf_tables_rule_destroy(&ctx, rule);
2240 err1:
2241 	for (i = 0; i < n; i++) {
2242 		if (info[i].ops != NULL)
2243 			module_put(info[i].ops->type->owner);
2244 	}
2245 	return err;
2246 }
2247 
nf_tables_delrule(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])2248 static int nf_tables_delrule(struct net *net, struct sock *nlsk,
2249 			     struct sk_buff *skb, const struct nlmsghdr *nlh,
2250 			     const struct nlattr * const nla[])
2251 {
2252 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2253 	u8 genmask = nft_genmask_next(net);
2254 	struct nft_af_info *afi;
2255 	struct nft_table *table;
2256 	struct nft_chain *chain = NULL;
2257 	struct nft_rule *rule;
2258 	int family = nfmsg->nfgen_family, err = 0;
2259 	struct nft_ctx ctx;
2260 
2261 	afi = nf_tables_afinfo_lookup(net, family, false);
2262 	if (IS_ERR(afi))
2263 		return PTR_ERR(afi);
2264 
2265 	table = nf_tables_table_lookup(afi, nla[NFTA_RULE_TABLE], genmask);
2266 	if (IS_ERR(table))
2267 		return PTR_ERR(table);
2268 
2269 	if (nla[NFTA_RULE_CHAIN]) {
2270 		chain = nf_tables_chain_lookup(table, nla[NFTA_RULE_CHAIN],
2271 					       genmask);
2272 		if (IS_ERR(chain))
2273 			return PTR_ERR(chain);
2274 	}
2275 
2276 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, chain, nla);
2277 
2278 	if (chain) {
2279 		if (nla[NFTA_RULE_HANDLE]) {
2280 			rule = nf_tables_rule_lookup(chain,
2281 						     nla[NFTA_RULE_HANDLE]);
2282 			if (IS_ERR(rule))
2283 				return PTR_ERR(rule);
2284 
2285 			err = nft_delrule(&ctx, rule);
2286 		} else {
2287 			err = nft_delrule_by_chain(&ctx);
2288 		}
2289 	} else {
2290 		list_for_each_entry(chain, &table->chains, list) {
2291 			if (!nft_is_active_next(net, chain))
2292 				continue;
2293 
2294 			ctx.chain = chain;
2295 			err = nft_delrule_by_chain(&ctx);
2296 			if (err < 0)
2297 				break;
2298 		}
2299 	}
2300 
2301 	return err;
2302 }
2303 
2304 /*
2305  * Sets
2306  */
2307 
2308 static LIST_HEAD(nf_tables_set_ops);
2309 
nft_register_set(struct nft_set_ops * ops)2310 int nft_register_set(struct nft_set_ops *ops)
2311 {
2312 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
2313 	list_add_tail_rcu(&ops->list, &nf_tables_set_ops);
2314 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
2315 	return 0;
2316 }
2317 EXPORT_SYMBOL_GPL(nft_register_set);
2318 
nft_unregister_set(struct nft_set_ops * ops)2319 void nft_unregister_set(struct nft_set_ops *ops)
2320 {
2321 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
2322 	list_del_rcu(&ops->list);
2323 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
2324 }
2325 EXPORT_SYMBOL_GPL(nft_unregister_set);
2326 
2327 /*
2328  * Select a set implementation based on the data characteristics and the
2329  * given policy. The total memory use might not be known if no size is
2330  * given, in that case the amount of memory per element is used.
2331  */
2332 static const struct nft_set_ops *
nft_select_set_ops(const struct nlattr * const nla[],const struct nft_set_desc * desc,enum nft_set_policies policy)2333 nft_select_set_ops(const struct nlattr * const nla[],
2334 		   const struct nft_set_desc *desc,
2335 		   enum nft_set_policies policy)
2336 {
2337 	const struct nft_set_ops *ops, *bops;
2338 	struct nft_set_estimate est, best;
2339 	u32 features;
2340 
2341 #ifdef CONFIG_MODULES
2342 	if (list_empty(&nf_tables_set_ops)) {
2343 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
2344 		request_module("nft-set");
2345 		nfnl_lock(NFNL_SUBSYS_NFTABLES);
2346 		if (!list_empty(&nf_tables_set_ops))
2347 			return ERR_PTR(-EAGAIN);
2348 	}
2349 #endif
2350 	features = 0;
2351 	if (nla[NFTA_SET_FLAGS] != NULL) {
2352 		features = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
2353 		features &= NFT_SET_INTERVAL | NFT_SET_MAP | NFT_SET_TIMEOUT;
2354 	}
2355 
2356 	bops	   = NULL;
2357 	best.size  = ~0;
2358 	best.class = ~0;
2359 
2360 	list_for_each_entry(ops, &nf_tables_set_ops, list) {
2361 		if ((ops->features & features) != features)
2362 			continue;
2363 		if (!ops->estimate(desc, features, &est))
2364 			continue;
2365 
2366 		switch (policy) {
2367 		case NFT_SET_POL_PERFORMANCE:
2368 			if (est.class < best.class)
2369 				break;
2370 			if (est.class == best.class && est.size < best.size)
2371 				break;
2372 			continue;
2373 		case NFT_SET_POL_MEMORY:
2374 			if (est.size < best.size)
2375 				break;
2376 			if (est.size == best.size && est.class < best.class)
2377 				break;
2378 			continue;
2379 		default:
2380 			break;
2381 		}
2382 
2383 		if (!try_module_get(ops->owner))
2384 			continue;
2385 		if (bops != NULL)
2386 			module_put(bops->owner);
2387 
2388 		bops = ops;
2389 		best = est;
2390 	}
2391 
2392 	if (bops != NULL)
2393 		return bops;
2394 
2395 	return ERR_PTR(-EOPNOTSUPP);
2396 }
2397 
2398 static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
2399 	[NFTA_SET_TABLE]		= { .type = NLA_STRING },
2400 	[NFTA_SET_NAME]			= { .type = NLA_STRING,
2401 					    .len = NFT_SET_MAXNAMELEN - 1 },
2402 	[NFTA_SET_FLAGS]		= { .type = NLA_U32 },
2403 	[NFTA_SET_KEY_TYPE]		= { .type = NLA_U32 },
2404 	[NFTA_SET_KEY_LEN]		= { .type = NLA_U32 },
2405 	[NFTA_SET_DATA_TYPE]		= { .type = NLA_U32 },
2406 	[NFTA_SET_DATA_LEN]		= { .type = NLA_U32 },
2407 	[NFTA_SET_POLICY]		= { .type = NLA_U32 },
2408 	[NFTA_SET_DESC]			= { .type = NLA_NESTED },
2409 	[NFTA_SET_ID]			= { .type = NLA_U32 },
2410 	[NFTA_SET_TIMEOUT]		= { .type = NLA_U64 },
2411 	[NFTA_SET_GC_INTERVAL]		= { .type = NLA_U32 },
2412 	[NFTA_SET_USERDATA]		= { .type = NLA_BINARY,
2413 					    .len  = NFT_USERDATA_MAXLEN },
2414 };
2415 
2416 static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = {
2417 	[NFTA_SET_DESC_SIZE]		= { .type = NLA_U32 },
2418 };
2419 
nft_ctx_init_from_setattr(struct nft_ctx * ctx,struct net * net,const struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[],u8 genmask)2420 static int nft_ctx_init_from_setattr(struct nft_ctx *ctx, struct net *net,
2421 				     const struct sk_buff *skb,
2422 				     const struct nlmsghdr *nlh,
2423 				     const struct nlattr * const nla[],
2424 				     u8 genmask)
2425 {
2426 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2427 	struct nft_af_info *afi = NULL;
2428 	struct nft_table *table = NULL;
2429 
2430 	if (nfmsg->nfgen_family != NFPROTO_UNSPEC) {
2431 		afi = nf_tables_afinfo_lookup(net, nfmsg->nfgen_family, false);
2432 		if (IS_ERR(afi))
2433 			return PTR_ERR(afi);
2434 	}
2435 
2436 	if (nla[NFTA_SET_TABLE] != NULL) {
2437 		if (afi == NULL)
2438 			return -EAFNOSUPPORT;
2439 
2440 		table = nf_tables_table_lookup(afi, nla[NFTA_SET_TABLE],
2441 					       genmask);
2442 		if (IS_ERR(table))
2443 			return PTR_ERR(table);
2444 	}
2445 
2446 	nft_ctx_init(ctx, net, skb, nlh, afi, table, NULL, nla);
2447 	return 0;
2448 }
2449 
nf_tables_set_lookup(const struct nft_table * table,const struct nlattr * nla,u8 genmask)2450 struct nft_set *nf_tables_set_lookup(const struct nft_table *table,
2451 				     const struct nlattr *nla, u8 genmask)
2452 {
2453 	struct nft_set *set;
2454 
2455 	if (nla == NULL)
2456 		return ERR_PTR(-EINVAL);
2457 
2458 	list_for_each_entry(set, &table->sets, list) {
2459 		if (!nla_strcmp(nla, set->name) &&
2460 		    nft_active_genmask(set, genmask))
2461 			return set;
2462 	}
2463 	return ERR_PTR(-ENOENT);
2464 }
2465 
nf_tables_set_lookup_byid(const struct net * net,const struct nlattr * nla,u8 genmask)2466 struct nft_set *nf_tables_set_lookup_byid(const struct net *net,
2467 					  const struct nlattr *nla,
2468 					  u8 genmask)
2469 {
2470 	struct nft_trans *trans;
2471 	u32 id = ntohl(nla_get_be32(nla));
2472 
2473 	list_for_each_entry(trans, &net->nft.commit_list, list) {
2474 		struct nft_set *set = nft_trans_set(trans);
2475 
2476 		if (trans->msg_type == NFT_MSG_NEWSET &&
2477 		    id == nft_trans_set_id(trans) &&
2478 		    nft_active_genmask(set, genmask))
2479 			return set;
2480 	}
2481 	return ERR_PTR(-ENOENT);
2482 }
2483 
nf_tables_set_alloc_name(struct nft_ctx * ctx,struct nft_set * set,const char * name)2484 static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set,
2485 				    const char *name)
2486 {
2487 	const struct nft_set *i;
2488 	const char *p;
2489 	unsigned long *inuse;
2490 	unsigned int n = 0, min = 0;
2491 
2492 	p = strnchr(name, NFT_SET_MAXNAMELEN, '%');
2493 	if (p != NULL) {
2494 		if (p[1] != 'd' || strchr(p + 2, '%'))
2495 			return -EINVAL;
2496 
2497 		inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL);
2498 		if (inuse == NULL)
2499 			return -ENOMEM;
2500 cont:
2501 		list_for_each_entry(i, &ctx->table->sets, list) {
2502 			int tmp;
2503 
2504 			if (!nft_is_active_next(ctx->net, set))
2505 				continue;
2506 			if (!sscanf(i->name, name, &tmp))
2507 				continue;
2508 			if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE)
2509 				continue;
2510 
2511 			set_bit(tmp - min, inuse);
2512 		}
2513 
2514 		n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE);
2515 		if (n >= BITS_PER_BYTE * PAGE_SIZE) {
2516 			min += BITS_PER_BYTE * PAGE_SIZE;
2517 			memset(inuse, 0, PAGE_SIZE);
2518 			goto cont;
2519 		}
2520 		free_page((unsigned long)inuse);
2521 	}
2522 
2523 	snprintf(set->name, sizeof(set->name), name, min + n);
2524 	list_for_each_entry(i, &ctx->table->sets, list) {
2525 		if (!nft_is_active_next(ctx->net, i))
2526 			continue;
2527 		if (!strcmp(set->name, i->name))
2528 			return -ENFILE;
2529 	}
2530 	return 0;
2531 }
2532 
nf_tables_fill_set(struct sk_buff * skb,const struct nft_ctx * ctx,const struct nft_set * set,u16 event,u16 flags)2533 static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
2534 			      const struct nft_set *set, u16 event, u16 flags)
2535 {
2536 	struct nfgenmsg *nfmsg;
2537 	struct nlmsghdr *nlh;
2538 	struct nlattr *desc;
2539 	u32 portid = ctx->portid;
2540 	u32 seq = ctx->seq;
2541 
2542 	event |= NFNL_SUBSYS_NFTABLES << 8;
2543 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
2544 			flags);
2545 	if (nlh == NULL)
2546 		goto nla_put_failure;
2547 
2548 	nfmsg = nlmsg_data(nlh);
2549 	nfmsg->nfgen_family	= ctx->afi->family;
2550 	nfmsg->version		= NFNETLINK_V0;
2551 	nfmsg->res_id		= htons(ctx->net->nft.base_seq & 0xffff);
2552 
2553 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
2554 		goto nla_put_failure;
2555 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
2556 		goto nla_put_failure;
2557 	if (set->flags != 0)
2558 		if (nla_put_be32(skb, NFTA_SET_FLAGS, htonl(set->flags)))
2559 			goto nla_put_failure;
2560 
2561 	if (nla_put_be32(skb, NFTA_SET_KEY_TYPE, htonl(set->ktype)))
2562 		goto nla_put_failure;
2563 	if (nla_put_be32(skb, NFTA_SET_KEY_LEN, htonl(set->klen)))
2564 		goto nla_put_failure;
2565 	if (set->flags & NFT_SET_MAP) {
2566 		if (nla_put_be32(skb, NFTA_SET_DATA_TYPE, htonl(set->dtype)))
2567 			goto nla_put_failure;
2568 		if (nla_put_be32(skb, NFTA_SET_DATA_LEN, htonl(set->dlen)))
2569 			goto nla_put_failure;
2570 	}
2571 
2572 	if (set->timeout &&
2573 	    nla_put_be64(skb, NFTA_SET_TIMEOUT,
2574 			 cpu_to_be64(jiffies_to_msecs(set->timeout)),
2575 			 NFTA_SET_PAD))
2576 		goto nla_put_failure;
2577 	if (set->gc_int &&
2578 	    nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(set->gc_int)))
2579 		goto nla_put_failure;
2580 
2581 	if (set->policy != NFT_SET_POL_PERFORMANCE) {
2582 		if (nla_put_be32(skb, NFTA_SET_POLICY, htonl(set->policy)))
2583 			goto nla_put_failure;
2584 	}
2585 
2586 	if (nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata))
2587 		goto nla_put_failure;
2588 
2589 	desc = nla_nest_start(skb, NFTA_SET_DESC);
2590 	if (desc == NULL)
2591 		goto nla_put_failure;
2592 	if (set->size &&
2593 	    nla_put_be32(skb, NFTA_SET_DESC_SIZE, htonl(set->size)))
2594 		goto nla_put_failure;
2595 	nla_nest_end(skb, desc);
2596 
2597 	nlmsg_end(skb, nlh);
2598 	return 0;
2599 
2600 nla_put_failure:
2601 	nlmsg_trim(skb, nlh);
2602 	return -1;
2603 }
2604 
nf_tables_set_notify(const struct nft_ctx * ctx,const struct nft_set * set,int event,gfp_t gfp_flags)2605 static int nf_tables_set_notify(const struct nft_ctx *ctx,
2606 				const struct nft_set *set,
2607 				int event, gfp_t gfp_flags)
2608 {
2609 	struct sk_buff *skb;
2610 	u32 portid = ctx->portid;
2611 	int err;
2612 
2613 	if (!ctx->report &&
2614 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
2615 		return 0;
2616 
2617 	err = -ENOBUFS;
2618 	skb = nlmsg_new(NLMSG_GOODSIZE, gfp_flags);
2619 	if (skb == NULL)
2620 		goto err;
2621 
2622 	err = nf_tables_fill_set(skb, ctx, set, event, 0);
2623 	if (err < 0) {
2624 		kfree_skb(skb);
2625 		goto err;
2626 	}
2627 
2628 	err = nfnetlink_send(skb, ctx->net, portid, NFNLGRP_NFTABLES,
2629 			     ctx->report, gfp_flags);
2630 err:
2631 	if (err < 0)
2632 		nfnetlink_set_err(ctx->net, portid, NFNLGRP_NFTABLES, err);
2633 	return err;
2634 }
2635 
nf_tables_dump_sets(struct sk_buff * skb,struct netlink_callback * cb)2636 static int nf_tables_dump_sets(struct sk_buff *skb, struct netlink_callback *cb)
2637 {
2638 	const struct nft_set *set;
2639 	unsigned int idx, s_idx = cb->args[0];
2640 	struct nft_af_info *afi;
2641 	struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2];
2642 	struct net *net = sock_net(skb->sk);
2643 	int cur_family = cb->args[3];
2644 	struct nft_ctx *ctx = cb->data, ctx_set;
2645 
2646 	if (cb->args[1])
2647 		return skb->len;
2648 
2649 	rcu_read_lock();
2650 	cb->seq = net->nft.base_seq;
2651 
2652 	list_for_each_entry_rcu(afi, &net->nft.af_info, list) {
2653 		if (ctx->afi && ctx->afi != afi)
2654 			continue;
2655 
2656 		if (cur_family) {
2657 			if (afi->family != cur_family)
2658 				continue;
2659 
2660 			cur_family = 0;
2661 		}
2662 		list_for_each_entry_rcu(table, &afi->tables, list) {
2663 			if (ctx->table && ctx->table != table)
2664 				continue;
2665 
2666 			if (cur_table) {
2667 				if (cur_table != table)
2668 					continue;
2669 
2670 				cur_table = NULL;
2671 			}
2672 			idx = 0;
2673 			list_for_each_entry_rcu(set, &table->sets, list) {
2674 				if (idx < s_idx)
2675 					goto cont;
2676 				if (!nft_is_active(net, set))
2677 					goto cont;
2678 
2679 				ctx_set = *ctx;
2680 				ctx_set.table = table;
2681 				ctx_set.afi = afi;
2682 				if (nf_tables_fill_set(skb, &ctx_set, set,
2683 						       NFT_MSG_NEWSET,
2684 						       NLM_F_MULTI) < 0) {
2685 					cb->args[0] = idx;
2686 					cb->args[2] = (unsigned long) table;
2687 					cb->args[3] = afi->family;
2688 					goto done;
2689 				}
2690 				nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2691 cont:
2692 				idx++;
2693 			}
2694 			if (s_idx)
2695 				s_idx = 0;
2696 		}
2697 	}
2698 	cb->args[1] = 1;
2699 done:
2700 	rcu_read_unlock();
2701 	return skb->len;
2702 }
2703 
nf_tables_dump_sets_done(struct netlink_callback * cb)2704 static int nf_tables_dump_sets_done(struct netlink_callback *cb)
2705 {
2706 	kfree(cb->data);
2707 	return 0;
2708 }
2709 
nf_tables_getset(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])2710 static int nf_tables_getset(struct net *net, struct sock *nlsk,
2711 			    struct sk_buff *skb, const struct nlmsghdr *nlh,
2712 			    const struct nlattr * const nla[])
2713 {
2714 	u8 genmask = nft_genmask_cur(net);
2715 	const struct nft_set *set;
2716 	struct nft_ctx ctx;
2717 	struct sk_buff *skb2;
2718 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2719 	int err;
2720 
2721 	/* Verify existence before starting dump */
2722 	err = nft_ctx_init_from_setattr(&ctx, net, skb, nlh, nla, genmask);
2723 	if (err < 0)
2724 		return err;
2725 
2726 	if (nlh->nlmsg_flags & NLM_F_DUMP) {
2727 		struct netlink_dump_control c = {
2728 			.dump = nf_tables_dump_sets,
2729 			.done = nf_tables_dump_sets_done,
2730 		};
2731 		struct nft_ctx *ctx_dump;
2732 
2733 		ctx_dump = kmalloc(sizeof(*ctx_dump), GFP_KERNEL);
2734 		if (ctx_dump == NULL)
2735 			return -ENOMEM;
2736 
2737 		*ctx_dump = ctx;
2738 		c.data = ctx_dump;
2739 
2740 		return netlink_dump_start(nlsk, skb, nlh, &c);
2741 	}
2742 
2743 	/* Only accept unspec with dump */
2744 	if (nfmsg->nfgen_family == NFPROTO_UNSPEC)
2745 		return -EAFNOSUPPORT;
2746 	if (!nla[NFTA_SET_TABLE])
2747 		return -EINVAL;
2748 
2749 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_NAME], genmask);
2750 	if (IS_ERR(set))
2751 		return PTR_ERR(set);
2752 
2753 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
2754 	if (skb2 == NULL)
2755 		return -ENOMEM;
2756 
2757 	err = nf_tables_fill_set(skb2, &ctx, set, NFT_MSG_NEWSET, 0);
2758 	if (err < 0)
2759 		goto err;
2760 
2761 	return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
2762 
2763 err:
2764 	kfree_skb(skb2);
2765 	return err;
2766 }
2767 
nf_tables_set_desc_parse(const struct nft_ctx * ctx,struct nft_set_desc * desc,const struct nlattr * nla)2768 static int nf_tables_set_desc_parse(const struct nft_ctx *ctx,
2769 				    struct nft_set_desc *desc,
2770 				    const struct nlattr *nla)
2771 {
2772 	struct nlattr *da[NFTA_SET_DESC_MAX + 1];
2773 	int err;
2774 
2775 	err = nla_parse_nested(da, NFTA_SET_DESC_MAX, nla, nft_set_desc_policy);
2776 	if (err < 0)
2777 		return err;
2778 
2779 	if (da[NFTA_SET_DESC_SIZE] != NULL)
2780 		desc->size = ntohl(nla_get_be32(da[NFTA_SET_DESC_SIZE]));
2781 
2782 	return 0;
2783 }
2784 
nf_tables_newset(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])2785 static int nf_tables_newset(struct net *net, struct sock *nlsk,
2786 			    struct sk_buff *skb, const struct nlmsghdr *nlh,
2787 			    const struct nlattr * const nla[])
2788 {
2789 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2790 	u8 genmask = nft_genmask_next(net);
2791 	const struct nft_set_ops *ops;
2792 	struct nft_af_info *afi;
2793 	struct nft_table *table;
2794 	struct nft_set *set;
2795 	struct nft_ctx ctx;
2796 	char name[NFT_SET_MAXNAMELEN];
2797 	unsigned int size;
2798 	bool create;
2799 	u64 timeout;
2800 	u32 ktype, dtype, flags, policy, gc_int;
2801 	struct nft_set_desc desc;
2802 	unsigned char *udata;
2803 	u16 udlen;
2804 	int err;
2805 
2806 	if (nla[NFTA_SET_TABLE] == NULL ||
2807 	    nla[NFTA_SET_NAME] == NULL ||
2808 	    nla[NFTA_SET_KEY_LEN] == NULL ||
2809 	    nla[NFTA_SET_ID] == NULL)
2810 		return -EINVAL;
2811 
2812 	memset(&desc, 0, sizeof(desc));
2813 
2814 	ktype = NFT_DATA_VALUE;
2815 	if (nla[NFTA_SET_KEY_TYPE] != NULL) {
2816 		ktype = ntohl(nla_get_be32(nla[NFTA_SET_KEY_TYPE]));
2817 		if ((ktype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK)
2818 			return -EINVAL;
2819 	}
2820 
2821 	desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN]));
2822 	if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN)
2823 		return -EINVAL;
2824 
2825 	flags = 0;
2826 	if (nla[NFTA_SET_FLAGS] != NULL) {
2827 		flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
2828 		if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT |
2829 			      NFT_SET_INTERVAL | NFT_SET_TIMEOUT |
2830 			      NFT_SET_MAP | NFT_SET_EVAL))
2831 			return -EINVAL;
2832 		/* Only one of both operations is supported */
2833 		if ((flags & (NFT_SET_MAP | NFT_SET_EVAL)) ==
2834 			     (NFT_SET_MAP | NFT_SET_EVAL))
2835 			return -EOPNOTSUPP;
2836 	}
2837 
2838 	dtype = 0;
2839 	if (nla[NFTA_SET_DATA_TYPE] != NULL) {
2840 		if (!(flags & NFT_SET_MAP))
2841 			return -EINVAL;
2842 
2843 		dtype = ntohl(nla_get_be32(nla[NFTA_SET_DATA_TYPE]));
2844 		if ((dtype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK &&
2845 		    dtype != NFT_DATA_VERDICT)
2846 			return -EINVAL;
2847 
2848 		if (dtype != NFT_DATA_VERDICT) {
2849 			if (nla[NFTA_SET_DATA_LEN] == NULL)
2850 				return -EINVAL;
2851 			desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN]));
2852 			if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN)
2853 				return -EINVAL;
2854 		} else
2855 			desc.dlen = sizeof(struct nft_verdict);
2856 	} else if (flags & NFT_SET_MAP)
2857 		return -EINVAL;
2858 
2859 	timeout = 0;
2860 	if (nla[NFTA_SET_TIMEOUT] != NULL) {
2861 		if (!(flags & NFT_SET_TIMEOUT))
2862 			return -EINVAL;
2863 		timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
2864 						nla[NFTA_SET_TIMEOUT])));
2865 	}
2866 	gc_int = 0;
2867 	if (nla[NFTA_SET_GC_INTERVAL] != NULL) {
2868 		if (!(flags & NFT_SET_TIMEOUT))
2869 			return -EINVAL;
2870 		gc_int = ntohl(nla_get_be32(nla[NFTA_SET_GC_INTERVAL]));
2871 	}
2872 
2873 	policy = NFT_SET_POL_PERFORMANCE;
2874 	if (nla[NFTA_SET_POLICY] != NULL)
2875 		policy = ntohl(nla_get_be32(nla[NFTA_SET_POLICY]));
2876 
2877 	if (nla[NFTA_SET_DESC] != NULL) {
2878 		err = nf_tables_set_desc_parse(&ctx, &desc, nla[NFTA_SET_DESC]);
2879 		if (err < 0)
2880 			return err;
2881 	}
2882 
2883 	create = nlh->nlmsg_flags & NLM_F_CREATE ? true : false;
2884 
2885 	afi = nf_tables_afinfo_lookup(net, nfmsg->nfgen_family, create);
2886 	if (IS_ERR(afi))
2887 		return PTR_ERR(afi);
2888 
2889 	table = nf_tables_table_lookup(afi, nla[NFTA_SET_TABLE], genmask);
2890 	if (IS_ERR(table))
2891 		return PTR_ERR(table);
2892 
2893 	nft_ctx_init(&ctx, net, skb, nlh, afi, table, NULL, nla);
2894 
2895 	set = nf_tables_set_lookup(table, nla[NFTA_SET_NAME], genmask);
2896 	if (IS_ERR(set)) {
2897 		if (PTR_ERR(set) != -ENOENT)
2898 			return PTR_ERR(set);
2899 		set = NULL;
2900 	}
2901 
2902 	if (set != NULL) {
2903 		if (nlh->nlmsg_flags & NLM_F_EXCL)
2904 			return -EEXIST;
2905 		if (nlh->nlmsg_flags & NLM_F_REPLACE)
2906 			return -EOPNOTSUPP;
2907 		return 0;
2908 	}
2909 
2910 	if (!(nlh->nlmsg_flags & NLM_F_CREATE))
2911 		return -ENOENT;
2912 
2913 	ops = nft_select_set_ops(nla, &desc, policy);
2914 	if (IS_ERR(ops))
2915 		return PTR_ERR(ops);
2916 
2917 	udlen = 0;
2918 	if (nla[NFTA_SET_USERDATA])
2919 		udlen = nla_len(nla[NFTA_SET_USERDATA]);
2920 
2921 	size = 0;
2922 	if (ops->privsize != NULL)
2923 		size = ops->privsize(nla);
2924 
2925 	err = -ENOMEM;
2926 	set = kzalloc(sizeof(*set) + size + udlen, GFP_KERNEL);
2927 	if (set == NULL)
2928 		goto err1;
2929 
2930 	nla_strlcpy(name, nla[NFTA_SET_NAME], sizeof(set->name));
2931 	err = nf_tables_set_alloc_name(&ctx, set, name);
2932 	if (err < 0)
2933 		goto err2;
2934 
2935 	udata = NULL;
2936 	if (udlen) {
2937 		udata = set->data + size;
2938 		nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen);
2939 	}
2940 
2941 	INIT_LIST_HEAD(&set->bindings);
2942 	set->ops   = ops;
2943 	set->ktype = ktype;
2944 	set->klen  = desc.klen;
2945 	set->dtype = dtype;
2946 	set->dlen  = desc.dlen;
2947 	set->flags = flags;
2948 	set->size  = desc.size;
2949 	set->policy = policy;
2950 	set->udlen  = udlen;
2951 	set->udata  = udata;
2952 	set->timeout = timeout;
2953 	set->gc_int = gc_int;
2954 
2955 	err = ops->init(set, &desc, nla);
2956 	if (err < 0)
2957 		goto err2;
2958 
2959 	err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
2960 	if (err < 0)
2961 		goto err3;
2962 
2963 	list_add_tail_rcu(&set->list, &table->sets);
2964 	table->use++;
2965 	return 0;
2966 
2967 err3:
2968 	ops->destroy(set);
2969 err2:
2970 	kfree(set);
2971 err1:
2972 	module_put(ops->owner);
2973 	return err;
2974 }
2975 
nft_set_destroy(struct nft_set * set)2976 static void nft_set_destroy(struct nft_set *set)
2977 {
2978 	set->ops->destroy(set);
2979 	module_put(set->ops->owner);
2980 	kfree(set);
2981 }
2982 
nf_tables_set_destroy(const struct nft_ctx * ctx,struct nft_set * set)2983 static void nf_tables_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
2984 {
2985 	list_del_rcu(&set->list);
2986 	nf_tables_set_notify(ctx, set, NFT_MSG_DELSET, GFP_ATOMIC);
2987 	nft_set_destroy(set);
2988 }
2989 
nf_tables_delset(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])2990 static int nf_tables_delset(struct net *net, struct sock *nlsk,
2991 			    struct sk_buff *skb, const struct nlmsghdr *nlh,
2992 			    const struct nlattr * const nla[])
2993 {
2994 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2995 	u8 genmask = nft_genmask_next(net);
2996 	struct nft_set *set;
2997 	struct nft_ctx ctx;
2998 	int err;
2999 
3000 	if (nfmsg->nfgen_family == NFPROTO_UNSPEC)
3001 		return -EAFNOSUPPORT;
3002 	if (nla[NFTA_SET_TABLE] == NULL)
3003 		return -EINVAL;
3004 
3005 	err = nft_ctx_init_from_setattr(&ctx, net, skb, nlh, nla, genmask);
3006 	if (err < 0)
3007 		return err;
3008 
3009 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_NAME], genmask);
3010 	if (IS_ERR(set))
3011 		return PTR_ERR(set);
3012 	if (!list_empty(&set->bindings))
3013 		return -EBUSY;
3014 
3015 	return nft_delset(&ctx, set);
3016 }
3017 
nf_tables_bind_check_setelem(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_set_iter * iter,const struct nft_set_elem * elem)3018 static int nf_tables_bind_check_setelem(const struct nft_ctx *ctx,
3019 					const struct nft_set *set,
3020 					const struct nft_set_iter *iter,
3021 					const struct nft_set_elem *elem)
3022 {
3023 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
3024 	enum nft_registers dreg;
3025 
3026 	dreg = nft_type_to_reg(set->dtype);
3027 	return nft_validate_register_store(ctx, dreg, nft_set_ext_data(ext),
3028 					   set->dtype == NFT_DATA_VERDICT ?
3029 					   NFT_DATA_VERDICT : NFT_DATA_VALUE,
3030 					   set->dlen);
3031 }
3032 
nf_tables_bind_set(const struct nft_ctx * ctx,struct nft_set * set,struct nft_set_binding * binding)3033 int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
3034 		       struct nft_set_binding *binding)
3035 {
3036 	struct nft_set_binding *i;
3037 	struct nft_set_iter iter;
3038 
3039 	if (!list_empty(&set->bindings) && set->flags & NFT_SET_ANONYMOUS)
3040 		return -EBUSY;
3041 
3042 	if (binding->flags & NFT_SET_MAP) {
3043 		/* If the set is already bound to the same chain all
3044 		 * jumps are already validated for that chain.
3045 		 */
3046 		list_for_each_entry(i, &set->bindings, list) {
3047 			if (i->flags & NFT_SET_MAP &&
3048 			    i->chain == binding->chain)
3049 				goto bind;
3050 		}
3051 
3052 		iter.genmask	= nft_genmask_next(ctx->net);
3053 		iter.skip 	= 0;
3054 		iter.count	= 0;
3055 		iter.err	= 0;
3056 		iter.fn		= nf_tables_bind_check_setelem;
3057 
3058 		set->ops->walk(ctx, set, &iter);
3059 		if (iter.err < 0)
3060 			return iter.err;
3061 	}
3062 bind:
3063 	binding->chain = ctx->chain;
3064 	list_add_tail_rcu(&binding->list, &set->bindings);
3065 	return 0;
3066 }
3067 
nf_tables_unbind_set(const struct nft_ctx * ctx,struct nft_set * set,struct nft_set_binding * binding)3068 void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
3069 			  struct nft_set_binding *binding)
3070 {
3071 	list_del_rcu(&binding->list);
3072 
3073 	if (list_empty(&set->bindings) && set->flags & NFT_SET_ANONYMOUS &&
3074 	    nft_is_active(ctx->net, set))
3075 		nf_tables_set_destroy(ctx, set);
3076 }
3077 
3078 const struct nft_set_ext_type nft_set_ext_types[] = {
3079 	[NFT_SET_EXT_KEY]		= {
3080 		.align	= __alignof__(u32),
3081 	},
3082 	[NFT_SET_EXT_DATA]		= {
3083 		.align	= __alignof__(u32),
3084 	},
3085 	[NFT_SET_EXT_EXPR]		= {
3086 		.align	= __alignof__(struct nft_expr),
3087 	},
3088 	[NFT_SET_EXT_FLAGS]		= {
3089 		.len	= sizeof(u8),
3090 		.align	= __alignof__(u8),
3091 	},
3092 	[NFT_SET_EXT_TIMEOUT]		= {
3093 		.len	= sizeof(u64),
3094 		.align	= __alignof__(u64),
3095 	},
3096 	[NFT_SET_EXT_EXPIRATION]	= {
3097 		.len	= sizeof(unsigned long),
3098 		.align	= __alignof__(unsigned long),
3099 	},
3100 	[NFT_SET_EXT_USERDATA]		= {
3101 		.len	= sizeof(struct nft_userdata),
3102 		.align	= __alignof__(struct nft_userdata),
3103 	},
3104 };
3105 EXPORT_SYMBOL_GPL(nft_set_ext_types);
3106 
3107 /*
3108  * Set elements
3109  */
3110 
3111 static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = {
3112 	[NFTA_SET_ELEM_KEY]		= { .type = NLA_NESTED },
3113 	[NFTA_SET_ELEM_DATA]		= { .type = NLA_NESTED },
3114 	[NFTA_SET_ELEM_FLAGS]		= { .type = NLA_U32 },
3115 	[NFTA_SET_ELEM_TIMEOUT]		= { .type = NLA_U64 },
3116 	[NFTA_SET_ELEM_USERDATA]	= { .type = NLA_BINARY,
3117 					    .len = NFT_USERDATA_MAXLEN },
3118 };
3119 
3120 static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = {
3121 	[NFTA_SET_ELEM_LIST_TABLE]	= { .type = NLA_STRING },
3122 	[NFTA_SET_ELEM_LIST_SET]	= { .type = NLA_STRING },
3123 	[NFTA_SET_ELEM_LIST_ELEMENTS]	= { .type = NLA_NESTED },
3124 	[NFTA_SET_ELEM_LIST_SET_ID]	= { .type = NLA_U32 },
3125 };
3126 
nft_ctx_init_from_elemattr(struct nft_ctx * ctx,struct net * net,const struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[],u8 genmask)3127 static int nft_ctx_init_from_elemattr(struct nft_ctx *ctx, struct net *net,
3128 				      const struct sk_buff *skb,
3129 				      const struct nlmsghdr *nlh,
3130 				      const struct nlattr * const nla[],
3131 				      u8 genmask)
3132 {
3133 	const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3134 	struct nft_af_info *afi;
3135 	struct nft_table *table;
3136 
3137 	afi = nf_tables_afinfo_lookup(net, nfmsg->nfgen_family, false);
3138 	if (IS_ERR(afi))
3139 		return PTR_ERR(afi);
3140 
3141 	table = nf_tables_table_lookup(afi, nla[NFTA_SET_ELEM_LIST_TABLE],
3142 				       genmask);
3143 	if (IS_ERR(table))
3144 		return PTR_ERR(table);
3145 
3146 	nft_ctx_init(ctx, net, skb, nlh, afi, table, NULL, nla);
3147 	return 0;
3148 }
3149 
nf_tables_fill_setelem(struct sk_buff * skb,const struct nft_set * set,const struct nft_set_elem * elem)3150 static int nf_tables_fill_setelem(struct sk_buff *skb,
3151 				  const struct nft_set *set,
3152 				  const struct nft_set_elem *elem)
3153 {
3154 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
3155 	unsigned char *b = skb_tail_pointer(skb);
3156 	struct nlattr *nest;
3157 
3158 	nest = nla_nest_start(skb, NFTA_LIST_ELEM);
3159 	if (nest == NULL)
3160 		goto nla_put_failure;
3161 
3162 	if (nft_data_dump(skb, NFTA_SET_ELEM_KEY, nft_set_ext_key(ext),
3163 			  NFT_DATA_VALUE, set->klen) < 0)
3164 		goto nla_put_failure;
3165 
3166 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
3167 	    nft_data_dump(skb, NFTA_SET_ELEM_DATA, nft_set_ext_data(ext),
3168 			  set->dtype == NFT_DATA_VERDICT ? NFT_DATA_VERDICT : NFT_DATA_VALUE,
3169 			  set->dlen) < 0)
3170 		goto nla_put_failure;
3171 
3172 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR) &&
3173 	    nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, nft_set_ext_expr(ext)) < 0)
3174 		goto nla_put_failure;
3175 
3176 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
3177 	    nla_put_be32(skb, NFTA_SET_ELEM_FLAGS,
3178 		         htonl(*nft_set_ext_flags(ext))))
3179 		goto nla_put_failure;
3180 
3181 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) &&
3182 	    nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT,
3183 			 cpu_to_be64(jiffies_to_msecs(
3184 						*nft_set_ext_timeout(ext))),
3185 			 NFTA_SET_ELEM_PAD))
3186 		goto nla_put_failure;
3187 
3188 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) {
3189 		unsigned long expires, now = jiffies;
3190 
3191 		expires = *nft_set_ext_expiration(ext);
3192 		if (time_before(now, expires))
3193 			expires -= now;
3194 		else
3195 			expires = 0;
3196 
3197 		if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION,
3198 				 cpu_to_be64(jiffies_to_msecs(expires)),
3199 				 NFTA_SET_ELEM_PAD))
3200 			goto nla_put_failure;
3201 	}
3202 
3203 	if (nft_set_ext_exists(ext, NFT_SET_EXT_USERDATA)) {
3204 		struct nft_userdata *udata;
3205 
3206 		udata = nft_set_ext_userdata(ext);
3207 		if (nla_put(skb, NFTA_SET_ELEM_USERDATA,
3208 			    udata->len + 1, udata->data))
3209 			goto nla_put_failure;
3210 	}
3211 
3212 	nla_nest_end(skb, nest);
3213 	return 0;
3214 
3215 nla_put_failure:
3216 	nlmsg_trim(skb, b);
3217 	return -EMSGSIZE;
3218 }
3219 
3220 struct nft_set_dump_args {
3221 	const struct netlink_callback	*cb;
3222 	struct nft_set_iter		iter;
3223 	struct sk_buff			*skb;
3224 };
3225 
nf_tables_dump_setelem(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_set_iter * iter,const struct nft_set_elem * elem)3226 static int nf_tables_dump_setelem(const struct nft_ctx *ctx,
3227 				  const struct nft_set *set,
3228 				  const struct nft_set_iter *iter,
3229 				  const struct nft_set_elem *elem)
3230 {
3231 	struct nft_set_dump_args *args;
3232 
3233 	args = container_of(iter, struct nft_set_dump_args, iter);
3234 	return nf_tables_fill_setelem(args->skb, set, elem);
3235 }
3236 
nf_tables_dump_set(struct sk_buff * skb,struct netlink_callback * cb)3237 static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb)
3238 {
3239 	struct net *net = sock_net(skb->sk);
3240 	u8 genmask = nft_genmask_cur(net);
3241 	const struct nft_set *set;
3242 	struct nft_set_dump_args args;
3243 	struct nft_ctx ctx;
3244 	struct nlattr *nla[NFTA_SET_ELEM_LIST_MAX + 1];
3245 	struct nfgenmsg *nfmsg;
3246 	struct nlmsghdr *nlh;
3247 	struct nlattr *nest;
3248 	u32 portid, seq;
3249 	int event, err;
3250 
3251 	err = nlmsg_parse(cb->nlh, sizeof(struct nfgenmsg), nla,
3252 			  NFTA_SET_ELEM_LIST_MAX, nft_set_elem_list_policy);
3253 	if (err < 0)
3254 		return err;
3255 
3256 	err = nft_ctx_init_from_elemattr(&ctx, net, cb->skb, cb->nlh,
3257 					 (void *)nla, genmask);
3258 	if (err < 0)
3259 		return err;
3260 
3261 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET],
3262 				   genmask);
3263 	if (IS_ERR(set))
3264 		return PTR_ERR(set);
3265 
3266 	event  = NFT_MSG_NEWSETELEM;
3267 	event |= NFNL_SUBSYS_NFTABLES << 8;
3268 	portid = NETLINK_CB(cb->skb).portid;
3269 	seq    = cb->nlh->nlmsg_seq;
3270 
3271 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
3272 			NLM_F_MULTI);
3273 	if (nlh == NULL)
3274 		goto nla_put_failure;
3275 
3276 	nfmsg = nlmsg_data(nlh);
3277 	nfmsg->nfgen_family = ctx.afi->family;
3278 	nfmsg->version      = NFNETLINK_V0;
3279 	nfmsg->res_id	    = htons(ctx.net->nft.base_seq & 0xffff);
3280 
3281 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_TABLE, ctx.table->name))
3282 		goto nla_put_failure;
3283 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_SET, set->name))
3284 		goto nla_put_failure;
3285 
3286 	nest = nla_nest_start(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
3287 	if (nest == NULL)
3288 		goto nla_put_failure;
3289 
3290 	args.cb			= cb;
3291 	args.skb		= skb;
3292 	args.iter.genmask	= nft_genmask_cur(ctx.net);
3293 	args.iter.skip		= cb->args[0];
3294 	args.iter.count		= 0;
3295 	args.iter.err		= 0;
3296 	args.iter.fn		= nf_tables_dump_setelem;
3297 	set->ops->walk(&ctx, set, &args.iter);
3298 
3299 	nla_nest_end(skb, nest);
3300 	nlmsg_end(skb, nlh);
3301 
3302 	if (args.iter.err && args.iter.err != -EMSGSIZE)
3303 		return args.iter.err;
3304 	if (args.iter.count == cb->args[0])
3305 		return 0;
3306 
3307 	cb->args[0] = args.iter.count;
3308 	return skb->len;
3309 
3310 nla_put_failure:
3311 	return -ENOSPC;
3312 }
3313 
nf_tables_getsetelem(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])3314 static int nf_tables_getsetelem(struct net *net, struct sock *nlsk,
3315 				struct sk_buff *skb, const struct nlmsghdr *nlh,
3316 				const struct nlattr * const nla[])
3317 {
3318 	u8 genmask = nft_genmask_cur(net);
3319 	const struct nft_set *set;
3320 	struct nft_ctx ctx;
3321 	int err;
3322 
3323 	err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, genmask);
3324 	if (err < 0)
3325 		return err;
3326 
3327 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET],
3328 				   genmask);
3329 	if (IS_ERR(set))
3330 		return PTR_ERR(set);
3331 
3332 	if (nlh->nlmsg_flags & NLM_F_DUMP) {
3333 		struct netlink_dump_control c = {
3334 			.dump = nf_tables_dump_set,
3335 		};
3336 		return netlink_dump_start(nlsk, skb, nlh, &c);
3337 	}
3338 	return -EOPNOTSUPP;
3339 }
3340 
nf_tables_fill_setelem_info(struct sk_buff * skb,const struct nft_ctx * ctx,u32 seq,u32 portid,int event,u16 flags,const struct nft_set * set,const struct nft_set_elem * elem)3341 static int nf_tables_fill_setelem_info(struct sk_buff *skb,
3342 				       const struct nft_ctx *ctx, u32 seq,
3343 				       u32 portid, int event, u16 flags,
3344 				       const struct nft_set *set,
3345 				       const struct nft_set_elem *elem)
3346 {
3347 	struct nfgenmsg *nfmsg;
3348 	struct nlmsghdr *nlh;
3349 	struct nlattr *nest;
3350 	int err;
3351 
3352 	event |= NFNL_SUBSYS_NFTABLES << 8;
3353 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
3354 			flags);
3355 	if (nlh == NULL)
3356 		goto nla_put_failure;
3357 
3358 	nfmsg = nlmsg_data(nlh);
3359 	nfmsg->nfgen_family	= ctx->afi->family;
3360 	nfmsg->version		= NFNETLINK_V0;
3361 	nfmsg->res_id		= htons(ctx->net->nft.base_seq & 0xffff);
3362 
3363 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
3364 		goto nla_put_failure;
3365 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
3366 		goto nla_put_failure;
3367 
3368 	nest = nla_nest_start(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
3369 	if (nest == NULL)
3370 		goto nla_put_failure;
3371 
3372 	err = nf_tables_fill_setelem(skb, set, elem);
3373 	if (err < 0)
3374 		goto nla_put_failure;
3375 
3376 	nla_nest_end(skb, nest);
3377 
3378 	nlmsg_end(skb, nlh);
3379 	return 0;
3380 
3381 nla_put_failure:
3382 	nlmsg_trim(skb, nlh);
3383 	return -1;
3384 }
3385 
nf_tables_setelem_notify(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_set_elem * elem,int event,u16 flags)3386 static int nf_tables_setelem_notify(const struct nft_ctx *ctx,
3387 				    const struct nft_set *set,
3388 				    const struct nft_set_elem *elem,
3389 				    int event, u16 flags)
3390 {
3391 	struct net *net = ctx->net;
3392 	u32 portid = ctx->portid;
3393 	struct sk_buff *skb;
3394 	int err;
3395 
3396 	if (!ctx->report && !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
3397 		return 0;
3398 
3399 	err = -ENOBUFS;
3400 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
3401 	if (skb == NULL)
3402 		goto err;
3403 
3404 	err = nf_tables_fill_setelem_info(skb, ctx, 0, portid, event, flags,
3405 					  set, elem);
3406 	if (err < 0) {
3407 		kfree_skb(skb);
3408 		goto err;
3409 	}
3410 
3411 	err = nfnetlink_send(skb, net, portid, NFNLGRP_NFTABLES, ctx->report,
3412 			     GFP_KERNEL);
3413 err:
3414 	if (err < 0)
3415 		nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, err);
3416 	return err;
3417 }
3418 
nft_trans_elem_alloc(struct nft_ctx * ctx,int msg_type,struct nft_set * set)3419 static struct nft_trans *nft_trans_elem_alloc(struct nft_ctx *ctx,
3420 					      int msg_type,
3421 					      struct nft_set *set)
3422 {
3423 	struct nft_trans *trans;
3424 
3425 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_elem));
3426 	if (trans == NULL)
3427 		return NULL;
3428 
3429 	nft_trans_elem_set(trans) = set;
3430 	return trans;
3431 }
3432 
nft_set_elem_init(const struct nft_set * set,const struct nft_set_ext_tmpl * tmpl,const u32 * key,const u32 * data,u64 timeout,gfp_t gfp)3433 void *nft_set_elem_init(const struct nft_set *set,
3434 			const struct nft_set_ext_tmpl *tmpl,
3435 			const u32 *key, const u32 *data,
3436 			u64 timeout, gfp_t gfp)
3437 {
3438 	struct nft_set_ext *ext;
3439 	void *elem;
3440 
3441 	elem = kzalloc(set->ops->elemsize + tmpl->len, gfp);
3442 	if (elem == NULL)
3443 		return NULL;
3444 
3445 	ext = nft_set_elem_ext(set, elem);
3446 	nft_set_ext_init(ext, tmpl);
3447 
3448 	memcpy(nft_set_ext_key(ext), key, set->klen);
3449 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
3450 		memcpy(nft_set_ext_data(ext), data, set->dlen);
3451 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION))
3452 		*nft_set_ext_expiration(ext) =
3453 			jiffies + timeout;
3454 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT))
3455 		*nft_set_ext_timeout(ext) = timeout;
3456 
3457 	return elem;
3458 }
3459 
nft_set_elem_destroy(const struct nft_set * set,void * elem,bool destroy_expr)3460 void nft_set_elem_destroy(const struct nft_set *set, void *elem,
3461 			  bool destroy_expr)
3462 {
3463 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem);
3464 
3465 	nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE);
3466 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
3467 		nft_data_uninit(nft_set_ext_data(ext), set->dtype);
3468 	if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPR))
3469 		nf_tables_expr_destroy(NULL, nft_set_ext_expr(ext));
3470 
3471 	kfree(elem);
3472 }
3473 EXPORT_SYMBOL_GPL(nft_set_elem_destroy);
3474 
nft_setelem_parse_flags(const struct nft_set * set,const struct nlattr * attr,u32 * flags)3475 static int nft_setelem_parse_flags(const struct nft_set *set,
3476 				   const struct nlattr *attr, u32 *flags)
3477 {
3478 	if (attr == NULL)
3479 		return 0;
3480 
3481 	*flags = ntohl(nla_get_be32(attr));
3482 	if (*flags & ~NFT_SET_ELEM_INTERVAL_END)
3483 		return -EINVAL;
3484 	if (!(set->flags & NFT_SET_INTERVAL) &&
3485 	    *flags & NFT_SET_ELEM_INTERVAL_END)
3486 		return -EINVAL;
3487 
3488 	return 0;
3489 }
3490 
nft_add_set_elem(struct nft_ctx * ctx,struct nft_set * set,const struct nlattr * attr,u32 nlmsg_flags)3491 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
3492 			    const struct nlattr *attr, u32 nlmsg_flags)
3493 {
3494 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
3495 	struct nft_data_desc d1, d2;
3496 	struct nft_set_ext_tmpl tmpl;
3497 	struct nft_set_ext *ext, *ext2;
3498 	struct nft_set_elem elem;
3499 	struct nft_set_binding *binding;
3500 	struct nft_userdata *udata;
3501 	struct nft_data data;
3502 	enum nft_registers dreg;
3503 	struct nft_trans *trans;
3504 	u32 flags = 0;
3505 	u64 timeout;
3506 	u8 ulen;
3507 	int err;
3508 
3509 	err = nla_parse_nested(nla, NFTA_SET_ELEM_MAX, attr,
3510 			       nft_set_elem_policy);
3511 	if (err < 0)
3512 		return err;
3513 
3514 	if (nla[NFTA_SET_ELEM_KEY] == NULL)
3515 		return -EINVAL;
3516 
3517 	nft_set_ext_prepare(&tmpl);
3518 
3519 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
3520 	if (err < 0)
3521 		return err;
3522 	if (flags != 0)
3523 		nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
3524 
3525 	if (set->flags & NFT_SET_MAP) {
3526 		if (nla[NFTA_SET_ELEM_DATA] == NULL &&
3527 		    !(flags & NFT_SET_ELEM_INTERVAL_END))
3528 			return -EINVAL;
3529 		if (nla[NFTA_SET_ELEM_DATA] != NULL &&
3530 		    flags & NFT_SET_ELEM_INTERVAL_END)
3531 			return -EINVAL;
3532 	} else {
3533 		if (nla[NFTA_SET_ELEM_DATA] != NULL)
3534 			return -EINVAL;
3535 	}
3536 
3537 	timeout = 0;
3538 	if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
3539 		if (!(set->flags & NFT_SET_TIMEOUT))
3540 			return -EINVAL;
3541 		timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
3542 					nla[NFTA_SET_ELEM_TIMEOUT])));
3543 	} else if (set->flags & NFT_SET_TIMEOUT) {
3544 		timeout = set->timeout;
3545 	}
3546 
3547 	err = nft_data_init(ctx, &elem.key.val, sizeof(elem.key), &d1,
3548 			    nla[NFTA_SET_ELEM_KEY]);
3549 	if (err < 0)
3550 		goto err1;
3551 	err = -EINVAL;
3552 	if (d1.type != NFT_DATA_VALUE || d1.len != set->klen)
3553 		goto err2;
3554 
3555 	nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, d1.len);
3556 	if (timeout > 0) {
3557 		nft_set_ext_add(&tmpl, NFT_SET_EXT_EXPIRATION);
3558 		if (timeout != set->timeout)
3559 			nft_set_ext_add(&tmpl, NFT_SET_EXT_TIMEOUT);
3560 	}
3561 
3562 	if (nla[NFTA_SET_ELEM_DATA] != NULL) {
3563 		err = nft_data_init(ctx, &data, sizeof(data), &d2,
3564 				    nla[NFTA_SET_ELEM_DATA]);
3565 		if (err < 0)
3566 			goto err2;
3567 
3568 		err = -EINVAL;
3569 		if (set->dtype != NFT_DATA_VERDICT && d2.len != set->dlen)
3570 			goto err3;
3571 
3572 		dreg = nft_type_to_reg(set->dtype);
3573 		list_for_each_entry(binding, &set->bindings, list) {
3574 			struct nft_ctx bind_ctx = {
3575 				.net	= ctx->net,
3576 				.afi	= ctx->afi,
3577 				.table	= ctx->table,
3578 				.chain	= (struct nft_chain *)binding->chain,
3579 			};
3580 
3581 			if (!(binding->flags & NFT_SET_MAP))
3582 				continue;
3583 
3584 			err = nft_validate_register_store(&bind_ctx, dreg,
3585 							  &data,
3586 							  d2.type, d2.len);
3587 			if (err < 0)
3588 				goto err3;
3589 		}
3590 
3591 		nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, d2.len);
3592 	}
3593 
3594 	/* The full maximum length of userdata can exceed the maximum
3595 	 * offset value (U8_MAX) for following extensions, therefor it
3596 	 * must be the last extension added.
3597 	 */
3598 	ulen = 0;
3599 	if (nla[NFTA_SET_ELEM_USERDATA] != NULL) {
3600 		ulen = nla_len(nla[NFTA_SET_ELEM_USERDATA]);
3601 		if (ulen > 0)
3602 			nft_set_ext_add_length(&tmpl, NFT_SET_EXT_USERDATA,
3603 					       ulen);
3604 	}
3605 
3606 	err = -ENOMEM;
3607 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data, data.data,
3608 				      timeout, GFP_KERNEL);
3609 	if (elem.priv == NULL)
3610 		goto err3;
3611 
3612 	ext = nft_set_elem_ext(set, elem.priv);
3613 	if (flags)
3614 		*nft_set_ext_flags(ext) = flags;
3615 	if (ulen > 0) {
3616 		udata = nft_set_ext_userdata(ext);
3617 		udata->len = ulen - 1;
3618 		nla_memcpy(&udata->data, nla[NFTA_SET_ELEM_USERDATA], ulen);
3619 	}
3620 
3621 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_NEWSETELEM, set);
3622 	if (trans == NULL)
3623 		goto err4;
3624 
3625 	ext->genmask = nft_genmask_cur(ctx->net) | NFT_SET_ELEM_BUSY_MASK;
3626 	err = set->ops->insert(ctx->net, set, &elem, &ext2);
3627 	if (err) {
3628 		if (err == -EEXIST) {
3629 			if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
3630 			    nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) &&
3631 			    memcmp(nft_set_ext_data(ext),
3632 				   nft_set_ext_data(ext2), set->dlen) != 0)
3633 				err = -EBUSY;
3634 			else if (!(nlmsg_flags & NLM_F_EXCL))
3635 				err = 0;
3636 		}
3637 		goto err5;
3638 	}
3639 
3640 	if (set->size &&
3641 	    !atomic_add_unless(&set->nelems, 1, set->size + set->ndeact)) {
3642 		err = -ENFILE;
3643 		goto err6;
3644 	}
3645 
3646 	nft_trans_elem(trans) = elem;
3647 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
3648 	return 0;
3649 
3650 err6:
3651 	set->ops->remove(set, &elem);
3652 err5:
3653 	kfree(trans);
3654 err4:
3655 	kfree(elem.priv);
3656 err3:
3657 	if (nla[NFTA_SET_ELEM_DATA] != NULL)
3658 		nft_data_uninit(&data, d2.type);
3659 err2:
3660 	nft_data_uninit(&elem.key.val, d1.type);
3661 err1:
3662 	return err;
3663 }
3664 
nf_tables_newsetelem(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])3665 static int nf_tables_newsetelem(struct net *net, struct sock *nlsk,
3666 				struct sk_buff *skb, const struct nlmsghdr *nlh,
3667 				const struct nlattr * const nla[])
3668 {
3669 	u8 genmask = nft_genmask_next(net);
3670 	const struct nlattr *attr;
3671 	struct nft_set *set;
3672 	struct nft_ctx ctx;
3673 	int rem, err = 0;
3674 
3675 	if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
3676 		return -EINVAL;
3677 
3678 	err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, genmask);
3679 	if (err < 0)
3680 		return err;
3681 
3682 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET],
3683 				   genmask);
3684 	if (IS_ERR(set)) {
3685 		if (nla[NFTA_SET_ELEM_LIST_SET_ID]) {
3686 			set = nf_tables_set_lookup_byid(net,
3687 					nla[NFTA_SET_ELEM_LIST_SET_ID],
3688 					genmask);
3689 		}
3690 		if (IS_ERR(set))
3691 			return PTR_ERR(set);
3692 	}
3693 
3694 	if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT)
3695 		return -EBUSY;
3696 
3697 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
3698 		err = nft_add_set_elem(&ctx, set, attr, nlh->nlmsg_flags);
3699 		if (err < 0)
3700 			break;
3701 	}
3702 	return err;
3703 }
3704 
nft_del_setelem(struct nft_ctx * ctx,struct nft_set * set,const struct nlattr * attr)3705 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
3706 			   const struct nlattr *attr)
3707 {
3708 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
3709 	struct nft_set_ext_tmpl tmpl;
3710 	struct nft_data_desc desc;
3711 	struct nft_set_elem elem;
3712 	struct nft_set_ext *ext;
3713 	struct nft_trans *trans;
3714 	u32 flags = 0;
3715 	void *priv;
3716 	int err;
3717 
3718 	err = nla_parse_nested(nla, NFTA_SET_ELEM_MAX, attr,
3719 			       nft_set_elem_policy);
3720 	if (err < 0)
3721 		goto err1;
3722 
3723 	err = -EINVAL;
3724 	if (nla[NFTA_SET_ELEM_KEY] == NULL)
3725 		goto err1;
3726 
3727 	nft_set_ext_prepare(&tmpl);
3728 
3729 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
3730 	if (err < 0)
3731 		return err;
3732 	if (flags != 0)
3733 		nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
3734 
3735 	err = nft_data_init(ctx, &elem.key.val, sizeof(elem.key), &desc,
3736 			    nla[NFTA_SET_ELEM_KEY]);
3737 	if (err < 0)
3738 		goto err1;
3739 
3740 	err = -EINVAL;
3741 	if (desc.type != NFT_DATA_VALUE || desc.len != set->klen)
3742 		goto err2;
3743 
3744 	nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, desc.len);
3745 
3746 	err = -ENOMEM;
3747 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data, NULL, 0,
3748 				      GFP_KERNEL);
3749 	if (elem.priv == NULL)
3750 		goto err2;
3751 
3752 	ext = nft_set_elem_ext(set, elem.priv);
3753 	if (flags)
3754 		*nft_set_ext_flags(ext) = flags;
3755 
3756 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
3757 	if (trans == NULL) {
3758 		err = -ENOMEM;
3759 		goto err3;
3760 	}
3761 
3762 	priv = set->ops->deactivate(ctx->net, set, &elem);
3763 	if (priv == NULL) {
3764 		err = -ENOENT;
3765 		goto err4;
3766 	}
3767 	kfree(elem.priv);
3768 	elem.priv = priv;
3769 
3770 	nft_trans_elem(trans) = elem;
3771 	list_add_tail(&trans->list, &ctx->net->nft.commit_list);
3772 	return 0;
3773 
3774 err4:
3775 	kfree(trans);
3776 err3:
3777 	kfree(elem.priv);
3778 err2:
3779 	nft_data_uninit(&elem.key.val, desc.type);
3780 err1:
3781 	return err;
3782 }
3783 
nf_tables_delsetelem(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])3784 static int nf_tables_delsetelem(struct net *net, struct sock *nlsk,
3785 				struct sk_buff *skb, const struct nlmsghdr *nlh,
3786 				const struct nlattr * const nla[])
3787 {
3788 	u8 genmask = nft_genmask_next(net);
3789 	const struct nlattr *attr;
3790 	struct nft_set *set;
3791 	struct nft_ctx ctx;
3792 	int rem, err = 0;
3793 
3794 	if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
3795 		return -EINVAL;
3796 
3797 	err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, genmask);
3798 	if (err < 0)
3799 		return err;
3800 
3801 	set = nf_tables_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET],
3802 				   genmask);
3803 	if (IS_ERR(set))
3804 		return PTR_ERR(set);
3805 	if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT)
3806 		return -EBUSY;
3807 
3808 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
3809 		err = nft_del_setelem(&ctx, set, attr);
3810 		if (err < 0)
3811 			break;
3812 
3813 		set->ndeact++;
3814 	}
3815 	return err;
3816 }
3817 
nft_set_gc_batch_release(struct rcu_head * rcu)3818 void nft_set_gc_batch_release(struct rcu_head *rcu)
3819 {
3820 	struct nft_set_gc_batch *gcb;
3821 	unsigned int i;
3822 
3823 	gcb = container_of(rcu, struct nft_set_gc_batch, head.rcu);
3824 	for (i = 0; i < gcb->head.cnt; i++)
3825 		nft_set_elem_destroy(gcb->head.set, gcb->elems[i], true);
3826 	kfree(gcb);
3827 }
3828 EXPORT_SYMBOL_GPL(nft_set_gc_batch_release);
3829 
nft_set_gc_batch_alloc(const struct nft_set * set,gfp_t gfp)3830 struct nft_set_gc_batch *nft_set_gc_batch_alloc(const struct nft_set *set,
3831 						gfp_t gfp)
3832 {
3833 	struct nft_set_gc_batch *gcb;
3834 
3835 	gcb = kzalloc(sizeof(*gcb), gfp);
3836 	if (gcb == NULL)
3837 		return gcb;
3838 	gcb->head.set = set;
3839 	return gcb;
3840 }
3841 EXPORT_SYMBOL_GPL(nft_set_gc_batch_alloc);
3842 
nf_tables_fill_gen_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq)3843 static int nf_tables_fill_gen_info(struct sk_buff *skb, struct net *net,
3844 				   u32 portid, u32 seq)
3845 {
3846 	struct nlmsghdr *nlh;
3847 	struct nfgenmsg *nfmsg;
3848 	int event = (NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWGEN;
3849 
3850 	nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), 0);
3851 	if (nlh == NULL)
3852 		goto nla_put_failure;
3853 
3854 	nfmsg = nlmsg_data(nlh);
3855 	nfmsg->nfgen_family	= AF_UNSPEC;
3856 	nfmsg->version		= NFNETLINK_V0;
3857 	nfmsg->res_id		= htons(net->nft.base_seq & 0xffff);
3858 
3859 	if (nla_put_be32(skb, NFTA_GEN_ID, htonl(net->nft.base_seq)))
3860 		goto nla_put_failure;
3861 
3862 	nlmsg_end(skb, nlh);
3863 	return 0;
3864 
3865 nla_put_failure:
3866 	nlmsg_trim(skb, nlh);
3867 	return -EMSGSIZE;
3868 }
3869 
nf_tables_gen_notify(struct net * net,struct sk_buff * skb,int event)3870 static int nf_tables_gen_notify(struct net *net, struct sk_buff *skb, int event)
3871 {
3872 	struct nlmsghdr *nlh = nlmsg_hdr(skb);
3873 	struct sk_buff *skb2;
3874 	int err;
3875 
3876 	if (nlmsg_report(nlh) &&
3877 	    !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
3878 		return 0;
3879 
3880 	err = -ENOBUFS;
3881 	skb2 = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
3882 	if (skb2 == NULL)
3883 		goto err;
3884 
3885 	err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
3886 				      nlh->nlmsg_seq);
3887 	if (err < 0) {
3888 		kfree_skb(skb2);
3889 		goto err;
3890 	}
3891 
3892 	err = nfnetlink_send(skb2, net, NETLINK_CB(skb).portid,
3893 			     NFNLGRP_NFTABLES, nlmsg_report(nlh), GFP_KERNEL);
3894 err:
3895 	if (err < 0) {
3896 		nfnetlink_set_err(net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
3897 				  err);
3898 	}
3899 	return err;
3900 }
3901 
nf_tables_getgen(struct net * net,struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,const struct nlattr * const nla[])3902 static int nf_tables_getgen(struct net *net, struct sock *nlsk,
3903 			    struct sk_buff *skb, const struct nlmsghdr *nlh,
3904 			    const struct nlattr * const nla[])
3905 {
3906 	struct sk_buff *skb2;
3907 	int err;
3908 
3909 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
3910 	if (skb2 == NULL)
3911 		return -ENOMEM;
3912 
3913 	err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
3914 				      nlh->nlmsg_seq);
3915 	if (err < 0)
3916 		goto err;
3917 
3918 	return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
3919 err:
3920 	kfree_skb(skb2);
3921 	return err;
3922 }
3923 
3924 static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = {
3925 	[NFT_MSG_NEWTABLE] = {
3926 		.call_batch	= nf_tables_newtable,
3927 		.attr_count	= NFTA_TABLE_MAX,
3928 		.policy		= nft_table_policy,
3929 	},
3930 	[NFT_MSG_GETTABLE] = {
3931 		.call		= nf_tables_gettable,
3932 		.attr_count	= NFTA_TABLE_MAX,
3933 		.policy		= nft_table_policy,
3934 	},
3935 	[NFT_MSG_DELTABLE] = {
3936 		.call_batch	= nf_tables_deltable,
3937 		.attr_count	= NFTA_TABLE_MAX,
3938 		.policy		= nft_table_policy,
3939 	},
3940 	[NFT_MSG_NEWCHAIN] = {
3941 		.call_batch	= nf_tables_newchain,
3942 		.attr_count	= NFTA_CHAIN_MAX,
3943 		.policy		= nft_chain_policy,
3944 	},
3945 	[NFT_MSG_GETCHAIN] = {
3946 		.call		= nf_tables_getchain,
3947 		.attr_count	= NFTA_CHAIN_MAX,
3948 		.policy		= nft_chain_policy,
3949 	},
3950 	[NFT_MSG_DELCHAIN] = {
3951 		.call_batch	= nf_tables_delchain,
3952 		.attr_count	= NFTA_CHAIN_MAX,
3953 		.policy		= nft_chain_policy,
3954 	},
3955 	[NFT_MSG_NEWRULE] = {
3956 		.call_batch	= nf_tables_newrule,
3957 		.attr_count	= NFTA_RULE_MAX,
3958 		.policy		= nft_rule_policy,
3959 	},
3960 	[NFT_MSG_GETRULE] = {
3961 		.call		= nf_tables_getrule,
3962 		.attr_count	= NFTA_RULE_MAX,
3963 		.policy		= nft_rule_policy,
3964 	},
3965 	[NFT_MSG_DELRULE] = {
3966 		.call_batch	= nf_tables_delrule,
3967 		.attr_count	= NFTA_RULE_MAX,
3968 		.policy		= nft_rule_policy,
3969 	},
3970 	[NFT_MSG_NEWSET] = {
3971 		.call_batch	= nf_tables_newset,
3972 		.attr_count	= NFTA_SET_MAX,
3973 		.policy		= nft_set_policy,
3974 	},
3975 	[NFT_MSG_GETSET] = {
3976 		.call		= nf_tables_getset,
3977 		.attr_count	= NFTA_SET_MAX,
3978 		.policy		= nft_set_policy,
3979 	},
3980 	[NFT_MSG_DELSET] = {
3981 		.call_batch	= nf_tables_delset,
3982 		.attr_count	= NFTA_SET_MAX,
3983 		.policy		= nft_set_policy,
3984 	},
3985 	[NFT_MSG_NEWSETELEM] = {
3986 		.call_batch	= nf_tables_newsetelem,
3987 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
3988 		.policy		= nft_set_elem_list_policy,
3989 	},
3990 	[NFT_MSG_GETSETELEM] = {
3991 		.call		= nf_tables_getsetelem,
3992 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
3993 		.policy		= nft_set_elem_list_policy,
3994 	},
3995 	[NFT_MSG_DELSETELEM] = {
3996 		.call_batch	= nf_tables_delsetelem,
3997 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
3998 		.policy		= nft_set_elem_list_policy,
3999 	},
4000 	[NFT_MSG_GETGEN] = {
4001 		.call		= nf_tables_getgen,
4002 	},
4003 };
4004 
nft_chain_commit_update(struct nft_trans * trans)4005 static void nft_chain_commit_update(struct nft_trans *trans)
4006 {
4007 	struct nft_base_chain *basechain;
4008 
4009 	if (nft_trans_chain_name(trans)[0])
4010 		strcpy(trans->ctx.chain->name, nft_trans_chain_name(trans));
4011 
4012 	if (!(trans->ctx.chain->flags & NFT_BASE_CHAIN))
4013 		return;
4014 
4015 	basechain = nft_base_chain(trans->ctx.chain);
4016 	nft_chain_stats_replace(basechain, nft_trans_chain_stats(trans));
4017 
4018 	switch (nft_trans_chain_policy(trans)) {
4019 	case NF_DROP:
4020 	case NF_ACCEPT:
4021 		basechain->policy = nft_trans_chain_policy(trans);
4022 		break;
4023 	}
4024 }
4025 
nf_tables_commit_release(struct nft_trans * trans)4026 static void nf_tables_commit_release(struct nft_trans *trans)
4027 {
4028 	switch (trans->msg_type) {
4029 	case NFT_MSG_DELTABLE:
4030 		nf_tables_table_destroy(&trans->ctx);
4031 		break;
4032 	case NFT_MSG_DELCHAIN:
4033 		nf_tables_chain_destroy(trans->ctx.chain);
4034 		break;
4035 	case NFT_MSG_DELRULE:
4036 		nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans));
4037 		break;
4038 	case NFT_MSG_DELSET:
4039 		nft_set_destroy(nft_trans_set(trans));
4040 		break;
4041 	case NFT_MSG_DELSETELEM:
4042 		nft_set_elem_destroy(nft_trans_elem_set(trans),
4043 				     nft_trans_elem(trans).priv, true);
4044 		break;
4045 	}
4046 	kfree(trans);
4047 }
4048 
nf_tables_commit(struct net * net,struct sk_buff * skb)4049 static int nf_tables_commit(struct net *net, struct sk_buff *skb)
4050 {
4051 	struct nft_trans *trans, *next;
4052 	struct nft_trans_elem *te;
4053 
4054 	/* Bump generation counter, invalidate any dump in progress */
4055 	while (++net->nft.base_seq == 0);
4056 
4057 	/* A new generation has just started */
4058 	net->nft.gencursor = nft_gencursor_next(net);
4059 
4060 	/* Make sure all packets have left the previous generation before
4061 	 * purging old rules.
4062 	 */
4063 	synchronize_rcu();
4064 
4065 	list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
4066 		switch (trans->msg_type) {
4067 		case NFT_MSG_NEWTABLE:
4068 			if (nft_trans_table_update(trans)) {
4069 				if (!nft_trans_table_enable(trans)) {
4070 					nf_tables_table_disable(net,
4071 								trans->ctx.afi,
4072 								trans->ctx.table);
4073 					trans->ctx.table->flags |= NFT_TABLE_F_DORMANT;
4074 				}
4075 			} else {
4076 				nft_clear(net, trans->ctx.table);
4077 			}
4078 			nf_tables_table_notify(&trans->ctx, NFT_MSG_NEWTABLE);
4079 			nft_trans_destroy(trans);
4080 			break;
4081 		case NFT_MSG_DELTABLE:
4082 			list_del_rcu(&trans->ctx.table->list);
4083 			nf_tables_table_notify(&trans->ctx, NFT_MSG_DELTABLE);
4084 			break;
4085 		case NFT_MSG_NEWCHAIN:
4086 			if (nft_trans_chain_update(trans))
4087 				nft_chain_commit_update(trans);
4088 			else
4089 				nft_clear(net, trans->ctx.chain);
4090 
4091 			nf_tables_chain_notify(&trans->ctx, NFT_MSG_NEWCHAIN);
4092 			nft_trans_destroy(trans);
4093 			break;
4094 		case NFT_MSG_DELCHAIN:
4095 			list_del_rcu(&trans->ctx.chain->list);
4096 			nf_tables_chain_notify(&trans->ctx, NFT_MSG_DELCHAIN);
4097 			nf_tables_unregister_hooks(trans->ctx.net,
4098 						   trans->ctx.table,
4099 						   trans->ctx.chain,
4100 						   trans->ctx.afi->nops);
4101 			break;
4102 		case NFT_MSG_NEWRULE:
4103 			nft_clear(trans->ctx.net, nft_trans_rule(trans));
4104 			nf_tables_rule_notify(&trans->ctx,
4105 					      nft_trans_rule(trans),
4106 					      NFT_MSG_NEWRULE);
4107 			nft_trans_destroy(trans);
4108 			break;
4109 		case NFT_MSG_DELRULE:
4110 			list_del_rcu(&nft_trans_rule(trans)->list);
4111 			nf_tables_rule_notify(&trans->ctx,
4112 					      nft_trans_rule(trans),
4113 					      NFT_MSG_DELRULE);
4114 			break;
4115 		case NFT_MSG_NEWSET:
4116 			nft_clear(net, nft_trans_set(trans));
4117 			/* This avoids hitting -EBUSY when deleting the table
4118 			 * from the transaction.
4119 			 */
4120 			if (nft_trans_set(trans)->flags & NFT_SET_ANONYMOUS &&
4121 			    !list_empty(&nft_trans_set(trans)->bindings))
4122 				trans->ctx.table->use--;
4123 
4124 			nf_tables_set_notify(&trans->ctx, nft_trans_set(trans),
4125 					     NFT_MSG_NEWSET, GFP_KERNEL);
4126 			nft_trans_destroy(trans);
4127 			break;
4128 		case NFT_MSG_DELSET:
4129 			list_del_rcu(&nft_trans_set(trans)->list);
4130 			nf_tables_set_notify(&trans->ctx, nft_trans_set(trans),
4131 					     NFT_MSG_DELSET, GFP_KERNEL);
4132 			break;
4133 		case NFT_MSG_NEWSETELEM:
4134 			te = (struct nft_trans_elem *)trans->data;
4135 
4136 			te->set->ops->activate(net, te->set, &te->elem);
4137 			nf_tables_setelem_notify(&trans->ctx, te->set,
4138 						 &te->elem,
4139 						 NFT_MSG_NEWSETELEM, 0);
4140 			nft_trans_destroy(trans);
4141 			break;
4142 		case NFT_MSG_DELSETELEM:
4143 			te = (struct nft_trans_elem *)trans->data;
4144 
4145 			nf_tables_setelem_notify(&trans->ctx, te->set,
4146 						 &te->elem,
4147 						 NFT_MSG_DELSETELEM, 0);
4148 			te->set->ops->remove(te->set, &te->elem);
4149 			atomic_dec(&te->set->nelems);
4150 			te->set->ndeact--;
4151 			break;
4152 		}
4153 	}
4154 
4155 	synchronize_rcu();
4156 
4157 	list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
4158 		list_del(&trans->list);
4159 		nf_tables_commit_release(trans);
4160 	}
4161 
4162 	nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
4163 
4164 	return 0;
4165 }
4166 
nf_tables_abort_release(struct nft_trans * trans)4167 static void nf_tables_abort_release(struct nft_trans *trans)
4168 {
4169 	switch (trans->msg_type) {
4170 	case NFT_MSG_NEWTABLE:
4171 		nf_tables_table_destroy(&trans->ctx);
4172 		break;
4173 	case NFT_MSG_NEWCHAIN:
4174 		nf_tables_chain_destroy(trans->ctx.chain);
4175 		break;
4176 	case NFT_MSG_NEWRULE:
4177 		nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans));
4178 		break;
4179 	case NFT_MSG_NEWSET:
4180 		nft_set_destroy(nft_trans_set(trans));
4181 		break;
4182 	case NFT_MSG_NEWSETELEM:
4183 		nft_set_elem_destroy(nft_trans_elem_set(trans),
4184 				     nft_trans_elem(trans).priv, true);
4185 		break;
4186 	}
4187 	kfree(trans);
4188 }
4189 
nf_tables_abort(struct net * net,struct sk_buff * skb)4190 static int nf_tables_abort(struct net *net, struct sk_buff *skb)
4191 {
4192 	struct nft_trans *trans, *next;
4193 	struct nft_trans_elem *te;
4194 
4195 	list_for_each_entry_safe_reverse(trans, next, &net->nft.commit_list,
4196 					 list) {
4197 		switch (trans->msg_type) {
4198 		case NFT_MSG_NEWTABLE:
4199 			if (nft_trans_table_update(trans)) {
4200 				if (nft_trans_table_enable(trans)) {
4201 					nf_tables_table_disable(net,
4202 								trans->ctx.afi,
4203 								trans->ctx.table);
4204 					trans->ctx.table->flags |= NFT_TABLE_F_DORMANT;
4205 				}
4206 				nft_trans_destroy(trans);
4207 			} else {
4208 				list_del_rcu(&trans->ctx.table->list);
4209 			}
4210 			break;
4211 		case NFT_MSG_DELTABLE:
4212 			nft_clear(trans->ctx.net, trans->ctx.table);
4213 			nft_trans_destroy(trans);
4214 			break;
4215 		case NFT_MSG_NEWCHAIN:
4216 			if (nft_trans_chain_update(trans)) {
4217 				free_percpu(nft_trans_chain_stats(trans));
4218 
4219 				nft_trans_destroy(trans);
4220 			} else {
4221 				trans->ctx.table->use--;
4222 				list_del_rcu(&trans->ctx.chain->list);
4223 				nf_tables_unregister_hooks(trans->ctx.net,
4224 							   trans->ctx.table,
4225 							   trans->ctx.chain,
4226 							   trans->ctx.afi->nops);
4227 			}
4228 			break;
4229 		case NFT_MSG_DELCHAIN:
4230 			trans->ctx.table->use++;
4231 			nft_clear(trans->ctx.net, trans->ctx.chain);
4232 			nft_trans_destroy(trans);
4233 			break;
4234 		case NFT_MSG_NEWRULE:
4235 			trans->ctx.chain->use--;
4236 			list_del_rcu(&nft_trans_rule(trans)->list);
4237 			break;
4238 		case NFT_MSG_DELRULE:
4239 			trans->ctx.chain->use++;
4240 			nft_clear(trans->ctx.net, nft_trans_rule(trans));
4241 			nft_trans_destroy(trans);
4242 			break;
4243 		case NFT_MSG_NEWSET:
4244 			trans->ctx.table->use--;
4245 			list_del_rcu(&nft_trans_set(trans)->list);
4246 			break;
4247 		case NFT_MSG_DELSET:
4248 			trans->ctx.table->use++;
4249 			nft_clear(trans->ctx.net, nft_trans_set(trans));
4250 			nft_trans_destroy(trans);
4251 			break;
4252 		case NFT_MSG_NEWSETELEM:
4253 			te = (struct nft_trans_elem *)trans->data;
4254 
4255 			te->set->ops->remove(te->set, &te->elem);
4256 			atomic_dec(&te->set->nelems);
4257 			break;
4258 		case NFT_MSG_DELSETELEM:
4259 			te = (struct nft_trans_elem *)trans->data;
4260 
4261 			te->set->ops->activate(net, te->set, &te->elem);
4262 			te->set->ndeact--;
4263 
4264 			nft_trans_destroy(trans);
4265 			break;
4266 		}
4267 	}
4268 
4269 	synchronize_rcu();
4270 
4271 	list_for_each_entry_safe_reverse(trans, next,
4272 					 &net->nft.commit_list, list) {
4273 		list_del(&trans->list);
4274 		nf_tables_abort_release(trans);
4275 	}
4276 
4277 	return 0;
4278 }
4279 
4280 static const struct nfnetlink_subsystem nf_tables_subsys = {
4281 	.name		= "nf_tables",
4282 	.subsys_id	= NFNL_SUBSYS_NFTABLES,
4283 	.cb_count	= NFT_MSG_MAX,
4284 	.cb		= nf_tables_cb,
4285 	.commit		= nf_tables_commit,
4286 	.abort		= nf_tables_abort,
4287 };
4288 
nft_chain_validate_dependency(const struct nft_chain * chain,enum nft_chain_type type)4289 int nft_chain_validate_dependency(const struct nft_chain *chain,
4290 				  enum nft_chain_type type)
4291 {
4292 	const struct nft_base_chain *basechain;
4293 
4294 	if (chain->flags & NFT_BASE_CHAIN) {
4295 		basechain = nft_base_chain(chain);
4296 		if (basechain->type->type != type)
4297 			return -EOPNOTSUPP;
4298 	}
4299 	return 0;
4300 }
4301 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency);
4302 
nft_chain_validate_hooks(const struct nft_chain * chain,unsigned int hook_flags)4303 int nft_chain_validate_hooks(const struct nft_chain *chain,
4304 			     unsigned int hook_flags)
4305 {
4306 	struct nft_base_chain *basechain;
4307 
4308 	if (chain->flags & NFT_BASE_CHAIN) {
4309 		basechain = nft_base_chain(chain);
4310 
4311 		if ((1 << basechain->ops[0].hooknum) & hook_flags)
4312 			return 0;
4313 
4314 		return -EOPNOTSUPP;
4315 	}
4316 
4317 	return 0;
4318 }
4319 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks);
4320 
4321 /*
4322  * Loop detection - walk through the ruleset beginning at the destination chain
4323  * of a new jump until either the source chain is reached (loop) or all
4324  * reachable chains have been traversed.
4325  *
4326  * The loop check is performed whenever a new jump verdict is added to an
4327  * expression or verdict map or a verdict map is bound to a new chain.
4328  */
4329 
4330 static int nf_tables_check_loops(const struct nft_ctx *ctx,
4331 				 const struct nft_chain *chain);
4332 
nf_tables_loop_check_setelem(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_set_iter * iter,const struct nft_set_elem * elem)4333 static int nf_tables_loop_check_setelem(const struct nft_ctx *ctx,
4334 					const struct nft_set *set,
4335 					const struct nft_set_iter *iter,
4336 					const struct nft_set_elem *elem)
4337 {
4338 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
4339 	const struct nft_data *data;
4340 
4341 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
4342 	    *nft_set_ext_flags(ext) & NFT_SET_ELEM_INTERVAL_END)
4343 		return 0;
4344 
4345 	data = nft_set_ext_data(ext);
4346 	switch (data->verdict.code) {
4347 	case NFT_JUMP:
4348 	case NFT_GOTO:
4349 		return nf_tables_check_loops(ctx, data->verdict.chain);
4350 	default:
4351 		return 0;
4352 	}
4353 }
4354 
nf_tables_check_loops(const struct nft_ctx * ctx,const struct nft_chain * chain)4355 static int nf_tables_check_loops(const struct nft_ctx *ctx,
4356 				 const struct nft_chain *chain)
4357 {
4358 	const struct nft_rule *rule;
4359 	const struct nft_expr *expr, *last;
4360 	const struct nft_set *set;
4361 	struct nft_set_binding *binding;
4362 	struct nft_set_iter iter;
4363 
4364 	if (ctx->chain == chain)
4365 		return -ELOOP;
4366 
4367 	list_for_each_entry(rule, &chain->rules, list) {
4368 		nft_rule_for_each_expr(expr, last, rule) {
4369 			const struct nft_data *data = NULL;
4370 			int err;
4371 
4372 			if (!expr->ops->validate)
4373 				continue;
4374 
4375 			err = expr->ops->validate(ctx, expr, &data);
4376 			if (err < 0)
4377 				return err;
4378 
4379 			if (data == NULL)
4380 				continue;
4381 
4382 			switch (data->verdict.code) {
4383 			case NFT_JUMP:
4384 			case NFT_GOTO:
4385 				err = nf_tables_check_loops(ctx,
4386 							data->verdict.chain);
4387 				if (err < 0)
4388 					return err;
4389 			default:
4390 				break;
4391 			}
4392 		}
4393 	}
4394 
4395 	list_for_each_entry(set, &ctx->table->sets, list) {
4396 		if (!nft_is_active_next(ctx->net, set))
4397 			continue;
4398 		if (!(set->flags & NFT_SET_MAP) ||
4399 		    set->dtype != NFT_DATA_VERDICT)
4400 			continue;
4401 
4402 		list_for_each_entry(binding, &set->bindings, list) {
4403 			if (!(binding->flags & NFT_SET_MAP) ||
4404 			    binding->chain != chain)
4405 				continue;
4406 
4407 			iter.genmask	= nft_genmask_next(ctx->net);
4408 			iter.skip 	= 0;
4409 			iter.count	= 0;
4410 			iter.err	= 0;
4411 			iter.fn		= nf_tables_loop_check_setelem;
4412 
4413 			set->ops->walk(ctx, set, &iter);
4414 			if (iter.err < 0)
4415 				return iter.err;
4416 		}
4417 	}
4418 
4419 	return 0;
4420 }
4421 
4422 /**
4423  *	nft_parse_u32_check - fetch u32 attribute and check for maximum value
4424  *
4425  *	@attr: netlink attribute to fetch value from
4426  *	@max: maximum value to be stored in dest
4427  *	@dest: pointer to the variable
4428  *
4429  *	Parse, check and store a given u32 netlink attribute into variable.
4430  *	This function returns -ERANGE if the value goes over maximum value.
4431  *	Otherwise a 0 is returned and the attribute value is stored in the
4432  *	destination variable.
4433  */
nft_parse_u32_check(const struct nlattr * attr,int max,u32 * dest)4434 int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
4435 {
4436 	u32 val;
4437 
4438 	val = ntohl(nla_get_be32(attr));
4439 	if (val > max)
4440 		return -ERANGE;
4441 
4442 	*dest = val;
4443 	return 0;
4444 }
4445 EXPORT_SYMBOL_GPL(nft_parse_u32_check);
4446 
4447 /**
4448  *	nft_parse_register - parse a register value from a netlink attribute
4449  *
4450  *	@attr: netlink attribute
4451  *
4452  *	Parse and translate a register value from a netlink attribute.
4453  *	Registers used to be 128 bit wide, these register numbers will be
4454  *	mapped to the corresponding 32 bit register numbers.
4455  */
nft_parse_register(const struct nlattr * attr)4456 unsigned int nft_parse_register(const struct nlattr *attr)
4457 {
4458 	unsigned int reg;
4459 
4460 	reg = ntohl(nla_get_be32(attr));
4461 	switch (reg) {
4462 	case NFT_REG_VERDICT...NFT_REG_4:
4463 		return reg * NFT_REG_SIZE / NFT_REG32_SIZE;
4464 	default:
4465 		return reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
4466 	}
4467 }
4468 EXPORT_SYMBOL_GPL(nft_parse_register);
4469 
4470 /**
4471  *	nft_dump_register - dump a register value to a netlink attribute
4472  *
4473  *	@skb: socket buffer
4474  *	@attr: attribute number
4475  *	@reg: register number
4476  *
4477  *	Construct a netlink attribute containing the register number. For
4478  *	compatibility reasons, register numbers being a multiple of 4 are
4479  *	translated to the corresponding 128 bit register numbers.
4480  */
nft_dump_register(struct sk_buff * skb,unsigned int attr,unsigned int reg)4481 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg)
4482 {
4483 	if (reg % (NFT_REG_SIZE / NFT_REG32_SIZE) == 0)
4484 		reg = reg / (NFT_REG_SIZE / NFT_REG32_SIZE);
4485 	else
4486 		reg = reg - NFT_REG_SIZE / NFT_REG32_SIZE + NFT_REG32_00;
4487 
4488 	return nla_put_be32(skb, attr, htonl(reg));
4489 }
4490 EXPORT_SYMBOL_GPL(nft_dump_register);
4491 
4492 /**
4493  *	nft_validate_register_load - validate a load from a register
4494  *
4495  *	@reg: the register number
4496  *	@len: the length of the data
4497  *
4498  * 	Validate that the input register is one of the general purpose
4499  * 	registers and that the length of the load is within the bounds.
4500  */
nft_validate_register_load(enum nft_registers reg,unsigned int len)4501 int nft_validate_register_load(enum nft_registers reg, unsigned int len)
4502 {
4503 	if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
4504 		return -EINVAL;
4505 	if (len == 0)
4506 		return -EINVAL;
4507 	if (reg * NFT_REG32_SIZE + len > FIELD_SIZEOF(struct nft_regs, data))
4508 		return -ERANGE;
4509 
4510 	return 0;
4511 }
4512 EXPORT_SYMBOL_GPL(nft_validate_register_load);
4513 
4514 /**
4515  *	nft_validate_register_store - validate an expressions' register store
4516  *
4517  *	@ctx: context of the expression performing the load
4518  * 	@reg: the destination register number
4519  * 	@data: the data to load
4520  * 	@type: the data type
4521  * 	@len: the length of the data
4522  *
4523  * 	Validate that a data load uses the appropriate data type for
4524  * 	the destination register and the length is within the bounds.
4525  * 	A value of NULL for the data means that its runtime gathered
4526  * 	data.
4527  */
nft_validate_register_store(const struct nft_ctx * ctx,enum nft_registers reg,const struct nft_data * data,enum nft_data_types type,unsigned int len)4528 int nft_validate_register_store(const struct nft_ctx *ctx,
4529 				enum nft_registers reg,
4530 				const struct nft_data *data,
4531 				enum nft_data_types type, unsigned int len)
4532 {
4533 	int err;
4534 
4535 	switch (reg) {
4536 	case NFT_REG_VERDICT:
4537 		if (type != NFT_DATA_VERDICT)
4538 			return -EINVAL;
4539 
4540 		if (data != NULL &&
4541 		    (data->verdict.code == NFT_GOTO ||
4542 		     data->verdict.code == NFT_JUMP)) {
4543 			err = nf_tables_check_loops(ctx, data->verdict.chain);
4544 			if (err < 0)
4545 				return err;
4546 
4547 			if (ctx->chain->level + 1 >
4548 			    data->verdict.chain->level) {
4549 				if (ctx->chain->level + 1 == NFT_JUMP_STACK_SIZE)
4550 					return -EMLINK;
4551 				data->verdict.chain->level = ctx->chain->level + 1;
4552 			}
4553 		}
4554 
4555 		return 0;
4556 	default:
4557 		if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
4558 			return -EINVAL;
4559 		if (len == 0)
4560 			return -EINVAL;
4561 		if (reg * NFT_REG32_SIZE + len >
4562 		    FIELD_SIZEOF(struct nft_regs, data))
4563 			return -ERANGE;
4564 
4565 		if (data != NULL && type != NFT_DATA_VALUE)
4566 			return -EINVAL;
4567 		return 0;
4568 	}
4569 }
4570 EXPORT_SYMBOL_GPL(nft_validate_register_store);
4571 
4572 static const struct nla_policy nft_verdict_policy[NFTA_VERDICT_MAX + 1] = {
4573 	[NFTA_VERDICT_CODE]	= { .type = NLA_U32 },
4574 	[NFTA_VERDICT_CHAIN]	= { .type = NLA_STRING,
4575 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
4576 };
4577 
nft_verdict_init(const struct nft_ctx * ctx,struct nft_data * data,struct nft_data_desc * desc,const struct nlattr * nla)4578 static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
4579 			    struct nft_data_desc *desc, const struct nlattr *nla)
4580 {
4581 	u8 genmask = nft_genmask_next(ctx->net);
4582 	struct nlattr *tb[NFTA_VERDICT_MAX + 1];
4583 	struct nft_chain *chain;
4584 	int err;
4585 
4586 	err = nla_parse_nested(tb, NFTA_VERDICT_MAX, nla, nft_verdict_policy);
4587 	if (err < 0)
4588 		return err;
4589 
4590 	if (!tb[NFTA_VERDICT_CODE])
4591 		return -EINVAL;
4592 	data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
4593 
4594 	switch (data->verdict.code) {
4595 	default:
4596 		switch (data->verdict.code & NF_VERDICT_MASK) {
4597 		case NF_ACCEPT:
4598 		case NF_DROP:
4599 		case NF_QUEUE:
4600 			break;
4601 		default:
4602 			return -EINVAL;
4603 		}
4604 		/* fall through */
4605 	case NFT_CONTINUE:
4606 	case NFT_BREAK:
4607 	case NFT_RETURN:
4608 		break;
4609 	case NFT_JUMP:
4610 	case NFT_GOTO:
4611 		if (!tb[NFTA_VERDICT_CHAIN])
4612 			return -EINVAL;
4613 		chain = nf_tables_chain_lookup(ctx->table,
4614 					       tb[NFTA_VERDICT_CHAIN], genmask);
4615 		if (IS_ERR(chain))
4616 			return PTR_ERR(chain);
4617 		if (chain->flags & NFT_BASE_CHAIN)
4618 			return -EOPNOTSUPP;
4619 
4620 		chain->use++;
4621 		data->verdict.chain = chain;
4622 		break;
4623 	}
4624 
4625 	desc->len = sizeof(data->verdict);
4626 	desc->type = NFT_DATA_VERDICT;
4627 	return 0;
4628 }
4629 
nft_verdict_uninit(const struct nft_data * data)4630 static void nft_verdict_uninit(const struct nft_data *data)
4631 {
4632 	switch (data->verdict.code) {
4633 	case NFT_JUMP:
4634 	case NFT_GOTO:
4635 		data->verdict.chain->use--;
4636 		break;
4637 	}
4638 }
4639 
nft_verdict_dump(struct sk_buff * skb,int type,const struct nft_verdict * v)4640 int nft_verdict_dump(struct sk_buff *skb, int type, const struct nft_verdict *v)
4641 {
4642 	struct nlattr *nest;
4643 
4644 	nest = nla_nest_start(skb, type);
4645 	if (!nest)
4646 		goto nla_put_failure;
4647 
4648 	if (nla_put_be32(skb, NFTA_VERDICT_CODE, htonl(v->code)))
4649 		goto nla_put_failure;
4650 
4651 	switch (v->code) {
4652 	case NFT_JUMP:
4653 	case NFT_GOTO:
4654 		if (nla_put_string(skb, NFTA_VERDICT_CHAIN,
4655 				   v->chain->name))
4656 			goto nla_put_failure;
4657 	}
4658 	nla_nest_end(skb, nest);
4659 	return 0;
4660 
4661 nla_put_failure:
4662 	return -1;
4663 }
4664 
nft_value_init(const struct nft_ctx * ctx,struct nft_data * data,unsigned int size,struct nft_data_desc * desc,const struct nlattr * nla)4665 static int nft_value_init(const struct nft_ctx *ctx,
4666 			  struct nft_data *data, unsigned int size,
4667 			  struct nft_data_desc *desc, const struct nlattr *nla)
4668 {
4669 	unsigned int len;
4670 
4671 	len = nla_len(nla);
4672 	if (len == 0)
4673 		return -EINVAL;
4674 	if (len > size)
4675 		return -EOVERFLOW;
4676 
4677 	nla_memcpy(data->data, nla, len);
4678 	desc->type = NFT_DATA_VALUE;
4679 	desc->len  = len;
4680 	return 0;
4681 }
4682 
nft_value_dump(struct sk_buff * skb,const struct nft_data * data,unsigned int len)4683 static int nft_value_dump(struct sk_buff *skb, const struct nft_data *data,
4684 			  unsigned int len)
4685 {
4686 	return nla_put(skb, NFTA_DATA_VALUE, len, data->data);
4687 }
4688 
4689 static const struct nla_policy nft_data_policy[NFTA_DATA_MAX + 1] = {
4690 	[NFTA_DATA_VALUE]	= { .type = NLA_BINARY },
4691 	[NFTA_DATA_VERDICT]	= { .type = NLA_NESTED },
4692 };
4693 
4694 /**
4695  *	nft_data_init - parse nf_tables data netlink attributes
4696  *
4697  *	@ctx: context of the expression using the data
4698  *	@data: destination struct nft_data
4699  *	@size: maximum data length
4700  *	@desc: data description
4701  *	@nla: netlink attribute containing data
4702  *
4703  *	Parse the netlink data attributes and initialize a struct nft_data.
4704  *	The type and length of data are returned in the data description.
4705  *
4706  *	The caller can indicate that it only wants to accept data of type
4707  *	NFT_DATA_VALUE by passing NULL for the ctx argument.
4708  */
nft_data_init(const struct nft_ctx * ctx,struct nft_data * data,unsigned int size,struct nft_data_desc * desc,const struct nlattr * nla)4709 int nft_data_init(const struct nft_ctx *ctx,
4710 		  struct nft_data *data, unsigned int size,
4711 		  struct nft_data_desc *desc, const struct nlattr *nla)
4712 {
4713 	struct nlattr *tb[NFTA_DATA_MAX + 1];
4714 	int err;
4715 
4716 	err = nla_parse_nested(tb, NFTA_DATA_MAX, nla, nft_data_policy);
4717 	if (err < 0)
4718 		return err;
4719 
4720 	if (tb[NFTA_DATA_VALUE])
4721 		return nft_value_init(ctx, data, size, desc,
4722 				      tb[NFTA_DATA_VALUE]);
4723 	if (tb[NFTA_DATA_VERDICT] && ctx != NULL)
4724 		return nft_verdict_init(ctx, data, desc, tb[NFTA_DATA_VERDICT]);
4725 	return -EINVAL;
4726 }
4727 EXPORT_SYMBOL_GPL(nft_data_init);
4728 
4729 /**
4730  *	nft_data_uninit - release a nft_data item
4731  *
4732  *	@data: struct nft_data to release
4733  *	@type: type of data
4734  *
4735  *	Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
4736  *	all others need to be released by calling this function.
4737  */
nft_data_uninit(const struct nft_data * data,enum nft_data_types type)4738 void nft_data_uninit(const struct nft_data *data, enum nft_data_types type)
4739 {
4740 	if (type < NFT_DATA_VERDICT)
4741 		return;
4742 	switch (type) {
4743 	case NFT_DATA_VERDICT:
4744 		return nft_verdict_uninit(data);
4745 	default:
4746 		WARN_ON(1);
4747 	}
4748 }
4749 EXPORT_SYMBOL_GPL(nft_data_uninit);
4750 
nft_data_dump(struct sk_buff * skb,int attr,const struct nft_data * data,enum nft_data_types type,unsigned int len)4751 int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
4752 		  enum nft_data_types type, unsigned int len)
4753 {
4754 	struct nlattr *nest;
4755 	int err;
4756 
4757 	nest = nla_nest_start(skb, attr);
4758 	if (nest == NULL)
4759 		return -1;
4760 
4761 	switch (type) {
4762 	case NFT_DATA_VALUE:
4763 		err = nft_value_dump(skb, data, len);
4764 		break;
4765 	case NFT_DATA_VERDICT:
4766 		err = nft_verdict_dump(skb, NFTA_DATA_VERDICT, &data->verdict);
4767 		break;
4768 	default:
4769 		err = -EINVAL;
4770 		WARN_ON(1);
4771 	}
4772 
4773 	nla_nest_end(skb, nest);
4774 	return err;
4775 }
4776 EXPORT_SYMBOL_GPL(nft_data_dump);
4777 
nf_tables_init_net(struct net * net)4778 static int __net_init nf_tables_init_net(struct net *net)
4779 {
4780 	INIT_LIST_HEAD(&net->nft.af_info);
4781 	INIT_LIST_HEAD(&net->nft.commit_list);
4782 	net->nft.base_seq = 1;
4783 	return 0;
4784 }
4785 
__nft_release_basechain(struct nft_ctx * ctx)4786 int __nft_release_basechain(struct nft_ctx *ctx)
4787 {
4788 	struct nft_rule *rule, *nr;
4789 
4790 	BUG_ON(!(ctx->chain->flags & NFT_BASE_CHAIN));
4791 
4792 	nf_tables_unregister_hooks(ctx->net, ctx->chain->table, ctx->chain,
4793 				   ctx->afi->nops);
4794 	list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) {
4795 		list_del(&rule->list);
4796 		ctx->chain->use--;
4797 		nf_tables_rule_destroy(ctx, rule);
4798 	}
4799 	list_del(&ctx->chain->list);
4800 	ctx->table->use--;
4801 	nf_tables_chain_destroy(ctx->chain);
4802 
4803 	return 0;
4804 }
4805 EXPORT_SYMBOL_GPL(__nft_release_basechain);
4806 
4807 /* Called by nft_unregister_afinfo() from __net_exit path, nfnl_lock is held. */
__nft_release_afinfo(struct net * net,struct nft_af_info * afi)4808 static void __nft_release_afinfo(struct net *net, struct nft_af_info *afi)
4809 {
4810 	struct nft_table *table, *nt;
4811 	struct nft_chain *chain, *nc;
4812 	struct nft_rule *rule, *nr;
4813 	struct nft_set *set, *ns;
4814 	struct nft_ctx ctx = {
4815 		.net	= net,
4816 		.afi	= afi,
4817 	};
4818 
4819 	list_for_each_entry_safe(table, nt, &afi->tables, list) {
4820 		list_for_each_entry(chain, &table->chains, list)
4821 			nf_tables_unregister_hooks(net, table, chain,
4822 						   afi->nops);
4823 		/* No packets are walking on these chains anymore. */
4824 		ctx.table = table;
4825 		list_for_each_entry(chain, &table->chains, list) {
4826 			ctx.chain = chain;
4827 			list_for_each_entry_safe(rule, nr, &chain->rules, list) {
4828 				list_del(&rule->list);
4829 				chain->use--;
4830 				nf_tables_rule_destroy(&ctx, rule);
4831 			}
4832 		}
4833 		list_for_each_entry_safe(set, ns, &table->sets, list) {
4834 			list_del(&set->list);
4835 			table->use--;
4836 			nft_set_destroy(set);
4837 		}
4838 		list_for_each_entry_safe(chain, nc, &table->chains, list) {
4839 			list_del(&chain->list);
4840 			table->use--;
4841 			nf_tables_chain_destroy(chain);
4842 		}
4843 		list_del(&table->list);
4844 		nf_tables_table_destroy(&ctx);
4845 	}
4846 }
4847 
4848 static struct pernet_operations nf_tables_net_ops = {
4849 	.init	= nf_tables_init_net,
4850 };
4851 
nf_tables_module_init(void)4852 static int __init nf_tables_module_init(void)
4853 {
4854 	int err;
4855 
4856 	info = kmalloc(sizeof(struct nft_expr_info) * NFT_RULE_MAXEXPRS,
4857 		       GFP_KERNEL);
4858 	if (info == NULL) {
4859 		err = -ENOMEM;
4860 		goto err1;
4861 	}
4862 
4863 	err = nf_tables_core_module_init();
4864 	if (err < 0)
4865 		goto err2;
4866 
4867 	err = nfnetlink_subsys_register(&nf_tables_subsys);
4868 	if (err < 0)
4869 		goto err3;
4870 
4871 	pr_info("nf_tables: (c) 2007-2009 Patrick McHardy <kaber@trash.net>\n");
4872 	return register_pernet_subsys(&nf_tables_net_ops);
4873 err3:
4874 	nf_tables_core_module_exit();
4875 err2:
4876 	kfree(info);
4877 err1:
4878 	return err;
4879 }
4880 
nf_tables_module_exit(void)4881 static void __exit nf_tables_module_exit(void)
4882 {
4883 	unregister_pernet_subsys(&nf_tables_net_ops);
4884 	nfnetlink_subsys_unregister(&nf_tables_subsys);
4885 	rcu_barrier();
4886 	nf_tables_core_module_exit();
4887 	kfree(info);
4888 }
4889 
4890 module_init(nf_tables_module_init);
4891 module_exit(nf_tables_module_exit);
4892 
4893 MODULE_LICENSE("GPL");
4894 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
4895 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES);
4896