xref: /linux/net/netfilter/nf_tables_api.c (revision 67f8bc848ee31831336bd478e57d2f993551902e)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net>
4  *
5  * Development of this code funded by Astaro AG (http://www.astaro.com/)
6  */
7 
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/list.h>
11 #include <linux/skbuff.h>
12 #include <linux/netlink.h>
13 #include <linux/vmalloc.h>
14 #include <linux/rhashtable.h>
15 #include <linux/audit.h>
16 #include <linux/netfilter.h>
17 #include <linux/netfilter_ipv4.h>
18 #include <linux/netfilter/nfnetlink.h>
19 #include <linux/netfilter/nf_tables.h>
20 #include <net/netfilter/nf_flow_table.h>
21 #include <net/netfilter/nf_tables_core.h>
22 #include <net/netfilter/nf_tables.h>
23 #include <net/netfilter/nf_tables_offload.h>
24 #include <net/net_namespace.h>
25 #include <net/sock.h>
26 
27 #define NFT_MODULE_AUTOLOAD_LIMIT (MODULE_NAME_LEN - sizeof("nft-expr-255-"))
28 #define NFT_SET_MAX_ANONLEN 16
29 
30 /* limit compaction to avoid huge kmalloc/krealloc sizes. */
31 #define NFT_MAX_SET_NELEMS ((2048 - sizeof(struct nft_trans_elem)) / sizeof(struct nft_trans_one_elem))
32 
33 unsigned int nf_tables_net_id __read_mostly;
34 
35 static LIST_HEAD(nf_tables_expressions);
36 static LIST_HEAD(nf_tables_objects);
37 static LIST_HEAD(nf_tables_flowtables);
38 static LIST_HEAD(nf_tables_gc_list);
39 static DEFINE_SPINLOCK(nf_tables_destroy_list_lock);
40 static DEFINE_SPINLOCK(nf_tables_gc_list_lock);
41 
42 enum {
43 	NFT_VALIDATE_SKIP	= 0,
44 	NFT_VALIDATE_NEED,
45 	NFT_VALIDATE_DO,
46 };
47 
48 static u32 nft_chain_hash(const void *data, u32 len, u32 seed);
49 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed);
50 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *, const void *);
51 
52 static u32 nft_objname_hash(const void *data, u32 len, u32 seed);
53 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed);
54 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *, const void *);
55 
56 static const struct rhashtable_params nft_chain_ht_params = {
57 	.head_offset		= offsetof(struct nft_chain, rhlhead),
58 	.key_offset		= offsetof(struct nft_chain, name),
59 	.hashfn			= nft_chain_hash,
60 	.obj_hashfn		= nft_chain_hash_obj,
61 	.obj_cmpfn		= nft_chain_hash_cmp,
62 	.automatic_shrinking	= true,
63 };
64 
65 static const struct rhashtable_params nft_objname_ht_params = {
66 	.head_offset		= offsetof(struct nft_object, rhlhead),
67 	.key_offset		= offsetof(struct nft_object, key),
68 	.hashfn			= nft_objname_hash,
69 	.obj_hashfn		= nft_objname_hash_obj,
70 	.obj_cmpfn		= nft_objname_hash_cmp,
71 	.automatic_shrinking	= true,
72 };
73 
74 struct nft_audit_data {
75 	struct nft_table *table;
76 	int entries;
77 	int op;
78 	struct list_head list;
79 };
80 
81 static const u8 nft2audit_op[NFT_MSG_MAX] = { // enum nf_tables_msg_types
82 	[NFT_MSG_NEWTABLE]	= AUDIT_NFT_OP_TABLE_REGISTER,
83 	[NFT_MSG_GETTABLE]	= AUDIT_NFT_OP_INVALID,
84 	[NFT_MSG_DELTABLE]	= AUDIT_NFT_OP_TABLE_UNREGISTER,
85 	[NFT_MSG_NEWCHAIN]	= AUDIT_NFT_OP_CHAIN_REGISTER,
86 	[NFT_MSG_GETCHAIN]	= AUDIT_NFT_OP_INVALID,
87 	[NFT_MSG_DELCHAIN]	= AUDIT_NFT_OP_CHAIN_UNREGISTER,
88 	[NFT_MSG_NEWRULE]	= AUDIT_NFT_OP_RULE_REGISTER,
89 	[NFT_MSG_GETRULE]	= AUDIT_NFT_OP_INVALID,
90 	[NFT_MSG_DELRULE]	= AUDIT_NFT_OP_RULE_UNREGISTER,
91 	[NFT_MSG_NEWSET]	= AUDIT_NFT_OP_SET_REGISTER,
92 	[NFT_MSG_GETSET]	= AUDIT_NFT_OP_INVALID,
93 	[NFT_MSG_DELSET]	= AUDIT_NFT_OP_SET_UNREGISTER,
94 	[NFT_MSG_NEWSETELEM]	= AUDIT_NFT_OP_SETELEM_REGISTER,
95 	[NFT_MSG_GETSETELEM]	= AUDIT_NFT_OP_INVALID,
96 	[NFT_MSG_DELSETELEM]	= AUDIT_NFT_OP_SETELEM_UNREGISTER,
97 	[NFT_MSG_NEWGEN]	= AUDIT_NFT_OP_GEN_REGISTER,
98 	[NFT_MSG_GETGEN]	= AUDIT_NFT_OP_INVALID,
99 	[NFT_MSG_TRACE]		= AUDIT_NFT_OP_INVALID,
100 	[NFT_MSG_NEWOBJ]	= AUDIT_NFT_OP_OBJ_REGISTER,
101 	[NFT_MSG_GETOBJ]	= AUDIT_NFT_OP_INVALID,
102 	[NFT_MSG_DELOBJ]	= AUDIT_NFT_OP_OBJ_UNREGISTER,
103 	[NFT_MSG_GETOBJ_RESET]	= AUDIT_NFT_OP_OBJ_RESET,
104 	[NFT_MSG_NEWFLOWTABLE]	= AUDIT_NFT_OP_FLOWTABLE_REGISTER,
105 	[NFT_MSG_GETFLOWTABLE]	= AUDIT_NFT_OP_INVALID,
106 	[NFT_MSG_DELFLOWTABLE]	= AUDIT_NFT_OP_FLOWTABLE_UNREGISTER,
107 	[NFT_MSG_GETSETELEM_RESET] = AUDIT_NFT_OP_SETELEM_RESET,
108 };
109 
110 static void nft_validate_state_update(struct nft_table *table, u8 new_validate_state)
111 {
112 	switch (table->validate_state) {
113 	case NFT_VALIDATE_SKIP:
114 		WARN_ON_ONCE(new_validate_state == NFT_VALIDATE_DO);
115 		break;
116 	case NFT_VALIDATE_NEED:
117 		break;
118 	case NFT_VALIDATE_DO:
119 		if (new_validate_state == NFT_VALIDATE_NEED)
120 			return;
121 	}
122 
123 	table->validate_state = new_validate_state;
124 }
125 
126 static bool nft_chain_vstate_valid(const struct nft_ctx *ctx,
127 				   const struct nft_chain *chain)
128 {
129 	const struct nft_base_chain *base_chain;
130 	enum nft_chain_types type;
131 	u8 hooknum;
132 
133 	if (WARN_ON_ONCE(!nft_is_base_chain(ctx->chain)))
134 		return false;
135 
136 	base_chain = nft_base_chain(ctx->chain);
137 	hooknum = base_chain->ops.hooknum;
138 	type = base_chain->type->type;
139 
140 	/* chain is already validated for this call depth */
141 	if (chain->vstate.depth >= ctx->level &&
142 	    chain->vstate.hook_mask[type] & BIT(hooknum))
143 		return true;
144 
145 	return false;
146 }
147 
148 static void nf_tables_trans_destroy_work(struct work_struct *w);
149 
150 static void nft_trans_gc_work(struct work_struct *work);
151 static DECLARE_WORK(trans_gc_work, nft_trans_gc_work);
152 
153 static void nft_ctx_init(struct nft_ctx *ctx,
154 			 struct net *net,
155 			 const struct sk_buff *skb,
156 			 const struct nlmsghdr *nlh,
157 			 u8 family,
158 			 struct nft_table *table,
159 			 struct nft_chain *chain,
160 			 const struct nlattr * const *nla)
161 {
162 	ctx->net	= net;
163 	ctx->family	= family;
164 	ctx->level	= 0;
165 	ctx->table	= table;
166 	ctx->chain	= chain;
167 	ctx->nla   	= nla;
168 	ctx->portid	= NETLINK_CB(skb).portid;
169 	ctx->report	= nlmsg_report(nlh);
170 	ctx->flags	= nlh->nlmsg_flags;
171 	ctx->seq	= nlh->nlmsg_seq;
172 
173 	bitmap_zero(ctx->reg_inited, NFT_REG32_NUM);
174 }
175 
176 static struct nft_trans *nft_trans_alloc(const struct nft_ctx *ctx,
177 					 int msg_type, u32 size)
178 {
179 	struct nft_trans *trans;
180 
181 	trans = kzalloc(size, GFP_KERNEL);
182 	if (trans == NULL)
183 		return NULL;
184 
185 	INIT_LIST_HEAD(&trans->list);
186 	trans->msg_type = msg_type;
187 
188 	trans->net = ctx->net;
189 	trans->table = ctx->table;
190 	trans->seq = ctx->seq;
191 	trans->flags = ctx->flags;
192 	trans->report = ctx->report;
193 
194 	return trans;
195 }
196 
197 static struct nft_trans_binding *nft_trans_get_binding(struct nft_trans *trans)
198 {
199 	switch (trans->msg_type) {
200 	case NFT_MSG_NEWCHAIN:
201 	case NFT_MSG_NEWSET:
202 		return container_of(trans, struct nft_trans_binding, nft_trans);
203 	}
204 
205 	return NULL;
206 }
207 
208 static void nft_trans_list_del(struct nft_trans *trans)
209 {
210 	struct nft_trans_binding *trans_binding;
211 
212 	list_del(&trans->list);
213 
214 	trans_binding = nft_trans_get_binding(trans);
215 	if (trans_binding)
216 		list_del(&trans_binding->binding_list);
217 }
218 
219 static void nft_trans_destroy(struct nft_trans *trans)
220 {
221 	nft_trans_list_del(trans);
222 	kfree(trans);
223 }
224 
225 static void __nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set,
226 				 bool bind)
227 {
228 	struct nftables_pernet *nft_net;
229 	struct net *net = ctx->net;
230 	struct nft_trans *trans;
231 
232 	if (!nft_set_is_anonymous(set))
233 		return;
234 
235 	nft_net = nft_pernet(net);
236 	list_for_each_entry_reverse(trans, &nft_net->commit_list, list) {
237 		switch (trans->msg_type) {
238 		case NFT_MSG_NEWSET:
239 			if (nft_trans_set(trans) == set)
240 				nft_trans_set_bound(trans) = bind;
241 			break;
242 		case NFT_MSG_NEWSETELEM:
243 			if (nft_trans_elem_set(trans) == set)
244 				nft_trans_elem_set_bound(trans) = bind;
245 			break;
246 		}
247 	}
248 }
249 
250 static void nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set)
251 {
252 	return __nft_set_trans_bind(ctx, set, true);
253 }
254 
255 static void nft_set_trans_unbind(const struct nft_ctx *ctx, struct nft_set *set)
256 {
257 	return __nft_set_trans_bind(ctx, set, false);
258 }
259 
260 static void __nft_chain_trans_bind(const struct nft_ctx *ctx,
261 				   struct nft_chain *chain, bool bind)
262 {
263 	struct nftables_pernet *nft_net;
264 	struct net *net = ctx->net;
265 	struct nft_trans *trans;
266 
267 	if (!nft_chain_binding(chain))
268 		return;
269 
270 	nft_net = nft_pernet(net);
271 	list_for_each_entry_reverse(trans, &nft_net->commit_list, list) {
272 		switch (trans->msg_type) {
273 		case NFT_MSG_NEWCHAIN:
274 			if (nft_trans_chain(trans) == chain)
275 				nft_trans_chain_bound(trans) = bind;
276 			break;
277 		case NFT_MSG_NEWRULE:
278 			if (nft_trans_rule_chain(trans) == chain)
279 				nft_trans_rule_bound(trans) = bind;
280 			break;
281 		}
282 	}
283 }
284 
285 static void nft_chain_trans_bind(const struct nft_ctx *ctx,
286 				 struct nft_chain *chain)
287 {
288 	__nft_chain_trans_bind(ctx, chain, true);
289 }
290 
291 int nf_tables_bind_chain(const struct nft_ctx *ctx, struct nft_chain *chain)
292 {
293 	if (!nft_chain_binding(chain))
294 		return 0;
295 
296 	if (nft_chain_binding(ctx->chain))
297 		return -EOPNOTSUPP;
298 
299 	if (chain->bound)
300 		return -EBUSY;
301 
302 	if (!nft_use_inc(&chain->use))
303 		return -EMFILE;
304 
305 	chain->bound = true;
306 	nft_chain_trans_bind(ctx, chain);
307 
308 	return 0;
309 }
310 
311 void nf_tables_unbind_chain(const struct nft_ctx *ctx, struct nft_chain *chain)
312 {
313 	__nft_chain_trans_bind(ctx, chain, false);
314 }
315 
316 static int nft_netdev_register_hooks(struct net *net,
317 				     struct list_head *hook_list)
318 {
319 	struct nf_hook_ops *ops;
320 	struct nft_hook *hook;
321 	int err, j;
322 
323 	j = 0;
324 	list_for_each_entry(hook, hook_list, list) {
325 		list_for_each_entry(ops, &hook->ops_list, list) {
326 			err = nf_register_net_hook(net, ops);
327 			if (err < 0)
328 				goto err_register;
329 
330 			j++;
331 		}
332 	}
333 	return 0;
334 
335 err_register:
336 	list_for_each_entry(hook, hook_list, list) {
337 		list_for_each_entry(ops, &hook->ops_list, list) {
338 			if (j-- <= 0)
339 				break;
340 
341 			nf_unregister_net_hook(net, ops);
342 		}
343 	}
344 	return err;
345 }
346 
347 static void nft_netdev_hook_free_ops(struct nft_hook *hook)
348 {
349 	struct nf_hook_ops *ops, *next;
350 
351 	list_for_each_entry_safe(ops, next, &hook->ops_list, list) {
352 		list_del(&ops->list);
353 		kfree(ops);
354 	}
355 }
356 
357 static void nft_netdev_hook_free(struct nft_hook *hook)
358 {
359 	nft_netdev_hook_free_ops(hook);
360 	kfree(hook);
361 }
362 
363 static void __nft_netdev_hook_free_rcu(struct rcu_head *rcu)
364 {
365 	struct nft_hook *hook = container_of(rcu, struct nft_hook, rcu);
366 
367 	nft_netdev_hook_free(hook);
368 }
369 
370 static void nft_netdev_hook_free_rcu(struct nft_hook *hook)
371 {
372 	call_rcu(&hook->rcu, __nft_netdev_hook_free_rcu);
373 }
374 
375 static void nft_netdev_hook_unlink_free_rcu(struct nft_hook *hook)
376 {
377 	list_del_rcu(&hook->list);
378 	nft_netdev_hook_free_rcu(hook);
379 }
380 
381 static void nft_trans_hook_destroy(struct nft_trans_hook *trans_hook)
382 {
383 	list_del(&trans_hook->list);
384 	kfree(trans_hook);
385 }
386 
387 static void nft_netdev_unregister_trans_hook(struct net *net,
388 					     const struct nft_table *table,
389 					     struct list_head *hook_list)
390 {
391 	struct nft_trans_hook *trans_hook, *next;
392 	struct nf_hook_ops *ops;
393 	struct nft_hook *hook;
394 
395 	list_for_each_entry_safe(trans_hook, next, hook_list, list) {
396 		hook = trans_hook->hook;
397 
398 		if (!(table->flags & NFT_TABLE_F_DORMANT)) {
399 			list_for_each_entry(ops, &hook->ops_list, list)
400 				nf_unregister_net_hook(net, ops);
401 		}
402 		nft_netdev_hook_unlink_free_rcu(hook);
403 		nft_trans_hook_destroy(trans_hook);
404 	}
405 }
406 
407 static void nft_netdev_unregister_hooks(struct net *net,
408 					const struct nft_table *table,
409 					struct list_head *hook_list,
410 					bool release_netdev)
411 {
412 	struct nft_hook *hook, *next;
413 	struct nf_hook_ops *ops;
414 
415 	list_for_each_entry_safe(hook, next, hook_list, list) {
416 		if (!(table->flags & NFT_TABLE_F_DORMANT)) {
417 			list_for_each_entry(ops, &hook->ops_list, list)
418 				nf_unregister_net_hook(net, ops);
419 		}
420 		if (release_netdev)
421 			nft_netdev_hook_unlink_free_rcu(hook);
422 	}
423 }
424 
425 static int nf_tables_register_hook(struct net *net,
426 				   const struct nft_table *table,
427 				   struct nft_chain *chain)
428 {
429 	struct nft_base_chain *basechain;
430 	const struct nf_hook_ops *ops;
431 
432 	if (table->flags & NFT_TABLE_F_DORMANT ||
433 	    !nft_is_base_chain(chain))
434 		return 0;
435 
436 	basechain = nft_base_chain(chain);
437 	ops = &basechain->ops;
438 
439 	if (basechain->type->ops_register)
440 		return basechain->type->ops_register(net, ops);
441 
442 	if (nft_base_chain_netdev(table->family, basechain->ops.hooknum))
443 		return nft_netdev_register_hooks(net, &basechain->hook_list);
444 
445 	return nf_register_net_hook(net, &basechain->ops);
446 }
447 
448 static void __nf_tables_unregister_hook(struct net *net,
449 					const struct nft_table *table,
450 					struct nft_chain *chain,
451 					bool release_netdev)
452 {
453 	struct nft_base_chain *basechain;
454 	const struct nf_hook_ops *ops;
455 
456 	if (!nft_is_base_chain(chain))
457 		return;
458 	basechain = nft_base_chain(chain);
459 	ops = &basechain->ops;
460 
461 	/* must also be called for dormant tables */
462 	if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) {
463 		nft_netdev_unregister_hooks(net, table, &basechain->hook_list,
464 					    release_netdev);
465 		return;
466 	}
467 
468 	if (table->flags & NFT_TABLE_F_DORMANT)
469 		return;
470 
471 	if (basechain->type->ops_unregister)
472 		return basechain->type->ops_unregister(net, ops);
473 
474 	nf_unregister_net_hook(net, &basechain->ops);
475 }
476 
477 static void nf_tables_unregister_hook(struct net *net,
478 				      const struct nft_table *table,
479 				      struct nft_chain *chain)
480 {
481 	return __nf_tables_unregister_hook(net, table, chain, false);
482 }
483 
484 static bool nft_trans_collapse_set_elem_allowed(const struct nft_trans_elem *a, const struct nft_trans_elem *b)
485 {
486 	/* NB: the ->bound equality check is defensive, at this time we only merge
487 	 * a new nft_trans_elem transaction request with the transaction tail
488 	 * element, but a->bound != b->bound would imply a NEWRULE transaction
489 	 * is queued in-between.
490 	 *
491 	 * The set check is mandatory, the NFT_MAX_SET_NELEMS check prevents
492 	 * huge krealloc() requests.
493 	 */
494 	return a->set == b->set && a->bound == b->bound && a->nelems < NFT_MAX_SET_NELEMS;
495 }
496 
497 static bool nft_trans_collapse_set_elem(struct nftables_pernet *nft_net,
498 					struct nft_trans_elem *tail,
499 					struct nft_trans_elem *trans)
500 {
501 	unsigned int nelems, old_nelems = tail->nelems;
502 	struct nft_trans_elem *new_trans;
503 
504 	if (!nft_trans_collapse_set_elem_allowed(tail, trans))
505 		return false;
506 
507 	/* "cannot happen", at this time userspace element add
508 	 * requests always allocate a new transaction element.
509 	 *
510 	 * This serves as a reminder to adjust the list_add_tail
511 	 * logic below in case this ever changes.
512 	 */
513 	if (WARN_ON_ONCE(trans->nelems != 1))
514 		return false;
515 
516 	if (check_add_overflow(old_nelems, trans->nelems, &nelems))
517 		return false;
518 
519 	/* krealloc might free tail which invalidates list pointers */
520 	list_del_init(&tail->nft_trans.list);
521 
522 	new_trans = krealloc(tail, struct_size(tail, elems, nelems),
523 			     GFP_KERNEL);
524 	if (!new_trans) {
525 		list_add_tail(&tail->nft_trans.list,
526 			      &nft_net->commit_list);
527 		return false;
528 	}
529 
530 	/*
531 	 * new_trans->nft_trans.list contains garbage, but
532 	 * list_add_tail() doesn't care.
533 	 */
534 	new_trans->nelems = nelems;
535 	new_trans->elems[old_nelems] = trans->elems[0];
536 	list_add_tail(&new_trans->nft_trans.list, &nft_net->commit_list);
537 
538 	return true;
539 }
540 
541 static bool nft_trans_try_collapse(struct nftables_pernet *nft_net,
542 				   struct nft_trans *trans)
543 {
544 	struct nft_trans *tail;
545 
546 	if (list_empty(&nft_net->commit_list))
547 		return false;
548 
549 	tail = list_last_entry(&nft_net->commit_list, struct nft_trans, list);
550 
551 	if (tail->msg_type != trans->msg_type)
552 		return false;
553 
554 	switch (trans->msg_type) {
555 	case NFT_MSG_NEWSETELEM:
556 	case NFT_MSG_DELSETELEM:
557 		return nft_trans_collapse_set_elem(nft_net,
558 						   nft_trans_container_elem(tail),
559 						   nft_trans_container_elem(trans));
560 	}
561 
562 	return false;
563 }
564 
565 static void nft_trans_commit_list_add_tail(struct net *net, struct nft_trans *trans)
566 {
567 	struct nftables_pernet *nft_net = nft_pernet(net);
568 	struct nft_trans_binding *binding;
569 	struct nft_trans_set *trans_set;
570 
571 	list_add_tail(&trans->list, &nft_net->commit_list);
572 
573 	binding = nft_trans_get_binding(trans);
574 	if (!binding)
575 		return;
576 
577 	switch (trans->msg_type) {
578 	case NFT_MSG_NEWSET:
579 		trans_set = nft_trans_container_set(trans);
580 
581 		if (!nft_trans_set_update(trans) &&
582 		    nft_set_is_anonymous(nft_trans_set(trans)))
583 			list_add_tail(&binding->binding_list, &nft_net->binding_list);
584 
585 		list_add_tail(&trans_set->list_trans_newset, &nft_net->commit_set_list);
586 		break;
587 	case NFT_MSG_NEWCHAIN:
588 		if (!nft_trans_chain_update(trans) &&
589 		    nft_chain_binding(nft_trans_chain(trans)))
590 			list_add_tail(&binding->binding_list, &nft_net->binding_list);
591 		break;
592 	}
593 }
594 
595 static void nft_trans_commit_list_add_elem(struct net *net, struct nft_trans *trans)
596 {
597 	struct nftables_pernet *nft_net = nft_pernet(net);
598 	struct nft_trans_elem *te;
599 
600 	WARN_ON_ONCE(trans->msg_type != NFT_MSG_NEWSETELEM &&
601 		     trans->msg_type != NFT_MSG_DELSETELEM);
602 
603 	te = nft_trans_container_elem(trans);
604 	if (te->set->ops->commit && list_empty(&te->set->pending_update))
605 		list_add_tail(&te->set->pending_update, &nft_net->set_update_list);
606 
607 	if (nft_trans_try_collapse(nft_net, trans)) {
608 		kfree(trans);
609 		return;
610 	}
611 
612 	nft_trans_commit_list_add_tail(net, trans);
613 }
614 
615 static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type)
616 {
617 	struct nft_trans *trans;
618 
619 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_table));
620 	if (trans == NULL)
621 		return -ENOMEM;
622 
623 	if (msg_type == NFT_MSG_NEWTABLE)
624 		nft_activate_next(ctx->net, ctx->table);
625 
626 	nft_trans_commit_list_add_tail(ctx->net, trans);
627 	return 0;
628 }
629 
630 static int nft_deltable(struct nft_ctx *ctx)
631 {
632 	int err;
633 
634 	err = nft_trans_table_add(ctx, NFT_MSG_DELTABLE);
635 	if (err < 0)
636 		return err;
637 
638 	nft_deactivate_next(ctx->net, ctx->table);
639 	return err;
640 }
641 
642 static struct nft_trans *
643 nft_trans_alloc_chain(const struct nft_ctx *ctx, int msg_type)
644 {
645 	struct nft_trans_chain *trans_chain;
646 	struct nft_trans *trans;
647 
648 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_chain));
649 	if (!trans)
650 		return NULL;
651 
652 	trans_chain = nft_trans_container_chain(trans);
653 	INIT_LIST_HEAD(&trans_chain->nft_trans_binding.binding_list);
654 	trans_chain->chain = ctx->chain;
655 
656 	return trans;
657 }
658 
659 static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
660 {
661 	struct nft_trans *trans;
662 
663 	trans = nft_trans_alloc_chain(ctx, msg_type);
664 	if (trans == NULL)
665 		return ERR_PTR(-ENOMEM);
666 
667 	if (msg_type == NFT_MSG_NEWCHAIN) {
668 		nft_activate_next(ctx->net, ctx->chain);
669 
670 		if (ctx->nla[NFTA_CHAIN_ID]) {
671 			nft_trans_chain_id(trans) =
672 				ntohl(nla_get_be32(ctx->nla[NFTA_CHAIN_ID]));
673 		}
674 	}
675 	nft_trans_commit_list_add_tail(ctx->net, trans);
676 
677 	return trans;
678 }
679 
680 static int nft_delchain(struct nft_ctx *ctx)
681 {
682 	struct nft_trans *trans;
683 
684 	trans = nft_trans_chain_add(ctx, NFT_MSG_DELCHAIN);
685 	if (IS_ERR(trans))
686 		return PTR_ERR(trans);
687 
688 	nft_use_dec(&ctx->table->use);
689 	nft_deactivate_next(ctx->net, ctx->chain);
690 
691 	return 0;
692 }
693 
694 void nft_rule_expr_activate(const struct nft_ctx *ctx, struct nft_rule *rule)
695 {
696 	struct nft_expr *expr;
697 
698 	expr = nft_expr_first(rule);
699 	while (nft_expr_more(rule, expr)) {
700 		if (expr->ops->activate)
701 			expr->ops->activate(ctx, expr);
702 
703 		expr = nft_expr_next(expr);
704 	}
705 }
706 
707 void nft_rule_expr_deactivate(const struct nft_ctx *ctx, struct nft_rule *rule,
708 			      enum nft_trans_phase phase)
709 {
710 	struct nft_expr *expr;
711 
712 	expr = nft_expr_first(rule);
713 	while (nft_expr_more(rule, expr)) {
714 		if (expr->ops->deactivate)
715 			expr->ops->deactivate(ctx, expr, phase);
716 
717 		expr = nft_expr_next(expr);
718 	}
719 }
720 
721 static int
722 nf_tables_delrule_deactivate(struct nft_ctx *ctx, struct nft_rule *rule)
723 {
724 	/* You cannot delete the same rule twice */
725 	if (nft_is_active_next(ctx->net, rule)) {
726 		nft_deactivate_next(ctx->net, rule);
727 		nft_use_dec(&ctx->chain->use);
728 		return 0;
729 	}
730 	return -ENOENT;
731 }
732 
733 static struct nft_trans *nft_trans_rule_add(struct nft_ctx *ctx, int msg_type,
734 					    struct nft_rule *rule)
735 {
736 	struct nft_trans *trans;
737 
738 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_rule));
739 	if (trans == NULL)
740 		return NULL;
741 
742 	if (msg_type == NFT_MSG_NEWRULE && ctx->nla[NFTA_RULE_ID] != NULL) {
743 		nft_trans_rule_id(trans) =
744 			ntohl(nla_get_be32(ctx->nla[NFTA_RULE_ID]));
745 	}
746 	nft_trans_rule(trans) = rule;
747 	nft_trans_rule_chain(trans) = ctx->chain;
748 	nft_trans_commit_list_add_tail(ctx->net, trans);
749 
750 	return trans;
751 }
752 
753 static int nft_delrule(struct nft_ctx *ctx, struct nft_rule *rule)
754 {
755 	struct nft_flow_rule *flow;
756 	struct nft_trans *trans;
757 	int err;
758 
759 	trans = nft_trans_rule_add(ctx, NFT_MSG_DELRULE, rule);
760 	if (trans == NULL)
761 		return -ENOMEM;
762 
763 	if (ctx->chain->flags & NFT_CHAIN_HW_OFFLOAD) {
764 		flow = nft_flow_rule_create(ctx->net, rule);
765 		if (IS_ERR(flow)) {
766 			nft_trans_destroy(trans);
767 			return PTR_ERR(flow);
768 		}
769 
770 		nft_trans_flow_rule(trans) = flow;
771 	}
772 
773 	err = nf_tables_delrule_deactivate(ctx, rule);
774 	if (err < 0) {
775 		nft_trans_destroy(trans);
776 		return err;
777 	}
778 	nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_PREPARE);
779 
780 	return 0;
781 }
782 
783 static int nft_delrule_by_chain(struct nft_ctx *ctx)
784 {
785 	struct nft_rule *rule;
786 	int err;
787 
788 	list_for_each_entry(rule, &ctx->chain->rules, list) {
789 		if (!nft_is_active_next(ctx->net, rule))
790 			continue;
791 
792 		err = nft_delrule(ctx, rule);
793 		if (err < 0)
794 			return err;
795 	}
796 	return 0;
797 }
798 
799 static int __nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
800 			       struct nft_set *set,
801 			       const struct nft_set_desc *desc)
802 {
803 	struct nft_trans_set *trans_set;
804 	struct nft_trans *trans;
805 
806 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_set));
807 	if (trans == NULL)
808 		return -ENOMEM;
809 
810 	trans_set = nft_trans_container_set(trans);
811 	INIT_LIST_HEAD(&trans_set->nft_trans_binding.binding_list);
812 	INIT_LIST_HEAD(&trans_set->list_trans_newset);
813 
814 	if (msg_type == NFT_MSG_NEWSET && ctx->nla[NFTA_SET_ID] && !desc) {
815 		nft_trans_set_id(trans) =
816 			ntohl(nla_get_be32(ctx->nla[NFTA_SET_ID]));
817 		nft_activate_next(ctx->net, set);
818 	}
819 	nft_trans_set(trans) = set;
820 	if (desc) {
821 		nft_trans_set_update(trans) = true;
822 		nft_trans_set_gc_int(trans) = desc->gc_int;
823 		nft_trans_set_timeout(trans) = desc->timeout;
824 		nft_trans_set_size(trans) = desc->size;
825 	}
826 	nft_trans_commit_list_add_tail(ctx->net, trans);
827 
828 	return 0;
829 }
830 
831 static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
832 			     struct nft_set *set)
833 {
834 	return __nft_trans_set_add(ctx, msg_type, set, NULL);
835 }
836 
837 static int nft_mapelem_deactivate(const struct nft_ctx *ctx,
838 				  struct nft_set *set,
839 				  const struct nft_set_iter *iter,
840 				  struct nft_elem_priv *elem_priv)
841 {
842 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
843 
844 	if (!nft_set_elem_active(ext, iter->genmask))
845 		return 0;
846 
847 	nft_set_elem_change_active(ctx->net, set, ext);
848 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
849 
850 	return 0;
851 }
852 
853 struct nft_set_elem_catchall {
854 	struct list_head	list;
855 	struct rcu_head		rcu;
856 	struct nft_elem_priv	*elem;
857 };
858 
859 static void nft_map_catchall_deactivate(const struct nft_ctx *ctx,
860 					struct nft_set *set)
861 {
862 	u8 genmask = nft_genmask_next(ctx->net);
863 	struct nft_set_elem_catchall *catchall;
864 	struct nft_set_ext *ext;
865 
866 	list_for_each_entry(catchall, &set->catchall_list, list) {
867 		ext = nft_set_elem_ext(set, catchall->elem);
868 		if (!nft_set_elem_active(ext, genmask))
869 			continue;
870 
871 		nft_set_elem_change_active(ctx->net, set, ext);
872 		nft_setelem_data_deactivate(ctx->net, set, catchall->elem);
873 	}
874 }
875 
876 /* Use NFT_ITER_UPDATE iterator even if this may be called from the preparation
877  * phase, the set clone might already exist from a previous command, or it might
878  * be a set that is going away and does not require a clone. The netns and
879  * netlink release paths also need to work on the live set.
880  */
881 static void nft_map_deactivate(const struct nft_ctx *ctx, struct nft_set *set)
882 {
883 	struct nft_set_iter iter = {
884 		.genmask	= nft_genmask_next(ctx->net),
885 		.type		= NFT_ITER_UPDATE,
886 		.fn		= nft_mapelem_deactivate,
887 	};
888 
889 	set->ops->walk(ctx, set, &iter);
890 	WARN_ON_ONCE(iter.err);
891 
892 	nft_map_catchall_deactivate(ctx, set);
893 }
894 
895 static int nft_delset(const struct nft_ctx *ctx, struct nft_set *set)
896 {
897 	int err;
898 
899 	err = nft_trans_set_add(ctx, NFT_MSG_DELSET, set);
900 	if (err < 0)
901 		return err;
902 
903 	if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
904 		nft_map_deactivate(ctx, set);
905 
906 	nft_deactivate_next(ctx->net, set);
907 	nft_use_dec(&ctx->table->use);
908 
909 	return err;
910 }
911 
912 static int nft_trans_obj_add(struct nft_ctx *ctx, int msg_type,
913 			     struct nft_object *obj)
914 {
915 	struct nft_trans *trans;
916 
917 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_obj));
918 	if (trans == NULL)
919 		return -ENOMEM;
920 
921 	if (msg_type == NFT_MSG_NEWOBJ)
922 		nft_activate_next(ctx->net, obj);
923 
924 	nft_trans_obj(trans) = obj;
925 	nft_trans_commit_list_add_tail(ctx->net, trans);
926 
927 	return 0;
928 }
929 
930 static int nft_delobj(struct nft_ctx *ctx, struct nft_object *obj)
931 {
932 	int err;
933 
934 	err = nft_trans_obj_add(ctx, NFT_MSG_DELOBJ, obj);
935 	if (err < 0)
936 		return err;
937 
938 	nft_deactivate_next(ctx->net, obj);
939 	nft_use_dec(&ctx->table->use);
940 
941 	return err;
942 }
943 
944 static struct nft_trans *
945 nft_trans_flowtable_add(struct nft_ctx *ctx, int msg_type,
946 		        struct nft_flowtable *flowtable)
947 {
948 	struct nft_trans *trans;
949 
950 	trans = nft_trans_alloc(ctx, msg_type,
951 				sizeof(struct nft_trans_flowtable));
952 	if (trans == NULL)
953 		return ERR_PTR(-ENOMEM);
954 
955 	if (msg_type == NFT_MSG_NEWFLOWTABLE)
956 		nft_activate_next(ctx->net, flowtable);
957 
958 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
959 	nft_trans_flowtable(trans) = flowtable;
960 	nft_trans_commit_list_add_tail(ctx->net, trans);
961 
962 	return trans;
963 }
964 
965 static int nft_delflowtable(struct nft_ctx *ctx,
966 			    struct nft_flowtable *flowtable)
967 {
968 	struct nft_trans *trans;
969 
970 	trans = nft_trans_flowtable_add(ctx, NFT_MSG_DELFLOWTABLE, flowtable);
971 	if (IS_ERR(trans))
972 		return PTR_ERR(trans);
973 
974 	nft_deactivate_next(ctx->net, flowtable);
975 	nft_use_dec(&ctx->table->use);
976 
977 	return 0;
978 }
979 
980 /*
981  * Tables
982  */
983 
984 static struct nft_table *nft_table_lookup(const struct net *net,
985 					  const struct nlattr *nla,
986 					  u8 family, u8 genmask, u32 nlpid)
987 {
988 	struct nftables_pernet *nft_net;
989 	struct nft_table *table;
990 
991 	if (nla == NULL)
992 		return ERR_PTR(-EINVAL);
993 
994 	nft_net = nft_pernet(net);
995 	list_for_each_entry_rcu(table, &nft_net->tables, list,
996 				lockdep_is_held(&nft_net->commit_mutex)) {
997 		if (!nla_strcmp(nla, table->name) &&
998 		    table->family == family &&
999 		    nft_active_genmask(table, genmask)) {
1000 			if (nft_table_has_owner(table) &&
1001 			    nlpid && table->nlpid != nlpid)
1002 				return ERR_PTR(-EPERM);
1003 
1004 			return table;
1005 		}
1006 	}
1007 
1008 	return ERR_PTR(-ENOENT);
1009 }
1010 
1011 static struct nft_table *nft_table_lookup_byhandle(const struct net *net,
1012 						   const struct nlattr *nla,
1013 						   int family, u8 genmask, u32 nlpid)
1014 {
1015 	struct nftables_pernet *nft_net;
1016 	struct nft_table *table;
1017 
1018 	nft_net = nft_pernet(net);
1019 	list_for_each_entry(table, &nft_net->tables, list) {
1020 		if (be64_to_cpu(nla_get_be64(nla)) == table->handle &&
1021 		    table->family == family &&
1022 		    nft_active_genmask(table, genmask)) {
1023 			if (nft_table_has_owner(table) &&
1024 			    nlpid && table->nlpid != nlpid)
1025 				return ERR_PTR(-EPERM);
1026 
1027 			return table;
1028 		}
1029 	}
1030 
1031 	return ERR_PTR(-ENOENT);
1032 }
1033 
1034 static inline u64 nf_tables_alloc_handle(struct nft_table *table)
1035 {
1036 	return ++table->hgenerator;
1037 }
1038 
1039 static const struct nft_chain_type *chain_type[NFPROTO_NUMPROTO][NFT_CHAIN_T_MAX];
1040 
1041 static const struct nft_chain_type *
1042 __nft_chain_type_get(u8 family, enum nft_chain_types type)
1043 {
1044 	if (family >= NFPROTO_NUMPROTO ||
1045 	    type >= NFT_CHAIN_T_MAX)
1046 		return NULL;
1047 
1048 	return chain_type[family][type];
1049 }
1050 
1051 static const struct nft_chain_type *
1052 __nf_tables_chain_type_lookup(const struct nlattr *nla, u8 family)
1053 {
1054 	const struct nft_chain_type *type;
1055 	int i;
1056 
1057 	for (i = 0; i < NFT_CHAIN_T_MAX; i++) {
1058 		type = __nft_chain_type_get(family, i);
1059 		if (!type)
1060 			continue;
1061 		if (!nla_strcmp(nla, type->name))
1062 			return type;
1063 	}
1064 	return NULL;
1065 }
1066 
1067 struct nft_module_request {
1068 	struct list_head	list;
1069 	char			module[MODULE_NAME_LEN];
1070 	bool			done;
1071 };
1072 
1073 #ifdef CONFIG_MODULES
1074 __printf(2, 3) int nft_request_module(struct net *net, const char *fmt,
1075 				      ...)
1076 {
1077 	char module_name[MODULE_NAME_LEN];
1078 	struct nftables_pernet *nft_net;
1079 	struct nft_module_request *req;
1080 	va_list args;
1081 	int ret;
1082 
1083 	va_start(args, fmt);
1084 	ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);
1085 	va_end(args);
1086 	if (ret >= MODULE_NAME_LEN)
1087 		return 0;
1088 
1089 	nft_net = nft_pernet(net);
1090 	list_for_each_entry(req, &nft_net->module_list, list) {
1091 		if (!strcmp(req->module, module_name)) {
1092 			if (req->done)
1093 				return 0;
1094 
1095 			/* A request to load this module already exists. */
1096 			return -EAGAIN;
1097 		}
1098 	}
1099 
1100 	req = kmalloc_obj(*req);
1101 	if (!req)
1102 		return -ENOMEM;
1103 
1104 	req->done = false;
1105 	strscpy(req->module, module_name, MODULE_NAME_LEN);
1106 	list_add_tail(&req->list, &nft_net->module_list);
1107 
1108 	return -EAGAIN;
1109 }
1110 EXPORT_SYMBOL_GPL(nft_request_module);
1111 #endif
1112 
1113 static void lockdep_nfnl_nft_mutex_not_held(void)
1114 {
1115 #ifdef CONFIG_PROVE_LOCKING
1116 	if (debug_locks)
1117 		WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES));
1118 #endif
1119 }
1120 
1121 static const struct nft_chain_type *
1122 nf_tables_chain_type_lookup(struct net *net, const struct nlattr *nla,
1123 			    u8 family, bool autoload)
1124 {
1125 	const struct nft_chain_type *type;
1126 
1127 	type = __nf_tables_chain_type_lookup(nla, family);
1128 	if (type != NULL)
1129 		return type;
1130 
1131 	lockdep_nfnl_nft_mutex_not_held();
1132 #ifdef CONFIG_MODULES
1133 	if (autoload) {
1134 		if (nft_request_module(net, "nft-chain-%u-%.*s", family,
1135 				       nla_len(nla),
1136 				       (const char *)nla_data(nla)) == -EAGAIN)
1137 			return ERR_PTR(-EAGAIN);
1138 	}
1139 #endif
1140 	return ERR_PTR(-ENOENT);
1141 }
1142 
1143 static unsigned int nft_base_seq(const struct net *net)
1144 {
1145 	return READ_ONCE(net->nft.base_seq);
1146 }
1147 
1148 static __be16 nft_base_seq_be16(const struct net *net)
1149 {
1150 	return htons(nft_base_seq(net) & 0xffff);
1151 }
1152 
1153 static const struct nla_policy nft_table_policy[NFTA_TABLE_MAX + 1] = {
1154 	[NFTA_TABLE_NAME]	= { .type = NLA_STRING,
1155 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
1156 	[NFTA_TABLE_FLAGS]	= NLA_POLICY_MASK(NLA_BE32, NFT_TABLE_F_MASK),
1157 	[NFTA_TABLE_HANDLE]	= { .type = NLA_U64 },
1158 	[NFTA_TABLE_USERDATA]	= { .type = NLA_BINARY,
1159 				    .len = NFT_USERDATA_MAXLEN }
1160 };
1161 
1162 static int nf_tables_fill_table_info(struct sk_buff *skb, struct net *net,
1163 				     u32 portid, u32 seq, int event, u32 flags,
1164 				     int family, const struct nft_table *table)
1165 {
1166 	struct nlmsghdr *nlh;
1167 
1168 	nlh = nfnl_msg_put(skb, portid, seq,
1169 			   nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event),
1170 			   flags, family, NFNETLINK_V0, nft_base_seq_be16(net));
1171 	if (!nlh)
1172 		goto nla_put_failure;
1173 
1174 	if (nla_put_string(skb, NFTA_TABLE_NAME, table->name) ||
1175 	    nla_put_be32(skb, NFTA_TABLE_USE, htonl(table->use)) ||
1176 	    nla_put_be64(skb, NFTA_TABLE_HANDLE, cpu_to_be64(table->handle),
1177 			 NFTA_TABLE_PAD))
1178 		goto nla_put_failure;
1179 
1180 	if (event == NFT_MSG_DELTABLE ||
1181 	    event == NFT_MSG_DESTROYTABLE) {
1182 		nlmsg_end(skb, nlh);
1183 		return 0;
1184 	}
1185 
1186 	if (nla_put_be32(skb, NFTA_TABLE_FLAGS,
1187 			 htonl(table->flags & NFT_TABLE_F_MASK)))
1188 		goto nla_put_failure;
1189 
1190 	if (nft_table_has_owner(table) &&
1191 	    nla_put_be32(skb, NFTA_TABLE_OWNER, htonl(table->nlpid)))
1192 		goto nla_put_failure;
1193 
1194 	if (table->udata) {
1195 		if (nla_put(skb, NFTA_TABLE_USERDATA, table->udlen, table->udata))
1196 			goto nla_put_failure;
1197 	}
1198 
1199 	nlmsg_end(skb, nlh);
1200 	return 0;
1201 
1202 nla_put_failure:
1203 	nlmsg_trim(skb, nlh);
1204 	return -1;
1205 }
1206 
1207 struct nftnl_skb_parms {
1208 	bool report;
1209 };
1210 #define NFT_CB(skb)	(*(struct nftnl_skb_parms*)&((skb)->cb))
1211 
1212 static void nft_notify_enqueue(struct sk_buff *skb, bool report,
1213 			       struct list_head *notify_list)
1214 {
1215 	NFT_CB(skb).report = report;
1216 	list_add_tail(&skb->list, notify_list);
1217 }
1218 
1219 static void nf_tables_table_notify(const struct nft_ctx *ctx, int event)
1220 {
1221 	struct nftables_pernet *nft_net;
1222 	struct sk_buff *skb;
1223 	u16 flags = 0;
1224 	int err;
1225 
1226 	if (!ctx->report &&
1227 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1228 		return;
1229 
1230 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1231 	if (skb == NULL)
1232 		goto err;
1233 
1234 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
1235 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
1236 
1237 	err = nf_tables_fill_table_info(skb, ctx->net, ctx->portid, ctx->seq,
1238 					event, flags, ctx->family, ctx->table);
1239 	if (err < 0) {
1240 		kfree_skb(skb);
1241 		goto err;
1242 	}
1243 
1244 	nft_net = nft_pernet(ctx->net);
1245 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
1246 	return;
1247 err:
1248 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
1249 }
1250 
1251 static int nf_tables_dump_tables(struct sk_buff *skb,
1252 				 struct netlink_callback *cb)
1253 {
1254 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1255 	struct nftables_pernet *nft_net;
1256 	const struct nft_table *table;
1257 	unsigned int idx = 0, s_idx = cb->args[0];
1258 	struct net *net = sock_net(skb->sk);
1259 	int family = nfmsg->nfgen_family;
1260 
1261 	rcu_read_lock();
1262 	nft_net = nft_pernet(net);
1263 	cb->seq = nft_base_seq(net);
1264 
1265 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
1266 		if (family != NFPROTO_UNSPEC && family != table->family)
1267 			continue;
1268 
1269 		if (idx < s_idx)
1270 			goto cont;
1271 		if (idx > s_idx)
1272 			memset(&cb->args[1], 0,
1273 			       sizeof(cb->args) - sizeof(cb->args[0]));
1274 		if (!nft_is_active(net, table))
1275 			continue;
1276 		if (nf_tables_fill_table_info(skb, net,
1277 					      NETLINK_CB(cb->skb).portid,
1278 					      cb->nlh->nlmsg_seq,
1279 					      NFT_MSG_NEWTABLE, NLM_F_MULTI,
1280 					      table->family, table) < 0)
1281 			goto done;
1282 
1283 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1284 cont:
1285 		idx++;
1286 	}
1287 done:
1288 	rcu_read_unlock();
1289 	cb->args[0] = idx;
1290 	return skb->len;
1291 }
1292 
1293 static int nft_netlink_dump_start_rcu(struct sock *nlsk, struct sk_buff *skb,
1294 				      const struct nlmsghdr *nlh,
1295 				      struct netlink_dump_control *c)
1296 {
1297 	int err;
1298 
1299 	if (!try_module_get(THIS_MODULE))
1300 		return -EINVAL;
1301 
1302 	rcu_read_unlock();
1303 	err = netlink_dump_start(nlsk, skb, nlh, c);
1304 	rcu_read_lock();
1305 	module_put(THIS_MODULE);
1306 
1307 	return err;
1308 }
1309 
1310 /* called with rcu_read_lock held */
1311 static int nf_tables_gettable(struct sk_buff *skb, const struct nfnl_info *info,
1312 			      const struct nlattr * const nla[])
1313 {
1314 	struct netlink_ext_ack *extack = info->extack;
1315 	u8 genmask = nft_genmask_cur(info->net);
1316 	u8 family = info->nfmsg->nfgen_family;
1317 	const struct nft_table *table;
1318 	struct net *net = info->net;
1319 	struct sk_buff *skb2;
1320 	int err;
1321 
1322 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
1323 		struct netlink_dump_control c = {
1324 			.dump = nf_tables_dump_tables,
1325 			.module = THIS_MODULE,
1326 		};
1327 
1328 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
1329 	}
1330 
1331 	table = nft_table_lookup(net, nla[NFTA_TABLE_NAME], family, genmask, 0);
1332 	if (IS_ERR(table)) {
1333 		NL_SET_BAD_ATTR(extack, nla[NFTA_TABLE_NAME]);
1334 		return PTR_ERR(table);
1335 	}
1336 
1337 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
1338 	if (!skb2)
1339 		return -ENOMEM;
1340 
1341 	err = nf_tables_fill_table_info(skb2, net, NETLINK_CB(skb).portid,
1342 					info->nlh->nlmsg_seq, NFT_MSG_NEWTABLE,
1343 					0, family, table);
1344 	if (err < 0)
1345 		goto err_fill_table_info;
1346 
1347 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
1348 
1349 err_fill_table_info:
1350 	kfree_skb(skb2);
1351 	return err;
1352 }
1353 
1354 static void nft_table_disable(struct net *net, struct nft_table *table, u32 cnt)
1355 {
1356 	struct nft_chain *chain;
1357 	u32 i = 0;
1358 
1359 	list_for_each_entry(chain, &table->chains, list) {
1360 		if (!nft_is_active_next(net, chain))
1361 			continue;
1362 		if (!nft_is_base_chain(chain))
1363 			continue;
1364 
1365 		if (cnt && i++ == cnt)
1366 			break;
1367 
1368 		nf_tables_unregister_hook(net, table, chain);
1369 	}
1370 }
1371 
1372 static int nf_tables_table_enable(struct net *net, struct nft_table *table)
1373 {
1374 	struct nft_chain *chain;
1375 	int err, i = 0;
1376 
1377 	list_for_each_entry(chain, &table->chains, list) {
1378 		if (!nft_is_active_next(net, chain))
1379 			continue;
1380 		if (!nft_is_base_chain(chain))
1381 			continue;
1382 
1383 		err = nf_tables_register_hook(net, table, chain);
1384 		if (err < 0)
1385 			goto err_register_hooks;
1386 
1387 		i++;
1388 	}
1389 	return 0;
1390 
1391 err_register_hooks:
1392 	if (i)
1393 		nft_table_disable(net, table, i);
1394 	return err;
1395 }
1396 
1397 static void nf_tables_table_disable(struct net *net, struct nft_table *table)
1398 {
1399 	table->flags &= ~NFT_TABLE_F_DORMANT;
1400 	nft_table_disable(net, table, 0);
1401 	table->flags |= NFT_TABLE_F_DORMANT;
1402 }
1403 
1404 #define __NFT_TABLE_F_INTERNAL		(NFT_TABLE_F_MASK + 1)
1405 #define __NFT_TABLE_F_WAS_DORMANT	(__NFT_TABLE_F_INTERNAL << 0)
1406 #define __NFT_TABLE_F_WAS_AWAKEN	(__NFT_TABLE_F_INTERNAL << 1)
1407 #define __NFT_TABLE_F_WAS_ORPHAN	(__NFT_TABLE_F_INTERNAL << 2)
1408 #define __NFT_TABLE_F_UPDATE		(__NFT_TABLE_F_WAS_DORMANT | \
1409 					 __NFT_TABLE_F_WAS_AWAKEN | \
1410 					 __NFT_TABLE_F_WAS_ORPHAN)
1411 
1412 static bool nft_table_pending_update(const struct nft_ctx *ctx)
1413 {
1414 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
1415 	struct nft_trans *trans;
1416 
1417 	if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
1418 		return true;
1419 
1420 	list_for_each_entry(trans, &nft_net->commit_list, list) {
1421 		if (trans->table == ctx->table &&
1422 		    ((trans->msg_type == NFT_MSG_NEWCHAIN &&
1423 		      nft_trans_chain_update(trans)) ||
1424 		     (trans->msg_type == NFT_MSG_DELCHAIN &&
1425 		      nft_is_base_chain(nft_trans_chain(trans)))))
1426 			return true;
1427 	}
1428 
1429 	return false;
1430 }
1431 
1432 static int nf_tables_updtable(struct nft_ctx *ctx)
1433 {
1434 	struct nft_trans *trans;
1435 	u32 flags;
1436 	int ret;
1437 
1438 	if (!ctx->nla[NFTA_TABLE_FLAGS])
1439 		return 0;
1440 
1441 	flags = ntohl(nla_get_be32(ctx->nla[NFTA_TABLE_FLAGS]));
1442 	if (flags & ~NFT_TABLE_F_MASK)
1443 		return -EOPNOTSUPP;
1444 
1445 	if (flags == (ctx->table->flags & NFT_TABLE_F_MASK))
1446 		return 0;
1447 
1448 	if ((nft_table_has_owner(ctx->table) &&
1449 	     !(flags & NFT_TABLE_F_OWNER)) ||
1450 	    (flags & NFT_TABLE_F_OWNER &&
1451 	     !nft_table_is_orphan(ctx->table)))
1452 		return -EOPNOTSUPP;
1453 
1454 	if ((flags ^ ctx->table->flags) & NFT_TABLE_F_PERSIST)
1455 		return -EOPNOTSUPP;
1456 
1457 	/* No dormant off/on/off/on games in single transaction */
1458 	if (nft_table_pending_update(ctx))
1459 		return -EINVAL;
1460 
1461 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
1462 				sizeof(struct nft_trans_table));
1463 	if (trans == NULL)
1464 		return -ENOMEM;
1465 
1466 	if ((flags & NFT_TABLE_F_DORMANT) &&
1467 	    !(ctx->table->flags & NFT_TABLE_F_DORMANT)) {
1468 		ctx->table->flags |= NFT_TABLE_F_DORMANT;
1469 		if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE))
1470 			ctx->table->flags |= __NFT_TABLE_F_WAS_AWAKEN;
1471 	} else if (!(flags & NFT_TABLE_F_DORMANT) &&
1472 		   ctx->table->flags & NFT_TABLE_F_DORMANT) {
1473 		ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
1474 		if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE)) {
1475 			ret = nf_tables_table_enable(ctx->net, ctx->table);
1476 			if (ret < 0)
1477 				goto err_register_hooks;
1478 
1479 			ctx->table->flags |= __NFT_TABLE_F_WAS_DORMANT;
1480 		}
1481 	}
1482 
1483 	if ((flags & NFT_TABLE_F_OWNER) &&
1484 	    !nft_table_has_owner(ctx->table)) {
1485 		ctx->table->nlpid = ctx->portid;
1486 		ctx->table->flags |= NFT_TABLE_F_OWNER |
1487 				     __NFT_TABLE_F_WAS_ORPHAN;
1488 	}
1489 
1490 	nft_trans_table_update(trans) = true;
1491 	nft_trans_commit_list_add_tail(ctx->net, trans);
1492 
1493 	return 0;
1494 
1495 err_register_hooks:
1496 	ctx->table->flags |= NFT_TABLE_F_DORMANT;
1497 	nft_trans_destroy(trans);
1498 	return ret;
1499 }
1500 
1501 static u32 nft_chain_hash(const void *data, u32 len, u32 seed)
1502 {
1503 	const char *name = data;
1504 
1505 	return jhash(name, strlen(name), seed);
1506 }
1507 
1508 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed)
1509 {
1510 	const struct nft_chain *chain = data;
1511 
1512 	return nft_chain_hash(chain->name, 0, seed);
1513 }
1514 
1515 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *arg,
1516 			      const void *ptr)
1517 {
1518 	const struct nft_chain *chain = ptr;
1519 	const char *name = arg->key;
1520 
1521 	return strcmp(chain->name, name);
1522 }
1523 
1524 static u32 nft_objname_hash(const void *data, u32 len, u32 seed)
1525 {
1526 	const struct nft_object_hash_key *k = data;
1527 
1528 	seed ^= hash_ptr(k->table, 32);
1529 
1530 	return jhash(k->name, strlen(k->name), seed);
1531 }
1532 
1533 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed)
1534 {
1535 	const struct nft_object *obj = data;
1536 
1537 	return nft_objname_hash(&obj->key, 0, seed);
1538 }
1539 
1540 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *arg,
1541 				const void *ptr)
1542 {
1543 	const struct nft_object_hash_key *k = arg->key;
1544 	const struct nft_object *obj = ptr;
1545 
1546 	if (obj->key.table != k->table)
1547 		return -1;
1548 
1549 	return strcmp(obj->key.name, k->name);
1550 }
1551 
1552 static bool nft_supported_family(u8 family)
1553 {
1554 	return false
1555 #ifdef CONFIG_NF_TABLES_INET
1556 		|| family == NFPROTO_INET
1557 #endif
1558 #ifdef CONFIG_NF_TABLES_IPV4
1559 		|| family == NFPROTO_IPV4
1560 #endif
1561 #ifdef CONFIG_NF_TABLES_ARP
1562 		|| family == NFPROTO_ARP
1563 #endif
1564 #ifdef CONFIG_NF_TABLES_NETDEV
1565 		|| family == NFPROTO_NETDEV
1566 #endif
1567 #if IS_ENABLED(CONFIG_NF_TABLES_BRIDGE)
1568 		|| family == NFPROTO_BRIDGE
1569 #endif
1570 #ifdef CONFIG_NF_TABLES_IPV6
1571 		|| family == NFPROTO_IPV6
1572 #endif
1573 		;
1574 }
1575 
1576 static int nf_tables_newtable(struct sk_buff *skb, const struct nfnl_info *info,
1577 			      const struct nlattr * const nla[])
1578 {
1579 	struct nftables_pernet *nft_net = nft_pernet(info->net);
1580 	struct netlink_ext_ack *extack = info->extack;
1581 	u8 genmask = nft_genmask_next(info->net);
1582 	u8 family = info->nfmsg->nfgen_family;
1583 	struct net *net = info->net;
1584 	const struct nlattr *attr;
1585 	struct nft_table *table;
1586 	struct nft_ctx ctx;
1587 	u32 flags = 0;
1588 	int err;
1589 
1590 	if (!nft_supported_family(family))
1591 		return -EOPNOTSUPP;
1592 
1593 	lockdep_assert_held(&nft_net->commit_mutex);
1594 	attr = nla[NFTA_TABLE_NAME];
1595 	table = nft_table_lookup(net, attr, family, genmask,
1596 				 NETLINK_CB(skb).portid);
1597 	if (IS_ERR(table)) {
1598 		if (PTR_ERR(table) != -ENOENT)
1599 			return PTR_ERR(table);
1600 	} else {
1601 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
1602 			NL_SET_BAD_ATTR(extack, attr);
1603 			return -EEXIST;
1604 		}
1605 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
1606 			return -EOPNOTSUPP;
1607 
1608 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
1609 
1610 		return nf_tables_updtable(&ctx);
1611 	}
1612 
1613 	if (nla[NFTA_TABLE_FLAGS]) {
1614 		flags = ntohl(nla_get_be32(nla[NFTA_TABLE_FLAGS]));
1615 		if (flags & ~NFT_TABLE_F_MASK)
1616 			return -EOPNOTSUPP;
1617 	}
1618 
1619 	err = -ENOMEM;
1620 	table = kzalloc_obj(*table, GFP_KERNEL_ACCOUNT);
1621 	if (table == NULL)
1622 		goto err_kzalloc;
1623 
1624 	table->validate_state = nft_net->validate_state;
1625 	table->name = nla_strdup(attr, GFP_KERNEL_ACCOUNT);
1626 	if (table->name == NULL)
1627 		goto err_strdup;
1628 
1629 	if (nla[NFTA_TABLE_USERDATA]) {
1630 		table->udata = nla_memdup(nla[NFTA_TABLE_USERDATA], GFP_KERNEL_ACCOUNT);
1631 		if (table->udata == NULL)
1632 			goto err_table_udata;
1633 
1634 		table->udlen = nla_len(nla[NFTA_TABLE_USERDATA]);
1635 	}
1636 
1637 	err = rhltable_init(&table->chains_ht, &nft_chain_ht_params);
1638 	if (err)
1639 		goto err_chain_ht;
1640 
1641 	err = rhltable_init(&table->objname_ht, &nft_objname_ht_params);
1642 	if (err < 0)
1643 		goto err_obj_ht;
1644 
1645 	INIT_LIST_HEAD(&table->chains);
1646 	INIT_LIST_HEAD(&table->sets);
1647 	INIT_LIST_HEAD(&table->objects);
1648 	INIT_LIST_HEAD(&table->flowtables);
1649 	table->family = family;
1650 	table->flags = flags;
1651 	table->handle = ++nft_net->table_handle;
1652 	if (table->flags & NFT_TABLE_F_OWNER)
1653 		table->nlpid = NETLINK_CB(skb).portid;
1654 
1655 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
1656 	err = nft_trans_table_add(&ctx, NFT_MSG_NEWTABLE);
1657 	if (err < 0)
1658 		goto err_trans;
1659 
1660 	list_add_tail_rcu(&table->list, &nft_net->tables);
1661 	return 0;
1662 err_trans:
1663 	rhltable_destroy(&table->objname_ht);
1664 err_obj_ht:
1665 	rhltable_destroy(&table->chains_ht);
1666 err_chain_ht:
1667 	kfree(table->udata);
1668 err_table_udata:
1669 	kfree(table->name);
1670 err_strdup:
1671 	kfree(table);
1672 err_kzalloc:
1673 	return err;
1674 }
1675 
1676 static int nft_flush_table(struct nft_ctx *ctx)
1677 {
1678 	struct nft_flowtable *flowtable, *nft;
1679 	struct nft_chain *chain, *nc;
1680 	struct nft_object *obj, *ne;
1681 	struct nft_set *set, *ns;
1682 	int err;
1683 
1684 	list_for_each_entry(chain, &ctx->table->chains, list) {
1685 		if (!nft_is_active_next(ctx->net, chain))
1686 			continue;
1687 
1688 		if (nft_chain_binding(chain))
1689 			continue;
1690 
1691 		ctx->chain = chain;
1692 
1693 		err = nft_delrule_by_chain(ctx);
1694 		if (err < 0)
1695 			goto out;
1696 	}
1697 
1698 	list_for_each_entry_safe(set, ns, &ctx->table->sets, list) {
1699 		if (!nft_is_active_next(ctx->net, set))
1700 			continue;
1701 
1702 		if (nft_set_is_anonymous(set))
1703 			continue;
1704 
1705 		err = nft_delset(ctx, set);
1706 		if (err < 0)
1707 			goto out;
1708 	}
1709 
1710 	list_for_each_entry_safe(flowtable, nft, &ctx->table->flowtables, list) {
1711 		if (!nft_is_active_next(ctx->net, flowtable))
1712 			continue;
1713 
1714 		err = nft_delflowtable(ctx, flowtable);
1715 		if (err < 0)
1716 			goto out;
1717 	}
1718 
1719 	list_for_each_entry_safe(obj, ne, &ctx->table->objects, list) {
1720 		if (!nft_is_active_next(ctx->net, obj))
1721 			continue;
1722 
1723 		err = nft_delobj(ctx, obj);
1724 		if (err < 0)
1725 			goto out;
1726 	}
1727 
1728 	list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
1729 		if (!nft_is_active_next(ctx->net, chain))
1730 			continue;
1731 
1732 		if (nft_chain_binding(chain))
1733 			continue;
1734 
1735 		ctx->chain = chain;
1736 
1737 		err = nft_delchain(ctx);
1738 		if (err < 0)
1739 			goto out;
1740 	}
1741 
1742 	err = nft_deltable(ctx);
1743 out:
1744 	return err;
1745 }
1746 
1747 static int nft_flush(struct nft_ctx *ctx, int family)
1748 {
1749 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
1750 	const struct nlattr * const *nla = ctx->nla;
1751 	struct nft_table *table, *nt;
1752 	int err = 0;
1753 
1754 	list_for_each_entry_safe(table, nt, &nft_net->tables, list) {
1755 		if (family != AF_UNSPEC && table->family != family)
1756 			continue;
1757 
1758 		ctx->family = table->family;
1759 
1760 		if (!nft_is_active_next(ctx->net, table))
1761 			continue;
1762 
1763 		if (nft_table_has_owner(table) && table->nlpid != ctx->portid)
1764 			continue;
1765 
1766 		if (nla[NFTA_TABLE_NAME] &&
1767 		    nla_strcmp(nla[NFTA_TABLE_NAME], table->name) != 0)
1768 			continue;
1769 
1770 		ctx->table = table;
1771 
1772 		err = nft_flush_table(ctx);
1773 		if (err < 0)
1774 			goto out;
1775 	}
1776 out:
1777 	return err;
1778 }
1779 
1780 static int nf_tables_deltable(struct sk_buff *skb, const struct nfnl_info *info,
1781 			      const struct nlattr * const nla[])
1782 {
1783 	struct netlink_ext_ack *extack = info->extack;
1784 	u8 genmask = nft_genmask_next(info->net);
1785 	u8 family = info->nfmsg->nfgen_family;
1786 	struct net *net = info->net;
1787 	const struct nlattr *attr;
1788 	struct nft_table *table;
1789 	struct nft_ctx ctx;
1790 
1791 	nft_ctx_init(&ctx, net, skb, info->nlh, 0, NULL, NULL, nla);
1792 	if (family == AF_UNSPEC ||
1793 	    (!nla[NFTA_TABLE_NAME] && !nla[NFTA_TABLE_HANDLE]))
1794 		return nft_flush(&ctx, family);
1795 
1796 	if (nla[NFTA_TABLE_HANDLE]) {
1797 		attr = nla[NFTA_TABLE_HANDLE];
1798 		table = nft_table_lookup_byhandle(net, attr, family, genmask,
1799 						  NETLINK_CB(skb).portid);
1800 	} else {
1801 		attr = nla[NFTA_TABLE_NAME];
1802 		table = nft_table_lookup(net, attr, family, genmask,
1803 					 NETLINK_CB(skb).portid);
1804 	}
1805 
1806 	if (IS_ERR(table)) {
1807 		if (PTR_ERR(table) == -ENOENT &&
1808 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYTABLE)
1809 			return 0;
1810 
1811 		NL_SET_BAD_ATTR(extack, attr);
1812 		return PTR_ERR(table);
1813 	}
1814 
1815 	if (info->nlh->nlmsg_flags & NLM_F_NONREC &&
1816 	    table->use > 0)
1817 		return -EBUSY;
1818 
1819 	ctx.family = family;
1820 	ctx.table = table;
1821 
1822 	return nft_flush_table(&ctx);
1823 }
1824 
1825 static void nf_tables_table_destroy(struct nft_table *table)
1826 {
1827 	if (WARN_ON(table->use > 0))
1828 		return;
1829 
1830 	rhltable_destroy(&table->chains_ht);
1831 	rhltable_destroy(&table->objname_ht);
1832 	kfree(table->name);
1833 	kfree(table->udata);
1834 	kfree(table);
1835 }
1836 
1837 void nft_register_chain_type(const struct nft_chain_type *ctype)
1838 {
1839 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1840 	if (WARN_ON(__nft_chain_type_get(ctype->family, ctype->type))) {
1841 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1842 		return;
1843 	}
1844 	chain_type[ctype->family][ctype->type] = ctype;
1845 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1846 }
1847 EXPORT_SYMBOL_GPL(nft_register_chain_type);
1848 
1849 void nft_unregister_chain_type(const struct nft_chain_type *ctype)
1850 {
1851 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1852 	chain_type[ctype->family][ctype->type] = NULL;
1853 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1854 }
1855 EXPORT_SYMBOL_GPL(nft_unregister_chain_type);
1856 
1857 /*
1858  * Chains
1859  */
1860 
1861 static struct nft_chain *
1862 nft_chain_lookup_byhandle(const struct nft_table *table, u64 handle, u8 genmask)
1863 {
1864 	struct nft_chain *chain;
1865 
1866 	list_for_each_entry(chain, &table->chains, list) {
1867 		if (chain->handle == handle &&
1868 		    nft_active_genmask(chain, genmask))
1869 			return chain;
1870 	}
1871 
1872 	return ERR_PTR(-ENOENT);
1873 }
1874 
1875 static bool lockdep_commit_lock_is_held(const struct net *net)
1876 {
1877 #ifdef CONFIG_PROVE_LOCKING
1878 	struct nftables_pernet *nft_net = nft_pernet(net);
1879 
1880 	return lockdep_is_held(&nft_net->commit_mutex);
1881 #else
1882 	return true;
1883 #endif
1884 }
1885 
1886 static struct nft_chain *nft_chain_lookup(struct net *net,
1887 					  struct nft_table *table,
1888 					  const struct nlattr *nla, u8 genmask)
1889 {
1890 	char search[NFT_CHAIN_MAXNAMELEN + 1];
1891 	struct rhlist_head *tmp, *list;
1892 	struct nft_chain *chain;
1893 
1894 	if (nla == NULL)
1895 		return ERR_PTR(-EINVAL);
1896 
1897 	nla_strscpy(search, nla, sizeof(search));
1898 
1899 	WARN_ON(!rcu_read_lock_held() &&
1900 		!lockdep_commit_lock_is_held(net));
1901 
1902 	chain = ERR_PTR(-ENOENT);
1903 	rcu_read_lock();
1904 	list = rhltable_lookup(&table->chains_ht, search, nft_chain_ht_params);
1905 	if (!list)
1906 		goto out_unlock;
1907 
1908 	rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
1909 		if (nft_active_genmask(chain, genmask))
1910 			goto out_unlock;
1911 	}
1912 	chain = ERR_PTR(-ENOENT);
1913 out_unlock:
1914 	rcu_read_unlock();
1915 	return chain;
1916 }
1917 
1918 static const struct nla_policy nft_chain_policy[NFTA_CHAIN_MAX + 1] = {
1919 	[NFTA_CHAIN_TABLE]	= { .type = NLA_STRING,
1920 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
1921 	[NFTA_CHAIN_HANDLE]	= { .type = NLA_U64 },
1922 	[NFTA_CHAIN_NAME]	= { .type = NLA_STRING,
1923 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
1924 	[NFTA_CHAIN_HOOK]	= { .type = NLA_NESTED },
1925 	[NFTA_CHAIN_POLICY]	= { .type = NLA_U32 },
1926 	[NFTA_CHAIN_TYPE]	= { .type = NLA_STRING,
1927 				    .len = NFT_MODULE_AUTOLOAD_LIMIT },
1928 	[NFTA_CHAIN_COUNTERS]	= { .type = NLA_NESTED },
1929 	[NFTA_CHAIN_FLAGS]	= NLA_POLICY_MASK(NLA_BE32, NFT_CHAIN_FLAGS),
1930 	[NFTA_CHAIN_ID]		= { .type = NLA_U32 },
1931 	[NFTA_CHAIN_USERDATA]	= { .type = NLA_BINARY,
1932 				    .len = NFT_USERDATA_MAXLEN },
1933 };
1934 
1935 static const struct nla_policy nft_hook_policy[NFTA_HOOK_MAX + 1] = {
1936 	[NFTA_HOOK_HOOKNUM]	= { .type = NLA_U32 },
1937 	[NFTA_HOOK_PRIORITY]	= { .type = NLA_U32 },
1938 	[NFTA_HOOK_DEV]		= { .type = NLA_STRING,
1939 				    .len = IFNAMSIZ - 1 },
1940 };
1941 
1942 static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats)
1943 {
1944 	struct nft_stats *cpu_stats, total;
1945 	struct nlattr *nest;
1946 	unsigned int seq;
1947 	u64 pkts, bytes;
1948 	int cpu;
1949 
1950 	if (!stats)
1951 		return 0;
1952 
1953 	memset(&total, 0, sizeof(total));
1954 	for_each_possible_cpu(cpu) {
1955 		cpu_stats = per_cpu_ptr(stats, cpu);
1956 		do {
1957 			seq = u64_stats_fetch_begin(&cpu_stats->syncp);
1958 			pkts = cpu_stats->pkts;
1959 			bytes = cpu_stats->bytes;
1960 		} while (u64_stats_fetch_retry(&cpu_stats->syncp, seq));
1961 		total.pkts += pkts;
1962 		total.bytes += bytes;
1963 	}
1964 	nest = nla_nest_start_noflag(skb, NFTA_CHAIN_COUNTERS);
1965 	if (nest == NULL)
1966 		goto nla_put_failure;
1967 
1968 	if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts),
1969 			 NFTA_COUNTER_PAD) ||
1970 	    nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes),
1971 			 NFTA_COUNTER_PAD))
1972 		goto nla_put_failure;
1973 
1974 	nla_nest_end(skb, nest);
1975 	return 0;
1976 
1977 nla_put_failure:
1978 	return -ENOSPC;
1979 }
1980 
1981 static bool hook_is_prefix(struct nft_hook *hook)
1982 {
1983 	return strlen(hook->ifname) >= hook->ifnamelen;
1984 }
1985 
1986 static int nft_nla_put_hook_dev(struct sk_buff *skb, struct nft_hook *hook)
1987 {
1988 	int attr = hook_is_prefix(hook) ? NFTA_DEVICE_PREFIX : NFTA_DEVICE_NAME;
1989 
1990 	return nla_put_string(skb, attr, hook->ifname);
1991 }
1992 
1993 struct nft_hook_dump_ctx {
1994 	struct nft_hook *first;
1995 	int n;
1996 };
1997 
1998 static int nft_dump_basechain_hook_one(struct sk_buff *skb,
1999 				       struct nft_hook *hook,
2000 				       struct nft_hook_dump_ctx *dump_ctx)
2001 {
2002 	if (!dump_ctx->first)
2003 		dump_ctx->first = hook;
2004 
2005 	if (nft_nla_put_hook_dev(skb, hook))
2006 		return -1;
2007 
2008 	dump_ctx->n++;
2009 
2010 	return 0;
2011 }
2012 
2013 static int nft_dump_basechain_hook_list(struct sk_buff *skb,
2014 					const struct net *net,
2015 					const struct list_head *hook_list,
2016 					struct nft_hook_dump_ctx *dump_ctx)
2017 {
2018 	struct nft_hook *hook;
2019 	int err;
2020 
2021 	list_for_each_entry_rcu(hook, hook_list, list,
2022 				lockdep_commit_lock_is_held(net)) {
2023 		err = nft_dump_basechain_hook_one(skb, hook, dump_ctx);
2024 		if (err < 0)
2025 			return err;
2026 	}
2027 
2028 	return 0;
2029 }
2030 
2031 static int nft_dump_basechain_trans_hook_list(struct sk_buff *skb,
2032 					      const struct list_head *trans_hook_list,
2033 					      struct nft_hook_dump_ctx *dump_ctx)
2034 {
2035 	struct nft_trans_hook *trans_hook;
2036 	int err;
2037 
2038 	list_for_each_entry(trans_hook, trans_hook_list, list) {
2039 		err = nft_dump_basechain_hook_one(skb, trans_hook->hook, dump_ctx);
2040 		if (err < 0)
2041 			return err;
2042 	}
2043 
2044 	return 0;
2045 }
2046 
2047 static int nft_dump_basechain_hook(struct sk_buff *skb,
2048 				   const struct net *net, int family,
2049 				   const struct nft_base_chain *basechain,
2050 				   const struct list_head *hook_list,
2051 				   const struct list_head *trans_hook_list)
2052 {
2053 	const struct nf_hook_ops *ops = &basechain->ops;
2054 	struct nft_hook_dump_ctx dump_hook_ctx = {};
2055 	struct nlattr *nest, *nest_devs;
2056 
2057 	nest = nla_nest_start_noflag(skb, NFTA_CHAIN_HOOK);
2058 	if (nest == NULL)
2059 		goto nla_put_failure;
2060 	if (nla_put_be32(skb, NFTA_HOOK_HOOKNUM, htonl(ops->hooknum)))
2061 		goto nla_put_failure;
2062 	if (nla_put_be32(skb, NFTA_HOOK_PRIORITY, htonl(ops->priority)))
2063 		goto nla_put_failure;
2064 
2065 	if (nft_base_chain_netdev(family, ops->hooknum)) {
2066 		nest_devs = nla_nest_start_noflag(skb, NFTA_HOOK_DEVS);
2067 		if (!nest_devs)
2068 			goto nla_put_failure;
2069 
2070 		if (!hook_list && !trans_hook_list)
2071 			hook_list = &basechain->hook_list;
2072 
2073 		if (hook_list &&
2074 		    nft_dump_basechain_hook_list(skb, net, hook_list, &dump_hook_ctx)) {
2075 			goto nla_put_failure;
2076 		} else if (trans_hook_list &&
2077 			   nft_dump_basechain_trans_hook_list(skb, trans_hook_list,
2078 							      &dump_hook_ctx)) {
2079 			goto nla_put_failure;
2080 		}
2081 
2082 		nla_nest_end(skb, nest_devs);
2083 
2084 		if (dump_hook_ctx.n == 1 &&
2085 		    !hook_is_prefix(dump_hook_ctx.first) &&
2086 		    nla_put_string(skb, NFTA_HOOK_DEV, dump_hook_ctx.first->ifname))
2087 			goto nla_put_failure;
2088 	}
2089 	nla_nest_end(skb, nest);
2090 
2091 	return 0;
2092 nla_put_failure:
2093 	return -1;
2094 }
2095 
2096 static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net,
2097 				     u32 portid, u32 seq, int event, u32 flags,
2098 				     int family, const struct nft_table *table,
2099 				     const struct nft_chain *chain,
2100 				     const struct list_head *hook_list,
2101 				     const struct list_head *trans_hook_list)
2102 {
2103 	struct nlmsghdr *nlh;
2104 
2105 	nlh = nfnl_msg_put(skb, portid, seq,
2106 			   nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event),
2107 			   flags, family, NFNETLINK_V0, nft_base_seq_be16(net));
2108 	if (!nlh)
2109 		goto nla_put_failure;
2110 
2111 	if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name) ||
2112 	    nla_put_string(skb, NFTA_CHAIN_NAME, chain->name) ||
2113 	    nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle),
2114 			 NFTA_CHAIN_PAD))
2115 		goto nla_put_failure;
2116 
2117 	if (!hook_list && !trans_hook_list &&
2118 	    (event == NFT_MSG_DELCHAIN ||
2119 	     event == NFT_MSG_DESTROYCHAIN)) {
2120 		nlmsg_end(skb, nlh);
2121 		return 0;
2122 	}
2123 
2124 	if (nft_is_base_chain(chain)) {
2125 		const struct nft_base_chain *basechain = nft_base_chain(chain);
2126 		struct nft_stats __percpu *stats;
2127 
2128 		if (nft_dump_basechain_hook(skb, net, family, basechain,
2129 					    hook_list, trans_hook_list))
2130 			goto nla_put_failure;
2131 
2132 		if (nla_put_be32(skb, NFTA_CHAIN_POLICY,
2133 				 htonl(basechain->policy)))
2134 			goto nla_put_failure;
2135 
2136 		if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name))
2137 			goto nla_put_failure;
2138 
2139 		stats = rcu_dereference_check(basechain->stats,
2140 					      lockdep_commit_lock_is_held(net));
2141 		if (nft_dump_stats(skb, stats))
2142 			goto nla_put_failure;
2143 	}
2144 
2145 	if (chain->flags &&
2146 	    nla_put_be32(skb, NFTA_CHAIN_FLAGS, htonl(chain->flags)))
2147 		goto nla_put_failure;
2148 
2149 	if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use)))
2150 		goto nla_put_failure;
2151 
2152 	if (chain->udata &&
2153 	    nla_put(skb, NFTA_CHAIN_USERDATA, chain->udlen, chain->udata))
2154 		goto nla_put_failure;
2155 
2156 	nlmsg_end(skb, nlh);
2157 	return 0;
2158 
2159 nla_put_failure:
2160 	nlmsg_trim(skb, nlh);
2161 	return -1;
2162 }
2163 
2164 static void nf_tables_chain_notify(const struct nft_ctx *ctx, int event,
2165 				   const struct list_head *hook_list,
2166 				   const struct list_head *trans_hook_list)
2167 {
2168 	struct nftables_pernet *nft_net;
2169 	struct sk_buff *skb;
2170 	u16 flags = 0;
2171 	int err;
2172 
2173 	if (!ctx->report &&
2174 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
2175 		return;
2176 
2177 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
2178 	if (skb == NULL)
2179 		goto err;
2180 
2181 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
2182 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
2183 
2184 	err = nf_tables_fill_chain_info(skb, ctx->net, ctx->portid, ctx->seq,
2185 					event, flags, ctx->family, ctx->table,
2186 					ctx->chain, hook_list, trans_hook_list);
2187 	if (err < 0) {
2188 		kfree_skb(skb);
2189 		goto err;
2190 	}
2191 
2192 	nft_net = nft_pernet(ctx->net);
2193 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
2194 	return;
2195 err:
2196 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
2197 }
2198 
2199 static int nf_tables_dump_chains(struct sk_buff *skb,
2200 				 struct netlink_callback *cb)
2201 {
2202 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
2203 	unsigned int idx = 0, s_idx = cb->args[0];
2204 	struct net *net = sock_net(skb->sk);
2205 	int family = nfmsg->nfgen_family;
2206 	struct nftables_pernet *nft_net;
2207 	const struct nft_table *table;
2208 	const struct nft_chain *chain;
2209 
2210 	rcu_read_lock();
2211 	nft_net = nft_pernet(net);
2212 	cb->seq = nft_base_seq(net);
2213 
2214 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
2215 		if (family != NFPROTO_UNSPEC && family != table->family)
2216 			continue;
2217 
2218 		list_for_each_entry_rcu(chain, &table->chains, list) {
2219 			if (idx < s_idx)
2220 				goto cont;
2221 			if (idx > s_idx)
2222 				memset(&cb->args[1], 0,
2223 				       sizeof(cb->args) - sizeof(cb->args[0]));
2224 			if (!nft_is_active(net, chain))
2225 				continue;
2226 			if (nf_tables_fill_chain_info(skb, net,
2227 						      NETLINK_CB(cb->skb).portid,
2228 						      cb->nlh->nlmsg_seq,
2229 						      NFT_MSG_NEWCHAIN,
2230 						      NLM_F_MULTI,
2231 						      table->family, table,
2232 						      chain, NULL, NULL) < 0)
2233 				goto done;
2234 
2235 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2236 cont:
2237 			idx++;
2238 		}
2239 	}
2240 done:
2241 	rcu_read_unlock();
2242 	cb->args[0] = idx;
2243 	return skb->len;
2244 }
2245 
2246 /* called with rcu_read_lock held */
2247 static int nf_tables_getchain(struct sk_buff *skb, const struct nfnl_info *info,
2248 			      const struct nlattr * const nla[])
2249 {
2250 	struct netlink_ext_ack *extack = info->extack;
2251 	u8 genmask = nft_genmask_cur(info->net);
2252 	u8 family = info->nfmsg->nfgen_family;
2253 	const struct nft_chain *chain;
2254 	struct net *net = info->net;
2255 	struct nft_table *table;
2256 	struct sk_buff *skb2;
2257 	int err;
2258 
2259 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
2260 		struct netlink_dump_control c = {
2261 			.dump = nf_tables_dump_chains,
2262 			.module = THIS_MODULE,
2263 		};
2264 
2265 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
2266 	}
2267 
2268 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask, 0);
2269 	if (IS_ERR(table)) {
2270 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
2271 		return PTR_ERR(table);
2272 	}
2273 
2274 	chain = nft_chain_lookup(net, table, nla[NFTA_CHAIN_NAME], genmask);
2275 	if (IS_ERR(chain)) {
2276 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2277 		return PTR_ERR(chain);
2278 	}
2279 
2280 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
2281 	if (!skb2)
2282 		return -ENOMEM;
2283 
2284 	err = nf_tables_fill_chain_info(skb2, net, NETLINK_CB(skb).portid,
2285 					info->nlh->nlmsg_seq, NFT_MSG_NEWCHAIN,
2286 					0, family, table, chain, NULL, NULL);
2287 	if (err < 0)
2288 		goto err_fill_chain_info;
2289 
2290 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
2291 
2292 err_fill_chain_info:
2293 	kfree_skb(skb2);
2294 	return err;
2295 }
2296 
2297 static const struct nla_policy nft_counter_policy[NFTA_COUNTER_MAX + 1] = {
2298 	[NFTA_COUNTER_PACKETS]	= { .type = NLA_U64 },
2299 	[NFTA_COUNTER_BYTES]	= { .type = NLA_U64 },
2300 };
2301 
2302 static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
2303 {
2304 	struct nlattr *tb[NFTA_COUNTER_MAX+1];
2305 	struct nft_stats __percpu *newstats;
2306 	struct nft_stats *stats;
2307 	int err;
2308 
2309 	err = nla_parse_nested_deprecated(tb, NFTA_COUNTER_MAX, attr,
2310 					  nft_counter_policy, NULL);
2311 	if (err < 0)
2312 		return ERR_PTR_PCPU(err);
2313 
2314 	if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS])
2315 		return ERR_PTR_PCPU(-EINVAL);
2316 
2317 	newstats = netdev_alloc_pcpu_stats(struct nft_stats);
2318 	if (newstats == NULL)
2319 		return ERR_PTR_PCPU(-ENOMEM);
2320 
2321 	/* Restore old counters on this cpu, no problem. Per-cpu statistics
2322 	 * are not exposed to userspace.
2323 	 */
2324 	preempt_disable();
2325 	stats = this_cpu_ptr(newstats);
2326 	stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES]));
2327 	stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS]));
2328 	preempt_enable();
2329 
2330 	return newstats;
2331 }
2332 
2333 static void nft_chain_stats_replace(struct nft_trans_chain *trans)
2334 {
2335 	const struct nft_trans *t = &trans->nft_trans_binding.nft_trans;
2336 	struct nft_base_chain *chain = nft_base_chain(trans->chain);
2337 
2338 	if (!trans->stats)
2339 		return;
2340 
2341 	trans->stats =
2342 		rcu_replace_pointer(chain->stats, trans->stats,
2343 				    lockdep_commit_lock_is_held(t->net));
2344 
2345 	if (!trans->stats)
2346 		static_branch_inc(&nft_counters_enabled);
2347 }
2348 
2349 static void nf_tables_chain_free_chain_rules(struct nft_chain *chain)
2350 {
2351 	struct nft_rule_blob *g0 = rcu_dereference_raw(chain->blob_gen_0);
2352 	struct nft_rule_blob *g1 = rcu_dereference_raw(chain->blob_gen_1);
2353 
2354 	if (g0 != g1)
2355 		kvfree(g1);
2356 	kvfree(g0);
2357 
2358 	/* should be NULL either via abort or via successful commit */
2359 	WARN_ON_ONCE(chain->blob_next);
2360 	kvfree(chain->blob_next);
2361 }
2362 
2363 void nf_tables_chain_destroy(struct nft_chain *chain)
2364 {
2365 	const struct nft_table *table = chain->table;
2366 	struct nft_hook *hook, *next;
2367 
2368 	if (WARN_ON(chain->use > 0))
2369 		return;
2370 
2371 	/* no concurrent access possible anymore */
2372 	nf_tables_chain_free_chain_rules(chain);
2373 
2374 	if (nft_is_base_chain(chain)) {
2375 		struct nft_base_chain *basechain = nft_base_chain(chain);
2376 
2377 		if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) {
2378 			list_for_each_entry_safe(hook, next,
2379 						 &basechain->hook_list, list)
2380 				nft_netdev_hook_unlink_free_rcu(hook);
2381 		}
2382 		module_put(basechain->type->owner);
2383 		if (rcu_access_pointer(basechain->stats)) {
2384 			static_branch_dec(&nft_counters_enabled);
2385 			free_percpu(rcu_dereference_raw(basechain->stats));
2386 		}
2387 		kfree(chain->name);
2388 		kfree(chain->udata);
2389 		kfree(basechain);
2390 	} else {
2391 		kfree(chain->name);
2392 		kfree(chain->udata);
2393 		kfree(chain);
2394 	}
2395 }
2396 
2397 static struct nft_hook *nft_netdev_hook_alloc(struct net *net,
2398 					      const struct nlattr *attr,
2399 					      bool prefix)
2400 {
2401 	struct nf_hook_ops *ops;
2402 	struct net_device *dev;
2403 	struct nft_hook *hook;
2404 	int err;
2405 
2406 	hook = kzalloc_obj(struct nft_hook, GFP_KERNEL_ACCOUNT);
2407 	if (!hook)
2408 		return ERR_PTR(-ENOMEM);
2409 
2410 	INIT_LIST_HEAD(&hook->ops_list);
2411 
2412 	err = nla_strscpy(hook->ifname, attr, IFNAMSIZ);
2413 	if (err < 0)
2414 		goto err_hook_free;
2415 
2416 	/* include the terminating NUL-char when comparing non-prefixes */
2417 	hook->ifnamelen = strlen(hook->ifname) + !prefix;
2418 
2419 	/* nf_tables_netdev_event() is called under rtnl_mutex, this is
2420 	 * indirectly serializing all the other holders of the commit_mutex with
2421 	 * the rtnl_mutex.
2422 	 */
2423 	for_each_netdev(net, dev) {
2424 		if (strncmp(dev->name, hook->ifname, hook->ifnamelen))
2425 			continue;
2426 
2427 		ops = kzalloc_obj(struct nf_hook_ops, GFP_KERNEL_ACCOUNT);
2428 		if (!ops) {
2429 			err = -ENOMEM;
2430 			goto err_hook_free;
2431 		}
2432 		ops->dev = dev;
2433 		list_add_tail(&ops->list, &hook->ops_list);
2434 	}
2435 	return hook;
2436 
2437 err_hook_free:
2438 	nft_netdev_hook_free(hook);
2439 	return ERR_PTR(err);
2440 }
2441 
2442 static struct nft_hook *nft_hook_list_find(struct list_head *hook_list,
2443 					   const struct nft_hook *this)
2444 {
2445 	struct nft_hook *hook;
2446 
2447 	list_for_each_entry(hook, hook_list, list) {
2448 		if (!strncmp(hook->ifname, this->ifname,
2449 			     min(hook->ifnamelen, this->ifnamelen))) {
2450 			if (hook->flags & NFT_HOOK_REMOVE)
2451 				continue;
2452 
2453 			return hook;
2454 		}
2455 	}
2456 
2457 	return NULL;
2458 }
2459 
2460 static int nf_tables_parse_netdev_hooks(struct net *net,
2461 					const struct nlattr *attr,
2462 					struct list_head *hook_list,
2463 					struct netlink_ext_ack *extack)
2464 {
2465 	struct nft_hook *hook, *next;
2466 	const struct nlattr *tmp;
2467 	int rem, n = 0, err;
2468 	bool prefix;
2469 
2470 	nla_for_each_nested(tmp, attr, rem) {
2471 		switch (nla_type(tmp)) {
2472 		case NFTA_DEVICE_NAME:
2473 			prefix = false;
2474 			break;
2475 		case NFTA_DEVICE_PREFIX:
2476 			prefix = true;
2477 			break;
2478 		default:
2479 			err = -EINVAL;
2480 			goto err_hook;
2481 		}
2482 
2483 		hook = nft_netdev_hook_alloc(net, tmp, prefix);
2484 		if (IS_ERR(hook)) {
2485 			NL_SET_BAD_ATTR(extack, tmp);
2486 			err = PTR_ERR(hook);
2487 			goto err_hook;
2488 		}
2489 		if (nft_hook_list_find(hook_list, hook)) {
2490 			NL_SET_BAD_ATTR(extack, tmp);
2491 			nft_netdev_hook_free(hook);
2492 			err = -EEXIST;
2493 			goto err_hook;
2494 		}
2495 		list_add_tail(&hook->list, hook_list);
2496 		n++;
2497 
2498 		if (n == NFT_NETDEVICE_MAX) {
2499 			err = -EFBIG;
2500 			goto err_hook;
2501 		}
2502 	}
2503 
2504 	return 0;
2505 
2506 err_hook:
2507 	list_for_each_entry_safe(hook, next, hook_list, list) {
2508 		list_del(&hook->list);
2509 		nft_netdev_hook_free(hook);
2510 	}
2511 	return err;
2512 }
2513 
2514 struct nft_chain_hook {
2515 	u32				num;
2516 	s32				priority;
2517 	const struct nft_chain_type	*type;
2518 	struct list_head		list;
2519 };
2520 
2521 static int nft_chain_parse_netdev(struct net *net, struct nlattr *tb[],
2522 				  struct list_head *hook_list,
2523 				  struct netlink_ext_ack *extack, u32 flags)
2524 {
2525 	struct nft_hook *hook;
2526 	int err;
2527 
2528 	if (tb[NFTA_HOOK_DEV]) {
2529 		hook = nft_netdev_hook_alloc(net, tb[NFTA_HOOK_DEV], false);
2530 		if (IS_ERR(hook)) {
2531 			NL_SET_BAD_ATTR(extack, tb[NFTA_HOOK_DEV]);
2532 			return PTR_ERR(hook);
2533 		}
2534 
2535 		list_add_tail(&hook->list, hook_list);
2536 	} else if (tb[NFTA_HOOK_DEVS]) {
2537 		err = nf_tables_parse_netdev_hooks(net, tb[NFTA_HOOK_DEVS],
2538 						   hook_list, extack);
2539 		if (err < 0)
2540 			return err;
2541 
2542 	}
2543 
2544 	if (flags & NFT_CHAIN_HW_OFFLOAD &&
2545 	    list_empty(hook_list))
2546 		return -EINVAL;
2547 
2548 	return 0;
2549 }
2550 
2551 static int nft_chain_parse_hook(struct net *net,
2552 				struct nft_base_chain *basechain,
2553 				const struct nlattr * const nla[],
2554 				struct nft_chain_hook *hook, u8 family,
2555 				u32 flags, struct netlink_ext_ack *extack)
2556 {
2557 	struct nftables_pernet *nft_net = nft_pernet(net);
2558 	struct nlattr *ha[NFTA_HOOK_MAX + 1];
2559 	const struct nft_chain_type *type;
2560 	int err;
2561 
2562 	lockdep_assert_held(&nft_net->commit_mutex);
2563 	lockdep_nfnl_nft_mutex_not_held();
2564 
2565 	err = nla_parse_nested_deprecated(ha, NFTA_HOOK_MAX,
2566 					  nla[NFTA_CHAIN_HOOK],
2567 					  nft_hook_policy, NULL);
2568 	if (err < 0)
2569 		return err;
2570 
2571 	if (!basechain) {
2572 		if (!ha[NFTA_HOOK_HOOKNUM] ||
2573 		    !ha[NFTA_HOOK_PRIORITY]) {
2574 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2575 			return -ENOENT;
2576 		}
2577 
2578 		hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
2579 		hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
2580 
2581 		type = __nft_chain_type_get(family, NFT_CHAIN_T_DEFAULT);
2582 		if (!type)
2583 			return -EOPNOTSUPP;
2584 
2585 		if (nla[NFTA_CHAIN_TYPE]) {
2586 			type = nf_tables_chain_type_lookup(net, nla[NFTA_CHAIN_TYPE],
2587 							   family, true);
2588 			if (IS_ERR(type)) {
2589 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2590 				return PTR_ERR(type);
2591 			}
2592 		}
2593 		if (hook->num >= NFT_MAX_HOOKS || !(type->hook_mask & (1 << hook->num)))
2594 			return -EOPNOTSUPP;
2595 
2596 		if (type->type == NFT_CHAIN_T_NAT &&
2597 		    hook->priority <= NF_IP_PRI_CONNTRACK)
2598 			return -EOPNOTSUPP;
2599 	} else {
2600 		if (ha[NFTA_HOOK_HOOKNUM]) {
2601 			hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
2602 			if (hook->num != basechain->ops.hooknum)
2603 				return -EOPNOTSUPP;
2604 		}
2605 		if (ha[NFTA_HOOK_PRIORITY]) {
2606 			hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
2607 			if (hook->priority != basechain->ops.priority)
2608 				return -EOPNOTSUPP;
2609 		}
2610 
2611 		if (nla[NFTA_CHAIN_TYPE]) {
2612 			type = __nf_tables_chain_type_lookup(nla[NFTA_CHAIN_TYPE],
2613 							     family);
2614 			if (!type) {
2615 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2616 				return -ENOENT;
2617 			}
2618 		} else {
2619 			type = basechain->type;
2620 		}
2621 	}
2622 
2623 	if (!try_module_get(type->owner)) {
2624 		if (nla[NFTA_CHAIN_TYPE])
2625 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2626 		return -ENOENT;
2627 	}
2628 
2629 	hook->type = type;
2630 
2631 	INIT_LIST_HEAD(&hook->list);
2632 	if (nft_base_chain_netdev(family, hook->num)) {
2633 		err = nft_chain_parse_netdev(net, ha, &hook->list, extack, flags);
2634 		if (err < 0) {
2635 			module_put(type->owner);
2636 			return err;
2637 		}
2638 	} else if (ha[NFTA_HOOK_DEV] || ha[NFTA_HOOK_DEVS]) {
2639 		module_put(type->owner);
2640 		return -EOPNOTSUPP;
2641 	}
2642 
2643 	return 0;
2644 }
2645 
2646 static void nft_chain_release_hook(struct nft_chain_hook *hook)
2647 {
2648 	struct nft_hook *h, *next;
2649 
2650 	list_for_each_entry_safe(h, next, &hook->list, list) {
2651 		list_del(&h->list);
2652 		nft_netdev_hook_free(h);
2653 	}
2654 	module_put(hook->type->owner);
2655 }
2656 
2657 static void nft_last_rule(const struct nft_chain *chain, const void *ptr)
2658 {
2659 	struct nft_rule_dp_last *lrule;
2660 
2661 	BUILD_BUG_ON(offsetof(struct nft_rule_dp_last, end) != 0);
2662 
2663 	lrule = (struct nft_rule_dp_last *)ptr;
2664 	lrule->end.is_last = 1;
2665 	lrule->chain = chain;
2666 	/* blob size does not include the trailer rule */
2667 }
2668 
2669 static struct nft_rule_blob *nf_tables_chain_alloc_rules(const struct nft_chain *chain,
2670 							 unsigned int size)
2671 {
2672 	struct nft_rule_blob *blob;
2673 
2674 	if (size > INT_MAX)
2675 		return NULL;
2676 
2677 	size += sizeof(struct nft_rule_blob) + sizeof(struct nft_rule_dp_last);
2678 
2679 	blob = kvmalloc(size, GFP_KERNEL_ACCOUNT);
2680 	if (!blob)
2681 		return NULL;
2682 
2683 	blob->size = 0;
2684 	nft_last_rule(chain, blob->data);
2685 
2686 	return blob;
2687 }
2688 
2689 static void nft_basechain_hook_init(struct nf_hook_ops *ops, u8 family,
2690 				    const struct nft_chain_hook *hook,
2691 				    struct nft_chain *chain)
2692 {
2693 	ops->pf			= family;
2694 	ops->hooknum		= hook->num;
2695 	ops->priority		= hook->priority;
2696 	ops->priv		= chain;
2697 	ops->hook		= hook->type->hooks[ops->hooknum];
2698 	ops->hook_ops_type	= NF_HOOK_OP_NF_TABLES;
2699 }
2700 
2701 static int nft_basechain_init(struct nft_base_chain *basechain, u8 family,
2702 			      struct nft_chain_hook *hook, u32 flags)
2703 {
2704 	struct nft_chain *chain;
2705 	struct nf_hook_ops *ops;
2706 	struct nft_hook *h;
2707 
2708 	basechain->type = hook->type;
2709 	INIT_LIST_HEAD(&basechain->hook_list);
2710 	chain = &basechain->chain;
2711 
2712 	if (nft_base_chain_netdev(family, hook->num)) {
2713 		list_splice_init(&hook->list, &basechain->hook_list);
2714 		list_for_each_entry(h, &basechain->hook_list, list) {
2715 			list_for_each_entry(ops, &h->ops_list, list)
2716 				nft_basechain_hook_init(ops, family, hook, chain);
2717 		}
2718 	}
2719 	nft_basechain_hook_init(&basechain->ops, family, hook, chain);
2720 
2721 	chain->flags |= NFT_CHAIN_BASE | flags;
2722 	basechain->policy = NF_ACCEPT;
2723 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD &&
2724 	    !nft_chain_offload_support(basechain)) {
2725 		list_splice_init(&basechain->hook_list, &hook->list);
2726 		return -EOPNOTSUPP;
2727 	}
2728 
2729 	flow_block_init(&basechain->flow_block);
2730 
2731 	return 0;
2732 }
2733 
2734 int nft_chain_add(struct nft_table *table, struct nft_chain *chain)
2735 {
2736 	int err;
2737 
2738 	err = rhltable_insert_key(&table->chains_ht, chain->name,
2739 				  &chain->rhlhead, nft_chain_ht_params);
2740 	if (err)
2741 		return err;
2742 
2743 	list_add_tail_rcu(&chain->list, &table->chains);
2744 
2745 	return 0;
2746 }
2747 
2748 static u64 chain_id;
2749 
2750 static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 policy,
2751 			      u32 flags, struct netlink_ext_ack *extack)
2752 {
2753 	const struct nlattr * const *nla = ctx->nla;
2754 	struct nft_table *table = ctx->table;
2755 	struct nft_base_chain *basechain;
2756 	struct net *net = ctx->net;
2757 	char name[NFT_NAME_MAXLEN];
2758 	struct nft_rule_blob *blob;
2759 	struct nft_trans *trans;
2760 	struct nft_chain *chain;
2761 	int err;
2762 
2763 	if (nla[NFTA_CHAIN_HOOK]) {
2764 		struct nft_stats __percpu *stats = NULL;
2765 		struct nft_chain_hook hook = {};
2766 
2767 		if (table->flags & __NFT_TABLE_F_UPDATE)
2768 			return -EINVAL;
2769 
2770 		if (flags & NFT_CHAIN_BINDING)
2771 			return -EOPNOTSUPP;
2772 
2773 		err = nft_chain_parse_hook(net, NULL, nla, &hook, family, flags,
2774 					   extack);
2775 		if (err < 0)
2776 			return err;
2777 
2778 		basechain = kzalloc_obj(*basechain, GFP_KERNEL_ACCOUNT);
2779 		if (basechain == NULL) {
2780 			nft_chain_release_hook(&hook);
2781 			return -ENOMEM;
2782 		}
2783 		chain = &basechain->chain;
2784 
2785 		if (nla[NFTA_CHAIN_COUNTERS]) {
2786 			stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
2787 			if (IS_ERR_PCPU(stats)) {
2788 				nft_chain_release_hook(&hook);
2789 				kfree(basechain);
2790 				return PTR_ERR_PCPU(stats);
2791 			}
2792 			rcu_assign_pointer(basechain->stats, stats);
2793 		}
2794 
2795 		err = nft_basechain_init(basechain, family, &hook, flags);
2796 		if (err < 0) {
2797 			nft_chain_release_hook(&hook);
2798 			kfree(basechain);
2799 			free_percpu(stats);
2800 			return err;
2801 		}
2802 		if (stats)
2803 			static_branch_inc(&nft_counters_enabled);
2804 	} else {
2805 		if (flags & NFT_CHAIN_BASE)
2806 			return -EINVAL;
2807 		if (flags & NFT_CHAIN_HW_OFFLOAD)
2808 			return -EOPNOTSUPP;
2809 
2810 		chain = kzalloc_obj(*chain, GFP_KERNEL_ACCOUNT);
2811 		if (chain == NULL)
2812 			return -ENOMEM;
2813 
2814 		chain->flags = flags;
2815 	}
2816 	ctx->chain = chain;
2817 
2818 	INIT_LIST_HEAD(&chain->rules);
2819 	chain->handle = nf_tables_alloc_handle(table);
2820 	chain->table = table;
2821 
2822 	if (nla[NFTA_CHAIN_NAME]) {
2823 		chain->name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT);
2824 	} else {
2825 		if (!(flags & NFT_CHAIN_BINDING)) {
2826 			err = -EINVAL;
2827 			goto err_destroy_chain;
2828 		}
2829 
2830 		snprintf(name, sizeof(name), "__chain%llu", ++chain_id);
2831 		chain->name = kstrdup(name, GFP_KERNEL_ACCOUNT);
2832 	}
2833 
2834 	if (!chain->name) {
2835 		err = -ENOMEM;
2836 		goto err_destroy_chain;
2837 	}
2838 
2839 	if (nla[NFTA_CHAIN_USERDATA]) {
2840 		chain->udata = nla_memdup(nla[NFTA_CHAIN_USERDATA], GFP_KERNEL_ACCOUNT);
2841 		if (chain->udata == NULL) {
2842 			err = -ENOMEM;
2843 			goto err_destroy_chain;
2844 		}
2845 		chain->udlen = nla_len(nla[NFTA_CHAIN_USERDATA]);
2846 	}
2847 
2848 	blob = nf_tables_chain_alloc_rules(chain, 0);
2849 	if (!blob) {
2850 		err = -ENOMEM;
2851 		goto err_destroy_chain;
2852 	}
2853 
2854 	RCU_INIT_POINTER(chain->blob_gen_0, blob);
2855 	RCU_INIT_POINTER(chain->blob_gen_1, blob);
2856 
2857 	if (!nft_use_inc(&table->use)) {
2858 		err = -EMFILE;
2859 		goto err_destroy_chain;
2860 	}
2861 
2862 	trans = nft_trans_chain_add(ctx, NFT_MSG_NEWCHAIN);
2863 	if (IS_ERR(trans)) {
2864 		err = PTR_ERR(trans);
2865 		goto err_trans;
2866 	}
2867 
2868 	nft_trans_chain_policy(trans) = NFT_CHAIN_POLICY_UNSET;
2869 	if (nft_is_base_chain(chain))
2870 		nft_trans_chain_policy(trans) = policy;
2871 
2872 	err = nft_chain_add(table, chain);
2873 	if (err < 0)
2874 		goto err_chain_add;
2875 
2876 	/* This must be LAST to ensure no packets are walking over this chain. */
2877 	err = nf_tables_register_hook(net, table, chain);
2878 	if (err < 0)
2879 		goto err_register_hook;
2880 
2881 	return 0;
2882 
2883 err_register_hook:
2884 	nft_chain_del(chain);
2885 	synchronize_rcu();
2886 err_chain_add:
2887 	nft_trans_destroy(trans);
2888 err_trans:
2889 	nft_use_dec_restore(&table->use);
2890 err_destroy_chain:
2891 	nf_tables_chain_destroy(chain);
2892 
2893 	return err;
2894 }
2895 
2896 static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
2897 			      u32 flags, const struct nlattr *attr,
2898 			      struct netlink_ext_ack *extack)
2899 {
2900 	const struct nlattr * const *nla = ctx->nla;
2901 	struct nft_base_chain *basechain = NULL;
2902 	struct nft_table *table = ctx->table;
2903 	struct nft_chain *chain = ctx->chain;
2904 	struct nft_chain_hook hook = {};
2905 	struct nft_stats __percpu *stats = NULL;
2906 	struct nftables_pernet *nft_net;
2907 	struct nft_hook *h, *next;
2908 	struct nf_hook_ops *ops;
2909 	struct nft_trans *trans;
2910 	bool unregister = false;
2911 	int err;
2912 
2913 	if (chain->flags ^ flags)
2914 		return -EOPNOTSUPP;
2915 
2916 	INIT_LIST_HEAD(&hook.list);
2917 
2918 	if (nla[NFTA_CHAIN_HOOK]) {
2919 		if (!nft_is_base_chain(chain)) {
2920 			NL_SET_BAD_ATTR(extack, attr);
2921 			return -EEXIST;
2922 		}
2923 
2924 		basechain = nft_base_chain(chain);
2925 		err = nft_chain_parse_hook(ctx->net, basechain, nla, &hook,
2926 					   ctx->family, flags, extack);
2927 		if (err < 0)
2928 			return err;
2929 
2930 		if (basechain->type != hook.type) {
2931 			nft_chain_release_hook(&hook);
2932 			NL_SET_BAD_ATTR(extack, attr);
2933 			return -EEXIST;
2934 		}
2935 
2936 		if (nft_base_chain_netdev(ctx->family, basechain->ops.hooknum)) {
2937 			list_for_each_entry_safe(h, next, &hook.list, list) {
2938 				list_for_each_entry(ops, &h->ops_list, list) {
2939 					ops->pf		= basechain->ops.pf;
2940 					ops->hooknum	= basechain->ops.hooknum;
2941 					ops->priority	= basechain->ops.priority;
2942 					ops->priv	= basechain->ops.priv;
2943 					ops->hook	= basechain->ops.hook;
2944 				}
2945 
2946 				if (nft_hook_list_find(&basechain->hook_list, h)) {
2947 					list_del(&h->list);
2948 					nft_netdev_hook_free(h);
2949 					continue;
2950 				}
2951 
2952 				nft_net = nft_pernet(ctx->net);
2953 				list_for_each_entry(trans, &nft_net->commit_list, list) {
2954 					if (trans->msg_type != NFT_MSG_NEWCHAIN ||
2955 					    trans->table != ctx->table ||
2956 					    !nft_trans_chain_update(trans))
2957 						continue;
2958 
2959 					if (nft_hook_list_find(&nft_trans_chain_hooks(trans), h)) {
2960 						nft_chain_release_hook(&hook);
2961 						return -EEXIST;
2962 					}
2963 				}
2964 			}
2965 		} else {
2966 			ops = &basechain->ops;
2967 			if (ops->hooknum != hook.num ||
2968 			    ops->priority != hook.priority) {
2969 				nft_chain_release_hook(&hook);
2970 				NL_SET_BAD_ATTR(extack, attr);
2971 				return -EEXIST;
2972 			}
2973 		}
2974 	}
2975 
2976 	if (nla[NFTA_CHAIN_HANDLE] &&
2977 	    nla[NFTA_CHAIN_NAME]) {
2978 		struct nft_chain *chain2;
2979 
2980 		chain2 = nft_chain_lookup(ctx->net, table,
2981 					  nla[NFTA_CHAIN_NAME], genmask);
2982 		if (!IS_ERR(chain2)) {
2983 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2984 			err = -EEXIST;
2985 			goto err_hooks;
2986 		}
2987 	}
2988 
2989 	if (table->flags & __NFT_TABLE_F_UPDATE &&
2990 	    !list_empty(&hook.list)) {
2991 		NL_SET_BAD_ATTR(extack, attr);
2992 		err = -EOPNOTSUPP;
2993 		goto err_hooks;
2994 	}
2995 
2996 	if (!(table->flags & NFT_TABLE_F_DORMANT) &&
2997 	    nft_is_base_chain(chain) &&
2998 	    !list_empty(&hook.list)) {
2999 		basechain = nft_base_chain(chain);
3000 		ops = &basechain->ops;
3001 
3002 		if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) {
3003 			err = nft_netdev_register_hooks(ctx->net, &hook.list);
3004 			if (err < 0)
3005 				goto err_hooks;
3006 
3007 			unregister = true;
3008 		}
3009 	}
3010 
3011 	if (nla[NFTA_CHAIN_COUNTERS]) {
3012 		if (!nft_is_base_chain(chain)) {
3013 			err = -EOPNOTSUPP;
3014 			goto err_hooks;
3015 		}
3016 
3017 		stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
3018 		if (IS_ERR_PCPU(stats)) {
3019 			err = PTR_ERR_PCPU(stats);
3020 			goto err_hooks;
3021 		}
3022 	}
3023 
3024 	err = -ENOMEM;
3025 	trans = nft_trans_alloc_chain(ctx, NFT_MSG_NEWCHAIN);
3026 	if (trans == NULL)
3027 		goto err_trans;
3028 
3029 	nft_trans_chain_stats(trans) = stats;
3030 	nft_trans_chain_update(trans) = true;
3031 
3032 	if (nla[NFTA_CHAIN_POLICY])
3033 		nft_trans_chain_policy(trans) = policy;
3034 	else
3035 		nft_trans_chain_policy(trans) = -1;
3036 
3037 	if (nla[NFTA_CHAIN_HANDLE] &&
3038 	    nla[NFTA_CHAIN_NAME]) {
3039 		struct nftables_pernet *nft_net = nft_pernet(ctx->net);
3040 		struct nft_trans *tmp;
3041 		char *name;
3042 
3043 		err = -ENOMEM;
3044 		name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT);
3045 		if (!name)
3046 			goto err_trans;
3047 
3048 		err = -EEXIST;
3049 		list_for_each_entry(tmp, &nft_net->commit_list, list) {
3050 			if (tmp->msg_type == NFT_MSG_NEWCHAIN &&
3051 			    tmp->table == table &&
3052 			    nft_trans_chain_update(tmp) &&
3053 			    nft_trans_chain_name(tmp) &&
3054 			    strcmp(name, nft_trans_chain_name(tmp)) == 0) {
3055 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
3056 				kfree(name);
3057 				goto err_trans;
3058 			}
3059 		}
3060 
3061 		nft_trans_chain_name(trans) = name;
3062 	}
3063 
3064 	nft_trans_basechain(trans) = basechain;
3065 	INIT_LIST_HEAD(&nft_trans_chain_hooks(trans));
3066 	list_splice(&hook.list, &nft_trans_chain_hooks(trans));
3067 	if (nla[NFTA_CHAIN_HOOK])
3068 		module_put(hook.type->owner);
3069 
3070 	nft_trans_commit_list_add_tail(ctx->net, trans);
3071 
3072 	return 0;
3073 
3074 err_trans:
3075 	free_percpu(stats);
3076 	kfree(trans);
3077 err_hooks:
3078 	if (nla[NFTA_CHAIN_HOOK]) {
3079 		list_for_each_entry_safe(h, next, &hook.list, list) {
3080 			if (unregister) {
3081 				list_for_each_entry(ops, &h->ops_list, list)
3082 					nf_unregister_net_hook(ctx->net, ops);
3083 			}
3084 			/* hook.list is on stack, no need for list_del_rcu() */
3085 			list_del(&h->list);
3086 			nft_netdev_hook_free_rcu(h);
3087 		}
3088 		module_put(hook.type->owner);
3089 	}
3090 
3091 	return err;
3092 }
3093 
3094 static struct nft_chain *nft_chain_lookup_byid(const struct net *net,
3095 					       const struct nft_table *table,
3096 					       const struct nlattr *nla, u8 genmask)
3097 {
3098 	struct nftables_pernet *nft_net = nft_pernet(net);
3099 	u32 id = ntohl(nla_get_be32(nla));
3100 	struct nft_trans *trans;
3101 
3102 	list_for_each_entry(trans, &nft_net->commit_list, list) {
3103 		if (trans->msg_type == NFT_MSG_NEWCHAIN &&
3104 		    nft_trans_chain(trans)->table == table &&
3105 		    id == nft_trans_chain_id(trans) &&
3106 		    nft_active_genmask(nft_trans_chain(trans), genmask))
3107 			return nft_trans_chain(trans);
3108 	}
3109 	return ERR_PTR(-ENOENT);
3110 }
3111 
3112 static int nf_tables_newchain(struct sk_buff *skb, const struct nfnl_info *info,
3113 			      const struct nlattr * const nla[])
3114 {
3115 	struct nftables_pernet *nft_net = nft_pernet(info->net);
3116 	struct netlink_ext_ack *extack = info->extack;
3117 	u8 genmask = nft_genmask_next(info->net);
3118 	u8 family = info->nfmsg->nfgen_family;
3119 	struct nft_chain *chain = NULL;
3120 	struct net *net = info->net;
3121 	const struct nlattr *attr;
3122 	struct nft_table *table;
3123 	u8 policy = NF_ACCEPT;
3124 	struct nft_ctx ctx;
3125 	u64 handle = 0;
3126 	u32 flags = 0;
3127 
3128 	lockdep_assert_held(&nft_net->commit_mutex);
3129 
3130 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask,
3131 				 NETLINK_CB(skb).portid);
3132 	if (IS_ERR(table)) {
3133 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
3134 		return PTR_ERR(table);
3135 	}
3136 
3137 	chain = NULL;
3138 	attr = nla[NFTA_CHAIN_NAME];
3139 
3140 	if (nla[NFTA_CHAIN_HANDLE]) {
3141 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_CHAIN_HANDLE]));
3142 		chain = nft_chain_lookup_byhandle(table, handle, genmask);
3143 		if (IS_ERR(chain)) {
3144 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_HANDLE]);
3145 			return PTR_ERR(chain);
3146 		}
3147 		attr = nla[NFTA_CHAIN_HANDLE];
3148 	} else if (nla[NFTA_CHAIN_NAME]) {
3149 		chain = nft_chain_lookup(net, table, attr, genmask);
3150 		if (IS_ERR(chain)) {
3151 			if (PTR_ERR(chain) != -ENOENT) {
3152 				NL_SET_BAD_ATTR(extack, attr);
3153 				return PTR_ERR(chain);
3154 			}
3155 			chain = NULL;
3156 		}
3157 	} else if (!nla[NFTA_CHAIN_ID]) {
3158 		return -EINVAL;
3159 	}
3160 
3161 	if (nla[NFTA_CHAIN_POLICY]) {
3162 		if (chain != NULL &&
3163 		    !nft_is_base_chain(chain)) {
3164 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
3165 			return -EOPNOTSUPP;
3166 		}
3167 
3168 		if (chain == NULL &&
3169 		    nla[NFTA_CHAIN_HOOK] == NULL) {
3170 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
3171 			return -EOPNOTSUPP;
3172 		}
3173 
3174 		policy = ntohl(nla_get_be32(nla[NFTA_CHAIN_POLICY]));
3175 		switch (policy) {
3176 		case NF_DROP:
3177 		case NF_ACCEPT:
3178 			break;
3179 		default:
3180 			return -EINVAL;
3181 		}
3182 	}
3183 
3184 	if (nla[NFTA_CHAIN_FLAGS])
3185 		flags = ntohl(nla_get_be32(nla[NFTA_CHAIN_FLAGS]));
3186 	else if (chain)
3187 		flags = chain->flags;
3188 
3189 	if (flags & ~NFT_CHAIN_FLAGS)
3190 		return -EOPNOTSUPP;
3191 
3192 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
3193 
3194 	if (chain != NULL) {
3195 		if (chain->flags & NFT_CHAIN_BINDING)
3196 			return -EINVAL;
3197 
3198 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
3199 			NL_SET_BAD_ATTR(extack, attr);
3200 			return -EEXIST;
3201 		}
3202 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
3203 			return -EOPNOTSUPP;
3204 
3205 		flags |= chain->flags & NFT_CHAIN_BASE;
3206 		return nf_tables_updchain(&ctx, genmask, policy, flags, attr,
3207 					  extack);
3208 	}
3209 
3210 	return nf_tables_addchain(&ctx, family, policy, flags, extack);
3211 }
3212 
3213 static int nft_trans_delhook(struct nft_hook *hook,
3214 			     struct list_head *del_list)
3215 {
3216 	struct nft_trans_hook *trans_hook;
3217 
3218 	trans_hook = kmalloc_obj(*trans_hook, GFP_KERNEL);
3219 	if (!trans_hook)
3220 		return -ENOMEM;
3221 
3222 	trans_hook->hook = hook;
3223 	list_add_tail(&trans_hook->list, del_list);
3224 	hook->flags |= NFT_HOOK_REMOVE;
3225 
3226 	return 0;
3227 }
3228 
3229 static void nft_trans_delhook_abort(struct list_head *del_list)
3230 {
3231 	struct nft_trans_hook *trans_hook, *next;
3232 
3233 	list_for_each_entry_safe(trans_hook, next, del_list, list) {
3234 		trans_hook->hook->flags &= ~NFT_HOOK_REMOVE;
3235 		nft_trans_hook_destroy(trans_hook);
3236 	}
3237 }
3238 
3239 static int nft_delchain_hook(struct nft_ctx *ctx,
3240 			     struct nft_base_chain *basechain,
3241 			     struct netlink_ext_ack *extack)
3242 {
3243 	const struct nft_chain *chain = &basechain->chain;
3244 	const struct nlattr * const *nla = ctx->nla;
3245 	struct nft_chain_hook chain_hook = {};
3246 	struct nft_hook *this, *hook;
3247 	LIST_HEAD(chain_del_list);
3248 	struct nft_trans *trans;
3249 	int err;
3250 
3251 	if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
3252 		return -EOPNOTSUPP;
3253 
3254 	err = nft_chain_parse_hook(ctx->net, basechain, nla, &chain_hook,
3255 				   ctx->family, chain->flags, extack);
3256 	if (err < 0)
3257 		return err;
3258 
3259 	list_for_each_entry(this, &chain_hook.list, list) {
3260 		hook = nft_hook_list_find(&basechain->hook_list, this);
3261 		if (!hook) {
3262 			err = -ENOENT;
3263 			goto err_chain_del_hook;
3264 		}
3265 		if (nft_trans_delhook(hook, &chain_del_list) < 0) {
3266 			err = -ENOMEM;
3267 			goto err_chain_del_hook;
3268 		}
3269 	}
3270 
3271 	trans = nft_trans_alloc_chain(ctx, NFT_MSG_DELCHAIN);
3272 	if (!trans) {
3273 		err = -ENOMEM;
3274 		goto err_chain_del_hook;
3275 	}
3276 
3277 	nft_trans_basechain(trans) = basechain;
3278 	nft_trans_chain_update(trans) = true;
3279 	INIT_LIST_HEAD(&nft_trans_chain_hooks(trans));
3280 	list_splice(&chain_del_list, &nft_trans_chain_hooks(trans));
3281 	nft_chain_release_hook(&chain_hook);
3282 
3283 	nft_trans_commit_list_add_tail(ctx->net, trans);
3284 
3285 	return 0;
3286 
3287 err_chain_del_hook:
3288 	nft_trans_delhook_abort(&chain_del_list);
3289 	nft_chain_release_hook(&chain_hook);
3290 
3291 	return err;
3292 }
3293 
3294 static int nf_tables_delchain(struct sk_buff *skb, const struct nfnl_info *info,
3295 			      const struct nlattr * const nla[])
3296 {
3297 	struct netlink_ext_ack *extack = info->extack;
3298 	u8 genmask = nft_genmask_next(info->net);
3299 	u8 family = info->nfmsg->nfgen_family;
3300 	struct net *net = info->net;
3301 	const struct nlattr *attr;
3302 	struct nft_table *table;
3303 	struct nft_chain *chain;
3304 	struct nft_rule *rule;
3305 	struct nft_ctx ctx;
3306 	u64 handle;
3307 	u32 use;
3308 	int err;
3309 
3310 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask,
3311 				 NETLINK_CB(skb).portid);
3312 	if (IS_ERR(table)) {
3313 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
3314 		return PTR_ERR(table);
3315 	}
3316 
3317 	if (nla[NFTA_CHAIN_HANDLE]) {
3318 		attr = nla[NFTA_CHAIN_HANDLE];
3319 		handle = be64_to_cpu(nla_get_be64(attr));
3320 		chain = nft_chain_lookup_byhandle(table, handle, genmask);
3321 	} else {
3322 		attr = nla[NFTA_CHAIN_NAME];
3323 		chain = nft_chain_lookup(net, table, attr, genmask);
3324 	}
3325 	if (IS_ERR(chain)) {
3326 		if (PTR_ERR(chain) == -ENOENT &&
3327 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYCHAIN)
3328 			return 0;
3329 
3330 		NL_SET_BAD_ATTR(extack, attr);
3331 		return PTR_ERR(chain);
3332 	}
3333 
3334 	if (nft_chain_binding(chain))
3335 		return -EOPNOTSUPP;
3336 
3337 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
3338 
3339 	if (nla[NFTA_CHAIN_HOOK]) {
3340 		if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYCHAIN ||
3341 		    chain->flags & NFT_CHAIN_HW_OFFLOAD)
3342 			return -EOPNOTSUPP;
3343 
3344 		if (nft_is_base_chain(chain)) {
3345 			struct nft_base_chain *basechain = nft_base_chain(chain);
3346 
3347 			if (nft_base_chain_netdev(table->family, basechain->ops.hooknum))
3348 				return nft_delchain_hook(&ctx, basechain, extack);
3349 		}
3350 	}
3351 
3352 	if (info->nlh->nlmsg_flags & NLM_F_NONREC &&
3353 	    chain->use > 0)
3354 		return -EBUSY;
3355 
3356 	use = chain->use;
3357 	list_for_each_entry(rule, &chain->rules, list) {
3358 		if (!nft_is_active_next(net, rule))
3359 			continue;
3360 		use--;
3361 
3362 		err = nft_delrule(&ctx, rule);
3363 		if (err < 0)
3364 			return err;
3365 	}
3366 
3367 	/* There are rules and elements that are still holding references to us,
3368 	 * we cannot do a recursive removal in this case.
3369 	 */
3370 	if (use > 0) {
3371 		NL_SET_BAD_ATTR(extack, attr);
3372 		return -EBUSY;
3373 	}
3374 
3375 	return nft_delchain(&ctx);
3376 }
3377 
3378 /*
3379  * Expressions
3380  */
3381 
3382 /**
3383  *	nft_register_expr - register nf_tables expr type
3384  *	@type: expr type
3385  *
3386  *	Registers the expr type for use with nf_tables. Returns zero on
3387  *	success or a negative errno code otherwise.
3388  */
3389 int nft_register_expr(struct nft_expr_type *type)
3390 {
3391 	if (unlikely(type->maxattr > NFT_EXPR_MAXATTR)) {
3392 		DEBUG_NET_WARN_ON_ONCE(1);
3393 		return -ENOMEM;
3394 	}
3395 
3396 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
3397 	if (type->family == NFPROTO_UNSPEC)
3398 		list_add_tail_rcu(&type->list, &nf_tables_expressions);
3399 	else
3400 		list_add_rcu(&type->list, &nf_tables_expressions);
3401 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
3402 	return 0;
3403 }
3404 EXPORT_SYMBOL_GPL(nft_register_expr);
3405 
3406 /**
3407  *	nft_unregister_expr - unregister nf_tables expr type
3408  *	@type: expr type
3409  *
3410  * 	Unregisters the expr typefor use with nf_tables.
3411  */
3412 void nft_unregister_expr(struct nft_expr_type *type)
3413 {
3414 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
3415 	list_del_rcu(&type->list);
3416 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
3417 }
3418 EXPORT_SYMBOL_GPL(nft_unregister_expr);
3419 
3420 static const struct nft_expr_type *__nft_expr_type_get(u8 family,
3421 						       struct nlattr *nla)
3422 {
3423 	const struct nft_expr_type *type, *candidate = NULL;
3424 
3425 	list_for_each_entry_rcu(type, &nf_tables_expressions, list) {
3426 		if (!nla_strcmp(nla, type->name)) {
3427 			if (!type->family && !candidate)
3428 				candidate = type;
3429 			else if (type->family == family)
3430 				candidate = type;
3431 		}
3432 	}
3433 	return candidate;
3434 }
3435 
3436 #ifdef CONFIG_MODULES
3437 static int nft_expr_type_request_module(struct net *net, u8 family,
3438 					struct nlattr *nla)
3439 {
3440 	if (nft_request_module(net, "nft-expr-%u-%.*s", family,
3441 			       nla_len(nla), (char *)nla_data(nla)) == -EAGAIN)
3442 		return -EAGAIN;
3443 
3444 	return 0;
3445 }
3446 #endif
3447 
3448 static const struct nft_expr_type *nft_expr_type_get(struct net *net,
3449 						     u8 family,
3450 						     struct nlattr *nla)
3451 {
3452 	const struct nft_expr_type *type;
3453 
3454 	if (nla == NULL)
3455 		return ERR_PTR(-EINVAL);
3456 
3457 	rcu_read_lock();
3458 	type = __nft_expr_type_get(family, nla);
3459 	if (type != NULL && try_module_get(type->owner)) {
3460 		rcu_read_unlock();
3461 		return type;
3462 	}
3463 	rcu_read_unlock();
3464 
3465 	lockdep_nfnl_nft_mutex_not_held();
3466 #ifdef CONFIG_MODULES
3467 	if (type == NULL) {
3468 		if (nft_expr_type_request_module(net, family, nla) == -EAGAIN)
3469 			return ERR_PTR(-EAGAIN);
3470 
3471 		if (nft_request_module(net, "nft-expr-%.*s",
3472 				       nla_len(nla),
3473 				       (char *)nla_data(nla)) == -EAGAIN)
3474 			return ERR_PTR(-EAGAIN);
3475 	}
3476 #endif
3477 	return ERR_PTR(-ENOENT);
3478 }
3479 
3480 static const struct nla_policy nft_expr_policy[NFTA_EXPR_MAX + 1] = {
3481 	[NFTA_EXPR_NAME]	= { .type = NLA_STRING,
3482 				    .len = NFT_MODULE_AUTOLOAD_LIMIT },
3483 	[NFTA_EXPR_DATA]	= { .type = NLA_NESTED },
3484 };
3485 
3486 static int nf_tables_fill_expr_info(struct sk_buff *skb,
3487 				    const struct nft_expr *expr, bool reset)
3488 {
3489 	if (nla_put_string(skb, NFTA_EXPR_NAME, expr->ops->type->name))
3490 		goto nla_put_failure;
3491 
3492 	if (expr->ops->dump) {
3493 		struct nlattr *data = nla_nest_start_noflag(skb,
3494 							    NFTA_EXPR_DATA);
3495 		if (data == NULL)
3496 			goto nla_put_failure;
3497 		if (expr->ops->dump(skb, expr, reset) < 0)
3498 			goto nla_put_failure;
3499 		nla_nest_end(skb, data);
3500 	}
3501 
3502 	return skb->len;
3503 
3504 nla_put_failure:
3505 	return -1;
3506 };
3507 
3508 int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
3509 		  const struct nft_expr *expr, bool reset)
3510 {
3511 	struct nlattr *nest;
3512 
3513 	nest = nla_nest_start_noflag(skb, attr);
3514 	if (!nest)
3515 		goto nla_put_failure;
3516 	if (nf_tables_fill_expr_info(skb, expr, reset) < 0)
3517 		goto nla_put_failure;
3518 	nla_nest_end(skb, nest);
3519 	return 0;
3520 
3521 nla_put_failure:
3522 	return -1;
3523 }
3524 
3525 struct nft_expr_info {
3526 	const struct nft_expr_ops	*ops;
3527 	const struct nlattr		*attr;
3528 	struct nlattr			*tb[NFT_EXPR_MAXATTR + 1];
3529 };
3530 
3531 static int nf_tables_expr_parse(const struct nft_ctx *ctx,
3532 				const struct nlattr *nla,
3533 				struct nft_expr_info *info)
3534 {
3535 	const struct nft_expr_type *type;
3536 	const struct nft_expr_ops *ops;
3537 	struct nlattr *tb[NFTA_EXPR_MAX + 1];
3538 	int err;
3539 
3540 	err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
3541 					  nft_expr_policy, NULL);
3542 	if (err < 0)
3543 		return err;
3544 
3545 	type = nft_expr_type_get(ctx->net, ctx->family, tb[NFTA_EXPR_NAME]);
3546 	if (IS_ERR(type))
3547 		return PTR_ERR(type);
3548 
3549 	if (tb[NFTA_EXPR_DATA]) {
3550 		err = nla_parse_nested_deprecated(info->tb, type->maxattr,
3551 						  tb[NFTA_EXPR_DATA],
3552 						  type->policy, NULL);
3553 		if (err < 0)
3554 			goto err1;
3555 	} else
3556 		memset(info->tb, 0, sizeof(info->tb[0]) * (type->maxattr + 1));
3557 
3558 	if (type->select_ops != NULL) {
3559 		ops = type->select_ops(ctx,
3560 				       (const struct nlattr * const *)info->tb);
3561 		if (IS_ERR(ops)) {
3562 			err = PTR_ERR(ops);
3563 #ifdef CONFIG_MODULES
3564 			if (err == -EAGAIN)
3565 				if (nft_expr_type_request_module(ctx->net,
3566 								 ctx->family,
3567 								 tb[NFTA_EXPR_NAME]) != -EAGAIN)
3568 					err = -ENOENT;
3569 #endif
3570 			goto err1;
3571 		}
3572 	} else
3573 		ops = type->ops;
3574 
3575 	info->attr = nla;
3576 	info->ops = ops;
3577 
3578 	return 0;
3579 
3580 err1:
3581 	module_put(type->owner);
3582 	return err;
3583 }
3584 
3585 int nft_expr_inner_parse(const struct nft_ctx *ctx, const struct nlattr *nla,
3586 			 struct nft_expr_info *info)
3587 {
3588 	struct nlattr *tb[NFTA_EXPR_MAX + 1];
3589 	const struct nft_expr_type *type;
3590 	int err;
3591 
3592 	err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
3593 					  nft_expr_policy, NULL);
3594 	if (err < 0)
3595 		return err;
3596 
3597 	if (!tb[NFTA_EXPR_DATA] || !tb[NFTA_EXPR_NAME])
3598 		return -EINVAL;
3599 
3600 	rcu_read_lock();
3601 
3602 	type = __nft_expr_type_get(ctx->family, tb[NFTA_EXPR_NAME]);
3603 	if (!type) {
3604 		err = -ENOENT;
3605 		goto out_unlock;
3606 	}
3607 
3608 	if (!type->inner_ops) {
3609 		err = -EOPNOTSUPP;
3610 		goto out_unlock;
3611 	}
3612 
3613 	err = nla_parse_nested_deprecated(info->tb, type->maxattr,
3614 					  tb[NFTA_EXPR_DATA],
3615 					  type->policy, NULL);
3616 	if (err < 0)
3617 		goto out_unlock;
3618 
3619 	info->attr = nla;
3620 	info->ops = type->inner_ops;
3621 
3622 	/* No module reference will be taken on type->owner.
3623 	 * Presence of type->inner_ops implies that the expression
3624 	 * is builtin, so it cannot go away.
3625 	 */
3626 	rcu_read_unlock();
3627 	return 0;
3628 
3629 out_unlock:
3630 	rcu_read_unlock();
3631 	return err;
3632 }
3633 
3634 static int nf_tables_newexpr(const struct nft_ctx *ctx,
3635 			     const struct nft_expr_info *expr_info,
3636 			     struct nft_expr *expr)
3637 {
3638 	const struct nft_expr_ops *ops = expr_info->ops;
3639 	int err;
3640 
3641 	expr->ops = ops;
3642 	if (ops->init) {
3643 		err = ops->init(ctx, expr, (const struct nlattr **)expr_info->tb);
3644 		if (err < 0)
3645 			goto err1;
3646 	}
3647 
3648 	return 0;
3649 err1:
3650 	expr->ops = NULL;
3651 	return err;
3652 }
3653 
3654 static void nf_tables_expr_destroy(const struct nft_ctx *ctx,
3655 				   struct nft_expr *expr)
3656 {
3657 	const struct nft_expr_type *type = expr->ops->type;
3658 
3659 	if (expr->ops->destroy)
3660 		expr->ops->destroy(ctx, expr);
3661 	module_put(type->owner);
3662 }
3663 
3664 static struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
3665 				      const struct nlattr *nla)
3666 {
3667 	struct nft_expr_info expr_info;
3668 	struct nft_expr *expr;
3669 	struct module *owner;
3670 	int err;
3671 
3672 	err = nf_tables_expr_parse(ctx, nla, &expr_info);
3673 	if (err < 0)
3674 		goto err_expr_parse;
3675 
3676 	err = -EOPNOTSUPP;
3677 	if (!(expr_info.ops->type->flags & NFT_EXPR_STATEFUL))
3678 		goto err_expr_stateful;
3679 
3680 	err = -ENOMEM;
3681 	expr = kzalloc(expr_info.ops->size, GFP_KERNEL_ACCOUNT);
3682 	if (expr == NULL)
3683 		goto err_expr_stateful;
3684 
3685 	err = nf_tables_newexpr(ctx, &expr_info, expr);
3686 	if (err < 0)
3687 		goto err_expr_new;
3688 
3689 	return expr;
3690 err_expr_new:
3691 	kfree(expr);
3692 err_expr_stateful:
3693 	owner = expr_info.ops->type->owner;
3694 	if (expr_info.ops->type->release_ops)
3695 		expr_info.ops->type->release_ops(expr_info.ops);
3696 
3697 	module_put(owner);
3698 err_expr_parse:
3699 	return ERR_PTR(err);
3700 }
3701 
3702 int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp)
3703 {
3704 	int err;
3705 
3706 	if (unlikely(!src->ops->clone)) {
3707 		DEBUG_NET_WARN_ON_ONCE(1);
3708 		return -EINVAL;
3709 	}
3710 
3711 	dst->ops = src->ops;
3712 	err = src->ops->clone(dst, src, gfp);
3713 	if (err < 0)
3714 		return err;
3715 
3716 	__module_get(src->ops->type->owner);
3717 
3718 	return 0;
3719 }
3720 
3721 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr)
3722 {
3723 	nf_tables_expr_destroy(ctx, expr);
3724 	kfree(expr);
3725 }
3726 
3727 /*
3728  * Rules
3729  */
3730 
3731 static struct nft_rule *__nft_rule_lookup(const struct net *net,
3732 					  const struct nft_chain *chain,
3733 					  u64 handle)
3734 {
3735 	struct nft_rule *rule;
3736 
3737 	// FIXME: this sucks
3738 	list_for_each_entry_rcu(rule, &chain->rules, list,
3739 				lockdep_commit_lock_is_held(net)) {
3740 		if (handle == rule->handle)
3741 			return rule;
3742 	}
3743 
3744 	return ERR_PTR(-ENOENT);
3745 }
3746 
3747 static struct nft_rule *nft_rule_lookup(const struct net *net,
3748 					const struct nft_chain *chain,
3749 					const struct nlattr *nla)
3750 {
3751 	if (nla == NULL)
3752 		return ERR_PTR(-EINVAL);
3753 
3754 	return __nft_rule_lookup(net, chain, be64_to_cpu(nla_get_be64(nla)));
3755 }
3756 
3757 static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = {
3758 	[NFTA_RULE_TABLE]	= { .type = NLA_STRING,
3759 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
3760 	[NFTA_RULE_CHAIN]	= { .type = NLA_STRING,
3761 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
3762 	[NFTA_RULE_HANDLE]	= { .type = NLA_U64 },
3763 	[NFTA_RULE_EXPRESSIONS]	= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
3764 	[NFTA_RULE_COMPAT]	= { .type = NLA_NESTED },
3765 	[NFTA_RULE_POSITION]	= { .type = NLA_U64 },
3766 	[NFTA_RULE_USERDATA]	= { .type = NLA_BINARY,
3767 				    .len = NFT_USERDATA_MAXLEN },
3768 	[NFTA_RULE_ID]		= { .type = NLA_U32 },
3769 	[NFTA_RULE_POSITION_ID]	= { .type = NLA_U32 },
3770 	[NFTA_RULE_CHAIN_ID]	= { .type = NLA_U32 },
3771 };
3772 
3773 static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
3774 				    u32 portid, u32 seq, int event,
3775 				    u32 flags, int family,
3776 				    const struct nft_table *table,
3777 				    const struct nft_chain *chain,
3778 				    const struct nft_rule *rule, u64 handle,
3779 				    bool reset)
3780 {
3781 	struct nlmsghdr *nlh;
3782 	const struct nft_expr *expr, *next;
3783 	struct nlattr *list;
3784 	u16 type = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
3785 
3786 	nlh = nfnl_msg_put(skb, portid, seq, type, flags, family, NFNETLINK_V0,
3787 			   nft_base_seq_be16(net));
3788 	if (!nlh)
3789 		goto nla_put_failure;
3790 
3791 	if (nla_put_string(skb, NFTA_RULE_TABLE, table->name))
3792 		goto nla_put_failure;
3793 	if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name))
3794 		goto nla_put_failure;
3795 	if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle),
3796 			 NFTA_RULE_PAD))
3797 		goto nla_put_failure;
3798 
3799 	if (event != NFT_MSG_DELRULE && handle) {
3800 		if (nla_put_be64(skb, NFTA_RULE_POSITION, cpu_to_be64(handle),
3801 				 NFTA_RULE_PAD))
3802 			goto nla_put_failure;
3803 	}
3804 
3805 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD)
3806 		nft_flow_rule_stats(chain, rule);
3807 
3808 	list = nla_nest_start_noflag(skb, NFTA_RULE_EXPRESSIONS);
3809 	if (list == NULL)
3810 		goto nla_put_failure;
3811 	nft_rule_for_each_expr(expr, next, rule) {
3812 		if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, reset) < 0)
3813 			goto nla_put_failure;
3814 	}
3815 	nla_nest_end(skb, list);
3816 
3817 	if (rule->udata) {
3818 		struct nft_userdata *udata = nft_userdata(rule);
3819 		if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1,
3820 			    udata->data) < 0)
3821 			goto nla_put_failure;
3822 	}
3823 
3824 	nlmsg_end(skb, nlh);
3825 	return 0;
3826 
3827 nla_put_failure:
3828 	nlmsg_trim(skb, nlh);
3829 	return -1;
3830 }
3831 
3832 static void nf_tables_rule_notify(const struct nft_ctx *ctx,
3833 				  const struct nft_rule *rule, int event)
3834 {
3835 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
3836 	const struct nft_rule *prule;
3837 	struct sk_buff *skb;
3838 	u64 handle = 0;
3839 	u16 flags = 0;
3840 	int err;
3841 
3842 	if (!ctx->report &&
3843 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
3844 		return;
3845 
3846 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
3847 	if (skb == NULL)
3848 		goto err;
3849 
3850 	if (event == NFT_MSG_NEWRULE &&
3851 	    !list_is_first(&rule->list, &ctx->chain->rules) &&
3852 	    !list_is_last(&rule->list, &ctx->chain->rules)) {
3853 		prule = list_prev_entry(rule, list);
3854 		handle = prule->handle;
3855 	}
3856 	if (ctx->flags & (NLM_F_APPEND | NLM_F_REPLACE))
3857 		flags |= NLM_F_APPEND;
3858 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
3859 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
3860 
3861 	err = nf_tables_fill_rule_info(skb, ctx->net, ctx->portid, ctx->seq,
3862 				       event, flags, ctx->family, ctx->table,
3863 				       ctx->chain, rule, handle, false);
3864 	if (err < 0) {
3865 		kfree_skb(skb);
3866 		goto err;
3867 	}
3868 
3869 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
3870 	return;
3871 err:
3872 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
3873 }
3874 
3875 static void audit_log_rule_reset(const struct nft_table *table,
3876 				 unsigned int base_seq,
3877 				 unsigned int nentries)
3878 {
3879 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u",
3880 			      table->name, base_seq);
3881 
3882 	audit_log_nfcfg(buf, table->family, nentries,
3883 			AUDIT_NFT_OP_RULE_RESET, GFP_ATOMIC);
3884 	kfree(buf);
3885 }
3886 
3887 struct nft_rule_dump_ctx {
3888 	unsigned int s_idx;
3889 	char *table;
3890 	char *chain;
3891 	bool reset;
3892 };
3893 
3894 static int __nf_tables_dump_rules(struct sk_buff *skb,
3895 				  unsigned int *idx,
3896 				  struct netlink_callback *cb,
3897 				  const struct nft_table *table,
3898 				  const struct nft_chain *chain)
3899 {
3900 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3901 	struct net *net = sock_net(skb->sk);
3902 	const struct nft_rule *rule, *prule;
3903 	unsigned int entries = 0;
3904 	int ret = 0;
3905 	u64 handle;
3906 
3907 	prule = NULL;
3908 	list_for_each_entry_rcu(rule, &chain->rules, list) {
3909 		if (!nft_is_active(net, rule))
3910 			goto cont_skip;
3911 		if (*idx < ctx->s_idx)
3912 			goto cont;
3913 		if (prule)
3914 			handle = prule->handle;
3915 		else
3916 			handle = 0;
3917 
3918 		if (nf_tables_fill_rule_info(skb, net, NETLINK_CB(cb->skb).portid,
3919 					cb->nlh->nlmsg_seq,
3920 					NFT_MSG_NEWRULE,
3921 					NLM_F_MULTI | NLM_F_APPEND,
3922 					table->family,
3923 					table, chain, rule, handle, ctx->reset) < 0) {
3924 			ret = 1;
3925 			break;
3926 		}
3927 		entries++;
3928 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
3929 cont:
3930 		prule = rule;
3931 cont_skip:
3932 		(*idx)++;
3933 	}
3934 
3935 	if (ctx->reset && entries)
3936 		audit_log_rule_reset(table, cb->seq, entries);
3937 
3938 	return ret;
3939 }
3940 
3941 static int nf_tables_dump_rules(struct sk_buff *skb,
3942 				struct netlink_callback *cb)
3943 {
3944 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
3945 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3946 	struct nft_table *table;
3947 	const struct nft_chain *chain;
3948 	unsigned int idx = 0;
3949 	struct net *net = sock_net(skb->sk);
3950 	int family = nfmsg->nfgen_family;
3951 	struct nftables_pernet *nft_net;
3952 
3953 	rcu_read_lock();
3954 	nft_net = nft_pernet(net);
3955 	cb->seq = nft_base_seq(net);
3956 
3957 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
3958 		if (family != NFPROTO_UNSPEC && family != table->family)
3959 			continue;
3960 
3961 		if (ctx->table && strcmp(ctx->table, table->name) != 0)
3962 			continue;
3963 
3964 		if (ctx->table && ctx->chain) {
3965 			struct rhlist_head *list, *tmp;
3966 
3967 			list = rhltable_lookup(&table->chains_ht, ctx->chain,
3968 					       nft_chain_ht_params);
3969 			if (!list)
3970 				goto done;
3971 
3972 			rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
3973 				if (!nft_is_active(net, chain))
3974 					continue;
3975 				__nf_tables_dump_rules(skb, &idx,
3976 						       cb, table, chain);
3977 				break;
3978 			}
3979 			goto done;
3980 		}
3981 
3982 		list_for_each_entry_rcu(chain, &table->chains, list) {
3983 			if (__nf_tables_dump_rules(skb, &idx,
3984 						   cb, table, chain))
3985 				goto done;
3986 		}
3987 
3988 		if (ctx->table)
3989 			break;
3990 	}
3991 done:
3992 	rcu_read_unlock();
3993 
3994 	ctx->s_idx = idx;
3995 	return skb->len;
3996 }
3997 
3998 static int nf_tables_dump_rules_start(struct netlink_callback *cb)
3999 {
4000 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
4001 	const struct nlattr * const *nla = cb->data;
4002 
4003 	BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx));
4004 
4005 	if (nla[NFTA_RULE_TABLE]) {
4006 		ctx->table = nla_strdup(nla[NFTA_RULE_TABLE], GFP_ATOMIC);
4007 		if (!ctx->table)
4008 			return -ENOMEM;
4009 	}
4010 	if (nla[NFTA_RULE_CHAIN]) {
4011 		ctx->chain = nla_strdup(nla[NFTA_RULE_CHAIN], GFP_ATOMIC);
4012 		if (!ctx->chain) {
4013 			kfree(ctx->table);
4014 			return -ENOMEM;
4015 		}
4016 	}
4017 	if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETRULE_RESET)
4018 		ctx->reset = true;
4019 
4020 	return 0;
4021 }
4022 
4023 static int nf_tables_dump_rules_done(struct netlink_callback *cb)
4024 {
4025 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
4026 
4027 	kfree(ctx->table);
4028 	kfree(ctx->chain);
4029 	return 0;
4030 }
4031 
4032 /* Caller must hold rcu read lock or transaction mutex */
4033 static struct sk_buff *
4034 nf_tables_getrule_single(u32 portid, const struct nfnl_info *info,
4035 			 const struct nlattr * const nla[], bool reset)
4036 {
4037 	struct netlink_ext_ack *extack = info->extack;
4038 	u8 genmask = nft_genmask_cur(info->net);
4039 	u8 family = info->nfmsg->nfgen_family;
4040 	const struct nft_chain *chain;
4041 	const struct nft_rule *rule;
4042 	struct net *net = info->net;
4043 	struct nft_table *table;
4044 	struct sk_buff *skb2;
4045 	int err;
4046 
4047 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask, 0);
4048 	if (IS_ERR(table)) {
4049 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
4050 		return ERR_CAST(table);
4051 	}
4052 
4053 	chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], genmask);
4054 	if (IS_ERR(chain)) {
4055 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
4056 		return ERR_CAST(chain);
4057 	}
4058 
4059 	rule = nft_rule_lookup(net, chain, nla[NFTA_RULE_HANDLE]);
4060 	if (IS_ERR(rule)) {
4061 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4062 		return ERR_CAST(rule);
4063 	}
4064 
4065 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
4066 	if (!skb2)
4067 		return ERR_PTR(-ENOMEM);
4068 
4069 	err = nf_tables_fill_rule_info(skb2, net, portid,
4070 				       info->nlh->nlmsg_seq, NFT_MSG_NEWRULE, 0,
4071 				       family, table, chain, rule, 0, reset);
4072 	if (err < 0) {
4073 		kfree_skb(skb2);
4074 		return ERR_PTR(err);
4075 	}
4076 
4077 	return skb2;
4078 }
4079 
4080 static int nf_tables_getrule(struct sk_buff *skb, const struct nfnl_info *info,
4081 			     const struct nlattr * const nla[])
4082 {
4083 	u32 portid = NETLINK_CB(skb).portid;
4084 	struct net *net = info->net;
4085 	struct sk_buff *skb2;
4086 	bool reset = false;
4087 	char *buf;
4088 
4089 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
4090 		struct netlink_dump_control c = {
4091 			.start= nf_tables_dump_rules_start,
4092 			.dump = nf_tables_dump_rules,
4093 			.done = nf_tables_dump_rules_done,
4094 			.module = THIS_MODULE,
4095 			.data = (void *)nla,
4096 		};
4097 
4098 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
4099 	}
4100 
4101 	if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_GETRULE_RESET)
4102 		reset = true;
4103 
4104 	skb2 = nf_tables_getrule_single(portid, info, nla, reset);
4105 	if (IS_ERR(skb2))
4106 		return PTR_ERR(skb2);
4107 
4108 	if (!reset)
4109 		return nfnetlink_unicast(skb2, net, portid);
4110 
4111 	buf = kasprintf(GFP_ATOMIC, "%.*s:%u",
4112 			nla_len(nla[NFTA_RULE_TABLE]),
4113 			(char *)nla_data(nla[NFTA_RULE_TABLE]),
4114 			nft_base_seq(net));
4115 	audit_log_nfcfg(buf, info->nfmsg->nfgen_family, 1,
4116 			AUDIT_NFT_OP_RULE_RESET, GFP_ATOMIC);
4117 	kfree(buf);
4118 
4119 	return nfnetlink_unicast(skb2, net, portid);
4120 }
4121 
4122 void nf_tables_rule_destroy(const struct nft_ctx *ctx, struct nft_rule *rule)
4123 {
4124 	struct nft_expr *expr, *next;
4125 
4126 	/*
4127 	 * Careful: some expressions might not be initialized in case this
4128 	 * is called on error from nf_tables_newrule().
4129 	 */
4130 	expr = nft_expr_first(rule);
4131 	while (nft_expr_more(rule, expr)) {
4132 		next = nft_expr_next(expr);
4133 		nf_tables_expr_destroy(ctx, expr);
4134 		expr = next;
4135 	}
4136 	kfree(rule);
4137 }
4138 
4139 /* can only be used if rule is no longer visible to dumps */
4140 static void nf_tables_rule_release(const struct nft_ctx *ctx, struct nft_rule *rule)
4141 {
4142 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(ctx->net));
4143 
4144 	nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_RELEASE);
4145 	nf_tables_rule_destroy(ctx, rule);
4146 }
4147 
4148 static void nft_chain_vstate_update(const struct nft_ctx *ctx, struct nft_chain *chain)
4149 {
4150 	const struct nft_base_chain *base_chain;
4151 	enum nft_chain_types type;
4152 	u8 hooknum;
4153 
4154 	/* ctx->chain must hold the calling base chain. */
4155 	if (WARN_ON_ONCE(!nft_is_base_chain(ctx->chain))) {
4156 		memset(&chain->vstate, 0, sizeof(chain->vstate));
4157 		return;
4158 	}
4159 
4160 	base_chain = nft_base_chain(ctx->chain);
4161 	hooknum = base_chain->ops.hooknum;
4162 	type = base_chain->type->type;
4163 
4164 	BUILD_BUG_ON(BIT(NF_INET_NUMHOOKS) > U8_MAX);
4165 
4166 	chain->vstate.hook_mask[type] |= BIT(hooknum);
4167 	if (chain->vstate.depth < ctx->level)
4168 		chain->vstate.depth = ctx->level;
4169 }
4170 
4171 /** nft_chain_validate - loop detection and hook validation
4172  *
4173  * @ctx: context containing call depth and base chain
4174  * @chain: chain to validate
4175  *
4176  * Walk through the rules of the given chain and chase all jumps/gotos
4177  * and set lookups until either the jump limit is hit or all reachable
4178  * chains have been validated.
4179  */
4180 int nft_chain_validate(const struct nft_ctx *ctx, struct nft_chain *chain)
4181 {
4182 	struct nft_expr *expr, *last;
4183 	struct nft_rule *rule;
4184 	int err;
4185 
4186 	BUILD_BUG_ON(NFT_JUMP_STACK_SIZE > 255);
4187 	if (ctx->level == NFT_JUMP_STACK_SIZE)
4188 		return -EMLINK;
4189 
4190 	if (ctx->level > 0) {
4191 		/* jumps to base chains are not allowed. */
4192 		if (nft_is_base_chain(chain))
4193 			return -ELOOP;
4194 
4195 		if (nft_chain_vstate_valid(ctx, chain))
4196 			return 0;
4197 	}
4198 
4199 	list_for_each_entry(rule, &chain->rules, list) {
4200 		if (fatal_signal_pending(current))
4201 			return -EINTR;
4202 
4203 		if (!nft_is_active_next(ctx->net, rule))
4204 			continue;
4205 
4206 		nft_rule_for_each_expr(expr, last, rule) {
4207 			if (!expr->ops->validate)
4208 				continue;
4209 
4210 			/* This may call nft_chain_validate() recursively,
4211 			 * callers that do so must increment ctx->level.
4212 			 */
4213 			err = expr->ops->validate(ctx, expr);
4214 			if (err < 0)
4215 				return err;
4216 		}
4217 
4218 		cond_resched();
4219 	}
4220 
4221 	nft_chain_vstate_update(ctx, chain);
4222 	return 0;
4223 }
4224 
4225 static int nft_table_validate(struct net *net, const struct nft_table *table)
4226 {
4227 	struct nft_chain *chain;
4228 	struct nft_ctx ctx = {
4229 		.net	= net,
4230 		.table	= (struct nft_table *)table,
4231 		.family	= table->family,
4232 	};
4233 	int err = 0;
4234 
4235 	list_for_each_entry(chain, &table->chains, list) {
4236 		if (!nft_is_base_chain(chain))
4237 			continue;
4238 
4239 		ctx.chain = chain;
4240 		err = nft_chain_validate(&ctx, chain);
4241 		if (err < 0)
4242 			goto err;
4243 	}
4244 
4245 err:
4246 	list_for_each_entry(chain, &table->chains, list)
4247 		memset(&chain->vstate, 0, sizeof(chain->vstate));
4248 
4249 	return err;
4250 }
4251 
4252 int nft_setelem_validate(const struct nft_ctx *ctx, struct nft_set *set,
4253 			 const struct nft_set_iter *iter,
4254 			 struct nft_elem_priv *elem_priv)
4255 {
4256 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
4257 	struct nft_ctx *pctx = (struct nft_ctx *)ctx;
4258 	const struct nft_data *data;
4259 	int err;
4260 
4261 	if (!nft_set_elem_active(ext, iter->genmask))
4262 		return 0;
4263 
4264 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
4265 	    *nft_set_ext_flags(ext) & NFT_SET_ELEM_INTERVAL_END)
4266 		return 0;
4267 
4268 	data = nft_set_ext_data(ext);
4269 	switch (data->verdict.code) {
4270 	case NFT_JUMP:
4271 	case NFT_GOTO:
4272 		pctx->level++;
4273 		err = nft_chain_validate(ctx, data->verdict.chain);
4274 		if (err < 0)
4275 			return err;
4276 		pctx->level--;
4277 		break;
4278 	default:
4279 		break;
4280 	}
4281 
4282 	return 0;
4283 }
4284 
4285 int nft_set_catchall_validate(const struct nft_ctx *ctx, struct nft_set *set)
4286 {
4287 	struct nft_set_iter dummy_iter = {
4288 		.genmask	= nft_genmask_next(ctx->net),
4289 	};
4290 	struct nft_set_elem_catchall *catchall;
4291 
4292 	struct nft_set_ext *ext;
4293 	int ret = 0;
4294 
4295 	list_for_each_entry_rcu(catchall, &set->catchall_list, list,
4296 				lockdep_commit_lock_is_held(ctx->net)) {
4297 		ext = nft_set_elem_ext(set, catchall->elem);
4298 		if (!nft_set_elem_active(ext, dummy_iter.genmask))
4299 			continue;
4300 
4301 		ret = nft_setelem_validate(ctx, set, &dummy_iter, catchall->elem);
4302 		if (ret < 0)
4303 			return ret;
4304 	}
4305 
4306 	return ret;
4307 }
4308 
4309 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
4310 					     const struct nft_chain *chain,
4311 					     const struct nlattr *nla);
4312 
4313 #define NFT_RULE_MAXEXPRS	128
4314 
4315 static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
4316 			     const struct nlattr * const nla[])
4317 {
4318 	struct nftables_pernet *nft_net = nft_pernet(info->net);
4319 	struct netlink_ext_ack *extack = info->extack;
4320 	unsigned int size, i, n, ulen = 0, usize = 0;
4321 	u8 genmask = nft_genmask_next(info->net);
4322 	struct nft_rule *rule, *old_rule = NULL;
4323 	struct nft_expr_info *expr_info = NULL;
4324 	u8 family = info->nfmsg->nfgen_family;
4325 	struct nft_flow_rule *flow = NULL;
4326 	struct net *net = info->net;
4327 	struct nft_userdata *udata;
4328 	struct nft_table *table;
4329 	struct nft_chain *chain;
4330 	struct nft_trans *trans;
4331 	u64 handle, pos_handle;
4332 	struct nft_expr *expr;
4333 	struct nft_ctx ctx;
4334 	struct nlattr *tmp;
4335 	int err, rem;
4336 
4337 	lockdep_assert_held(&nft_net->commit_mutex);
4338 
4339 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask,
4340 				 NETLINK_CB(skb).portid);
4341 	if (IS_ERR(table)) {
4342 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
4343 		return PTR_ERR(table);
4344 	}
4345 
4346 	if (nla[NFTA_RULE_CHAIN]) {
4347 		chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN],
4348 					 genmask);
4349 		if (IS_ERR(chain)) {
4350 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
4351 			return PTR_ERR(chain);
4352 		}
4353 
4354 	} else if (nla[NFTA_RULE_CHAIN_ID]) {
4355 		chain = nft_chain_lookup_byid(net, table, nla[NFTA_RULE_CHAIN_ID],
4356 					      genmask);
4357 		if (IS_ERR(chain)) {
4358 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN_ID]);
4359 			return PTR_ERR(chain);
4360 		}
4361 	} else {
4362 		return -EINVAL;
4363 	}
4364 
4365 	if (nft_chain_is_bound(chain))
4366 		return -EOPNOTSUPP;
4367 
4368 	if (nla[NFTA_RULE_HANDLE]) {
4369 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE]));
4370 		rule = __nft_rule_lookup(net, chain, handle);
4371 		if (IS_ERR(rule)) {
4372 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4373 			return PTR_ERR(rule);
4374 		}
4375 
4376 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
4377 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4378 			return -EEXIST;
4379 		}
4380 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
4381 			old_rule = rule;
4382 		else
4383 			return -EOPNOTSUPP;
4384 	} else {
4385 		if (!(info->nlh->nlmsg_flags & NLM_F_CREATE) ||
4386 		    info->nlh->nlmsg_flags & NLM_F_REPLACE)
4387 			return -EINVAL;
4388 		handle = nf_tables_alloc_handle(table);
4389 
4390 		if (nla[NFTA_RULE_POSITION]) {
4391 			pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
4392 			old_rule = __nft_rule_lookup(net, chain, pos_handle);
4393 			if (IS_ERR(old_rule)) {
4394 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]);
4395 				return PTR_ERR(old_rule);
4396 			}
4397 		} else if (nla[NFTA_RULE_POSITION_ID]) {
4398 			old_rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_POSITION_ID]);
4399 			if (IS_ERR(old_rule)) {
4400 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION_ID]);
4401 				return PTR_ERR(old_rule);
4402 			}
4403 		}
4404 	}
4405 
4406 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
4407 
4408 	n = 0;
4409 	size = 0;
4410 	if (nla[NFTA_RULE_EXPRESSIONS]) {
4411 		expr_info = kvmalloc_objs(struct nft_expr_info,
4412 					  NFT_RULE_MAXEXPRS);
4413 		if (!expr_info)
4414 			return -ENOMEM;
4415 
4416 		nla_for_each_nested(tmp, nla[NFTA_RULE_EXPRESSIONS], rem) {
4417 			err = -EINVAL;
4418 			if (nla_type(tmp) != NFTA_LIST_ELEM)
4419 				goto err_release_expr;
4420 			if (n == NFT_RULE_MAXEXPRS)
4421 				goto err_release_expr;
4422 			err = nf_tables_expr_parse(&ctx, tmp, &expr_info[n]);
4423 			if (err < 0) {
4424 				NL_SET_BAD_ATTR(extack, tmp);
4425 				goto err_release_expr;
4426 			}
4427 			size += expr_info[n].ops->size;
4428 			n++;
4429 		}
4430 	}
4431 	/* Check for overflow of dlen field */
4432 	err = -EFBIG;
4433 	if (size >= 1 << 12)
4434 		goto err_release_expr;
4435 
4436 	if (nla[NFTA_RULE_USERDATA]) {
4437 		ulen = nla_len(nla[NFTA_RULE_USERDATA]);
4438 		if (ulen > 0)
4439 			usize = sizeof(struct nft_userdata) + ulen;
4440 	}
4441 
4442 	err = -ENOMEM;
4443 	rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL_ACCOUNT);
4444 	if (rule == NULL)
4445 		goto err_release_expr;
4446 
4447 	nft_activate_next(net, rule);
4448 
4449 	rule->handle = handle;
4450 	rule->dlen   = size;
4451 	rule->udata  = ulen ? 1 : 0;
4452 
4453 	if (ulen) {
4454 		udata = nft_userdata(rule);
4455 		udata->len = ulen - 1;
4456 		nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen);
4457 	}
4458 
4459 	expr = nft_expr_first(rule);
4460 	for (i = 0; i < n; i++) {
4461 		err = nf_tables_newexpr(&ctx, &expr_info[i], expr);
4462 		if (err < 0) {
4463 			NL_SET_BAD_ATTR(extack, expr_info[i].attr);
4464 			goto err_release_rule;
4465 		}
4466 
4467 		if (expr_info[i].ops->validate)
4468 			nft_validate_state_update(table, NFT_VALIDATE_NEED);
4469 
4470 		expr_info[i].ops = NULL;
4471 		expr = nft_expr_next(expr);
4472 	}
4473 
4474 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD) {
4475 		flow = nft_flow_rule_create(net, rule);
4476 		if (IS_ERR(flow)) {
4477 			err = PTR_ERR(flow);
4478 			goto err_release_rule;
4479 		}
4480 	}
4481 
4482 	if (!nft_use_inc(&chain->use)) {
4483 		err = -EMFILE;
4484 		goto err_destroy_flow;
4485 	}
4486 
4487 	if (info->nlh->nlmsg_flags & NLM_F_REPLACE) {
4488 		if (nft_chain_binding(chain)) {
4489 			err = -EOPNOTSUPP;
4490 			goto err_destroy_flow_rule;
4491 		}
4492 
4493 		err = nft_delrule(&ctx, old_rule);
4494 		if (err < 0)
4495 			goto err_destroy_flow_rule;
4496 
4497 		trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
4498 		if (trans == NULL) {
4499 			err = -ENOMEM;
4500 			goto err_destroy_flow_rule;
4501 		}
4502 		list_add_tail_rcu(&rule->list, &old_rule->list);
4503 	} else {
4504 		trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
4505 		if (!trans) {
4506 			err = -ENOMEM;
4507 			goto err_destroy_flow_rule;
4508 		}
4509 
4510 		if (info->nlh->nlmsg_flags & NLM_F_APPEND) {
4511 			if (old_rule)
4512 				list_add_rcu(&rule->list, &old_rule->list);
4513 			else
4514 				list_add_tail_rcu(&rule->list, &chain->rules);
4515 		 } else {
4516 			if (old_rule)
4517 				list_add_tail_rcu(&rule->list, &old_rule->list);
4518 			else
4519 				list_add_rcu(&rule->list, &chain->rules);
4520 		}
4521 	}
4522 	kvfree(expr_info);
4523 
4524 	if (flow)
4525 		nft_trans_flow_rule(trans) = flow;
4526 
4527 	if (table->validate_state == NFT_VALIDATE_DO)
4528 		return nft_table_validate(net, table);
4529 
4530 	return 0;
4531 
4532 err_destroy_flow_rule:
4533 	nft_use_dec_restore(&chain->use);
4534 err_destroy_flow:
4535 	if (flow)
4536 		nft_flow_rule_destroy(flow);
4537 err_release_rule:
4538 	nft_rule_expr_deactivate(&ctx, rule, NFT_TRANS_PREPARE_ERROR);
4539 	nf_tables_rule_destroy(&ctx, rule);
4540 err_release_expr:
4541 	for (i = 0; i < n; i++) {
4542 		if (expr_info[i].ops) {
4543 			module_put(expr_info[i].ops->type->owner);
4544 			if (expr_info[i].ops->type->release_ops)
4545 				expr_info[i].ops->type->release_ops(expr_info[i].ops);
4546 		}
4547 	}
4548 	kvfree(expr_info);
4549 
4550 	return err;
4551 }
4552 
4553 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
4554 					     const struct nft_chain *chain,
4555 					     const struct nlattr *nla)
4556 {
4557 	struct nftables_pernet *nft_net = nft_pernet(net);
4558 	u32 id = ntohl(nla_get_be32(nla));
4559 	struct nft_trans *trans;
4560 
4561 	list_for_each_entry(trans, &nft_net->commit_list, list) {
4562 		if (trans->msg_type == NFT_MSG_NEWRULE &&
4563 		    nft_trans_rule_chain(trans) == chain &&
4564 		    id == nft_trans_rule_id(trans))
4565 			return nft_trans_rule(trans);
4566 	}
4567 	return ERR_PTR(-ENOENT);
4568 }
4569 
4570 static int nf_tables_delrule(struct sk_buff *skb, const struct nfnl_info *info,
4571 			     const struct nlattr * const nla[])
4572 {
4573 	struct netlink_ext_ack *extack = info->extack;
4574 	u8 genmask = nft_genmask_next(info->net);
4575 	u8 family = info->nfmsg->nfgen_family;
4576 	struct nft_chain *chain = NULL;
4577 	struct net *net = info->net;
4578 	struct nft_table *table;
4579 	struct nft_rule *rule;
4580 	struct nft_ctx ctx;
4581 	int err = 0;
4582 
4583 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask,
4584 				 NETLINK_CB(skb).portid);
4585 	if (IS_ERR(table)) {
4586 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
4587 		return PTR_ERR(table);
4588 	}
4589 
4590 	if (nla[NFTA_RULE_CHAIN]) {
4591 		chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN],
4592 					 genmask);
4593 		if (IS_ERR(chain)) {
4594 			if (PTR_ERR(chain) == -ENOENT &&
4595 			    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYRULE)
4596 				return 0;
4597 
4598 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
4599 			return PTR_ERR(chain);
4600 		}
4601 		if (nft_chain_binding(chain))
4602 			return -EOPNOTSUPP;
4603 	}
4604 
4605 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
4606 
4607 	if (chain) {
4608 		if (nla[NFTA_RULE_HANDLE]) {
4609 			rule = nft_rule_lookup(info->net, chain, nla[NFTA_RULE_HANDLE]);
4610 			if (IS_ERR(rule)) {
4611 				if (PTR_ERR(rule) == -ENOENT &&
4612 				    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYRULE)
4613 					return 0;
4614 
4615 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4616 				return PTR_ERR(rule);
4617 			}
4618 
4619 			err = nft_delrule(&ctx, rule);
4620 		} else if (nla[NFTA_RULE_ID]) {
4621 			rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_ID]);
4622 			if (IS_ERR(rule)) {
4623 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_ID]);
4624 				return PTR_ERR(rule);
4625 			}
4626 
4627 			err = nft_delrule(&ctx, rule);
4628 		} else {
4629 			err = nft_delrule_by_chain(&ctx);
4630 		}
4631 	} else {
4632 		list_for_each_entry(chain, &table->chains, list) {
4633 			if (!nft_is_active_next(net, chain))
4634 				continue;
4635 			if (nft_chain_binding(chain))
4636 				continue;
4637 
4638 			ctx.chain = chain;
4639 			err = nft_delrule_by_chain(&ctx);
4640 			if (err < 0)
4641 				break;
4642 		}
4643 	}
4644 
4645 	return err;
4646 }
4647 
4648 /*
4649  * Sets
4650  */
4651 static const struct nft_set_type *nft_set_types[] = {
4652 	&nft_set_hash_fast_type,
4653 	&nft_set_hash_type,
4654 	&nft_set_rhash_type,
4655 	&nft_set_bitmap_type,
4656 	&nft_set_rbtree_type,
4657 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
4658 	&nft_set_pipapo_avx2_type,
4659 #endif
4660 	&nft_set_pipapo_type,
4661 };
4662 
4663 #define NFT_SET_FEATURES	(NFT_SET_INTERVAL | NFT_SET_MAP | \
4664 				 NFT_SET_TIMEOUT | NFT_SET_OBJECT | \
4665 				 NFT_SET_EVAL)
4666 
4667 static bool nft_set_ops_candidate(const struct nft_set_type *type, u32 flags)
4668 {
4669 	return (flags & type->features) == (flags & NFT_SET_FEATURES);
4670 }
4671 
4672 /*
4673  * Select a set implementation based on the data characteristics and the
4674  * given policy. The total memory use might not be known if no size is
4675  * given, in that case the amount of memory per element is used.
4676  */
4677 static const struct nft_set_ops *
4678 nft_select_set_ops(const struct nft_ctx *ctx, u32 flags,
4679 		   const struct nft_set_desc *desc)
4680 {
4681 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
4682 	const struct nft_set_ops *ops, *bops;
4683 	struct nft_set_estimate est, best;
4684 	const struct nft_set_type *type;
4685 	int i;
4686 
4687 	lockdep_assert_held(&nft_net->commit_mutex);
4688 	lockdep_nfnl_nft_mutex_not_held();
4689 
4690 	bops	    = NULL;
4691 	best.size   = ~0;
4692 	best.lookup = ~0;
4693 	best.space  = ~0;
4694 
4695 	for (i = 0; i < ARRAY_SIZE(nft_set_types); i++) {
4696 		type = nft_set_types[i];
4697 		ops = &type->ops;
4698 
4699 		if (!nft_set_ops_candidate(type, flags))
4700 			continue;
4701 		if (!ops->estimate(desc, flags, &est))
4702 			continue;
4703 
4704 		switch (desc->policy) {
4705 		case NFT_SET_POL_PERFORMANCE:
4706 			if (est.lookup < best.lookup)
4707 				break;
4708 			if (est.lookup == best.lookup &&
4709 			    est.space < best.space)
4710 				break;
4711 			continue;
4712 		case NFT_SET_POL_MEMORY:
4713 			if (!desc->size) {
4714 				if (est.space < best.space)
4715 					break;
4716 				if (est.space == best.space &&
4717 				    est.lookup < best.lookup)
4718 					break;
4719 			} else if (est.size < best.size || !bops) {
4720 				break;
4721 			}
4722 			continue;
4723 		default:
4724 			break;
4725 		}
4726 
4727 		bops = ops;
4728 		best = est;
4729 	}
4730 
4731 	if (bops != NULL)
4732 		return bops;
4733 
4734 	return ERR_PTR(-EOPNOTSUPP);
4735 }
4736 
4737 static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
4738 	[NFTA_SET_TABLE]		= { .type = NLA_STRING,
4739 					    .len = NFT_TABLE_MAXNAMELEN - 1 },
4740 	[NFTA_SET_NAME]			= { .type = NLA_STRING,
4741 					    .len = NFT_SET_MAXNAMELEN - 1 },
4742 	[NFTA_SET_FLAGS]		= NLA_POLICY_MASK(NLA_BE32,
4743 							  NFT_SET_ANONYMOUS |
4744 							  NFT_SET_CONSTANT |
4745 							  NFT_SET_INTERVAL |
4746 							  NFT_SET_MAP |
4747 							  NFT_SET_TIMEOUT |
4748 							  NFT_SET_EVAL |
4749 							  NFT_SET_OBJECT |
4750 							  NFT_SET_CONCAT |
4751 							  NFT_SET_EXPR),
4752 	[NFTA_SET_KEY_TYPE]		= { .type = NLA_U32 },
4753 	[NFTA_SET_KEY_LEN]		= { .type = NLA_U32 },
4754 	[NFTA_SET_DATA_TYPE]		= { .type = NLA_U32 },
4755 	[NFTA_SET_DATA_LEN]		= { .type = NLA_U32 },
4756 	[NFTA_SET_POLICY]		= { .type = NLA_U32 },
4757 	[NFTA_SET_DESC]			= { .type = NLA_NESTED },
4758 	[NFTA_SET_ID]			= { .type = NLA_U32 },
4759 	[NFTA_SET_TIMEOUT]		= { .type = NLA_U64 },
4760 	[NFTA_SET_GC_INTERVAL]		= { .type = NLA_U32 },
4761 	[NFTA_SET_USERDATA]		= { .type = NLA_BINARY,
4762 					    .len  = NFT_USERDATA_MAXLEN },
4763 	[NFTA_SET_OBJ_TYPE]		= { .type = NLA_U32 },
4764 	[NFTA_SET_HANDLE]		= { .type = NLA_U64 },
4765 	[NFTA_SET_EXPR]			= { .type = NLA_NESTED },
4766 	[NFTA_SET_EXPRESSIONS]		= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
4767 	[NFTA_SET_TYPE]			= { .type = NLA_REJECT },
4768 	[NFTA_SET_COUNT]		= { .type = NLA_REJECT },
4769 };
4770 
4771 static const struct nla_policy nft_concat_policy[NFTA_SET_FIELD_MAX + 1] = {
4772 	[NFTA_SET_FIELD_LEN]	= { .type = NLA_U32 },
4773 };
4774 
4775 static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = {
4776 	[NFTA_SET_DESC_SIZE]		= { .type = NLA_U32 },
4777 	[NFTA_SET_DESC_CONCAT]		= NLA_POLICY_NESTED_ARRAY(nft_concat_policy),
4778 };
4779 
4780 static struct nft_set *nft_set_lookup(const struct net *net,
4781 				      const struct nft_table *table,
4782 				      const struct nlattr *nla, u8 genmask)
4783 {
4784 	struct nft_set *set;
4785 
4786 	if (nla == NULL)
4787 		return ERR_PTR(-EINVAL);
4788 
4789 	list_for_each_entry_rcu(set, &table->sets, list,
4790 				lockdep_commit_lock_is_held(net)) {
4791 		if (!nla_strcmp(nla, set->name) &&
4792 		    nft_active_genmask(set, genmask))
4793 			return set;
4794 	}
4795 	return ERR_PTR(-ENOENT);
4796 }
4797 
4798 static struct nft_set *nft_set_lookup_byhandle(const struct nft_table *table,
4799 					       const struct nlattr *nla,
4800 					       u8 genmask)
4801 {
4802 	struct nft_set *set;
4803 
4804 	list_for_each_entry(set, &table->sets, list) {
4805 		if (be64_to_cpu(nla_get_be64(nla)) == set->handle &&
4806 		    nft_active_genmask(set, genmask))
4807 			return set;
4808 	}
4809 	return ERR_PTR(-ENOENT);
4810 }
4811 
4812 static struct nft_set *nft_set_lookup_byid(const struct net *net,
4813 					   const struct nft_table *table,
4814 					   const struct nlattr *nla, u8 genmask)
4815 {
4816 	struct nftables_pernet *nft_net = nft_pernet(net);
4817 	u32 id = ntohl(nla_get_be32(nla));
4818 	struct nft_trans_set *trans;
4819 
4820 	/* its likely the id we need is at the tail, not at start */
4821 	list_for_each_entry_reverse(trans, &nft_net->commit_set_list, list_trans_newset) {
4822 		struct nft_set *set = trans->set;
4823 
4824 		if (id == trans->set_id &&
4825 		    set->table == table &&
4826 		    nft_active_genmask(set, genmask))
4827 			return set;
4828 	}
4829 	return ERR_PTR(-ENOENT);
4830 }
4831 
4832 struct nft_set *nft_set_lookup_global(const struct net *net,
4833 				      const struct nft_table *table,
4834 				      const struct nlattr *nla_set_name,
4835 				      const struct nlattr *nla_set_id,
4836 				      u8 genmask)
4837 {
4838 	struct nft_set *set;
4839 
4840 	set = nft_set_lookup(net, table, nla_set_name, genmask);
4841 	if (IS_ERR(set)) {
4842 		if (!nla_set_id)
4843 			return set;
4844 
4845 		set = nft_set_lookup_byid(net, table, nla_set_id, genmask);
4846 	}
4847 	return set;
4848 }
4849 
4850 static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set,
4851 				    const char *name)
4852 {
4853 	const struct nft_set *i;
4854 	const char *p;
4855 	unsigned long *inuse;
4856 	unsigned int n = 0, min = 0;
4857 
4858 	p = strchr(name, '%');
4859 	if (p != NULL) {
4860 		if (p[1] != 'd' || strchr(p + 2, '%'))
4861 			return -EINVAL;
4862 
4863 		if (strnlen(name, NFT_SET_MAX_ANONLEN) >= NFT_SET_MAX_ANONLEN)
4864 			return -EINVAL;
4865 
4866 		inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL);
4867 		if (inuse == NULL)
4868 			return -ENOMEM;
4869 cont:
4870 		list_for_each_entry(i, &ctx->table->sets, list) {
4871 			int tmp;
4872 
4873 			if (!nft_is_active_next(ctx->net, i))
4874 				continue;
4875 			if (!sscanf(i->name, name, &tmp))
4876 				continue;
4877 			if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE)
4878 				continue;
4879 
4880 			set_bit(tmp - min, inuse);
4881 		}
4882 
4883 		n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE);
4884 		if (n >= BITS_PER_BYTE * PAGE_SIZE) {
4885 			min += BITS_PER_BYTE * PAGE_SIZE;
4886 			memset(inuse, 0, PAGE_SIZE);
4887 			goto cont;
4888 		}
4889 		free_page((unsigned long)inuse);
4890 	}
4891 
4892 	set->name = kasprintf(GFP_KERNEL_ACCOUNT, name, min + n);
4893 	if (!set->name)
4894 		return -ENOMEM;
4895 
4896 	list_for_each_entry(i, &ctx->table->sets, list) {
4897 		if (!nft_is_active_next(ctx->net, i))
4898 			continue;
4899 		if (!strcmp(set->name, i->name)) {
4900 			kfree(set->name);
4901 			set->name = NULL;
4902 			return -ENFILE;
4903 		}
4904 	}
4905 	return 0;
4906 }
4907 
4908 int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
4909 {
4910 	u64 ms = be64_to_cpu(nla_get_be64(nla));
4911 	u64 max = (u64)(~((u64)0));
4912 
4913 	max = div_u64(max, NSEC_PER_MSEC);
4914 	if (ms >= max)
4915 		return -ERANGE;
4916 
4917 	ms *= NSEC_PER_MSEC;
4918 	*result = nsecs_to_jiffies64(ms) ? : !!ms;
4919 	return 0;
4920 }
4921 
4922 __be64 nf_jiffies64_to_msecs(u64 input)
4923 {
4924 	return cpu_to_be64(jiffies64_to_msecs(input));
4925 }
4926 
4927 static int nf_tables_fill_set_concat(struct sk_buff *skb,
4928 				     const struct nft_set *set)
4929 {
4930 	struct nlattr *concat, *field;
4931 	int i;
4932 
4933 	concat = nla_nest_start_noflag(skb, NFTA_SET_DESC_CONCAT);
4934 	if (!concat)
4935 		return -ENOMEM;
4936 
4937 	for (i = 0; i < set->field_count; i++) {
4938 		field = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
4939 		if (!field)
4940 			return -ENOMEM;
4941 
4942 		if (nla_put_be32(skb, NFTA_SET_FIELD_LEN,
4943 				 htonl(set->field_len[i])))
4944 			return -ENOMEM;
4945 
4946 		nla_nest_end(skb, field);
4947 	}
4948 
4949 	nla_nest_end(skb, concat);
4950 
4951 	return 0;
4952 }
4953 
4954 static u32 nft_set_userspace_size(const struct nft_set_ops *ops, u32 size)
4955 {
4956 	if (ops->usize)
4957 		return ops->usize(size);
4958 
4959 	return size;
4960 }
4961 
4962 static noinline_for_stack int
4963 nf_tables_fill_set_info(struct sk_buff *skb, const struct nft_set *set)
4964 {
4965 	unsigned int nelems;
4966 	char str[40];
4967 	int ret;
4968 
4969 	ret = snprintf(str, sizeof(str), "%ps", set->ops);
4970 
4971 	/* Not expected to happen and harmless: NFTA_SET_TYPE is dumped
4972 	 * to userspace purely for informational/debug purposes.
4973 	 */
4974 	DEBUG_NET_WARN_ON_ONCE(ret >= sizeof(str));
4975 
4976 	if (nla_put_string(skb, NFTA_SET_TYPE, str))
4977 		return -EMSGSIZE;
4978 
4979 	nelems = nft_set_userspace_size(set->ops, atomic_read(&set->nelems));
4980 	return nla_put_be32(skb, NFTA_SET_COUNT, htonl(nelems));
4981 }
4982 
4983 static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
4984 			      const struct nft_set *set, u16 event, u16 flags)
4985 {
4986 	u64 timeout = READ_ONCE(set->timeout);
4987 	u32 gc_int = READ_ONCE(set->gc_int);
4988 	u32 portid = ctx->portid;
4989 	struct nlmsghdr *nlh;
4990 	struct nlattr *nest;
4991 	u32 seq = ctx->seq;
4992 	int i;
4993 
4994 	nlh = nfnl_msg_put(skb, portid, seq,
4995 			   nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event),
4996 			   flags, ctx->family, NFNETLINK_V0,
4997 			   nft_base_seq_be16(ctx->net));
4998 	if (!nlh)
4999 		goto nla_put_failure;
5000 
5001 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
5002 		goto nla_put_failure;
5003 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
5004 		goto nla_put_failure;
5005 	if (nla_put_be64(skb, NFTA_SET_HANDLE, cpu_to_be64(set->handle),
5006 			 NFTA_SET_PAD))
5007 		goto nla_put_failure;
5008 
5009 	if (event == NFT_MSG_DELSET ||
5010 	    event == NFT_MSG_DESTROYSET) {
5011 		nlmsg_end(skb, nlh);
5012 		return 0;
5013 	}
5014 
5015 	if (set->flags != 0)
5016 		if (nla_put_be32(skb, NFTA_SET_FLAGS, htonl(set->flags)))
5017 			goto nla_put_failure;
5018 
5019 	if (nla_put_be32(skb, NFTA_SET_KEY_TYPE, htonl(set->ktype)))
5020 		goto nla_put_failure;
5021 	if (nla_put_be32(skb, NFTA_SET_KEY_LEN, htonl(set->klen)))
5022 		goto nla_put_failure;
5023 	if (set->flags & NFT_SET_MAP) {
5024 		if (nla_put_be32(skb, NFTA_SET_DATA_TYPE, htonl(set->dtype)))
5025 			goto nla_put_failure;
5026 		if (nla_put_be32(skb, NFTA_SET_DATA_LEN, htonl(set->dlen)))
5027 			goto nla_put_failure;
5028 	}
5029 	if (set->flags & NFT_SET_OBJECT &&
5030 	    nla_put_be32(skb, NFTA_SET_OBJ_TYPE, htonl(set->objtype)))
5031 		goto nla_put_failure;
5032 
5033 	if (timeout &&
5034 	    nla_put_be64(skb, NFTA_SET_TIMEOUT,
5035 			 nf_jiffies64_to_msecs(timeout),
5036 			 NFTA_SET_PAD))
5037 		goto nla_put_failure;
5038 	if (gc_int &&
5039 	    nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(gc_int)))
5040 		goto nla_put_failure;
5041 
5042 	if (set->policy != NFT_SET_POL_PERFORMANCE) {
5043 		if (nla_put_be32(skb, NFTA_SET_POLICY, htonl(set->policy)))
5044 			goto nla_put_failure;
5045 	}
5046 
5047 	if (set->udata &&
5048 	    nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata))
5049 		goto nla_put_failure;
5050 
5051 	nest = nla_nest_start_noflag(skb, NFTA_SET_DESC);
5052 	if (!nest)
5053 		goto nla_put_failure;
5054 	if (set->size &&
5055 	    nla_put_be32(skb, NFTA_SET_DESC_SIZE,
5056 			 htonl(nft_set_userspace_size(set->ops, set->size))))
5057 		goto nla_put_failure;
5058 
5059 	if (set->field_count > 1 &&
5060 	    nf_tables_fill_set_concat(skb, set))
5061 		goto nla_put_failure;
5062 
5063 	nla_nest_end(skb, nest);
5064 
5065 	if (nf_tables_fill_set_info(skb, set))
5066 		goto nla_put_failure;
5067 
5068 	if (set->num_exprs == 1) {
5069 		nest = nla_nest_start_noflag(skb, NFTA_SET_EXPR);
5070 		if (nf_tables_fill_expr_info(skb, set->exprs[0], false) < 0)
5071 			goto nla_put_failure;
5072 
5073 		nla_nest_end(skb, nest);
5074 	} else if (set->num_exprs > 1) {
5075 		nest = nla_nest_start_noflag(skb, NFTA_SET_EXPRESSIONS);
5076 		if (nest == NULL)
5077 			goto nla_put_failure;
5078 
5079 		for (i = 0; i < set->num_exprs; i++) {
5080 			if (nft_expr_dump(skb, NFTA_LIST_ELEM,
5081 					  set->exprs[i], false) < 0)
5082 				goto nla_put_failure;
5083 		}
5084 		nla_nest_end(skb, nest);
5085 	}
5086 
5087 	nlmsg_end(skb, nlh);
5088 	return 0;
5089 
5090 nla_put_failure:
5091 	nlmsg_trim(skb, nlh);
5092 	return -1;
5093 }
5094 
5095 static void nf_tables_set_notify(const struct nft_ctx *ctx,
5096 				 const struct nft_set *set, int event,
5097 			         gfp_t gfp_flags)
5098 {
5099 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
5100 	u32 portid = ctx->portid;
5101 	struct sk_buff *skb;
5102 	u16 flags = 0;
5103 	int err;
5104 
5105 	if (!ctx->report &&
5106 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
5107 		return;
5108 
5109 	skb = nlmsg_new(NLMSG_GOODSIZE, gfp_flags);
5110 	if (skb == NULL)
5111 		goto err;
5112 
5113 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
5114 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
5115 
5116 	err = nf_tables_fill_set(skb, ctx, set, event, flags);
5117 	if (err < 0) {
5118 		kfree_skb(skb);
5119 		goto err;
5120 	}
5121 
5122 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
5123 	return;
5124 err:
5125 	nfnetlink_set_err(ctx->net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
5126 }
5127 
5128 static int nf_tables_dump_sets(struct sk_buff *skb, struct netlink_callback *cb)
5129 {
5130 	const struct nft_set *set;
5131 	unsigned int idx, s_idx = cb->args[0];
5132 	struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2];
5133 	struct net *net = sock_net(skb->sk);
5134 	struct nft_ctx *ctx = cb->data, ctx_set;
5135 	struct nftables_pernet *nft_net;
5136 
5137 	if (cb->args[1])
5138 		return skb->len;
5139 
5140 	rcu_read_lock();
5141 	nft_net = nft_pernet(net);
5142 	cb->seq = nft_base_seq(net);
5143 
5144 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
5145 		if (ctx->family != NFPROTO_UNSPEC &&
5146 		    ctx->family != table->family)
5147 			continue;
5148 
5149 		if (ctx->table && ctx->table != table)
5150 			continue;
5151 
5152 		if (cur_table) {
5153 			if (cur_table != table)
5154 				continue;
5155 
5156 			cur_table = NULL;
5157 		}
5158 		idx = 0;
5159 		list_for_each_entry_rcu(set, &table->sets, list) {
5160 			if (idx < s_idx)
5161 				goto cont;
5162 			if (!nft_is_active(net, set))
5163 				goto cont;
5164 
5165 			ctx_set = *ctx;
5166 			ctx_set.table = table;
5167 			ctx_set.family = table->family;
5168 
5169 			if (nf_tables_fill_set(skb, &ctx_set, set,
5170 					       NFT_MSG_NEWSET,
5171 					       NLM_F_MULTI) < 0) {
5172 				cb->args[0] = idx;
5173 				cb->args[2] = (unsigned long) table;
5174 				goto done;
5175 			}
5176 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
5177 cont:
5178 			idx++;
5179 		}
5180 		if (s_idx)
5181 			s_idx = 0;
5182 	}
5183 	cb->args[1] = 1;
5184 done:
5185 	rcu_read_unlock();
5186 	return skb->len;
5187 }
5188 
5189 static int nf_tables_dump_sets_start(struct netlink_callback *cb)
5190 {
5191 	struct nft_ctx *ctx_dump = NULL;
5192 
5193 	ctx_dump = kmemdup(cb->data, sizeof(*ctx_dump), GFP_ATOMIC);
5194 	if (ctx_dump == NULL)
5195 		return -ENOMEM;
5196 
5197 	cb->data = ctx_dump;
5198 	return 0;
5199 }
5200 
5201 static int nf_tables_dump_sets_done(struct netlink_callback *cb)
5202 {
5203 	kfree(cb->data);
5204 	return 0;
5205 }
5206 
5207 /* called with rcu_read_lock held */
5208 static int nf_tables_getset(struct sk_buff *skb, const struct nfnl_info *info,
5209 			    const struct nlattr * const nla[])
5210 {
5211 	struct netlink_ext_ack *extack = info->extack;
5212 	u8 genmask = nft_genmask_cur(info->net);
5213 	u8 family = info->nfmsg->nfgen_family;
5214 	struct nft_table *table = NULL;
5215 	struct net *net = info->net;
5216 	const struct nft_set *set;
5217 	struct sk_buff *skb2;
5218 	struct nft_ctx ctx;
5219 	int err;
5220 
5221 	if (nla[NFTA_SET_TABLE]) {
5222 		table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family,
5223 					 genmask, 0);
5224 		if (IS_ERR(table)) {
5225 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
5226 			return PTR_ERR(table);
5227 		}
5228 	}
5229 
5230 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
5231 
5232 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
5233 		struct netlink_dump_control c = {
5234 			.start = nf_tables_dump_sets_start,
5235 			.dump = nf_tables_dump_sets,
5236 			.done = nf_tables_dump_sets_done,
5237 			.data = &ctx,
5238 			.module = THIS_MODULE,
5239 		};
5240 
5241 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
5242 	}
5243 
5244 	/* Only accept unspec with dump */
5245 	if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC)
5246 		return -EAFNOSUPPORT;
5247 	if (!nla[NFTA_SET_TABLE])
5248 		return -EINVAL;
5249 
5250 	set = nft_set_lookup(net, table, nla[NFTA_SET_NAME], genmask);
5251 	if (IS_ERR(set)) {
5252 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5253 		return PTR_ERR(set);
5254 	}
5255 
5256 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
5257 	if (skb2 == NULL)
5258 		return -ENOMEM;
5259 
5260 	err = nf_tables_fill_set(skb2, &ctx, set, NFT_MSG_NEWSET, 0);
5261 	if (err < 0)
5262 		goto err_fill_set_info;
5263 
5264 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
5265 
5266 err_fill_set_info:
5267 	kfree_skb(skb2);
5268 	return err;
5269 }
5270 
5271 static int nft_set_desc_concat_parse(const struct nlattr *attr,
5272 				     struct nft_set_desc *desc)
5273 {
5274 	struct nlattr *tb[NFTA_SET_FIELD_MAX + 1];
5275 	u32 len;
5276 	int err;
5277 
5278 	if (desc->field_count >= ARRAY_SIZE(desc->field_len))
5279 		return -E2BIG;
5280 
5281 	err = nla_parse_nested_deprecated(tb, NFTA_SET_FIELD_MAX, attr,
5282 					  nft_concat_policy, NULL);
5283 	if (err < 0)
5284 		return err;
5285 
5286 	if (!tb[NFTA_SET_FIELD_LEN])
5287 		return -EINVAL;
5288 
5289 	len = ntohl(nla_get_be32(tb[NFTA_SET_FIELD_LEN]));
5290 	if (!len || len > U8_MAX)
5291 		return -EINVAL;
5292 
5293 	desc->field_len[desc->field_count++] = len;
5294 
5295 	return 0;
5296 }
5297 
5298 static int nft_set_desc_concat(struct nft_set_desc *desc,
5299 			       const struct nlattr *nla)
5300 {
5301 	u32 len = 0, num_regs;
5302 	struct nlattr *attr;
5303 	int rem, err, i;
5304 
5305 	nla_for_each_nested(attr, nla, rem) {
5306 		if (nla_type(attr) != NFTA_LIST_ELEM)
5307 			return -EINVAL;
5308 
5309 		err = nft_set_desc_concat_parse(attr, desc);
5310 		if (err < 0)
5311 			return err;
5312 	}
5313 
5314 	for (i = 0; i < desc->field_count; i++)
5315 		len += round_up(desc->field_len[i], sizeof(u32));
5316 
5317 	if (len != desc->klen)
5318 		return -EINVAL;
5319 
5320 	num_regs = DIV_ROUND_UP(desc->klen, sizeof(u32));
5321 	if (num_regs > NFT_REG32_COUNT)
5322 		return -E2BIG;
5323 
5324 	return 0;
5325 }
5326 
5327 static int nf_tables_set_desc_parse(struct nft_set_desc *desc,
5328 				    const struct nlattr *nla)
5329 {
5330 	struct nlattr *da[NFTA_SET_DESC_MAX + 1];
5331 	int err;
5332 
5333 	err = nla_parse_nested_deprecated(da, NFTA_SET_DESC_MAX, nla,
5334 					  nft_set_desc_policy, NULL);
5335 	if (err < 0)
5336 		return err;
5337 
5338 	if (da[NFTA_SET_DESC_SIZE] != NULL)
5339 		desc->size = ntohl(nla_get_be32(da[NFTA_SET_DESC_SIZE]));
5340 	if (da[NFTA_SET_DESC_CONCAT])
5341 		err = nft_set_desc_concat(desc, da[NFTA_SET_DESC_CONCAT]);
5342 
5343 	return err;
5344 }
5345 
5346 static int nft_set_expr_alloc(struct nft_ctx *ctx, struct nft_set *set,
5347 			      const struct nlattr * const *nla,
5348 			      struct nft_expr **exprs, int *num_exprs,
5349 			      u32 flags)
5350 {
5351 	struct nft_expr *expr;
5352 	int err, i;
5353 
5354 	if (nla[NFTA_SET_EXPR]) {
5355 		expr = nft_set_elem_expr_alloc(ctx, set, nla[NFTA_SET_EXPR]);
5356 		if (IS_ERR(expr)) {
5357 			err = PTR_ERR(expr);
5358 			goto err_set_expr_alloc;
5359 		}
5360 		exprs[0] = expr;
5361 		(*num_exprs)++;
5362 	} else if (nla[NFTA_SET_EXPRESSIONS]) {
5363 		struct nlattr *tmp;
5364 		int left;
5365 
5366 		if (!(flags & NFT_SET_EXPR)) {
5367 			err = -EINVAL;
5368 			goto err_set_expr_alloc;
5369 		}
5370 		i = 0;
5371 		nla_for_each_nested(tmp, nla[NFTA_SET_EXPRESSIONS], left) {
5372 			if (i == NFT_SET_EXPR_MAX) {
5373 				err = -E2BIG;
5374 				goto err_set_expr_alloc;
5375 			}
5376 			if (nla_type(tmp) != NFTA_LIST_ELEM) {
5377 				err = -EINVAL;
5378 				goto err_set_expr_alloc;
5379 			}
5380 			expr = nft_set_elem_expr_alloc(ctx, set, tmp);
5381 			if (IS_ERR(expr)) {
5382 				err = PTR_ERR(expr);
5383 				goto err_set_expr_alloc;
5384 			}
5385 			exprs[i++] = expr;
5386 			(*num_exprs)++;
5387 		}
5388 	}
5389 
5390 	return 0;
5391 
5392 err_set_expr_alloc:
5393 	for (i = 0; i < *num_exprs; i++)
5394 		nft_expr_destroy(ctx, exprs[i]);
5395 
5396 	return err;
5397 }
5398 
5399 static bool nft_set_is_same(const struct nft_set *set,
5400 			    const struct nft_set_desc *desc,
5401 			    struct nft_expr *exprs[], u32 num_exprs, u32 flags)
5402 {
5403 	int i;
5404 
5405 	if (set->ktype != desc->ktype ||
5406 	    set->dtype != desc->dtype ||
5407 	    set->flags != flags ||
5408 	    set->klen != desc->klen ||
5409 	    set->dlen != desc->dlen ||
5410 	    set->field_count != desc->field_count ||
5411 	    set->num_exprs != num_exprs)
5412 		return false;
5413 
5414 	for (i = 0; i < desc->field_count; i++) {
5415 		if (set->field_len[i] != desc->field_len[i])
5416 			return false;
5417 	}
5418 
5419 	for (i = 0; i < num_exprs; i++) {
5420 		if (set->exprs[i]->ops != exprs[i]->ops)
5421 			return false;
5422 	}
5423 
5424 	return true;
5425 }
5426 
5427 static u32 nft_set_kernel_size(const struct nft_set_ops *ops,
5428 			       const struct nft_set_desc *desc)
5429 {
5430 	if (ops->ksize)
5431 		return ops->ksize(desc->size);
5432 
5433 	return desc->size;
5434 }
5435 
5436 static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
5437 			    const struct nlattr * const nla[])
5438 {
5439 	struct netlink_ext_ack *extack = info->extack;
5440 	u8 genmask = nft_genmask_next(info->net);
5441 	u8 family = info->nfmsg->nfgen_family;
5442 	const struct nft_set_ops *ops;
5443 	struct net *net = info->net;
5444 	struct nft_set_desc desc;
5445 	struct nft_table *table;
5446 	unsigned char *udata;
5447 	struct nft_set *set;
5448 	struct nft_ctx ctx;
5449 	size_t alloc_size;
5450 	int num_exprs = 0;
5451 	char *name;
5452 	int err, i;
5453 	u16 udlen;
5454 	u32 flags;
5455 	u64 size;
5456 
5457 	if (nla[NFTA_SET_TABLE] == NULL ||
5458 	    nla[NFTA_SET_NAME] == NULL ||
5459 	    nla[NFTA_SET_KEY_LEN] == NULL ||
5460 	    nla[NFTA_SET_ID] == NULL)
5461 		return -EINVAL;
5462 
5463 	memset(&desc, 0, sizeof(desc));
5464 
5465 	desc.ktype = NFT_DATA_VALUE;
5466 	if (nla[NFTA_SET_KEY_TYPE] != NULL) {
5467 		desc.ktype = ntohl(nla_get_be32(nla[NFTA_SET_KEY_TYPE]));
5468 		if ((desc.ktype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK)
5469 			return -EINVAL;
5470 	}
5471 
5472 	desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN]));
5473 	if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN)
5474 		return -EINVAL;
5475 
5476 	flags = 0;
5477 	if (nla[NFTA_SET_FLAGS] != NULL) {
5478 		flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
5479 		if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT |
5480 			      NFT_SET_INTERVAL | NFT_SET_TIMEOUT |
5481 			      NFT_SET_MAP | NFT_SET_EVAL |
5482 			      NFT_SET_OBJECT | NFT_SET_CONCAT | NFT_SET_EXPR))
5483 			return -EOPNOTSUPP;
5484 		/* Only one of these operations is supported */
5485 		if ((flags & (NFT_SET_MAP | NFT_SET_OBJECT)) ==
5486 			     (NFT_SET_MAP | NFT_SET_OBJECT))
5487 			return -EOPNOTSUPP;
5488 		if ((flags & (NFT_SET_EVAL | NFT_SET_OBJECT)) ==
5489 			     (NFT_SET_EVAL | NFT_SET_OBJECT))
5490 			return -EOPNOTSUPP;
5491 		if ((flags & (NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT | NFT_SET_EVAL)) ==
5492 			     (NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT))
5493 			return -EOPNOTSUPP;
5494 		if ((flags & (NFT_SET_CONSTANT | NFT_SET_TIMEOUT)) ==
5495 			     (NFT_SET_CONSTANT | NFT_SET_TIMEOUT))
5496 			return -EOPNOTSUPP;
5497 	}
5498 
5499 	desc.dtype = 0;
5500 	if (nla[NFTA_SET_DATA_TYPE] != NULL) {
5501 		if (!(flags & NFT_SET_MAP))
5502 			return -EINVAL;
5503 
5504 		desc.dtype = ntohl(nla_get_be32(nla[NFTA_SET_DATA_TYPE]));
5505 		if ((desc.dtype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK &&
5506 		    desc.dtype != NFT_DATA_VERDICT)
5507 			return -EINVAL;
5508 
5509 		if (desc.dtype != NFT_DATA_VERDICT) {
5510 			if (nla[NFTA_SET_DATA_LEN] == NULL)
5511 				return -EINVAL;
5512 			desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN]));
5513 			if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN)
5514 				return -EINVAL;
5515 		} else
5516 			desc.dlen = sizeof(struct nft_verdict);
5517 	} else if (flags & NFT_SET_MAP)
5518 		return -EINVAL;
5519 
5520 	if (nla[NFTA_SET_OBJ_TYPE] != NULL) {
5521 		if (!(flags & NFT_SET_OBJECT))
5522 			return -EINVAL;
5523 
5524 		desc.objtype = ntohl(nla_get_be32(nla[NFTA_SET_OBJ_TYPE]));
5525 		if (desc.objtype == NFT_OBJECT_UNSPEC ||
5526 		    desc.objtype > NFT_OBJECT_MAX)
5527 			return -EOPNOTSUPP;
5528 	} else if (flags & NFT_SET_OBJECT)
5529 		return -EINVAL;
5530 	else
5531 		desc.objtype = NFT_OBJECT_UNSPEC;
5532 
5533 	desc.timeout = 0;
5534 	if (nla[NFTA_SET_TIMEOUT] != NULL) {
5535 		if (!(flags & NFT_SET_TIMEOUT))
5536 			return -EINVAL;
5537 
5538 		if (flags & NFT_SET_ANONYMOUS)
5539 			return -EOPNOTSUPP;
5540 
5541 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_TIMEOUT], &desc.timeout);
5542 		if (err)
5543 			return err;
5544 	}
5545 	desc.gc_int = 0;
5546 	if (nla[NFTA_SET_GC_INTERVAL] != NULL) {
5547 		if (!(flags & NFT_SET_TIMEOUT))
5548 			return -EINVAL;
5549 
5550 		if (flags & NFT_SET_ANONYMOUS)
5551 			return -EOPNOTSUPP;
5552 
5553 		desc.gc_int = ntohl(nla_get_be32(nla[NFTA_SET_GC_INTERVAL]));
5554 	}
5555 
5556 	desc.policy = NFT_SET_POL_PERFORMANCE;
5557 	if (nla[NFTA_SET_POLICY] != NULL) {
5558 		desc.policy = ntohl(nla_get_be32(nla[NFTA_SET_POLICY]));
5559 		switch (desc.policy) {
5560 		case NFT_SET_POL_PERFORMANCE:
5561 		case NFT_SET_POL_MEMORY:
5562 			break;
5563 		default:
5564 			return -EOPNOTSUPP;
5565 		}
5566 	}
5567 
5568 	if (nla[NFTA_SET_DESC] != NULL) {
5569 		err = nf_tables_set_desc_parse(&desc, nla[NFTA_SET_DESC]);
5570 		if (err < 0)
5571 			return err;
5572 
5573 		if (desc.field_count > 1) {
5574 			if (!(flags & NFT_SET_CONCAT))
5575 				return -EINVAL;
5576 		} else if (flags & NFT_SET_CONCAT) {
5577 			return -EINVAL;
5578 		}
5579 	} else if (flags & NFT_SET_CONCAT) {
5580 		return -EINVAL;
5581 	}
5582 
5583 	if (nla[NFTA_SET_EXPR] || nla[NFTA_SET_EXPRESSIONS])
5584 		desc.expr = true;
5585 
5586 	table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, genmask,
5587 				 NETLINK_CB(skb).portid);
5588 	if (IS_ERR(table)) {
5589 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
5590 		return PTR_ERR(table);
5591 	}
5592 
5593 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
5594 
5595 	set = nft_set_lookup(net, table, nla[NFTA_SET_NAME], genmask);
5596 	if (IS_ERR(set)) {
5597 		if (PTR_ERR(set) != -ENOENT) {
5598 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5599 			return PTR_ERR(set);
5600 		}
5601 	} else {
5602 		struct nft_expr *exprs[NFT_SET_EXPR_MAX] = {};
5603 
5604 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
5605 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5606 			return -EEXIST;
5607 		}
5608 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
5609 			return -EOPNOTSUPP;
5610 
5611 		if (nft_set_is_anonymous(set))
5612 			return -EOPNOTSUPP;
5613 
5614 		err = nft_set_expr_alloc(&ctx, set, nla, exprs, &num_exprs, flags);
5615 		if (err < 0)
5616 			return err;
5617 
5618 		if (desc.size)
5619 			desc.size = nft_set_kernel_size(set->ops, &desc);
5620 
5621 		err = 0;
5622 		if (!nft_set_is_same(set, &desc, exprs, num_exprs, flags)) {
5623 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5624 			err = -EEXIST;
5625 		}
5626 
5627 		for (i = 0; i < num_exprs; i++)
5628 			nft_expr_destroy(&ctx, exprs[i]);
5629 
5630 		if (err < 0)
5631 			return err;
5632 
5633 		return __nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set, &desc);
5634 	}
5635 
5636 	if (!(info->nlh->nlmsg_flags & NLM_F_CREATE))
5637 		return -ENOENT;
5638 
5639 	ops = nft_select_set_ops(&ctx, flags, &desc);
5640 	if (IS_ERR(ops))
5641 		return PTR_ERR(ops);
5642 
5643 	if (desc.size)
5644 		desc.size = nft_set_kernel_size(ops, &desc);
5645 
5646 	udlen = 0;
5647 	if (nla[NFTA_SET_USERDATA])
5648 		udlen = nla_len(nla[NFTA_SET_USERDATA]);
5649 
5650 	size = 0;
5651 	if (ops->privsize != NULL)
5652 		size = ops->privsize(nla, &desc);
5653 	alloc_size = sizeof(*set) + size + udlen;
5654 	if (alloc_size < size || alloc_size > INT_MAX)
5655 		return -ENOMEM;
5656 
5657 	if (!nft_use_inc(&table->use))
5658 		return -EMFILE;
5659 
5660 	set = kvzalloc(alloc_size, GFP_KERNEL_ACCOUNT);
5661 	if (!set) {
5662 		err = -ENOMEM;
5663 		goto err_alloc;
5664 	}
5665 
5666 	name = nla_strdup(nla[NFTA_SET_NAME], GFP_KERNEL_ACCOUNT);
5667 	if (!name) {
5668 		err = -ENOMEM;
5669 		goto err_set_name;
5670 	}
5671 
5672 	err = nf_tables_set_alloc_name(&ctx, set, name);
5673 	kfree(name);
5674 	if (err < 0)
5675 		goto err_set_name;
5676 
5677 	udata = NULL;
5678 	if (udlen) {
5679 		udata = set->data + size;
5680 		nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen);
5681 	}
5682 
5683 	INIT_LIST_HEAD(&set->bindings);
5684 	INIT_LIST_HEAD(&set->catchall_list);
5685 	refcount_set(&set->refs, 1);
5686 	set->table = table;
5687 	write_pnet(&set->net, net);
5688 	set->ops = ops;
5689 	set->ktype = desc.ktype;
5690 	set->klen = desc.klen;
5691 	set->dtype = desc.dtype;
5692 	set->objtype = desc.objtype;
5693 	set->dlen = desc.dlen;
5694 	set->flags = flags;
5695 	set->size = desc.size;
5696 	set->policy = desc.policy;
5697 	set->udlen = udlen;
5698 	set->udata = udata;
5699 	set->timeout = desc.timeout;
5700 	set->gc_int = desc.gc_int;
5701 
5702 	set->field_count = desc.field_count;
5703 	for (i = 0; i < desc.field_count; i++)
5704 		set->field_len[i] = desc.field_len[i];
5705 
5706 	err = ops->init(set, &desc, nla);
5707 	if (err < 0)
5708 		goto err_set_init;
5709 
5710 	err = nft_set_expr_alloc(&ctx, set, nla, set->exprs, &num_exprs, flags);
5711 	if (err < 0)
5712 		goto err_set_destroy;
5713 
5714 	set->num_exprs = num_exprs;
5715 	set->handle = nf_tables_alloc_handle(table);
5716 	INIT_LIST_HEAD(&set->pending_update);
5717 
5718 	err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
5719 	if (err < 0)
5720 		goto err_set_expr_alloc;
5721 
5722 	list_add_tail_rcu(&set->list, &table->sets);
5723 
5724 	return 0;
5725 
5726 err_set_expr_alloc:
5727 	for (i = 0; i < set->num_exprs; i++)
5728 		nft_expr_destroy(&ctx, set->exprs[i]);
5729 err_set_destroy:
5730 	ops->destroy(&ctx, set);
5731 err_set_init:
5732 	kfree(set->name);
5733 err_set_name:
5734 	kvfree(set);
5735 err_alloc:
5736 	nft_use_dec_restore(&table->use);
5737 
5738 	return err;
5739 }
5740 
5741 static void nft_set_catchall_destroy(const struct nft_ctx *ctx,
5742 				     struct nft_set *set)
5743 {
5744 	struct nft_set_elem_catchall *next, *catchall;
5745 
5746 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
5747 		list_del_rcu(&catchall->list);
5748 		nf_tables_set_elem_destroy(ctx, set, catchall->elem);
5749 		kfree_rcu(catchall, rcu);
5750 	}
5751 }
5752 
5753 static void nft_set_put(struct nft_set *set)
5754 {
5755 	if (refcount_dec_and_test(&set->refs)) {
5756 		kfree(set->name);
5757 		kvfree(set);
5758 	}
5759 }
5760 
5761 static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
5762 {
5763 	int i;
5764 
5765 	if (WARN_ON(set->use > 0))
5766 		return;
5767 
5768 	for (i = 0; i < set->num_exprs; i++)
5769 		nft_expr_destroy(ctx, set->exprs[i]);
5770 
5771 	set->ops->destroy(ctx, set);
5772 	nft_set_catchall_destroy(ctx, set);
5773 	nft_set_put(set);
5774 }
5775 
5776 static int nf_tables_delset(struct sk_buff *skb, const struct nfnl_info *info,
5777 			    const struct nlattr * const nla[])
5778 {
5779 	struct netlink_ext_ack *extack = info->extack;
5780 	u8 genmask = nft_genmask_next(info->net);
5781 	u8 family = info->nfmsg->nfgen_family;
5782 	struct net *net = info->net;
5783 	const struct nlattr *attr;
5784 	struct nft_table *table;
5785 	struct nft_set *set;
5786 	struct nft_ctx ctx;
5787 
5788 	if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC)
5789 		return -EAFNOSUPPORT;
5790 
5791 	table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family,
5792 				 genmask, NETLINK_CB(skb).portid);
5793 	if (IS_ERR(table)) {
5794 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
5795 		return PTR_ERR(table);
5796 	}
5797 
5798 	if (nla[NFTA_SET_HANDLE]) {
5799 		attr = nla[NFTA_SET_HANDLE];
5800 		set = nft_set_lookup_byhandle(table, attr, genmask);
5801 	} else {
5802 		attr = nla[NFTA_SET_NAME];
5803 		set = nft_set_lookup(net, table, attr, genmask);
5804 	}
5805 
5806 	if (IS_ERR(set)) {
5807 		if (PTR_ERR(set) == -ENOENT &&
5808 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYSET)
5809 			return 0;
5810 
5811 		NL_SET_BAD_ATTR(extack, attr);
5812 		return PTR_ERR(set);
5813 	}
5814 	if (set->use ||
5815 	    (info->nlh->nlmsg_flags & NLM_F_NONREC &&
5816 	     atomic_read(&set->nelems) > 0)) {
5817 		NL_SET_BAD_ATTR(extack, attr);
5818 		return -EBUSY;
5819 	}
5820 
5821 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
5822 
5823 	return nft_delset(&ctx, set);
5824 }
5825 
5826 static int nft_validate_register_store(const struct nft_ctx *ctx,
5827 				       enum nft_registers reg,
5828 				       const struct nft_data *data,
5829 				       enum nft_data_types type,
5830 				       unsigned int len);
5831 
5832 static int nft_setelem_data_validate(const struct nft_ctx *ctx,
5833 				     struct nft_set *set,
5834 				     struct nft_elem_priv *elem_priv)
5835 {
5836 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5837 	enum nft_registers dreg;
5838 
5839 	dreg = nft_type_to_reg(set->dtype);
5840 	return nft_validate_register_store(ctx, dreg, nft_set_ext_data(ext),
5841 					   set->dtype == NFT_DATA_VERDICT ?
5842 					   NFT_DATA_VERDICT : NFT_DATA_VALUE,
5843 					   set->dlen);
5844 }
5845 
5846 static int nf_tables_bind_check_setelem(const struct nft_ctx *ctx,
5847 					struct nft_set *set,
5848 					const struct nft_set_iter *iter,
5849 					struct nft_elem_priv *elem_priv)
5850 {
5851 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5852 
5853 	if (!nft_set_elem_active(ext, iter->genmask))
5854 		return 0;
5855 
5856 	return nft_setelem_data_validate(ctx, set, elem_priv);
5857 }
5858 
5859 static int nft_set_catchall_bind_check(const struct nft_ctx *ctx,
5860 				       struct nft_set *set)
5861 {
5862 	u8 genmask = nft_genmask_next(ctx->net);
5863 	struct nft_set_elem_catchall *catchall;
5864 	struct nft_set_ext *ext;
5865 	int ret = 0;
5866 
5867 	list_for_each_entry_rcu(catchall, &set->catchall_list, list,
5868 				lockdep_commit_lock_is_held(ctx->net)) {
5869 		ext = nft_set_elem_ext(set, catchall->elem);
5870 		if (!nft_set_elem_active(ext, genmask))
5871 			continue;
5872 
5873 		ret = nft_setelem_data_validate(ctx, set, catchall->elem);
5874 		if (ret < 0)
5875 			break;
5876 	}
5877 
5878 	return ret;
5879 }
5880 
5881 int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
5882 		       struct nft_set_binding *binding)
5883 {
5884 	struct nft_set_binding *i;
5885 	struct nft_set_iter iter = {
5886 		.genmask	= nft_genmask_next(ctx->net),
5887 		.type		= NFT_ITER_UPDATE,
5888 		.fn		= nf_tables_bind_check_setelem,
5889 	};
5890 
5891 	if (!list_empty(&set->bindings) && nft_set_is_anonymous(set))
5892 		return -EBUSY;
5893 
5894 	if (binding->flags & NFT_SET_MAP) {
5895 		/* If the set is already bound to the same chain all
5896 		 * jumps are already validated for that chain.
5897 		 */
5898 		list_for_each_entry(i, &set->bindings, list) {
5899 			if (i->flags & NFT_SET_MAP &&
5900 			    i->chain == binding->chain)
5901 				goto bind;
5902 		}
5903 
5904 		set->ops->walk(ctx, set, &iter);
5905 		if (!iter.err)
5906 			iter.err = nft_set_catchall_bind_check(ctx, set);
5907 
5908 		if (iter.err < 0)
5909 			return iter.err;
5910 	}
5911 bind:
5912 	if (!nft_use_inc(&set->use))
5913 		return -EMFILE;
5914 
5915 	binding->chain = ctx->chain;
5916 	list_add_tail_rcu(&binding->list, &set->bindings);
5917 	nft_set_trans_bind(ctx, set);
5918 
5919 	return 0;
5920 }
5921 
5922 static void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
5923 				 struct nft_set_binding *binding, bool event)
5924 {
5925 	list_del_rcu(&binding->list);
5926 
5927 	if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) {
5928 		list_del_rcu(&set->list);
5929 		set->dead = 1;
5930 		if (event)
5931 			nf_tables_set_notify(ctx, set, NFT_MSG_DELSET,
5932 					     GFP_KERNEL);
5933 	}
5934 }
5935 
5936 static void nft_setelem_data_activate(const struct net *net,
5937 				      const struct nft_set *set,
5938 				      struct nft_elem_priv *elem_priv);
5939 
5940 static int nft_mapelem_activate(const struct nft_ctx *ctx,
5941 				struct nft_set *set,
5942 				const struct nft_set_iter *iter,
5943 				struct nft_elem_priv *elem_priv)
5944 {
5945 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5946 
5947 	/* called from abort path, reverse check to undo changes. */
5948 	if (nft_set_elem_active(ext, iter->genmask))
5949 		return 0;
5950 
5951 	nft_clear(ctx->net, ext);
5952 	nft_setelem_data_activate(ctx->net, set, elem_priv);
5953 
5954 	return 0;
5955 }
5956 
5957 static void nft_map_catchall_activate(const struct nft_ctx *ctx,
5958 				      struct nft_set *set)
5959 {
5960 	u8 genmask = nft_genmask_next(ctx->net);
5961 	struct nft_set_elem_catchall *catchall;
5962 	struct nft_set_ext *ext;
5963 
5964 	list_for_each_entry(catchall, &set->catchall_list, list) {
5965 		ext = nft_set_elem_ext(set, catchall->elem);
5966 		if (nft_set_elem_active(ext, genmask))
5967 			continue;
5968 
5969 		nft_clear(ctx->net, ext);
5970 		nft_setelem_data_activate(ctx->net, set, catchall->elem);
5971 	}
5972 }
5973 
5974 static void nft_map_activate(const struct nft_ctx *ctx, struct nft_set *set)
5975 {
5976 	struct nft_set_iter iter = {
5977 		.genmask	= nft_genmask_next(ctx->net),
5978 		.type		= NFT_ITER_UPDATE,
5979 		.fn		= nft_mapelem_activate,
5980 	};
5981 
5982 	set->ops->walk(ctx, set, &iter);
5983 	WARN_ON_ONCE(iter.err);
5984 
5985 	nft_map_catchall_activate(ctx, set);
5986 }
5987 
5988 void nf_tables_activate_set(const struct nft_ctx *ctx, struct nft_set *set)
5989 {
5990 	if (nft_set_is_anonymous(set)) {
5991 		if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
5992 			nft_map_activate(ctx, set);
5993 
5994 		nft_clear(ctx->net, set);
5995 	}
5996 
5997 	nft_use_inc_restore(&set->use);
5998 }
5999 
6000 void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set,
6001 			      struct nft_set_binding *binding,
6002 			      enum nft_trans_phase phase)
6003 {
6004 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(ctx->net));
6005 
6006 	switch (phase) {
6007 	case NFT_TRANS_PREPARE_ERROR:
6008 		nft_set_trans_unbind(ctx, set);
6009 		if (nft_set_is_anonymous(set))
6010 			nft_deactivate_next(ctx->net, set);
6011 		else
6012 			list_del_rcu(&binding->list);
6013 
6014 		nft_use_dec(&set->use);
6015 		break;
6016 	case NFT_TRANS_PREPARE:
6017 		if (nft_set_is_anonymous(set)) {
6018 			if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
6019 				nft_map_deactivate(ctx, set);
6020 
6021 			nft_deactivate_next(ctx->net, set);
6022 		}
6023 		nft_use_dec(&set->use);
6024 		return;
6025 	case NFT_TRANS_ABORT:
6026 	case NFT_TRANS_RELEASE:
6027 		if (nft_set_is_anonymous(set) &&
6028 		    set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
6029 			nft_map_deactivate(ctx, set);
6030 
6031 		nft_use_dec(&set->use);
6032 		fallthrough;
6033 	default:
6034 		nf_tables_unbind_set(ctx, set, binding,
6035 				     phase == NFT_TRANS_COMMIT);
6036 	}
6037 }
6038 
6039 void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set)
6040 {
6041 	if (list_empty(&set->bindings) && nft_set_is_anonymous(set))
6042 		nft_set_destroy(ctx, set);
6043 }
6044 
6045 const struct nft_set_ext_type nft_set_ext_types[] = {
6046 	[NFT_SET_EXT_KEY]		= {
6047 		.align	= __alignof__(u32),
6048 	},
6049 	[NFT_SET_EXT_DATA]		= {
6050 		.align	= __alignof__(u32),
6051 	},
6052 	[NFT_SET_EXT_EXPRESSIONS]	= {
6053 		.align	= __alignof__(struct nft_set_elem_expr),
6054 	},
6055 	[NFT_SET_EXT_OBJREF]		= {
6056 		.len	= sizeof(struct nft_object *),
6057 		.align	= __alignof__(struct nft_object *),
6058 	},
6059 	[NFT_SET_EXT_FLAGS]		= {
6060 		.len	= sizeof(u8),
6061 		.align	= __alignof__(u8),
6062 	},
6063 	[NFT_SET_EXT_TIMEOUT]		= {
6064 		.len	= sizeof(struct nft_timeout),
6065 		.align	= __alignof__(struct nft_timeout),
6066 	},
6067 	[NFT_SET_EXT_USERDATA]		= {
6068 		.len	= sizeof(struct nft_userdata),
6069 		.align	= __alignof__(struct nft_userdata),
6070 	},
6071 	[NFT_SET_EXT_KEY_END]		= {
6072 		.align	= __alignof__(u32),
6073 	},
6074 };
6075 
6076 /*
6077  * Set elements
6078  */
6079 
6080 static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = {
6081 	[NFTA_SET_ELEM_KEY]		= { .type = NLA_NESTED },
6082 	[NFTA_SET_ELEM_DATA]		= { .type = NLA_NESTED },
6083 	[NFTA_SET_ELEM_FLAGS]		= NLA_POLICY_MASK(NLA_BE32, NFT_SET_ELEM_INTERVAL_END |
6084 								    NFT_SET_ELEM_CATCHALL),
6085 	[NFTA_SET_ELEM_TIMEOUT]		= { .type = NLA_U64 },
6086 	[NFTA_SET_ELEM_EXPIRATION]	= { .type = NLA_U64 },
6087 	[NFTA_SET_ELEM_USERDATA]	= { .type = NLA_BINARY,
6088 					    .len = NFT_USERDATA_MAXLEN },
6089 	[NFTA_SET_ELEM_EXPR]		= { .type = NLA_NESTED },
6090 	[NFTA_SET_ELEM_OBJREF]		= { .type = NLA_STRING,
6091 					    .len = NFT_OBJ_MAXNAMELEN - 1 },
6092 	[NFTA_SET_ELEM_KEY_END]		= { .type = NLA_NESTED },
6093 	[NFTA_SET_ELEM_EXPRESSIONS]	= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
6094 };
6095 
6096 static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = {
6097 	[NFTA_SET_ELEM_LIST_TABLE]	= { .type = NLA_STRING,
6098 					    .len = NFT_TABLE_MAXNAMELEN - 1 },
6099 	[NFTA_SET_ELEM_LIST_SET]	= { .type = NLA_STRING,
6100 					    .len = NFT_SET_MAXNAMELEN - 1 },
6101 	[NFTA_SET_ELEM_LIST_ELEMENTS]	= NLA_POLICY_NESTED_ARRAY(nft_set_elem_policy),
6102 	[NFTA_SET_ELEM_LIST_SET_ID]	= { .type = NLA_U32 },
6103 };
6104 
6105 static int nft_set_elem_expr_dump(struct sk_buff *skb,
6106 				  const struct nft_set *set,
6107 				  const struct nft_set_ext *ext,
6108 				  bool reset)
6109 {
6110 	struct nft_set_elem_expr *elem_expr;
6111 	u32 size, num_exprs = 0;
6112 	struct nft_expr *expr;
6113 	struct nlattr *nest;
6114 
6115 	elem_expr = nft_set_ext_expr(ext);
6116 	nft_setelem_expr_foreach(expr, elem_expr, size)
6117 		num_exprs++;
6118 
6119 	if (num_exprs == 1) {
6120 		expr = nft_setelem_expr_at(elem_expr, 0);
6121 		if (nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, expr, reset) < 0)
6122 			return -1;
6123 
6124 		return 0;
6125 	} else if (num_exprs > 1) {
6126 		nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_EXPRESSIONS);
6127 		if (nest == NULL)
6128 			goto nla_put_failure;
6129 
6130 		nft_setelem_expr_foreach(expr, elem_expr, size) {
6131 			expr = nft_setelem_expr_at(elem_expr, size);
6132 			if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, reset) < 0)
6133 				goto nla_put_failure;
6134 		}
6135 		nla_nest_end(skb, nest);
6136 	}
6137 	return 0;
6138 
6139 nla_put_failure:
6140 	return -1;
6141 }
6142 
6143 static int nf_tables_fill_setelem(struct sk_buff *skb,
6144 				  const struct nft_set *set,
6145 				  const struct nft_elem_priv *elem_priv,
6146 				  bool reset)
6147 {
6148 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6149 	unsigned char *b = skb_tail_pointer(skb);
6150 	struct nlattr *nest;
6151 
6152 	nest = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
6153 	if (nest == NULL)
6154 		goto nla_put_failure;
6155 
6156 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) &&
6157 	    nft_data_dump(skb, NFTA_SET_ELEM_KEY, nft_set_ext_key(ext),
6158 			  NFT_DATA_VALUE, set->klen) < 0)
6159 		goto nla_put_failure;
6160 
6161 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) &&
6162 	    nft_data_dump(skb, NFTA_SET_ELEM_KEY_END, nft_set_ext_key_end(ext),
6163 			  NFT_DATA_VALUE, set->klen) < 0)
6164 		goto nla_put_failure;
6165 
6166 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
6167 	    nft_data_dump(skb, NFTA_SET_ELEM_DATA, nft_set_ext_data(ext),
6168 			  nft_set_datatype(set), set->dlen) < 0)
6169 		goto nla_put_failure;
6170 
6171 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS) &&
6172 	    nft_set_elem_expr_dump(skb, set, ext, reset))
6173 		goto nla_put_failure;
6174 
6175 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
6176 	    nla_put_string(skb, NFTA_SET_ELEM_OBJREF,
6177 			   (*nft_set_ext_obj(ext))->key.name) < 0)
6178 		goto nla_put_failure;
6179 
6180 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
6181 	    nla_put_be32(skb, NFTA_SET_ELEM_FLAGS,
6182 		         htonl(*nft_set_ext_flags(ext))))
6183 		goto nla_put_failure;
6184 
6185 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) {
6186 		u64 timeout = READ_ONCE(nft_set_ext_timeout(ext)->timeout);
6187 		u64 set_timeout = READ_ONCE(set->timeout);
6188 		__be64 msecs = 0;
6189 
6190 		if (set_timeout != timeout) {
6191 			msecs = nf_jiffies64_to_msecs(timeout);
6192 			if (nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT, msecs,
6193 					 NFTA_SET_ELEM_PAD))
6194 				goto nla_put_failure;
6195 		}
6196 
6197 		if (timeout > 0) {
6198 			u64 expires, now = get_jiffies_64();
6199 
6200 			expires = READ_ONCE(nft_set_ext_timeout(ext)->expiration);
6201 			if (time_before64(now, expires))
6202 				expires -= now;
6203 			else
6204 				expires = 0;
6205 
6206 			if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION,
6207 					 nf_jiffies64_to_msecs(expires),
6208 					 NFTA_SET_ELEM_PAD))
6209 				goto nla_put_failure;
6210 		}
6211 	}
6212 
6213 	if (nft_set_ext_exists(ext, NFT_SET_EXT_USERDATA)) {
6214 		struct nft_userdata *udata;
6215 
6216 		udata = nft_set_ext_userdata(ext);
6217 		if (nla_put(skb, NFTA_SET_ELEM_USERDATA,
6218 			    udata->len + 1, udata->data))
6219 			goto nla_put_failure;
6220 	}
6221 
6222 	nla_nest_end(skb, nest);
6223 	return 0;
6224 
6225 nla_put_failure:
6226 	nlmsg_trim(skb, b);
6227 	return -EMSGSIZE;
6228 }
6229 
6230 struct nft_set_dump_args {
6231 	const struct netlink_callback	*cb;
6232 	struct nft_set_iter		iter;
6233 	struct sk_buff			*skb;
6234 	bool				reset;
6235 };
6236 
6237 static int nf_tables_dump_setelem(const struct nft_ctx *ctx,
6238 				  struct nft_set *set,
6239 				  const struct nft_set_iter *iter,
6240 				  struct nft_elem_priv *elem_priv)
6241 {
6242 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6243 	struct nft_set_dump_args *args;
6244 
6245 	if (!nft_set_elem_active(ext, iter->genmask))
6246 		return 0;
6247 
6248 	if (nft_set_elem_expired(ext) || nft_set_elem_is_dead(ext))
6249 		return 0;
6250 
6251 	args = container_of(iter, struct nft_set_dump_args, iter);
6252 	return nf_tables_fill_setelem(args->skb, set, elem_priv, args->reset);
6253 }
6254 
6255 static void audit_log_nft_set_reset(const struct nft_table *table,
6256 				    unsigned int base_seq,
6257 				    unsigned int nentries)
6258 {
6259 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, base_seq);
6260 
6261 	audit_log_nfcfg(buf, table->family, nentries,
6262 			AUDIT_NFT_OP_SETELEM_RESET, GFP_ATOMIC);
6263 	kfree(buf);
6264 }
6265 
6266 struct nft_set_dump_ctx {
6267 	const struct nft_set	*set;
6268 	struct nft_ctx		ctx;
6269 	bool			reset;
6270 };
6271 
6272 static int nft_set_catchall_dump(struct net *net, struct sk_buff *skb,
6273 				 const struct nft_set *set, bool reset,
6274 				 unsigned int base_seq)
6275 {
6276 	struct nft_set_elem_catchall *catchall;
6277 	u8 genmask = nft_genmask_cur(net);
6278 	struct nft_set_ext *ext;
6279 	int ret = 0;
6280 
6281 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
6282 		ext = nft_set_elem_ext(set, catchall->elem);
6283 		if (!nft_set_elem_active(ext, genmask) ||
6284 		    nft_set_elem_expired(ext))
6285 			continue;
6286 
6287 		ret = nf_tables_fill_setelem(skb, set, catchall->elem, reset);
6288 		if (reset && !ret)
6289 			audit_log_nft_set_reset(set->table, base_seq, 1);
6290 		break;
6291 	}
6292 
6293 	return ret;
6294 }
6295 
6296 static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb)
6297 {
6298 	struct nft_set_dump_ctx *dump_ctx = cb->data;
6299 	struct net *net = sock_net(skb->sk);
6300 	struct nftables_pernet *nft_net;
6301 	struct nft_table *table;
6302 	struct nft_set *set;
6303 	struct nft_set_dump_args args = {
6304 		.cb = cb,
6305 		.skb = skb,
6306 		.reset = dump_ctx->reset,
6307 		.iter = {
6308 			.genmask = nft_genmask_cur(net),
6309 			.type = NFT_ITER_READ,
6310 			.skip = cb->args[0],
6311 			.fn = nf_tables_dump_setelem,
6312 		},
6313 	};
6314 	bool set_found = false;
6315 	struct nlmsghdr *nlh;
6316 	struct nlattr *nest;
6317 	u32 portid, seq;
6318 	int event;
6319 
6320 	rcu_read_lock();
6321 	nft_net = nft_pernet(net);
6322 	cb->seq = nft_base_seq(net);
6323 
6324 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
6325 		if (dump_ctx->ctx.family != NFPROTO_UNSPEC &&
6326 		    dump_ctx->ctx.family != table->family)
6327 			continue;
6328 
6329 		if (table != dump_ctx->ctx.table)
6330 			continue;
6331 
6332 		list_for_each_entry_rcu(set, &table->sets, list) {
6333 			if (set == dump_ctx->set) {
6334 				set_found = true;
6335 				break;
6336 			}
6337 		}
6338 		break;
6339 	}
6340 
6341 	if (!set_found) {
6342 		rcu_read_unlock();
6343 		return -ENOENT;
6344 	}
6345 
6346 	event  = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWSETELEM);
6347 	portid = NETLINK_CB(cb->skb).portid;
6348 	seq    = cb->nlh->nlmsg_seq;
6349 
6350 	nlh = nfnl_msg_put(skb, portid, seq, event, NLM_F_MULTI,
6351 			   table->family, NFNETLINK_V0, nft_base_seq_be16(net));
6352 	if (!nlh)
6353 		goto nla_put_failure;
6354 
6355 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_TABLE, table->name))
6356 		goto nla_put_failure;
6357 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_SET, set->name))
6358 		goto nla_put_failure;
6359 
6360 	nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
6361 	if (nest == NULL)
6362 		goto nla_put_failure;
6363 
6364 	set->ops->walk(&dump_ctx->ctx, set, &args.iter);
6365 
6366 	if (!args.iter.err && args.iter.count == cb->args[0])
6367 		args.iter.err = nft_set_catchall_dump(net, skb, set,
6368 						      dump_ctx->reset, cb->seq);
6369 	nla_nest_end(skb, nest);
6370 	nlmsg_end(skb, nlh);
6371 
6372 	if (dump_ctx->reset && args.iter.count > args.iter.skip)
6373 		audit_log_nft_set_reset(table, cb->seq,
6374 					args.iter.count - args.iter.skip);
6375 
6376 	rcu_read_unlock();
6377 
6378 	if (args.iter.err && args.iter.err != -EMSGSIZE)
6379 		return args.iter.err;
6380 	if (args.iter.count == cb->args[0])
6381 		return 0;
6382 
6383 	cb->args[0] = args.iter.count;
6384 	return skb->len;
6385 
6386 nla_put_failure:
6387 	rcu_read_unlock();
6388 	return -ENOSPC;
6389 }
6390 
6391 static int nf_tables_dump_set_start(struct netlink_callback *cb)
6392 {
6393 	struct nft_set_dump_ctx *dump_ctx = cb->data;
6394 
6395 	cb->data = kmemdup(dump_ctx, sizeof(*dump_ctx), GFP_ATOMIC);
6396 
6397 	return cb->data ? 0 : -ENOMEM;
6398 }
6399 
6400 static int nf_tables_dump_set_done(struct netlink_callback *cb)
6401 {
6402 	kfree(cb->data);
6403 	return 0;
6404 }
6405 
6406 static int nf_tables_fill_setelem_info(struct sk_buff *skb,
6407 				       const struct nft_ctx *ctx, u32 seq,
6408 				       u32 portid, int event, u16 flags,
6409 				       const struct nft_set *set,
6410 				       const struct nft_elem_priv *elem_priv,
6411 				       bool reset)
6412 {
6413 	struct nlmsghdr *nlh;
6414 	struct nlattr *nest;
6415 	int err;
6416 
6417 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
6418 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, ctx->family,
6419 			   NFNETLINK_V0, nft_base_seq_be16(ctx->net));
6420 	if (!nlh)
6421 		goto nla_put_failure;
6422 
6423 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
6424 		goto nla_put_failure;
6425 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
6426 		goto nla_put_failure;
6427 
6428 	nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
6429 	if (nest == NULL)
6430 		goto nla_put_failure;
6431 
6432 	err = nf_tables_fill_setelem(skb, set, elem_priv, reset);
6433 	if (err < 0)
6434 		goto nla_put_failure;
6435 
6436 	nla_nest_end(skb, nest);
6437 
6438 	nlmsg_end(skb, nlh);
6439 	return 0;
6440 
6441 nla_put_failure:
6442 	nlmsg_trim(skb, nlh);
6443 	return -1;
6444 }
6445 
6446 static int nft_setelem_parse_flags(const struct nft_set *set,
6447 				   const struct nlattr *attr, u32 *flags)
6448 {
6449 	if (attr == NULL)
6450 		return 0;
6451 
6452 	*flags = ntohl(nla_get_be32(attr));
6453 	if (*flags & ~(NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL))
6454 		return -EOPNOTSUPP;
6455 	if (!(set->flags & NFT_SET_INTERVAL) &&
6456 	    *flags & NFT_SET_ELEM_INTERVAL_END)
6457 		return -EINVAL;
6458 	if ((*flags & (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL)) ==
6459 	    (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL))
6460 		return -EINVAL;
6461 
6462 	return 0;
6463 }
6464 
6465 static int nft_setelem_parse_key(struct nft_ctx *ctx, const struct nft_set *set,
6466 				 struct nft_data *key, struct nlattr *attr)
6467 {
6468 	struct nft_data_desc desc = {
6469 		.type	= NFT_DATA_VALUE,
6470 		.size	= NFT_DATA_VALUE_MAXLEN,
6471 		.len	= set->klen,
6472 	};
6473 
6474 	return nft_data_init(ctx, key, &desc, attr);
6475 }
6476 
6477 static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set,
6478 				  struct nft_data_desc *desc,
6479 				  struct nft_data *data,
6480 				  struct nlattr *attr)
6481 {
6482 	u32 dtype;
6483 
6484 	if (set->dtype == NFT_DATA_VERDICT)
6485 		dtype = NFT_DATA_VERDICT;
6486 	else
6487 		dtype = NFT_DATA_VALUE;
6488 
6489 	desc->type = dtype;
6490 	desc->size = NFT_DATA_VALUE_MAXLEN;
6491 	desc->len = set->dlen;
6492 	desc->flags = NFT_DATA_DESC_SETELEM;
6493 
6494 	return nft_data_init(ctx, data, desc, attr);
6495 }
6496 
6497 static void *nft_setelem_catchall_get(const struct net *net,
6498 				      const struct nft_set *set)
6499 {
6500 	struct nft_set_elem_catchall *catchall;
6501 	u8 genmask = nft_genmask_cur(net);
6502 	struct nft_set_ext *ext;
6503 	void *priv = NULL;
6504 
6505 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
6506 		ext = nft_set_elem_ext(set, catchall->elem);
6507 		if (!nft_set_elem_active(ext, genmask) ||
6508 		    nft_set_elem_expired(ext))
6509 			continue;
6510 
6511 		priv = catchall->elem;
6512 		break;
6513 	}
6514 
6515 	return priv;
6516 }
6517 
6518 static int nft_setelem_get(struct nft_ctx *ctx, const struct nft_set *set,
6519 			   struct nft_set_elem *elem, u32 flags)
6520 {
6521 	void *priv;
6522 
6523 	if (!(flags & NFT_SET_ELEM_CATCHALL)) {
6524 		priv = set->ops->get(ctx->net, set, elem, flags);
6525 		if (IS_ERR(priv))
6526 			return PTR_ERR(priv);
6527 	} else {
6528 		priv = nft_setelem_catchall_get(ctx->net, set);
6529 		if (!priv)
6530 			return -ENOENT;
6531 	}
6532 	elem->priv = priv;
6533 
6534 	return 0;
6535 }
6536 
6537 static int nft_get_set_elem(struct nft_ctx *ctx, const struct nft_set *set,
6538 			    const struct nlattr *attr, bool reset)
6539 {
6540 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
6541 	struct nft_set_elem elem;
6542 	struct sk_buff *skb;
6543 	uint32_t flags = 0;
6544 	int err;
6545 
6546 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
6547 					  nft_set_elem_policy, NULL);
6548 	if (err < 0)
6549 		return err;
6550 
6551 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
6552 	if (err < 0)
6553 		return err;
6554 
6555 	if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL))
6556 		return -EINVAL;
6557 
6558 	if (nla[NFTA_SET_ELEM_KEY]) {
6559 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
6560 					    nla[NFTA_SET_ELEM_KEY]);
6561 		if (err < 0)
6562 			return err;
6563 	}
6564 
6565 	if (nla[NFTA_SET_ELEM_KEY_END]) {
6566 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
6567 					    nla[NFTA_SET_ELEM_KEY_END]);
6568 		if (err < 0)
6569 			return err;
6570 	}
6571 
6572 	err = nft_setelem_get(ctx, set, &elem, flags);
6573 	if (err < 0)
6574 		return err;
6575 
6576 	if (!elem.priv)
6577 		return 0;
6578 
6579 	err = -ENOMEM;
6580 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
6581 	if (skb == NULL)
6582 		return err;
6583 
6584 	err = nf_tables_fill_setelem_info(skb, ctx, ctx->seq, ctx->portid,
6585 					  NFT_MSG_NEWSETELEM, 0, set, elem.priv,
6586 					  reset);
6587 	if (err < 0)
6588 		goto err_fill_setelem;
6589 
6590 	return nfnetlink_unicast(skb, ctx->net, ctx->portid);
6591 
6592 err_fill_setelem:
6593 	kfree_skb(skb);
6594 	return err;
6595 }
6596 
6597 static int nft_set_dump_ctx_init(struct nft_set_dump_ctx *dump_ctx,
6598 				 const struct sk_buff *skb,
6599 				 const struct nfnl_info *info,
6600 				 const struct nlattr * const nla[],
6601 				 bool reset)
6602 {
6603 	struct netlink_ext_ack *extack = info->extack;
6604 	u8 genmask = nft_genmask_cur(info->net);
6605 	u8 family = info->nfmsg->nfgen_family;
6606 	struct net *net = info->net;
6607 	struct nft_table *table;
6608 	struct nft_set *set;
6609 
6610 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
6611 				 genmask, 0);
6612 	if (IS_ERR(table)) {
6613 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
6614 		return PTR_ERR(table);
6615 	}
6616 
6617 	set = nft_set_lookup(net, table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
6618 	if (IS_ERR(set)) {
6619 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
6620 		return PTR_ERR(set);
6621 	}
6622 
6623 	nft_ctx_init(&dump_ctx->ctx, net, skb,
6624 		     info->nlh, family, table, NULL, nla);
6625 	dump_ctx->set = set;
6626 	dump_ctx->reset = reset;
6627 	return 0;
6628 }
6629 
6630 /* called with rcu_read_lock held */
6631 static int nf_tables_getsetelem(struct sk_buff *skb,
6632 				const struct nfnl_info *info,
6633 				const struct nlattr * const nla[])
6634 {
6635 	struct netlink_ext_ack *extack = info->extack;
6636 	struct nft_set_dump_ctx dump_ctx;
6637 	int rem, err = 0, nelems = 0;
6638 	struct net *net = info->net;
6639 	struct nlattr *attr;
6640 	bool reset = false;
6641 
6642 	if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_GETSETELEM_RESET)
6643 		reset = true;
6644 
6645 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
6646 		struct netlink_dump_control c = {
6647 			.start = nf_tables_dump_set_start,
6648 			.dump = nf_tables_dump_set,
6649 			.done = nf_tables_dump_set_done,
6650 			.module = THIS_MODULE,
6651 		};
6652 
6653 		err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, reset);
6654 		if (err)
6655 			return err;
6656 
6657 		c.data = &dump_ctx;
6658 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
6659 	}
6660 
6661 	if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
6662 		return -EINVAL;
6663 
6664 	err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, reset);
6665 	if (err)
6666 		return err;
6667 
6668 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
6669 		err = nft_get_set_elem(&dump_ctx.ctx, dump_ctx.set, attr, reset);
6670 		if (err < 0) {
6671 			NL_SET_BAD_ATTR(extack, attr);
6672 			break;
6673 		}
6674 		nelems++;
6675 	}
6676 	if (reset)
6677 		audit_log_nft_set_reset(dump_ctx.ctx.table, nft_base_seq(net),
6678 					nelems);
6679 
6680 	return err;
6681 }
6682 
6683 static void nf_tables_setelem_notify(const struct nft_ctx *ctx,
6684 				     const struct nft_set *set,
6685 				     const struct nft_elem_priv *elem_priv,
6686 				     int event)
6687 {
6688 	struct nftables_pernet *nft_net;
6689 	struct net *net = ctx->net;
6690 	u32 portid = ctx->portid;
6691 	struct sk_buff *skb;
6692 	u16 flags = 0;
6693 	int err;
6694 
6695 	if (!ctx->report && !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
6696 		return;
6697 
6698 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
6699 	if (skb == NULL)
6700 		goto err;
6701 
6702 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
6703 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
6704 
6705 	err = nf_tables_fill_setelem_info(skb, ctx, 0, portid, event, flags,
6706 					  set, elem_priv, false);
6707 	if (err < 0) {
6708 		kfree_skb(skb);
6709 		goto err;
6710 	}
6711 
6712 	nft_net = nft_pernet(net);
6713 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
6714 	return;
6715 err:
6716 	nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
6717 }
6718 
6719 static struct nft_trans *nft_trans_elem_alloc(const struct nft_ctx *ctx,
6720 					      int msg_type,
6721 					      struct nft_set *set)
6722 {
6723 	struct nft_trans_elem *te;
6724 	struct nft_trans *trans;
6725 
6726 	trans = nft_trans_alloc(ctx, msg_type, struct_size(te, elems, 1));
6727 	if (trans == NULL)
6728 		return NULL;
6729 
6730 	te = nft_trans_container_elem(trans);
6731 	te->nelems = 1;
6732 	te->set = set;
6733 
6734 	return trans;
6735 }
6736 
6737 struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx,
6738 					 const struct nft_set *set,
6739 					 const struct nlattr *attr)
6740 {
6741 	struct nft_expr *expr;
6742 	int err;
6743 
6744 	expr = nft_expr_init(ctx, attr);
6745 	if (IS_ERR(expr))
6746 		return expr;
6747 
6748 	err = -EOPNOTSUPP;
6749 	if (expr->ops->type->flags & NFT_EXPR_GC) {
6750 		if (set->flags & NFT_SET_TIMEOUT)
6751 			goto err_set_elem_expr;
6752 		if (!set->ops->gc_init)
6753 			goto err_set_elem_expr;
6754 		set->ops->gc_init(set);
6755 	}
6756 
6757 	return expr;
6758 
6759 err_set_elem_expr:
6760 	nft_expr_destroy(ctx, expr);
6761 	return ERR_PTR(err);
6762 }
6763 
6764 static int nft_set_ext_check(const struct nft_set_ext_tmpl *tmpl, u8 id, u32 len)
6765 {
6766 	len += nft_set_ext_types[id].len;
6767 	if (len > tmpl->ext_len[id] ||
6768 	    len > U8_MAX)
6769 		return -1;
6770 
6771 	return 0;
6772 }
6773 
6774 static int nft_set_ext_memcpy(const struct nft_set_ext_tmpl *tmpl, u8 id,
6775 			      void *to, const void *from, u32 len)
6776 {
6777 	if (nft_set_ext_check(tmpl, id, len) < 0)
6778 		return -1;
6779 
6780 	memcpy(to, from, len);
6781 
6782 	return 0;
6783 }
6784 
6785 struct nft_elem_priv *nft_set_elem_init(const struct nft_set *set,
6786 					const struct nft_set_ext_tmpl *tmpl,
6787 					const u32 *key, const u32 *key_end,
6788 					const u32 *data,
6789 					u64 timeout, u64 expiration, gfp_t gfp)
6790 {
6791 	struct nft_set_ext *ext;
6792 	void *elem;
6793 
6794 	elem = kzalloc(set->ops->elemsize + tmpl->len, gfp);
6795 	if (elem == NULL)
6796 		return ERR_PTR(-ENOMEM);
6797 
6798 	ext = nft_set_elem_ext(set, elem);
6799 	nft_set_ext_init(ext, tmpl);
6800 
6801 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) &&
6802 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY,
6803 			       nft_set_ext_key(ext), key, set->klen) < 0)
6804 		goto err_ext_check;
6805 
6806 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) &&
6807 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY_END,
6808 			       nft_set_ext_key_end(ext), key_end, set->klen) < 0)
6809 		goto err_ext_check;
6810 
6811 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
6812 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_DATA,
6813 			       nft_set_ext_data(ext), data, set->dlen) < 0)
6814 		goto err_ext_check;
6815 
6816 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) {
6817 		nft_set_ext_timeout(ext)->timeout = timeout;
6818 
6819 		if (expiration == 0)
6820 			expiration = timeout;
6821 
6822 		nft_set_ext_timeout(ext)->expiration = get_jiffies_64() + expiration;
6823 	}
6824 
6825 	return elem;
6826 
6827 err_ext_check:
6828 	kfree(elem);
6829 
6830 	return ERR_PTR(-EINVAL);
6831 }
6832 
6833 static void __nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6834 					struct nft_expr *expr)
6835 {
6836 	if (expr->ops->destroy_clone) {
6837 		expr->ops->destroy_clone(ctx, expr);
6838 		module_put(expr->ops->type->owner);
6839 	} else {
6840 		nf_tables_expr_destroy(ctx, expr);
6841 	}
6842 }
6843 
6844 void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6845 			       struct nft_set_elem_expr *elem_expr)
6846 {
6847 	struct nft_expr *expr;
6848 	u32 size;
6849 
6850 	nft_setelem_expr_foreach(expr, elem_expr, size)
6851 		__nft_set_elem_expr_destroy(ctx, expr);
6852 }
6853 
6854 /* Drop references and destroy. Called from gc, dynset and abort path. */
6855 static void __nft_set_elem_destroy(const struct nft_ctx *ctx,
6856 				   const struct nft_set *set,
6857 				   const struct nft_elem_priv *elem_priv,
6858 				   bool destroy_expr)
6859 {
6860 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6861 
6862 	nft_data_release(nft_set_ext_key(ext), NFT_DATA_VALUE);
6863 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
6864 		nft_data_release(nft_set_ext_data(ext), set->dtype);
6865 	if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS))
6866 		nft_set_elem_expr_destroy(ctx, nft_set_ext_expr(ext));
6867 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
6868 		nft_use_dec(&(*nft_set_ext_obj(ext))->use);
6869 
6870 	kfree(elem_priv);
6871 }
6872 
6873 /* Drop references and destroy. Called from gc and dynset. */
6874 void nft_set_elem_destroy(const struct nft_set *set,
6875 			  const struct nft_elem_priv *elem_priv,
6876 			  bool destroy_expr)
6877 {
6878 	struct nft_ctx ctx = {
6879 		.net	= read_pnet(&set->net),
6880 		.family	= set->table->family,
6881 	};
6882 
6883 	__nft_set_elem_destroy(&ctx, set, elem_priv, destroy_expr);
6884 }
6885 
6886 /* Drop references and destroy. Called from abort path. */
6887 static void nft_trans_set_elem_destroy(const struct nft_ctx *ctx, struct nft_trans_elem *te)
6888 {
6889 	int i;
6890 
6891 	for (i = 0; i < te->nelems; i++) {
6892 		/* skip update request, see nft_trans_elems_new_abort() */
6893 		if (!te->elems[i].priv)
6894 			continue;
6895 
6896 		__nft_set_elem_destroy(ctx, te->set, te->elems[i].priv, true);
6897 	}
6898 }
6899 
6900 /* Destroy element. References have been already dropped in the preparation
6901  * path via nft_setelem_data_deactivate().
6902  */
6903 void nf_tables_set_elem_destroy(const struct nft_ctx *ctx,
6904 				const struct nft_set *set,
6905 				const struct nft_elem_priv *elem_priv)
6906 {
6907 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6908 
6909 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS))
6910 		nft_set_elem_expr_destroy(ctx, nft_set_ext_expr(ext));
6911 
6912 	kfree(elem_priv);
6913 }
6914 
6915 static void nft_trans_elems_destroy(const struct nft_ctx *ctx,
6916 				    const struct nft_trans_elem *te)
6917 {
6918 	int i;
6919 
6920 	for (i = 0; i < te->nelems; i++)
6921 		nf_tables_set_elem_destroy(ctx, te->set, te->elems[i].priv);
6922 }
6923 
6924 static int nft_set_elem_expr_setup(struct nft_ctx *ctx,
6925 				   const struct nft_set_ext_tmpl *tmpl,
6926 				   const struct nft_set_ext *ext,
6927 				   struct nft_expr *expr_array[],
6928 				   u32 num_exprs, bool override_exprs)
6929 {
6930 	struct nft_set_elem_expr *elem_expr = nft_set_ext_expr(ext);
6931 	u32 len = sizeof(struct nft_set_elem_expr);
6932 	struct nft_expr *expr;
6933 	int i, err;
6934 
6935 	if (num_exprs == 0)
6936 		return 0;
6937 
6938 	for (i = 0; i < num_exprs; i++)
6939 		len += expr_array[i]->ops->size;
6940 
6941 	if (nft_set_ext_check(tmpl, NFT_SET_EXT_EXPRESSIONS, len) < 0)
6942 		return -EINVAL;
6943 
6944 	for (i = 0; i < num_exprs; i++) {
6945 		expr = nft_setelem_expr_at(elem_expr, elem_expr->size);
6946 		err = nft_expr_clone(expr, expr_array[i], GFP_KERNEL_ACCOUNT);
6947 		if (err < 0)
6948 			goto err_elem_expr_setup;
6949 
6950 		elem_expr->size += expr_array[i]->ops->size;
6951 		if (override_exprs)
6952 			nft_expr_destroy(ctx, expr_array[i]);
6953 		expr_array[i] = NULL;
6954 	}
6955 
6956 	return 0;
6957 
6958 err_elem_expr_setup:
6959 	for (; i < num_exprs; i++) {
6960 		if (override_exprs)
6961 			nft_expr_destroy(ctx, expr_array[i]);
6962 
6963 		expr_array[i] = NULL;
6964 	}
6965 
6966 	return -ENOMEM;
6967 }
6968 
6969 struct nft_set_ext *nft_set_catchall_lookup(const struct net *net,
6970 					    const struct nft_set *set)
6971 {
6972 	struct nft_set_elem_catchall *catchall;
6973 	u8 genmask = nft_genmask_cur(net);
6974 	struct nft_set_ext *ext;
6975 
6976 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
6977 		ext = nft_set_elem_ext(set, catchall->elem);
6978 		if (nft_set_elem_active(ext, genmask) &&
6979 		    !nft_set_elem_expired(ext) &&
6980 		    !nft_set_elem_is_dead(ext))
6981 			return ext;
6982 	}
6983 
6984 	return NULL;
6985 }
6986 
6987 static int nft_setelem_catchall_insert(const struct net *net,
6988 				       struct nft_set *set,
6989 				       const struct nft_set_elem *elem,
6990 				       struct nft_elem_priv **priv)
6991 {
6992 	struct nft_set_elem_catchall *catchall;
6993 	u8 genmask = nft_genmask_next(net);
6994 	struct nft_set_ext *ext;
6995 
6996 	list_for_each_entry(catchall, &set->catchall_list, list) {
6997 		ext = nft_set_elem_ext(set, catchall->elem);
6998 		if (nft_set_elem_active(ext, genmask)) {
6999 			*priv = catchall->elem;
7000 			return -EEXIST;
7001 		}
7002 	}
7003 
7004 	catchall = kmalloc_obj(*catchall, GFP_KERNEL_ACCOUNT);
7005 	if (!catchall)
7006 		return -ENOMEM;
7007 
7008 	catchall->elem = elem->priv;
7009 	list_add_tail_rcu(&catchall->list, &set->catchall_list);
7010 
7011 	return 0;
7012 }
7013 
7014 static int nft_setelem_insert(const struct net *net,
7015 			      struct nft_set *set,
7016 			      const struct nft_set_elem *elem,
7017 			      struct nft_elem_priv **elem_priv,
7018 			      unsigned int flags)
7019 {
7020 	int ret;
7021 
7022 	if (flags & NFT_SET_ELEM_CATCHALL)
7023 		ret = nft_setelem_catchall_insert(net, set, elem, elem_priv);
7024 	else
7025 		ret = set->ops->insert(net, set, elem, elem_priv);
7026 
7027 	return ret;
7028 }
7029 
7030 static bool nft_setelem_is_catchall(const struct nft_set *set,
7031 				    const struct nft_elem_priv *elem_priv)
7032 {
7033 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7034 
7035 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
7036 	    *nft_set_ext_flags(ext) & NFT_SET_ELEM_CATCHALL)
7037 		return true;
7038 
7039 	return false;
7040 }
7041 
7042 static void nft_setelem_activate(struct net *net, struct nft_set *set,
7043 				 struct nft_elem_priv *elem_priv)
7044 {
7045 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7046 
7047 	if (nft_setelem_is_catchall(set, elem_priv)) {
7048 		nft_clear(net, ext);
7049 	} else {
7050 		set->ops->activate(net, set, elem_priv);
7051 	}
7052 }
7053 
7054 static void nft_trans_elem_update(const struct nft_set *set,
7055 				  const struct nft_trans_one_elem *elem)
7056 {
7057 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
7058 	const struct nft_elem_update *update = elem->update;
7059 
7060 	if (update->flags & NFT_TRANS_UPD_TIMEOUT)
7061 		WRITE_ONCE(nft_set_ext_timeout(ext)->timeout, update->timeout);
7062 
7063 	if (update->flags & NFT_TRANS_UPD_EXPIRATION)
7064 		WRITE_ONCE(nft_set_ext_timeout(ext)->expiration, get_jiffies_64() + update->expiration);
7065 }
7066 
7067 static void nft_trans_elems_add(const struct nft_ctx *ctx,
7068 				struct nft_trans_elem *te)
7069 {
7070 	int i;
7071 
7072 	for (i = 0; i < te->nelems; i++) {
7073 		struct nft_trans_one_elem *elem = &te->elems[i];
7074 
7075 		if (elem->update)
7076 			nft_trans_elem_update(te->set, elem);
7077 		else
7078 			nft_setelem_activate(ctx->net, te->set, elem->priv);
7079 
7080 		nf_tables_setelem_notify(ctx, te->set, elem->priv,
7081 					 NFT_MSG_NEWSETELEM);
7082 		kfree(elem->update);
7083 	}
7084 }
7085 
7086 static int nft_setelem_catchall_deactivate(const struct net *net,
7087 					   struct nft_set *set,
7088 					   struct nft_set_elem *elem)
7089 {
7090 	struct nft_set_elem_catchall *catchall;
7091 	struct nft_set_ext *ext;
7092 
7093 	list_for_each_entry(catchall, &set->catchall_list, list) {
7094 		ext = nft_set_elem_ext(set, catchall->elem);
7095 		if (!nft_is_active_next(net, ext))
7096 			continue;
7097 
7098 		kfree(elem->priv);
7099 		elem->priv = catchall->elem;
7100 		nft_set_elem_change_active(net, set, ext);
7101 		return 0;
7102 	}
7103 
7104 	return -ENOENT;
7105 }
7106 
7107 static int __nft_setelem_deactivate(const struct net *net,
7108 				    struct nft_set *set,
7109 				    struct nft_set_elem *elem)
7110 {
7111 	void *priv;
7112 
7113 	priv = set->ops->deactivate(net, set, elem);
7114 	if (!priv)
7115 		return -ENOENT;
7116 
7117 	kfree(elem->priv);
7118 	elem->priv = priv;
7119 	set->ndeact++;
7120 
7121 	return 0;
7122 }
7123 
7124 static int nft_setelem_deactivate(const struct net *net,
7125 				  struct nft_set *set,
7126 				  struct nft_set_elem *elem, u32 flags)
7127 {
7128 	int ret;
7129 
7130 	if (flags & NFT_SET_ELEM_CATCHALL)
7131 		ret = nft_setelem_catchall_deactivate(net, set, elem);
7132 	else
7133 		ret = __nft_setelem_deactivate(net, set, elem);
7134 
7135 	return ret;
7136 }
7137 
7138 static void nft_setelem_catchall_destroy(struct nft_set_elem_catchall *catchall)
7139 {
7140 	list_del_rcu(&catchall->list);
7141 	kfree_rcu(catchall, rcu);
7142 }
7143 
7144 static void nft_setelem_catchall_remove(const struct net *net,
7145 					const struct nft_set *set,
7146 					struct nft_elem_priv *elem_priv)
7147 {
7148 	struct nft_set_elem_catchall *catchall, *next;
7149 
7150 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
7151 		if (catchall->elem == elem_priv) {
7152 			nft_setelem_catchall_destroy(catchall);
7153 			break;
7154 		}
7155 	}
7156 }
7157 
7158 static void nft_setelem_remove(const struct net *net,
7159 			       const struct nft_set *set,
7160 			       struct nft_elem_priv *elem_priv)
7161 {
7162 	if (nft_setelem_is_catchall(set, elem_priv))
7163 		nft_setelem_catchall_remove(net, set, elem_priv);
7164 	else
7165 		set->ops->remove(net, set, elem_priv);
7166 }
7167 
7168 static void nft_trans_elems_remove(const struct nft_ctx *ctx,
7169 				   const struct nft_trans_elem *te,
7170 				   bool notify)
7171 {
7172 	int i;
7173 
7174 	for (i = 0; i < te->nelems; i++) {
7175 		WARN_ON_ONCE(te->elems[i].update);
7176 
7177 		if (notify) {
7178 			nf_tables_setelem_notify(ctx, te->set,
7179 						 te->elems[i].priv,
7180 						 te->nft_trans.msg_type);
7181 		}
7182 
7183 		nft_setelem_remove(ctx->net, te->set, te->elems[i].priv);
7184 		if (!nft_setelem_is_catchall(te->set, te->elems[i].priv)) {
7185 			atomic_dec(&te->set->nelems);
7186 			te->set->ndeact--;
7187 		}
7188 	}
7189 }
7190 
7191 static void nft_trans_elems_remove_notify(const struct nft_ctx *ctx,
7192 					  const struct nft_trans_elem *te)
7193 {
7194 	int i;
7195 
7196 	for (i = 0; i < te->nelems; i++) {
7197 		WARN_ON_ONCE(te->elems[i].update);
7198 
7199 		nf_tables_setelem_notify(ctx, te->set,
7200 					 te->elems[i].priv,
7201 					 te->nft_trans.msg_type);
7202 	}
7203 }
7204 
7205 static bool nft_setelem_valid_key_end(const struct nft_set *set,
7206 				      struct nlattr **nla, u32 flags)
7207 {
7208 	if ((set->flags & (NFT_SET_CONCAT | NFT_SET_INTERVAL)) ==
7209 			  (NFT_SET_CONCAT | NFT_SET_INTERVAL)) {
7210 		if (flags & NFT_SET_ELEM_INTERVAL_END)
7211 			return false;
7212 
7213 		if (nla[NFTA_SET_ELEM_KEY_END] &&
7214 		    flags & NFT_SET_ELEM_CATCHALL)
7215 			return false;
7216 	} else {
7217 		if (nla[NFTA_SET_ELEM_KEY_END])
7218 			return false;
7219 	}
7220 
7221 	return true;
7222 }
7223 
7224 static u32 nft_set_maxsize(const struct nft_set *set)
7225 {
7226 	u32 maxsize, delta;
7227 
7228 	if (!set->size)
7229 		return UINT_MAX;
7230 
7231 	if (set->ops->adjust_maxsize)
7232 		delta = set->ops->adjust_maxsize(set);
7233 	else
7234 		delta = 0;
7235 
7236 	if (check_add_overflow(set->size, set->ndeact, &maxsize))
7237 		return UINT_MAX;
7238 
7239 	if (check_add_overflow(maxsize, delta, &maxsize))
7240 		return UINT_MAX;
7241 
7242 	return maxsize;
7243 }
7244 
7245 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
7246 			    const struct nlattr *attr, u32 nlmsg_flags)
7247 {
7248 	struct nft_expr *expr_array[NFT_SET_EXPR_MAX] = {};
7249 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
7250 	u8 genmask = nft_genmask_next(ctx->net);
7251 	u32 flags = 0, size = 0, num_exprs = 0;
7252 	struct nft_set_ext_tmpl tmpl;
7253 	struct nft_set_ext *ext, *ext2;
7254 	struct nft_set_elem elem;
7255 	struct nft_set_binding *binding;
7256 	struct nft_elem_priv *elem_priv;
7257 	struct nft_object *obj = NULL;
7258 	bool override_exprs = false;
7259 	struct nft_userdata *udata;
7260 	struct nft_data_desc desc;
7261 	enum nft_registers dreg;
7262 	struct nft_trans *trans;
7263 	bool set_full = false;
7264 	u64 expiration;
7265 	u64 timeout;
7266 	int err, i;
7267 	u8 ulen;
7268 
7269 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
7270 					  nft_set_elem_policy, NULL);
7271 	if (err < 0)
7272 		return err;
7273 
7274 	nft_set_ext_prepare(&tmpl);
7275 
7276 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
7277 	if (err < 0)
7278 		return err;
7279 
7280 	if (((flags & NFT_SET_ELEM_CATCHALL) && nla[NFTA_SET_ELEM_KEY]) ||
7281 	    (!(flags & NFT_SET_ELEM_CATCHALL) && !nla[NFTA_SET_ELEM_KEY]))
7282 		return -EINVAL;
7283 
7284 	if (flags != 0) {
7285 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
7286 		if (err < 0)
7287 			return err;
7288 	}
7289 
7290 	if (set->flags & NFT_SET_MAP) {
7291 		if (nla[NFTA_SET_ELEM_DATA] == NULL &&
7292 		    !(flags & NFT_SET_ELEM_INTERVAL_END))
7293 			return -EINVAL;
7294 	} else {
7295 		if (nla[NFTA_SET_ELEM_DATA] != NULL)
7296 			return -EINVAL;
7297 	}
7298 
7299 	if (set->flags & NFT_SET_OBJECT) {
7300 		if (!nla[NFTA_SET_ELEM_OBJREF] &&
7301 		    !(flags & NFT_SET_ELEM_INTERVAL_END))
7302 			return -EINVAL;
7303 	} else {
7304 		if (nla[NFTA_SET_ELEM_OBJREF])
7305 			return -EINVAL;
7306 	}
7307 
7308 	if (!nft_setelem_valid_key_end(set, nla, flags))
7309 		return -EINVAL;
7310 
7311 	if ((flags & NFT_SET_ELEM_INTERVAL_END) &&
7312 	     (nla[NFTA_SET_ELEM_DATA] ||
7313 	      nla[NFTA_SET_ELEM_OBJREF] ||
7314 	      nla[NFTA_SET_ELEM_TIMEOUT] ||
7315 	      nla[NFTA_SET_ELEM_EXPIRATION] ||
7316 	      nla[NFTA_SET_ELEM_USERDATA] ||
7317 	      nla[NFTA_SET_ELEM_EXPR] ||
7318 	      nla[NFTA_SET_ELEM_KEY_END] ||
7319 	      nla[NFTA_SET_ELEM_EXPRESSIONS]))
7320 		return -EINVAL;
7321 
7322 	timeout = 0;
7323 	if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
7324 		if (!(set->flags & NFT_SET_TIMEOUT))
7325 			return -EINVAL;
7326 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_TIMEOUT],
7327 					    &timeout);
7328 		if (err)
7329 			return err;
7330 	} else if (set->flags & NFT_SET_TIMEOUT &&
7331 		   !(flags & NFT_SET_ELEM_INTERVAL_END)) {
7332 		timeout = set->timeout;
7333 	}
7334 
7335 	expiration = 0;
7336 	if (nla[NFTA_SET_ELEM_EXPIRATION] != NULL) {
7337 		if (!(set->flags & NFT_SET_TIMEOUT))
7338 			return -EINVAL;
7339 		if (timeout == 0)
7340 			return -EOPNOTSUPP;
7341 
7342 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_EXPIRATION],
7343 					    &expiration);
7344 		if (err)
7345 			return err;
7346 
7347 		if (expiration > timeout)
7348 			return -ERANGE;
7349 	}
7350 
7351 	if (nla[NFTA_SET_ELEM_EXPR]) {
7352 		struct nft_expr *expr;
7353 
7354 		if (set->num_exprs && set->num_exprs != 1)
7355 			return -EOPNOTSUPP;
7356 
7357 		expr = nft_set_elem_expr_alloc(ctx, set,
7358 					       nla[NFTA_SET_ELEM_EXPR]);
7359 		if (IS_ERR(expr))
7360 			return PTR_ERR(expr);
7361 
7362 		expr_array[0] = expr;
7363 		num_exprs = 1;
7364 		override_exprs = true;
7365 
7366 		if (set->num_exprs && set->exprs[0]->ops != expr->ops) {
7367 			err = -EOPNOTSUPP;
7368 			goto err_set_elem_expr;
7369 		}
7370 	} else if (nla[NFTA_SET_ELEM_EXPRESSIONS]) {
7371 		struct nft_expr *expr;
7372 		struct nlattr *tmp;
7373 		int left;
7374 
7375 		i = 0;
7376 		nla_for_each_nested(tmp, nla[NFTA_SET_ELEM_EXPRESSIONS], left) {
7377 			if (i == NFT_SET_EXPR_MAX ||
7378 			    (set->num_exprs && set->num_exprs == i)) {
7379 				err = -E2BIG;
7380 				goto err_set_elem_expr;
7381 			}
7382 			if (nla_type(tmp) != NFTA_LIST_ELEM) {
7383 				err = -EINVAL;
7384 				goto err_set_elem_expr;
7385 			}
7386 			expr = nft_set_elem_expr_alloc(ctx, set, tmp);
7387 			if (IS_ERR(expr)) {
7388 				err = PTR_ERR(expr);
7389 				goto err_set_elem_expr;
7390 			}
7391 			expr_array[i] = expr;
7392 			num_exprs++;
7393 			override_exprs = true;
7394 
7395 			if (set->num_exprs && expr->ops != set->exprs[i]->ops) {
7396 				err = -EOPNOTSUPP;
7397 				goto err_set_elem_expr;
7398 			}
7399 			i++;
7400 		}
7401 		if (set->num_exprs && set->num_exprs != i) {
7402 			err = -EOPNOTSUPP;
7403 			goto err_set_elem_expr;
7404 		}
7405 	} else if (set->num_exprs > 0 &&
7406 		   !(flags & NFT_SET_ELEM_INTERVAL_END)) {
7407 		for (i = 0; i < set->num_exprs; i++)
7408 			expr_array[i] = set->exprs[i];
7409 
7410 		num_exprs = set->num_exprs;
7411 	}
7412 
7413 	if (nla[NFTA_SET_ELEM_KEY]) {
7414 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
7415 					    nla[NFTA_SET_ELEM_KEY]);
7416 		if (err < 0)
7417 			goto err_set_elem_expr;
7418 
7419 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
7420 		if (err < 0)
7421 			goto err_parse_key;
7422 	}
7423 
7424 	if (nla[NFTA_SET_ELEM_KEY_END]) {
7425 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
7426 					    nla[NFTA_SET_ELEM_KEY_END]);
7427 		if (err < 0)
7428 			goto err_parse_key;
7429 
7430 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
7431 		if (err < 0)
7432 			goto err_parse_key_end;
7433 	}
7434 
7435 	if (set->flags & NFT_SET_TIMEOUT) {
7436 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_TIMEOUT);
7437 		if (err < 0)
7438 			goto err_parse_key_end;
7439 	}
7440 
7441 	if (num_exprs) {
7442 		for (i = 0; i < num_exprs; i++)
7443 			size += expr_array[i]->ops->size;
7444 
7445 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_EXPRESSIONS,
7446 					     sizeof(struct nft_set_elem_expr) + size);
7447 		if (err < 0)
7448 			goto err_parse_key_end;
7449 	}
7450 
7451 	if (nla[NFTA_SET_ELEM_OBJREF] != NULL) {
7452 		obj = nft_obj_lookup(ctx->net, ctx->table,
7453 				     nla[NFTA_SET_ELEM_OBJREF],
7454 				     set->objtype, genmask);
7455 		if (IS_ERR(obj)) {
7456 			err = PTR_ERR(obj);
7457 			obj = NULL;
7458 			goto err_parse_key_end;
7459 		}
7460 
7461 		if (!nft_use_inc(&obj->use)) {
7462 			err = -EMFILE;
7463 			obj = NULL;
7464 			goto err_parse_key_end;
7465 		}
7466 
7467 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_OBJREF);
7468 		if (err < 0)
7469 			goto err_parse_key_end;
7470 	}
7471 
7472 	if (nla[NFTA_SET_ELEM_DATA] != NULL) {
7473 		err = nft_setelem_parse_data(ctx, set, &desc, &elem.data.val,
7474 					     nla[NFTA_SET_ELEM_DATA]);
7475 		if (err < 0)
7476 			goto err_parse_key_end;
7477 
7478 		dreg = nft_type_to_reg(set->dtype);
7479 		list_for_each_entry(binding, &set->bindings, list) {
7480 			struct nft_ctx bind_ctx = {
7481 				.net	= ctx->net,
7482 				.family	= ctx->family,
7483 				.table	= ctx->table,
7484 				.chain	= (struct nft_chain *)binding->chain,
7485 			};
7486 
7487 			if (!(binding->flags & NFT_SET_MAP))
7488 				continue;
7489 
7490 			err = nft_validate_register_store(&bind_ctx, dreg,
7491 							  &elem.data.val,
7492 							  desc.type, desc.len);
7493 			if (err < 0)
7494 				goto err_parse_data;
7495 
7496 			if (desc.type == NFT_DATA_VERDICT &&
7497 			    (elem.data.val.verdict.code == NFT_GOTO ||
7498 			     elem.data.val.verdict.code == NFT_JUMP))
7499 				nft_validate_state_update(ctx->table,
7500 							  NFT_VALIDATE_NEED);
7501 		}
7502 
7503 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, desc.len);
7504 		if (err < 0)
7505 			goto err_parse_data;
7506 	}
7507 
7508 	/* The full maximum length of userdata can exceed the maximum
7509 	 * offset value (U8_MAX) for following extensions, therefor it
7510 	 * must be the last extension added.
7511 	 */
7512 	ulen = 0;
7513 	if (nla[NFTA_SET_ELEM_USERDATA] != NULL) {
7514 		ulen = nla_len(nla[NFTA_SET_ELEM_USERDATA]);
7515 		if (ulen > 0) {
7516 			err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_USERDATA,
7517 						     ulen);
7518 			if (err < 0)
7519 				goto err_parse_data;
7520 		}
7521 	}
7522 
7523 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
7524 				      elem.key_end.val.data, elem.data.val.data,
7525 				      timeout, expiration, GFP_KERNEL_ACCOUNT);
7526 	if (IS_ERR(elem.priv)) {
7527 		err = PTR_ERR(elem.priv);
7528 		goto err_parse_data;
7529 	}
7530 
7531 	ext = nft_set_elem_ext(set, elem.priv);
7532 	if (flags)
7533 		*nft_set_ext_flags(ext) = flags;
7534 
7535 	if (obj)
7536 		*nft_set_ext_obj(ext) = obj;
7537 
7538 	if (ulen > 0) {
7539 		if (nft_set_ext_check(&tmpl, NFT_SET_EXT_USERDATA, ulen) < 0) {
7540 			err = -EINVAL;
7541 			goto err_elem_free;
7542 		}
7543 		udata = nft_set_ext_userdata(ext);
7544 		udata->len = ulen - 1;
7545 		nla_memcpy(&udata->data, nla[NFTA_SET_ELEM_USERDATA], ulen);
7546 	}
7547 	err = nft_set_elem_expr_setup(ctx, &tmpl, ext, expr_array, num_exprs,
7548 				      override_exprs);
7549 	if (err < 0)
7550 		goto err_elem_free;
7551 
7552 	if (!(flags & NFT_SET_ELEM_CATCHALL)) {
7553 		unsigned int max = nft_set_maxsize(set), nelems;
7554 
7555 		nelems = atomic_inc_return(&set->nelems);
7556 		if (nelems > max)
7557 			set_full = true;
7558 	}
7559 
7560 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_NEWSETELEM, set);
7561 	if (trans == NULL) {
7562 		err = -ENOMEM;
7563 		goto err_set_size;
7564 	}
7565 
7566 	ext->genmask = nft_genmask_cur(ctx->net);
7567 
7568 	err = nft_setelem_insert(ctx->net, set, &elem, &elem_priv, flags);
7569 	if (err) {
7570 		if (err == -EEXIST) {
7571 			ext2 = nft_set_elem_ext(set, elem_priv);
7572 			if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) ^
7573 			    nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) ||
7574 			    nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) ^
7575 			    nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF))
7576 				goto err_element_clash;
7577 			if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
7578 			     nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) &&
7579 			     memcmp(nft_set_ext_data(ext),
7580 				    nft_set_ext_data(ext2), set->dlen) != 0) ||
7581 			    (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
7582 			     nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF) &&
7583 			     *nft_set_ext_obj(ext) != *nft_set_ext_obj(ext2)))
7584 				goto err_element_clash;
7585 			else if (!(nlmsg_flags & NLM_F_EXCL)) {
7586 				err = 0;
7587 				if (nft_set_ext_exists(ext2, NFT_SET_EXT_TIMEOUT)) {
7588 					struct nft_elem_update update = { };
7589 
7590 					if (timeout != nft_set_ext_timeout(ext2)->timeout) {
7591 						update.timeout = timeout;
7592 						if (expiration == 0)
7593 							expiration = timeout;
7594 
7595 						update.flags |= NFT_TRANS_UPD_TIMEOUT;
7596 					}
7597 					if (expiration) {
7598 						update.expiration = expiration;
7599 						update.flags |= NFT_TRANS_UPD_EXPIRATION;
7600 					}
7601 
7602 					if (update.flags) {
7603 						struct nft_trans_one_elem *ue;
7604 
7605 						ue = &nft_trans_container_elem(trans)->elems[0];
7606 
7607 						ue->update = kmemdup(&update, sizeof(update), GFP_KERNEL);
7608 						if (!ue->update) {
7609 							err = -ENOMEM;
7610 							goto err_element_clash;
7611 						}
7612 
7613 						ue->priv = elem_priv;
7614 						nft_trans_commit_list_add_elem(ctx->net, trans);
7615 						goto err_set_size;
7616 					}
7617 				}
7618 			}
7619 		} else if (err == -ENOTEMPTY) {
7620 			/* ENOTEMPTY reports overlapping between this element
7621 			 * and an existing one.
7622 			 */
7623 			err = -EEXIST;
7624 		} else if (err == -ECANCELED) {
7625 			/* ECANCELED reports an existing nul-element in
7626 			 * interval sets.
7627 			 */
7628 			err = 0;
7629 		}
7630 		goto err_element_clash;
7631 	}
7632 
7633 	nft_trans_container_elem(trans)->elems[0].priv = elem.priv;
7634 	nft_trans_commit_list_add_elem(ctx->net, trans);
7635 
7636 	return set_full ? -ENFILE : 0;
7637 
7638 err_element_clash:
7639 	kfree(trans);
7640 err_set_size:
7641 	if (!(flags & NFT_SET_ELEM_CATCHALL))
7642 		atomic_dec(&set->nelems);
7643 err_elem_free:
7644 	nf_tables_set_elem_destroy(ctx, set, elem.priv);
7645 err_parse_data:
7646 	if (nla[NFTA_SET_ELEM_DATA] != NULL)
7647 		nft_data_release(&elem.data.val, desc.type);
7648 err_parse_key_end:
7649 	if (obj)
7650 		nft_use_dec_restore(&obj->use);
7651 
7652 	nft_data_release(&elem.key_end.val, NFT_DATA_VALUE);
7653 err_parse_key:
7654 	nft_data_release(&elem.key.val, NFT_DATA_VALUE);
7655 err_set_elem_expr:
7656 	if (override_exprs) {
7657 		for (i = 0; i < num_exprs && expr_array[i]; i++)
7658 			nft_expr_destroy(ctx, expr_array[i]);
7659 	}
7660 
7661 	return err;
7662 }
7663 
7664 static int nf_tables_newsetelem(struct sk_buff *skb,
7665 				const struct nfnl_info *info,
7666 				const struct nlattr * const nla[])
7667 {
7668 	struct netlink_ext_ack *extack = info->extack;
7669 	u8 genmask = nft_genmask_next(info->net);
7670 	u8 family = info->nfmsg->nfgen_family;
7671 	struct net *net = info->net;
7672 	const struct nlattr *attr;
7673 	struct nft_table *table;
7674 	struct nft_set *set;
7675 	struct nft_ctx ctx;
7676 	int rem, err;
7677 
7678 	if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
7679 		return -EINVAL;
7680 
7681 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
7682 				 genmask, NETLINK_CB(skb).portid);
7683 	if (IS_ERR(table)) {
7684 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
7685 		return PTR_ERR(table);
7686 	}
7687 
7688 	set = nft_set_lookup_global(net, table, nla[NFTA_SET_ELEM_LIST_SET],
7689 				    nla[NFTA_SET_ELEM_LIST_SET_ID], genmask);
7690 	if (IS_ERR(set)) {
7691 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
7692 		return PTR_ERR(set);
7693 	}
7694 
7695 	if (!list_empty(&set->bindings) &&
7696 	    (set->flags & (NFT_SET_CONSTANT | NFT_SET_ANONYMOUS)))
7697 		return -EBUSY;
7698 
7699 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
7700 
7701 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
7702 		err = nft_add_set_elem(&ctx, set, attr, info->nlh->nlmsg_flags);
7703 		if (err < 0) {
7704 			NL_SET_BAD_ATTR(extack, attr);
7705 			return err;
7706 		}
7707 	}
7708 
7709 	if (table->validate_state == NFT_VALIDATE_DO)
7710 		return nft_table_validate(net, table);
7711 
7712 	return 0;
7713 }
7714 
7715 /**
7716  *	nft_data_hold - hold a nft_data item
7717  *
7718  *	@data: struct nft_data to release
7719  *	@type: type of data
7720  *
7721  *	Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
7722  *	NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
7723  *	NFT_GOTO verdicts. This function must be called on active data objects
7724  *	from the second phase of the commit protocol.
7725  */
7726 void nft_data_hold(const struct nft_data *data, enum nft_data_types type)
7727 {
7728 	struct nft_chain *chain;
7729 
7730 	if (type == NFT_DATA_VERDICT) {
7731 		switch (data->verdict.code) {
7732 		case NFT_JUMP:
7733 		case NFT_GOTO:
7734 			chain = data->verdict.chain;
7735 			nft_use_inc_restore(&chain->use);
7736 			break;
7737 		}
7738 	}
7739 }
7740 
7741 static int nft_setelem_active_next(const struct net *net,
7742 				   const struct nft_set *set,
7743 				   struct nft_elem_priv *elem_priv)
7744 {
7745 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7746 	u8 genmask = nft_genmask_next(net);
7747 
7748 	return nft_set_elem_active(ext, genmask);
7749 }
7750 
7751 static void nft_setelem_data_activate(const struct net *net,
7752 				      const struct nft_set *set,
7753 				      struct nft_elem_priv *elem_priv)
7754 {
7755 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7756 
7757 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
7758 		nft_data_hold(nft_set_ext_data(ext), set->dtype);
7759 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
7760 		nft_use_inc_restore(&(*nft_set_ext_obj(ext))->use);
7761 }
7762 
7763 void nft_setelem_data_deactivate(const struct net *net,
7764 				 const struct nft_set *set,
7765 				 struct nft_elem_priv *elem_priv)
7766 {
7767 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7768 
7769 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
7770 		nft_data_release(nft_set_ext_data(ext), set->dtype);
7771 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
7772 		nft_use_dec(&(*nft_set_ext_obj(ext))->use);
7773 }
7774 
7775 /* similar to nft_trans_elems_remove, but called from abort path to undo newsetelem.
7776  * No notifications and no ndeact changes.
7777  *
7778  * Returns true if set had been added to (i.e., elements need to be removed again).
7779  */
7780 static bool nft_trans_elems_new_abort(const struct nft_ctx *ctx,
7781 				      struct nft_trans_elem *te)
7782 {
7783 	bool removed = false;
7784 	int i;
7785 
7786 	for (i = 0; i < te->nelems; i++) {
7787 		if (te->elems[i].update) {
7788 			kfree(te->elems[i].update);
7789 			te->elems[i].update = NULL;
7790 			/* Update request, so do not release this element */
7791 			te->elems[i].priv = NULL;
7792 			continue;
7793 		}
7794 
7795 		if (!te->set->ops->abort_skip_removal ||
7796 		    nft_setelem_is_catchall(te->set, te->elems[i].priv))
7797 			nft_setelem_remove(ctx->net, te->set, te->elems[i].priv);
7798 
7799 		if (!nft_setelem_is_catchall(te->set, te->elems[i].priv))
7800 			atomic_dec(&te->set->nelems);
7801 
7802 		removed = true;
7803 	}
7804 
7805 	return removed;
7806 }
7807 
7808 /* Called from abort path to undo DELSETELEM/DESTROYSETELEM. */
7809 static void nft_trans_elems_destroy_abort(const struct nft_ctx *ctx,
7810 					  const struct nft_trans_elem *te)
7811 {
7812 	int i;
7813 
7814 	for (i = 0; i < te->nelems; i++) {
7815 		if (!nft_setelem_active_next(ctx->net, te->set, te->elems[i].priv)) {
7816 			nft_setelem_data_activate(ctx->net, te->set, te->elems[i].priv);
7817 			nft_setelem_activate(ctx->net, te->set, te->elems[i].priv);
7818 		}
7819 
7820 		if (!nft_setelem_is_catchall(te->set, te->elems[i].priv))
7821 			te->set->ndeact--;
7822 	}
7823 }
7824 
7825 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
7826 			   const struct nlattr *attr)
7827 {
7828 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
7829 	struct nft_set_ext_tmpl tmpl;
7830 	struct nft_set_elem elem;
7831 	struct nft_set_ext *ext;
7832 	struct nft_trans *trans;
7833 	u32 flags = 0;
7834 	int err;
7835 
7836 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
7837 					  nft_set_elem_policy, NULL);
7838 	if (err < 0)
7839 		return err;
7840 
7841 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
7842 	if (err < 0)
7843 		return err;
7844 
7845 	if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL))
7846 		return -EINVAL;
7847 
7848 	if (!nft_setelem_valid_key_end(set, nla, flags))
7849 		return -EINVAL;
7850 
7851 	nft_set_ext_prepare(&tmpl);
7852 
7853 	if (flags != 0) {
7854 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
7855 		if (err < 0)
7856 			return err;
7857 	}
7858 
7859 	if (nla[NFTA_SET_ELEM_KEY]) {
7860 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
7861 					    nla[NFTA_SET_ELEM_KEY]);
7862 		if (err < 0)
7863 			return err;
7864 
7865 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
7866 		if (err < 0)
7867 			goto fail_elem;
7868 	}
7869 
7870 	if (nla[NFTA_SET_ELEM_KEY_END]) {
7871 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
7872 					    nla[NFTA_SET_ELEM_KEY_END]);
7873 		if (err < 0)
7874 			goto fail_elem;
7875 
7876 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
7877 		if (err < 0)
7878 			goto fail_elem_key_end;
7879 	}
7880 
7881 	err = -ENOMEM;
7882 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
7883 				      elem.key_end.val.data, NULL, 0, 0,
7884 				      GFP_KERNEL_ACCOUNT);
7885 	if (IS_ERR(elem.priv)) {
7886 		err = PTR_ERR(elem.priv);
7887 		goto fail_elem_key_end;
7888 	}
7889 
7890 	ext = nft_set_elem_ext(set, elem.priv);
7891 	if (flags)
7892 		*nft_set_ext_flags(ext) = flags;
7893 
7894 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
7895 	if (trans == NULL)
7896 		goto fail_trans;
7897 
7898 	err = nft_setelem_deactivate(ctx->net, set, &elem, flags);
7899 	if (err < 0)
7900 		goto fail_ops;
7901 
7902 	nft_setelem_data_deactivate(ctx->net, set, elem.priv);
7903 
7904 	nft_trans_container_elem(trans)->elems[0].priv = elem.priv;
7905 	nft_trans_commit_list_add_elem(ctx->net, trans);
7906 	return 0;
7907 
7908 fail_ops:
7909 	kfree(trans);
7910 fail_trans:
7911 	kfree(elem.priv);
7912 fail_elem_key_end:
7913 	nft_data_release(&elem.key_end.val, NFT_DATA_VALUE);
7914 fail_elem:
7915 	nft_data_release(&elem.key.val, NFT_DATA_VALUE);
7916 	return err;
7917 }
7918 
7919 static int nft_setelem_flush(const struct nft_ctx *ctx,
7920 			     struct nft_set *set,
7921 			     const struct nft_set_iter *iter,
7922 			     struct nft_elem_priv *elem_priv)
7923 {
7924 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7925 	struct nft_trans *trans;
7926 
7927 	if (!nft_set_elem_active(ext, iter->genmask))
7928 		return 0;
7929 
7930 	trans = nft_trans_alloc(ctx, NFT_MSG_DELSETELEM,
7931 				struct_size_t(struct nft_trans_elem, elems, 1));
7932 	if (!trans)
7933 		return -ENOMEM;
7934 
7935 	set->ops->flush(ctx->net, set, elem_priv);
7936 	set->ndeact++;
7937 
7938 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
7939 	nft_trans_elem_set(trans) = set;
7940 	nft_trans_container_elem(trans)->nelems = 1;
7941 	nft_trans_container_elem(trans)->elems[0].priv = elem_priv;
7942 	nft_trans_commit_list_add_elem(ctx->net, trans);
7943 
7944 	return 0;
7945 }
7946 
7947 static int __nft_set_catchall_flush(const struct nft_ctx *ctx,
7948 				    struct nft_set *set,
7949 				    struct nft_elem_priv *elem_priv)
7950 {
7951 	struct nft_trans *trans;
7952 
7953 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
7954 	if (!trans)
7955 		return -ENOMEM;
7956 
7957 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
7958 	nft_trans_container_elem(trans)->elems[0].priv = elem_priv;
7959 	nft_trans_commit_list_add_elem(ctx->net, trans);
7960 
7961 	return 0;
7962 }
7963 
7964 static int nft_set_catchall_flush(const struct nft_ctx *ctx,
7965 				  struct nft_set *set)
7966 {
7967 	u8 genmask = nft_genmask_next(ctx->net);
7968 	struct nft_set_elem_catchall *catchall;
7969 	struct nft_set_ext *ext;
7970 	int ret = 0;
7971 
7972 	list_for_each_entry_rcu(catchall, &set->catchall_list, list,
7973 				lockdep_commit_lock_is_held(ctx->net)) {
7974 		ext = nft_set_elem_ext(set, catchall->elem);
7975 		if (!nft_set_elem_active(ext, genmask))
7976 			continue;
7977 
7978 		ret = __nft_set_catchall_flush(ctx, set, catchall->elem);
7979 		if (ret < 0)
7980 			break;
7981 		nft_set_elem_change_active(ctx->net, set, ext);
7982 	}
7983 
7984 	return ret;
7985 }
7986 
7987 static int nft_set_flush(struct nft_ctx *ctx, struct nft_set *set, u8 genmask)
7988 {
7989 	/* The set backend might need to clone the set, do it now from the
7990 	 * preparation phase, use NFT_ITER_UPDATE_CLONE iterator type.
7991 	 */
7992 	struct nft_set_iter iter = {
7993 		.genmask	= genmask,
7994 		.type		= NFT_ITER_UPDATE_CLONE,
7995 		.fn		= nft_setelem_flush,
7996 	};
7997 
7998 	set->ops->walk(ctx, set, &iter);
7999 	if (!iter.err)
8000 		iter.err = nft_set_catchall_flush(ctx, set);
8001 
8002 	return iter.err;
8003 }
8004 
8005 static int nf_tables_delsetelem(struct sk_buff *skb,
8006 				const struct nfnl_info *info,
8007 				const struct nlattr * const nla[])
8008 {
8009 	struct netlink_ext_ack *extack = info->extack;
8010 	u8 genmask = nft_genmask_next(info->net);
8011 	u8 family = info->nfmsg->nfgen_family;
8012 	struct net *net = info->net;
8013 	const struct nlattr *attr;
8014 	struct nft_table *table;
8015 	struct nft_set *set;
8016 	struct nft_ctx ctx;
8017 	int rem, err = 0;
8018 
8019 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
8020 				 genmask, NETLINK_CB(skb).portid);
8021 	if (IS_ERR(table)) {
8022 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
8023 		return PTR_ERR(table);
8024 	}
8025 
8026 	set = nft_set_lookup(net, table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
8027 	if (IS_ERR(set)) {
8028 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
8029 		return PTR_ERR(set);
8030 	}
8031 
8032 	if (nft_set_is_anonymous(set))
8033 		return -EOPNOTSUPP;
8034 
8035 	if (!list_empty(&set->bindings) && (set->flags & NFT_SET_CONSTANT))
8036 		return -EBUSY;
8037 
8038 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8039 
8040 	if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
8041 		return nft_set_flush(&ctx, set, genmask);
8042 
8043 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
8044 		err = nft_del_setelem(&ctx, set, attr);
8045 		if (err == -ENOENT &&
8046 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYSETELEM)
8047 			continue;
8048 
8049 		if (err < 0) {
8050 			NL_SET_BAD_ATTR(extack, attr);
8051 			return err;
8052 		}
8053 	}
8054 
8055 	return 0;
8056 }
8057 
8058 /*
8059  * Stateful objects
8060  */
8061 
8062 /**
8063  *	nft_register_obj- register nf_tables stateful object type
8064  *	@obj_type: object type
8065  *
8066  *	Registers the object type for use with nf_tables. Returns zero on
8067  *	success or a negative errno code otherwise.
8068  */
8069 int nft_register_obj(struct nft_object_type *obj_type)
8070 {
8071 	if (obj_type->type == NFT_OBJECT_UNSPEC)
8072 		return -EINVAL;
8073 
8074 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8075 	list_add_rcu(&obj_type->list, &nf_tables_objects);
8076 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8077 	return 0;
8078 }
8079 EXPORT_SYMBOL_GPL(nft_register_obj);
8080 
8081 /**
8082  *	nft_unregister_obj - unregister nf_tables object type
8083  *	@obj_type: object type
8084  *
8085  * 	Unregisters the object type for use with nf_tables.
8086  */
8087 void nft_unregister_obj(struct nft_object_type *obj_type)
8088 {
8089 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8090 	list_del_rcu(&obj_type->list);
8091 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8092 }
8093 EXPORT_SYMBOL_GPL(nft_unregister_obj);
8094 
8095 struct nft_object *nft_obj_lookup(const struct net *net,
8096 				  struct nft_table *table,
8097 				  const struct nlattr *nla, u32 objtype,
8098 				  u8 genmask)
8099 {
8100 	struct nft_object_hash_key k = { .table = table };
8101 	char search[NFT_OBJ_MAXNAMELEN];
8102 	struct rhlist_head *tmp, *list;
8103 	struct nft_object *obj;
8104 
8105 	nla_strscpy(search, nla, sizeof(search));
8106 	k.name = search;
8107 
8108 	WARN_ON_ONCE(!rcu_read_lock_held() &&
8109 		     !lockdep_commit_lock_is_held(net));
8110 
8111 	rcu_read_lock();
8112 	list = rhltable_lookup(&table->objname_ht, &k, nft_objname_ht_params);
8113 	if (!list)
8114 		goto out;
8115 
8116 	rhl_for_each_entry_rcu(obj, tmp, list, rhlhead) {
8117 		if (objtype == obj->ops->type->type &&
8118 		    nft_active_genmask(obj, genmask)) {
8119 			rcu_read_unlock();
8120 			return obj;
8121 		}
8122 	}
8123 out:
8124 	rcu_read_unlock();
8125 	return ERR_PTR(-ENOENT);
8126 }
8127 
8128 static struct nft_object *nft_obj_lookup_byhandle(const struct nft_table *table,
8129 						  const struct nlattr *nla,
8130 						  u32 objtype, u8 genmask)
8131 {
8132 	struct nft_object *obj;
8133 
8134 	list_for_each_entry(obj, &table->objects, list) {
8135 		if (be64_to_cpu(nla_get_be64(nla)) == obj->handle &&
8136 		    objtype == obj->ops->type->type &&
8137 		    nft_active_genmask(obj, genmask))
8138 			return obj;
8139 	}
8140 	return ERR_PTR(-ENOENT);
8141 }
8142 
8143 static const struct nla_policy nft_obj_policy[NFTA_OBJ_MAX + 1] = {
8144 	[NFTA_OBJ_TABLE]	= { .type = NLA_STRING,
8145 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
8146 	[NFTA_OBJ_NAME]		= { .type = NLA_STRING,
8147 				    .len = NFT_OBJ_MAXNAMELEN - 1 },
8148 	[NFTA_OBJ_TYPE]		= { .type = NLA_U32 },
8149 	[NFTA_OBJ_DATA]		= { .type = NLA_NESTED },
8150 	[NFTA_OBJ_HANDLE]	= { .type = NLA_U64},
8151 	[NFTA_OBJ_USERDATA]	= { .type = NLA_BINARY,
8152 				    .len = NFT_USERDATA_MAXLEN },
8153 };
8154 
8155 static struct nft_object *nft_obj_init(const struct nft_ctx *ctx,
8156 				       const struct nft_object_type *type,
8157 				       const struct nlattr *attr)
8158 {
8159 	struct nlattr **tb;
8160 	const struct nft_object_ops *ops;
8161 	struct nft_object *obj;
8162 	int err = -ENOMEM;
8163 
8164 	tb = kmalloc_objs(*tb, type->maxattr + 1);
8165 	if (!tb)
8166 		goto err1;
8167 
8168 	if (attr) {
8169 		err = nla_parse_nested_deprecated(tb, type->maxattr, attr,
8170 						  type->policy, NULL);
8171 		if (err < 0)
8172 			goto err2;
8173 	} else {
8174 		memset(tb, 0, sizeof(tb[0]) * (type->maxattr + 1));
8175 	}
8176 
8177 	if (type->select_ops) {
8178 		ops = type->select_ops(ctx, (const struct nlattr * const *)tb);
8179 		if (IS_ERR(ops)) {
8180 			err = PTR_ERR(ops);
8181 			goto err2;
8182 		}
8183 	} else {
8184 		ops = type->ops;
8185 	}
8186 
8187 	err = -ENOMEM;
8188 	obj = kzalloc(sizeof(*obj) + ops->size, GFP_KERNEL_ACCOUNT);
8189 	if (!obj)
8190 		goto err2;
8191 
8192 	err = ops->init(ctx, (const struct nlattr * const *)tb, obj);
8193 	if (err < 0)
8194 		goto err3;
8195 
8196 	obj->ops = ops;
8197 
8198 	kfree(tb);
8199 	return obj;
8200 err3:
8201 	kfree(obj);
8202 err2:
8203 	kfree(tb);
8204 err1:
8205 	return ERR_PTR(err);
8206 }
8207 
8208 static int nft_object_dump(struct sk_buff *skb, unsigned int attr,
8209 			   struct nft_object *obj, bool reset)
8210 {
8211 	struct nlattr *nest;
8212 
8213 	nest = nla_nest_start_noflag(skb, attr);
8214 	if (!nest)
8215 		goto nla_put_failure;
8216 	if (obj->ops->dump(skb, obj, reset) < 0)
8217 		goto nla_put_failure;
8218 	nla_nest_end(skb, nest);
8219 	return 0;
8220 
8221 nla_put_failure:
8222 	return -1;
8223 }
8224 
8225 static const struct nft_object_type *__nft_obj_type_get(u32 objtype, u8 family)
8226 {
8227 	const struct nft_object_type *type;
8228 
8229 	list_for_each_entry_rcu(type, &nf_tables_objects, list) {
8230 		if (type->family != NFPROTO_UNSPEC &&
8231 		    type->family != family)
8232 			continue;
8233 
8234 		if (objtype == type->type)
8235 			return type;
8236 	}
8237 	return NULL;
8238 }
8239 
8240 static const struct nft_object_type *
8241 nft_obj_type_get(struct net *net, u32 objtype, u8 family)
8242 {
8243 	const struct nft_object_type *type;
8244 
8245 	rcu_read_lock();
8246 	type = __nft_obj_type_get(objtype, family);
8247 	if (type != NULL && try_module_get(type->owner)) {
8248 		rcu_read_unlock();
8249 		return type;
8250 	}
8251 	rcu_read_unlock();
8252 
8253 	lockdep_nfnl_nft_mutex_not_held();
8254 #ifdef CONFIG_MODULES
8255 	if (type == NULL) {
8256 		if (nft_request_module(net, "nft-obj-%u", objtype) == -EAGAIN)
8257 			return ERR_PTR(-EAGAIN);
8258 	}
8259 #endif
8260 	return ERR_PTR(-ENOENT);
8261 }
8262 
8263 static int nf_tables_updobj(const struct nft_ctx *ctx,
8264 			    const struct nft_object_type *type,
8265 			    const struct nlattr *attr,
8266 			    struct nft_object *obj)
8267 {
8268 	struct nft_object *newobj;
8269 	struct nft_trans *trans;
8270 	int err = -ENOMEM;
8271 
8272 	/* caller must have obtained type->owner reference. */
8273 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWOBJ,
8274 				sizeof(struct nft_trans_obj));
8275 	if (!trans)
8276 		goto err_trans;
8277 
8278 	newobj = nft_obj_init(ctx, type, attr);
8279 	if (IS_ERR(newobj)) {
8280 		err = PTR_ERR(newobj);
8281 		goto err_free_trans;
8282 	}
8283 
8284 	nft_trans_obj(trans) = obj;
8285 	nft_trans_obj_update(trans) = true;
8286 	nft_trans_obj_newobj(trans) = newobj;
8287 	nft_trans_commit_list_add_tail(ctx->net, trans);
8288 
8289 	return 0;
8290 
8291 err_free_trans:
8292 	kfree(trans);
8293 err_trans:
8294 	module_put(type->owner);
8295 	return err;
8296 }
8297 
8298 static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
8299 			    const struct nlattr * const nla[])
8300 {
8301 	struct netlink_ext_ack *extack = info->extack;
8302 	u8 genmask = nft_genmask_next(info->net);
8303 	u8 family = info->nfmsg->nfgen_family;
8304 	const struct nft_object_type *type;
8305 	struct net *net = info->net;
8306 	struct nft_table *table;
8307 	struct nft_object *obj;
8308 	struct nft_ctx ctx;
8309 	u32 objtype;
8310 	int err;
8311 
8312 	if (!nla[NFTA_OBJ_TYPE] ||
8313 	    !nla[NFTA_OBJ_NAME] ||
8314 	    !nla[NFTA_OBJ_DATA])
8315 		return -EINVAL;
8316 
8317 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask,
8318 				 NETLINK_CB(skb).portid);
8319 	if (IS_ERR(table)) {
8320 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
8321 		return PTR_ERR(table);
8322 	}
8323 
8324 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8325 	obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
8326 	if (IS_ERR(obj)) {
8327 		err = PTR_ERR(obj);
8328 		if (err != -ENOENT) {
8329 			NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
8330 			return err;
8331 		}
8332 	} else {
8333 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
8334 			NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
8335 			return -EEXIST;
8336 		}
8337 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
8338 			return -EOPNOTSUPP;
8339 
8340 		if (!obj->ops->update)
8341 			return 0;
8342 
8343 		type = nft_obj_type_get(net, objtype, family);
8344 		if (IS_ERR(type)) {
8345 			DEBUG_NET_WARN_ON_ONCE(1);
8346 			return PTR_ERR(type);
8347 		}
8348 
8349 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8350 
8351 		/* type->owner reference is put when transaction object is released. */
8352 		return nf_tables_updobj(&ctx, type, nla[NFTA_OBJ_DATA], obj);
8353 	}
8354 
8355 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8356 
8357 	if (!nft_use_inc(&table->use))
8358 		return -EMFILE;
8359 
8360 	type = nft_obj_type_get(net, objtype, family);
8361 	if (IS_ERR(type)) {
8362 		err = PTR_ERR(type);
8363 		goto err_type;
8364 	}
8365 
8366 	obj = nft_obj_init(&ctx, type, nla[NFTA_OBJ_DATA]);
8367 	if (IS_ERR(obj)) {
8368 		err = PTR_ERR(obj);
8369 		goto err_init;
8370 	}
8371 	obj->key.table = table;
8372 	obj->handle = nf_tables_alloc_handle(table);
8373 
8374 	obj->key.name = nla_strdup(nla[NFTA_OBJ_NAME], GFP_KERNEL_ACCOUNT);
8375 	if (!obj->key.name) {
8376 		err = -ENOMEM;
8377 		goto err_strdup;
8378 	}
8379 
8380 	if (nla[NFTA_OBJ_USERDATA]) {
8381 		obj->udata = nla_memdup(nla[NFTA_OBJ_USERDATA], GFP_KERNEL_ACCOUNT);
8382 		if (obj->udata == NULL)
8383 			goto err_userdata;
8384 
8385 		obj->udlen = nla_len(nla[NFTA_OBJ_USERDATA]);
8386 	}
8387 
8388 	err = nft_trans_obj_add(&ctx, NFT_MSG_NEWOBJ, obj);
8389 	if (err < 0)
8390 		goto err_trans;
8391 
8392 	err = rhltable_insert(&table->objname_ht, &obj->rhlhead,
8393 			      nft_objname_ht_params);
8394 	if (err < 0)
8395 		goto err_obj_ht;
8396 
8397 	list_add_tail_rcu(&obj->list, &table->objects);
8398 
8399 	return 0;
8400 err_obj_ht:
8401 	/* queued in transaction log */
8402 	INIT_LIST_HEAD(&obj->list);
8403 	return err;
8404 err_trans:
8405 	kfree(obj->udata);
8406 err_userdata:
8407 	kfree(obj->key.name);
8408 err_strdup:
8409 	if (obj->ops->destroy)
8410 		obj->ops->destroy(&ctx, obj);
8411 	kfree(obj);
8412 err_init:
8413 	module_put(type->owner);
8414 err_type:
8415 	nft_use_dec_restore(&table->use);
8416 
8417 	return err;
8418 }
8419 
8420 static int nf_tables_fill_obj_info(struct sk_buff *skb, struct net *net,
8421 				   u32 portid, u32 seq, int event, u32 flags,
8422 				   int family, const struct nft_table *table,
8423 				   struct nft_object *obj, bool reset)
8424 {
8425 	struct nlmsghdr *nlh;
8426 
8427 	nlh = nfnl_msg_put(skb, portid, seq,
8428 			   nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event),
8429 			   flags, family, NFNETLINK_V0, nft_base_seq_be16(net));
8430 	if (!nlh)
8431 		goto nla_put_failure;
8432 
8433 	if (nla_put_string(skb, NFTA_OBJ_TABLE, table->name) ||
8434 	    nla_put_string(skb, NFTA_OBJ_NAME, obj->key.name) ||
8435 	    nla_put_be32(skb, NFTA_OBJ_TYPE, htonl(obj->ops->type->type)) ||
8436 	    nla_put_be64(skb, NFTA_OBJ_HANDLE, cpu_to_be64(obj->handle),
8437 			 NFTA_OBJ_PAD))
8438 		goto nla_put_failure;
8439 
8440 	if (event == NFT_MSG_DELOBJ ||
8441 	    event == NFT_MSG_DESTROYOBJ) {
8442 		nlmsg_end(skb, nlh);
8443 		return 0;
8444 	}
8445 
8446 	if (nla_put_be32(skb, NFTA_OBJ_USE, htonl(obj->use)) ||
8447 	    nft_object_dump(skb, NFTA_OBJ_DATA, obj, reset))
8448 		goto nla_put_failure;
8449 
8450 	if (obj->udata &&
8451 	    nla_put(skb, NFTA_OBJ_USERDATA, obj->udlen, obj->udata))
8452 		goto nla_put_failure;
8453 
8454 	nlmsg_end(skb, nlh);
8455 	return 0;
8456 
8457 nla_put_failure:
8458 	nlmsg_trim(skb, nlh);
8459 	return -1;
8460 }
8461 
8462 static void audit_log_obj_reset(const struct nft_table *table,
8463 				unsigned int base_seq, unsigned int nentries)
8464 {
8465 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, base_seq);
8466 
8467 	audit_log_nfcfg(buf, table->family, nentries,
8468 			AUDIT_NFT_OP_OBJ_RESET, GFP_ATOMIC);
8469 	kfree(buf);
8470 }
8471 
8472 struct nft_obj_dump_ctx {
8473 	unsigned int	s_idx;
8474 	char		*table;
8475 	u32		type;
8476 	bool		reset;
8477 };
8478 
8479 static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
8480 {
8481 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
8482 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8483 	struct net *net = sock_net(skb->sk);
8484 	int family = nfmsg->nfgen_family;
8485 	struct nftables_pernet *nft_net;
8486 	const struct nft_table *table;
8487 	unsigned int entries = 0;
8488 	struct nft_object *obj;
8489 	unsigned int idx = 0;
8490 	int rc = 0;
8491 
8492 	rcu_read_lock();
8493 	nft_net = nft_pernet(net);
8494 	cb->seq = nft_base_seq(net);
8495 
8496 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
8497 		if (family != NFPROTO_UNSPEC && family != table->family)
8498 			continue;
8499 
8500 		entries = 0;
8501 		list_for_each_entry_rcu(obj, &table->objects, list) {
8502 			if (!nft_is_active(net, obj))
8503 				goto cont;
8504 			if (idx < ctx->s_idx)
8505 				goto cont;
8506 			if (ctx->table && strcmp(ctx->table, table->name))
8507 				goto cont;
8508 			if (ctx->type != NFT_OBJECT_UNSPEC &&
8509 			    obj->ops->type->type != ctx->type)
8510 				goto cont;
8511 
8512 			rc = nf_tables_fill_obj_info(skb, net,
8513 						     NETLINK_CB(cb->skb).portid,
8514 						     cb->nlh->nlmsg_seq,
8515 						     NFT_MSG_NEWOBJ,
8516 						     NLM_F_MULTI | NLM_F_APPEND,
8517 						     table->family, table,
8518 						     obj, ctx->reset);
8519 			if (rc < 0)
8520 				break;
8521 
8522 			entries++;
8523 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
8524 cont:
8525 			idx++;
8526 		}
8527 		if (ctx->reset && entries)
8528 			audit_log_obj_reset(table, nft_base_seq(net), entries);
8529 		if (rc < 0)
8530 			break;
8531 	}
8532 	rcu_read_unlock();
8533 
8534 	ctx->s_idx = idx;
8535 	return skb->len;
8536 }
8537 
8538 static int nf_tables_dump_obj_start(struct netlink_callback *cb)
8539 {
8540 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8541 	const struct nlattr * const *nla = cb->data;
8542 
8543 	BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx));
8544 
8545 	if (nla[NFTA_OBJ_TABLE]) {
8546 		ctx->table = nla_strdup(nla[NFTA_OBJ_TABLE], GFP_ATOMIC);
8547 		if (!ctx->table)
8548 			return -ENOMEM;
8549 	}
8550 
8551 	if (nla[NFTA_OBJ_TYPE])
8552 		ctx->type = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8553 
8554 	if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
8555 		ctx->reset = true;
8556 
8557 	return 0;
8558 }
8559 
8560 static int nf_tables_dump_obj_done(struct netlink_callback *cb)
8561 {
8562 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8563 
8564 	kfree(ctx->table);
8565 
8566 	return 0;
8567 }
8568 
8569 /* Caller must hold rcu read lock or transaction mutex */
8570 static struct sk_buff *
8571 nf_tables_getobj_single(u32 portid, const struct nfnl_info *info,
8572 			const struct nlattr * const nla[], bool reset)
8573 {
8574 	struct netlink_ext_ack *extack = info->extack;
8575 	u8 genmask = nft_genmask_cur(info->net);
8576 	u8 family = info->nfmsg->nfgen_family;
8577 	struct net *net = info->net;
8578 	struct nft_table *table;
8579 	struct nft_object *obj;
8580 	struct sk_buff *skb2;
8581 	u32 objtype;
8582 	int err;
8583 
8584 	if (!nla[NFTA_OBJ_NAME] ||
8585 	    !nla[NFTA_OBJ_TYPE])
8586 		return ERR_PTR(-EINVAL);
8587 
8588 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask, 0);
8589 	if (IS_ERR(table)) {
8590 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
8591 		return ERR_CAST(table);
8592 	}
8593 
8594 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8595 	obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
8596 	if (IS_ERR(obj)) {
8597 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
8598 		return ERR_CAST(obj);
8599 	}
8600 
8601 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
8602 	if (!skb2)
8603 		return ERR_PTR(-ENOMEM);
8604 
8605 	err = nf_tables_fill_obj_info(skb2, net, portid,
8606 				      info->nlh->nlmsg_seq, NFT_MSG_NEWOBJ, 0,
8607 				      family, table, obj, reset);
8608 	if (err < 0) {
8609 		kfree_skb(skb2);
8610 		return ERR_PTR(err);
8611 	}
8612 
8613 	return skb2;
8614 }
8615 
8616 static int nf_tables_getobj(struct sk_buff *skb, const struct nfnl_info *info,
8617 			    const struct nlattr * const nla[])
8618 {
8619 	u32 portid = NETLINK_CB(skb).portid;
8620 	struct net *net = info->net;
8621 	struct sk_buff *skb2;
8622 	bool reset = false;
8623 	char *buf;
8624 
8625 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
8626 		struct netlink_dump_control c = {
8627 			.start = nf_tables_dump_obj_start,
8628 			.dump = nf_tables_dump_obj,
8629 			.done = nf_tables_dump_obj_done,
8630 			.module = THIS_MODULE,
8631 			.data = (void *)nla,
8632 		};
8633 
8634 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
8635 	}
8636 
8637 	if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
8638 		reset = true;
8639 
8640 	skb2 = nf_tables_getobj_single(portid, info, nla, reset);
8641 	if (IS_ERR(skb2))
8642 		return PTR_ERR(skb2);
8643 
8644 	if (!reset)
8645 		return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
8646 
8647 	buf = kasprintf(GFP_ATOMIC, "%.*s:%u",
8648 			nla_len(nla[NFTA_OBJ_TABLE]),
8649 			(char *)nla_data(nla[NFTA_OBJ_TABLE]),
8650 			nft_base_seq(net));
8651 	audit_log_nfcfg(buf, info->nfmsg->nfgen_family, 1,
8652 			AUDIT_NFT_OP_OBJ_RESET, GFP_ATOMIC);
8653 	kfree(buf);
8654 
8655 	return nfnetlink_unicast(skb2, net, portid);
8656 }
8657 
8658 static void nft_obj_destroy(const struct nft_ctx *ctx, struct nft_object *obj)
8659 {
8660 	if (obj->ops->destroy)
8661 		obj->ops->destroy(ctx, obj);
8662 
8663 	module_put(obj->ops->type->owner);
8664 	kfree(obj->key.name);
8665 	kfree(obj->udata);
8666 	kfree(obj);
8667 }
8668 
8669 static int nf_tables_delobj(struct sk_buff *skb, const struct nfnl_info *info,
8670 			    const struct nlattr * const nla[])
8671 {
8672 	struct netlink_ext_ack *extack = info->extack;
8673 	u8 genmask = nft_genmask_next(info->net);
8674 	u8 family = info->nfmsg->nfgen_family;
8675 	struct net *net = info->net;
8676 	const struct nlattr *attr;
8677 	struct nft_table *table;
8678 	struct nft_object *obj;
8679 	struct nft_ctx ctx;
8680 	u32 objtype;
8681 
8682 	if (!nla[NFTA_OBJ_TYPE] ||
8683 	    (!nla[NFTA_OBJ_NAME] && !nla[NFTA_OBJ_HANDLE]))
8684 		return -EINVAL;
8685 
8686 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask,
8687 				 NETLINK_CB(skb).portid);
8688 	if (IS_ERR(table)) {
8689 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
8690 		return PTR_ERR(table);
8691 	}
8692 
8693 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8694 	if (nla[NFTA_OBJ_HANDLE]) {
8695 		attr = nla[NFTA_OBJ_HANDLE];
8696 		obj = nft_obj_lookup_byhandle(table, attr, objtype, genmask);
8697 	} else {
8698 		attr = nla[NFTA_OBJ_NAME];
8699 		obj = nft_obj_lookup(net, table, attr, objtype, genmask);
8700 	}
8701 
8702 	if (IS_ERR(obj)) {
8703 		if (PTR_ERR(obj) == -ENOENT &&
8704 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYOBJ)
8705 			return 0;
8706 
8707 		NL_SET_BAD_ATTR(extack, attr);
8708 		return PTR_ERR(obj);
8709 	}
8710 	if (obj->use > 0) {
8711 		NL_SET_BAD_ATTR(extack, attr);
8712 		return -EBUSY;
8713 	}
8714 
8715 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8716 
8717 	return nft_delobj(&ctx, obj);
8718 }
8719 
8720 static struct sk_buff *
8721 nft_obj_notify_alloc(struct net *net, const struct nft_table *table,
8722 		     struct nft_object *obj, u32 portid, u32 seq, int event,
8723 		     u16 flags, int family, int report, gfp_t gfp)
8724 {
8725 	struct sk_buff *skb;
8726 	int err;
8727 
8728 	if (!report &&
8729 	    !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
8730 		return NULL;
8731 
8732 	skb = nlmsg_new(NLMSG_GOODSIZE, gfp);
8733 	if (skb == NULL)
8734 		goto err;
8735 
8736 	err = nf_tables_fill_obj_info(skb, net, portid, seq, event,
8737 				      flags & (NLM_F_CREATE | NLM_F_EXCL),
8738 				      family, table, obj, false);
8739 	if (err < 0) {
8740 		kfree_skb(skb);
8741 		goto err;
8742 	}
8743 
8744 	return skb;
8745 err:
8746 	nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
8747 	return NULL;
8748 }
8749 
8750 void nft_obj_notify(struct net *net, const struct nft_table *table,
8751 		    struct nft_object *obj, u32 portid, u32 seq, int event,
8752 		    u16 flags, int family, int report, gfp_t gfp)
8753 {
8754 	char *buf = kasprintf(gfp, "%s:%u",
8755 			      table->name, nft_base_seq(net));
8756 	struct sk_buff *skb;
8757 
8758 	audit_log_nfcfg(buf,
8759 			family,
8760 			obj->handle,
8761 			event == NFT_MSG_NEWOBJ ?
8762 				 AUDIT_NFT_OP_OBJ_REGISTER :
8763 				 AUDIT_NFT_OP_OBJ_UNREGISTER,
8764 			gfp);
8765 	kfree(buf);
8766 
8767 	/* Called from the packet path, holding no mutex: notify_list is
8768 	 * serialised by commit_mutex, so send this notification directly.
8769 	 */
8770 	skb = nft_obj_notify_alloc(net, table, obj, portid, seq, event,
8771 				   flags, family, report, gfp);
8772 	if (skb)
8773 		nfnetlink_send(skb, net, portid, NFNLGRP_NFTABLES, report, gfp);
8774 }
8775 EXPORT_SYMBOL_GPL(nft_obj_notify);
8776 
8777 static void nf_tables_obj_notify(const struct nft_ctx *ctx,
8778 				 struct nft_object *obj, int event)
8779 {
8780 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
8781 	struct sk_buff *skb;
8782 
8783 	skb = nft_obj_notify_alloc(ctx->net, ctx->table, obj, ctx->portid,
8784 				   ctx->seq, event, ctx->flags, ctx->family,
8785 				   ctx->report, GFP_KERNEL);
8786 	if (skb)
8787 		nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
8788 }
8789 
8790 /*
8791  * Flow tables
8792  */
8793 void nft_register_flowtable_type(struct nf_flowtable_type *type)
8794 {
8795 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8796 	list_add_tail_rcu(&type->list, &nf_tables_flowtables);
8797 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8798 }
8799 EXPORT_SYMBOL_GPL(nft_register_flowtable_type);
8800 
8801 void nft_unregister_flowtable_type(struct nf_flowtable_type *type)
8802 {
8803 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8804 	list_del_rcu(&type->list);
8805 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8806 }
8807 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type);
8808 
8809 static const struct nla_policy nft_flowtable_policy[NFTA_FLOWTABLE_MAX + 1] = {
8810 	[NFTA_FLOWTABLE_TABLE]		= { .type = NLA_STRING,
8811 					    .len = NFT_NAME_MAXLEN - 1 },
8812 	[NFTA_FLOWTABLE_NAME]		= { .type = NLA_STRING,
8813 					    .len = NFT_NAME_MAXLEN - 1 },
8814 	[NFTA_FLOWTABLE_HOOK]		= { .type = NLA_NESTED },
8815 	[NFTA_FLOWTABLE_HANDLE]		= { .type = NLA_U64 },
8816 	[NFTA_FLOWTABLE_FLAGS]		= NLA_POLICY_MASK(NLA_BE32, NFT_FLOWTABLE_MASK),
8817 };
8818 
8819 struct nft_flowtable *nft_flowtable_lookup(const struct net *net,
8820 					   const struct nft_table *table,
8821 					   const struct nlattr *nla, u8 genmask)
8822 {
8823 	struct nft_flowtable *flowtable;
8824 
8825 	list_for_each_entry_rcu(flowtable, &table->flowtables, list,
8826 				lockdep_commit_lock_is_held(net)) {
8827 		if (!nla_strcmp(nla, flowtable->name) &&
8828 		    nft_active_genmask(flowtable, genmask))
8829 			return flowtable;
8830 	}
8831 	return ERR_PTR(-ENOENT);
8832 }
8833 EXPORT_SYMBOL_GPL(nft_flowtable_lookup);
8834 
8835 void nf_tables_deactivate_flowtable(const struct nft_ctx *ctx,
8836 				    struct nft_flowtable *flowtable,
8837 				    enum nft_trans_phase phase)
8838 {
8839 	switch (phase) {
8840 	case NFT_TRANS_PREPARE_ERROR:
8841 	case NFT_TRANS_PREPARE:
8842 	case NFT_TRANS_ABORT:
8843 	case NFT_TRANS_RELEASE:
8844 		nft_use_dec(&flowtable->use);
8845 		fallthrough;
8846 	default:
8847 		return;
8848 	}
8849 }
8850 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable);
8851 
8852 static struct nft_flowtable *
8853 nft_flowtable_lookup_byhandle(const struct nft_table *table,
8854 			      const struct nlattr *nla, u8 genmask)
8855 {
8856        struct nft_flowtable *flowtable;
8857 
8858        list_for_each_entry(flowtable, &table->flowtables, list) {
8859                if (be64_to_cpu(nla_get_be64(nla)) == flowtable->handle &&
8860                    nft_active_genmask(flowtable, genmask))
8861                        return flowtable;
8862        }
8863        return ERR_PTR(-ENOENT);
8864 }
8865 
8866 struct nft_flowtable_hook {
8867 	u32			num;
8868 	int			priority;
8869 	struct list_head	list;
8870 };
8871 
8872 static const struct nla_policy nft_flowtable_hook_policy[NFTA_FLOWTABLE_HOOK_MAX + 1] = {
8873 	[NFTA_FLOWTABLE_HOOK_NUM]	= { .type = NLA_U32 },
8874 	[NFTA_FLOWTABLE_HOOK_PRIORITY]	= { .type = NLA_U32 },
8875 	[NFTA_FLOWTABLE_HOOK_DEVS]	= { .type = NLA_NESTED },
8876 };
8877 
8878 static int nft_flowtable_parse_hook(const struct nft_ctx *ctx,
8879 				    const struct nlattr * const nla[],
8880 				    struct nft_flowtable_hook *flowtable_hook,
8881 				    struct nft_flowtable *flowtable,
8882 				    struct netlink_ext_ack *extack, bool add)
8883 {
8884 	struct nlattr *tb[NFTA_FLOWTABLE_HOOK_MAX + 1];
8885 	struct nf_hook_ops *ops;
8886 	struct nft_hook *hook;
8887 	int hooknum, priority;
8888 	int err;
8889 
8890 	INIT_LIST_HEAD(&flowtable_hook->list);
8891 
8892 	err = nla_parse_nested_deprecated(tb, NFTA_FLOWTABLE_HOOK_MAX,
8893 					  nla[NFTA_FLOWTABLE_HOOK],
8894 					  nft_flowtable_hook_policy, NULL);
8895 	if (err < 0)
8896 		return err;
8897 
8898 	if (add) {
8899 		if (!tb[NFTA_FLOWTABLE_HOOK_NUM] ||
8900 		    !tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) {
8901 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
8902 			return -ENOENT;
8903 		}
8904 
8905 		hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
8906 		if (hooknum != NF_NETDEV_INGRESS)
8907 			return -EOPNOTSUPP;
8908 
8909 		priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
8910 
8911 		flowtable_hook->priority	= priority;
8912 		flowtable_hook->num		= hooknum;
8913 	} else {
8914 		if (tb[NFTA_FLOWTABLE_HOOK_NUM]) {
8915 			hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
8916 			if (hooknum != flowtable->hooknum)
8917 				return -EOPNOTSUPP;
8918 		}
8919 
8920 		if (tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) {
8921 			priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
8922 			if (priority != flowtable->data.priority)
8923 				return -EOPNOTSUPP;
8924 		}
8925 
8926 		flowtable_hook->priority	= flowtable->data.priority;
8927 		flowtable_hook->num		= flowtable->hooknum;
8928 	}
8929 
8930 	if (tb[NFTA_FLOWTABLE_HOOK_DEVS]) {
8931 		err = nf_tables_parse_netdev_hooks(ctx->net,
8932 						   tb[NFTA_FLOWTABLE_HOOK_DEVS],
8933 						   &flowtable_hook->list,
8934 						   extack);
8935 		if (err < 0)
8936 			return err;
8937 	}
8938 
8939 	list_for_each_entry(hook, &flowtable_hook->list, list) {
8940 		list_for_each_entry(ops, &hook->ops_list, list) {
8941 			ops->pf			= NFPROTO_NETDEV;
8942 			ops->hooknum		= flowtable_hook->num;
8943 			ops->priority		= flowtable_hook->priority;
8944 			ops->priv		= &flowtable->data;
8945 			ops->hook		= flowtable->data.type->hook;
8946 			ops->hook_ops_type	= NF_HOOK_OP_NFT_FT;
8947 		}
8948 	}
8949 
8950 	return err;
8951 }
8952 
8953 /* call under rcu_read_lock */
8954 static const struct nf_flowtable_type *__nft_flowtable_type_get(u8 family)
8955 {
8956 	const struct nf_flowtable_type *type;
8957 
8958 	list_for_each_entry_rcu(type, &nf_tables_flowtables, list) {
8959 		if (family == type->family)
8960 			return type;
8961 	}
8962 	return NULL;
8963 }
8964 
8965 static const struct nf_flowtable_type *
8966 nft_flowtable_type_get(struct net *net, u8 family)
8967 {
8968 	const struct nf_flowtable_type *type;
8969 
8970 	rcu_read_lock();
8971 	type = __nft_flowtable_type_get(family);
8972 	if (type != NULL && try_module_get(type->owner)) {
8973 		rcu_read_unlock();
8974 		return type;
8975 	}
8976 	rcu_read_unlock();
8977 
8978 	lockdep_nfnl_nft_mutex_not_held();
8979 #ifdef CONFIG_MODULES
8980 	if (type == NULL) {
8981 		if (nft_request_module(net, "nf-flowtable-%u", family) == -EAGAIN)
8982 			return ERR_PTR(-EAGAIN);
8983 	}
8984 #endif
8985 	return ERR_PTR(-ENOENT);
8986 }
8987 
8988 /* Only called from error and netdev event paths. */
8989 static void nft_unregister_flowtable_ops(struct net *net,
8990 					 struct nft_flowtable *flowtable,
8991 					 struct nf_hook_ops *ops)
8992 {
8993 	nf_unregister_net_hook(net, ops);
8994 	flowtable->data.type->setup(&flowtable->data, ops->dev,
8995 				    FLOW_BLOCK_UNBIND);
8996 }
8997 
8998 static void __nft_unregister_flowtable_net_hooks(struct net *net,
8999 						 struct nft_flowtable *flowtable,
9000 						 struct list_head *hook_list,
9001 					         bool release_netdev)
9002 {
9003 	struct nft_hook *hook, *next;
9004 	struct nf_hook_ops *ops;
9005 
9006 	list_for_each_entry_safe(hook, next, hook_list, list) {
9007 		list_for_each_entry(ops, &hook->ops_list, list)
9008 			nft_unregister_flowtable_ops(net, flowtable, ops);
9009 		if (release_netdev)
9010 			nft_netdev_hook_unlink_free_rcu(hook);
9011 	}
9012 }
9013 
9014 static void nft_unregister_flowtable_net_hooks(struct net *net,
9015 					       struct nft_flowtable *flowtable,
9016 					       struct list_head *hook_list)
9017 {
9018 	__nft_unregister_flowtable_net_hooks(net, flowtable, hook_list, false);
9019 }
9020 
9021 static int nft_register_flowtable_ops(struct net *net,
9022 				      struct nft_flowtable *flowtable,
9023 				      struct nf_hook_ops *ops)
9024 {
9025 	int err;
9026 
9027 	err = flowtable->data.type->setup(&flowtable->data,
9028 					  ops->dev, FLOW_BLOCK_BIND);
9029 	if (err < 0)
9030 		return err;
9031 
9032 	err = nf_register_net_hook(net, ops);
9033 	if (!err)
9034 		return 0;
9035 
9036 	flowtable->data.type->setup(&flowtable->data,
9037 				    ops->dev, FLOW_BLOCK_UNBIND);
9038 	return err;
9039 }
9040 
9041 static int nft_register_flowtable_net_hooks(struct net *net,
9042 					    struct nft_table *table,
9043 					    struct list_head *hook_list,
9044 					    struct nft_flowtable *flowtable)
9045 {
9046 	struct nft_hook *hook, *next;
9047 	struct nft_flowtable *ft;
9048 	struct nf_hook_ops *ops;
9049 	int err, i = 0;
9050 
9051 	list_for_each_entry(hook, hook_list, list) {
9052 		list_for_each_entry(ft, &table->flowtables, list) {
9053 			if (!nft_is_active_next(net, ft))
9054 				continue;
9055 
9056 			if (nft_hook_list_find(&ft->hook_list, hook)) {
9057 				err = -EEXIST;
9058 				goto err_unregister_net_hooks;
9059 			}
9060 		}
9061 
9062 		list_for_each_entry(ops, &hook->ops_list, list) {
9063 			err = nft_register_flowtable_ops(net, flowtable, ops);
9064 			if (err < 0)
9065 				goto err_unregister_net_hooks;
9066 
9067 			i++;
9068 		}
9069 	}
9070 
9071 	return 0;
9072 
9073 err_unregister_net_hooks:
9074 	list_for_each_entry_safe(hook, next, hook_list, list) {
9075 		list_for_each_entry(ops, &hook->ops_list, list) {
9076 			if (i-- <= 0)
9077 				break;
9078 
9079 			nft_unregister_flowtable_ops(net, flowtable, ops);
9080 		}
9081 		nft_netdev_hook_unlink_free_rcu(hook);
9082 	}
9083 
9084 	return err;
9085 }
9086 
9087 static void nft_hooks_destroy(struct list_head *hook_list)
9088 {
9089 	struct nft_hook *hook, *next;
9090 
9091 	list_for_each_entry_safe(hook, next, hook_list, list)
9092 		nft_netdev_hook_unlink_free_rcu(hook);
9093 }
9094 
9095 static void nft_flowtable_unregister_trans_hook(struct net *net,
9096 						struct nft_flowtable *flowtable,
9097 						struct list_head *hook_list)
9098 {
9099 	struct nft_trans_hook *trans_hook, *next;
9100 	struct nf_hook_ops *ops;
9101 	struct nft_hook *hook;
9102 
9103 	list_for_each_entry_safe(trans_hook, next, hook_list, list) {
9104 		hook = trans_hook->hook;
9105 		list_for_each_entry(ops, &hook->ops_list, list)
9106 			nft_unregister_flowtable_ops(net, flowtable, ops);
9107 
9108 		nft_netdev_hook_unlink_free_rcu(hook);
9109 		nft_trans_hook_destroy(trans_hook);
9110 	}
9111 }
9112 
9113 static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh,
9114 				struct nft_flowtable *flowtable,
9115 				struct netlink_ext_ack *extack)
9116 {
9117 	const struct nlattr * const *nla = ctx->nla;
9118 	struct nft_flowtable_hook flowtable_hook;
9119 	struct nftables_pernet *nft_net;
9120 	struct nft_hook *hook, *next;
9121 	struct nf_hook_ops *ops;
9122 	struct nft_trans *trans;
9123 	bool unregister = false;
9124 	u32 flags;
9125 	int err;
9126 
9127 	err = nft_flowtable_parse_hook(ctx, nla, &flowtable_hook, flowtable,
9128 				       extack, false);
9129 	if (err < 0)
9130 		return err;
9131 
9132 	list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
9133 		if (nft_hook_list_find(&flowtable->hook_list, hook)) {
9134 			list_del(&hook->list);
9135 			nft_netdev_hook_free(hook);
9136 			continue;
9137 		}
9138 
9139 		nft_net = nft_pernet(ctx->net);
9140 		list_for_each_entry(trans, &nft_net->commit_list, list) {
9141 			if (trans->msg_type != NFT_MSG_NEWFLOWTABLE ||
9142 			    trans->table != ctx->table ||
9143 			    !nft_trans_flowtable_update(trans))
9144 				continue;
9145 
9146 			if (nft_hook_list_find(&nft_trans_flowtable_hooks(trans), hook)) {
9147 				err = -EEXIST;
9148 				goto err_flowtable_update_hook;
9149 			}
9150 		}
9151 	}
9152 
9153 	if (nla[NFTA_FLOWTABLE_FLAGS]) {
9154 		flags = ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
9155 		if (flags & ~NFT_FLOWTABLE_MASK) {
9156 			err = -EOPNOTSUPP;
9157 			goto err_flowtable_update_hook;
9158 		}
9159 		if ((flowtable->data.flags & NFT_FLOWTABLE_HW_OFFLOAD) ^
9160 		    (flags & NFT_FLOWTABLE_HW_OFFLOAD)) {
9161 			err = -EOPNOTSUPP;
9162 			goto err_flowtable_update_hook;
9163 		}
9164 	} else {
9165 		flags = flowtable->data.flags;
9166 	}
9167 
9168 	err = nft_register_flowtable_net_hooks(ctx->net, ctx->table,
9169 					       &flowtable_hook.list, flowtable);
9170 	if (err < 0)
9171 		goto err_flowtable_update_hook;
9172 
9173 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWFLOWTABLE,
9174 				sizeof(struct nft_trans_flowtable));
9175 	if (!trans) {
9176 		unregister = true;
9177 		err = -ENOMEM;
9178 		goto err_flowtable_update_hook;
9179 	}
9180 
9181 	nft_trans_flowtable_flags(trans) = flags;
9182 	nft_trans_flowtable(trans) = flowtable;
9183 	nft_trans_flowtable_update(trans) = true;
9184 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
9185 	list_splice(&flowtable_hook.list, &nft_trans_flowtable_hooks(trans));
9186 
9187 	nft_trans_commit_list_add_tail(ctx->net, trans);
9188 
9189 	return 0;
9190 
9191 err_flowtable_update_hook:
9192 	list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
9193 		if (unregister) {
9194 			list_for_each_entry(ops, &hook->ops_list, list)
9195 				nft_unregister_flowtable_ops(ctx->net,
9196 							     flowtable, ops);
9197 		}
9198 		nft_netdev_hook_unlink_free_rcu(hook);
9199 	}
9200 
9201 	return err;
9202 
9203 }
9204 
9205 static int nf_tables_newflowtable(struct sk_buff *skb,
9206 				  const struct nfnl_info *info,
9207 				  const struct nlattr * const nla[])
9208 {
9209 	struct netlink_ext_ack *extack = info->extack;
9210 	struct nft_flowtable_hook flowtable_hook;
9211 	u8 genmask = nft_genmask_next(info->net);
9212 	u8 family = info->nfmsg->nfgen_family;
9213 	const struct nf_flowtable_type *type;
9214 	struct nft_flowtable *flowtable;
9215 	struct net *net = info->net;
9216 	struct nft_table *table;
9217 	struct nft_trans *trans;
9218 	struct nft_ctx ctx;
9219 	int err;
9220 
9221 	if (!nla[NFTA_FLOWTABLE_TABLE] ||
9222 	    !nla[NFTA_FLOWTABLE_NAME] ||
9223 	    !nla[NFTA_FLOWTABLE_HOOK])
9224 		return -EINVAL;
9225 
9226 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
9227 				 genmask, NETLINK_CB(skb).portid);
9228 	if (IS_ERR(table)) {
9229 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
9230 		return PTR_ERR(table);
9231 	}
9232 
9233 	flowtable = nft_flowtable_lookup(net, table, nla[NFTA_FLOWTABLE_NAME],
9234 					 genmask);
9235 	if (IS_ERR(flowtable)) {
9236 		err = PTR_ERR(flowtable);
9237 		if (err != -ENOENT) {
9238 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
9239 			return err;
9240 		}
9241 	} else {
9242 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
9243 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
9244 			return -EEXIST;
9245 		}
9246 
9247 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
9248 
9249 		return nft_flowtable_update(&ctx, info->nlh, flowtable, extack);
9250 	}
9251 
9252 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
9253 
9254 	if (!nft_use_inc(&table->use))
9255 		return -EMFILE;
9256 
9257 	flowtable = kzalloc_obj(*flowtable, GFP_KERNEL_ACCOUNT);
9258 	if (!flowtable) {
9259 		err = -ENOMEM;
9260 		goto flowtable_alloc;
9261 	}
9262 
9263 	flowtable->table = table;
9264 	flowtable->handle = nf_tables_alloc_handle(table);
9265 	INIT_LIST_HEAD(&flowtable->hook_list);
9266 
9267 	flowtable->name = nla_strdup(nla[NFTA_FLOWTABLE_NAME], GFP_KERNEL_ACCOUNT);
9268 	if (!flowtable->name) {
9269 		err = -ENOMEM;
9270 		goto err1;
9271 	}
9272 
9273 	type = nft_flowtable_type_get(net, family);
9274 	if (IS_ERR(type)) {
9275 		err = PTR_ERR(type);
9276 		goto err2;
9277 	}
9278 
9279 	if (nla[NFTA_FLOWTABLE_FLAGS]) {
9280 		flowtable->data.flags =
9281 			ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
9282 		if (flowtable->data.flags & ~NFT_FLOWTABLE_MASK) {
9283 			err = -EOPNOTSUPP;
9284 			goto err3;
9285 		}
9286 	}
9287 
9288 	write_pnet(&flowtable->data.net, net);
9289 	flowtable->data.type = type;
9290 	err = type->init(&flowtable->data);
9291 	if (err < 0)
9292 		goto err3;
9293 
9294 	err = nft_flowtable_parse_hook(&ctx, nla, &flowtable_hook, flowtable,
9295 				       extack, true);
9296 	if (err < 0)
9297 		goto err_flowtable_parse_hooks;
9298 
9299 	list_splice(&flowtable_hook.list, &flowtable->hook_list);
9300 	flowtable->data.priority = flowtable_hook.priority;
9301 	flowtable->hooknum = flowtable_hook.num;
9302 
9303 	trans = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable);
9304 	if (IS_ERR(trans)) {
9305 		err = PTR_ERR(trans);
9306 		goto err_flowtable_trans;
9307 	}
9308 
9309 	/* This must be LAST to ensure no packets are walking over this flowtable. */
9310 	err = nft_register_flowtable_net_hooks(ctx.net, table,
9311 					       &flowtable->hook_list,
9312 					       flowtable);
9313 	if (err < 0)
9314 		goto err_flowtable_hooks;
9315 
9316 	list_add_tail_rcu(&flowtable->list, &table->flowtables);
9317 
9318 	return 0;
9319 
9320 err_flowtable_hooks:
9321 	synchronize_rcu();
9322 	nft_trans_destroy(trans);
9323 err_flowtable_trans:
9324 	nft_hooks_destroy(&flowtable->hook_list);
9325 err_flowtable_parse_hooks:
9326 	flowtable->data.type->free(&flowtable->data);
9327 err3:
9328 	module_put(type->owner);
9329 err2:
9330 	kfree(flowtable->name);
9331 err1:
9332 	kfree(flowtable);
9333 flowtable_alloc:
9334 	nft_use_dec_restore(&table->use);
9335 
9336 	return err;
9337 }
9338 
9339 static void nft_flowtable_hook_release(struct nft_flowtable_hook *flowtable_hook)
9340 {
9341 	struct nft_hook *this, *next;
9342 
9343 	list_for_each_entry_safe(this, next, &flowtable_hook->list, list) {
9344 		list_del(&this->list);
9345 		nft_netdev_hook_free(this);
9346 	}
9347 }
9348 
9349 static int nft_delflowtable_hook(struct nft_ctx *ctx,
9350 				 struct nft_flowtable *flowtable,
9351 				 struct netlink_ext_ack *extack)
9352 {
9353 	const struct nlattr * const *nla = ctx->nla;
9354 	struct nft_flowtable_hook flowtable_hook;
9355 	LIST_HEAD(flowtable_del_list);
9356 	struct nft_hook *this, *hook;
9357 	struct nft_trans *trans;
9358 	int err;
9359 
9360 	err = nft_flowtable_parse_hook(ctx, nla, &flowtable_hook, flowtable,
9361 				       extack, false);
9362 	if (err < 0)
9363 		return err;
9364 
9365 	list_for_each_entry(this, &flowtable_hook.list, list) {
9366 		hook = nft_hook_list_find(&flowtable->hook_list, this);
9367 		if (!hook) {
9368 			err = -ENOENT;
9369 			goto err_flowtable_del_hook;
9370 		}
9371 		if (nft_trans_delhook(hook, &flowtable_del_list) < 0) {
9372 			err = -ENOMEM;
9373 			goto err_flowtable_del_hook;
9374 		}
9375 	}
9376 
9377 	trans = nft_trans_alloc(ctx, NFT_MSG_DELFLOWTABLE,
9378 				sizeof(struct nft_trans_flowtable));
9379 	if (!trans) {
9380 		err = -ENOMEM;
9381 		goto err_flowtable_del_hook;
9382 	}
9383 
9384 	nft_trans_flowtable(trans) = flowtable;
9385 	nft_trans_flowtable_update(trans) = true;
9386 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
9387 	list_splice(&flowtable_del_list, &nft_trans_flowtable_hooks(trans));
9388 	nft_flowtable_hook_release(&flowtable_hook);
9389 
9390 	nft_trans_commit_list_add_tail(ctx->net, trans);
9391 
9392 	return 0;
9393 
9394 err_flowtable_del_hook:
9395 	nft_trans_delhook_abort(&flowtable_del_list);
9396 	nft_flowtable_hook_release(&flowtable_hook);
9397 
9398 	return err;
9399 }
9400 
9401 static int nf_tables_delflowtable(struct sk_buff *skb,
9402 				  const struct nfnl_info *info,
9403 				  const struct nlattr * const nla[])
9404 {
9405 	struct netlink_ext_ack *extack = info->extack;
9406 	u8 genmask = nft_genmask_next(info->net);
9407 	u8 family = info->nfmsg->nfgen_family;
9408 	struct nft_flowtable *flowtable;
9409 	struct net *net = info->net;
9410 	const struct nlattr *attr;
9411 	struct nft_table *table;
9412 	struct nft_ctx ctx;
9413 
9414 	if (!nla[NFTA_FLOWTABLE_TABLE] ||
9415 	    (!nla[NFTA_FLOWTABLE_NAME] &&
9416 	     !nla[NFTA_FLOWTABLE_HANDLE]))
9417 		return -EINVAL;
9418 
9419 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
9420 				 genmask, NETLINK_CB(skb).portid);
9421 	if (IS_ERR(table)) {
9422 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
9423 		return PTR_ERR(table);
9424 	}
9425 
9426 	if (nla[NFTA_FLOWTABLE_HANDLE]) {
9427 		attr = nla[NFTA_FLOWTABLE_HANDLE];
9428 		flowtable = nft_flowtable_lookup_byhandle(table, attr, genmask);
9429 	} else {
9430 		attr = nla[NFTA_FLOWTABLE_NAME];
9431 		flowtable = nft_flowtable_lookup(net, table, attr, genmask);
9432 	}
9433 
9434 	if (IS_ERR(flowtable)) {
9435 		if (PTR_ERR(flowtable) == -ENOENT &&
9436 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYFLOWTABLE)
9437 			return 0;
9438 
9439 		NL_SET_BAD_ATTR(extack, attr);
9440 		return PTR_ERR(flowtable);
9441 	}
9442 
9443 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
9444 
9445 	if (nla[NFTA_FLOWTABLE_HOOK])
9446 		return nft_delflowtable_hook(&ctx, flowtable, extack);
9447 
9448 	if (flowtable->use > 0) {
9449 		NL_SET_BAD_ATTR(extack, attr);
9450 		return -EBUSY;
9451 	}
9452 
9453 	return nft_delflowtable(&ctx, flowtable);
9454 }
9455 
9456 static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net,
9457 					 u32 portid, u32 seq, int event,
9458 					 u32 flags, int family,
9459 					 struct nft_flowtable *flowtable,
9460 					 struct list_head *hook_list,
9461 					 struct list_head *trans_hook_list)
9462 {
9463 	struct nft_trans_hook *trans_hook;
9464 	struct nlattr *nest, *nest_devs;
9465 	struct nft_hook *hook;
9466 	struct nlmsghdr *nlh;
9467 
9468 	nlh = nfnl_msg_put(skb, portid, seq,
9469 			   nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event),
9470 			   flags, family, NFNETLINK_V0, nft_base_seq_be16(net));
9471 	if (!nlh)
9472 		goto nla_put_failure;
9473 
9474 	if (nla_put_string(skb, NFTA_FLOWTABLE_TABLE, flowtable->table->name) ||
9475 	    nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
9476 	    nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),
9477 			 NFTA_FLOWTABLE_PAD))
9478 		goto nla_put_failure;
9479 
9480 	if (!hook_list && !trans_hook_list &&
9481 	    (event == NFT_MSG_DELFLOWTABLE ||
9482 	     event == NFT_MSG_DESTROYFLOWTABLE)) {
9483 		nlmsg_end(skb, nlh);
9484 		return 0;
9485 	}
9486 
9487 	if (nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
9488 	    nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags)))
9489 		goto nla_put_failure;
9490 
9491 	nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK);
9492 	if (!nest)
9493 		goto nla_put_failure;
9494 	if (nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_NUM, htonl(flowtable->hooknum)) ||
9495 	    nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_PRIORITY, htonl(flowtable->data.priority)))
9496 		goto nla_put_failure;
9497 
9498 	nest_devs = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK_DEVS);
9499 	if (!nest_devs)
9500 		goto nla_put_failure;
9501 
9502 	if (!hook_list && !trans_hook_list)
9503 		hook_list = &flowtable->hook_list;
9504 
9505 	if (hook_list) {
9506 		list_for_each_entry_rcu(hook, hook_list, list,
9507 					lockdep_commit_lock_is_held(net)) {
9508 			if (nft_nla_put_hook_dev(skb, hook))
9509 				goto nla_put_failure;
9510 		}
9511 	} else if (trans_hook_list) {
9512 		list_for_each_entry(trans_hook, trans_hook_list, list) {
9513 			if (nft_nla_put_hook_dev(skb, trans_hook->hook))
9514 				goto nla_put_failure;
9515 		}
9516 	}
9517 	nla_nest_end(skb, nest_devs);
9518 	nla_nest_end(skb, nest);
9519 
9520 	nlmsg_end(skb, nlh);
9521 	return 0;
9522 
9523 nla_put_failure:
9524 	nlmsg_trim(skb, nlh);
9525 	return -1;
9526 }
9527 
9528 struct nft_flowtable_filter {
9529 	char		*table;
9530 };
9531 
9532 static int nf_tables_dump_flowtable(struct sk_buff *skb,
9533 				    struct netlink_callback *cb)
9534 {
9535 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
9536 	struct nft_flowtable_filter *filter = cb->data;
9537 	unsigned int idx = 0, s_idx = cb->args[0];
9538 	struct net *net = sock_net(skb->sk);
9539 	int family = nfmsg->nfgen_family;
9540 	struct nft_flowtable *flowtable;
9541 	struct nftables_pernet *nft_net;
9542 	const struct nft_table *table;
9543 
9544 	rcu_read_lock();
9545 	nft_net = nft_pernet(net);
9546 	cb->seq = nft_base_seq(net);
9547 
9548 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
9549 		if (family != NFPROTO_UNSPEC && family != table->family)
9550 			continue;
9551 
9552 		list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
9553 			if (!nft_is_active(net, flowtable))
9554 				goto cont;
9555 			if (idx < s_idx)
9556 				goto cont;
9557 			if (idx > s_idx)
9558 				memset(&cb->args[1], 0,
9559 				       sizeof(cb->args) - sizeof(cb->args[0]));
9560 			if (filter && filter->table &&
9561 			    strcmp(filter->table, table->name))
9562 				goto cont;
9563 
9564 			if (nf_tables_fill_flowtable_info(skb, net, NETLINK_CB(cb->skb).portid,
9565 							  cb->nlh->nlmsg_seq,
9566 							  NFT_MSG_NEWFLOWTABLE,
9567 							  NLM_F_MULTI | NLM_F_APPEND,
9568 							  table->family,
9569 							  flowtable, NULL, NULL) < 0)
9570 				goto done;
9571 
9572 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
9573 cont:
9574 			idx++;
9575 		}
9576 	}
9577 done:
9578 	rcu_read_unlock();
9579 
9580 	cb->args[0] = idx;
9581 	return skb->len;
9582 }
9583 
9584 static int nf_tables_dump_flowtable_start(struct netlink_callback *cb)
9585 {
9586 	const struct nlattr * const *nla = cb->data;
9587 	struct nft_flowtable_filter *filter = NULL;
9588 
9589 	if (nla[NFTA_FLOWTABLE_TABLE]) {
9590 		filter = kzalloc_obj(*filter, GFP_ATOMIC);
9591 		if (!filter)
9592 			return -ENOMEM;
9593 
9594 		filter->table = nla_strdup(nla[NFTA_FLOWTABLE_TABLE],
9595 					   GFP_ATOMIC);
9596 		if (!filter->table) {
9597 			kfree(filter);
9598 			return -ENOMEM;
9599 		}
9600 	}
9601 
9602 	cb->data = filter;
9603 	return 0;
9604 }
9605 
9606 static int nf_tables_dump_flowtable_done(struct netlink_callback *cb)
9607 {
9608 	struct nft_flowtable_filter *filter = cb->data;
9609 
9610 	if (!filter)
9611 		return 0;
9612 
9613 	kfree(filter->table);
9614 	kfree(filter);
9615 
9616 	return 0;
9617 }
9618 
9619 /* called with rcu_read_lock held */
9620 static int nf_tables_getflowtable(struct sk_buff *skb,
9621 				  const struct nfnl_info *info,
9622 				  const struct nlattr * const nla[])
9623 {
9624 	struct netlink_ext_ack *extack = info->extack;
9625 	u8 genmask = nft_genmask_cur(info->net);
9626 	u8 family = info->nfmsg->nfgen_family;
9627 	struct nft_flowtable *flowtable;
9628 	const struct nft_table *table;
9629 	struct net *net = info->net;
9630 	struct sk_buff *skb2;
9631 	int err;
9632 
9633 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
9634 		struct netlink_dump_control c = {
9635 			.start = nf_tables_dump_flowtable_start,
9636 			.dump = nf_tables_dump_flowtable,
9637 			.done = nf_tables_dump_flowtable_done,
9638 			.module = THIS_MODULE,
9639 			.data = (void *)nla,
9640 		};
9641 
9642 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
9643 	}
9644 
9645 	if (!nla[NFTA_FLOWTABLE_NAME])
9646 		return -EINVAL;
9647 
9648 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
9649 				 genmask, 0);
9650 	if (IS_ERR(table)) {
9651 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
9652 		return PTR_ERR(table);
9653 	}
9654 
9655 	flowtable = nft_flowtable_lookup(net, table, nla[NFTA_FLOWTABLE_NAME],
9656 					 genmask);
9657 	if (IS_ERR(flowtable)) {
9658 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
9659 		return PTR_ERR(flowtable);
9660 	}
9661 
9662 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
9663 	if (!skb2)
9664 		return -ENOMEM;
9665 
9666 	err = nf_tables_fill_flowtable_info(skb2, net, NETLINK_CB(skb).portid,
9667 					    info->nlh->nlmsg_seq,
9668 					    NFT_MSG_NEWFLOWTABLE, 0, family,
9669 					    flowtable, NULL, NULL);
9670 	if (err < 0)
9671 		goto err_fill_flowtable_info;
9672 
9673 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
9674 
9675 err_fill_flowtable_info:
9676 	kfree_skb(skb2);
9677 	return err;
9678 }
9679 
9680 static void nf_tables_flowtable_notify(struct nft_ctx *ctx,
9681 				       struct nft_flowtable *flowtable,
9682 				       struct list_head *hook_list,
9683 				       struct list_head *trans_hook_list,
9684 				       int event)
9685 {
9686 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
9687 	struct sk_buff *skb;
9688 	u16 flags = 0;
9689 	int err;
9690 
9691 	if (!ctx->report &&
9692 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
9693 		return;
9694 
9695 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
9696 	if (skb == NULL)
9697 		goto err;
9698 
9699 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
9700 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
9701 
9702 	err = nf_tables_fill_flowtable_info(skb, ctx->net, ctx->portid,
9703 					    ctx->seq, event, flags,
9704 					    ctx->family, flowtable,
9705 					    hook_list, trans_hook_list);
9706 	if (err < 0) {
9707 		kfree_skb(skb);
9708 		goto err;
9709 	}
9710 
9711 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
9712 	return;
9713 err:
9714 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
9715 }
9716 
9717 static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
9718 {
9719 	flowtable->data.type->free(&flowtable->data);
9720 	nft_hooks_destroy(&flowtable->hook_list);
9721 	kfree(flowtable->name);
9722 	module_put(flowtable->data.type->owner);
9723 	kfree(flowtable);
9724 }
9725 
9726 static int nf_tables_fill_gen_info(struct sk_buff *skb, struct net *net,
9727 				   u32 portid, u32 seq)
9728 {
9729 	struct nlmsghdr *nlh;
9730 	char buf[TASK_COMM_LEN];
9731 	int event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWGEN);
9732 
9733 	nlh = nfnl_msg_put(skb, portid, seq, event, 0, AF_UNSPEC,
9734 			   NFNETLINK_V0, nft_base_seq_be16(net));
9735 	if (!nlh)
9736 		goto nla_put_failure;
9737 
9738 	if (nla_put_be32(skb, NFTA_GEN_ID, htonl(nft_base_seq(net))) ||
9739 	    nla_put_be32(skb, NFTA_GEN_PROC_PID, htonl(task_pid_nr(current))) ||
9740 	    nla_put_string(skb, NFTA_GEN_PROC_NAME, get_task_comm(buf, current)))
9741 		goto nla_put_failure;
9742 
9743 	nlmsg_end(skb, nlh);
9744 	return 0;
9745 
9746 nla_put_failure:
9747 	nlmsg_trim(skb, nlh);
9748 	return -EMSGSIZE;
9749 }
9750 
9751 struct nf_hook_ops *nft_hook_find_ops(const struct nft_hook *hook,
9752 				      const struct net_device *dev)
9753 {
9754 	struct nf_hook_ops *ops;
9755 
9756 	list_for_each_entry(ops, &hook->ops_list, list) {
9757 		if (ops->dev == dev)
9758 			return ops;
9759 	}
9760 	return NULL;
9761 }
9762 EXPORT_SYMBOL_GPL(nft_hook_find_ops);
9763 
9764 struct nf_hook_ops *nft_hook_find_ops_rcu(const struct nft_hook *hook,
9765 					  const struct net_device *dev)
9766 {
9767 	struct nf_hook_ops *ops;
9768 
9769 	list_for_each_entry_rcu(ops, &hook->ops_list, list) {
9770 		if (ops->dev == dev)
9771 			return ops;
9772 	}
9773 	return NULL;
9774 }
9775 EXPORT_SYMBOL_GPL(nft_hook_find_ops_rcu);
9776 
9777 static int nft_flowtable_event(unsigned long event, struct net_device *dev,
9778 			       struct nft_flowtable *flowtable, bool changename)
9779 {
9780 	struct nf_hook_ops *ops;
9781 	struct nft_hook *hook;
9782 	bool match;
9783 
9784 	list_for_each_entry(hook, &flowtable->hook_list, list) {
9785 		ops = nft_hook_find_ops(hook, dev);
9786 		match = !strncmp(hook->ifname, dev->name, hook->ifnamelen);
9787 
9788 		switch (event) {
9789 		case NETDEV_UNREGISTER:
9790 			/* NOP if not found or new name still matching */
9791 			if (!ops || (changename && match))
9792 				continue;
9793 
9794 			/* flow_offload_netdev_event() cleans up entries for us. */
9795 			nft_unregister_flowtable_ops(dev_net(dev),
9796 						     flowtable, ops);
9797 			list_del_rcu(&ops->list);
9798 			kfree_rcu(ops, rcu);
9799 			break;
9800 		case NETDEV_REGISTER:
9801 			/* NOP if not matching or already registered */
9802 			if (!match || ops)
9803 				continue;
9804 
9805 			ops = kzalloc_obj(struct nf_hook_ops,
9806 					  GFP_KERNEL_ACCOUNT);
9807 			if (!ops)
9808 				return 1;
9809 
9810 			ops->pf			= NFPROTO_NETDEV;
9811 			ops->hooknum		= flowtable->hooknum;
9812 			ops->priority		= flowtable->data.priority;
9813 			ops->priv		= &flowtable->data;
9814 			ops->hook		= flowtable->data.type->hook;
9815 			ops->hook_ops_type	= NF_HOOK_OP_NFT_FT;
9816 			ops->dev		= dev;
9817 			if (nft_register_flowtable_ops(dev_net(dev),
9818 						       flowtable, ops)) {
9819 				kfree(ops);
9820 				return 1;
9821 			}
9822 			list_add_tail_rcu(&ops->list, &hook->ops_list);
9823 			break;
9824 		}
9825 		break;
9826 	}
9827 	return 0;
9828 }
9829 
9830 static int __nf_tables_flowtable_event(unsigned long event,
9831 				       struct net_device *dev,
9832 				       bool changename)
9833 {
9834 	struct nftables_pernet *nft_net = nft_pernet(dev_net(dev));
9835 	struct nft_flowtable *flowtable;
9836 	struct nft_table *table;
9837 
9838 	list_for_each_entry(table, &nft_net->tables, list) {
9839 		list_for_each_entry(flowtable, &table->flowtables, list) {
9840 			if (nft_flowtable_event(event, dev,
9841 						flowtable, changename))
9842 				return 1;
9843 		}
9844 	}
9845 	return 0;
9846 }
9847 
9848 static int nf_tables_flowtable_event(struct notifier_block *this,
9849 				     unsigned long event, void *ptr)
9850 {
9851 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
9852 	struct nftables_pernet *nft_net;
9853 	int ret = NOTIFY_DONE;
9854 	struct net *net;
9855 
9856 	if (event != NETDEV_REGISTER &&
9857 	    event != NETDEV_UNREGISTER &&
9858 	    event != NETDEV_CHANGENAME)
9859 		return NOTIFY_DONE;
9860 
9861 	net = dev_net(dev);
9862 	nft_net = nft_pernet(net);
9863 	mutex_lock(&nft_net->commit_mutex);
9864 
9865 	if (event == NETDEV_CHANGENAME) {
9866 		if (__nf_tables_flowtable_event(NETDEV_REGISTER, dev, true)) {
9867 			ret = NOTIFY_BAD;
9868 			goto out_unlock;
9869 		}
9870 		__nf_tables_flowtable_event(NETDEV_UNREGISTER, dev, true);
9871 	} else if (__nf_tables_flowtable_event(event, dev, false)) {
9872 		ret = NOTIFY_BAD;
9873 	}
9874 out_unlock:
9875 	mutex_unlock(&nft_net->commit_mutex);
9876 	return ret;
9877 }
9878 
9879 static struct notifier_block nf_tables_flowtable_notifier = {
9880 	.notifier_call	= nf_tables_flowtable_event,
9881 };
9882 
9883 static void nf_tables_gen_notify(struct net *net, struct sk_buff *skb,
9884 				 int event)
9885 {
9886 	struct nlmsghdr *nlh = nlmsg_hdr(skb);
9887 	struct sk_buff *skb2;
9888 	int err;
9889 
9890 	if (!nlmsg_report(nlh) &&
9891 	    !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
9892 		return;
9893 
9894 	skb2 = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
9895 	if (skb2 == NULL)
9896 		goto err;
9897 
9898 	err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
9899 				      nlh->nlmsg_seq);
9900 	if (err < 0) {
9901 		kfree_skb(skb2);
9902 		goto err;
9903 	}
9904 
9905 	nfnetlink_send(skb2, net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
9906 		       nlmsg_report(nlh), GFP_KERNEL);
9907 	return;
9908 err:
9909 	nfnetlink_set_err(net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
9910 			  -ENOBUFS);
9911 }
9912 
9913 static int nf_tables_getgen(struct sk_buff *skb, const struct nfnl_info *info,
9914 			    const struct nlattr * const nla[])
9915 {
9916 	struct sk_buff *skb2;
9917 	int err;
9918 
9919 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
9920 	if (skb2 == NULL)
9921 		return -ENOMEM;
9922 
9923 	err = nf_tables_fill_gen_info(skb2, info->net, NETLINK_CB(skb).portid,
9924 				      info->nlh->nlmsg_seq);
9925 	if (err < 0)
9926 		goto err_fill_gen_info;
9927 
9928 	return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid);
9929 
9930 err_fill_gen_info:
9931 	kfree_skb(skb2);
9932 	return err;
9933 }
9934 
9935 static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = {
9936 	[NFT_MSG_NEWTABLE] = {
9937 		.call		= nf_tables_newtable,
9938 		.type		= NFNL_CB_BATCH,
9939 		.attr_count	= NFTA_TABLE_MAX,
9940 		.policy		= nft_table_policy,
9941 	},
9942 	[NFT_MSG_GETTABLE] = {
9943 		.call		= nf_tables_gettable,
9944 		.type		= NFNL_CB_RCU,
9945 		.attr_count	= NFTA_TABLE_MAX,
9946 		.policy		= nft_table_policy,
9947 	},
9948 	[NFT_MSG_DELTABLE] = {
9949 		.call		= nf_tables_deltable,
9950 		.type		= NFNL_CB_BATCH,
9951 		.attr_count	= NFTA_TABLE_MAX,
9952 		.policy		= nft_table_policy,
9953 	},
9954 	[NFT_MSG_DESTROYTABLE] = {
9955 		.call		= nf_tables_deltable,
9956 		.type		= NFNL_CB_BATCH,
9957 		.attr_count	= NFTA_TABLE_MAX,
9958 		.policy		= nft_table_policy,
9959 	},
9960 	[NFT_MSG_NEWCHAIN] = {
9961 		.call		= nf_tables_newchain,
9962 		.type		= NFNL_CB_BATCH,
9963 		.attr_count	= NFTA_CHAIN_MAX,
9964 		.policy		= nft_chain_policy,
9965 	},
9966 	[NFT_MSG_GETCHAIN] = {
9967 		.call		= nf_tables_getchain,
9968 		.type		= NFNL_CB_RCU,
9969 		.attr_count	= NFTA_CHAIN_MAX,
9970 		.policy		= nft_chain_policy,
9971 	},
9972 	[NFT_MSG_DELCHAIN] = {
9973 		.call		= nf_tables_delchain,
9974 		.type		= NFNL_CB_BATCH,
9975 		.attr_count	= NFTA_CHAIN_MAX,
9976 		.policy		= nft_chain_policy,
9977 	},
9978 	[NFT_MSG_DESTROYCHAIN] = {
9979 		.call		= nf_tables_delchain,
9980 		.type		= NFNL_CB_BATCH,
9981 		.attr_count	= NFTA_CHAIN_MAX,
9982 		.policy		= nft_chain_policy,
9983 	},
9984 	[NFT_MSG_NEWRULE] = {
9985 		.call		= nf_tables_newrule,
9986 		.type		= NFNL_CB_BATCH,
9987 		.attr_count	= NFTA_RULE_MAX,
9988 		.policy		= nft_rule_policy,
9989 	},
9990 	[NFT_MSG_GETRULE] = {
9991 		.call		= nf_tables_getrule,
9992 		.type		= NFNL_CB_RCU,
9993 		.attr_count	= NFTA_RULE_MAX,
9994 		.policy		= nft_rule_policy,
9995 	},
9996 	[NFT_MSG_GETRULE_RESET] = {
9997 		.call		= nf_tables_getrule,
9998 		.type		= NFNL_CB_RCU,
9999 		.attr_count	= NFTA_RULE_MAX,
10000 		.policy		= nft_rule_policy,
10001 	},
10002 	[NFT_MSG_DELRULE] = {
10003 		.call		= nf_tables_delrule,
10004 		.type		= NFNL_CB_BATCH,
10005 		.attr_count	= NFTA_RULE_MAX,
10006 		.policy		= nft_rule_policy,
10007 	},
10008 	[NFT_MSG_DESTROYRULE] = {
10009 		.call		= nf_tables_delrule,
10010 		.type		= NFNL_CB_BATCH,
10011 		.attr_count	= NFTA_RULE_MAX,
10012 		.policy		= nft_rule_policy,
10013 	},
10014 	[NFT_MSG_NEWSET] = {
10015 		.call		= nf_tables_newset,
10016 		.type		= NFNL_CB_BATCH,
10017 		.attr_count	= NFTA_SET_MAX,
10018 		.policy		= nft_set_policy,
10019 	},
10020 	[NFT_MSG_GETSET] = {
10021 		.call		= nf_tables_getset,
10022 		.type		= NFNL_CB_RCU,
10023 		.attr_count	= NFTA_SET_MAX,
10024 		.policy		= nft_set_policy,
10025 	},
10026 	[NFT_MSG_DELSET] = {
10027 		.call		= nf_tables_delset,
10028 		.type		= NFNL_CB_BATCH,
10029 		.attr_count	= NFTA_SET_MAX,
10030 		.policy		= nft_set_policy,
10031 	},
10032 	[NFT_MSG_DESTROYSET] = {
10033 		.call		= nf_tables_delset,
10034 		.type		= NFNL_CB_BATCH,
10035 		.attr_count	= NFTA_SET_MAX,
10036 		.policy		= nft_set_policy,
10037 	},
10038 	[NFT_MSG_NEWSETELEM] = {
10039 		.call		= nf_tables_newsetelem,
10040 		.type		= NFNL_CB_BATCH,
10041 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
10042 		.policy		= nft_set_elem_list_policy,
10043 	},
10044 	[NFT_MSG_GETSETELEM] = {
10045 		.call		= nf_tables_getsetelem,
10046 		.type		= NFNL_CB_RCU,
10047 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
10048 		.policy		= nft_set_elem_list_policy,
10049 	},
10050 	[NFT_MSG_GETSETELEM_RESET] = {
10051 		.call		= nf_tables_getsetelem,
10052 		.type		= NFNL_CB_RCU,
10053 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
10054 		.policy		= nft_set_elem_list_policy,
10055 	},
10056 	[NFT_MSG_DELSETELEM] = {
10057 		.call		= nf_tables_delsetelem,
10058 		.type		= NFNL_CB_BATCH,
10059 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
10060 		.policy		= nft_set_elem_list_policy,
10061 	},
10062 	[NFT_MSG_DESTROYSETELEM] = {
10063 		.call		= nf_tables_delsetelem,
10064 		.type		= NFNL_CB_BATCH,
10065 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
10066 		.policy		= nft_set_elem_list_policy,
10067 	},
10068 	[NFT_MSG_GETGEN] = {
10069 		.call		= nf_tables_getgen,
10070 		.type		= NFNL_CB_RCU,
10071 	},
10072 	[NFT_MSG_NEWOBJ] = {
10073 		.call		= nf_tables_newobj,
10074 		.type		= NFNL_CB_BATCH,
10075 		.attr_count	= NFTA_OBJ_MAX,
10076 		.policy		= nft_obj_policy,
10077 	},
10078 	[NFT_MSG_GETOBJ] = {
10079 		.call		= nf_tables_getobj,
10080 		.type		= NFNL_CB_RCU,
10081 		.attr_count	= NFTA_OBJ_MAX,
10082 		.policy		= nft_obj_policy,
10083 	},
10084 	[NFT_MSG_DELOBJ] = {
10085 		.call		= nf_tables_delobj,
10086 		.type		= NFNL_CB_BATCH,
10087 		.attr_count	= NFTA_OBJ_MAX,
10088 		.policy		= nft_obj_policy,
10089 	},
10090 	[NFT_MSG_DESTROYOBJ] = {
10091 		.call		= nf_tables_delobj,
10092 		.type		= NFNL_CB_BATCH,
10093 		.attr_count	= NFTA_OBJ_MAX,
10094 		.policy		= nft_obj_policy,
10095 	},
10096 	[NFT_MSG_GETOBJ_RESET] = {
10097 		.call		= nf_tables_getobj,
10098 		.type		= NFNL_CB_RCU,
10099 		.attr_count	= NFTA_OBJ_MAX,
10100 		.policy		= nft_obj_policy,
10101 	},
10102 	[NFT_MSG_NEWFLOWTABLE] = {
10103 		.call		= nf_tables_newflowtable,
10104 		.type		= NFNL_CB_BATCH,
10105 		.attr_count	= NFTA_FLOWTABLE_MAX,
10106 		.policy		= nft_flowtable_policy,
10107 	},
10108 	[NFT_MSG_GETFLOWTABLE] = {
10109 		.call		= nf_tables_getflowtable,
10110 		.type		= NFNL_CB_RCU,
10111 		.attr_count	= NFTA_FLOWTABLE_MAX,
10112 		.policy		= nft_flowtable_policy,
10113 	},
10114 	[NFT_MSG_DELFLOWTABLE] = {
10115 		.call		= nf_tables_delflowtable,
10116 		.type		= NFNL_CB_BATCH,
10117 		.attr_count	= NFTA_FLOWTABLE_MAX,
10118 		.policy		= nft_flowtable_policy,
10119 	},
10120 	[NFT_MSG_DESTROYFLOWTABLE] = {
10121 		.call		= nf_tables_delflowtable,
10122 		.type		= NFNL_CB_BATCH,
10123 		.attr_count	= NFTA_FLOWTABLE_MAX,
10124 		.policy		= nft_flowtable_policy,
10125 	},
10126 };
10127 
10128 static int nf_tables_validate(struct net *net)
10129 {
10130 	struct nftables_pernet *nft_net = nft_pernet(net);
10131 	struct nft_table *table;
10132 
10133 	list_for_each_entry(table, &nft_net->tables, list) {
10134 		switch (table->validate_state) {
10135 		case NFT_VALIDATE_SKIP:
10136 			continue;
10137 		case NFT_VALIDATE_NEED:
10138 			nft_validate_state_update(table, NFT_VALIDATE_DO);
10139 			fallthrough;
10140 		case NFT_VALIDATE_DO:
10141 			if (nft_table_validate(net, table) < 0)
10142 				return -EAGAIN;
10143 
10144 			nft_validate_state_update(table, NFT_VALIDATE_SKIP);
10145 			break;
10146 		}
10147 	}
10148 
10149 	return 0;
10150 }
10151 
10152 /* a drop policy has to be deferred until all rules have been activated,
10153  * otherwise a large ruleset that contains a drop-policy base chain will
10154  * cause all packets to get dropped until the full transaction has been
10155  * processed.
10156  *
10157  * We defer the drop policy until the transaction has been finalized.
10158  */
10159 static void nft_chain_commit_drop_policy(struct nft_trans_chain *trans)
10160 {
10161 	struct nft_base_chain *basechain;
10162 
10163 	if (trans->policy != NF_DROP)
10164 		return;
10165 
10166 	if (!nft_is_base_chain(trans->chain))
10167 		return;
10168 
10169 	basechain = nft_base_chain(trans->chain);
10170 	basechain->policy = NF_DROP;
10171 }
10172 
10173 static void nft_chain_commit_update(struct nft_trans_chain *trans)
10174 {
10175 	struct nft_table *table = trans->nft_trans_binding.nft_trans.table;
10176 	struct nft_base_chain *basechain;
10177 
10178 	if (trans->name) {
10179 		rhltable_remove(&table->chains_ht,
10180 				&trans->chain->rhlhead,
10181 				nft_chain_ht_params);
10182 		swap(trans->chain->name, trans->name);
10183 		rhltable_insert_key(&table->chains_ht,
10184 				    trans->chain->name,
10185 				    &trans->chain->rhlhead,
10186 				    nft_chain_ht_params);
10187 	}
10188 
10189 	if (!nft_is_base_chain(trans->chain))
10190 		return;
10191 
10192 	nft_chain_stats_replace(trans);
10193 
10194 	basechain = nft_base_chain(trans->chain);
10195 
10196 	switch (trans->policy) {
10197 	case NF_DROP:
10198 	case NF_ACCEPT:
10199 		basechain->policy = trans->policy;
10200 		break;
10201 	}
10202 }
10203 
10204 static void nft_obj_commit_update(const struct nft_ctx *ctx,
10205 				  struct nft_trans *trans)
10206 {
10207 	struct nft_object *newobj;
10208 	struct nft_object *obj;
10209 
10210 	obj = nft_trans_obj(trans);
10211 	newobj = nft_trans_obj_newobj(trans);
10212 
10213 	if (WARN_ON_ONCE(!obj->ops->update))
10214 		return;
10215 
10216 	obj->ops->update(obj, newobj);
10217 	nft_obj_destroy(ctx, newobj);
10218 }
10219 
10220 static void nft_commit_release(struct nft_trans *trans)
10221 {
10222 	struct nft_ctx ctx = {
10223 		.net = trans->net,
10224 	};
10225 
10226 	nft_ctx_update(&ctx, trans);
10227 
10228 	switch (trans->msg_type) {
10229 	case NFT_MSG_DELTABLE:
10230 	case NFT_MSG_DESTROYTABLE:
10231 		nf_tables_table_destroy(trans->table);
10232 		break;
10233 	case NFT_MSG_NEWCHAIN:
10234 		free_percpu(nft_trans_chain_stats(trans));
10235 		kfree(nft_trans_chain_name(trans));
10236 		break;
10237 	case NFT_MSG_DELCHAIN:
10238 	case NFT_MSG_DESTROYCHAIN:
10239 		if (!nft_trans_chain_update(trans))
10240 			nf_tables_chain_destroy(nft_trans_chain(trans));
10241 		break;
10242 	case NFT_MSG_DELRULE:
10243 	case NFT_MSG_DESTROYRULE:
10244 		nf_tables_rule_destroy(&ctx, nft_trans_rule(trans));
10245 		break;
10246 	case NFT_MSG_DELSET:
10247 	case NFT_MSG_DESTROYSET:
10248 		nft_set_destroy(&ctx, nft_trans_set(trans));
10249 		break;
10250 	case NFT_MSG_DELSETELEM:
10251 	case NFT_MSG_DESTROYSETELEM:
10252 		nft_trans_elems_destroy(&ctx, nft_trans_container_elem(trans));
10253 		break;
10254 	case NFT_MSG_DELOBJ:
10255 	case NFT_MSG_DESTROYOBJ:
10256 		nft_obj_destroy(&ctx, nft_trans_obj(trans));
10257 		break;
10258 	case NFT_MSG_DELFLOWTABLE:
10259 	case NFT_MSG_DESTROYFLOWTABLE:
10260 		if (!nft_trans_flowtable_update(trans))
10261 			nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
10262 		break;
10263 	}
10264 
10265 	if (trans->put_net)
10266 		put_net(trans->net);
10267 
10268 	kfree(trans);
10269 }
10270 
10271 static void nf_tables_trans_destroy_work(struct work_struct *w)
10272 {
10273 	struct nftables_pernet *nft_net = container_of(w, struct nftables_pernet, destroy_work);
10274 	struct nft_trans *trans, *next;
10275 	LIST_HEAD(head);
10276 
10277 	spin_lock(&nf_tables_destroy_list_lock);
10278 	list_splice_init(&nft_net->destroy_list, &head);
10279 	spin_unlock(&nf_tables_destroy_list_lock);
10280 
10281 	if (list_empty(&head))
10282 		return;
10283 
10284 	synchronize_rcu();
10285 
10286 	list_for_each_entry_safe(trans, next, &head, list) {
10287 		nft_trans_list_del(trans);
10288 		nft_commit_release(trans);
10289 	}
10290 }
10291 
10292 void nf_tables_trans_destroy_flush_work(struct net *net)
10293 {
10294 	struct nftables_pernet *nft_net = nft_pernet(net);
10295 
10296 	flush_work(&nft_net->destroy_work);
10297 }
10298 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work);
10299 
10300 static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *chain)
10301 {
10302 	const struct nft_expr *expr, *last;
10303 	unsigned int size, data_size;
10304 	void *data, *data_boundary;
10305 	struct nft_rule_dp *prule;
10306 	struct nft_rule *rule;
10307 
10308 	/* already handled or inactive chain? */
10309 	if (chain->blob_next || !nft_is_active_next(net, chain))
10310 		return 0;
10311 
10312 	data_size = 0;
10313 	list_for_each_entry(rule, &chain->rules, list) {
10314 		if (nft_is_active_next(net, rule)) {
10315 			data_size += sizeof(*prule) + rule->dlen;
10316 			if (data_size > INT_MAX)
10317 				return -ENOMEM;
10318 		}
10319 	}
10320 
10321 	chain->blob_next = nf_tables_chain_alloc_rules(chain, data_size);
10322 	if (!chain->blob_next)
10323 		return -ENOMEM;
10324 
10325 	data = (void *)chain->blob_next->data;
10326 	data_boundary = data + data_size;
10327 	size = 0;
10328 
10329 	list_for_each_entry(rule, &chain->rules, list) {
10330 		if (!nft_is_active_next(net, rule))
10331 			continue;
10332 
10333 		prule = (struct nft_rule_dp *)data;
10334 		data += offsetof(struct nft_rule_dp, data);
10335 		if (unlikely(data > data_boundary)) {
10336 			DEBUG_NET_WARN_ON_ONCE(1);
10337 			return -ENOMEM;
10338 		}
10339 
10340 		size = 0;
10341 		nft_rule_for_each_expr(expr, last, rule) {
10342 			if (unlikely(data + size + expr->ops->size > data_boundary)) {
10343 				DEBUG_NET_WARN_ON_ONCE(1);
10344 				return -ENOMEM;
10345 			}
10346 
10347 			memcpy(data + size, expr, expr->ops->size);
10348 			size += expr->ops->size;
10349 		}
10350 		if (unlikely(size >= 1 << 12)) {
10351 			DEBUG_NET_WARN_ON_ONCE(1);
10352 			return -ENOMEM;
10353 		}
10354 
10355 		prule->handle = rule->handle;
10356 		prule->dlen = size;
10357 		prule->is_last = 0;
10358 
10359 		data += size;
10360 		size = 0;
10361 		chain->blob_next->size += (unsigned long)(data - (void *)prule);
10362 	}
10363 
10364 	if (unlikely(data > data_boundary)) {
10365 		DEBUG_NET_WARN_ON_ONCE(1);
10366 		return -ENOMEM;
10367 	}
10368 
10369 	prule = (struct nft_rule_dp *)data;
10370 	nft_last_rule(chain, prule);
10371 
10372 	return 0;
10373 }
10374 
10375 static void nf_tables_commit_chain_prepare_cancel(struct net *net)
10376 {
10377 	struct nftables_pernet *nft_net = nft_pernet(net);
10378 	struct nft_trans *trans, *next;
10379 
10380 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
10381 		if (trans->msg_type == NFT_MSG_NEWRULE ||
10382 		    trans->msg_type == NFT_MSG_DELRULE) {
10383 			struct nft_chain *chain = nft_trans_rule_chain(trans);
10384 
10385 			kvfree(chain->blob_next);
10386 			chain->blob_next = NULL;
10387 		}
10388 	}
10389 }
10390 
10391 static void __nf_tables_commit_chain_free_rules(struct rcu_head *h)
10392 {
10393 	struct nft_rule_dp_last *l = container_of(h, struct nft_rule_dp_last, h);
10394 
10395 	kvfree(l->blob);
10396 }
10397 
10398 static void nf_tables_commit_chain_free_rules_old(struct nft_rule_blob *blob)
10399 {
10400 	struct nft_rule_dp_last *last;
10401 
10402 	/* last rule trailer is after end marker */
10403 	last = (void *)blob + sizeof(*blob) + blob->size;
10404 	last->blob = blob;
10405 
10406 	call_rcu(&last->h, __nf_tables_commit_chain_free_rules);
10407 }
10408 
10409 static void nf_tables_commit_chain(struct net *net, struct nft_chain *chain)
10410 {
10411 	struct nft_rule_blob *g0, *g1;
10412 	bool next_genbit;
10413 
10414 	next_genbit = nft_gencursor_next(net);
10415 
10416 	g0 = rcu_dereference_protected(chain->blob_gen_0,
10417 				       lockdep_commit_lock_is_held(net));
10418 	g1 = rcu_dereference_protected(chain->blob_gen_1,
10419 				       lockdep_commit_lock_is_held(net));
10420 
10421 	/* No changes to this chain? */
10422 	if (chain->blob_next == NULL) {
10423 		/* chain had no change in last or next generation */
10424 		if (g0 == g1)
10425 			return;
10426 		/*
10427 		 * chain had no change in this generation; make sure next
10428 		 * one uses same rules as current generation.
10429 		 */
10430 		if (next_genbit) {
10431 			rcu_assign_pointer(chain->blob_gen_1, g0);
10432 			nf_tables_commit_chain_free_rules_old(g1);
10433 		} else {
10434 			rcu_assign_pointer(chain->blob_gen_0, g1);
10435 			nf_tables_commit_chain_free_rules_old(g0);
10436 		}
10437 
10438 		return;
10439 	}
10440 
10441 	if (next_genbit)
10442 		rcu_assign_pointer(chain->blob_gen_1, chain->blob_next);
10443 	else
10444 		rcu_assign_pointer(chain->blob_gen_0, chain->blob_next);
10445 
10446 	chain->blob_next = NULL;
10447 
10448 	if (g0 == g1)
10449 		return;
10450 
10451 	if (next_genbit)
10452 		nf_tables_commit_chain_free_rules_old(g1);
10453 	else
10454 		nf_tables_commit_chain_free_rules_old(g0);
10455 }
10456 
10457 static void nft_obj_del(struct nft_table *table, struct nft_object *obj)
10458 {
10459 	rhltable_remove(&table->objname_ht, &obj->rhlhead, nft_objname_ht_params);
10460 	list_del_rcu(&obj->list);
10461 }
10462 
10463 void nft_chain_del(struct nft_chain *chain)
10464 {
10465 	struct nft_table *table = chain->table;
10466 
10467 	WARN_ON_ONCE(rhltable_remove(&table->chains_ht, &chain->rhlhead,
10468 				     nft_chain_ht_params));
10469 	list_del_rcu(&chain->list);
10470 }
10471 
10472 static void nft_trans_gc_setelem_remove(struct nft_ctx *ctx,
10473 					struct nft_trans_gc *trans)
10474 {
10475 	struct nft_elem_priv **priv = trans->priv;
10476 	unsigned int i;
10477 
10478 	for (i = 0; i < trans->count; i++) {
10479 		nft_setelem_data_deactivate(ctx->net, trans->set, priv[i]);
10480 		nft_setelem_remove(ctx->net, trans->set, priv[i]);
10481 	}
10482 }
10483 
10484 void nft_trans_gc_destroy(struct nft_trans_gc *trans)
10485 {
10486 	nft_set_put(trans->set);
10487 	put_net(trans->net);
10488 	kfree(trans);
10489 }
10490 
10491 static void nft_trans_gc_trans_free(struct rcu_head *rcu)
10492 {
10493 	struct nft_elem_priv *elem_priv;
10494 	struct nft_trans_gc *trans;
10495 	struct nft_ctx ctx = {};
10496 	unsigned int i;
10497 
10498 	trans = container_of(rcu, struct nft_trans_gc, rcu);
10499 	ctx.net	= read_pnet(&trans->set->net);
10500 
10501 	for (i = 0; i < trans->count; i++) {
10502 		elem_priv = trans->priv[i];
10503 		if (!nft_setelem_is_catchall(trans->set, elem_priv))
10504 			atomic_dec(&trans->set->nelems);
10505 
10506 		nf_tables_set_elem_destroy(&ctx, trans->set, elem_priv);
10507 	}
10508 
10509 	nft_trans_gc_destroy(trans);
10510 }
10511 
10512 static bool nft_trans_gc_work_done(struct nft_trans_gc *trans)
10513 {
10514 	struct nftables_pernet *nft_net;
10515 	struct nft_ctx ctx = {};
10516 
10517 	nft_net = nft_pernet(trans->net);
10518 
10519 	mutex_lock(&nft_net->commit_mutex);
10520 
10521 	/* Check for race with transaction, otherwise this batch refers to
10522 	 * stale objects that might not be there anymore. Skip transaction if
10523 	 * set has been destroyed from control plane transaction in case gc
10524 	 * worker loses race.
10525 	 */
10526 	if (READ_ONCE(nft_net->gc_seq) != trans->seq || trans->set->dead) {
10527 		mutex_unlock(&nft_net->commit_mutex);
10528 		return false;
10529 	}
10530 
10531 	ctx.net = trans->net;
10532 	ctx.table = trans->set->table;
10533 
10534 	nft_trans_gc_setelem_remove(&ctx, trans);
10535 	mutex_unlock(&nft_net->commit_mutex);
10536 
10537 	return true;
10538 }
10539 
10540 static void nft_trans_gc_work(struct work_struct *work)
10541 {
10542 	struct nft_trans_gc *trans, *next;
10543 	LIST_HEAD(trans_gc_list);
10544 
10545 	spin_lock(&nf_tables_gc_list_lock);
10546 	list_splice_init(&nf_tables_gc_list, &trans_gc_list);
10547 	spin_unlock(&nf_tables_gc_list_lock);
10548 
10549 	list_for_each_entry_safe(trans, next, &trans_gc_list, list) {
10550 		list_del(&trans->list);
10551 		if (!nft_trans_gc_work_done(trans)) {
10552 			nft_trans_gc_destroy(trans);
10553 			continue;
10554 		}
10555 		call_rcu(&trans->rcu, nft_trans_gc_trans_free);
10556 	}
10557 }
10558 
10559 struct nft_trans_gc *nft_trans_gc_alloc(struct nft_set *set,
10560 					unsigned int gc_seq, gfp_t gfp)
10561 {
10562 	struct net *net = read_pnet(&set->net);
10563 	struct nft_trans_gc *trans;
10564 
10565 	trans = kzalloc_obj(*trans, gfp);
10566 	if (!trans)
10567 		return NULL;
10568 
10569 	trans->net = maybe_get_net(net);
10570 	if (!trans->net) {
10571 		kfree(trans);
10572 		return NULL;
10573 	}
10574 
10575 	refcount_inc(&set->refs);
10576 	trans->set = set;
10577 	trans->seq = gc_seq;
10578 
10579 	return trans;
10580 }
10581 
10582 void nft_trans_gc_elem_add(struct nft_trans_gc *trans, void *priv)
10583 {
10584 	trans->priv[trans->count++] = priv;
10585 }
10586 
10587 static void nft_trans_gc_queue_work(struct nft_trans_gc *trans)
10588 {
10589 	spin_lock(&nf_tables_gc_list_lock);
10590 	list_add_tail(&trans->list, &nf_tables_gc_list);
10591 	spin_unlock(&nf_tables_gc_list_lock);
10592 
10593 	schedule_work(&trans_gc_work);
10594 }
10595 
10596 struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
10597 					      unsigned int gc_seq, gfp_t gfp)
10598 {
10599 	struct nft_set *set;
10600 
10601 	if (nft_trans_gc_space(gc))
10602 		return gc;
10603 
10604 	set = gc->set;
10605 	nft_trans_gc_queue_work(gc);
10606 
10607 	return nft_trans_gc_alloc(set, gc_seq, gfp);
10608 }
10609 
10610 void nft_trans_gc_queue_async_done(struct nft_trans_gc *trans)
10611 {
10612 	if (trans->count == 0) {
10613 		nft_trans_gc_destroy(trans);
10614 		return;
10615 	}
10616 
10617 	nft_trans_gc_queue_work(trans);
10618 }
10619 
10620 struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp)
10621 {
10622 	struct nft_set *set;
10623 
10624 	if (WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net)))
10625 		return NULL;
10626 
10627 	if (nft_trans_gc_space(gc))
10628 		return gc;
10629 
10630 	set = gc->set;
10631 	call_rcu(&gc->rcu, nft_trans_gc_trans_free);
10632 
10633 	return nft_trans_gc_alloc(set, 0, gfp);
10634 }
10635 
10636 void nft_trans_gc_queue_sync_done(struct nft_trans_gc *trans)
10637 {
10638 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(trans->net));
10639 
10640 	if (trans->count == 0) {
10641 		nft_trans_gc_destroy(trans);
10642 		return;
10643 	}
10644 
10645 	call_rcu(&trans->rcu, nft_trans_gc_trans_free);
10646 }
10647 
10648 struct nft_trans_gc *nft_trans_gc_catchall_async(struct nft_trans_gc *gc,
10649 						 unsigned int gc_seq)
10650 {
10651 	struct nft_set_elem_catchall *catchall;
10652 	const struct nft_set *set = gc->set;
10653 	struct nft_set_ext *ext;
10654 
10655 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
10656 		ext = nft_set_elem_ext(set, catchall->elem);
10657 
10658 		if (!nft_set_elem_expired(ext))
10659 			continue;
10660 		if (nft_set_elem_is_dead(ext))
10661 			goto dead_elem;
10662 
10663 		nft_set_elem_dead(ext);
10664 dead_elem:
10665 		gc = nft_trans_gc_queue_async(gc, gc_seq, GFP_ATOMIC);
10666 		if (!gc)
10667 			return NULL;
10668 
10669 		nft_trans_gc_elem_add(gc, catchall->elem);
10670 	}
10671 
10672 	return gc;
10673 }
10674 
10675 struct nft_trans_gc *nft_trans_gc_catchall_sync(struct nft_trans_gc *gc)
10676 {
10677 	struct nft_set_elem_catchall *catchall, *next;
10678 	u64 tstamp = nft_net_tstamp(gc->net);
10679 	const struct nft_set *set = gc->set;
10680 	struct nft_elem_priv *elem_priv;
10681 	struct nft_set_ext *ext;
10682 
10683 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net));
10684 
10685 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
10686 		ext = nft_set_elem_ext(set, catchall->elem);
10687 
10688 		if (!__nft_set_elem_expired(ext, tstamp))
10689 			continue;
10690 
10691 		gc = nft_trans_gc_queue_sync(gc, GFP_KERNEL);
10692 		if (!gc)
10693 			return NULL;
10694 
10695 		elem_priv = catchall->elem;
10696 		nft_setelem_data_deactivate(gc->net, gc->set, elem_priv);
10697 		nft_setelem_catchall_destroy(catchall);
10698 		nft_trans_gc_elem_add(gc, elem_priv);
10699 	}
10700 
10701 	return gc;
10702 }
10703 
10704 static void nf_tables_module_autoload_cleanup(struct net *net)
10705 {
10706 	struct nftables_pernet *nft_net = nft_pernet(net);
10707 	struct nft_module_request *req, *next;
10708 
10709 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
10710 	list_for_each_entry_safe(req, next, &nft_net->module_list, list) {
10711 		WARN_ON_ONCE(!req->done);
10712 		list_del(&req->list);
10713 		kfree(req);
10714 	}
10715 }
10716 
10717 static void nf_tables_commit_release(struct net *net)
10718 {
10719 	struct nftables_pernet *nft_net = nft_pernet(net);
10720 	struct nft_trans *trans;
10721 
10722 	/* all side effects have to be made visible.
10723 	 * For example, if a chain named 'foo' has been deleted, a
10724 	 * new transaction must not find it anymore.
10725 	 *
10726 	 * Memory reclaim happens asynchronously from work queue
10727 	 * to prevent expensive synchronize_rcu() in commit phase.
10728 	 */
10729 	if (list_empty(&nft_net->commit_list)) {
10730 		nf_tables_module_autoload_cleanup(net);
10731 		mutex_unlock(&nft_net->commit_mutex);
10732 		return;
10733 	}
10734 
10735 	trans = list_last_entry(&nft_net->commit_list,
10736 				struct nft_trans, list);
10737 	get_net(trans->net);
10738 	WARN_ON_ONCE(trans->put_net);
10739 
10740 	trans->put_net = true;
10741 	spin_lock(&nf_tables_destroy_list_lock);
10742 	list_splice_tail_init(&nft_net->commit_list, &nft_net->destroy_list);
10743 	spin_unlock(&nf_tables_destroy_list_lock);
10744 
10745 	nf_tables_module_autoload_cleanup(net);
10746 	schedule_work(&nft_net->destroy_work);
10747 
10748 	mutex_unlock(&nft_net->commit_mutex);
10749 }
10750 
10751 static void nft_commit_notify(struct net *net, u32 portid)
10752 {
10753 	struct nftables_pernet *nft_net = nft_pernet(net);
10754 	struct sk_buff *batch_skb = NULL, *nskb, *skb;
10755 	unsigned char *data;
10756 	int len;
10757 
10758 	list_for_each_entry_safe(skb, nskb, &nft_net->notify_list, list) {
10759 		if (!batch_skb) {
10760 new_batch:
10761 			batch_skb = skb;
10762 			len = NLMSG_GOODSIZE - skb->len;
10763 			list_del(&skb->list);
10764 			continue;
10765 		}
10766 		len -= skb->len;
10767 		if (len > 0 && NFT_CB(skb).report == NFT_CB(batch_skb).report) {
10768 			data = skb_put(batch_skb, skb->len);
10769 			memcpy(data, skb->data, skb->len);
10770 			list_del(&skb->list);
10771 			kfree_skb(skb);
10772 			continue;
10773 		}
10774 		nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES,
10775 			       NFT_CB(batch_skb).report, GFP_KERNEL);
10776 		goto new_batch;
10777 	}
10778 
10779 	if (batch_skb) {
10780 		nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES,
10781 			       NFT_CB(batch_skb).report, GFP_KERNEL);
10782 	}
10783 
10784 	WARN_ON_ONCE(!list_empty(&nft_net->notify_list));
10785 }
10786 
10787 static int nf_tables_commit_audit_alloc(struct list_head *adl,
10788 					struct nft_table *table)
10789 {
10790 	struct nft_audit_data *adp;
10791 
10792 	list_for_each_entry(adp, adl, list) {
10793 		if (adp->table == table)
10794 			return 0;
10795 	}
10796 	adp = kzalloc_obj(*adp);
10797 	if (!adp)
10798 		return -ENOMEM;
10799 	adp->table = table;
10800 	list_add(&adp->list, adl);
10801 	return 0;
10802 }
10803 
10804 static void nf_tables_commit_audit_free(struct list_head *adl)
10805 {
10806 	struct nft_audit_data *adp, *adn;
10807 
10808 	list_for_each_entry_safe(adp, adn, adl, list) {
10809 		list_del(&adp->list);
10810 		kfree(adp);
10811 	}
10812 }
10813 
10814 /* nft audit emits the number of elements that get added/removed/updated,
10815  * so NEW/DELSETELEM needs to increment based on the total elem count.
10816  */
10817 static unsigned int nf_tables_commit_audit_entrycount(const struct nft_trans *trans)
10818 {
10819 	switch (trans->msg_type) {
10820 	case NFT_MSG_NEWSETELEM:
10821 	case NFT_MSG_DELSETELEM:
10822 		return nft_trans_container_elem(trans)->nelems;
10823 	}
10824 
10825 	return 1;
10826 }
10827 
10828 static void nf_tables_commit_audit_collect(struct list_head *adl,
10829 					   const struct nft_trans *trans, u32 op)
10830 {
10831 	const struct nft_table *table = trans->table;
10832 	struct nft_audit_data *adp;
10833 
10834 	list_for_each_entry(adp, adl, list) {
10835 		if (adp->table == table)
10836 			goto found;
10837 	}
10838 	WARN_ONCE(1, "table=%s not expected in commit list", table->name);
10839 	return;
10840 found:
10841 	adp->entries += nf_tables_commit_audit_entrycount(trans);
10842 	if (!adp->op || adp->op > op)
10843 		adp->op = op;
10844 }
10845 
10846 #define AUNFTABLENAMELEN (NFT_TABLE_MAXNAMELEN + 22)
10847 
10848 static void nf_tables_commit_audit_log(struct list_head *adl, u32 generation)
10849 {
10850 	struct nft_audit_data *adp, *adn;
10851 	char aubuf[AUNFTABLENAMELEN];
10852 
10853 	list_for_each_entry_safe(adp, adn, adl, list) {
10854 		snprintf(aubuf, AUNFTABLENAMELEN, "%s:%u", adp->table->name,
10855 			 generation);
10856 		audit_log_nfcfg(aubuf, adp->table->family, adp->entries,
10857 				nft2audit_op[adp->op], GFP_KERNEL);
10858 		list_del(&adp->list);
10859 		kfree(adp);
10860 	}
10861 }
10862 
10863 static void nft_set_commit_update(struct nft_ctx *ctx,
10864 				  struct nftables_pernet *nft_net)
10865 {
10866 	struct nft_set *set, *next;
10867 	struct nft_trans_elem *te;
10868 	struct nft_trans *trans;
10869 
10870 	if (list_empty(&nft_net->set_update_list))
10871 		return;
10872 
10873 	list_for_each_entry(trans, &nft_net->commit_list, list) {
10874 		nft_ctx_update(ctx, trans);
10875 
10876 		switch (trans->msg_type) {
10877 		case NFT_MSG_DELSET:
10878 		case NFT_MSG_DESTROYSET:
10879 			nft_trans_set(trans)->dead = 1;
10880 			break;
10881 		case NFT_MSG_DELSETELEM:
10882 			te = nft_trans_container_elem(trans);
10883 			if (!te->set->ops->commit)
10884 				break;
10885 
10886 			nft_trans_elems_remove(ctx, te, false);
10887 			break;
10888 		}
10889 	}
10890 
10891 	list_for_each_entry_safe(set, next, &nft_net->set_update_list, pending_update) {
10892 		list_del_init(&set->pending_update);
10893 
10894 		if (!set->ops->commit || set->dead)
10895 			continue;
10896 
10897 		set->ops->commit(set);
10898 	}
10899 }
10900 
10901 static unsigned int nft_gc_seq_begin(struct nftables_pernet *nft_net)
10902 {
10903 	unsigned int gc_seq;
10904 
10905 	/* Bump gc counter, it becomes odd, this is the busy mark. */
10906 	gc_seq = READ_ONCE(nft_net->gc_seq);
10907 	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
10908 
10909 	return gc_seq;
10910 }
10911 
10912 static void nft_gc_seq_end(struct nftables_pernet *nft_net, unsigned int gc_seq)
10913 {
10914 	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
10915 }
10916 
10917 static int nf_tables_commit(struct net *net, struct sk_buff *skb)
10918 {
10919 	struct nftables_pernet *nft_net = nft_pernet(net);
10920 	const struct nlmsghdr *nlh = nlmsg_hdr(skb);
10921 	struct nft_trans_binding *trans_binding;
10922 	struct nft_trans *trans, *next;
10923 	unsigned int base_seq, gc_seq;
10924 	struct nft_trans_elem *te;
10925 	struct nft_chain *chain;
10926 	struct nft_table *table;
10927 	struct nft_ctx ctx;
10928 	LIST_HEAD(adl);
10929 	int err;
10930 
10931 	if (list_empty(&nft_net->commit_list)) {
10932 		mutex_unlock(&nft_net->commit_mutex);
10933 		return 0;
10934 	}
10935 
10936 	nft_ctx_init(&ctx, net, skb, nlh, NFPROTO_UNSPEC, NULL, NULL, NULL);
10937 
10938 	list_for_each_entry(trans_binding, &nft_net->binding_list, binding_list) {
10939 		trans = &trans_binding->nft_trans;
10940 		switch (trans->msg_type) {
10941 		case NFT_MSG_NEWSET:
10942 			if (!nft_trans_set_update(trans) &&
10943 			    nft_set_is_anonymous(nft_trans_set(trans)) &&
10944 			    !nft_trans_set_bound(trans)) {
10945 				pr_warn_once("nftables ruleset with unbound set\n");
10946 				return -EINVAL;
10947 			}
10948 			break;
10949 		case NFT_MSG_NEWCHAIN:
10950 			if (!nft_trans_chain_update(trans) &&
10951 			    nft_chain_binding(nft_trans_chain(trans)) &&
10952 			    !nft_trans_chain_bound(trans)) {
10953 				pr_warn_once("nftables ruleset with unbound chain\n");
10954 				return -EINVAL;
10955 			}
10956 			break;
10957 		default:
10958 			WARN_ONCE(1, "Unhandled bind type %d", trans->msg_type);
10959 			break;
10960 		}
10961 	}
10962 
10963 	/* 0. Validate ruleset, otherwise roll back for error reporting. */
10964 	if (nf_tables_validate(net) < 0) {
10965 		nft_net->validate_state = NFT_VALIDATE_DO;
10966 		return -EAGAIN;
10967 	}
10968 
10969 	/* 1.  Allocate space for next generation rules_gen_X[] */
10970 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
10971 		struct nft_table *table = trans->table;
10972 		int ret;
10973 
10974 		ret = nf_tables_commit_audit_alloc(&adl, table);
10975 		if (ret) {
10976 			nf_tables_commit_chain_prepare_cancel(net);
10977 			nf_tables_commit_audit_free(&adl);
10978 			return ret;
10979 		}
10980 		if (trans->msg_type == NFT_MSG_NEWRULE ||
10981 		    trans->msg_type == NFT_MSG_DELRULE) {
10982 			chain = nft_trans_rule_chain(trans);
10983 
10984 			ret = nf_tables_commit_chain_prepare(net, chain);
10985 			if (ret < 0) {
10986 				nf_tables_commit_chain_prepare_cancel(net);
10987 				nf_tables_commit_audit_free(&adl);
10988 				return ret;
10989 			}
10990 		}
10991 	}
10992 
10993 	/* must be last, so audit and chain blob set up does not leave hardware
10994 	 * in consistent state.
10995 	 */
10996 	err = nft_flow_rule_offload_commit(net);
10997 	if (err < 0) {
10998 		nf_tables_commit_chain_prepare_cancel(net);
10999 		nf_tables_commit_audit_free(&adl);
11000 		return err;
11001 	}
11002 
11003 	/* step 2.  Make rules_gen_X visible to packet path */
11004 	nft_set_commit_update(&ctx, nft_net);
11005 
11006 	list_for_each_entry(table, &nft_net->tables, list) {
11007 		list_for_each_entry(chain, &table->chains, list)
11008 			nf_tables_commit_chain(net, chain);
11009 	}
11010 
11011 	/*
11012 	 * Bump generation counter, invalidate any dump in progress.
11013 	 * Cannot fail after this point.
11014 	 */
11015 	base_seq = nft_base_seq(net);
11016 	while (++base_seq == 0)
11017 		;
11018 
11019 	/* pairs with smp_load_acquire in nft_lookup_eval */
11020 	smp_store_release(&net->nft.base_seq, base_seq);
11021 
11022 	gc_seq = nft_gc_seq_begin(nft_net);
11023 
11024 	/* step 3. Start new generation, rules_gen_X now in use. */
11025 	net->nft.gencursor = nft_gencursor_next(net);
11026 
11027 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
11028 		struct nft_table *table = trans->table;
11029 
11030 		nft_ctx_update(&ctx, trans);
11031 
11032 		nf_tables_commit_audit_collect(&adl, trans, trans->msg_type);
11033 		switch (trans->msg_type) {
11034 		case NFT_MSG_NEWTABLE:
11035 			if (nft_trans_table_update(trans)) {
11036 				if (!(table->flags & __NFT_TABLE_F_UPDATE)) {
11037 					nft_trans_destroy(trans);
11038 					break;
11039 				}
11040 				if (table->flags & NFT_TABLE_F_DORMANT)
11041 					nf_tables_table_disable(net, table);
11042 
11043 				table->flags &= ~__NFT_TABLE_F_UPDATE;
11044 			} else {
11045 				nft_clear(net, table);
11046 			}
11047 			nf_tables_table_notify(&ctx, NFT_MSG_NEWTABLE);
11048 			nft_trans_destroy(trans);
11049 			break;
11050 		case NFT_MSG_DELTABLE:
11051 		case NFT_MSG_DESTROYTABLE:
11052 			list_del_rcu(&table->list);
11053 			nf_tables_table_notify(&ctx, trans->msg_type);
11054 			break;
11055 		case NFT_MSG_NEWCHAIN:
11056 			if (nft_trans_chain_update(trans)) {
11057 				nft_chain_commit_update(nft_trans_container_chain(trans));
11058 				nf_tables_chain_notify(&ctx, NFT_MSG_NEWCHAIN,
11059 						       &nft_trans_chain_hooks(trans), NULL);
11060 				list_splice_rcu(&nft_trans_chain_hooks(trans),
11061 						&nft_trans_basechain(trans)->hook_list);
11062 				/* trans destroyed after rcu grace period */
11063 			} else {
11064 				nft_chain_commit_drop_policy(nft_trans_container_chain(trans));
11065 				nft_clear(net, nft_trans_chain(trans));
11066 				nf_tables_chain_notify(&ctx, NFT_MSG_NEWCHAIN, NULL, NULL);
11067 				nft_trans_destroy(trans);
11068 			}
11069 			break;
11070 		case NFT_MSG_DELCHAIN:
11071 		case NFT_MSG_DESTROYCHAIN:
11072 			if (nft_trans_chain_update(trans)) {
11073 				nf_tables_chain_notify(&ctx, NFT_MSG_DELCHAIN, NULL,
11074 						       &nft_trans_chain_hooks(trans));
11075 				nft_netdev_unregister_trans_hook(net, table,
11076 								 &nft_trans_chain_hooks(trans));
11077 			} else {
11078 				nft_chain_del(nft_trans_chain(trans));
11079 				nf_tables_chain_notify(&ctx, NFT_MSG_DELCHAIN,
11080 						       NULL, NULL);
11081 				nf_tables_unregister_hook(ctx.net, ctx.table,
11082 							  nft_trans_chain(trans));
11083 			}
11084 			break;
11085 		case NFT_MSG_NEWRULE:
11086 			nft_clear(net, nft_trans_rule(trans));
11087 			nf_tables_rule_notify(&ctx, nft_trans_rule(trans),
11088 					      NFT_MSG_NEWRULE);
11089 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
11090 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
11091 
11092 			nft_trans_destroy(trans);
11093 			break;
11094 		case NFT_MSG_DELRULE:
11095 		case NFT_MSG_DESTROYRULE:
11096 			list_del_rcu(&nft_trans_rule(trans)->list);
11097 			nf_tables_rule_notify(&ctx, nft_trans_rule(trans),
11098 					      trans->msg_type);
11099 			nft_rule_expr_deactivate(&ctx, nft_trans_rule(trans),
11100 						 NFT_TRANS_COMMIT);
11101 
11102 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
11103 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
11104 			break;
11105 		case NFT_MSG_NEWSET:
11106 			list_del(&nft_trans_container_set(trans)->list_trans_newset);
11107 			if (nft_trans_set_update(trans)) {
11108 				struct nft_set *set = nft_trans_set(trans);
11109 
11110 				WRITE_ONCE(set->timeout, nft_trans_set_timeout(trans));
11111 				WRITE_ONCE(set->gc_int, nft_trans_set_gc_int(trans));
11112 
11113 				if (nft_trans_set_size(trans))
11114 					WRITE_ONCE(set->size, nft_trans_set_size(trans));
11115 			} else {
11116 				nft_clear(net, nft_trans_set(trans));
11117 				/* This avoids hitting -EBUSY when deleting the table
11118 				 * from the transaction.
11119 				 */
11120 				if (nft_set_is_anonymous(nft_trans_set(trans)) &&
11121 				    !list_empty(&nft_trans_set(trans)->bindings))
11122 					nft_use_dec(&table->use);
11123 			}
11124 			nf_tables_set_notify(&ctx, nft_trans_set(trans),
11125 					     NFT_MSG_NEWSET, GFP_KERNEL);
11126 			nft_trans_destroy(trans);
11127 			break;
11128 		case NFT_MSG_DELSET:
11129 		case NFT_MSG_DESTROYSET:
11130 			nft_trans_set(trans)->dead = 1;
11131 			list_del_rcu(&nft_trans_set(trans)->list);
11132 			nf_tables_set_notify(&ctx, nft_trans_set(trans),
11133 					     trans->msg_type, GFP_KERNEL);
11134 			break;
11135 		case NFT_MSG_NEWSETELEM:
11136 			te = nft_trans_container_elem(trans);
11137 			nft_trans_elems_add(&ctx, te);
11138 			nft_trans_destroy(trans);
11139 			break;
11140 		case NFT_MSG_DELSETELEM:
11141 		case NFT_MSG_DESTROYSETELEM:
11142 			te = nft_trans_container_elem(trans);
11143 			if (te->set->ops->commit)
11144 				nft_trans_elems_remove_notify(&ctx, te);
11145 			else
11146 				nft_trans_elems_remove(&ctx, te, true);
11147 			break;
11148 		case NFT_MSG_NEWOBJ:
11149 			if (nft_trans_obj_update(trans)) {
11150 				nft_obj_commit_update(&ctx, trans);
11151 				nf_tables_obj_notify(&ctx,
11152 						     nft_trans_obj(trans),
11153 						     NFT_MSG_NEWOBJ);
11154 			} else {
11155 				nft_clear(net, nft_trans_obj(trans));
11156 				nf_tables_obj_notify(&ctx,
11157 						     nft_trans_obj(trans),
11158 						     NFT_MSG_NEWOBJ);
11159 				nft_trans_destroy(trans);
11160 			}
11161 			break;
11162 		case NFT_MSG_DELOBJ:
11163 		case NFT_MSG_DESTROYOBJ:
11164 			nft_obj_del(table, nft_trans_obj(trans));
11165 			nf_tables_obj_notify(&ctx, nft_trans_obj(trans),
11166 					     trans->msg_type);
11167 			break;
11168 		case NFT_MSG_NEWFLOWTABLE:
11169 			if (nft_trans_flowtable_update(trans)) {
11170 				nft_trans_flowtable(trans)->data.flags =
11171 					nft_trans_flowtable_flags(trans);
11172 				nf_tables_flowtable_notify(&ctx,
11173 							   nft_trans_flowtable(trans),
11174 							   &nft_trans_flowtable_hooks(trans),
11175 							   NULL,
11176 							   NFT_MSG_NEWFLOWTABLE);
11177 				list_splice_rcu(&nft_trans_flowtable_hooks(trans),
11178 						&nft_trans_flowtable(trans)->hook_list);
11179 			} else {
11180 				nft_clear(net, nft_trans_flowtable(trans));
11181 				nf_tables_flowtable_notify(&ctx,
11182 							   nft_trans_flowtable(trans),
11183 							   NULL,
11184 							   NULL,
11185 							   NFT_MSG_NEWFLOWTABLE);
11186 			}
11187 			nft_trans_destroy(trans);
11188 			break;
11189 		case NFT_MSG_DELFLOWTABLE:
11190 		case NFT_MSG_DESTROYFLOWTABLE:
11191 			if (nft_trans_flowtable_update(trans)) {
11192 				nf_tables_flowtable_notify(&ctx,
11193 							   nft_trans_flowtable(trans),
11194 							   NULL,
11195 							   &nft_trans_flowtable_hooks(trans),
11196 							   trans->msg_type);
11197 				nft_flowtable_unregister_trans_hook(net,
11198 								    nft_trans_flowtable(trans),
11199 								    &nft_trans_flowtable_hooks(trans));
11200 			} else {
11201 				list_del_rcu(&nft_trans_flowtable(trans)->list);
11202 				nf_tables_flowtable_notify(&ctx,
11203 							   nft_trans_flowtable(trans),
11204 							   NULL,
11205 							   NULL,
11206 							   trans->msg_type);
11207 				nft_unregister_flowtable_net_hooks(net,
11208 						nft_trans_flowtable(trans),
11209 						&nft_trans_flowtable(trans)->hook_list);
11210 			}
11211 			break;
11212 		}
11213 	}
11214 
11215 	nft_commit_notify(net, NETLINK_CB(skb).portid);
11216 	nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
11217 	nf_tables_commit_audit_log(&adl, nft_base_seq(net));
11218 
11219 	nft_gc_seq_end(nft_net, gc_seq);
11220 	nft_net->validate_state = NFT_VALIDATE_SKIP;
11221 	nf_tables_commit_release(net);
11222 
11223 	return 0;
11224 }
11225 
11226 static void nf_tables_module_autoload(struct net *net)
11227 {
11228 	struct nftables_pernet *nft_net = nft_pernet(net);
11229 	struct nft_module_request *req, *next;
11230 	LIST_HEAD(module_list);
11231 
11232 	list_splice_init(&nft_net->module_list, &module_list);
11233 	mutex_unlock(&nft_net->commit_mutex);
11234 	list_for_each_entry_safe(req, next, &module_list, list) {
11235 		request_module("%s", req->module);
11236 		req->done = true;
11237 	}
11238 	mutex_lock(&nft_net->commit_mutex);
11239 	list_splice(&module_list, &nft_net->module_list);
11240 }
11241 
11242 static void nf_tables_abort_release(struct nft_trans *trans)
11243 {
11244 	struct nft_ctx ctx = { };
11245 
11246 	nft_ctx_update(&ctx, trans);
11247 
11248 	switch (trans->msg_type) {
11249 	case NFT_MSG_NEWTABLE:
11250 		nf_tables_table_destroy(trans->table);
11251 		break;
11252 	case NFT_MSG_NEWCHAIN:
11253 		if (nft_trans_chain_update(trans))
11254 			nft_hooks_destroy(&nft_trans_chain_hooks(trans));
11255 		else
11256 			nf_tables_chain_destroy(nft_trans_chain(trans));
11257 		break;
11258 	case NFT_MSG_NEWRULE:
11259 		nf_tables_rule_destroy(&ctx, nft_trans_rule(trans));
11260 		break;
11261 	case NFT_MSG_NEWSET:
11262 		nft_set_destroy(&ctx, nft_trans_set(trans));
11263 		break;
11264 	case NFT_MSG_NEWSETELEM:
11265 		nft_trans_set_elem_destroy(&ctx, nft_trans_container_elem(trans));
11266 		break;
11267 	case NFT_MSG_NEWOBJ:
11268 		nft_obj_destroy(&ctx, nft_trans_obj(trans));
11269 		break;
11270 	case NFT_MSG_NEWFLOWTABLE:
11271 		if (nft_trans_flowtable_update(trans))
11272 			nft_hooks_destroy(&nft_trans_flowtable_hooks(trans));
11273 		else
11274 			nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
11275 		break;
11276 	}
11277 	kfree(trans);
11278 }
11279 
11280 static void nft_set_abort_update(struct nftables_pernet *nft_net)
11281 {
11282 	struct nft_set *set, *next;
11283 
11284 	list_for_each_entry_safe(set, next, &nft_net->set_update_list, pending_update) {
11285 		list_del_init(&set->pending_update);
11286 
11287 		if (!set->ops->abort)
11288 			continue;
11289 
11290 		set->ops->abort(set);
11291 	}
11292 }
11293 
11294 static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
11295 {
11296 	struct nftables_pernet *nft_net = nft_pernet(net);
11297 	struct nft_trans *trans, *next;
11298 	struct nft_trans_elem *te;
11299 	struct nft_ctx ctx = {
11300 		.net = net,
11301 	};
11302 	int err = 0;
11303 
11304 	if (action == NFNL_ABORT_VALIDATE &&
11305 	    nf_tables_validate(net) < 0)
11306 		err = -EAGAIN;
11307 
11308 	list_for_each_entry_safe_reverse(trans, next, &nft_net->commit_list,
11309 					 list) {
11310 		struct nft_table *table = trans->table;
11311 
11312 		nft_ctx_update(&ctx, trans);
11313 
11314 		switch (trans->msg_type) {
11315 		case NFT_MSG_NEWTABLE:
11316 			if (nft_trans_table_update(trans)) {
11317 				if (!(table->flags & __NFT_TABLE_F_UPDATE)) {
11318 					nft_trans_destroy(trans);
11319 					break;
11320 				}
11321 				if (table->flags & __NFT_TABLE_F_WAS_DORMANT) {
11322 					nf_tables_table_disable(net, table);
11323 					table->flags |= NFT_TABLE_F_DORMANT;
11324 				} else if (table->flags & __NFT_TABLE_F_WAS_AWAKEN) {
11325 					table->flags &= ~NFT_TABLE_F_DORMANT;
11326 				}
11327 				if (table->flags & __NFT_TABLE_F_WAS_ORPHAN) {
11328 					table->flags &= ~NFT_TABLE_F_OWNER;
11329 					table->nlpid = 0;
11330 				}
11331 				table->flags &= ~__NFT_TABLE_F_UPDATE;
11332 				nft_trans_destroy(trans);
11333 			} else {
11334 				list_del_rcu(&table->list);
11335 			}
11336 			break;
11337 		case NFT_MSG_DELTABLE:
11338 		case NFT_MSG_DESTROYTABLE:
11339 			nft_clear(trans->net, table);
11340 			nft_trans_destroy(trans);
11341 			break;
11342 		case NFT_MSG_NEWCHAIN:
11343 			if (nft_trans_chain_update(trans)) {
11344 				nft_netdev_unregister_hooks(net, table,
11345 							    &nft_trans_chain_hooks(trans),
11346 							    true);
11347 				free_percpu(nft_trans_chain_stats(trans));
11348 				kfree(nft_trans_chain_name(trans));
11349 				nft_trans_destroy(trans);
11350 			} else {
11351 				if (nft_trans_chain_bound(trans)) {
11352 					nft_trans_destroy(trans);
11353 					break;
11354 				}
11355 				nft_use_dec_restore(&table->use);
11356 				nft_chain_del(nft_trans_chain(trans));
11357 				nf_tables_unregister_hook(trans->net, table,
11358 							  nft_trans_chain(trans));
11359 			}
11360 			break;
11361 		case NFT_MSG_DELCHAIN:
11362 		case NFT_MSG_DESTROYCHAIN:
11363 			if (nft_trans_chain_update(trans)) {
11364 				nft_trans_delhook_abort(&nft_trans_chain_hooks(trans));
11365 			} else {
11366 				nft_use_inc_restore(&table->use);
11367 				nft_clear(trans->net, nft_trans_chain(trans));
11368 			}
11369 			nft_trans_destroy(trans);
11370 			break;
11371 		case NFT_MSG_NEWRULE:
11372 			if (nft_trans_rule_bound(trans)) {
11373 				nft_trans_destroy(trans);
11374 				break;
11375 			}
11376 			nft_use_dec_restore(&nft_trans_rule_chain(trans)->use);
11377 			list_del_rcu(&nft_trans_rule(trans)->list);
11378 			nft_rule_expr_deactivate(&ctx,
11379 						 nft_trans_rule(trans),
11380 						 NFT_TRANS_ABORT);
11381 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
11382 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
11383 			break;
11384 		case NFT_MSG_DELRULE:
11385 		case NFT_MSG_DESTROYRULE:
11386 			nft_use_inc_restore(&nft_trans_rule_chain(trans)->use);
11387 			nft_clear(trans->net, nft_trans_rule(trans));
11388 			nft_rule_expr_activate(&ctx, nft_trans_rule(trans));
11389 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
11390 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
11391 
11392 			nft_trans_destroy(trans);
11393 			break;
11394 		case NFT_MSG_NEWSET:
11395 			list_del(&nft_trans_container_set(trans)->list_trans_newset);
11396 			if (nft_trans_set_update(trans)) {
11397 				nft_trans_destroy(trans);
11398 				break;
11399 			}
11400 			nft_use_dec_restore(&table->use);
11401 			if (nft_trans_set_bound(trans)) {
11402 				nft_trans_destroy(trans);
11403 				break;
11404 			}
11405 			nft_trans_set(trans)->dead = 1;
11406 			list_del_rcu(&nft_trans_set(trans)->list);
11407 			break;
11408 		case NFT_MSG_DELSET:
11409 		case NFT_MSG_DESTROYSET:
11410 			nft_use_inc_restore(&table->use);
11411 			nft_clear(trans->net, nft_trans_set(trans));
11412 			if (nft_trans_set(trans)->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
11413 				nft_map_activate(&ctx, nft_trans_set(trans));
11414 
11415 			nft_trans_destroy(trans);
11416 			break;
11417 		case NFT_MSG_NEWSETELEM:
11418 			te = nft_trans_container_elem(trans);
11419 			if (nft_trans_elem_set_bound(trans)) {
11420 				list_del_init(&te->set->pending_update);
11421 				nft_trans_destroy(trans);
11422 				break;
11423 			}
11424 			if (!nft_trans_elems_new_abort(&ctx, te)) {
11425 				nft_trans_destroy(trans);
11426 				break;
11427 			}
11428 			break;
11429 		case NFT_MSG_DELSETELEM:
11430 		case NFT_MSG_DESTROYSETELEM:
11431 			te = nft_trans_container_elem(trans);
11432 
11433 			nft_trans_elems_destroy_abort(&ctx, te);
11434 			nft_trans_destroy(trans);
11435 			break;
11436 		case NFT_MSG_NEWOBJ:
11437 			if (nft_trans_obj_update(trans)) {
11438 				nft_obj_destroy(&ctx, nft_trans_obj_newobj(trans));
11439 				nft_trans_destroy(trans);
11440 			} else {
11441 				nft_use_dec_restore(&table->use);
11442 				nft_obj_del(table, nft_trans_obj(trans));
11443 			}
11444 			break;
11445 		case NFT_MSG_DELOBJ:
11446 		case NFT_MSG_DESTROYOBJ:
11447 			nft_use_inc_restore(&table->use);
11448 			nft_clear(trans->net, nft_trans_obj(trans));
11449 			nft_trans_destroy(trans);
11450 			break;
11451 		case NFT_MSG_NEWFLOWTABLE:
11452 			if (nft_trans_flowtable_update(trans)) {
11453 				nft_unregister_flowtable_net_hooks(net,
11454 						nft_trans_flowtable(trans),
11455 						&nft_trans_flowtable_hooks(trans));
11456 			} else {
11457 				nft_use_dec_restore(&table->use);
11458 				list_del_rcu(&nft_trans_flowtable(trans)->list);
11459 				nft_unregister_flowtable_net_hooks(net,
11460 						nft_trans_flowtable(trans),
11461 						&nft_trans_flowtable(trans)->hook_list);
11462 			}
11463 			break;
11464 		case NFT_MSG_DELFLOWTABLE:
11465 		case NFT_MSG_DESTROYFLOWTABLE:
11466 			if (nft_trans_flowtable_update(trans)) {
11467 				nft_trans_delhook_abort(&nft_trans_flowtable_hooks(trans));
11468 			} else {
11469 				nft_use_inc_restore(&table->use);
11470 				nft_clear(trans->net, nft_trans_flowtable(trans));
11471 			}
11472 			nft_trans_destroy(trans);
11473 			break;
11474 		}
11475 	}
11476 
11477 	WARN_ON_ONCE(!list_empty(&nft_net->commit_set_list));
11478 
11479 	nft_set_abort_update(nft_net);
11480 
11481 	synchronize_rcu();
11482 
11483 	list_for_each_entry_safe_reverse(trans, next,
11484 					 &nft_net->commit_list, list) {
11485 		nft_trans_list_del(trans);
11486 		nf_tables_abort_release(trans);
11487 	}
11488 
11489 	return err;
11490 }
11491 
11492 static int nf_tables_abort(struct net *net, struct sk_buff *skb,
11493 			   enum nfnl_abort_action action)
11494 {
11495 	struct nftables_pernet *nft_net = nft_pernet(net);
11496 	unsigned int gc_seq;
11497 	int ret;
11498 
11499 	gc_seq = nft_gc_seq_begin(nft_net);
11500 	ret = __nf_tables_abort(net, action);
11501 	nft_gc_seq_end(nft_net, gc_seq);
11502 
11503 	if (action == NFNL_ABORT_NONE) {
11504 		struct nft_table *table;
11505 
11506 		list_for_each_entry(table, &nft_net->tables, list)
11507 			table->validate_state = NFT_VALIDATE_SKIP;
11508 	}
11509 
11510 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
11511 
11512 	/* module autoload needs to happen after GC sequence update because it
11513 	 * temporarily releases and grabs mutex again.
11514 	 */
11515 	if (action == NFNL_ABORT_AUTOLOAD)
11516 		nf_tables_module_autoload(net);
11517 	else
11518 		nf_tables_module_autoload_cleanup(net);
11519 
11520 	mutex_unlock(&nft_net->commit_mutex);
11521 
11522 	return ret;
11523 }
11524 
11525 static bool nf_tables_valid_genid(struct net *net, u32 genid)
11526 {
11527 	struct nftables_pernet *nft_net = nft_pernet(net);
11528 	bool genid_ok;
11529 
11530 	mutex_lock(&nft_net->commit_mutex);
11531 	nft_net->tstamp = get_jiffies_64();
11532 
11533 	genid_ok = genid == 0 || nft_base_seq(net) == genid;
11534 	if (!genid_ok)
11535 		mutex_unlock(&nft_net->commit_mutex);
11536 
11537 	/* else, commit mutex has to be released by commit or abort function */
11538 	return genid_ok;
11539 }
11540 
11541 static const struct nfnetlink_subsystem nf_tables_subsys = {
11542 	.name		= "nf_tables",
11543 	.subsys_id	= NFNL_SUBSYS_NFTABLES,
11544 	.cb_count	= NFT_MSG_MAX,
11545 	.cb		= nf_tables_cb,
11546 	.commit		= nf_tables_commit,
11547 	.abort		= nf_tables_abort,
11548 	.valid_genid	= nf_tables_valid_genid,
11549 	.owner		= THIS_MODULE,
11550 };
11551 
11552 int nft_chain_validate_dependency(const struct nft_chain *chain,
11553 				  enum nft_chain_types type)
11554 {
11555 	const struct nft_base_chain *basechain;
11556 
11557 	if (nft_is_base_chain(chain)) {
11558 		basechain = nft_base_chain(chain);
11559 		if (basechain->type->type != type)
11560 			return -EOPNOTSUPP;
11561 	}
11562 	return 0;
11563 }
11564 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency);
11565 
11566 int nft_chain_validate_hooks(const struct nft_chain *chain,
11567 			     unsigned int hook_flags)
11568 {
11569 	struct nft_base_chain *basechain;
11570 
11571 	if (nft_is_base_chain(chain)) {
11572 		basechain = nft_base_chain(chain);
11573 
11574 		if ((1 << basechain->ops.hooknum) & hook_flags)
11575 			return 0;
11576 
11577 		return -EOPNOTSUPP;
11578 	}
11579 
11580 	return 0;
11581 }
11582 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks);
11583 
11584 /**
11585  *	nft_parse_u32_check - fetch u32 attribute and check for maximum value
11586  *
11587  *	@attr: netlink attribute to fetch value from
11588  *	@max: maximum value to be stored in dest
11589  *	@dest: pointer to the variable
11590  *
11591  *	Parse, check and store a given u32 netlink attribute into variable.
11592  *	This function returns -ERANGE if the value goes over maximum value.
11593  *	Otherwise a 0 is returned and the attribute value is stored in the
11594  *	destination variable.
11595  */
11596 int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
11597 {
11598 	u32 val;
11599 
11600 	val = ntohl(nla_get_be32(attr));
11601 	if (val > max)
11602 		return -ERANGE;
11603 
11604 	*dest = val;
11605 	return 0;
11606 }
11607 EXPORT_SYMBOL_GPL(nft_parse_u32_check);
11608 
11609 static int nft_parse_register(const struct nlattr *attr, u32 *preg)
11610 {
11611 	unsigned int reg;
11612 
11613 	reg = ntohl(nla_get_be32(attr));
11614 	switch (reg) {
11615 	case NFT_REG_VERDICT...NFT_REG_4:
11616 		*preg = reg * NFT_REG_SIZE / NFT_REG32_SIZE;
11617 		break;
11618 	case NFT_REG32_00...NFT_REG32_15:
11619 		*preg = reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
11620 		break;
11621 	default:
11622 		return -ERANGE;
11623 	}
11624 
11625 	return 0;
11626 }
11627 
11628 /**
11629  *	nft_dump_register - dump a register value to a netlink attribute
11630  *
11631  *	@skb: socket buffer
11632  *	@attr: attribute number
11633  *	@reg: register number
11634  *
11635  *	Construct a netlink attribute containing the register number. For
11636  *	compatibility reasons, register numbers being a multiple of 4 are
11637  *	translated to the corresponding 128 bit register numbers.
11638  */
11639 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg)
11640 {
11641 	if (reg % (NFT_REG_SIZE / NFT_REG32_SIZE) == 0)
11642 		reg = reg / (NFT_REG_SIZE / NFT_REG32_SIZE);
11643 	else
11644 		reg = reg - NFT_REG_SIZE / NFT_REG32_SIZE + NFT_REG32_00;
11645 
11646 	return nla_put_be32(skb, attr, htonl(reg));
11647 }
11648 EXPORT_SYMBOL_GPL(nft_dump_register);
11649 
11650 static int nft_validate_register_load(enum nft_registers reg, unsigned int len)
11651 {
11652 	if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
11653 		return -EINVAL;
11654 	if (len == 0)
11655 		return -EINVAL;
11656 	if (reg * NFT_REG32_SIZE + len > sizeof_field(struct nft_regs, data))
11657 		return -ERANGE;
11658 
11659 	return 0;
11660 }
11661 
11662 int nft_parse_register_load(const struct nft_ctx *ctx,
11663 			    const struct nlattr *attr, u8 *sreg, u32 len)
11664 {
11665 	int err, invalid_reg;
11666 	u32 reg, next_register;
11667 
11668 	err = nft_parse_register(attr, &reg);
11669 	if (err < 0)
11670 		return err;
11671 
11672 	err = nft_validate_register_load(reg, len);
11673 	if (err < 0)
11674 		return err;
11675 
11676 	next_register = DIV_ROUND_UP(len, NFT_REG32_SIZE) + reg;
11677 
11678 	/* Can't happen: nft_validate_register_load() should have failed */
11679 	if (unlikely(next_register > NFT_REG32_NUM)) {
11680 		DEBUG_NET_WARN_ON_ONCE(1);
11681 		return -EINVAL;
11682 	}
11683 
11684 	/* find first register that did not see an earlier store. */
11685 	invalid_reg = find_next_zero_bit(ctx->reg_inited, NFT_REG32_NUM, reg);
11686 
11687 	/* invalid register within the range that we're loading from? */
11688 	if (invalid_reg < next_register)
11689 		return -ENODATA;
11690 
11691 	*sreg = reg;
11692 	return 0;
11693 }
11694 EXPORT_SYMBOL_GPL(nft_parse_register_load);
11695 
11696 static void nft_saw_register_store(const struct nft_ctx *__ctx,
11697 				   int reg, unsigned int len)
11698 {
11699 	unsigned int registers = DIV_ROUND_UP(len, NFT_REG32_SIZE);
11700 	struct nft_ctx *ctx = (struct nft_ctx *)__ctx;
11701 
11702 	if (WARN_ON_ONCE(len == 0 || reg < 0))
11703 		return;
11704 
11705 	bitmap_set(ctx->reg_inited, reg, registers);
11706 }
11707 
11708 static int nft_validate_register_store(const struct nft_ctx *ctx,
11709 				       enum nft_registers reg,
11710 				       const struct nft_data *data,
11711 				       enum nft_data_types type,
11712 				       unsigned int len)
11713 {
11714 	switch (reg) {
11715 	case NFT_REG_VERDICT:
11716 		if (type != NFT_DATA_VERDICT)
11717 			return -EINVAL;
11718 		break;
11719 	default:
11720 		if (type != NFT_DATA_VALUE)
11721 			return -EINVAL;
11722 
11723 		if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
11724 			return -EINVAL;
11725 		if (len == 0)
11726 			return -EINVAL;
11727 		if (reg * NFT_REG32_SIZE + len >
11728 		    sizeof_field(struct nft_regs, data))
11729 			return -ERANGE;
11730 
11731 		break;
11732 	}
11733 
11734 	nft_saw_register_store(ctx, reg, len);
11735 	return 0;
11736 }
11737 
11738 int nft_parse_register_store(const struct nft_ctx *ctx,
11739 			     const struct nlattr *attr, u8 *dreg,
11740 			     const struct nft_data *data,
11741 			     enum nft_data_types type, unsigned int len)
11742 {
11743 	int err;
11744 	u32 reg;
11745 
11746 	err = nft_parse_register(attr, &reg);
11747 	if (err < 0)
11748 		return err;
11749 
11750 	err = nft_validate_register_store(ctx, reg, data, type, len);
11751 	if (err < 0)
11752 		return err;
11753 
11754 	*dreg = reg;
11755 	return 0;
11756 }
11757 EXPORT_SYMBOL_GPL(nft_parse_register_store);
11758 
11759 static const struct nla_policy nft_verdict_policy[NFTA_VERDICT_MAX + 1] = {
11760 	[NFTA_VERDICT_CODE]	= { .type = NLA_U32 },
11761 	[NFTA_VERDICT_CHAIN]	= { .type = NLA_STRING,
11762 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
11763 	[NFTA_VERDICT_CHAIN_ID]	= { .type = NLA_U32 },
11764 };
11765 
11766 static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
11767 			    struct nft_data_desc *desc, const struct nlattr *nla)
11768 {
11769 	u8 genmask = nft_genmask_next(ctx->net);
11770 	struct nlattr *tb[NFTA_VERDICT_MAX + 1];
11771 	struct nft_chain *chain;
11772 	int err;
11773 
11774 	err = nla_parse_nested_deprecated(tb, NFTA_VERDICT_MAX, nla,
11775 					  nft_verdict_policy, NULL);
11776 	if (err < 0)
11777 		return err;
11778 
11779 	if (!tb[NFTA_VERDICT_CODE])
11780 		return -EINVAL;
11781 
11782 	/* zero padding hole for memcmp */
11783 	memset(data, 0, sizeof(*data));
11784 	data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
11785 
11786 	switch (data->verdict.code) {
11787 	case NF_ACCEPT:
11788 	case NF_DROP:
11789 	case NFT_CONTINUE:
11790 	case NFT_BREAK:
11791 	case NFT_RETURN:
11792 		break;
11793 	case NFT_JUMP:
11794 	case NFT_GOTO:
11795 		if (tb[NFTA_VERDICT_CHAIN]) {
11796 			chain = nft_chain_lookup(ctx->net, ctx->table,
11797 						 tb[NFTA_VERDICT_CHAIN],
11798 						 genmask);
11799 		} else if (tb[NFTA_VERDICT_CHAIN_ID]) {
11800 			chain = nft_chain_lookup_byid(ctx->net, ctx->table,
11801 						      tb[NFTA_VERDICT_CHAIN_ID],
11802 						      genmask);
11803 			if (IS_ERR(chain))
11804 				return PTR_ERR(chain);
11805 		} else {
11806 			return -EINVAL;
11807 		}
11808 
11809 		if (IS_ERR(chain))
11810 			return PTR_ERR(chain);
11811 		if (nft_is_base_chain(chain))
11812 			return -EOPNOTSUPP;
11813 		if (nft_chain_is_bound(chain))
11814 			return -EINVAL;
11815 		if (desc->flags & NFT_DATA_DESC_SETELEM &&
11816 		    chain->flags & NFT_CHAIN_BINDING)
11817 			return -EINVAL;
11818 		if (!nft_use_inc(&chain->use))
11819 			return -EMFILE;
11820 
11821 		data->verdict.chain = chain;
11822 		break;
11823 	case NF_QUEUE:
11824 		/* The nft_queue expression is used for this purpose, an
11825 		 * immediate NF_QUEUE verdict should not ever be seen here.
11826 		 */
11827 		fallthrough;
11828 	default:
11829 		return -EINVAL;
11830 	}
11831 
11832 	desc->len = sizeof(data->verdict);
11833 
11834 	return 0;
11835 }
11836 
11837 static void nft_verdict_uninit(const struct nft_data *data)
11838 {
11839 	struct nft_chain *chain;
11840 
11841 	switch (data->verdict.code) {
11842 	case NFT_JUMP:
11843 	case NFT_GOTO:
11844 		chain = data->verdict.chain;
11845 		nft_use_dec(&chain->use);
11846 		break;
11847 	}
11848 }
11849 
11850 int nft_verdict_dump(struct sk_buff *skb, int type, const struct nft_verdict *v)
11851 {
11852 	struct nlattr *nest;
11853 
11854 	nest = nla_nest_start_noflag(skb, type);
11855 	if (!nest)
11856 		goto nla_put_failure;
11857 
11858 	if (nla_put_be32(skb, NFTA_VERDICT_CODE, htonl(v->code)))
11859 		goto nla_put_failure;
11860 
11861 	switch (v->code) {
11862 	case NFT_JUMP:
11863 	case NFT_GOTO:
11864 		if (nla_put_string(skb, NFTA_VERDICT_CHAIN,
11865 				   v->chain->name))
11866 			goto nla_put_failure;
11867 	}
11868 	nla_nest_end(skb, nest);
11869 	return 0;
11870 
11871 nla_put_failure:
11872 	return -1;
11873 }
11874 
11875 static int nft_value_init(const struct nft_ctx *ctx,
11876 			  struct nft_data *data, struct nft_data_desc *desc,
11877 			  const struct nlattr *nla)
11878 {
11879 	unsigned int len;
11880 
11881 	len = nla_len(nla);
11882 	if (len == 0)
11883 		return -EINVAL;
11884 	if (len > desc->size)
11885 		return -EOVERFLOW;
11886 	if (desc->len) {
11887 		if (len != desc->len)
11888 			return -EINVAL;
11889 	} else {
11890 		desc->len = len;
11891 	}
11892 
11893 	nla_memcpy(data->data, nla, len);
11894 
11895 	return 0;
11896 }
11897 
11898 static int nft_value_dump(struct sk_buff *skb, const struct nft_data *data,
11899 			  unsigned int len)
11900 {
11901 	return nla_put(skb, NFTA_DATA_VALUE, len, data->data);
11902 }
11903 
11904 static const struct nla_policy nft_data_policy[NFTA_DATA_MAX + 1] = {
11905 	[NFTA_DATA_VALUE]	= { .type = NLA_BINARY },
11906 	[NFTA_DATA_VERDICT]	= { .type = NLA_NESTED },
11907 };
11908 
11909 /**
11910  *	nft_data_init - parse nf_tables data netlink attributes
11911  *
11912  *	@ctx: context of the expression using the data
11913  *	@data: destination struct nft_data
11914  *	@desc: data description
11915  *	@nla: netlink attribute containing data
11916  *
11917  *	Parse the netlink data attributes and initialize a struct nft_data.
11918  *	The type and length of data are returned in the data description.
11919  *
11920  *	The caller can indicate that it only wants to accept data of type
11921  *	NFT_DATA_VALUE by passing NULL for the ctx argument.
11922  */
11923 int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data,
11924 		  struct nft_data_desc *desc, const struct nlattr *nla)
11925 {
11926 	struct nlattr *tb[NFTA_DATA_MAX + 1];
11927 	int err;
11928 
11929 	if (unlikely(!desc->size)) {
11930 		DEBUG_NET_WARN_ON_ONCE(1);
11931 		return -EINVAL;
11932 	}
11933 
11934 	err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla,
11935 					  nft_data_policy, NULL);
11936 	if (err < 0)
11937 		return err;
11938 
11939 	if (tb[NFTA_DATA_VALUE]) {
11940 		if (desc->type != NFT_DATA_VALUE)
11941 			return -EINVAL;
11942 
11943 		err = nft_value_init(ctx, data, desc, tb[NFTA_DATA_VALUE]);
11944 	} else if (tb[NFTA_DATA_VERDICT] && ctx != NULL) {
11945 		if (desc->type != NFT_DATA_VERDICT)
11946 			return -EINVAL;
11947 
11948 		err = nft_verdict_init(ctx, data, desc, tb[NFTA_DATA_VERDICT]);
11949 	} else {
11950 		err = -EINVAL;
11951 	}
11952 
11953 	return err;
11954 }
11955 EXPORT_SYMBOL_GPL(nft_data_init);
11956 
11957 /**
11958  *	nft_data_release - release a nft_data item
11959  *
11960  *	@data: struct nft_data to release
11961  *	@type: type of data
11962  *
11963  *	Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
11964  *	all others need to be released by calling this function.
11965  */
11966 void nft_data_release(const struct nft_data *data, enum nft_data_types type)
11967 {
11968 	if (type < NFT_DATA_VERDICT)
11969 		return;
11970 	switch (type) {
11971 	case NFT_DATA_VERDICT:
11972 		return nft_verdict_uninit(data);
11973 	default:
11974 		WARN_ON(1);
11975 	}
11976 }
11977 
11978 int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
11979 		  enum nft_data_types type, unsigned int len)
11980 {
11981 	struct nlattr *nest;
11982 	int err;
11983 
11984 	nest = nla_nest_start_noflag(skb, attr);
11985 	if (nest == NULL)
11986 		return -1;
11987 
11988 	switch (type) {
11989 	case NFT_DATA_VALUE:
11990 		err = nft_value_dump(skb, data, len);
11991 		break;
11992 	case NFT_DATA_VERDICT:
11993 		err = nft_verdict_dump(skb, NFTA_DATA_VERDICT, &data->verdict);
11994 		break;
11995 	default:
11996 		err = -EINVAL;
11997 		DEBUG_NET_WARN_ON_ONCE(1);
11998 	}
11999 
12000 	nla_nest_end(skb, nest);
12001 	return err;
12002 }
12003 
12004 static void __nft_release_hook(struct net *net, struct nft_table *table)
12005 {
12006 	struct nft_flowtable *flowtable;
12007 	struct nft_chain *chain;
12008 
12009 	list_for_each_entry(chain, &table->chains, list)
12010 		__nf_tables_unregister_hook(net, table, chain, true);
12011 	list_for_each_entry(flowtable, &table->flowtables, list)
12012 		__nft_unregister_flowtable_net_hooks(net, flowtable,
12013 						     &flowtable->hook_list,
12014 						     true);
12015 }
12016 
12017 static void __nft_release_hooks(struct net *net)
12018 {
12019 	struct nftables_pernet *nft_net = nft_pernet(net);
12020 	struct nft_table *table;
12021 
12022 	list_for_each_entry(table, &nft_net->tables, list) {
12023 		if (nft_table_has_owner(table))
12024 			continue;
12025 
12026 		__nft_release_hook(net, table);
12027 	}
12028 }
12029 
12030 static void __nft_release_table(struct net *net, struct nft_table *table)
12031 {
12032 	struct nft_flowtable *flowtable, *nf;
12033 	struct nft_chain *chain, *nc;
12034 	struct nft_object *obj, *ne;
12035 	struct nft_rule *rule, *nr;
12036 	struct nft_set *set, *ns;
12037 	struct nft_ctx ctx = {
12038 		.net	= net,
12039 		.family	= NFPROTO_NETDEV,
12040 	};
12041 
12042 	ctx.family = table->family;
12043 	ctx.table = table;
12044 	list_for_each_entry(chain, &table->chains, list) {
12045 		if (nft_chain_binding(chain))
12046 			continue;
12047 
12048 		ctx.chain = chain;
12049 		list_for_each_entry_safe(rule, nr, &chain->rules, list) {
12050 			list_del(&rule->list);
12051 			nft_use_dec(&chain->use);
12052 			nf_tables_rule_release(&ctx, rule);
12053 		}
12054 	}
12055 	list_for_each_entry_safe(flowtable, nf, &table->flowtables, list) {
12056 		list_del(&flowtable->list);
12057 		nft_use_dec(&table->use);
12058 		nf_tables_flowtable_destroy(flowtable);
12059 	}
12060 	list_for_each_entry_safe(set, ns, &table->sets, list) {
12061 		list_del(&set->list);
12062 		nft_use_dec(&table->use);
12063 		if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
12064 			nft_map_deactivate(&ctx, set);
12065 
12066 		nft_set_destroy(&ctx, set);
12067 	}
12068 	list_for_each_entry_safe(obj, ne, &table->objects, list) {
12069 		nft_obj_del(table, obj);
12070 		nft_use_dec(&table->use);
12071 		nft_obj_destroy(&ctx, obj);
12072 	}
12073 	list_for_each_entry_safe(chain, nc, &table->chains, list) {
12074 		nft_chain_del(chain);
12075 		nft_use_dec(&table->use);
12076 		nf_tables_chain_destroy(chain);
12077 	}
12078 	nf_tables_table_destroy(table);
12079 }
12080 
12081 static void __nft_release_tables(struct net *net)
12082 {
12083 	struct nftables_pernet *nft_net = nft_pernet(net);
12084 	struct nft_table *table, *nt;
12085 
12086 	list_for_each_entry_safe(table, nt, &nft_net->tables, list) {
12087 		if (nft_table_has_owner(table))
12088 			continue;
12089 
12090 		list_del(&table->list);
12091 
12092 		__nft_release_table(net, table);
12093 	}
12094 }
12095 
12096 static int nft_rcv_nl_event(struct notifier_block *this, unsigned long event,
12097 			    void *ptr)
12098 {
12099 	struct nft_table *table, *to_delete[8];
12100 	struct nftables_pernet *nft_net;
12101 	struct netlink_notify *n = ptr;
12102 	struct net *net = n->net;
12103 	unsigned int deleted;
12104 	bool restart = false;
12105 	unsigned int gc_seq;
12106 
12107 	if (event != NETLINK_URELEASE || n->protocol != NETLINK_NETFILTER)
12108 		return NOTIFY_DONE;
12109 
12110 	nft_net = nft_pernet(net);
12111 	deleted = 0;
12112 	mutex_lock(&nft_net->commit_mutex);
12113 
12114 	gc_seq = nft_gc_seq_begin(nft_net);
12115 
12116 	nf_tables_trans_destroy_flush_work(net);
12117 again:
12118 	list_for_each_entry(table, &nft_net->tables, list) {
12119 		if (nft_table_has_owner(table) &&
12120 		    n->portid == table->nlpid) {
12121 			if (table->flags & NFT_TABLE_F_PERSIST) {
12122 				table->flags &= ~NFT_TABLE_F_OWNER;
12123 				continue;
12124 			}
12125 			__nft_release_hook(net, table);
12126 			list_del_rcu(&table->list);
12127 			to_delete[deleted++] = table;
12128 			if (deleted >= ARRAY_SIZE(to_delete))
12129 				break;
12130 		}
12131 	}
12132 	if (deleted) {
12133 		restart = deleted >= ARRAY_SIZE(to_delete);
12134 		synchronize_rcu();
12135 		while (deleted)
12136 			__nft_release_table(net, to_delete[--deleted]);
12137 
12138 		if (restart)
12139 			goto again;
12140 	}
12141 	nft_gc_seq_end(nft_net, gc_seq);
12142 
12143 	mutex_unlock(&nft_net->commit_mutex);
12144 
12145 	return NOTIFY_DONE;
12146 }
12147 
12148 static struct notifier_block nft_nl_notifier = {
12149 	.notifier_call  = nft_rcv_nl_event,
12150 };
12151 
12152 static int __net_init nf_tables_init_net(struct net *net)
12153 {
12154 	struct nftables_pernet *nft_net = nft_pernet(net);
12155 
12156 	INIT_LIST_HEAD(&nft_net->tables);
12157 	INIT_LIST_HEAD(&nft_net->commit_list);
12158 	INIT_LIST_HEAD(&nft_net->destroy_list);
12159 	INIT_LIST_HEAD(&nft_net->commit_set_list);
12160 	INIT_LIST_HEAD(&nft_net->binding_list);
12161 	INIT_LIST_HEAD(&nft_net->module_list);
12162 	INIT_LIST_HEAD(&nft_net->notify_list);
12163 	INIT_LIST_HEAD(&nft_net->set_update_list);
12164 	mutex_init(&nft_net->commit_mutex);
12165 	net->nft.base_seq = 1;
12166 	nft_net->gc_seq = 0;
12167 	nft_net->validate_state = NFT_VALIDATE_SKIP;
12168 	INIT_WORK(&nft_net->destroy_work, nf_tables_trans_destroy_work);
12169 
12170 	return 0;
12171 }
12172 
12173 static void __net_exit nf_tables_pre_exit_net(struct net *net)
12174 {
12175 	struct nftables_pernet *nft_net = nft_pernet(net);
12176 
12177 	mutex_lock(&nft_net->commit_mutex);
12178 	__nft_release_hooks(net);
12179 	mutex_unlock(&nft_net->commit_mutex);
12180 }
12181 
12182 static void __net_exit nf_tables_exit_net(struct net *net)
12183 {
12184 	struct nftables_pernet *nft_net = nft_pernet(net);
12185 	unsigned int gc_seq;
12186 
12187 	mutex_lock(&nft_net->commit_mutex);
12188 
12189 	gc_seq = nft_gc_seq_begin(nft_net);
12190 
12191 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
12192 	WARN_ON_ONCE(!list_empty(&nft_net->commit_set_list));
12193 
12194 	if (!list_empty(&nft_net->module_list))
12195 		nf_tables_module_autoload_cleanup(net);
12196 
12197 	cancel_work_sync(&nft_net->destroy_work);
12198 	__nft_release_tables(net);
12199 
12200 	nft_gc_seq_end(nft_net, gc_seq);
12201 
12202 	mutex_unlock(&nft_net->commit_mutex);
12203 
12204 	WARN_ON_ONCE(!list_empty(&nft_net->tables));
12205 	WARN_ON_ONCE(!list_empty(&nft_net->module_list));
12206 	WARN_ON_ONCE(!list_empty(&nft_net->notify_list));
12207 	WARN_ON_ONCE(!list_empty(&nft_net->destroy_list));
12208 	WARN_ON_ONCE(!list_empty(&nft_net->set_update_list));
12209 }
12210 
12211 static void nf_tables_exit_batch(struct list_head *net_exit_list)
12212 {
12213 	flush_work(&trans_gc_work);
12214 }
12215 
12216 static struct pernet_operations nf_tables_net_ops = {
12217 	.init		= nf_tables_init_net,
12218 	.pre_exit	= nf_tables_pre_exit_net,
12219 	.exit		= nf_tables_exit_net,
12220 	.exit_batch	= nf_tables_exit_batch,
12221 	.id		= &nf_tables_net_id,
12222 	.size		= sizeof(struct nftables_pernet),
12223 };
12224 
12225 static int __init nf_tables_module_init(void)
12226 {
12227 	int err;
12228 
12229 	BUILD_BUG_ON(offsetof(struct nft_trans_table, nft_trans) != 0);
12230 	BUILD_BUG_ON(offsetof(struct nft_trans_chain, nft_trans_binding.nft_trans) != 0);
12231 	BUILD_BUG_ON(offsetof(struct nft_trans_rule, nft_trans) != 0);
12232 	BUILD_BUG_ON(offsetof(struct nft_trans_set, nft_trans_binding.nft_trans) != 0);
12233 	BUILD_BUG_ON(offsetof(struct nft_trans_elem, nft_trans) != 0);
12234 	BUILD_BUG_ON(offsetof(struct nft_trans_obj, nft_trans) != 0);
12235 	BUILD_BUG_ON(offsetof(struct nft_trans_flowtable, nft_trans) != 0);
12236 
12237 	err = register_pernet_subsys(&nf_tables_net_ops);
12238 	if (err < 0)
12239 		return err;
12240 
12241 	err = nft_chain_filter_init();
12242 	if (err < 0)
12243 		goto err_chain_filter;
12244 
12245 	err = nf_tables_core_module_init();
12246 	if (err < 0)
12247 		goto err_core_module;
12248 
12249 	err = register_netdevice_notifier(&nf_tables_flowtable_notifier);
12250 	if (err < 0)
12251 		goto err_netdev_notifier;
12252 
12253 	err = nft_offload_init();
12254 	if (err < 0)
12255 		goto err_offload;
12256 
12257 	err = netlink_register_notifier(&nft_nl_notifier);
12258 	if (err < 0)
12259 		goto err_netlink_notifier;
12260 
12261 	/* must be last */
12262 	err = nfnetlink_subsys_register(&nf_tables_subsys);
12263 	if (err < 0)
12264 		goto err_nfnl_subsys;
12265 
12266 	nft_chain_route_init();
12267 
12268 	return err;
12269 
12270 err_nfnl_subsys:
12271 	netlink_unregister_notifier(&nft_nl_notifier);
12272 err_netlink_notifier:
12273 	nft_offload_exit();
12274 err_offload:
12275 	unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
12276 err_netdev_notifier:
12277 	nf_tables_core_module_exit();
12278 err_core_module:
12279 	nft_chain_filter_fini();
12280 err_chain_filter:
12281 	unregister_pernet_subsys(&nf_tables_net_ops);
12282 	return err;
12283 }
12284 
12285 static void __exit nf_tables_module_exit(void)
12286 {
12287 	nfnetlink_subsys_unregister(&nf_tables_subsys);
12288 	netlink_unregister_notifier(&nft_nl_notifier);
12289 	nft_offload_exit();
12290 	unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
12291 	nft_chain_filter_fini();
12292 	nft_chain_route_fini();
12293 	unregister_pernet_subsys(&nf_tables_net_ops);
12294 	cancel_work_sync(&trans_gc_work);
12295 	rcu_barrier();
12296 	nf_tables_core_module_exit();
12297 }
12298 
12299 module_init(nf_tables_module_init);
12300 module_exit(nf_tables_module_exit);
12301 
12302 MODULE_LICENSE("GPL");
12303 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
12304 MODULE_DESCRIPTION("Framework for packet filtering and classification");
12305 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES);
12306