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