File Index
Files and directories
Sign in
FILE

nf_tables_api.c

File preview with syntax highlighting.

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