073aa1051d43f6031109ac13181c7a64ef24e9be
[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/netfilter.h>
16 #include <linux/netfilter/nfnetlink.h>
17 #include <linux/netfilter/nf_tables.h>
18 #include <net/netfilter/nf_flow_table.h>
19 #include <net/netfilter/nf_tables_core.h>
20 #include <net/netfilter/nf_tables.h>
21 #include <net/netfilter/nf_tables_offload.h>
22 #include <net/net_namespace.h>
23 #include <net/sock.h>
24
25 #define NFT_MODULE_AUTOLOAD_LIMIT (MODULE_NAME_LEN - sizeof("nft-expr-255-"))
26
27 static LIST_HEAD(nf_tables_expressions);
28 static LIST_HEAD(nf_tables_objects);
29 static LIST_HEAD(nf_tables_flowtables);
30 static LIST_HEAD(nf_tables_destroy_list);
31 static DEFINE_SPINLOCK(nf_tables_destroy_list_lock);
32 static u64 table_handle;
33
34 enum {
35         NFT_VALIDATE_SKIP       = 0,
36         NFT_VALIDATE_NEED,
37         NFT_VALIDATE_DO,
38 };
39
40 static struct rhltable nft_objname_ht;
41
42 static u32 nft_chain_hash(const void *data, u32 len, u32 seed);
43 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed);
44 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *, const void *);
45
46 static u32 nft_objname_hash(const void *data, u32 len, u32 seed);
47 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed);
48 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *, const void *);
49
50 static const struct rhashtable_params nft_chain_ht_params = {
51         .head_offset            = offsetof(struct nft_chain, rhlhead),
52         .key_offset             = offsetof(struct nft_chain, name),
53         .hashfn                 = nft_chain_hash,
54         .obj_hashfn             = nft_chain_hash_obj,
55         .obj_cmpfn              = nft_chain_hash_cmp,
56         .automatic_shrinking    = true,
57 };
58
59 static const struct rhashtable_params nft_objname_ht_params = {
60         .head_offset            = offsetof(struct nft_object, rhlhead),
61         .key_offset             = offsetof(struct nft_object, key),
62         .hashfn                 = nft_objname_hash,
63         .obj_hashfn             = nft_objname_hash_obj,
64         .obj_cmpfn              = nft_objname_hash_cmp,
65         .automatic_shrinking    = true,
66 };
67
68 static void nft_validate_state_update(struct net *net, u8 new_validate_state)
69 {
70         switch (net->nft.validate_state) {
71         case NFT_VALIDATE_SKIP:
72                 WARN_ON_ONCE(new_validate_state == NFT_VALIDATE_DO);
73                 break;
74         case NFT_VALIDATE_NEED:
75                 break;
76         case NFT_VALIDATE_DO:
77                 if (new_validate_state == NFT_VALIDATE_NEED)
78                         return;
79         }
80
81         net->nft.validate_state = new_validate_state;
82 }
83 static void nf_tables_trans_destroy_work(struct work_struct *w);
84 static DECLARE_WORK(trans_destroy_work, nf_tables_trans_destroy_work);
85
86 static void nft_ctx_init(struct nft_ctx *ctx,
87                          struct net *net,
88                          const struct sk_buff *skb,
89                          const struct nlmsghdr *nlh,
90                          u8 family,
91                          struct nft_table *table,
92                          struct nft_chain *chain,
93                          const struct nlattr * const *nla)
94 {
95         ctx->net        = net;
96         ctx->family     = family;
97         ctx->level      = 0;
98         ctx->table      = table;
99         ctx->chain      = chain;
100         ctx->nla        = nla;
101         ctx->portid     = NETLINK_CB(skb).portid;
102         ctx->report     = nlmsg_report(nlh);
103         ctx->flags      = nlh->nlmsg_flags;
104         ctx->seq        = nlh->nlmsg_seq;
105 }
106
107 static struct nft_trans *nft_trans_alloc_gfp(const struct nft_ctx *ctx,
108                                              int msg_type, u32 size, gfp_t gfp)
109 {
110         struct nft_trans *trans;
111
112         trans = kzalloc(sizeof(struct nft_trans) + size, gfp);
113         if (trans == NULL)
114                 return NULL;
115
116         trans->msg_type = msg_type;
117         trans->ctx      = *ctx;
118
119         return trans;
120 }
121
122 static struct nft_trans *nft_trans_alloc(const struct nft_ctx *ctx,
123                                          int msg_type, u32 size)
124 {
125         return nft_trans_alloc_gfp(ctx, msg_type, size, GFP_KERNEL);
126 }
127
128 static void nft_trans_destroy(struct nft_trans *trans)
129 {
130         list_del(&trans->list);
131         kfree(trans);
132 }
133
134 static void nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set)
135 {
136         struct net *net = ctx->net;
137         struct nft_trans *trans;
138
139         if (!nft_set_is_anonymous(set))
140                 return;
141
142         list_for_each_entry_reverse(trans, &net->nft.commit_list, list) {
143                 switch (trans->msg_type) {
144                 case NFT_MSG_NEWSET:
145                         if (nft_trans_set(trans) == set)
146                                 nft_trans_set_bound(trans) = true;
147                         break;
148                 case NFT_MSG_NEWSETELEM:
149                         if (nft_trans_elem_set(trans) == set)
150                                 nft_trans_elem_set_bound(trans) = true;
151                         break;
152                 }
153         }
154 }
155
156 static int nft_netdev_register_hooks(struct net *net,
157                                      struct list_head *hook_list)
158 {
159         struct nft_hook *hook;
160         int err, j;
161
162         j = 0;
163         list_for_each_entry(hook, hook_list, list) {
164                 err = nf_register_net_hook(net, &hook->ops);
165                 if (err < 0)
166                         goto err_register;
167
168                 j++;
169         }
170         return 0;
171
172 err_register:
173         list_for_each_entry(hook, hook_list, list) {
174                 if (j-- <= 0)
175                         break;
176
177                 nf_unregister_net_hook(net, &hook->ops);
178         }
179         return err;
180 }
181
182 static void nft_netdev_unregister_hooks(struct net *net,
183                                         struct list_head *hook_list)
184 {
185         struct nft_hook *hook;
186
187         list_for_each_entry(hook, hook_list, list)
188                 nf_unregister_net_hook(net, &hook->ops);
189 }
190
191 static int nft_register_basechain_hooks(struct net *net, int family,
192                                         struct nft_base_chain *basechain)
193 {
194         if (family == NFPROTO_NETDEV)
195                 return nft_netdev_register_hooks(net, &basechain->hook_list);
196
197         return nf_register_net_hook(net, &basechain->ops);
198 }
199
200 static void nft_unregister_basechain_hooks(struct net *net, int family,
201                                            struct nft_base_chain *basechain)
202 {
203         if (family == NFPROTO_NETDEV)
204                 nft_netdev_unregister_hooks(net, &basechain->hook_list);
205         else
206                 nf_unregister_net_hook(net, &basechain->ops);
207 }
208
209 static int nf_tables_register_hook(struct net *net,
210                                    const struct nft_table *table,
211                                    struct nft_chain *chain)
212 {
213         struct nft_base_chain *basechain;
214         const struct nf_hook_ops *ops;
215
216         if (table->flags & NFT_TABLE_F_DORMANT ||
217             !nft_is_base_chain(chain))
218                 return 0;
219
220         basechain = nft_base_chain(chain);
221         ops = &basechain->ops;
222
223         if (basechain->type->ops_register)
224                 return basechain->type->ops_register(net, ops);
225
226         return nft_register_basechain_hooks(net, table->family, basechain);
227 }
228
229 static void nf_tables_unregister_hook(struct net *net,
230                                       const struct nft_table *table,
231                                       struct nft_chain *chain)
232 {
233         struct nft_base_chain *basechain;
234         const struct nf_hook_ops *ops;
235
236         if (table->flags & NFT_TABLE_F_DORMANT ||
237             !nft_is_base_chain(chain))
238                 return;
239         basechain = nft_base_chain(chain);
240         ops = &basechain->ops;
241
242         if (basechain->type->ops_unregister)
243                 return basechain->type->ops_unregister(net, ops);
244
245         nft_unregister_basechain_hooks(net, table->family, basechain);
246 }
247
248 static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type)
249 {
250         struct nft_trans *trans;
251
252         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_table));
253         if (trans == NULL)
254                 return -ENOMEM;
255
256         if (msg_type == NFT_MSG_NEWTABLE)
257                 nft_activate_next(ctx->net, ctx->table);
258
259         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
260         return 0;
261 }
262
263 static int nft_deltable(struct nft_ctx *ctx)
264 {
265         int err;
266
267         err = nft_trans_table_add(ctx, NFT_MSG_DELTABLE);
268         if (err < 0)
269                 return err;
270
271         nft_deactivate_next(ctx->net, ctx->table);
272         return err;
273 }
274
275 static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
276 {
277         struct nft_trans *trans;
278
279         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_chain));
280         if (trans == NULL)
281                 return ERR_PTR(-ENOMEM);
282
283         if (msg_type == NFT_MSG_NEWCHAIN)
284                 nft_activate_next(ctx->net, ctx->chain);
285
286         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
287         return trans;
288 }
289
290 static int nft_delchain(struct nft_ctx *ctx)
291 {
292         struct nft_trans *trans;
293
294         trans = nft_trans_chain_add(ctx, NFT_MSG_DELCHAIN);
295         if (IS_ERR(trans))
296                 return PTR_ERR(trans);
297
298         ctx->table->use--;
299         nft_deactivate_next(ctx->net, ctx->chain);
300
301         return 0;
302 }
303
304 static void nft_rule_expr_activate(const struct nft_ctx *ctx,
305                                    struct nft_rule *rule)
306 {
307         struct nft_expr *expr;
308
309         expr = nft_expr_first(rule);
310         while (expr != nft_expr_last(rule) && expr->ops) {
311                 if (expr->ops->activate)
312                         expr->ops->activate(ctx, expr);
313
314                 expr = nft_expr_next(expr);
315         }
316 }
317
318 static void nft_rule_expr_deactivate(const struct nft_ctx *ctx,
319                                      struct nft_rule *rule,
320                                      enum nft_trans_phase phase)
321 {
322         struct nft_expr *expr;
323
324         expr = nft_expr_first(rule);
325         while (expr != nft_expr_last(rule) && expr->ops) {
326                 if (expr->ops->deactivate)
327                         expr->ops->deactivate(ctx, expr, phase);
328
329                 expr = nft_expr_next(expr);
330         }
331 }
332
333 static int
334 nf_tables_delrule_deactivate(struct nft_ctx *ctx, struct nft_rule *rule)
335 {
336         /* You cannot delete the same rule twice */
337         if (nft_is_active_next(ctx->net, rule)) {
338                 nft_deactivate_next(ctx->net, rule);
339                 ctx->chain->use--;
340                 return 0;
341         }
342         return -ENOENT;
343 }
344
345 static struct nft_trans *nft_trans_rule_add(struct nft_ctx *ctx, int msg_type,
346                                             struct nft_rule *rule)
347 {
348         struct nft_trans *trans;
349
350         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_rule));
351         if (trans == NULL)
352                 return NULL;
353
354         if (msg_type == NFT_MSG_NEWRULE && ctx->nla[NFTA_RULE_ID] != NULL) {
355                 nft_trans_rule_id(trans) =
356                         ntohl(nla_get_be32(ctx->nla[NFTA_RULE_ID]));
357         }
358         nft_trans_rule(trans) = rule;
359         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
360
361         return trans;
362 }
363
364 static int nft_delrule(struct nft_ctx *ctx, struct nft_rule *rule)
365 {
366         struct nft_flow_rule *flow;
367         struct nft_trans *trans;
368         int err;
369
370         trans = nft_trans_rule_add(ctx, NFT_MSG_DELRULE, rule);
371         if (trans == NULL)
372                 return -ENOMEM;
373
374         if (ctx->chain->flags & NFT_CHAIN_HW_OFFLOAD) {
375                 flow = nft_flow_rule_create(ctx->net, rule);
376                 if (IS_ERR(flow)) {
377                         nft_trans_destroy(trans);
378                         return PTR_ERR(flow);
379                 }
380
381                 nft_trans_flow_rule(trans) = flow;
382         }
383
384         err = nf_tables_delrule_deactivate(ctx, rule);
385         if (err < 0) {
386                 nft_trans_destroy(trans);
387                 return err;
388         }
389         nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_PREPARE);
390
391         return 0;
392 }
393
394 static int nft_delrule_by_chain(struct nft_ctx *ctx)
395 {
396         struct nft_rule *rule;
397         int err;
398
399         list_for_each_entry(rule, &ctx->chain->rules, list) {
400                 if (!nft_is_active_next(ctx->net, rule))
401                         continue;
402
403                 err = nft_delrule(ctx, rule);
404                 if (err < 0)
405                         return err;
406         }
407         return 0;
408 }
409
410 static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
411                              struct nft_set *set)
412 {
413         struct nft_trans *trans;
414
415         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_set));
416         if (trans == NULL)
417                 return -ENOMEM;
418
419         if (msg_type == NFT_MSG_NEWSET && ctx->nla[NFTA_SET_ID] != NULL) {
420                 nft_trans_set_id(trans) =
421                         ntohl(nla_get_be32(ctx->nla[NFTA_SET_ID]));
422                 nft_activate_next(ctx->net, set);
423         }
424         nft_trans_set(trans) = set;
425         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
426
427         return 0;
428 }
429
430 static int nft_delset(const struct nft_ctx *ctx, struct nft_set *set)
431 {
432         int err;
433
434         err = nft_trans_set_add(ctx, NFT_MSG_DELSET, set);
435         if (err < 0)
436                 return err;
437
438         nft_deactivate_next(ctx->net, set);
439         ctx->table->use--;
440
441         return err;
442 }
443
444 static int nft_trans_obj_add(struct nft_ctx *ctx, int msg_type,
445                              struct nft_object *obj)
446 {
447         struct nft_trans *trans;
448
449         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_obj));
450         if (trans == NULL)
451                 return -ENOMEM;
452
453         if (msg_type == NFT_MSG_NEWOBJ)
454                 nft_activate_next(ctx->net, obj);
455
456         nft_trans_obj(trans) = obj;
457         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
458
459         return 0;
460 }
461
462 static int nft_delobj(struct nft_ctx *ctx, struct nft_object *obj)
463 {
464         int err;
465
466         err = nft_trans_obj_add(ctx, NFT_MSG_DELOBJ, obj);
467         if (err < 0)
468                 return err;
469
470         nft_deactivate_next(ctx->net, obj);
471         ctx->table->use--;
472
473         return err;
474 }
475
476 static int nft_trans_flowtable_add(struct nft_ctx *ctx, int msg_type,
477                                    struct nft_flowtable *flowtable)
478 {
479         struct nft_trans *trans;
480
481         trans = nft_trans_alloc(ctx, msg_type,
482                                 sizeof(struct nft_trans_flowtable));
483         if (trans == NULL)
484                 return -ENOMEM;
485
486         if (msg_type == NFT_MSG_NEWFLOWTABLE)
487                 nft_activate_next(ctx->net, flowtable);
488
489         nft_trans_flowtable(trans) = flowtable;
490         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
491
492         return 0;
493 }
494
495 static int nft_delflowtable(struct nft_ctx *ctx,
496                             struct nft_flowtable *flowtable)
497 {
498         int err;
499
500         err = nft_trans_flowtable_add(ctx, NFT_MSG_DELFLOWTABLE, flowtable);
501         if (err < 0)
502                 return err;
503
504         nft_deactivate_next(ctx->net, flowtable);
505         ctx->table->use--;
506
507         return err;
508 }
509
510 /*
511  * Tables
512  */
513
514 static struct nft_table *nft_table_lookup(const struct net *net,
515                                           const struct nlattr *nla,
516                                           u8 family, u8 genmask)
517 {
518         struct nft_table *table;
519
520         if (nla == NULL)
521                 return ERR_PTR(-EINVAL);
522
523         list_for_each_entry_rcu(table, &net->nft.tables, list,
524                                 lockdep_is_held(&net->nft.commit_mutex)) {
525                 if (!nla_strcmp(nla, table->name) &&
526                     table->family == family &&
527                     nft_active_genmask(table, genmask))
528                         return table;
529         }
530
531         return ERR_PTR(-ENOENT);
532 }
533
534 static struct nft_table *nft_table_lookup_byhandle(const struct net *net,
535                                                    const struct nlattr *nla,
536                                                    u8 genmask)
537 {
538         struct nft_table *table;
539
540         list_for_each_entry(table, &net->nft.tables, list) {
541                 if (be64_to_cpu(nla_get_be64(nla)) == table->handle &&
542                     nft_active_genmask(table, genmask))
543                         return table;
544         }
545
546         return ERR_PTR(-ENOENT);
547 }
548
549 static inline u64 nf_tables_alloc_handle(struct nft_table *table)
550 {
551         return ++table->hgenerator;
552 }
553
554 static const struct nft_chain_type *chain_type[NFPROTO_NUMPROTO][NFT_CHAIN_T_MAX];
555
556 static const struct nft_chain_type *
557 __nft_chain_type_get(u8 family, enum nft_chain_types type)
558 {
559         if (family >= NFPROTO_NUMPROTO ||
560             type >= NFT_CHAIN_T_MAX)
561                 return NULL;
562
563         return chain_type[family][type];
564 }
565
566 static const struct nft_chain_type *
567 __nf_tables_chain_type_lookup(const struct nlattr *nla, u8 family)
568 {
569         const struct nft_chain_type *type;
570         int i;
571
572         for (i = 0; i < NFT_CHAIN_T_MAX; i++) {
573                 type = __nft_chain_type_get(family, i);
574                 if (!type)
575                         continue;
576                 if (!nla_strcmp(nla, type->name))
577                         return type;
578         }
579         return NULL;
580 }
581
582 struct nft_module_request {
583         struct list_head        list;
584         char                    module[MODULE_NAME_LEN];
585         bool                    done;
586 };
587
588 #ifdef CONFIG_MODULES
589 static int nft_request_module(struct net *net, const char *fmt, ...)
590 {
591         char module_name[MODULE_NAME_LEN];
592         struct nft_module_request *req;
593         va_list args;
594         int ret;
595
596         va_start(args, fmt);
597         ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);
598         va_end(args);
599         if (ret >= MODULE_NAME_LEN)
600                 return 0;
601
602         list_for_each_entry(req, &net->nft.module_list, list) {
603                 if (!strcmp(req->module, module_name)) {
604                         if (req->done)
605                                 return 0;
606
607                         /* A request to load this module already exists. */
608                         return -EAGAIN;
609                 }
610         }
611
612         req = kmalloc(sizeof(*req), GFP_KERNEL);
613         if (!req)
614                 return -ENOMEM;
615
616         req->done = false;
617         strlcpy(req->module, module_name, MODULE_NAME_LEN);
618         list_add_tail(&req->list, &net->nft.module_list);
619
620         return -EAGAIN;
621 }
622 #endif
623
624 static void lockdep_nfnl_nft_mutex_not_held(void)
625 {
626 #ifdef CONFIG_PROVE_LOCKING
627         WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES));
628 #endif
629 }
630
631 static const struct nft_chain_type *
632 nf_tables_chain_type_lookup(struct net *net, const struct nlattr *nla,
633                             u8 family, bool autoload)
634 {
635         const struct nft_chain_type *type;
636
637         type = __nf_tables_chain_type_lookup(nla, family);
638         if (type != NULL)
639                 return type;
640
641         lockdep_nfnl_nft_mutex_not_held();
642 #ifdef CONFIG_MODULES
643         if (autoload) {
644                 if (nft_request_module(net, "nft-chain-%u-%.*s", family,
645                                        nla_len(nla),
646                                        (const char *)nla_data(nla)) == -EAGAIN)
647                         return ERR_PTR(-EAGAIN);
648         }
649 #endif
650         return ERR_PTR(-ENOENT);
651 }
652
653 static const struct nla_policy nft_table_policy[NFTA_TABLE_MAX + 1] = {
654         [NFTA_TABLE_NAME]       = { .type = NLA_STRING,
655                                     .len = NFT_TABLE_MAXNAMELEN - 1 },
656         [NFTA_TABLE_FLAGS]      = { .type = NLA_U32 },
657         [NFTA_TABLE_HANDLE]     = { .type = NLA_U64 },
658 };
659
660 static int nf_tables_fill_table_info(struct sk_buff *skb, struct net *net,
661                                      u32 portid, u32 seq, int event, u32 flags,
662                                      int family, const struct nft_table *table)
663 {
664         struct nlmsghdr *nlh;
665         struct nfgenmsg *nfmsg;
666
667         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
668         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
669         if (nlh == NULL)
670                 goto nla_put_failure;
671
672         nfmsg = nlmsg_data(nlh);
673         nfmsg->nfgen_family     = family;
674         nfmsg->version          = NFNETLINK_V0;
675         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
676
677         if (nla_put_string(skb, NFTA_TABLE_NAME, table->name) ||
678             nla_put_be32(skb, NFTA_TABLE_FLAGS, htonl(table->flags)) ||
679             nla_put_be32(skb, NFTA_TABLE_USE, htonl(table->use)) ||
680             nla_put_be64(skb, NFTA_TABLE_HANDLE, cpu_to_be64(table->handle),
681                          NFTA_TABLE_PAD))
682                 goto nla_put_failure;
683
684         nlmsg_end(skb, nlh);
685         return 0;
686
687 nla_put_failure:
688         nlmsg_trim(skb, nlh);
689         return -1;
690 }
691
692 static void nf_tables_table_notify(const struct nft_ctx *ctx, int event)
693 {
694         struct sk_buff *skb;
695         int err;
696
697         if (!ctx->report &&
698             !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
699                 return;
700
701         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
702         if (skb == NULL)
703                 goto err;
704
705         err = nf_tables_fill_table_info(skb, ctx->net, ctx->portid, ctx->seq,
706                                         event, 0, ctx->family, ctx->table);
707         if (err < 0) {
708                 kfree_skb(skb);
709                 goto err;
710         }
711
712         nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
713                        ctx->report, GFP_KERNEL);
714         return;
715 err:
716         nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
717 }
718
719 static int nf_tables_dump_tables(struct sk_buff *skb,
720                                  struct netlink_callback *cb)
721 {
722         const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
723         const struct nft_table *table;
724         unsigned int idx = 0, s_idx = cb->args[0];
725         struct net *net = sock_net(skb->sk);
726         int family = nfmsg->nfgen_family;
727
728         rcu_read_lock();
729         cb->seq = net->nft.base_seq;
730
731         list_for_each_entry_rcu(table, &net->nft.tables, list) {
732                 if (family != NFPROTO_UNSPEC && family != table->family)
733                         continue;
734
735                 if (idx < s_idx)
736                         goto cont;
737                 if (idx > s_idx)
738                         memset(&cb->args[1], 0,
739                                sizeof(cb->args) - sizeof(cb->args[0]));
740                 if (!nft_is_active(net, table))
741                         continue;
742                 if (nf_tables_fill_table_info(skb, net,
743                                               NETLINK_CB(cb->skb).portid,
744                                               cb->nlh->nlmsg_seq,
745                                               NFT_MSG_NEWTABLE, NLM_F_MULTI,
746                                               table->family, table) < 0)
747                         goto done;
748
749                 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
750 cont:
751                 idx++;
752         }
753 done:
754         rcu_read_unlock();
755         cb->args[0] = idx;
756         return skb->len;
757 }
758
759 static int nft_netlink_dump_start_rcu(struct sock *nlsk, struct sk_buff *skb,
760                                       const struct nlmsghdr *nlh,
761                                       struct netlink_dump_control *c)
762 {
763         int err;
764
765         if (!try_module_get(THIS_MODULE))
766                 return -EINVAL;
767
768         rcu_read_unlock();
769         err = netlink_dump_start(nlsk, skb, nlh, c);
770         rcu_read_lock();
771         module_put(THIS_MODULE);
772
773         return err;
774 }
775
776 /* called with rcu_read_lock held */
777 static int nf_tables_gettable(struct net *net, struct sock *nlsk,
778                               struct sk_buff *skb, const struct nlmsghdr *nlh,
779                               const struct nlattr * const nla[],
780                               struct netlink_ext_ack *extack)
781 {
782         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
783         u8 genmask = nft_genmask_cur(net);
784         const struct nft_table *table;
785         struct sk_buff *skb2;
786         int family = nfmsg->nfgen_family;
787         int err;
788
789         if (nlh->nlmsg_flags & NLM_F_DUMP) {
790                 struct netlink_dump_control c = {
791                         .dump = nf_tables_dump_tables,
792                         .module = THIS_MODULE,
793                 };
794
795                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
796         }
797
798         table = nft_table_lookup(net, nla[NFTA_TABLE_NAME], family, genmask);
799         if (IS_ERR(table)) {
800                 NL_SET_BAD_ATTR(extack, nla[NFTA_TABLE_NAME]);
801                 return PTR_ERR(table);
802         }
803
804         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
805         if (!skb2)
806                 return -ENOMEM;
807
808         err = nf_tables_fill_table_info(skb2, net, NETLINK_CB(skb).portid,
809                                         nlh->nlmsg_seq, NFT_MSG_NEWTABLE, 0,
810                                         family, table);
811         if (err < 0)
812                 goto err;
813
814         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
815
816 err:
817         kfree_skb(skb2);
818         return err;
819 }
820
821 static void nft_table_disable(struct net *net, struct nft_table *table, u32 cnt)
822 {
823         struct nft_chain *chain;
824         u32 i = 0;
825
826         list_for_each_entry(chain, &table->chains, list) {
827                 if (!nft_is_active_next(net, chain))
828                         continue;
829                 if (!nft_is_base_chain(chain))
830                         continue;
831
832                 if (cnt && i++ == cnt)
833                         break;
834
835                 nft_unregister_basechain_hooks(net, table->family,
836                                                nft_base_chain(chain));
837         }
838 }
839
840 static int nf_tables_table_enable(struct net *net, struct nft_table *table)
841 {
842         struct nft_chain *chain;
843         int err, i = 0;
844
845         list_for_each_entry(chain, &table->chains, list) {
846                 if (!nft_is_active_next(net, chain))
847                         continue;
848                 if (!nft_is_base_chain(chain))
849                         continue;
850
851                 err = nft_register_basechain_hooks(net, table->family,
852                                                    nft_base_chain(chain));
853                 if (err < 0)
854                         goto err_register_hooks;
855
856                 i++;
857         }
858         return 0;
859
860 err_register_hooks:
861         if (i)
862                 nft_table_disable(net, table, i);
863         return err;
864 }
865
866 static void nf_tables_table_disable(struct net *net, struct nft_table *table)
867 {
868         nft_table_disable(net, table, 0);
869 }
870
871 static int nf_tables_updtable(struct nft_ctx *ctx)
872 {
873         struct nft_trans *trans;
874         u32 flags;
875         int ret = 0;
876
877         if (!ctx->nla[NFTA_TABLE_FLAGS])
878                 return 0;
879
880         flags = ntohl(nla_get_be32(ctx->nla[NFTA_TABLE_FLAGS]));
881         if (flags & ~NFT_TABLE_F_DORMANT)
882                 return -EINVAL;
883
884         if (flags == ctx->table->flags)
885                 return 0;
886
887         trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
888                                 sizeof(struct nft_trans_table));
889         if (trans == NULL)
890                 return -ENOMEM;
891
892         if ((flags & NFT_TABLE_F_DORMANT) &&
893             !(ctx->table->flags & NFT_TABLE_F_DORMANT)) {
894                 nft_trans_table_enable(trans) = false;
895         } else if (!(flags & NFT_TABLE_F_DORMANT) &&
896                    ctx->table->flags & NFT_TABLE_F_DORMANT) {
897                 ret = nf_tables_table_enable(ctx->net, ctx->table);
898                 if (ret >= 0) {
899                         ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
900                         nft_trans_table_enable(trans) = true;
901                 }
902         }
903         if (ret < 0)
904                 goto err;
905
906         nft_trans_table_update(trans) = true;
907         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
908         return 0;
909 err:
910         nft_trans_destroy(trans);
911         return ret;
912 }
913
914 static u32 nft_chain_hash(const void *data, u32 len, u32 seed)
915 {
916         const char *name = data;
917
918         return jhash(name, strlen(name), seed);
919 }
920
921 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed)
922 {
923         const struct nft_chain *chain = data;
924
925         return nft_chain_hash(chain->name, 0, seed);
926 }
927
928 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *arg,
929                               const void *ptr)
930 {
931         const struct nft_chain *chain = ptr;
932         const char *name = arg->key;
933
934         return strcmp(chain->name, name);
935 }
936
937 static u32 nft_objname_hash(const void *data, u32 len, u32 seed)
938 {
939         const struct nft_object_hash_key *k = data;
940
941         seed ^= hash_ptr(k->table, 32);
942
943         return jhash(k->name, strlen(k->name), seed);
944 }
945
946 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed)
947 {
948         const struct nft_object *obj = data;
949
950         return nft_objname_hash(&obj->key, 0, seed);
951 }
952
953 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *arg,
954                                 const void *ptr)
955 {
956         const struct nft_object_hash_key *k = arg->key;
957         const struct nft_object *obj = ptr;
958
959         if (obj->key.table != k->table)
960                 return -1;
961
962         return strcmp(obj->key.name, k->name);
963 }
964
965 static int nf_tables_newtable(struct net *net, struct sock *nlsk,
966                               struct sk_buff *skb, const struct nlmsghdr *nlh,
967                               const struct nlattr * const nla[],
968                               struct netlink_ext_ack *extack)
969 {
970         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
971         u8 genmask = nft_genmask_next(net);
972         int family = nfmsg->nfgen_family;
973         const struct nlattr *attr;
974         struct nft_table *table;
975         u32 flags = 0;
976         struct nft_ctx ctx;
977         int err;
978
979         lockdep_assert_held(&net->nft.commit_mutex);
980         attr = nla[NFTA_TABLE_NAME];
981         table = nft_table_lookup(net, attr, family, genmask);
982         if (IS_ERR(table)) {
983                 if (PTR_ERR(table) != -ENOENT)
984                         return PTR_ERR(table);
985         } else {
986                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
987                         NL_SET_BAD_ATTR(extack, attr);
988                         return -EEXIST;
989                 }
990                 if (nlh->nlmsg_flags & NLM_F_REPLACE)
991                         return -EOPNOTSUPP;
992
993                 nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
994                 return nf_tables_updtable(&ctx);
995         }
996
997         if (nla[NFTA_TABLE_FLAGS]) {
998                 flags = ntohl(nla_get_be32(nla[NFTA_TABLE_FLAGS]));
999                 if (flags & ~NFT_TABLE_F_DORMANT)
1000                         return -EINVAL;
1001         }
1002
1003         err = -ENOMEM;
1004         table = kzalloc(sizeof(*table), GFP_KERNEL);
1005         if (table == NULL)
1006                 goto err_kzalloc;
1007
1008         table->name = nla_strdup(attr, GFP_KERNEL);
1009         if (table->name == NULL)
1010                 goto err_strdup;
1011
1012         err = rhltable_init(&table->chains_ht, &nft_chain_ht_params);
1013         if (err)
1014                 goto err_chain_ht;
1015
1016         INIT_LIST_HEAD(&table->chains);
1017         INIT_LIST_HEAD(&table->sets);
1018         INIT_LIST_HEAD(&table->objects);
1019         INIT_LIST_HEAD(&table->flowtables);
1020         table->family = family;
1021         table->flags = flags;
1022         table->handle = ++table_handle;
1023
1024         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
1025         err = nft_trans_table_add(&ctx, NFT_MSG_NEWTABLE);
1026         if (err < 0)
1027                 goto err_trans;
1028
1029         list_add_tail_rcu(&table->list, &net->nft.tables);
1030         return 0;
1031 err_trans:
1032         rhltable_destroy(&table->chains_ht);
1033 err_chain_ht:
1034         kfree(table->name);
1035 err_strdup:
1036         kfree(table);
1037 err_kzalloc:
1038         return err;
1039 }
1040
1041 static int nft_flush_table(struct nft_ctx *ctx)
1042 {
1043         struct nft_flowtable *flowtable, *nft;
1044         struct nft_chain *chain, *nc;
1045         struct nft_object *obj, *ne;
1046         struct nft_set *set, *ns;
1047         int err;
1048
1049         list_for_each_entry(chain, &ctx->table->chains, list) {
1050                 if (!nft_is_active_next(ctx->net, chain))
1051                         continue;
1052
1053                 ctx->chain = chain;
1054
1055                 err = nft_delrule_by_chain(ctx);
1056                 if (err < 0)
1057                         goto out;
1058         }
1059
1060         list_for_each_entry_safe(set, ns, &ctx->table->sets, list) {
1061                 if (!nft_is_active_next(ctx->net, set))
1062                         continue;
1063
1064                 if (nft_set_is_anonymous(set) &&
1065                     !list_empty(&set->bindings))
1066                         continue;
1067
1068                 err = nft_delset(ctx, set);
1069                 if (err < 0)
1070                         goto out;
1071         }
1072
1073         list_for_each_entry_safe(flowtable, nft, &ctx->table->flowtables, list) {
1074                 if (!nft_is_active_next(ctx->net, flowtable))
1075                         continue;
1076
1077                 err = nft_delflowtable(ctx, flowtable);
1078                 if (err < 0)
1079                         goto out;
1080         }
1081
1082         list_for_each_entry_safe(obj, ne, &ctx->table->objects, list) {
1083                 if (!nft_is_active_next(ctx->net, obj))
1084                         continue;
1085
1086                 err = nft_delobj(ctx, obj);
1087                 if (err < 0)
1088                         goto out;
1089         }
1090
1091         list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
1092                 if (!nft_is_active_next(ctx->net, chain))
1093                         continue;
1094
1095                 ctx->chain = chain;
1096
1097                 err = nft_delchain(ctx);
1098                 if (err < 0)
1099                         goto out;
1100         }
1101
1102         err = nft_deltable(ctx);
1103 out:
1104         return err;
1105 }
1106
1107 static int nft_flush(struct nft_ctx *ctx, int family)
1108 {
1109         struct nft_table *table, *nt;
1110         const struct nlattr * const *nla = ctx->nla;
1111         int err = 0;
1112
1113         list_for_each_entry_safe(table, nt, &ctx->net->nft.tables, list) {
1114                 if (family != AF_UNSPEC && table->family != family)
1115                         continue;
1116
1117                 ctx->family = table->family;
1118
1119                 if (!nft_is_active_next(ctx->net, table))
1120                         continue;
1121
1122                 if (nla[NFTA_TABLE_NAME] &&
1123                     nla_strcmp(nla[NFTA_TABLE_NAME], table->name) != 0)
1124                         continue;
1125
1126                 ctx->table = table;
1127
1128                 err = nft_flush_table(ctx);
1129                 if (err < 0)
1130                         goto out;
1131         }
1132 out:
1133         return err;
1134 }
1135
1136 static int nf_tables_deltable(struct net *net, struct sock *nlsk,
1137                               struct sk_buff *skb, const struct nlmsghdr *nlh,
1138                               const struct nlattr * const nla[],
1139                               struct netlink_ext_ack *extack)
1140 {
1141         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1142         u8 genmask = nft_genmask_next(net);
1143         int family = nfmsg->nfgen_family;
1144         const struct nlattr *attr;
1145         struct nft_table *table;
1146         struct nft_ctx ctx;
1147
1148         nft_ctx_init(&ctx, net, skb, nlh, 0, NULL, NULL, nla);
1149         if (family == AF_UNSPEC ||
1150             (!nla[NFTA_TABLE_NAME] && !nla[NFTA_TABLE_HANDLE]))
1151                 return nft_flush(&ctx, family);
1152
1153         if (nla[NFTA_TABLE_HANDLE]) {
1154                 attr = nla[NFTA_TABLE_HANDLE];
1155                 table = nft_table_lookup_byhandle(net, attr, genmask);
1156         } else {
1157                 attr = nla[NFTA_TABLE_NAME];
1158                 table = nft_table_lookup(net, attr, family, genmask);
1159         }
1160
1161         if (IS_ERR(table)) {
1162                 NL_SET_BAD_ATTR(extack, attr);
1163                 return PTR_ERR(table);
1164         }
1165
1166         if (nlh->nlmsg_flags & NLM_F_NONREC &&
1167             table->use > 0)
1168                 return -EBUSY;
1169
1170         ctx.family = family;
1171         ctx.table = table;
1172
1173         return nft_flush_table(&ctx);
1174 }
1175
1176 static void nf_tables_table_destroy(struct nft_ctx *ctx)
1177 {
1178         if (WARN_ON(ctx->table->use > 0))
1179                 return;
1180
1181         rhltable_destroy(&ctx->table->chains_ht);
1182         kfree(ctx->table->name);
1183         kfree(ctx->table);
1184 }
1185
1186 void nft_register_chain_type(const struct nft_chain_type *ctype)
1187 {
1188         nfnl_lock(NFNL_SUBSYS_NFTABLES);
1189         if (WARN_ON(__nft_chain_type_get(ctype->family, ctype->type))) {
1190                 nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1191                 return;
1192         }
1193         chain_type[ctype->family][ctype->type] = ctype;
1194         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1195 }
1196 EXPORT_SYMBOL_GPL(nft_register_chain_type);
1197
1198 void nft_unregister_chain_type(const struct nft_chain_type *ctype)
1199 {
1200         nfnl_lock(NFNL_SUBSYS_NFTABLES);
1201         chain_type[ctype->family][ctype->type] = NULL;
1202         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1203 }
1204 EXPORT_SYMBOL_GPL(nft_unregister_chain_type);
1205
1206 /*
1207  * Chains
1208  */
1209
1210 static struct nft_chain *
1211 nft_chain_lookup_byhandle(const struct nft_table *table, u64 handle, u8 genmask)
1212 {
1213         struct nft_chain *chain;
1214
1215         list_for_each_entry(chain, &table->chains, list) {
1216                 if (chain->handle == handle &&
1217                     nft_active_genmask(chain, genmask))
1218                         return chain;
1219         }
1220
1221         return ERR_PTR(-ENOENT);
1222 }
1223
1224 static bool lockdep_commit_lock_is_held(const struct net *net)
1225 {
1226 #ifdef CONFIG_PROVE_LOCKING
1227         return lockdep_is_held(&net->nft.commit_mutex);
1228 #else
1229         return true;
1230 #endif
1231 }
1232
1233 static struct nft_chain *nft_chain_lookup(struct net *net,
1234                                           struct nft_table *table,
1235                                           const struct nlattr *nla, u8 genmask)
1236 {
1237         char search[NFT_CHAIN_MAXNAMELEN + 1];
1238         struct rhlist_head *tmp, *list;
1239         struct nft_chain *chain;
1240
1241         if (nla == NULL)
1242                 return ERR_PTR(-EINVAL);
1243
1244         nla_strlcpy(search, nla, sizeof(search));
1245
1246         WARN_ON(!rcu_read_lock_held() &&
1247                 !lockdep_commit_lock_is_held(net));
1248
1249         chain = ERR_PTR(-ENOENT);
1250         rcu_read_lock();
1251         list = rhltable_lookup(&table->chains_ht, search, nft_chain_ht_params);
1252         if (!list)
1253                 goto out_unlock;
1254
1255         rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
1256                 if (nft_active_genmask(chain, genmask))
1257                         goto out_unlock;
1258         }
1259         chain = ERR_PTR(-ENOENT);
1260 out_unlock:
1261         rcu_read_unlock();
1262         return chain;
1263 }
1264
1265 static const struct nla_policy nft_chain_policy[NFTA_CHAIN_MAX + 1] = {
1266         [NFTA_CHAIN_TABLE]      = { .type = NLA_STRING,
1267                                     .len = NFT_TABLE_MAXNAMELEN - 1 },
1268         [NFTA_CHAIN_HANDLE]     = { .type = NLA_U64 },
1269         [NFTA_CHAIN_NAME]       = { .type = NLA_STRING,
1270                                     .len = NFT_CHAIN_MAXNAMELEN - 1 },
1271         [NFTA_CHAIN_HOOK]       = { .type = NLA_NESTED },
1272         [NFTA_CHAIN_POLICY]     = { .type = NLA_U32 },
1273         [NFTA_CHAIN_TYPE]       = { .type = NLA_STRING,
1274                                     .len = NFT_MODULE_AUTOLOAD_LIMIT },
1275         [NFTA_CHAIN_COUNTERS]   = { .type = NLA_NESTED },
1276         [NFTA_CHAIN_FLAGS]      = { .type = NLA_U32 },
1277 };
1278
1279 static const struct nla_policy nft_hook_policy[NFTA_HOOK_MAX + 1] = {
1280         [NFTA_HOOK_HOOKNUM]     = { .type = NLA_U32 },
1281         [NFTA_HOOK_PRIORITY]    = { .type = NLA_U32 },
1282         [NFTA_HOOK_DEV]         = { .type = NLA_STRING,
1283                                     .len = IFNAMSIZ - 1 },
1284 };
1285
1286 static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats)
1287 {
1288         struct nft_stats *cpu_stats, total;
1289         struct nlattr *nest;
1290         unsigned int seq;
1291         u64 pkts, bytes;
1292         int cpu;
1293
1294         if (!stats)
1295                 return 0;
1296
1297         memset(&total, 0, sizeof(total));
1298         for_each_possible_cpu(cpu) {
1299                 cpu_stats = per_cpu_ptr(stats, cpu);
1300                 do {
1301                         seq = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
1302                         pkts = cpu_stats->pkts;
1303                         bytes = cpu_stats->bytes;
1304                 } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, seq));
1305                 total.pkts += pkts;
1306                 total.bytes += bytes;
1307         }
1308         nest = nla_nest_start_noflag(skb, NFTA_CHAIN_COUNTERS);
1309         if (nest == NULL)
1310                 goto nla_put_failure;
1311
1312         if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts),
1313                          NFTA_COUNTER_PAD) ||
1314             nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes),
1315                          NFTA_COUNTER_PAD))
1316                 goto nla_put_failure;
1317
1318         nla_nest_end(skb, nest);
1319         return 0;
1320
1321 nla_put_failure:
1322         return -ENOSPC;
1323 }
1324
1325 static int nft_dump_basechain_hook(struct sk_buff *skb, int family,
1326                                    const struct nft_base_chain *basechain)
1327 {
1328         const struct nf_hook_ops *ops = &basechain->ops;
1329         struct nft_hook *hook, *first = NULL;
1330         struct nlattr *nest, *nest_devs;
1331         int n = 0;
1332
1333         nest = nla_nest_start_noflag(skb, NFTA_CHAIN_HOOK);
1334         if (nest == NULL)
1335                 goto nla_put_failure;
1336         if (nla_put_be32(skb, NFTA_HOOK_HOOKNUM, htonl(ops->hooknum)))
1337                 goto nla_put_failure;
1338         if (nla_put_be32(skb, NFTA_HOOK_PRIORITY, htonl(ops->priority)))
1339                 goto nla_put_failure;
1340
1341         if (family == NFPROTO_NETDEV) {
1342                 nest_devs = nla_nest_start_noflag(skb, NFTA_HOOK_DEVS);
1343                 list_for_each_entry(hook, &basechain->hook_list, list) {
1344                         if (!first)
1345                                 first = hook;
1346
1347                         if (nla_put_string(skb, NFTA_DEVICE_NAME,
1348                                            hook->ops.dev->name))
1349                                 goto nla_put_failure;
1350                         n++;
1351                 }
1352                 nla_nest_end(skb, nest_devs);
1353
1354                 if (n == 1 &&
1355                     nla_put_string(skb, NFTA_HOOK_DEV, first->ops.dev->name))
1356                         goto nla_put_failure;
1357         }
1358         nla_nest_end(skb, nest);
1359
1360         return 0;
1361 nla_put_failure:
1362         return -1;
1363 }
1364
1365 static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net,
1366                                      u32 portid, u32 seq, int event, u32 flags,
1367                                      int family, const struct nft_table *table,
1368                                      const struct nft_chain *chain)
1369 {
1370         struct nlmsghdr *nlh;
1371         struct nfgenmsg *nfmsg;
1372
1373         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
1374         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
1375         if (nlh == NULL)
1376                 goto nla_put_failure;
1377
1378         nfmsg = nlmsg_data(nlh);
1379         nfmsg->nfgen_family     = family;
1380         nfmsg->version          = NFNETLINK_V0;
1381         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
1382
1383         if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name))
1384                 goto nla_put_failure;
1385         if (nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle),
1386                          NFTA_CHAIN_PAD))
1387                 goto nla_put_failure;
1388         if (nla_put_string(skb, NFTA_CHAIN_NAME, chain->name))
1389                 goto nla_put_failure;
1390
1391         if (nft_is_base_chain(chain)) {
1392                 const struct nft_base_chain *basechain = nft_base_chain(chain);
1393                 struct nft_stats __percpu *stats;
1394
1395                 if (nft_dump_basechain_hook(skb, family, basechain))
1396                         goto nla_put_failure;
1397
1398                 if (nla_put_be32(skb, NFTA_CHAIN_POLICY,
1399                                  htonl(basechain->policy)))
1400                         goto nla_put_failure;
1401
1402                 if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name))
1403                         goto nla_put_failure;
1404
1405                 stats = rcu_dereference_check(basechain->stats,
1406                                               lockdep_commit_lock_is_held(net));
1407                 if (nft_dump_stats(skb, stats))
1408                         goto nla_put_failure;
1409
1410                 if ((chain->flags & NFT_CHAIN_HW_OFFLOAD) &&
1411                     nla_put_be32(skb, NFTA_CHAIN_FLAGS,
1412                                  htonl(NFT_CHAIN_HW_OFFLOAD)))
1413                         goto nla_put_failure;
1414         }
1415
1416         if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use)))
1417                 goto nla_put_failure;
1418
1419         nlmsg_end(skb, nlh);
1420         return 0;
1421
1422 nla_put_failure:
1423         nlmsg_trim(skb, nlh);
1424         return -1;
1425 }
1426
1427 static void nf_tables_chain_notify(const struct nft_ctx *ctx, int event)
1428 {
1429         struct sk_buff *skb;
1430         int err;
1431
1432         if (!ctx->report &&
1433             !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1434                 return;
1435
1436         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1437         if (skb == NULL)
1438                 goto err;
1439
1440         err = nf_tables_fill_chain_info(skb, ctx->net, ctx->portid, ctx->seq,
1441                                         event, 0, ctx->family, ctx->table,
1442                                         ctx->chain);
1443         if (err < 0) {
1444                 kfree_skb(skb);
1445                 goto err;
1446         }
1447
1448         nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
1449                        ctx->report, GFP_KERNEL);
1450         return;
1451 err:
1452         nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
1453 }
1454
1455 static int nf_tables_dump_chains(struct sk_buff *skb,
1456                                  struct netlink_callback *cb)
1457 {
1458         const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1459         const struct nft_table *table;
1460         const struct nft_chain *chain;
1461         unsigned int idx = 0, s_idx = cb->args[0];
1462         struct net *net = sock_net(skb->sk);
1463         int family = nfmsg->nfgen_family;
1464
1465         rcu_read_lock();
1466         cb->seq = net->nft.base_seq;
1467
1468         list_for_each_entry_rcu(table, &net->nft.tables, list) {
1469                 if (family != NFPROTO_UNSPEC && family != table->family)
1470                         continue;
1471
1472                 list_for_each_entry_rcu(chain, &table->chains, list) {
1473                         if (idx < s_idx)
1474                                 goto cont;
1475                         if (idx > s_idx)
1476                                 memset(&cb->args[1], 0,
1477                                        sizeof(cb->args) - sizeof(cb->args[0]));
1478                         if (!nft_is_active(net, chain))
1479                                 continue;
1480                         if (nf_tables_fill_chain_info(skb, net,
1481                                                       NETLINK_CB(cb->skb).portid,
1482                                                       cb->nlh->nlmsg_seq,
1483                                                       NFT_MSG_NEWCHAIN,
1484                                                       NLM_F_MULTI,
1485                                                       table->family, table,
1486                                                       chain) < 0)
1487                                 goto done;
1488
1489                         nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1490 cont:
1491                         idx++;
1492                 }
1493         }
1494 done:
1495         rcu_read_unlock();
1496         cb->args[0] = idx;
1497         return skb->len;
1498 }
1499
1500 /* called with rcu_read_lock held */
1501 static int nf_tables_getchain(struct net *net, struct sock *nlsk,
1502                               struct sk_buff *skb, const struct nlmsghdr *nlh,
1503                               const struct nlattr * const nla[],
1504                               struct netlink_ext_ack *extack)
1505 {
1506         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
1507         u8 genmask = nft_genmask_cur(net);
1508         const struct nft_chain *chain;
1509         struct nft_table *table;
1510         struct sk_buff *skb2;
1511         int family = nfmsg->nfgen_family;
1512         int err;
1513
1514         if (nlh->nlmsg_flags & NLM_F_DUMP) {
1515                 struct netlink_dump_control c = {
1516                         .dump = nf_tables_dump_chains,
1517                         .module = THIS_MODULE,
1518                 };
1519
1520                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
1521         }
1522
1523         table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask);
1524         if (IS_ERR(table)) {
1525                 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
1526                 return PTR_ERR(table);
1527         }
1528
1529         chain = nft_chain_lookup(net, table, nla[NFTA_CHAIN_NAME], genmask);
1530         if (IS_ERR(chain)) {
1531                 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
1532                 return PTR_ERR(chain);
1533         }
1534
1535         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
1536         if (!skb2)
1537                 return -ENOMEM;
1538
1539         err = nf_tables_fill_chain_info(skb2, net, NETLINK_CB(skb).portid,
1540                                         nlh->nlmsg_seq, NFT_MSG_NEWCHAIN, 0,
1541                                         family, table, chain);
1542         if (err < 0)
1543                 goto err;
1544
1545         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
1546
1547 err:
1548         kfree_skb(skb2);
1549         return err;
1550 }
1551
1552 static const struct nla_policy nft_counter_policy[NFTA_COUNTER_MAX + 1] = {
1553         [NFTA_COUNTER_PACKETS]  = { .type = NLA_U64 },
1554         [NFTA_COUNTER_BYTES]    = { .type = NLA_U64 },
1555 };
1556
1557 static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
1558 {
1559         struct nlattr *tb[NFTA_COUNTER_MAX+1];
1560         struct nft_stats __percpu *newstats;
1561         struct nft_stats *stats;
1562         int err;
1563
1564         err = nla_parse_nested_deprecated(tb, NFTA_COUNTER_MAX, attr,
1565                                           nft_counter_policy, NULL);
1566         if (err < 0)
1567                 return ERR_PTR(err);
1568
1569         if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS])
1570                 return ERR_PTR(-EINVAL);
1571
1572         newstats = netdev_alloc_pcpu_stats(struct nft_stats);
1573         if (newstats == NULL)
1574                 return ERR_PTR(-ENOMEM);
1575
1576         /* Restore old counters on this cpu, no problem. Per-cpu statistics
1577          * are not exposed to userspace.
1578          */
1579         preempt_disable();
1580         stats = this_cpu_ptr(newstats);
1581         stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES]));
1582         stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS]));
1583         preempt_enable();
1584
1585         return newstats;
1586 }
1587
1588 static void nft_chain_stats_replace(struct nft_trans *trans)
1589 {
1590         struct nft_base_chain *chain = nft_base_chain(trans->ctx.chain);
1591
1592         if (!nft_trans_chain_stats(trans))
1593                 return;
1594
1595         nft_trans_chain_stats(trans) =
1596                 rcu_replace_pointer(chain->stats, nft_trans_chain_stats(trans),
1597                                     lockdep_commit_lock_is_held(trans->ctx.net));
1598
1599         if (!nft_trans_chain_stats(trans))
1600                 static_branch_inc(&nft_counters_enabled);
1601 }
1602
1603 static void nf_tables_chain_free_chain_rules(struct nft_chain *chain)
1604 {
1605         struct nft_rule **g0 = rcu_dereference_raw(chain->rules_gen_0);
1606         struct nft_rule **g1 = rcu_dereference_raw(chain->rules_gen_1);
1607
1608         if (g0 != g1)
1609                 kvfree(g1);
1610         kvfree(g0);
1611
1612         /* should be NULL either via abort or via successful commit */
1613         WARN_ON_ONCE(chain->rules_next);
1614         kvfree(chain->rules_next);
1615 }
1616
1617 static void nf_tables_chain_destroy(struct nft_ctx *ctx)
1618 {
1619         struct nft_chain *chain = ctx->chain;
1620         struct nft_hook *hook, *next;
1621
1622         if (WARN_ON(chain->use > 0))
1623                 return;
1624
1625         /* no concurrent access possible anymore */
1626         nf_tables_chain_free_chain_rules(chain);
1627
1628         if (nft_is_base_chain(chain)) {
1629                 struct nft_base_chain *basechain = nft_base_chain(chain);
1630
1631                 if (ctx->family == NFPROTO_NETDEV) {
1632                         list_for_each_entry_safe(hook, next,
1633                                                  &basechain->hook_list, list) {
1634                                 list_del_rcu(&hook->list);
1635                                 kfree_rcu(hook, rcu);
1636                         }
1637                 }
1638                 module_put(basechain->type->owner);
1639                 if (rcu_access_pointer(basechain->stats)) {
1640                         static_branch_dec(&nft_counters_enabled);
1641                         free_percpu(rcu_dereference_raw(basechain->stats));
1642                 }
1643                 kfree(chain->name);
1644                 kfree(basechain);
1645         } else {
1646                 kfree(chain->name);
1647                 kfree(chain);
1648         }
1649 }
1650
1651 static struct nft_hook *nft_netdev_hook_alloc(struct net *net,
1652                                               const struct nlattr *attr)
1653 {
1654         struct net_device *dev;
1655         char ifname[IFNAMSIZ];
1656         struct nft_hook *hook;
1657         int err;
1658
1659         hook = kmalloc(sizeof(struct nft_hook), GFP_KERNEL);
1660         if (!hook) {
1661                 err = -ENOMEM;
1662                 goto err_hook_alloc;
1663         }
1664
1665         nla_strlcpy(ifname, attr, IFNAMSIZ);
1666         dev = __dev_get_by_name(net, ifname);
1667         if (!dev) {
1668                 err = -ENOENT;
1669                 goto err_hook_dev;
1670         }
1671         hook->ops.dev = dev;
1672         hook->inactive = false;
1673
1674         return hook;
1675
1676 err_hook_dev:
1677         kfree(hook);
1678 err_hook_alloc:
1679         return ERR_PTR(err);
1680 }
1681
1682 static struct nft_hook *nft_hook_list_find(struct list_head *hook_list,
1683                                            const struct nft_hook *this)
1684 {
1685         struct nft_hook *hook;
1686
1687         list_for_each_entry(hook, hook_list, list) {
1688                 if (this->ops.dev == hook->ops.dev)
1689                         return hook;
1690         }
1691
1692         return NULL;
1693 }
1694
1695 static int nf_tables_parse_netdev_hooks(struct net *net,
1696                                         const struct nlattr *attr,
1697                                         struct list_head *hook_list)
1698 {
1699         struct nft_hook *hook, *next;
1700         const struct nlattr *tmp;
1701         int rem, n = 0, err;
1702
1703         nla_for_each_nested(tmp, attr, rem) {
1704                 if (nla_type(tmp) != NFTA_DEVICE_NAME) {
1705                         err = -EINVAL;
1706                         goto err_hook;
1707                 }
1708
1709                 hook = nft_netdev_hook_alloc(net, tmp);
1710                 if (IS_ERR(hook)) {
1711                         err = PTR_ERR(hook);
1712                         goto err_hook;
1713                 }
1714                 if (nft_hook_list_find(hook_list, hook)) {
1715                         kfree(hook);
1716                         err = -EEXIST;
1717                         goto err_hook;
1718                 }
1719                 list_add_tail(&hook->list, hook_list);
1720                 n++;
1721
1722                 if (n == NFT_NETDEVICE_MAX) {
1723                         err = -EFBIG;
1724                         goto err_hook;
1725                 }
1726         }
1727
1728         return 0;
1729
1730 err_hook:
1731         list_for_each_entry_safe(hook, next, hook_list, list) {
1732                 list_del(&hook->list);
1733                 kfree(hook);
1734         }
1735         return err;
1736 }
1737
1738 struct nft_chain_hook {
1739         u32                             num;
1740         s32                             priority;
1741         const struct nft_chain_type     *type;
1742         struct list_head                list;
1743 };
1744
1745 static int nft_chain_parse_netdev(struct net *net,
1746                                   struct nlattr *tb[],
1747                                   struct list_head *hook_list)
1748 {
1749         struct nft_hook *hook;
1750         int err;
1751
1752         if (tb[NFTA_HOOK_DEV]) {
1753                 hook = nft_netdev_hook_alloc(net, tb[NFTA_HOOK_DEV]);
1754                 if (IS_ERR(hook))
1755                         return PTR_ERR(hook);
1756
1757                 list_add_tail(&hook->list, hook_list);
1758         } else if (tb[NFTA_HOOK_DEVS]) {
1759                 err = nf_tables_parse_netdev_hooks(net, tb[NFTA_HOOK_DEVS],
1760                                                    hook_list);
1761                 if (err < 0)
1762                         return err;
1763
1764                 if (list_empty(hook_list))
1765                         return -EINVAL;
1766         } else {
1767                 return -EINVAL;
1768         }
1769
1770         return 0;
1771 }
1772
1773 static int nft_chain_parse_hook(struct net *net,
1774                                 const struct nlattr * const nla[],
1775                                 struct nft_chain_hook *hook, u8 family,
1776                                 bool autoload)
1777 {
1778         struct nlattr *ha[NFTA_HOOK_MAX + 1];
1779         const struct nft_chain_type *type;
1780         int err;
1781
1782         lockdep_assert_held(&net->nft.commit_mutex);
1783         lockdep_nfnl_nft_mutex_not_held();
1784
1785         err = nla_parse_nested_deprecated(ha, NFTA_HOOK_MAX,
1786                                           nla[NFTA_CHAIN_HOOK],
1787                                           nft_hook_policy, NULL);
1788         if (err < 0)
1789                 return err;
1790
1791         if (ha[NFTA_HOOK_HOOKNUM] == NULL ||
1792             ha[NFTA_HOOK_PRIORITY] == NULL)
1793                 return -EINVAL;
1794
1795         hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
1796         hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
1797
1798         type = __nft_chain_type_get(family, NFT_CHAIN_T_DEFAULT);
1799         if (!type)
1800                 return -EOPNOTSUPP;
1801
1802         if (nla[NFTA_CHAIN_TYPE]) {
1803                 type = nf_tables_chain_type_lookup(net, nla[NFTA_CHAIN_TYPE],
1804                                                    family, autoload);
1805                 if (IS_ERR(type))
1806                         return PTR_ERR(type);
1807         }
1808         if (hook->num > NF_MAX_HOOKS || !(type->hook_mask & (1 << hook->num)))
1809                 return -EOPNOTSUPP;
1810
1811         if (type->type == NFT_CHAIN_T_NAT &&
1812             hook->priority <= NF_IP_PRI_CONNTRACK)
1813                 return -EOPNOTSUPP;
1814
1815         if (!try_module_get(type->owner))
1816                 return -ENOENT;
1817
1818         hook->type = type;
1819
1820         INIT_LIST_HEAD(&hook->list);
1821         if (family == NFPROTO_NETDEV) {
1822                 err = nft_chain_parse_netdev(net, ha, &hook->list);
1823                 if (err < 0) {
1824                         module_put(type->owner);
1825                         return err;
1826                 }
1827         } else if (ha[NFTA_HOOK_DEV] || ha[NFTA_HOOK_DEVS]) {
1828                 module_put(type->owner);
1829                 return -EOPNOTSUPP;
1830         }
1831
1832         return 0;
1833 }
1834
1835 static void nft_chain_release_hook(struct nft_chain_hook *hook)
1836 {
1837         struct nft_hook *h, *next;
1838
1839         list_for_each_entry_safe(h, next, &hook->list, list) {
1840                 list_del(&h->list);
1841                 kfree(h);
1842         }
1843         module_put(hook->type->owner);
1844 }
1845
1846 struct nft_rules_old {
1847         struct rcu_head h;
1848         struct nft_rule **start;
1849 };
1850
1851 static struct nft_rule **nf_tables_chain_alloc_rules(const struct nft_chain *chain,
1852                                                      unsigned int alloc)
1853 {
1854         if (alloc > INT_MAX)
1855                 return NULL;
1856
1857         alloc += 1;     /* NULL, ends rules */
1858         if (sizeof(struct nft_rule *) > INT_MAX / alloc)
1859                 return NULL;
1860
1861         alloc *= sizeof(struct nft_rule *);
1862         alloc += sizeof(struct nft_rules_old);
1863
1864         return kvmalloc(alloc, GFP_KERNEL);
1865 }
1866
1867 static void nft_basechain_hook_init(struct nf_hook_ops *ops, u8 family,
1868                                     const struct nft_chain_hook *hook,
1869                                     struct nft_chain *chain)
1870 {
1871         ops->pf         = family;
1872         ops->hooknum    = hook->num;
1873         ops->priority   = hook->priority;
1874         ops->priv       = chain;
1875         ops->hook       = hook->type->hooks[ops->hooknum];
1876 }
1877
1878 static int nft_basechain_init(struct nft_base_chain *basechain, u8 family,
1879                               struct nft_chain_hook *hook, u32 flags)
1880 {
1881         struct nft_chain *chain;
1882         struct nft_hook *h;
1883
1884         basechain->type = hook->type;
1885         INIT_LIST_HEAD(&basechain->hook_list);
1886         chain = &basechain->chain;
1887
1888         if (family == NFPROTO_NETDEV) {
1889                 list_splice_init(&hook->list, &basechain->hook_list);
1890                 list_for_each_entry(h, &basechain->hook_list, list)
1891                         nft_basechain_hook_init(&h->ops, family, hook, chain);
1892
1893                 basechain->ops.hooknum  = hook->num;
1894                 basechain->ops.priority = hook->priority;
1895         } else {
1896                 nft_basechain_hook_init(&basechain->ops, family, hook, chain);
1897         }
1898
1899         chain->flags |= NFT_BASE_CHAIN | flags;
1900         basechain->policy = NF_ACCEPT;
1901         if (chain->flags & NFT_CHAIN_HW_OFFLOAD &&
1902             nft_chain_offload_priority(basechain) < 0)
1903                 return -EOPNOTSUPP;
1904
1905         flow_block_init(&basechain->flow_block);
1906
1907         return 0;
1908 }
1909
1910 static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask,
1911                               u8 policy, u32 flags)
1912 {
1913         const struct nlattr * const *nla = ctx->nla;
1914         struct nft_table *table = ctx->table;
1915         struct nft_base_chain *basechain;
1916         struct nft_stats __percpu *stats;
1917         struct net *net = ctx->net;
1918         struct nft_trans *trans;
1919         struct nft_chain *chain;
1920         struct nft_rule **rules;
1921         int err;
1922
1923         if (table->use == UINT_MAX)
1924                 return -EOVERFLOW;
1925
1926         if (nla[NFTA_CHAIN_HOOK]) {
1927                 struct nft_chain_hook hook;
1928
1929                 err = nft_chain_parse_hook(net, nla, &hook, family, true);
1930                 if (err < 0)
1931                         return err;
1932
1933                 basechain = kzalloc(sizeof(*basechain), GFP_KERNEL);
1934                 if (basechain == NULL) {
1935                         nft_chain_release_hook(&hook);
1936                         return -ENOMEM;
1937                 }
1938                 chain = &basechain->chain;
1939
1940                 if (nla[NFTA_CHAIN_COUNTERS]) {
1941                         stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
1942                         if (IS_ERR(stats)) {
1943                                 nft_chain_release_hook(&hook);
1944                                 kfree(basechain);
1945                                 return PTR_ERR(stats);
1946                         }
1947                         rcu_assign_pointer(basechain->stats, stats);
1948                         static_branch_inc(&nft_counters_enabled);
1949                 }
1950
1951                 err = nft_basechain_init(basechain, family, &hook, flags);
1952                 if (err < 0) {
1953                         nft_chain_release_hook(&hook);
1954                         kfree(basechain);
1955                         return err;
1956                 }
1957         } else {
1958                 chain = kzalloc(sizeof(*chain), GFP_KERNEL);
1959                 if (chain == NULL)
1960                         return -ENOMEM;
1961         }
1962         ctx->chain = chain;
1963
1964         INIT_LIST_HEAD(&chain->rules);
1965         chain->handle = nf_tables_alloc_handle(table);
1966         chain->table = table;
1967         chain->name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL);
1968         if (!chain->name) {
1969                 err = -ENOMEM;
1970                 goto err1;
1971         }
1972
1973         rules = nf_tables_chain_alloc_rules(chain, 0);
1974         if (!rules) {
1975                 err = -ENOMEM;
1976                 goto err1;
1977         }
1978
1979         *rules = NULL;
1980         rcu_assign_pointer(chain->rules_gen_0, rules);
1981         rcu_assign_pointer(chain->rules_gen_1, rules);
1982
1983         err = nf_tables_register_hook(net, table, chain);
1984         if (err < 0)
1985                 goto err1;
1986
1987         err = rhltable_insert_key(&table->chains_ht, chain->name,
1988                                   &chain->rhlhead, nft_chain_ht_params);
1989         if (err)
1990                 goto err2;
1991
1992         trans = nft_trans_chain_add(ctx, NFT_MSG_NEWCHAIN);
1993         if (IS_ERR(trans)) {
1994                 err = PTR_ERR(trans);
1995                 rhltable_remove(&table->chains_ht, &chain->rhlhead,
1996                                 nft_chain_ht_params);
1997                 goto err2;
1998         }
1999
2000         nft_trans_chain_policy(trans) = NFT_CHAIN_POLICY_UNSET;
2001         if (nft_is_base_chain(chain))
2002                 nft_trans_chain_policy(trans) = policy;
2003
2004         table->use++;
2005         list_add_tail_rcu(&chain->list, &table->chains);
2006
2007         return 0;
2008 err2:
2009         nf_tables_unregister_hook(net, table, chain);
2010 err1:
2011         nf_tables_chain_destroy(ctx);
2012
2013         return err;
2014 }
2015
2016 static bool nft_hook_list_equal(struct list_head *hook_list1,
2017                                 struct list_head *hook_list2)
2018 {
2019         struct nft_hook *hook;
2020         int n = 0, m = 0;
2021
2022         n = 0;
2023         list_for_each_entry(hook, hook_list2, list) {
2024                 if (!nft_hook_list_find(hook_list1, hook))
2025                         return false;
2026
2027                 n++;
2028         }
2029         list_for_each_entry(hook, hook_list1, list)
2030                 m++;
2031
2032         return n == m;
2033 }
2034
2035 static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
2036                               u32 flags)
2037 {
2038         const struct nlattr * const *nla = ctx->nla;
2039         struct nft_table *table = ctx->table;
2040         struct nft_chain *chain = ctx->chain;
2041         struct nft_base_chain *basechain;
2042         struct nft_stats *stats = NULL;
2043         struct nft_chain_hook hook;
2044         struct nf_hook_ops *ops;
2045         struct nft_trans *trans;
2046         int err;
2047
2048         if (chain->flags ^ flags)
2049                 return -EOPNOTSUPP;
2050
2051         if (nla[NFTA_CHAIN_HOOK]) {
2052                 if (!nft_is_base_chain(chain))
2053                         return -EBUSY;
2054
2055                 err = nft_chain_parse_hook(ctx->net, nla, &hook, ctx->family,
2056                                            false);
2057                 if (err < 0)
2058                         return err;
2059
2060                 basechain = nft_base_chain(chain);
2061                 if (basechain->type != hook.type) {
2062                         nft_chain_release_hook(&hook);
2063                         return -EBUSY;
2064                 }
2065
2066                 if (ctx->family == NFPROTO_NETDEV) {
2067                         if (!nft_hook_list_equal(&basechain->hook_list,
2068                                                  &hook.list)) {
2069                                 nft_chain_release_hook(&hook);
2070                                 return -EBUSY;
2071                         }
2072                 } else {
2073                         ops = &basechain->ops;
2074                         if (ops->hooknum != hook.num ||
2075                             ops->priority != hook.priority) {
2076                                 nft_chain_release_hook(&hook);
2077                                 return -EBUSY;
2078                         }
2079                 }
2080                 nft_chain_release_hook(&hook);
2081         }
2082
2083         if (nla[NFTA_CHAIN_HANDLE] &&
2084             nla[NFTA_CHAIN_NAME]) {
2085                 struct nft_chain *chain2;
2086
2087                 chain2 = nft_chain_lookup(ctx->net, table,
2088                                           nla[NFTA_CHAIN_NAME], genmask);
2089                 if (!IS_ERR(chain2))
2090                         return -EEXIST;
2091         }
2092
2093         if (nla[NFTA_CHAIN_COUNTERS]) {
2094                 if (!nft_is_base_chain(chain))
2095                         return -EOPNOTSUPP;
2096
2097                 stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
2098                 if (IS_ERR(stats))
2099                         return PTR_ERR(stats);
2100         }
2101
2102         err = -ENOMEM;
2103         trans = nft_trans_alloc(ctx, NFT_MSG_NEWCHAIN,
2104                                 sizeof(struct nft_trans_chain));
2105         if (trans == NULL)
2106                 goto err;
2107
2108         nft_trans_chain_stats(trans) = stats;
2109         nft_trans_chain_update(trans) = true;
2110
2111         if (nla[NFTA_CHAIN_POLICY])
2112                 nft_trans_chain_policy(trans) = policy;
2113         else
2114                 nft_trans_chain_policy(trans) = -1;
2115
2116         if (nla[NFTA_CHAIN_HANDLE] &&
2117             nla[NFTA_CHAIN_NAME]) {
2118                 struct nft_trans *tmp;
2119                 char *name;
2120
2121                 err = -ENOMEM;
2122                 name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL);
2123                 if (!name)
2124                         goto err;
2125
2126                 err = -EEXIST;
2127                 list_for_each_entry(tmp, &ctx->net->nft.commit_list, list) {
2128                         if (tmp->msg_type == NFT_MSG_NEWCHAIN &&
2129                             tmp->ctx.table == table &&
2130                             nft_trans_chain_update(tmp) &&
2131                             nft_trans_chain_name(tmp) &&
2132                             strcmp(name, nft_trans_chain_name(tmp)) == 0) {
2133                                 kfree(name);
2134                                 goto err;
2135                         }
2136                 }
2137
2138                 nft_trans_chain_name(trans) = name;
2139         }
2140         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
2141
2142         return 0;
2143 err:
2144         free_percpu(stats);
2145         kfree(trans);
2146         return err;
2147 }
2148
2149 static int nf_tables_newchain(struct net *net, struct sock *nlsk,
2150                               struct sk_buff *skb, const struct nlmsghdr *nlh,
2151                               const struct nlattr * const nla[],
2152                               struct netlink_ext_ack *extack)
2153 {
2154         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2155         u8 genmask = nft_genmask_next(net);
2156         int family = nfmsg->nfgen_family;
2157         const struct nlattr *attr;
2158         struct nft_table *table;
2159         struct nft_chain *chain;
2160         u8 policy = NF_ACCEPT;
2161         struct nft_ctx ctx;
2162         u64 handle = 0;
2163         u32 flags = 0;
2164
2165         lockdep_assert_held(&net->nft.commit_mutex);
2166
2167         table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask);
2168         if (IS_ERR(table)) {
2169                 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
2170                 return PTR_ERR(table);
2171         }
2172
2173         chain = NULL;
2174         attr = nla[NFTA_CHAIN_NAME];
2175
2176         if (nla[NFTA_CHAIN_HANDLE]) {
2177                 handle = be64_to_cpu(nla_get_be64(nla[NFTA_CHAIN_HANDLE]));
2178                 chain = nft_chain_lookup_byhandle(table, handle, genmask);
2179                 if (IS_ERR(chain)) {
2180                         NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_HANDLE]);
2181                         return PTR_ERR(chain);
2182                 }
2183                 attr = nla[NFTA_CHAIN_HANDLE];
2184         } else {
2185                 chain = nft_chain_lookup(net, table, attr, genmask);
2186                 if (IS_ERR(chain)) {
2187                         if (PTR_ERR(chain) != -ENOENT) {
2188                                 NL_SET_BAD_ATTR(extack, attr);
2189                                 return PTR_ERR(chain);
2190                         }
2191                         chain = NULL;
2192                 }
2193         }
2194
2195         if (nla[NFTA_CHAIN_POLICY]) {
2196                 if (chain != NULL &&
2197                     !nft_is_base_chain(chain)) {
2198                         NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
2199                         return -EOPNOTSUPP;
2200                 }
2201
2202                 if (chain == NULL &&
2203                     nla[NFTA_CHAIN_HOOK] == NULL) {
2204                         NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
2205                         return -EOPNOTSUPP;
2206                 }
2207
2208                 policy = ntohl(nla_get_be32(nla[NFTA_CHAIN_POLICY]));
2209                 switch (policy) {
2210                 case NF_DROP:
2211                 case NF_ACCEPT:
2212                         break;
2213                 default:
2214                         return -EINVAL;
2215                 }
2216         }
2217
2218         if (nla[NFTA_CHAIN_FLAGS])
2219                 flags = ntohl(nla_get_be32(nla[NFTA_CHAIN_FLAGS]));
2220         else if (chain)
2221                 flags = chain->flags;
2222
2223         nft_ctx_init(&ctx, net, skb, nlh, family, table, chain, nla);
2224
2225         if (chain != NULL) {
2226                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
2227                         NL_SET_BAD_ATTR(extack, attr);
2228                         return -EEXIST;
2229                 }
2230                 if (nlh->nlmsg_flags & NLM_F_REPLACE)
2231                         return -EOPNOTSUPP;
2232
2233                 flags |= chain->flags & NFT_BASE_CHAIN;
2234                 return nf_tables_updchain(&ctx, genmask, policy, flags);
2235         }
2236
2237         return nf_tables_addchain(&ctx, family, genmask, policy, flags);
2238 }
2239
2240 static int nf_tables_delchain(struct net *net, struct sock *nlsk,
2241                               struct sk_buff *skb, const struct nlmsghdr *nlh,
2242                               const struct nlattr * const nla[],
2243                               struct netlink_ext_ack *extack)
2244 {
2245         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2246         u8 genmask = nft_genmask_next(net);
2247         int family = nfmsg->nfgen_family;
2248         const struct nlattr *attr;
2249         struct nft_table *table;
2250         struct nft_chain *chain;
2251         struct nft_rule *rule;
2252         struct nft_ctx ctx;
2253         u64 handle;
2254         u32 use;
2255         int err;
2256
2257         table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask);
2258         if (IS_ERR(table)) {
2259                 NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
2260                 return PTR_ERR(table);
2261         }
2262
2263         if (nla[NFTA_CHAIN_HANDLE]) {
2264                 attr = nla[NFTA_CHAIN_HANDLE];
2265                 handle = be64_to_cpu(nla_get_be64(attr));
2266                 chain = nft_chain_lookup_byhandle(table, handle, genmask);
2267         } else {
2268                 attr = nla[NFTA_CHAIN_NAME];
2269                 chain = nft_chain_lookup(net, table, attr, genmask);
2270         }
2271         if (IS_ERR(chain)) {
2272                 NL_SET_BAD_ATTR(extack, attr);
2273                 return PTR_ERR(chain);
2274         }
2275
2276         if (nlh->nlmsg_flags & NLM_F_NONREC &&
2277             chain->use > 0)
2278                 return -EBUSY;
2279
2280         nft_ctx_init(&ctx, net, skb, nlh, family, table, chain, nla);
2281
2282         use = chain->use;
2283         list_for_each_entry(rule, &chain->rules, list) {
2284                 if (!nft_is_active_next(net, rule))
2285                         continue;
2286                 use--;
2287
2288                 err = nft_delrule(&ctx, rule);
2289                 if (err < 0)
2290                         return err;
2291         }
2292
2293         /* There are rules and elements that are still holding references to us,
2294          * we cannot do a recursive removal in this case.
2295          */
2296         if (use > 0) {
2297                 NL_SET_BAD_ATTR(extack, attr);
2298                 return -EBUSY;
2299         }
2300
2301         return nft_delchain(&ctx);
2302 }
2303
2304 /*
2305  * Expressions
2306  */
2307
2308 /**
2309  *      nft_register_expr - register nf_tables expr type
2310  *      @ops: expr type
2311  *
2312  *      Registers the expr type for use with nf_tables. Returns zero on
2313  *      success or a negative errno code otherwise.
2314  */
2315 int nft_register_expr(struct nft_expr_type *type)
2316 {
2317         nfnl_lock(NFNL_SUBSYS_NFTABLES);
2318         if (type->family == NFPROTO_UNSPEC)
2319                 list_add_tail_rcu(&type->list, &nf_tables_expressions);
2320         else
2321                 list_add_rcu(&type->list, &nf_tables_expressions);
2322         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
2323         return 0;
2324 }
2325 EXPORT_SYMBOL_GPL(nft_register_expr);
2326
2327 /**
2328  *      nft_unregister_expr - unregister nf_tables expr type
2329  *      @ops: expr type
2330  *
2331  *      Unregisters the expr typefor use with nf_tables.
2332  */
2333 void nft_unregister_expr(struct nft_expr_type *type)
2334 {
2335         nfnl_lock(NFNL_SUBSYS_NFTABLES);
2336         list_del_rcu(&type->list);
2337         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
2338 }
2339 EXPORT_SYMBOL_GPL(nft_unregister_expr);
2340
2341 static const struct nft_expr_type *__nft_expr_type_get(u8 family,
2342                                                        struct nlattr *nla)
2343 {
2344         const struct nft_expr_type *type, *candidate = NULL;
2345
2346         list_for_each_entry(type, &nf_tables_expressions, list) {
2347                 if (!nla_strcmp(nla, type->name)) {
2348                         if (!type->family && !candidate)
2349                                 candidate = type;
2350                         else if (type->family == family)
2351                                 candidate = type;
2352                 }
2353         }
2354         return candidate;
2355 }
2356
2357 #ifdef CONFIG_MODULES
2358 static int nft_expr_type_request_module(struct net *net, u8 family,
2359                                         struct nlattr *nla)
2360 {
2361         if (nft_request_module(net, "nft-expr-%u-%.*s", family,
2362                                nla_len(nla), (char *)nla_data(nla)) == -EAGAIN)
2363                 return -EAGAIN;
2364
2365         return 0;
2366 }
2367 #endif
2368
2369 static const struct nft_expr_type *nft_expr_type_get(struct net *net,
2370                                                      u8 family,
2371                                                      struct nlattr *nla)
2372 {
2373         const struct nft_expr_type *type;
2374
2375         if (nla == NULL)
2376                 return ERR_PTR(-EINVAL);
2377
2378         type = __nft_expr_type_get(family, nla);
2379         if (type != NULL && try_module_get(type->owner))
2380                 return type;
2381
2382         lockdep_nfnl_nft_mutex_not_held();
2383 #ifdef CONFIG_MODULES
2384         if (type == NULL) {
2385                 if (nft_expr_type_request_module(net, family, nla) == -EAGAIN)
2386                         return ERR_PTR(-EAGAIN);
2387
2388                 if (nft_request_module(net, "nft-expr-%.*s",
2389                                        nla_len(nla),
2390                                        (char *)nla_data(nla)) == -EAGAIN)
2391                         return ERR_PTR(-EAGAIN);
2392         }
2393 #endif
2394         return ERR_PTR(-ENOENT);
2395 }
2396
2397 static const struct nla_policy nft_expr_policy[NFTA_EXPR_MAX + 1] = {
2398         [NFTA_EXPR_NAME]        = { .type = NLA_STRING,
2399                                     .len = NFT_MODULE_AUTOLOAD_LIMIT },
2400         [NFTA_EXPR_DATA]        = { .type = NLA_NESTED },
2401 };
2402
2403 static int nf_tables_fill_expr_info(struct sk_buff *skb,
2404                                     const struct nft_expr *expr)
2405 {
2406         if (nla_put_string(skb, NFTA_EXPR_NAME, expr->ops->type->name))
2407                 goto nla_put_failure;
2408
2409         if (expr->ops->dump) {
2410                 struct nlattr *data = nla_nest_start_noflag(skb,
2411                                                             NFTA_EXPR_DATA);
2412                 if (data == NULL)
2413                         goto nla_put_failure;
2414                 if (expr->ops->dump(skb, expr) < 0)
2415                         goto nla_put_failure;
2416                 nla_nest_end(skb, data);
2417         }
2418
2419         return skb->len;
2420
2421 nla_put_failure:
2422         return -1;
2423 };
2424
2425 int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
2426                   const struct nft_expr *expr)
2427 {
2428         struct nlattr *nest;
2429
2430         nest = nla_nest_start_noflag(skb, attr);
2431         if (!nest)
2432                 goto nla_put_failure;
2433         if (nf_tables_fill_expr_info(skb, expr) < 0)
2434                 goto nla_put_failure;
2435         nla_nest_end(skb, nest);
2436         return 0;
2437
2438 nla_put_failure:
2439         return -1;
2440 }
2441
2442 struct nft_expr_info {
2443         const struct nft_expr_ops       *ops;
2444         struct nlattr                   *tb[NFT_EXPR_MAXATTR + 1];
2445 };
2446
2447 static int nf_tables_expr_parse(const struct nft_ctx *ctx,
2448                                 const struct nlattr *nla,
2449                                 struct nft_expr_info *info)
2450 {
2451         const struct nft_expr_type *type;
2452         const struct nft_expr_ops *ops;
2453         struct nlattr *tb[NFTA_EXPR_MAX + 1];
2454         int err;
2455
2456         err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
2457                                           nft_expr_policy, NULL);
2458         if (err < 0)
2459                 return err;
2460
2461         type = nft_expr_type_get(ctx->net, ctx->family, tb[NFTA_EXPR_NAME]);
2462         if (IS_ERR(type))
2463                 return PTR_ERR(type);
2464
2465         if (tb[NFTA_EXPR_DATA]) {
2466                 err = nla_parse_nested_deprecated(info->tb, type->maxattr,
2467                                                   tb[NFTA_EXPR_DATA],
2468                                                   type->policy, NULL);
2469                 if (err < 0)
2470                         goto err1;
2471         } else
2472                 memset(info->tb, 0, sizeof(info->tb[0]) * (type->maxattr + 1));
2473
2474         if (type->select_ops != NULL) {
2475                 ops = type->select_ops(ctx,
2476                                        (const struct nlattr * const *)info->tb);
2477                 if (IS_ERR(ops)) {
2478                         err = PTR_ERR(ops);
2479 #ifdef CONFIG_MODULES
2480                         if (err == -EAGAIN)
2481                                 if (nft_expr_type_request_module(ctx->net,
2482                                                                  ctx->family,
2483                                                                  tb[NFTA_EXPR_NAME]) != -EAGAIN)
2484                                         err = -ENOENT;
2485 #endif
2486                         goto err1;
2487                 }
2488         } else
2489                 ops = type->ops;
2490
2491         info->ops = ops;
2492         return 0;
2493
2494 err1:
2495         module_put(type->owner);
2496         return err;
2497 }
2498
2499 static int nf_tables_newexpr(const struct nft_ctx *ctx,
2500                              const struct nft_expr_info *info,
2501                              struct nft_expr *expr)
2502 {
2503         const struct nft_expr_ops *ops = info->ops;
2504         int err;
2505
2506         expr->ops = ops;
2507         if (ops->init) {
2508                 err = ops->init(ctx, expr, (const struct nlattr **)info->tb);
2509                 if (err < 0)
2510                         goto err1;
2511         }
2512
2513         return 0;
2514 err1:
2515         expr->ops = NULL;
2516         return err;
2517 }
2518
2519 static void nf_tables_expr_destroy(const struct nft_ctx *ctx,
2520                                    struct nft_expr *expr)
2521 {
2522         const struct nft_expr_type *type = expr->ops->type;
2523
2524         if (expr->ops->destroy)
2525                 expr->ops->destroy(ctx, expr);
2526         module_put(type->owner);
2527 }
2528
2529 static struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
2530                                       const struct nlattr *nla)
2531 {
2532         struct nft_expr_info info;
2533         struct nft_expr *expr;
2534         struct module *owner;
2535         int err;
2536
2537         err = nf_tables_expr_parse(ctx, nla, &info);
2538         if (err < 0)
2539                 goto err1;
2540
2541         err = -ENOMEM;
2542         expr = kzalloc(info.ops->size, GFP_KERNEL);
2543         if (expr == NULL)
2544                 goto err2;
2545
2546         err = nf_tables_newexpr(ctx, &info, expr);
2547         if (err < 0)
2548                 goto err3;
2549
2550         return expr;
2551 err3:
2552         kfree(expr);
2553 err2:
2554         owner = info.ops->type->owner;
2555         if (info.ops->type->release_ops)
2556                 info.ops->type->release_ops(info.ops);
2557
2558         module_put(owner);
2559 err1:
2560         return ERR_PTR(err);
2561 }
2562
2563 int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
2564 {
2565         int err;
2566
2567         if (src->ops->clone) {
2568                 dst->ops = src->ops;
2569                 err = src->ops->clone(dst, src);
2570                 if (err < 0)
2571                         return err;
2572         } else {
2573                 memcpy(dst, src, src->ops->size);
2574         }
2575
2576         __module_get(src->ops->type->owner);
2577
2578         return 0;
2579 }
2580
2581 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr)
2582 {
2583         nf_tables_expr_destroy(ctx, expr);
2584         kfree(expr);
2585 }
2586
2587 /*
2588  * Rules
2589  */
2590
2591 static struct nft_rule *__nft_rule_lookup(const struct nft_chain *chain,
2592                                           u64 handle)
2593 {
2594         struct nft_rule *rule;
2595
2596         // FIXME: this sucks
2597         list_for_each_entry_rcu(rule, &chain->rules, list) {
2598                 if (handle == rule->handle)
2599                         return rule;
2600         }
2601
2602         return ERR_PTR(-ENOENT);
2603 }
2604
2605 static struct nft_rule *nft_rule_lookup(const struct nft_chain *chain,
2606                                         const struct nlattr *nla)
2607 {
2608         if (nla == NULL)
2609                 return ERR_PTR(-EINVAL);
2610
2611         return __nft_rule_lookup(chain, be64_to_cpu(nla_get_be64(nla)));
2612 }
2613
2614 static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = {
2615         [NFTA_RULE_TABLE]       = { .type = NLA_STRING,
2616                                     .len = NFT_TABLE_MAXNAMELEN - 1 },
2617         [NFTA_RULE_CHAIN]       = { .type = NLA_STRING,
2618                                     .len = NFT_CHAIN_MAXNAMELEN - 1 },
2619         [NFTA_RULE_HANDLE]      = { .type = NLA_U64 },
2620         [NFTA_RULE_EXPRESSIONS] = { .type = NLA_NESTED },
2621         [NFTA_RULE_COMPAT]      = { .type = NLA_NESTED },
2622         [NFTA_RULE_POSITION]    = { .type = NLA_U64 },
2623         [NFTA_RULE_USERDATA]    = { .type = NLA_BINARY,
2624                                     .len = NFT_USERDATA_MAXLEN },
2625         [NFTA_RULE_ID]          = { .type = NLA_U32 },
2626         [NFTA_RULE_POSITION_ID] = { .type = NLA_U32 },
2627 };
2628
2629 static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
2630                                     u32 portid, u32 seq, int event,
2631                                     u32 flags, int family,
2632                                     const struct nft_table *table,
2633                                     const struct nft_chain *chain,
2634                                     const struct nft_rule *rule,
2635                                     const struct nft_rule *prule)
2636 {
2637         struct nlmsghdr *nlh;
2638         struct nfgenmsg *nfmsg;
2639         const struct nft_expr *expr, *next;
2640         struct nlattr *list;
2641         u16 type = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
2642
2643         nlh = nlmsg_put(skb, portid, seq, type, sizeof(struct nfgenmsg), flags);
2644         if (nlh == NULL)
2645                 goto nla_put_failure;
2646
2647         nfmsg = nlmsg_data(nlh);
2648         nfmsg->nfgen_family     = family;
2649         nfmsg->version          = NFNETLINK_V0;
2650         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
2651
2652         if (nla_put_string(skb, NFTA_RULE_TABLE, table->name))
2653                 goto nla_put_failure;
2654         if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name))
2655                 goto nla_put_failure;
2656         if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle),
2657                          NFTA_RULE_PAD))
2658                 goto nla_put_failure;
2659
2660         if (event != NFT_MSG_DELRULE && prule) {
2661                 if (nla_put_be64(skb, NFTA_RULE_POSITION,
2662                                  cpu_to_be64(prule->handle),
2663                                  NFTA_RULE_PAD))
2664                         goto nla_put_failure;
2665         }
2666
2667         list = nla_nest_start_noflag(skb, NFTA_RULE_EXPRESSIONS);
2668         if (list == NULL)
2669                 goto nla_put_failure;
2670         nft_rule_for_each_expr(expr, next, rule) {
2671                 if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr) < 0)
2672                         goto nla_put_failure;
2673         }
2674         nla_nest_end(skb, list);
2675
2676         if (rule->udata) {
2677                 struct nft_userdata *udata = nft_userdata(rule);
2678                 if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1,
2679                             udata->data) < 0)
2680                         goto nla_put_failure;
2681         }
2682
2683         nlmsg_end(skb, nlh);
2684         return 0;
2685
2686 nla_put_failure:
2687         nlmsg_trim(skb, nlh);
2688         return -1;
2689 }
2690
2691 static void nf_tables_rule_notify(const struct nft_ctx *ctx,
2692                                   const struct nft_rule *rule, int event)
2693 {
2694         struct sk_buff *skb;
2695         int err;
2696
2697         if (!ctx->report &&
2698             !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
2699                 return;
2700
2701         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
2702         if (skb == NULL)
2703                 goto err;
2704
2705         err = nf_tables_fill_rule_info(skb, ctx->net, ctx->portid, ctx->seq,
2706                                        event, 0, ctx->family, ctx->table,
2707                                        ctx->chain, rule, NULL);
2708         if (err < 0) {
2709                 kfree_skb(skb);
2710                 goto err;
2711         }
2712
2713         nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
2714                        ctx->report, GFP_KERNEL);
2715         return;
2716 err:
2717         nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
2718 }
2719
2720 struct nft_rule_dump_ctx {
2721         char *table;
2722         char *chain;
2723 };
2724
2725 static int __nf_tables_dump_rules(struct sk_buff *skb,
2726                                   unsigned int *idx,
2727                                   struct netlink_callback *cb,
2728                                   const struct nft_table *table,
2729                                   const struct nft_chain *chain)
2730 {
2731         struct net *net = sock_net(skb->sk);
2732         const struct nft_rule *rule, *prule;
2733         unsigned int s_idx = cb->args[0];
2734
2735         prule = NULL;
2736         list_for_each_entry_rcu(rule, &chain->rules, list) {
2737                 if (!nft_is_active(net, rule))
2738                         goto cont_skip;
2739                 if (*idx < s_idx)
2740                         goto cont;
2741                 if (*idx > s_idx) {
2742                         memset(&cb->args[1], 0,
2743                                         sizeof(cb->args) - sizeof(cb->args[0]));
2744                 }
2745                 if (nf_tables_fill_rule_info(skb, net, NETLINK_CB(cb->skb).portid,
2746                                         cb->nlh->nlmsg_seq,
2747                                         NFT_MSG_NEWRULE,
2748                                         NLM_F_MULTI | NLM_F_APPEND,
2749                                         table->family,
2750                                         table, chain, rule, prule) < 0)
2751                         return 1;
2752
2753                 nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2754 cont:
2755                 prule = rule;
2756 cont_skip:
2757                 (*idx)++;
2758         }
2759         return 0;
2760 }
2761
2762 static int nf_tables_dump_rules(struct sk_buff *skb,
2763                                 struct netlink_callback *cb)
2764 {
2765         const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
2766         const struct nft_rule_dump_ctx *ctx = cb->data;
2767         struct nft_table *table;
2768         const struct nft_chain *chain;
2769         unsigned int idx = 0;
2770         struct net *net = sock_net(skb->sk);
2771         int family = nfmsg->nfgen_family;
2772
2773         rcu_read_lock();
2774         cb->seq = net->nft.base_seq;
2775
2776         list_for_each_entry_rcu(table, &net->nft.tables, list) {
2777                 if (family != NFPROTO_UNSPEC && family != table->family)
2778                         continue;
2779
2780                 if (ctx && ctx->table && strcmp(ctx->table, table->name) != 0)
2781                         continue;
2782
2783                 if (ctx && ctx->table && ctx->chain) {
2784                         struct rhlist_head *list, *tmp;
2785
2786                         list = rhltable_lookup(&table->chains_ht, ctx->chain,
2787                                                nft_chain_ht_params);
2788                         if (!list)
2789                                 goto done;
2790
2791                         rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
2792                                 if (!nft_is_active(net, chain))
2793                                         continue;
2794                                 __nf_tables_dump_rules(skb, &idx,
2795                                                        cb, table, chain);
2796                                 break;
2797                         }
2798                         goto done;
2799                 }
2800
2801                 list_for_each_entry_rcu(chain, &table->chains, list) {
2802                         if (__nf_tables_dump_rules(skb, &idx, cb, table, chain))
2803                                 goto done;
2804                 }
2805
2806                 if (ctx && ctx->table)
2807                         break;
2808         }
2809 done:
2810         rcu_read_unlock();
2811
2812         cb->args[0] = idx;
2813         return skb->len;
2814 }
2815
2816 static int nf_tables_dump_rules_start(struct netlink_callback *cb)
2817 {
2818         const struct nlattr * const *nla = cb->data;
2819         struct nft_rule_dump_ctx *ctx = NULL;
2820
2821         if (nla[NFTA_RULE_TABLE] || nla[NFTA_RULE_CHAIN]) {
2822                 ctx = kzalloc(sizeof(*ctx), GFP_ATOMIC);
2823                 if (!ctx)
2824                         return -ENOMEM;
2825
2826                 if (nla[NFTA_RULE_TABLE]) {
2827                         ctx->table = nla_strdup(nla[NFTA_RULE_TABLE],
2828                                                         GFP_ATOMIC);
2829                         if (!ctx->table) {
2830                                 kfree(ctx);
2831                                 return -ENOMEM;
2832                         }
2833                 }
2834                 if (nla[NFTA_RULE_CHAIN]) {
2835                         ctx->chain = nla_strdup(nla[NFTA_RULE_CHAIN],
2836                                                 GFP_ATOMIC);
2837                         if (!ctx->chain) {
2838                                 kfree(ctx->table);
2839                                 kfree(ctx);
2840                                 return -ENOMEM;
2841                         }
2842                 }
2843         }
2844
2845         cb->data = ctx;
2846         return 0;
2847 }
2848
2849 static int nf_tables_dump_rules_done(struct netlink_callback *cb)
2850 {
2851         struct nft_rule_dump_ctx *ctx = cb->data;
2852
2853         if (ctx) {
2854                 kfree(ctx->table);
2855                 kfree(ctx->chain);
2856                 kfree(ctx);
2857         }
2858         return 0;
2859 }
2860
2861 /* called with rcu_read_lock held */
2862 static int nf_tables_getrule(struct net *net, struct sock *nlsk,
2863                              struct sk_buff *skb, const struct nlmsghdr *nlh,
2864                              const struct nlattr * const nla[],
2865                              struct netlink_ext_ack *extack)
2866 {
2867         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
2868         u8 genmask = nft_genmask_cur(net);
2869         const struct nft_chain *chain;
2870         const struct nft_rule *rule;
2871         struct nft_table *table;
2872         struct sk_buff *skb2;
2873         int family = nfmsg->nfgen_family;
2874         int err;
2875
2876         if (nlh->nlmsg_flags & NLM_F_DUMP) {
2877                 struct netlink_dump_control c = {
2878                         .start= nf_tables_dump_rules_start,
2879                         .dump = nf_tables_dump_rules,
2880                         .done = nf_tables_dump_rules_done,
2881                         .module = THIS_MODULE,
2882                         .data = (void *)nla,
2883                 };
2884
2885                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
2886         }
2887
2888         table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask);
2889         if (IS_ERR(table)) {
2890                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
2891                 return PTR_ERR(table);
2892         }
2893
2894         chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], genmask);
2895         if (IS_ERR(chain)) {
2896                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
2897                 return PTR_ERR(chain);
2898         }
2899
2900         rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]);
2901         if (IS_ERR(rule)) {
2902                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
2903                 return PTR_ERR(rule);
2904         }
2905
2906         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
2907         if (!skb2)
2908                 return -ENOMEM;
2909
2910         err = nf_tables_fill_rule_info(skb2, net, NETLINK_CB(skb).portid,
2911                                        nlh->nlmsg_seq, NFT_MSG_NEWRULE, 0,
2912                                        family, table, chain, rule, NULL);
2913         if (err < 0)
2914                 goto err;
2915
2916         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
2917
2918 err:
2919         kfree_skb(skb2);
2920         return err;
2921 }
2922
2923 static void nf_tables_rule_destroy(const struct nft_ctx *ctx,
2924                                    struct nft_rule *rule)
2925 {
2926         struct nft_expr *expr, *next;
2927
2928         /*
2929          * Careful: some expressions might not be initialized in case this
2930          * is called on error from nf_tables_newrule().
2931          */
2932         expr = nft_expr_first(rule);
2933         while (expr != nft_expr_last(rule) && expr->ops) {
2934                 next = nft_expr_next(expr);
2935                 nf_tables_expr_destroy(ctx, expr);
2936                 expr = next;
2937         }
2938         kfree(rule);
2939 }
2940
2941 static void nf_tables_rule_release(const struct nft_ctx *ctx,
2942                                    struct nft_rule *rule)
2943 {
2944         nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_RELEASE);
2945         nf_tables_rule_destroy(ctx, rule);
2946 }
2947
2948 int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain)
2949 {
2950         struct nft_expr *expr, *last;
2951         const struct nft_data *data;
2952         struct nft_rule *rule;
2953         int err;
2954
2955         if (ctx->level == NFT_JUMP_STACK_SIZE)
2956                 return -EMLINK;
2957
2958         list_for_each_entry(rule, &chain->rules, list) {
2959                 if (!nft_is_active_next(ctx->net, rule))
2960                         continue;
2961
2962                 nft_rule_for_each_expr(expr, last, rule) {
2963                         if (!expr->ops->validate)
2964                                 continue;
2965
2966                         err = expr->ops->validate(ctx, expr, &data);
2967                         if (err < 0)
2968                                 return err;
2969                 }
2970         }
2971
2972         return 0;
2973 }
2974 EXPORT_SYMBOL_GPL(nft_chain_validate);
2975
2976 static int nft_table_validate(struct net *net, const struct nft_table *table)
2977 {
2978         struct nft_chain *chain;
2979         struct nft_ctx ctx = {
2980                 .net    = net,
2981                 .family = table->family,
2982         };
2983         int err;
2984
2985         list_for_each_entry(chain, &table->chains, list) {
2986                 if (!nft_is_base_chain(chain))
2987                         continue;
2988
2989                 ctx.chain = chain;
2990                 err = nft_chain_validate(&ctx, chain);
2991                 if (err < 0)
2992                         return err;
2993         }
2994
2995         return 0;
2996 }
2997
2998 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
2999                                              const struct nlattr *nla);
3000
3001 #define NFT_RULE_MAXEXPRS       128
3002
3003 static int nf_tables_newrule(struct net *net, struct sock *nlsk,
3004                              struct sk_buff *skb, const struct nlmsghdr *nlh,
3005                              const struct nlattr * const nla[],
3006                              struct netlink_ext_ack *extack)
3007 {
3008         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3009         u8 genmask = nft_genmask_next(net);
3010         struct nft_expr_info *info = NULL;
3011         int family = nfmsg->nfgen_family;
3012         struct nft_flow_rule *flow;
3013         struct nft_table *table;
3014         struct nft_chain *chain;
3015         struct nft_rule *rule, *old_rule = NULL;
3016         struct nft_userdata *udata;
3017         struct nft_trans *trans = NULL;
3018         struct nft_expr *expr;
3019         struct nft_ctx ctx;
3020         struct nlattr *tmp;
3021         unsigned int size, i, n, ulen = 0, usize = 0;
3022         int err, rem;
3023         u64 handle, pos_handle;
3024
3025         lockdep_assert_held(&net->nft.commit_mutex);
3026
3027         table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask);
3028         if (IS_ERR(table)) {
3029                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
3030                 return PTR_ERR(table);
3031         }
3032
3033         chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], genmask);
3034         if (IS_ERR(chain)) {
3035                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
3036                 return PTR_ERR(chain);
3037         }
3038
3039         if (nla[NFTA_RULE_HANDLE]) {
3040                 handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE]));
3041                 rule = __nft_rule_lookup(chain, handle);
3042                 if (IS_ERR(rule)) {
3043                         NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
3044                         return PTR_ERR(rule);
3045                 }
3046
3047                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
3048                         NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
3049                         return -EEXIST;
3050                 }
3051                 if (nlh->nlmsg_flags & NLM_F_REPLACE)
3052                         old_rule = rule;
3053                 else
3054                         return -EOPNOTSUPP;
3055         } else {
3056                 if (!(nlh->nlmsg_flags & NLM_F_CREATE) ||
3057                     nlh->nlmsg_flags & NLM_F_REPLACE)
3058                         return -EINVAL;
3059                 handle = nf_tables_alloc_handle(table);
3060
3061                 if (chain->use == UINT_MAX)
3062                         return -EOVERFLOW;
3063
3064                 if (nla[NFTA_RULE_POSITION]) {
3065                         pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
3066                         old_rule = __nft_rule_lookup(chain, pos_handle);
3067                         if (IS_ERR(old_rule)) {
3068                                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]);
3069                                 return PTR_ERR(old_rule);
3070                         }
3071                 } else if (nla[NFTA_RULE_POSITION_ID]) {
3072                         old_rule = nft_rule_lookup_byid(net, nla[NFTA_RULE_POSITION_ID]);
3073                         if (IS_ERR(old_rule)) {
3074                                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION_ID]);
3075                                 return PTR_ERR(old_rule);
3076                         }
3077                 }
3078         }
3079
3080         nft_ctx_init(&ctx, net, skb, nlh, family, table, chain, nla);
3081
3082         n = 0;
3083         size = 0;
3084         if (nla[NFTA_RULE_EXPRESSIONS]) {
3085                 info = kvmalloc_array(NFT_RULE_MAXEXPRS,
3086                                       sizeof(struct nft_expr_info),
3087                                       GFP_KERNEL);
3088                 if (!info)
3089                         return -ENOMEM;
3090
3091                 nla_for_each_nested(tmp, nla[NFTA_RULE_EXPRESSIONS], rem) {
3092                         err = -EINVAL;
3093                         if (nla_type(tmp) != NFTA_LIST_ELEM)
3094                                 goto err1;
3095                         if (n == NFT_RULE_MAXEXPRS)
3096                                 goto err1;
3097                         err = nf_tables_expr_parse(&ctx, tmp, &info[n]);
3098                         if (err < 0)
3099                                 goto err1;
3100                         size += info[n].ops->size;
3101                         n++;
3102                 }
3103         }
3104         /* Check for overflow of dlen field */
3105         err = -EFBIG;
3106         if (size >= 1 << 12)
3107                 goto err1;
3108
3109         if (nla[NFTA_RULE_USERDATA]) {
3110                 ulen = nla_len(nla[NFTA_RULE_USERDATA]);
3111                 if (ulen > 0)
3112                         usize = sizeof(struct nft_userdata) + ulen;
3113         }
3114
3115         err = -ENOMEM;
3116         rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL);
3117         if (rule == NULL)
3118                 goto err1;
3119
3120         nft_activate_next(net, rule);
3121
3122         rule->handle = handle;
3123         rule->dlen   = size;
3124         rule->udata  = ulen ? 1 : 0;
3125
3126         if (ulen) {
3127                 udata = nft_userdata(rule);
3128                 udata->len = ulen - 1;
3129                 nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen);
3130         }
3131
3132         expr = nft_expr_first(rule);
3133         for (i = 0; i < n; i++) {
3134                 err = nf_tables_newexpr(&ctx, &info[i], expr);
3135                 if (err < 0)
3136                         goto err2;
3137
3138                 if (info[i].ops->validate)
3139                         nft_validate_state_update(net, NFT_VALIDATE_NEED);
3140
3141                 info[i].ops = NULL;
3142                 expr = nft_expr_next(expr);
3143         }
3144
3145         if (nlh->nlmsg_flags & NLM_F_REPLACE) {
3146                 trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
3147                 if (trans == NULL) {
3148                         err = -ENOMEM;
3149                         goto err2;
3150                 }
3151                 err = nft_delrule(&ctx, old_rule);
3152                 if (err < 0) {
3153                         nft_trans_destroy(trans);
3154                         goto err2;
3155                 }
3156
3157                 list_add_tail_rcu(&rule->list, &old_rule->list);
3158         } else {
3159                 trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
3160                 if (!trans) {
3161                         err = -ENOMEM;
3162                         goto err2;
3163                 }
3164
3165                 if (nlh->nlmsg_flags & NLM_F_APPEND) {
3166                         if (old_rule)
3167                                 list_add_rcu(&rule->list, &old_rule->list);
3168                         else
3169                                 list_add_tail_rcu(&rule->list, &chain->rules);
3170                  } else {
3171                         if (old_rule)
3172                                 list_add_tail_rcu(&rule->list, &old_rule->list);
3173                         else
3174                                 list_add_rcu(&rule->list, &chain->rules);
3175                 }
3176         }
3177         kvfree(info);
3178         chain->use++;
3179
3180         if (net->nft.validate_state == NFT_VALIDATE_DO)
3181                 return nft_table_validate(net, table);
3182
3183         if (chain->flags & NFT_CHAIN_HW_OFFLOAD) {
3184                 flow = nft_flow_rule_create(net, rule);
3185                 if (IS_ERR(flow))
3186                         return PTR_ERR(flow);
3187
3188                 nft_trans_flow_rule(trans) = flow;
3189         }
3190
3191         return 0;
3192 err2:
3193         nf_tables_rule_release(&ctx, rule);
3194 err1:
3195         for (i = 0; i < n; i++) {
3196                 if (info[i].ops) {
3197                         module_put(info[i].ops->type->owner);
3198                         if (info[i].ops->type->release_ops)
3199                                 info[i].ops->type->release_ops(info[i].ops);
3200                 }
3201         }
3202         kvfree(info);
3203         return err;
3204 }
3205
3206 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
3207                                              const struct nlattr *nla)
3208 {
3209         u32 id = ntohl(nla_get_be32(nla));
3210         struct nft_trans *trans;
3211
3212         list_for_each_entry(trans, &net->nft.commit_list, list) {
3213                 struct nft_rule *rule = nft_trans_rule(trans);
3214
3215                 if (trans->msg_type == NFT_MSG_NEWRULE &&
3216                     id == nft_trans_rule_id(trans))
3217                         return rule;
3218         }
3219         return ERR_PTR(-ENOENT);
3220 }
3221
3222 static int nf_tables_delrule(struct net *net, struct sock *nlsk,
3223                              struct sk_buff *skb, const struct nlmsghdr *nlh,
3224                              const struct nlattr * const nla[],
3225                              struct netlink_ext_ack *extack)
3226 {
3227         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3228         u8 genmask = nft_genmask_next(net);
3229         struct nft_table *table;
3230         struct nft_chain *chain = NULL;
3231         struct nft_rule *rule;
3232         int family = nfmsg->nfgen_family, err = 0;
3233         struct nft_ctx ctx;
3234
3235         table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask);
3236         if (IS_ERR(table)) {
3237                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
3238                 return PTR_ERR(table);
3239         }
3240
3241         if (nla[NFTA_RULE_CHAIN]) {
3242                 chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN],
3243                                          genmask);
3244                 if (IS_ERR(chain)) {
3245                         NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
3246                         return PTR_ERR(chain);
3247                 }
3248         }
3249
3250         nft_ctx_init(&ctx, net, skb, nlh, family, table, chain, nla);
3251
3252         if (chain) {
3253                 if (nla[NFTA_RULE_HANDLE]) {
3254                         rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]);
3255                         if (IS_ERR(rule)) {
3256                                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
3257                                 return PTR_ERR(rule);
3258                         }
3259
3260                         err = nft_delrule(&ctx, rule);
3261                 } else if (nla[NFTA_RULE_ID]) {
3262                         rule = nft_rule_lookup_byid(net, nla[NFTA_RULE_ID]);
3263                         if (IS_ERR(rule)) {
3264                                 NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_ID]);
3265                                 return PTR_ERR(rule);
3266                         }
3267
3268                         err = nft_delrule(&ctx, rule);
3269                 } else {
3270                         err = nft_delrule_by_chain(&ctx);
3271                 }
3272         } else {
3273                 list_for_each_entry(chain, &table->chains, list) {
3274                         if (!nft_is_active_next(net, chain))
3275                                 continue;
3276
3277                         ctx.chain = chain;
3278                         err = nft_delrule_by_chain(&ctx);
3279                         if (err < 0)
3280                                 break;
3281                 }
3282         }
3283
3284         return err;
3285 }
3286
3287 /*
3288  * Sets
3289  */
3290 static const struct nft_set_type *nft_set_types[] = {
3291         &nft_set_hash_fast_type,
3292         &nft_set_hash_type,
3293         &nft_set_rhash_type,
3294         &nft_set_bitmap_type,
3295         &nft_set_rbtree_type,
3296 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
3297         &nft_set_pipapo_avx2_type,
3298 #endif
3299         &nft_set_pipapo_type,
3300 };
3301
3302 #define NFT_SET_FEATURES        (NFT_SET_INTERVAL | NFT_SET_MAP | \
3303                                  NFT_SET_TIMEOUT | NFT_SET_OBJECT | \
3304                                  NFT_SET_EVAL)
3305
3306 static bool nft_set_ops_candidate(const struct nft_set_type *type, u32 flags)
3307 {
3308         return (flags & type->features) == (flags & NFT_SET_FEATURES);
3309 }
3310
3311 /*
3312  * Select a set implementation based on the data characteristics and the
3313  * given policy. The total memory use might not be known if no size is
3314  * given, in that case the amount of memory per element is used.
3315  */
3316 static const struct nft_set_ops *
3317 nft_select_set_ops(const struct nft_ctx *ctx,
3318                    const struct nlattr * const nla[],
3319                    const struct nft_set_desc *desc,
3320                    enum nft_set_policies policy)
3321 {
3322         const struct nft_set_ops *ops, *bops;
3323         struct nft_set_estimate est, best;
3324         const struct nft_set_type *type;
3325         u32 flags = 0;
3326         int i;
3327
3328         lockdep_assert_held(&ctx->net->nft.commit_mutex);
3329         lockdep_nfnl_nft_mutex_not_held();
3330
3331         if (nla[NFTA_SET_FLAGS] != NULL)
3332                 flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
3333
3334         bops        = NULL;
3335         best.size   = ~0;
3336         best.lookup = ~0;
3337         best.space  = ~0;
3338
3339         for (i = 0; i < ARRAY_SIZE(nft_set_types); i++) {
3340                 type = nft_set_types[i];
3341                 ops = &type->ops;
3342
3343                 if (!nft_set_ops_candidate(type, flags))
3344                         continue;
3345                 if (!ops->estimate(desc, flags, &est))
3346                         continue;
3347
3348                 switch (policy) {
3349                 case NFT_SET_POL_PERFORMANCE:
3350                         if (est.lookup < best.lookup)
3351                                 break;
3352                         if (est.lookup == best.lookup &&
3353                             est.space < best.space)
3354                                 break;
3355                         continue;
3356                 case NFT_SET_POL_MEMORY:
3357                         if (!desc->size) {
3358                                 if (est.space < best.space)
3359                                         break;
3360                                 if (est.space == best.space &&
3361                                     est.lookup < best.lookup)
3362                                         break;
3363                         } else if (est.size < best.size || !bops) {
3364                                 break;
3365                         }
3366                         continue;
3367                 default:
3368                         break;
3369                 }
3370
3371                 bops = ops;
3372                 best = est;
3373         }
3374
3375         if (bops != NULL)
3376                 return bops;
3377
3378         return ERR_PTR(-EOPNOTSUPP);
3379 }
3380
3381 static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
3382         [NFTA_SET_TABLE]                = { .type = NLA_STRING,
3383                                             .len = NFT_TABLE_MAXNAMELEN - 1 },
3384         [NFTA_SET_NAME]                 = { .type = NLA_STRING,
3385                                             .len = NFT_SET_MAXNAMELEN - 1 },
3386         [NFTA_SET_FLAGS]                = { .type = NLA_U32 },
3387         [NFTA_SET_KEY_TYPE]             = { .type = NLA_U32 },
3388         [NFTA_SET_KEY_LEN]              = { .type = NLA_U32 },
3389         [NFTA_SET_DATA_TYPE]            = { .type = NLA_U32 },
3390         [NFTA_SET_DATA_LEN]             = { .type = NLA_U32 },
3391         [NFTA_SET_POLICY]               = { .type = NLA_U32 },
3392         [NFTA_SET_DESC]                 = { .type = NLA_NESTED },
3393         [NFTA_SET_ID]                   = { .type = NLA_U32 },
3394         [NFTA_SET_TIMEOUT]              = { .type = NLA_U64 },
3395         [NFTA_SET_GC_INTERVAL]          = { .type = NLA_U32 },
3396         [NFTA_SET_USERDATA]             = { .type = NLA_BINARY,
3397                                             .len  = NFT_USERDATA_MAXLEN },
3398         [NFTA_SET_OBJ_TYPE]             = { .type = NLA_U32 },
3399         [NFTA_SET_HANDLE]               = { .type = NLA_U64 },
3400         [NFTA_SET_EXPR]                 = { .type = NLA_NESTED },
3401 };
3402
3403 static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = {
3404         [NFTA_SET_DESC_SIZE]            = { .type = NLA_U32 },
3405         [NFTA_SET_DESC_CONCAT]          = { .type = NLA_NESTED },
3406 };
3407
3408 static int nft_ctx_init_from_setattr(struct nft_ctx *ctx, struct net *net,
3409                                      const struct sk_buff *skb,
3410                                      const struct nlmsghdr *nlh,
3411                                      const struct nlattr * const nla[],
3412                                      struct netlink_ext_ack *extack,
3413                                      u8 genmask)
3414 {
3415         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3416         int family = nfmsg->nfgen_family;
3417         struct nft_table *table = NULL;
3418
3419         if (nla[NFTA_SET_TABLE] != NULL) {
3420                 table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family,
3421                                          genmask);
3422                 if (IS_ERR(table)) {
3423                         NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
3424                         return PTR_ERR(table);
3425                 }
3426         }
3427
3428         nft_ctx_init(ctx, net, skb, nlh, family, table, NULL, nla);
3429         return 0;
3430 }
3431
3432 static struct nft_set *nft_set_lookup(const struct nft_table *table,
3433                                       const struct nlattr *nla, u8 genmask)
3434 {
3435         struct nft_set *set;
3436
3437         if (nla == NULL)
3438                 return ERR_PTR(-EINVAL);
3439
3440         list_for_each_entry_rcu(set, &table->sets, list) {
3441                 if (!nla_strcmp(nla, set->name) &&
3442                     nft_active_genmask(set, genmask))
3443                         return set;
3444         }
3445         return ERR_PTR(-ENOENT);
3446 }
3447
3448 static struct nft_set *nft_set_lookup_byhandle(const struct nft_table *table,
3449                                                const struct nlattr *nla,
3450                                                u8 genmask)
3451 {
3452         struct nft_set *set;
3453
3454         list_for_each_entry(set, &table->sets, list) {
3455                 if (be64_to_cpu(nla_get_be64(nla)) == set->handle &&
3456                     nft_active_genmask(set, genmask))
3457                         return set;
3458         }
3459         return ERR_PTR(-ENOENT);
3460 }
3461
3462 static struct nft_set *nft_set_lookup_byid(const struct net *net,
3463                                            const struct nlattr *nla, u8 genmask)
3464 {
3465         struct nft_trans *trans;
3466         u32 id = ntohl(nla_get_be32(nla));
3467
3468         list_for_each_entry(trans, &net->nft.commit_list, list) {
3469                 if (trans->msg_type == NFT_MSG_NEWSET) {
3470                         struct nft_set *set = nft_trans_set(trans);
3471
3472                         if (id == nft_trans_set_id(trans) &&
3473                             nft_active_genmask(set, genmask))
3474                                 return set;
3475                 }
3476         }
3477         return ERR_PTR(-ENOENT);
3478 }
3479
3480 struct nft_set *nft_set_lookup_global(const struct net *net,
3481                                       const struct nft_table *table,
3482                                       const struct nlattr *nla_set_name,
3483                                       const struct nlattr *nla_set_id,
3484                                       u8 genmask)
3485 {
3486         struct nft_set *set;
3487
3488         set = nft_set_lookup(table, nla_set_name, genmask);
3489         if (IS_ERR(set)) {
3490                 if (!nla_set_id)
3491                         return set;
3492
3493                 set = nft_set_lookup_byid(net, nla_set_id, genmask);
3494         }
3495         return set;
3496 }
3497 EXPORT_SYMBOL_GPL(nft_set_lookup_global);
3498
3499 static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set,
3500                                     const char *name)
3501 {
3502         const struct nft_set *i;
3503         const char *p;
3504         unsigned long *inuse;
3505         unsigned int n = 0, min = 0;
3506
3507         p = strchr(name, '%');
3508         if (p != NULL) {
3509                 if (p[1] != 'd' || strchr(p + 2, '%'))
3510                         return -EINVAL;
3511
3512                 inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL);
3513                 if (inuse == NULL)
3514                         return -ENOMEM;
3515 cont:
3516                 list_for_each_entry(i, &ctx->table->sets, list) {
3517                         int tmp;
3518
3519                         if (!nft_is_active_next(ctx->net, set))
3520                                 continue;
3521                         if (!sscanf(i->name, name, &tmp))
3522                                 continue;
3523                         if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE)
3524                                 continue;
3525
3526                         set_bit(tmp - min, inuse);
3527                 }
3528
3529                 n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE);
3530                 if (n >= BITS_PER_BYTE * PAGE_SIZE) {
3531                         min += BITS_PER_BYTE * PAGE_SIZE;
3532                         memset(inuse, 0, PAGE_SIZE);
3533                         goto cont;
3534                 }
3535                 free_page((unsigned long)inuse);
3536         }
3537
3538         set->name = kasprintf(GFP_KERNEL, name, min + n);
3539         if (!set->name)
3540                 return -ENOMEM;
3541
3542         list_for_each_entry(i, &ctx->table->sets, list) {
3543                 if (!nft_is_active_next(ctx->net, i))
3544                         continue;
3545                 if (!strcmp(set->name, i->name)) {
3546                         kfree(set->name);
3547                         set->name = NULL;
3548                         return -ENFILE;
3549                 }
3550         }
3551         return 0;
3552 }
3553
3554 static int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
3555 {
3556         u64 ms = be64_to_cpu(nla_get_be64(nla));
3557         u64 max = (u64)(~((u64)0));
3558
3559         max = div_u64(max, NSEC_PER_MSEC);
3560         if (ms >= max)
3561                 return -ERANGE;
3562
3563         ms *= NSEC_PER_MSEC;
3564         *result = nsecs_to_jiffies64(ms);
3565         return 0;
3566 }
3567
3568 static __be64 nf_jiffies64_to_msecs(u64 input)
3569 {
3570         return cpu_to_be64(jiffies64_to_msecs(input));
3571 }
3572
3573 static int nf_tables_fill_set_concat(struct sk_buff *skb,
3574                                      const struct nft_set *set)
3575 {
3576         struct nlattr *concat, *field;
3577         int i;
3578
3579         concat = nla_nest_start_noflag(skb, NFTA_SET_DESC_CONCAT);
3580         if (!concat)
3581                 return -ENOMEM;
3582
3583         for (i = 0; i < set->field_count; i++) {
3584                 field = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
3585                 if (!field)
3586                         return -ENOMEM;
3587
3588                 if (nla_put_be32(skb, NFTA_SET_FIELD_LEN,
3589                                  htonl(set->field_len[i])))
3590                         return -ENOMEM;
3591
3592                 nla_nest_end(skb, field);
3593         }
3594
3595         nla_nest_end(skb, concat);
3596
3597         return 0;
3598 }
3599
3600 static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
3601                               const struct nft_set *set, u16 event, u16 flags)
3602 {
3603         struct nfgenmsg *nfmsg;
3604         struct nlmsghdr *nlh;
3605         u32 portid = ctx->portid;
3606         struct nlattr *nest;
3607         u32 seq = ctx->seq;
3608
3609         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
3610         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
3611                         flags);
3612         if (nlh == NULL)
3613                 goto nla_put_failure;
3614
3615         nfmsg = nlmsg_data(nlh);
3616         nfmsg->nfgen_family     = ctx->family;
3617         nfmsg->version          = NFNETLINK_V0;
3618         nfmsg->res_id           = htons(ctx->net->nft.base_seq & 0xffff);
3619
3620         if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
3621                 goto nla_put_failure;
3622         if (nla_put_string(skb, NFTA_SET_NAME, set->name))
3623                 goto nla_put_failure;
3624         if (nla_put_be64(skb, NFTA_SET_HANDLE, cpu_to_be64(set->handle),
3625                          NFTA_SET_PAD))
3626                 goto nla_put_failure;
3627         if (set->flags != 0)
3628                 if (nla_put_be32(skb, NFTA_SET_FLAGS, htonl(set->flags)))
3629                         goto nla_put_failure;
3630
3631         if (nla_put_be32(skb, NFTA_SET_KEY_TYPE, htonl(set->ktype)))
3632                 goto nla_put_failure;
3633         if (nla_put_be32(skb, NFTA_SET_KEY_LEN, htonl(set->klen)))
3634                 goto nla_put_failure;
3635         if (set->flags & NFT_SET_MAP) {
3636                 if (nla_put_be32(skb, NFTA_SET_DATA_TYPE, htonl(set->dtype)))
3637                         goto nla_put_failure;
3638                 if (nla_put_be32(skb, NFTA_SET_DATA_LEN, htonl(set->dlen)))
3639                         goto nla_put_failure;
3640         }
3641         if (set->flags & NFT_SET_OBJECT &&
3642             nla_put_be32(skb, NFTA_SET_OBJ_TYPE, htonl(set->objtype)))
3643                 goto nla_put_failure;
3644
3645         if (set->timeout &&
3646             nla_put_be64(skb, NFTA_SET_TIMEOUT,
3647                          nf_jiffies64_to_msecs(set->timeout),
3648                          NFTA_SET_PAD))
3649                 goto nla_put_failure;
3650         if (set->gc_int &&
3651             nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(set->gc_int)))
3652                 goto nla_put_failure;
3653
3654         if (set->policy != NFT_SET_POL_PERFORMANCE) {
3655                 if (nla_put_be32(skb, NFTA_SET_POLICY, htonl(set->policy)))
3656                         goto nla_put_failure;
3657         }
3658
3659         if (nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata))
3660                 goto nla_put_failure;
3661
3662         nest = nla_nest_start_noflag(skb, NFTA_SET_DESC);
3663         if (!nest)
3664                 goto nla_put_failure;
3665         if (set->size &&
3666             nla_put_be32(skb, NFTA_SET_DESC_SIZE, htonl(set->size)))
3667                 goto nla_put_failure;
3668
3669         if (set->field_count > 1 &&
3670             nf_tables_fill_set_concat(skb, set))
3671                 goto nla_put_failure;
3672
3673         nla_nest_end(skb, nest);
3674
3675         if (set->expr) {
3676                 nest = nla_nest_start_noflag(skb, NFTA_SET_EXPR);
3677                 if (nf_tables_fill_expr_info(skb, set->expr) < 0)
3678                         goto nla_put_failure;
3679
3680                 nla_nest_end(skb, nest);
3681         }
3682
3683         nlmsg_end(skb, nlh);
3684         return 0;
3685
3686 nla_put_failure:
3687         nlmsg_trim(skb, nlh);
3688         return -1;
3689 }
3690
3691 static void nf_tables_set_notify(const struct nft_ctx *ctx,
3692                                  const struct nft_set *set, int event,
3693                                  gfp_t gfp_flags)
3694 {
3695         struct sk_buff *skb;
3696         u32 portid = ctx->portid;
3697         int err;
3698
3699         if (!ctx->report &&
3700             !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
3701                 return;
3702
3703         skb = nlmsg_new(NLMSG_GOODSIZE, gfp_flags);
3704         if (skb == NULL)
3705                 goto err;
3706
3707         err = nf_tables_fill_set(skb, ctx, set, event, 0);
3708         if (err < 0) {
3709                 kfree_skb(skb);
3710                 goto err;
3711         }
3712
3713         nfnetlink_send(skb, ctx->net, portid, NFNLGRP_NFTABLES, ctx->report,
3714                        gfp_flags);
3715         return;
3716 err:
3717         nfnetlink_set_err(ctx->net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
3718 }
3719
3720 static int nf_tables_dump_sets(struct sk_buff *skb, struct netlink_callback *cb)
3721 {
3722         const struct nft_set *set;
3723         unsigned int idx, s_idx = cb->args[0];
3724         struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2];
3725         struct net *net = sock_net(skb->sk);
3726         struct nft_ctx *ctx = cb->data, ctx_set;
3727
3728         if (cb->args[1])
3729                 return skb->len;
3730
3731         rcu_read_lock();
3732         cb->seq = net->nft.base_seq;
3733
3734         list_for_each_entry_rcu(table, &net->nft.tables, list) {
3735                 if (ctx->family != NFPROTO_UNSPEC &&
3736                     ctx->family != table->family)
3737                         continue;
3738
3739                 if (ctx->table && ctx->table != table)
3740                         continue;
3741
3742                 if (cur_table) {
3743                         if (cur_table != table)
3744                                 continue;
3745
3746                         cur_table = NULL;
3747                 }
3748                 idx = 0;
3749                 list_for_each_entry_rcu(set, &table->sets, list) {
3750                         if (idx < s_idx)
3751                                 goto cont;
3752                         if (!nft_is_active(net, set))
3753                                 goto cont;
3754
3755                         ctx_set = *ctx;
3756                         ctx_set.table = table;
3757                         ctx_set.family = table->family;
3758
3759                         if (nf_tables_fill_set(skb, &ctx_set, set,
3760                                                NFT_MSG_NEWSET,
3761                                                NLM_F_MULTI) < 0) {
3762                                 cb->args[0] = idx;
3763                                 cb->args[2] = (unsigned long) table;
3764                                 goto done;
3765                         }
3766                         nl_dump_check_consistent(cb, nlmsg_hdr(skb));
3767 cont:
3768                         idx++;
3769                 }
3770                 if (s_idx)
3771                         s_idx = 0;
3772         }
3773         cb->args[1] = 1;
3774 done:
3775         rcu_read_unlock();
3776         return skb->len;
3777 }
3778
3779 static int nf_tables_dump_sets_start(struct netlink_callback *cb)
3780 {
3781         struct nft_ctx *ctx_dump = NULL;
3782
3783         ctx_dump = kmemdup(cb->data, sizeof(*ctx_dump), GFP_ATOMIC);
3784         if (ctx_dump == NULL)
3785                 return -ENOMEM;
3786
3787         cb->data = ctx_dump;
3788         return 0;
3789 }
3790
3791 static int nf_tables_dump_sets_done(struct netlink_callback *cb)
3792 {
3793         kfree(cb->data);
3794         return 0;
3795 }
3796
3797 /* called with rcu_read_lock held */
3798 static int nf_tables_getset(struct net *net, struct sock *nlsk,
3799                             struct sk_buff *skb, const struct nlmsghdr *nlh,
3800                             const struct nlattr * const nla[],
3801                             struct netlink_ext_ack *extack)
3802 {
3803         u8 genmask = nft_genmask_cur(net);
3804         const struct nft_set *set;
3805         struct nft_ctx ctx;
3806         struct sk_buff *skb2;
3807         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3808         int err;
3809
3810         /* Verify existence before starting dump */
3811         err = nft_ctx_init_from_setattr(&ctx, net, skb, nlh, nla, extack,
3812                                         genmask);
3813         if (err < 0)
3814                 return err;
3815
3816         if (nlh->nlmsg_flags & NLM_F_DUMP) {
3817                 struct netlink_dump_control c = {
3818                         .start = nf_tables_dump_sets_start,
3819                         .dump = nf_tables_dump_sets,
3820                         .done = nf_tables_dump_sets_done,
3821                         .data = &ctx,
3822                         .module = THIS_MODULE,
3823                 };
3824
3825                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
3826         }
3827
3828         /* Only accept unspec with dump */
3829         if (nfmsg->nfgen_family == NFPROTO_UNSPEC)
3830                 return -EAFNOSUPPORT;
3831         if (!nla[NFTA_SET_TABLE])
3832                 return -EINVAL;
3833
3834         set = nft_set_lookup(ctx.table, nla[NFTA_SET_NAME], genmask);
3835         if (IS_ERR(set))
3836                 return PTR_ERR(set);
3837
3838         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
3839         if (skb2 == NULL)
3840                 return -ENOMEM;
3841
3842         err = nf_tables_fill_set(skb2, &ctx, set, NFT_MSG_NEWSET, 0);
3843         if (err < 0)
3844                 goto err;
3845
3846         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
3847
3848 err:
3849         kfree_skb(skb2);
3850         return err;
3851 }
3852
3853 static const struct nla_policy nft_concat_policy[NFTA_SET_FIELD_MAX + 1] = {
3854         [NFTA_SET_FIELD_LEN]    = { .type = NLA_U32 },
3855 };
3856
3857 static int nft_set_desc_concat_parse(const struct nlattr *attr,
3858                                      struct nft_set_desc *desc)
3859 {
3860         struct nlattr *tb[NFTA_SET_FIELD_MAX + 1];
3861         u32 len;
3862         int err;
3863
3864         err = nla_parse_nested_deprecated(tb, NFTA_SET_FIELD_MAX, attr,
3865                                           nft_concat_policy, NULL);
3866         if (err < 0)
3867                 return err;
3868
3869         if (!tb[NFTA_SET_FIELD_LEN])
3870                 return -EINVAL;
3871
3872         len = ntohl(nla_get_be32(tb[NFTA_SET_FIELD_LEN]));
3873
3874         if (len * BITS_PER_BYTE / 32 > NFT_REG32_COUNT)
3875                 return -E2BIG;
3876
3877         desc->field_len[desc->field_count++] = len;
3878
3879         return 0;
3880 }
3881
3882 static int nft_set_desc_concat(struct nft_set_desc *desc,
3883                                const struct nlattr *nla)
3884 {
3885         struct nlattr *attr;
3886         int rem, err;
3887
3888         nla_for_each_nested(attr, nla, rem) {
3889                 if (nla_type(attr) != NFTA_LIST_ELEM)
3890                         return -EINVAL;
3891
3892                 err = nft_set_desc_concat_parse(attr, desc);
3893                 if (err < 0)
3894                         return err;
3895         }
3896
3897         return 0;
3898 }
3899
3900 static int nf_tables_set_desc_parse(struct nft_set_desc *desc,
3901                                     const struct nlattr *nla)
3902 {
3903         struct nlattr *da[NFTA_SET_DESC_MAX + 1];
3904         int err;
3905
3906         err = nla_parse_nested_deprecated(da, NFTA_SET_DESC_MAX, nla,
3907                                           nft_set_desc_policy, NULL);
3908         if (err < 0)
3909                 return err;
3910
3911         if (da[NFTA_SET_DESC_SIZE] != NULL)
3912                 desc->size = ntohl(nla_get_be32(da[NFTA_SET_DESC_SIZE]));
3913         if (da[NFTA_SET_DESC_CONCAT])
3914                 err = nft_set_desc_concat(desc, da[NFTA_SET_DESC_CONCAT]);
3915
3916         return err;
3917 }
3918
3919 static int nf_tables_newset(struct net *net, struct sock *nlsk,
3920                             struct sk_buff *skb, const struct nlmsghdr *nlh,
3921                             const struct nlattr * const nla[],
3922                             struct netlink_ext_ack *extack)
3923 {
3924         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
3925         u8 genmask = nft_genmask_next(net);
3926         int family = nfmsg->nfgen_family;
3927         const struct nft_set_ops *ops;
3928         struct nft_expr *expr = NULL;
3929         struct nft_table *table;
3930         struct nft_set *set;
3931         struct nft_ctx ctx;
3932         char *name;
3933         u64 size;
3934         u64 timeout;
3935         u32 ktype, dtype, flags, policy, gc_int, objtype;
3936         struct nft_set_desc desc;
3937         unsigned char *udata;
3938         u16 udlen;
3939         int err;
3940         int i;
3941
3942         if (nla[NFTA_SET_TABLE] == NULL ||
3943             nla[NFTA_SET_NAME] == NULL ||
3944             nla[NFTA_SET_KEY_LEN] == NULL ||
3945             nla[NFTA_SET_ID] == NULL)
3946                 return -EINVAL;
3947
3948         memset(&desc, 0, sizeof(desc));
3949
3950         ktype = NFT_DATA_VALUE;
3951         if (nla[NFTA_SET_KEY_TYPE] != NULL) {
3952                 ktype = ntohl(nla_get_be32(nla[NFTA_SET_KEY_TYPE]));
3953                 if ((ktype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK)
3954                         return -EINVAL;
3955         }
3956
3957         desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN]));
3958         if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN)
3959                 return -EINVAL;
3960
3961         flags = 0;
3962         if (nla[NFTA_SET_FLAGS] != NULL) {
3963                 flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
3964                 if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT |
3965                               NFT_SET_INTERVAL | NFT_SET_TIMEOUT |
3966                               NFT_SET_MAP | NFT_SET_EVAL |
3967                               NFT_SET_OBJECT | NFT_SET_CONCAT))
3968                         return -EOPNOTSUPP;
3969                 /* Only one of these operations is supported */
3970                 if ((flags & (NFT_SET_MAP | NFT_SET_OBJECT)) ==
3971                              (NFT_SET_MAP | NFT_SET_OBJECT))
3972                         return -EOPNOTSUPP;
3973                 if ((flags & (NFT_SET_EVAL | NFT_SET_OBJECT)) ==
3974                              (NFT_SET_EVAL | NFT_SET_OBJECT))
3975                         return -EOPNOTSUPP;
3976         }
3977
3978         dtype = 0;
3979         if (nla[NFTA_SET_DATA_TYPE] != NULL) {
3980                 if (!(flags & NFT_SET_MAP))
3981                         return -EINVAL;
3982
3983                 dtype = ntohl(nla_get_be32(nla[NFTA_SET_DATA_TYPE]));
3984                 if ((dtype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK &&
3985                     dtype != NFT_DATA_VERDICT)
3986                         return -EINVAL;
3987
3988                 if (dtype != NFT_DATA_VERDICT) {
3989                         if (nla[NFTA_SET_DATA_LEN] == NULL)
3990                                 return -EINVAL;
3991                         desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN]));
3992                         if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN)
3993                                 return -EINVAL;
3994                 } else
3995                         desc.dlen = sizeof(struct nft_verdict);
3996         } else if (flags & NFT_SET_MAP)
3997                 return -EINVAL;
3998
3999         if (nla[NFTA_SET_OBJ_TYPE] != NULL) {
4000                 if (!(flags & NFT_SET_OBJECT))
4001                         return -EINVAL;
4002
4003                 objtype = ntohl(nla_get_be32(nla[NFTA_SET_OBJ_TYPE]));
4004                 if (objtype == NFT_OBJECT_UNSPEC ||
4005                     objtype > NFT_OBJECT_MAX)
4006                         return -EOPNOTSUPP;
4007         } else if (flags & NFT_SET_OBJECT)
4008                 return -EINVAL;
4009         else
4010                 objtype = NFT_OBJECT_UNSPEC;
4011
4012         timeout = 0;
4013         if (nla[NFTA_SET_TIMEOUT] != NULL) {
4014                 if (!(flags & NFT_SET_TIMEOUT))
4015                         return -EINVAL;
4016
4017                 err = nf_msecs_to_jiffies64(nla[NFTA_SET_TIMEOUT], &timeout);
4018                 if (err)
4019                         return err;
4020         }
4021         gc_int = 0;
4022         if (nla[NFTA_SET_GC_INTERVAL] != NULL) {
4023                 if (!(flags & NFT_SET_TIMEOUT))
4024                         return -EINVAL;
4025                 gc_int = ntohl(nla_get_be32(nla[NFTA_SET_GC_INTERVAL]));
4026         }
4027
4028         policy = NFT_SET_POL_PERFORMANCE;
4029         if (nla[NFTA_SET_POLICY] != NULL)
4030                 policy = ntohl(nla_get_be32(nla[NFTA_SET_POLICY]));
4031
4032         if (nla[NFTA_SET_DESC] != NULL) {
4033                 err = nf_tables_set_desc_parse(&desc, nla[NFTA_SET_DESC]);
4034                 if (err < 0)
4035                         return err;
4036         }
4037
4038         if (nla[NFTA_SET_EXPR])
4039                 desc.expr = true;
4040
4041         table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, genmask);
4042         if (IS_ERR(table)) {
4043                 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
4044                 return PTR_ERR(table);
4045         }
4046
4047         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
4048
4049         set = nft_set_lookup(table, nla[NFTA_SET_NAME], genmask);
4050         if (IS_ERR(set)) {
4051                 if (PTR_ERR(set) != -ENOENT) {
4052                         NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
4053                         return PTR_ERR(set);
4054                 }
4055         } else {
4056                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
4057                         NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
4058                         return -EEXIST;
4059                 }
4060                 if (nlh->nlmsg_flags & NLM_F_REPLACE)
4061                         return -EOPNOTSUPP;
4062
4063                 return 0;
4064         }
4065
4066         if (!(nlh->nlmsg_flags & NLM_F_CREATE))
4067                 return -ENOENT;
4068
4069         ops = nft_select_set_ops(&ctx, nla, &desc, policy);
4070         if (IS_ERR(ops))
4071                 return PTR_ERR(ops);
4072
4073         udlen = 0;
4074         if (nla[NFTA_SET_USERDATA])
4075                 udlen = nla_len(nla[NFTA_SET_USERDATA]);
4076
4077         size = 0;
4078         if (ops->privsize != NULL)
4079                 size = ops->privsize(nla, &desc);
4080
4081         set = kvzalloc(sizeof(*set) + size + udlen, GFP_KERNEL);
4082         if (!set)
4083                 return -ENOMEM;
4084
4085         name = nla_strdup(nla[NFTA_SET_NAME], GFP_KERNEL);
4086         if (!name) {
4087                 err = -ENOMEM;
4088                 goto err_set_name;
4089         }
4090
4091         err = nf_tables_set_alloc_name(&ctx, set, name);
4092         kfree(name);
4093         if (err < 0)
4094                 goto err_set_alloc_name;
4095
4096         if (nla[NFTA_SET_EXPR]) {
4097                 expr = nft_set_elem_expr_alloc(&ctx, set, nla[NFTA_SET_EXPR]);
4098                 if (IS_ERR(expr)) {
4099                         err = PTR_ERR(expr);
4100                         goto err_set_alloc_name;
4101                 }
4102         }
4103
4104         udata = NULL;
4105         if (udlen) {
4106                 udata = set->data + size;
4107                 nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen);
4108         }
4109
4110         INIT_LIST_HEAD(&set->bindings);
4111         set->table = table;
4112         write_pnet(&set->net, net);
4113         set->ops   = ops;
4114         set->ktype = ktype;
4115         set->klen  = desc.klen;
4116         set->dtype = dtype;
4117         set->objtype = objtype;
4118         set->dlen  = desc.dlen;
4119         set->expr = expr;
4120         set->flags = flags;
4121         set->size  = desc.size;
4122         set->policy = policy;
4123         set->udlen  = udlen;
4124         set->udata  = udata;
4125         set->timeout = timeout;
4126         set->gc_int = gc_int;
4127         set->handle = nf_tables_alloc_handle(table);
4128
4129         set->field_count = desc.field_count;
4130         for (i = 0; i < desc.field_count; i++)
4131                 set->field_len[i] = desc.field_len[i];
4132
4133         err = ops->init(set, &desc, nla);
4134         if (err < 0)
4135                 goto err_set_init;
4136
4137         err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
4138         if (err < 0)
4139                 goto err_set_trans;
4140
4141         list_add_tail_rcu(&set->list, &table->sets);
4142         table->use++;
4143         return 0;
4144
4145 err_set_trans:
4146         ops->destroy(set);
4147 err_set_init:
4148         if (expr)
4149                 nft_expr_destroy(&ctx, expr);
4150 err_set_alloc_name:
4151         kfree(set->name);
4152 err_set_name:
4153         kvfree(set);
4154         return err;
4155 }
4156
4157 static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
4158 {
4159         if (WARN_ON(set->use > 0))
4160                 return;
4161
4162         if (set->expr)
4163                 nft_expr_destroy(ctx, set->expr);
4164
4165         set->ops->destroy(set);
4166         kfree(set->name);
4167         kvfree(set);
4168 }
4169
4170 static int nf_tables_delset(struct net *net, struct sock *nlsk,
4171                             struct sk_buff *skb, const struct nlmsghdr *nlh,
4172                             const struct nlattr * const nla[],
4173                             struct netlink_ext_ack *extack)
4174 {
4175         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
4176         u8 genmask = nft_genmask_next(net);
4177         const struct nlattr *attr;
4178         struct nft_set *set;
4179         struct nft_ctx ctx;
4180         int err;
4181
4182         if (nfmsg->nfgen_family == NFPROTO_UNSPEC)
4183                 return -EAFNOSUPPORT;
4184         if (nla[NFTA_SET_TABLE] == NULL)
4185                 return -EINVAL;
4186
4187         err = nft_ctx_init_from_setattr(&ctx, net, skb, nlh, nla, extack,
4188                                         genmask);
4189         if (err < 0)
4190                 return err;
4191
4192         if (nla[NFTA_SET_HANDLE]) {
4193                 attr = nla[NFTA_SET_HANDLE];
4194                 set = nft_set_lookup_byhandle(ctx.table, attr, genmask);
4195         } else {
4196                 attr = nla[NFTA_SET_NAME];
4197                 set = nft_set_lookup(ctx.table, attr, genmask);
4198         }
4199
4200         if (IS_ERR(set)) {
4201                 NL_SET_BAD_ATTR(extack, attr);
4202                 return PTR_ERR(set);
4203         }
4204         if (set->use ||
4205             (nlh->nlmsg_flags & NLM_F_NONREC && atomic_read(&set->nelems) > 0)) {
4206                 NL_SET_BAD_ATTR(extack, attr);
4207                 return -EBUSY;
4208         }
4209
4210         return nft_delset(&ctx, set);
4211 }
4212
4213 static int nf_tables_bind_check_setelem(const struct nft_ctx *ctx,
4214                                         struct nft_set *set,
4215                                         const struct nft_set_iter *iter,
4216                                         struct nft_set_elem *elem)
4217 {
4218         const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
4219         enum nft_registers dreg;
4220
4221         dreg = nft_type_to_reg(set->dtype);
4222         return nft_validate_register_store(ctx, dreg, nft_set_ext_data(ext),
4223                                            set->dtype == NFT_DATA_VERDICT ?
4224                                            NFT_DATA_VERDICT : NFT_DATA_VALUE,
4225                                            set->dlen);
4226 }
4227
4228 int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
4229                        struct nft_set_binding *binding)
4230 {
4231         struct nft_set_binding *i;
4232         struct nft_set_iter iter;
4233
4234         if (set->use == UINT_MAX)
4235                 return -EOVERFLOW;
4236
4237         if (!list_empty(&set->bindings) && nft_set_is_anonymous(set))
4238                 return -EBUSY;
4239
4240         if (binding->flags & NFT_SET_MAP) {
4241                 /* If the set is already bound to the same chain all
4242                  * jumps are already validated for that chain.
4243                  */
4244                 list_for_each_entry(i, &set->bindings, list) {
4245                         if (i->flags & NFT_SET_MAP &&
4246                             i->chain == binding->chain)
4247                                 goto bind;
4248                 }
4249
4250                 iter.genmask    = nft_genmask_next(ctx->net);
4251                 iter.skip       = 0;
4252                 iter.count      = 0;
4253                 iter.err        = 0;
4254                 iter.fn         = nf_tables_bind_check_setelem;
4255
4256                 set->ops->walk(ctx, set, &iter);
4257                 if (iter.err < 0)
4258                         return iter.err;
4259         }
4260 bind:
4261         binding->chain = ctx->chain;
4262         list_add_tail_rcu(&binding->list, &set->bindings);
4263         nft_set_trans_bind(ctx, set);
4264         set->use++;
4265
4266         return 0;
4267 }
4268 EXPORT_SYMBOL_GPL(nf_tables_bind_set);
4269
4270 static void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
4271                                  struct nft_set_binding *binding, bool event)
4272 {
4273         list_del_rcu(&binding->list);
4274
4275         if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) {
4276                 list_del_rcu(&set->list);
4277                 if (event)
4278                         nf_tables_set_notify(ctx, set, NFT_MSG_DELSET,
4279                                              GFP_KERNEL);
4280         }
4281 }
4282
4283 void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set,
4284                               struct nft_set_binding *binding,
4285                               enum nft_trans_phase phase)
4286 {
4287         switch (phase) {
4288         case NFT_TRANS_PREPARE:
4289                 set->use--;
4290                 return;
4291         case NFT_TRANS_ABORT:
4292         case NFT_TRANS_RELEASE:
4293                 set->use--;
4294                 /* fall through */
4295         default:
4296                 nf_tables_unbind_set(ctx, set, binding,
4297                                      phase == NFT_TRANS_COMMIT);
4298         }
4299 }
4300 EXPORT_SYMBOL_GPL(nf_tables_deactivate_set);
4301
4302 void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set)
4303 {
4304         if (list_empty(&set->bindings) && nft_set_is_anonymous(set))
4305                 nft_set_destroy(ctx, set);
4306 }
4307 EXPORT_SYMBOL_GPL(nf_tables_destroy_set);
4308
4309 const struct nft_set_ext_type nft_set_ext_types[] = {
4310         [NFT_SET_EXT_KEY]               = {
4311                 .align  = __alignof__(u32),
4312         },
4313         [NFT_SET_EXT_DATA]              = {
4314                 .align  = __alignof__(u32),
4315         },
4316         [NFT_SET_EXT_EXPR]              = {
4317                 .align  = __alignof__(struct nft_expr),
4318         },
4319         [NFT_SET_EXT_OBJREF]            = {
4320                 .len    = sizeof(struct nft_object *),
4321                 .align  = __alignof__(struct nft_object *),
4322         },
4323         [NFT_SET_EXT_FLAGS]             = {
4324                 .len    = sizeof(u8),
4325                 .align  = __alignof__(u8),
4326         },
4327         [NFT_SET_EXT_TIMEOUT]           = {
4328                 .len    = sizeof(u64),
4329                 .align  = __alignof__(u64),
4330         },
4331         [NFT_SET_EXT_EXPIRATION]        = {
4332                 .len    = sizeof(u64),
4333                 .align  = __alignof__(u64),
4334         },
4335         [NFT_SET_EXT_USERDATA]          = {
4336                 .len    = sizeof(struct nft_userdata),
4337                 .align  = __alignof__(struct nft_userdata),
4338         },
4339         [NFT_SET_EXT_KEY_END]           = {
4340                 .align  = __alignof__(u32),
4341         },
4342 };
4343
4344 /*
4345  * Set elements
4346  */
4347
4348 static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = {
4349         [NFTA_SET_ELEM_KEY]             = { .type = NLA_NESTED },
4350         [NFTA_SET_ELEM_DATA]            = { .type = NLA_NESTED },
4351         [NFTA_SET_ELEM_FLAGS]           = { .type = NLA_U32 },
4352         [NFTA_SET_ELEM_TIMEOUT]         = { .type = NLA_U64 },
4353         [NFTA_SET_ELEM_EXPIRATION]      = { .type = NLA_U64 },
4354         [NFTA_SET_ELEM_USERDATA]        = { .type = NLA_BINARY,
4355                                             .len = NFT_USERDATA_MAXLEN },
4356         [NFTA_SET_ELEM_EXPR]            = { .type = NLA_NESTED },
4357         [NFTA_SET_ELEM_OBJREF]          = { .type = NLA_STRING,
4358                                             .len = NFT_OBJ_MAXNAMELEN - 1 },
4359         [NFTA_SET_ELEM_KEY_END]         = { .type = NLA_NESTED },
4360 };
4361
4362 static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = {
4363         [NFTA_SET_ELEM_LIST_TABLE]      = { .type = NLA_STRING,
4364                                             .len = NFT_TABLE_MAXNAMELEN - 1 },
4365         [NFTA_SET_ELEM_LIST_SET]        = { .type = NLA_STRING,
4366                                             .len = NFT_SET_MAXNAMELEN - 1 },
4367         [NFTA_SET_ELEM_LIST_ELEMENTS]   = { .type = NLA_NESTED },
4368         [NFTA_SET_ELEM_LIST_SET_ID]     = { .type = NLA_U32 },
4369 };
4370
4371 static int nft_ctx_init_from_elemattr(struct nft_ctx *ctx, struct net *net,
4372                                       const struct sk_buff *skb,
4373                                       const struct nlmsghdr *nlh,
4374                                       const struct nlattr * const nla[],
4375                                       struct netlink_ext_ack *extack,
4376                                       u8 genmask)
4377 {
4378         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
4379         int family = nfmsg->nfgen_family;
4380         struct nft_table *table;
4381
4382         table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
4383                                  genmask);
4384         if (IS_ERR(table)) {
4385                 NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
4386                 return PTR_ERR(table);
4387         }
4388
4389         nft_ctx_init(ctx, net, skb, nlh, family, table, NULL, nla);
4390         return 0;
4391 }
4392
4393 static int nf_tables_fill_setelem(struct sk_buff *skb,
4394                                   const struct nft_set *set,
4395                                   const struct nft_set_elem *elem)
4396 {
4397         const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
4398         unsigned char *b = skb_tail_pointer(skb);
4399         struct nlattr *nest;
4400
4401         nest = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
4402         if (nest == NULL)
4403                 goto nla_put_failure;
4404
4405         if (nft_data_dump(skb, NFTA_SET_ELEM_KEY, nft_set_ext_key(ext),
4406                           NFT_DATA_VALUE, set->klen) < 0)
4407                 goto nla_put_failure;
4408
4409         if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) &&
4410             nft_data_dump(skb, NFTA_SET_ELEM_KEY_END, nft_set_ext_key_end(ext),
4411                           NFT_DATA_VALUE, set->klen) < 0)
4412                 goto nla_put_failure;
4413
4414         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
4415             nft_data_dump(skb, NFTA_SET_ELEM_DATA, nft_set_ext_data(ext),
4416                           set->dtype == NFT_DATA_VERDICT ? NFT_DATA_VERDICT : NFT_DATA_VALUE,
4417                           set->dlen) < 0)
4418                 goto nla_put_failure;
4419
4420         if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR) &&
4421             nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, nft_set_ext_expr(ext)) < 0)
4422                 goto nla_put_failure;
4423
4424         if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
4425             nla_put_string(skb, NFTA_SET_ELEM_OBJREF,
4426                            (*nft_set_ext_obj(ext))->key.name) < 0)
4427                 goto nla_put_failure;
4428
4429         if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
4430             nla_put_be32(skb, NFTA_SET_ELEM_FLAGS,
4431                          htonl(*nft_set_ext_flags(ext))))
4432                 goto nla_put_failure;
4433
4434         if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) &&
4435             nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT,
4436                          nf_jiffies64_to_msecs(*nft_set_ext_timeout(ext)),
4437                          NFTA_SET_ELEM_PAD))
4438                 goto nla_put_failure;
4439
4440         if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) {
4441                 u64 expires, now = get_jiffies_64();
4442
4443                 expires = *nft_set_ext_expiration(ext);
4444                 if (time_before64(now, expires))
4445                         expires -= now;
4446                 else
4447                         expires = 0;
4448
4449                 if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION,
4450                                  nf_jiffies64_to_msecs(expires),
4451                                  NFTA_SET_ELEM_PAD))
4452                         goto nla_put_failure;
4453         }
4454
4455         if (nft_set_ext_exists(ext, NFT_SET_EXT_USERDATA)) {
4456                 struct nft_userdata *udata;
4457
4458                 udata = nft_set_ext_userdata(ext);
4459                 if (nla_put(skb, NFTA_SET_ELEM_USERDATA,
4460                             udata->len + 1, udata->data))
4461                         goto nla_put_failure;
4462         }
4463
4464         nla_nest_end(skb, nest);
4465         return 0;
4466
4467 nla_put_failure:
4468         nlmsg_trim(skb, b);
4469         return -EMSGSIZE;
4470 }
4471
4472 struct nft_set_dump_args {
4473         const struct netlink_callback   *cb;
4474         struct nft_set_iter             iter;
4475         struct sk_buff                  *skb;
4476 };
4477
4478 static int nf_tables_dump_setelem(const struct nft_ctx *ctx,
4479                                   struct nft_set *set,
4480                                   const struct nft_set_iter *iter,
4481                                   struct nft_set_elem *elem)
4482 {
4483         struct nft_set_dump_args *args;
4484
4485         args = container_of(iter, struct nft_set_dump_args, iter);
4486         return nf_tables_fill_setelem(args->skb, set, elem);
4487 }
4488
4489 struct nft_set_dump_ctx {
4490         const struct nft_set    *set;
4491         struct nft_ctx          ctx;
4492 };
4493
4494 static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb)
4495 {
4496         struct nft_set_dump_ctx *dump_ctx = cb->data;
4497         struct net *net = sock_net(skb->sk);
4498         struct nft_table *table;
4499         struct nft_set *set;
4500         struct nft_set_dump_args args;
4501         bool set_found = false;
4502         struct nfgenmsg *nfmsg;
4503         struct nlmsghdr *nlh;
4504         struct nlattr *nest;
4505         u32 portid, seq;
4506         int event;
4507
4508         rcu_read_lock();
4509         list_for_each_entry_rcu(table, &net->nft.tables, list) {
4510                 if (dump_ctx->ctx.family != NFPROTO_UNSPEC &&
4511                     dump_ctx->ctx.family != table->family)
4512                         continue;
4513
4514                 if (table != dump_ctx->ctx.table)
4515                         continue;
4516
4517                 list_for_each_entry_rcu(set, &table->sets, list) {
4518                         if (set == dump_ctx->set) {
4519                                 set_found = true;
4520                                 break;
4521                         }
4522                 }
4523                 break;
4524         }
4525
4526         if (!set_found) {
4527                 rcu_read_unlock();
4528                 return -ENOENT;
4529         }
4530
4531         event  = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWSETELEM);
4532         portid = NETLINK_CB(cb->skb).portid;
4533         seq    = cb->nlh->nlmsg_seq;
4534
4535         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
4536                         NLM_F_MULTI);
4537         if (nlh == NULL)
4538                 goto nla_put_failure;
4539
4540         nfmsg = nlmsg_data(nlh);
4541         nfmsg->nfgen_family = table->family;
4542         nfmsg->version      = NFNETLINK_V0;
4543         nfmsg->res_id       = htons(net->nft.base_seq & 0xffff);
4544
4545         if (nla_put_string(skb, NFTA_SET_ELEM_LIST_TABLE, table->name))
4546                 goto nla_put_failure;
4547         if (nla_put_string(skb, NFTA_SET_ELEM_LIST_SET, set->name))
4548                 goto nla_put_failure;
4549
4550         nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
4551         if (nest == NULL)
4552                 goto nla_put_failure;
4553
4554         args.cb                 = cb;
4555         args.skb                = skb;
4556         args.iter.genmask       = nft_genmask_cur(net);
4557         args.iter.skip          = cb->args[0];
4558         args.iter.count         = 0;
4559         args.iter.err           = 0;
4560         args.iter.fn            = nf_tables_dump_setelem;
4561         set->ops->walk(&dump_ctx->ctx, set, &args.iter);
4562         rcu_read_unlock();
4563
4564         nla_nest_end(skb, nest);
4565         nlmsg_end(skb, nlh);
4566
4567         if (args.iter.err && args.iter.err != -EMSGSIZE)
4568                 return args.iter.err;
4569         if (args.iter.count == cb->args[0])
4570                 return 0;
4571
4572         cb->args[0] = args.iter.count;
4573         return skb->len;
4574
4575 nla_put_failure:
4576         rcu_read_unlock();
4577         return -ENOSPC;
4578 }
4579
4580 static int nf_tables_dump_set_start(struct netlink_callback *cb)
4581 {
4582         struct nft_set_dump_ctx *dump_ctx = cb->data;
4583
4584         cb->data = kmemdup(dump_ctx, sizeof(*dump_ctx), GFP_ATOMIC);
4585
4586         return cb->data ? 0 : -ENOMEM;
4587 }
4588
4589 static int nf_tables_dump_set_done(struct netlink_callback *cb)
4590 {
4591         kfree(cb->data);
4592         return 0;
4593 }
4594
4595 static int nf_tables_fill_setelem_info(struct sk_buff *skb,
4596                                        const struct nft_ctx *ctx, u32 seq,
4597                                        u32 portid, int event, u16 flags,
4598                                        const struct nft_set *set,
4599                                        const struct nft_set_elem *elem)
4600 {
4601         struct nfgenmsg *nfmsg;
4602         struct nlmsghdr *nlh;
4603         struct nlattr *nest;
4604         int err;
4605
4606         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
4607         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg),
4608                         flags);
4609         if (nlh == NULL)
4610                 goto nla_put_failure;
4611
4612         nfmsg = nlmsg_data(nlh);
4613         nfmsg->nfgen_family     = ctx->family;
4614         nfmsg->version          = NFNETLINK_V0;
4615         nfmsg->res_id           = htons(ctx->net->nft.base_seq & 0xffff);
4616
4617         if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
4618                 goto nla_put_failure;
4619         if (nla_put_string(skb, NFTA_SET_NAME, set->name))
4620                 goto nla_put_failure;
4621
4622         nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
4623         if (nest == NULL)
4624                 goto nla_put_failure;
4625
4626         err = nf_tables_fill_setelem(skb, set, elem);
4627         if (err < 0)
4628                 goto nla_put_failure;
4629
4630         nla_nest_end(skb, nest);
4631
4632         nlmsg_end(skb, nlh);
4633         return 0;
4634
4635 nla_put_failure:
4636         nlmsg_trim(skb, nlh);
4637         return -1;
4638 }
4639
4640 static int nft_setelem_parse_flags(const struct nft_set *set,
4641                                    const struct nlattr *attr, u32 *flags)
4642 {
4643         if (attr == NULL)
4644                 return 0;
4645
4646         *flags = ntohl(nla_get_be32(attr));
4647         if (*flags & ~NFT_SET_ELEM_INTERVAL_END)
4648                 return -EINVAL;
4649         if (!(set->flags & NFT_SET_INTERVAL) &&
4650             *flags & NFT_SET_ELEM_INTERVAL_END)
4651                 return -EINVAL;
4652
4653         return 0;
4654 }
4655
4656 static int nft_setelem_parse_key(struct nft_ctx *ctx, struct nft_set *set,
4657                                  struct nft_data *key, struct nlattr *attr)
4658 {
4659         struct nft_data_desc desc;
4660         int err;
4661
4662         err = nft_data_init(ctx, key, NFT_DATA_VALUE_MAXLEN, &desc, attr);
4663         if (err < 0)
4664                 return err;
4665
4666         if (desc.type != NFT_DATA_VALUE || desc.len != set->klen) {
4667                 nft_data_release(key, desc.type);
4668                 return -EINVAL;
4669         }
4670
4671         return 0;
4672 }
4673
4674 static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set,
4675                                   struct nft_data_desc *desc,
4676                                   struct nft_data *data,
4677                                   struct nlattr *attr)
4678 {
4679         int err;
4680
4681         err = nft_data_init(ctx, data, NFT_DATA_VALUE_MAXLEN, desc, attr);
4682         if (err < 0)
4683                 return err;
4684
4685         if (desc->type != NFT_DATA_VERDICT && desc->len != set->dlen) {
4686                 nft_data_release(data, desc->type);
4687                 return -EINVAL;
4688         }
4689
4690         return 0;
4691 }
4692
4693 static int nft_get_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4694                             const struct nlattr *attr)
4695 {
4696         struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
4697         struct nft_set_elem elem;
4698         struct sk_buff *skb;
4699         uint32_t flags = 0;
4700         void *priv;
4701         int err;
4702
4703         err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
4704                                           nft_set_elem_policy, NULL);
4705         if (err < 0)
4706                 return err;
4707
4708         if (!nla[NFTA_SET_ELEM_KEY])
4709                 return -EINVAL;
4710
4711         err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
4712         if (err < 0)
4713                 return err;
4714
4715         err = nft_setelem_parse_key(ctx, set, &elem.key.val,
4716                                     nla[NFTA_SET_ELEM_KEY]);
4717         if (err < 0)
4718                 return err;
4719
4720         if (nla[NFTA_SET_ELEM_KEY_END]) {
4721                 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
4722                                             nla[NFTA_SET_ELEM_KEY_END]);
4723                 if (err < 0)
4724                         return err;
4725         }
4726
4727         priv = set->ops->get(ctx->net, set, &elem, flags);
4728         if (IS_ERR(priv))
4729                 return PTR_ERR(priv);
4730
4731         elem.priv = priv;
4732
4733         err = -ENOMEM;
4734         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
4735         if (skb == NULL)
4736                 goto err1;
4737
4738         err = nf_tables_fill_setelem_info(skb, ctx, ctx->seq, ctx->portid,
4739                                           NFT_MSG_NEWSETELEM, 0, set, &elem);
4740         if (err < 0)
4741                 goto err2;
4742
4743         err = nfnetlink_unicast(skb, ctx->net, ctx->portid, MSG_DONTWAIT);
4744         /* This avoids a loop in nfnetlink. */
4745         if (err < 0)
4746                 goto err1;
4747
4748         return 0;
4749 err2:
4750         kfree_skb(skb);
4751 err1:
4752         /* this avoids a loop in nfnetlink. */
4753         return err == -EAGAIN ? -ENOBUFS : err;
4754 }
4755
4756 /* called with rcu_read_lock held */
4757 static int nf_tables_getsetelem(struct net *net, struct sock *nlsk,
4758                                 struct sk_buff *skb, const struct nlmsghdr *nlh,
4759                                 const struct nlattr * const nla[],
4760                                 struct netlink_ext_ack *extack)
4761 {
4762         u8 genmask = nft_genmask_cur(net);
4763         struct nft_set *set;
4764         struct nlattr *attr;
4765         struct nft_ctx ctx;
4766         int rem, err = 0;
4767
4768         err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, extack,
4769                                          genmask);
4770         if (err < 0)
4771                 return err;
4772
4773         set = nft_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
4774         if (IS_ERR(set))
4775                 return PTR_ERR(set);
4776
4777         if (nlh->nlmsg_flags & NLM_F_DUMP) {
4778                 struct netlink_dump_control c = {
4779                         .start = nf_tables_dump_set_start,
4780                         .dump = nf_tables_dump_set,
4781                         .done = nf_tables_dump_set_done,
4782                         .module = THIS_MODULE,
4783                 };
4784                 struct nft_set_dump_ctx dump_ctx = {
4785                         .set = set,
4786                         .ctx = ctx,
4787                 };
4788
4789                 c.data = &dump_ctx;
4790                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
4791         }
4792
4793         if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
4794                 return -EINVAL;
4795
4796         nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
4797                 err = nft_get_set_elem(&ctx, set, attr);
4798                 if (err < 0)
4799                         break;
4800         }
4801
4802         return err;
4803 }
4804
4805 static void nf_tables_setelem_notify(const struct nft_ctx *ctx,
4806                                      const struct nft_set *set,
4807                                      const struct nft_set_elem *elem,
4808                                      int event, u16 flags)
4809 {
4810         struct net *net = ctx->net;
4811         u32 portid = ctx->portid;
4812         struct sk_buff *skb;
4813         int err;
4814
4815         if (!ctx->report && !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
4816                 return;
4817
4818         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
4819         if (skb == NULL)
4820                 goto err;
4821
4822         err = nf_tables_fill_setelem_info(skb, ctx, 0, portid, event, flags,
4823                                           set, elem);
4824         if (err < 0) {
4825                 kfree_skb(skb);
4826                 goto err;
4827         }
4828
4829         nfnetlink_send(skb, net, portid, NFNLGRP_NFTABLES, ctx->report,
4830                        GFP_KERNEL);
4831         return;
4832 err:
4833         nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
4834 }
4835
4836 static struct nft_trans *nft_trans_elem_alloc(struct nft_ctx *ctx,
4837                                               int msg_type,
4838                                               struct nft_set *set)
4839 {
4840         struct nft_trans *trans;
4841
4842         trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_elem));
4843         if (trans == NULL)
4844                 return NULL;
4845
4846         nft_trans_elem_set(trans) = set;
4847         return trans;
4848 }
4849
4850 struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx,
4851                                          const struct nft_set *set,
4852                                          const struct nlattr *attr)
4853 {
4854         struct nft_expr *expr;
4855         int err;
4856
4857         expr = nft_expr_init(ctx, attr);
4858         if (IS_ERR(expr))
4859                 return expr;
4860
4861         err = -EOPNOTSUPP;
4862         if (!(expr->ops->type->flags & NFT_EXPR_STATEFUL))
4863                 goto err_set_elem_expr;
4864
4865         if (expr->ops->type->flags & NFT_EXPR_GC) {
4866                 if (set->flags & NFT_SET_TIMEOUT)
4867                         goto err_set_elem_expr;
4868                 if (!set->ops->gc_init)
4869                         goto err_set_elem_expr;
4870                 set->ops->gc_init(set);
4871         }
4872
4873         return expr;
4874
4875 err_set_elem_expr:
4876         nft_expr_destroy(ctx, expr);
4877         return ERR_PTR(err);
4878 }
4879
4880 void *nft_set_elem_init(const struct nft_set *set,
4881                         const struct nft_set_ext_tmpl *tmpl,
4882                         const u32 *key, const u32 *key_end,
4883                         const u32 *data, u64 timeout, u64 expiration, gfp_t gfp)
4884 {
4885         struct nft_set_ext *ext;
4886         void *elem;
4887
4888         elem = kzalloc(set->ops->elemsize + tmpl->len, gfp);
4889         if (elem == NULL)
4890                 return NULL;
4891
4892         ext = nft_set_elem_ext(set, elem);
4893         nft_set_ext_init(ext, tmpl);
4894
4895         memcpy(nft_set_ext_key(ext), key, set->klen);
4896         if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END))
4897                 memcpy(nft_set_ext_key_end(ext), key_end, set->klen);
4898         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
4899                 memcpy(nft_set_ext_data(ext), data, set->dlen);
4900         if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) {
4901                 *nft_set_ext_expiration(ext) = get_jiffies_64() + expiration;
4902                 if (expiration == 0)
4903                         *nft_set_ext_expiration(ext) += timeout;
4904         }
4905         if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT))
4906                 *nft_set_ext_timeout(ext) = timeout;
4907
4908         return elem;
4909 }
4910
4911 static void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
4912                                       struct nft_expr *expr)
4913 {
4914         if (expr->ops->destroy_clone) {
4915                 expr->ops->destroy_clone(ctx, expr);
4916                 module_put(expr->ops->type->owner);
4917         } else {
4918                 nf_tables_expr_destroy(ctx, expr);
4919         }
4920 }
4921
4922 void nft_set_elem_destroy(const struct nft_set *set, void *elem,
4923                           bool destroy_expr)
4924 {
4925         struct nft_set_ext *ext = nft_set_elem_ext(set, elem);
4926         struct nft_ctx ctx = {
4927                 .net    = read_pnet(&set->net),
4928                 .family = set->table->family,
4929         };
4930
4931         nft_data_release(nft_set_ext_key(ext), NFT_DATA_VALUE);
4932         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
4933                 nft_data_release(nft_set_ext_data(ext), set->dtype);
4934         if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPR))
4935                 nft_set_elem_expr_destroy(&ctx, nft_set_ext_expr(ext));
4936
4937         if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
4938                 (*nft_set_ext_obj(ext))->use--;
4939         kfree(elem);
4940 }
4941 EXPORT_SYMBOL_GPL(nft_set_elem_destroy);
4942
4943 /* Only called from commit path, nft_set_elem_deactivate() already deals with
4944  * the refcounting from the preparation phase.
4945  */
4946 static void nf_tables_set_elem_destroy(const struct nft_ctx *ctx,
4947                                        const struct nft_set *set, void *elem)
4948 {
4949         struct nft_set_ext *ext = nft_set_elem_ext(set, elem);
4950
4951         if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR))
4952                 nft_set_elem_expr_destroy(ctx, nft_set_ext_expr(ext));
4953
4954         kfree(elem);
4955 }
4956
4957 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
4958                             const struct nlattr *attr, u32 nlmsg_flags)
4959 {
4960         struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
4961         u8 genmask = nft_genmask_next(ctx->net);
4962         struct nft_set_ext_tmpl tmpl;
4963         struct nft_set_ext *ext, *ext2;
4964         struct nft_set_elem elem;
4965         struct nft_set_binding *binding;
4966         struct nft_object *obj = NULL;
4967         struct nft_expr *expr = NULL;
4968         struct nft_userdata *udata;
4969         struct nft_data_desc desc;
4970         enum nft_registers dreg;
4971         struct nft_trans *trans;
4972         u32 flags = 0;
4973         u64 timeout;
4974         u64 expiration;
4975         u8 ulen;
4976         int err;
4977
4978         err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
4979                                           nft_set_elem_policy, NULL);
4980         if (err < 0)
4981                 return err;
4982
4983         if (nla[NFTA_SET_ELEM_KEY] == NULL)
4984                 return -EINVAL;
4985
4986         nft_set_ext_prepare(&tmpl);
4987
4988         err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
4989         if (err < 0)
4990                 return err;
4991         if (flags != 0)
4992                 nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
4993
4994         if (set->flags & NFT_SET_MAP) {
4995                 if (nla[NFTA_SET_ELEM_DATA] == NULL &&
4996                     !(flags & NFT_SET_ELEM_INTERVAL_END))
4997                         return -EINVAL;
4998         } else {
4999                 if (nla[NFTA_SET_ELEM_DATA] != NULL)
5000                         return -EINVAL;
5001         }
5002
5003         if ((flags & NFT_SET_ELEM_INTERVAL_END) &&
5004              (nla[NFTA_SET_ELEM_DATA] ||
5005               nla[NFTA_SET_ELEM_OBJREF] ||
5006               nla[NFTA_SET_ELEM_TIMEOUT] ||
5007               nla[NFTA_SET_ELEM_EXPIRATION] ||
5008               nla[NFTA_SET_ELEM_USERDATA] ||
5009               nla[NFTA_SET_ELEM_EXPR]))
5010                 return -EINVAL;
5011
5012         timeout = 0;
5013         if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
5014                 if (!(set->flags & NFT_SET_TIMEOUT))
5015                         return -EINVAL;
5016                 err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_TIMEOUT],
5017                                             &timeout);
5018                 if (err)
5019                         return err;
5020         } else if (set->flags & NFT_SET_TIMEOUT) {
5021                 timeout = set->timeout;
5022         }
5023
5024         expiration = 0;
5025         if (nla[NFTA_SET_ELEM_EXPIRATION] != NULL) {
5026                 if (!(set->flags & NFT_SET_TIMEOUT))
5027                         return -EINVAL;
5028                 err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_EXPIRATION],
5029                                             &expiration);
5030                 if (err)
5031                         return err;
5032         }
5033
5034         if (nla[NFTA_SET_ELEM_EXPR] != NULL) {
5035                 expr = nft_set_elem_expr_alloc(ctx, set,
5036                                                nla[NFTA_SET_ELEM_EXPR]);
5037                 if (IS_ERR(expr))
5038                         return PTR_ERR(expr);
5039
5040                 err = -EOPNOTSUPP;
5041                 if (set->expr && set->expr->ops != expr->ops)
5042                         goto err_set_elem_expr;
5043         } else if (set->expr) {
5044                 expr = kzalloc(set->expr->ops->size, GFP_KERNEL);
5045                 if (!expr)
5046                         return -ENOMEM;
5047
5048                 err = nft_expr_clone(expr, set->expr);
5049                 if (err < 0)
5050                         goto err_set_elem_expr;
5051         }
5052
5053         err = nft_setelem_parse_key(ctx, set, &elem.key.val,
5054                                     nla[NFTA_SET_ELEM_KEY]);
5055         if (err < 0)
5056                 goto err_set_elem_expr;
5057
5058         nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
5059
5060         if (nla[NFTA_SET_ELEM_KEY_END]) {
5061                 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
5062                                             nla[NFTA_SET_ELEM_KEY_END]);
5063                 if (err < 0)
5064                         goto err_parse_key;
5065
5066                 nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
5067         }
5068
5069         if (timeout > 0) {
5070                 nft_set_ext_add(&tmpl, NFT_SET_EXT_EXPIRATION);
5071                 if (timeout != set->timeout)
5072                         nft_set_ext_add(&tmpl, NFT_SET_EXT_TIMEOUT);
5073         }
5074
5075         if (expr)
5076                 nft_set_ext_add_length(&tmpl, NFT_SET_EXT_EXPR,
5077                                        expr->ops->size);
5078
5079         if (nla[NFTA_SET_ELEM_OBJREF] != NULL) {
5080                 if (!(set->flags & NFT_SET_OBJECT)) {
5081                         err = -EINVAL;
5082                         goto err_parse_key_end;
5083                 }
5084                 obj = nft_obj_lookup(ctx->net, ctx->table,
5085                                      nla[NFTA_SET_ELEM_OBJREF],
5086                                      set->objtype, genmask);
5087                 if (IS_ERR(obj)) {
5088                         err = PTR_ERR(obj);
5089                         goto err_parse_key_end;
5090                 }
5091                 nft_set_ext_add(&tmpl, NFT_SET_EXT_OBJREF);
5092         }
5093
5094         if (nla[NFTA_SET_ELEM_DATA] != NULL) {
5095                 err = nft_setelem_parse_data(ctx, set, &desc, &elem.data.val,
5096                                              nla[NFTA_SET_ELEM_DATA]);
5097                 if (err < 0)
5098                         goto err_parse_key_end;
5099
5100                 dreg = nft_type_to_reg(set->dtype);
5101                 list_for_each_entry(binding, &set->bindings, list) {
5102                         struct nft_ctx bind_ctx = {
5103                                 .net    = ctx->net,
5104                                 .family = ctx->family,
5105                                 .table  = ctx->table,
5106                                 .chain  = (struct nft_chain *)binding->chain,
5107                         };
5108
5109                         if (!(binding->flags & NFT_SET_MAP))
5110                                 continue;
5111
5112                         err = nft_validate_register_store(&bind_ctx, dreg,
5113                                                           &elem.data.val,
5114                                                           desc.type, desc.len);
5115                         if (err < 0)
5116                                 goto err_parse_data;
5117
5118                         if (desc.type == NFT_DATA_VERDICT &&
5119                             (elem.data.val.verdict.code == NFT_GOTO ||
5120                              elem.data.val.verdict.code == NFT_JUMP))
5121                                 nft_validate_state_update(ctx->net,
5122                                                           NFT_VALIDATE_NEED);
5123                 }
5124
5125                 nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, desc.len);
5126         }
5127
5128         /* The full maximum length of userdata can exceed the maximum
5129          * offset value (U8_MAX) for following extensions, therefor it
5130          * must be the last extension added.
5131          */
5132         ulen = 0;
5133         if (nla[NFTA_SET_ELEM_USERDATA] != NULL) {
5134                 ulen = nla_len(nla[NFTA_SET_ELEM_USERDATA]);
5135                 if (ulen > 0)
5136                         nft_set_ext_add_length(&tmpl, NFT_SET_EXT_USERDATA,
5137                                                ulen);
5138         }
5139
5140         err = -ENOMEM;
5141         elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
5142                                       elem.key_end.val.data, elem.data.val.data,
5143                                       timeout, expiration, GFP_KERNEL);
5144         if (elem.priv == NULL)
5145                 goto err_parse_data;
5146
5147         ext = nft_set_elem_ext(set, elem.priv);
5148         if (flags)
5149                 *nft_set_ext_flags(ext) = flags;
5150         if (ulen > 0) {
5151                 udata = nft_set_ext_userdata(ext);
5152                 udata->len = ulen - 1;
5153                 nla_memcpy(&udata->data, nla[NFTA_SET_ELEM_USERDATA], ulen);
5154         }
5155         if (obj) {
5156                 *nft_set_ext_obj(ext) = obj;
5157                 obj->use++;
5158         }
5159         if (expr) {
5160                 memcpy(nft_set_ext_expr(ext), expr, expr->ops->size);
5161                 kfree(expr);
5162                 expr = NULL;
5163         }
5164
5165         trans = nft_trans_elem_alloc(ctx, NFT_MSG_NEWSETELEM, set);
5166         if (trans == NULL)
5167                 goto err_trans;
5168
5169         ext->genmask = nft_genmask_cur(ctx->net) | NFT_SET_ELEM_BUSY_MASK;
5170         err = set->ops->insert(ctx->net, set, &elem, &ext2);
5171         if (err) {
5172                 if (err == -EEXIST) {
5173                         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) ^
5174                             nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) ||
5175                             nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) ^
5176                             nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF)) {
5177                                 err = -EBUSY;
5178                                 goto err_element_clash;
5179                         }
5180                         if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
5181                              nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) &&
5182                              memcmp(nft_set_ext_data(ext),
5183                                     nft_set_ext_data(ext2), set->dlen) != 0) ||
5184                             (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
5185                              nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF) &&
5186                              *nft_set_ext_obj(ext) != *nft_set_ext_obj(ext2)))
5187                                 err = -EBUSY;
5188                         else if (!(nlmsg_flags & NLM_F_EXCL))
5189                                 err = 0;
5190                 } else if (err == -ENOTEMPTY) {
5191                         /* ENOTEMPTY reports overlapping between this element
5192                          * and an existing one.
5193                          */
5194                         err = -EEXIST;
5195                 }
5196                 goto err_element_clash;
5197         }
5198
5199         if (set->size &&
5200             !atomic_add_unless(&set->nelems, 1, set->size + set->ndeact)) {
5201                 err = -ENFILE;
5202                 goto err_set_full;
5203         }
5204
5205         nft_trans_elem(trans) = elem;
5206         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
5207         return 0;
5208
5209 err_set_full:
5210         set->ops->remove(ctx->net, set, &elem);
5211 err_element_clash:
5212         kfree(trans);
5213 err_trans:
5214         if (obj)
5215                 obj->use--;
5216
5217         nf_tables_set_elem_destroy(ctx, set, elem.priv);
5218 err_parse_data:
5219         if (nla[NFTA_SET_ELEM_DATA] != NULL)
5220                 nft_data_release(&elem.data.val, desc.type);
5221 err_parse_key_end:
5222         nft_data_release(&elem.key_end.val, NFT_DATA_VALUE);
5223 err_parse_key:
5224         nft_data_release(&elem.key.val, NFT_DATA_VALUE);
5225 err_set_elem_expr:
5226         if (expr != NULL)
5227                 nft_expr_destroy(ctx, expr);
5228
5229         return err;
5230 }
5231
5232 static int nf_tables_newsetelem(struct net *net, struct sock *nlsk,
5233                                 struct sk_buff *skb, const struct nlmsghdr *nlh,
5234                                 const struct nlattr * const nla[],
5235                                 struct netlink_ext_ack *extack)
5236 {
5237         u8 genmask = nft_genmask_next(net);
5238         const struct nlattr *attr;
5239         struct nft_set *set;
5240         struct nft_ctx ctx;
5241         int rem, err;
5242
5243         if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
5244                 return -EINVAL;
5245
5246         err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, extack,
5247                                          genmask);
5248         if (err < 0)
5249                 return err;
5250
5251         set = nft_set_lookup_global(net, ctx.table, nla[NFTA_SET_ELEM_LIST_SET],
5252                                     nla[NFTA_SET_ELEM_LIST_SET_ID], genmask);
5253         if (IS_ERR(set))
5254                 return PTR_ERR(set);
5255
5256         if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT)
5257                 return -EBUSY;
5258
5259         nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
5260                 err = nft_add_set_elem(&ctx, set, attr, nlh->nlmsg_flags);
5261                 if (err < 0)
5262                         return err;
5263         }
5264
5265         if (net->nft.validate_state == NFT_VALIDATE_DO)
5266                 return nft_table_validate(net, ctx.table);
5267
5268         return 0;
5269 }
5270
5271 /**
5272  *      nft_data_hold - hold a nft_data item
5273  *
5274  *      @data: struct nft_data to release
5275  *      @type: type of data
5276  *
5277  *      Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
5278  *      NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
5279  *      NFT_GOTO verdicts. This function must be called on active data objects
5280  *      from the second phase of the commit protocol.
5281  */
5282 void nft_data_hold(const struct nft_data *data, enum nft_data_types type)
5283 {
5284         if (type == NFT_DATA_VERDICT) {
5285                 switch (data->verdict.code) {
5286                 case NFT_JUMP:
5287                 case NFT_GOTO:
5288                         data->verdict.chain->use++;
5289                         break;
5290                 }
5291         }
5292 }
5293
5294 static void nft_set_elem_activate(const struct net *net,
5295                                   const struct nft_set *set,
5296                                   struct nft_set_elem *elem)
5297 {
5298         const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
5299
5300         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
5301                 nft_data_hold(nft_set_ext_data(ext), set->dtype);
5302         if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
5303                 (*nft_set_ext_obj(ext))->use++;
5304 }
5305
5306 static void nft_set_elem_deactivate(const struct net *net,
5307                                     const struct nft_set *set,
5308                                     struct nft_set_elem *elem)
5309 {
5310         const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
5311
5312         if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
5313                 nft_data_release(nft_set_ext_data(ext), set->dtype);
5314         if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
5315                 (*nft_set_ext_obj(ext))->use--;
5316 }
5317
5318 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
5319                            const struct nlattr *attr)
5320 {
5321         struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
5322         struct nft_set_ext_tmpl tmpl;
5323         struct nft_set_elem elem;
5324         struct nft_set_ext *ext;
5325         struct nft_trans *trans;
5326         u32 flags = 0;
5327         void *priv;
5328         int err;
5329
5330         err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
5331                                           nft_set_elem_policy, NULL);
5332         if (err < 0)
5333                 return err;
5334
5335         if (nla[NFTA_SET_ELEM_KEY] == NULL)
5336                 return -EINVAL;
5337
5338         nft_set_ext_prepare(&tmpl);
5339
5340         err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
5341         if (err < 0)
5342                 return err;
5343         if (flags != 0)
5344                 nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
5345
5346         err = nft_setelem_parse_key(ctx, set, &elem.key.val,
5347                                     nla[NFTA_SET_ELEM_KEY]);
5348         if (err < 0)
5349                 return err;
5350
5351         nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
5352
5353         if (nla[NFTA_SET_ELEM_KEY_END]) {
5354                 err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
5355                                             nla[NFTA_SET_ELEM_KEY_END]);
5356                 if (err < 0)
5357                         return err;
5358
5359                 nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
5360         }
5361
5362         err = -ENOMEM;
5363         elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
5364                                       elem.key_end.val.data, NULL, 0, 0,
5365                                       GFP_KERNEL);
5366         if (elem.priv == NULL)
5367                 goto fail_elem;
5368
5369         ext = nft_set_elem_ext(set, elem.priv);
5370         if (flags)
5371                 *nft_set_ext_flags(ext) = flags;
5372
5373         trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
5374         if (trans == NULL)
5375                 goto fail_trans;
5376
5377         priv = set->ops->deactivate(ctx->net, set, &elem);
5378         if (priv == NULL) {
5379                 err = -ENOENT;
5380                 goto fail_ops;
5381         }
5382         kfree(elem.priv);
5383         elem.priv = priv;
5384
5385         nft_set_elem_deactivate(ctx->net, set, &elem);
5386
5387         nft_trans_elem(trans) = elem;
5388         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
5389         return 0;
5390
5391 fail_ops:
5392         kfree(trans);
5393 fail_trans:
5394         kfree(elem.priv);
5395 fail_elem:
5396         nft_data_release(&elem.key.val, NFT_DATA_VALUE);
5397         return err;
5398 }
5399
5400 static int nft_flush_set(const struct nft_ctx *ctx,
5401                          struct nft_set *set,
5402                          const struct nft_set_iter *iter,
5403                          struct nft_set_elem *elem)
5404 {
5405         struct nft_trans *trans;
5406         int err;
5407
5408         trans = nft_trans_alloc_gfp(ctx, NFT_MSG_DELSETELEM,
5409                                     sizeof(struct nft_trans_elem), GFP_ATOMIC);
5410         if (!trans)
5411                 return -ENOMEM;
5412
5413         if (!set->ops->flush(ctx->net, set, elem->priv)) {
5414                 err = -ENOENT;
5415                 goto err1;
5416         }
5417         set->ndeact++;
5418
5419         nft_set_elem_deactivate(ctx->net, set, elem);
5420         nft_trans_elem_set(trans) = set;
5421         nft_trans_elem(trans) = *elem;
5422         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
5423
5424         return 0;
5425 err1:
5426         kfree(trans);
5427         return err;
5428 }
5429
5430 static int nf_tables_delsetelem(struct net *net, struct sock *nlsk,
5431                                 struct sk_buff *skb, const struct nlmsghdr *nlh,
5432                                 const struct nlattr * const nla[],
5433                                 struct netlink_ext_ack *extack)
5434 {
5435         u8 genmask = nft_genmask_next(net);
5436         const struct nlattr *attr;
5437         struct nft_set *set;
5438         struct nft_ctx ctx;
5439         int rem, err = 0;
5440
5441         err = nft_ctx_init_from_elemattr(&ctx, net, skb, nlh, nla, extack,
5442                                          genmask);
5443         if (err < 0)
5444                 return err;
5445
5446         set = nft_set_lookup(ctx.table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
5447         if (IS_ERR(set))
5448                 return PTR_ERR(set);
5449         if (!list_empty(&set->bindings) && set->flags & NFT_SET_CONSTANT)
5450                 return -EBUSY;
5451
5452         if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL) {
5453                 struct nft_set_iter iter = {
5454                         .genmask        = genmask,
5455                         .fn             = nft_flush_set,
5456                 };
5457                 set->ops->walk(&ctx, set, &iter);
5458
5459                 return iter.err;
5460         }
5461
5462         nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
5463                 err = nft_del_setelem(&ctx, set, attr);
5464                 if (err < 0)
5465                         break;
5466
5467                 set->ndeact++;
5468         }
5469         return err;
5470 }
5471
5472 void nft_set_gc_batch_release(struct rcu_head *rcu)
5473 {
5474         struct nft_set_gc_batch *gcb;
5475         unsigned int i;
5476
5477         gcb = container_of(rcu, struct nft_set_gc_batch, head.rcu);
5478         for (i = 0; i < gcb->head.cnt; i++)
5479                 nft_set_elem_destroy(gcb->head.set, gcb->elems[i], true);
5480         kfree(gcb);
5481 }
5482
5483 struct nft_set_gc_batch *nft_set_gc_batch_alloc(const struct nft_set *set,
5484                                                 gfp_t gfp)
5485 {
5486         struct nft_set_gc_batch *gcb;
5487
5488         gcb = kzalloc(sizeof(*gcb), gfp);
5489         if (gcb == NULL)
5490                 return gcb;
5491         gcb->head.set = set;
5492         return gcb;
5493 }
5494
5495 /*
5496  * Stateful objects
5497  */
5498
5499 /**
5500  *      nft_register_obj- register nf_tables stateful object type
5501  *      @obj: object type
5502  *
5503  *      Registers the object type for use with nf_tables. Returns zero on
5504  *      success or a negative errno code otherwise.
5505  */
5506 int nft_register_obj(struct nft_object_type *obj_type)
5507 {
5508         if (obj_type->type == NFT_OBJECT_UNSPEC)
5509                 return -EINVAL;
5510
5511         nfnl_lock(NFNL_SUBSYS_NFTABLES);
5512         list_add_rcu(&obj_type->list, &nf_tables_objects);
5513         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
5514         return 0;
5515 }
5516 EXPORT_SYMBOL_GPL(nft_register_obj);
5517
5518 /**
5519  *      nft_unregister_obj - unregister nf_tables object type
5520  *      @obj: object type
5521  *
5522  *      Unregisters the object type for use with nf_tables.
5523  */
5524 void nft_unregister_obj(struct nft_object_type *obj_type)
5525 {
5526         nfnl_lock(NFNL_SUBSYS_NFTABLES);
5527         list_del_rcu(&obj_type->list);
5528         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
5529 }
5530 EXPORT_SYMBOL_GPL(nft_unregister_obj);
5531
5532 struct nft_object *nft_obj_lookup(const struct net *net,
5533                                   const struct nft_table *table,
5534                                   const struct nlattr *nla, u32 objtype,
5535                                   u8 genmask)
5536 {
5537         struct nft_object_hash_key k = { .table = table };
5538         char search[NFT_OBJ_MAXNAMELEN];
5539         struct rhlist_head *tmp, *list;
5540         struct nft_object *obj;
5541
5542         nla_strlcpy(search, nla, sizeof(search));
5543         k.name = search;
5544
5545         WARN_ON_ONCE(!rcu_read_lock_held() &&
5546                      !lockdep_commit_lock_is_held(net));
5547
5548         rcu_read_lock();
5549         list = rhltable_lookup(&nft_objname_ht, &k, nft_objname_ht_params);
5550         if (!list)
5551                 goto out;
5552
5553         rhl_for_each_entry_rcu(obj, tmp, list, rhlhead) {
5554                 if (objtype == obj->ops->type->type &&
5555                     nft_active_genmask(obj, genmask)) {
5556                         rcu_read_unlock();
5557                         return obj;
5558                 }
5559         }
5560 out:
5561         rcu_read_unlock();
5562         return ERR_PTR(-ENOENT);
5563 }
5564 EXPORT_SYMBOL_GPL(nft_obj_lookup);
5565
5566 static struct nft_object *nft_obj_lookup_byhandle(const struct nft_table *table,
5567                                                   const struct nlattr *nla,
5568                                                   u32 objtype, u8 genmask)
5569 {
5570         struct nft_object *obj;
5571
5572         list_for_each_entry(obj, &table->objects, list) {
5573                 if (be64_to_cpu(nla_get_be64(nla)) == obj->handle &&
5574                     objtype == obj->ops->type->type &&
5575                     nft_active_genmask(obj, genmask))
5576                         return obj;
5577         }
5578         return ERR_PTR(-ENOENT);
5579 }
5580
5581 static const struct nla_policy nft_obj_policy[NFTA_OBJ_MAX + 1] = {
5582         [NFTA_OBJ_TABLE]        = { .type = NLA_STRING,
5583                                     .len = NFT_TABLE_MAXNAMELEN - 1 },
5584         [NFTA_OBJ_NAME]         = { .type = NLA_STRING,
5585                                     .len = NFT_OBJ_MAXNAMELEN - 1 },
5586         [NFTA_OBJ_TYPE]         = { .type = NLA_U32 },
5587         [NFTA_OBJ_DATA]         = { .type = NLA_NESTED },
5588         [NFTA_OBJ_HANDLE]       = { .type = NLA_U64},
5589 };
5590
5591 static struct nft_object *nft_obj_init(const struct nft_ctx *ctx,
5592                                        const struct nft_object_type *type,
5593                                        const struct nlattr *attr)
5594 {
5595         struct nlattr **tb;
5596         const struct nft_object_ops *ops;
5597         struct nft_object *obj;
5598         int err = -ENOMEM;
5599
5600         tb = kmalloc_array(type->maxattr + 1, sizeof(*tb), GFP_KERNEL);
5601         if (!tb)
5602                 goto err1;
5603
5604         if (attr) {
5605                 err = nla_parse_nested_deprecated(tb, type->maxattr, attr,
5606                                                   type->policy, NULL);
5607                 if (err < 0)
5608                         goto err2;
5609         } else {
5610                 memset(tb, 0, sizeof(tb[0]) * (type->maxattr + 1));
5611         }
5612
5613         if (type->select_ops) {
5614                 ops = type->select_ops(ctx, (const struct nlattr * const *)tb);
5615                 if (IS_ERR(ops)) {
5616                         err = PTR_ERR(ops);
5617                         goto err2;
5618                 }
5619         } else {
5620                 ops = type->ops;
5621         }
5622
5623         err = -ENOMEM;
5624         obj = kzalloc(sizeof(*obj) + ops->size, GFP_KERNEL);
5625         if (!obj)
5626                 goto err2;
5627
5628         err = ops->init(ctx, (const struct nlattr * const *)tb, obj);
5629         if (err < 0)
5630                 goto err3;
5631
5632         obj->ops = ops;
5633
5634         kfree(tb);
5635         return obj;
5636 err3:
5637         kfree(obj);
5638 err2:
5639         kfree(tb);
5640 err1:
5641         return ERR_PTR(err);
5642 }
5643
5644 static int nft_object_dump(struct sk_buff *skb, unsigned int attr,
5645                            struct nft_object *obj, bool reset)
5646 {
5647         struct nlattr *nest;
5648
5649         nest = nla_nest_start_noflag(skb, attr);
5650         if (!nest)
5651                 goto nla_put_failure;
5652         if (obj->ops->dump(skb, obj, reset) < 0)
5653                 goto nla_put_failure;
5654         nla_nest_end(skb, nest);
5655         return 0;
5656
5657 nla_put_failure:
5658         return -1;
5659 }
5660
5661 static const struct nft_object_type *__nft_obj_type_get(u32 objtype)
5662 {
5663         const struct nft_object_type *type;
5664
5665         list_for_each_entry(type, &nf_tables_objects, list) {
5666                 if (objtype == type->type)
5667                         return type;
5668         }
5669         return NULL;
5670 }
5671
5672 static const struct nft_object_type *
5673 nft_obj_type_get(struct net *net, u32 objtype)
5674 {
5675         const struct nft_object_type *type;
5676
5677         type = __nft_obj_type_get(objtype);
5678         if (type != NULL && try_module_get(type->owner))
5679                 return type;
5680
5681         lockdep_nfnl_nft_mutex_not_held();
5682 #ifdef CONFIG_MODULES
5683         if (type == NULL) {
5684                 if (nft_request_module(net, "nft-obj-%u", objtype) == -EAGAIN)
5685                         return ERR_PTR(-EAGAIN);
5686         }
5687 #endif
5688         return ERR_PTR(-ENOENT);
5689 }
5690
5691 static int nf_tables_updobj(const struct nft_ctx *ctx,
5692                             const struct nft_object_type *type,
5693                             const struct nlattr *attr,
5694                             struct nft_object *obj)
5695 {
5696         struct nft_object *newobj;
5697         struct nft_trans *trans;
5698         int err;
5699
5700         trans = nft_trans_alloc(ctx, NFT_MSG_NEWOBJ,
5701                                 sizeof(struct nft_trans_obj));
5702         if (!trans)
5703                 return -ENOMEM;
5704
5705         newobj = nft_obj_init(ctx, type, attr);
5706         if (IS_ERR(newobj)) {
5707                 err = PTR_ERR(newobj);
5708                 goto err_free_trans;
5709         }
5710
5711         nft_trans_obj(trans) = obj;
5712         nft_trans_obj_update(trans) = true;
5713         nft_trans_obj_newobj(trans) = newobj;
5714         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
5715
5716         return 0;
5717
5718 err_free_trans:
5719         kfree(trans);
5720         return err;
5721 }
5722
5723 static int nf_tables_newobj(struct net *net, struct sock *nlsk,
5724                             struct sk_buff *skb, const struct nlmsghdr *nlh,
5725                             const struct nlattr * const nla[],
5726                             struct netlink_ext_ack *extack)
5727 {
5728         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
5729         const struct nft_object_type *type;
5730         u8 genmask = nft_genmask_next(net);
5731         int family = nfmsg->nfgen_family;
5732         struct nft_table *table;
5733         struct nft_object *obj;
5734         struct nft_ctx ctx;
5735         u32 objtype;
5736         int err;
5737
5738         if (!nla[NFTA_OBJ_TYPE] ||
5739             !nla[NFTA_OBJ_NAME] ||
5740             !nla[NFTA_OBJ_DATA])
5741                 return -EINVAL;
5742
5743         table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask);
5744         if (IS_ERR(table)) {
5745                 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
5746                 return PTR_ERR(table);
5747         }
5748
5749         objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
5750         obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
5751         if (IS_ERR(obj)) {
5752                 err = PTR_ERR(obj);
5753                 if (err != -ENOENT) {
5754                         NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
5755                         return err;
5756                 }
5757         } else {
5758                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
5759                         NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
5760                         return -EEXIST;
5761                 }
5762                 if (nlh->nlmsg_flags & NLM_F_REPLACE)
5763                         return -EOPNOTSUPP;
5764
5765                 type = __nft_obj_type_get(objtype);
5766                 nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
5767
5768                 return nf_tables_updobj(&ctx, type, nla[NFTA_OBJ_DATA], obj);
5769         }
5770
5771         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
5772
5773         type = nft_obj_type_get(net, objtype);
5774         if (IS_ERR(type))
5775                 return PTR_ERR(type);
5776
5777         obj = nft_obj_init(&ctx, type, nla[NFTA_OBJ_DATA]);
5778         if (IS_ERR(obj)) {
5779                 err = PTR_ERR(obj);
5780                 goto err1;
5781         }
5782         obj->key.table = table;
5783         obj->handle = nf_tables_alloc_handle(table);
5784
5785         obj->key.name = nla_strdup(nla[NFTA_OBJ_NAME], GFP_KERNEL);
5786         if (!obj->key.name) {
5787                 err = -ENOMEM;
5788                 goto err2;
5789         }
5790
5791         err = nft_trans_obj_add(&ctx, NFT_MSG_NEWOBJ, obj);
5792         if (err < 0)
5793                 goto err3;
5794
5795         err = rhltable_insert(&nft_objname_ht, &obj->rhlhead,
5796                               nft_objname_ht_params);
5797         if (err < 0)
5798                 goto err4;
5799
5800         list_add_tail_rcu(&obj->list, &table->objects);
5801         table->use++;
5802         return 0;
5803 err4:
5804         /* queued in transaction log */
5805         INIT_LIST_HEAD(&obj->list);
5806         return err;
5807 err3:
5808         kfree(obj->key.name);
5809 err2:
5810         if (obj->ops->destroy)
5811                 obj->ops->destroy(&ctx, obj);
5812         kfree(obj);
5813 err1:
5814         module_put(type->owner);
5815         return err;
5816 }
5817
5818 static int nf_tables_fill_obj_info(struct sk_buff *skb, struct net *net,
5819                                    u32 portid, u32 seq, int event, u32 flags,
5820                                    int family, const struct nft_table *table,
5821                                    struct nft_object *obj, bool reset)
5822 {
5823         struct nfgenmsg *nfmsg;
5824         struct nlmsghdr *nlh;
5825
5826         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
5827         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
5828         if (nlh == NULL)
5829                 goto nla_put_failure;
5830
5831         nfmsg = nlmsg_data(nlh);
5832         nfmsg->nfgen_family     = family;
5833         nfmsg->version          = NFNETLINK_V0;
5834         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
5835
5836         if (nla_put_string(skb, NFTA_OBJ_TABLE, table->name) ||
5837             nla_put_string(skb, NFTA_OBJ_NAME, obj->key.name) ||
5838             nla_put_be32(skb, NFTA_OBJ_TYPE, htonl(obj->ops->type->type)) ||
5839             nla_put_be32(skb, NFTA_OBJ_USE, htonl(obj->use)) ||
5840             nft_object_dump(skb, NFTA_OBJ_DATA, obj, reset) ||
5841             nla_put_be64(skb, NFTA_OBJ_HANDLE, cpu_to_be64(obj->handle),
5842                          NFTA_OBJ_PAD))
5843                 goto nla_put_failure;
5844
5845         nlmsg_end(skb, nlh);
5846         return 0;
5847
5848 nla_put_failure:
5849         nlmsg_trim(skb, nlh);
5850         return -1;
5851 }
5852
5853 struct nft_obj_filter {
5854         char            *table;
5855         u32             type;
5856 };
5857
5858 static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
5859 {
5860         const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
5861         const struct nft_table *table;
5862         unsigned int idx = 0, s_idx = cb->args[0];
5863         struct nft_obj_filter *filter = cb->data;
5864         struct net *net = sock_net(skb->sk);
5865         int family = nfmsg->nfgen_family;
5866         struct nft_object *obj;
5867         bool reset = false;
5868
5869         if (NFNL_MSG_TYPE(cb->nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
5870                 reset = true;
5871
5872         rcu_read_lock();
5873         cb->seq = net->nft.base_seq;
5874
5875         list_for_each_entry_rcu(table, &net->nft.tables, list) {
5876                 if (family != NFPROTO_UNSPEC && family != table->family)
5877                         continue;
5878
5879                 list_for_each_entry_rcu(obj, &table->objects, list) {
5880                         if (!nft_is_active(net, obj))
5881                                 goto cont;
5882                         if (idx < s_idx)
5883                                 goto cont;
5884                         if (idx > s_idx)
5885                                 memset(&cb->args[1], 0,
5886                                        sizeof(cb->args) - sizeof(cb->args[0]));
5887                         if (filter && filter->table &&
5888                             strcmp(filter->table, table->name))
5889                                 goto cont;
5890                         if (filter &&
5891                             filter->type != NFT_OBJECT_UNSPEC &&
5892                             obj->ops->type->type != filter->type)
5893                                 goto cont;
5894
5895                         if (nf_tables_fill_obj_info(skb, net, NETLINK_CB(cb->skb).portid,
5896                                                     cb->nlh->nlmsg_seq,
5897                                                     NFT_MSG_NEWOBJ,
5898                                                     NLM_F_MULTI | NLM_F_APPEND,
5899                                                     table->family, table,
5900                                                     obj, reset) < 0)
5901                                 goto done;
5902
5903                         nl_dump_check_consistent(cb, nlmsg_hdr(skb));
5904 cont:
5905                         idx++;
5906                 }
5907         }
5908 done:
5909         rcu_read_unlock();
5910
5911         cb->args[0] = idx;
5912         return skb->len;
5913 }
5914
5915 static int nf_tables_dump_obj_start(struct netlink_callback *cb)
5916 {
5917         const struct nlattr * const *nla = cb->data;
5918         struct nft_obj_filter *filter = NULL;
5919
5920         if (nla[NFTA_OBJ_TABLE] || nla[NFTA_OBJ_TYPE]) {
5921                 filter = kzalloc(sizeof(*filter), GFP_ATOMIC);
5922                 if (!filter)
5923                         return -ENOMEM;
5924
5925                 if (nla[NFTA_OBJ_TABLE]) {
5926                         filter->table = nla_strdup(nla[NFTA_OBJ_TABLE], GFP_ATOMIC);
5927                         if (!filter->table) {
5928                                 kfree(filter);
5929                                 return -ENOMEM;
5930                         }
5931                 }
5932
5933                 if (nla[NFTA_OBJ_TYPE])
5934                         filter->type = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
5935         }
5936
5937         cb->data = filter;
5938         return 0;
5939 }
5940
5941 static int nf_tables_dump_obj_done(struct netlink_callback *cb)
5942 {
5943         struct nft_obj_filter *filter = cb->data;
5944
5945         if (filter) {
5946                 kfree(filter->table);
5947                 kfree(filter);
5948         }
5949
5950         return 0;
5951 }
5952
5953 /* called with rcu_read_lock held */
5954 static int nf_tables_getobj(struct net *net, struct sock *nlsk,
5955                             struct sk_buff *skb, const struct nlmsghdr *nlh,
5956                             const struct nlattr * const nla[],
5957                             struct netlink_ext_ack *extack)
5958 {
5959         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
5960         u8 genmask = nft_genmask_cur(net);
5961         int family = nfmsg->nfgen_family;
5962         const struct nft_table *table;
5963         struct nft_object *obj;
5964         struct sk_buff *skb2;
5965         bool reset = false;
5966         u32 objtype;
5967         int err;
5968
5969         if (nlh->nlmsg_flags & NLM_F_DUMP) {
5970                 struct netlink_dump_control c = {
5971                         .start = nf_tables_dump_obj_start,
5972                         .dump = nf_tables_dump_obj,
5973                         .done = nf_tables_dump_obj_done,
5974                         .module = THIS_MODULE,
5975                         .data = (void *)nla,
5976                 };
5977
5978                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
5979         }
5980
5981         if (!nla[NFTA_OBJ_NAME] ||
5982             !nla[NFTA_OBJ_TYPE])
5983                 return -EINVAL;
5984
5985         table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask);
5986         if (IS_ERR(table)) {
5987                 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
5988                 return PTR_ERR(table);
5989         }
5990
5991         objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
5992         obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
5993         if (IS_ERR(obj)) {
5994                 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
5995                 return PTR_ERR(obj);
5996         }
5997
5998         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
5999         if (!skb2)
6000                 return -ENOMEM;
6001
6002         if (NFNL_MSG_TYPE(nlh->nlmsg_type) == NFT_MSG_GETOBJ_RESET)
6003                 reset = true;
6004
6005         err = nf_tables_fill_obj_info(skb2, net, NETLINK_CB(skb).portid,
6006                                       nlh->nlmsg_seq, NFT_MSG_NEWOBJ, 0,
6007                                       family, table, obj, reset);
6008         if (err < 0)
6009                 goto err;
6010
6011         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
6012 err:
6013         kfree_skb(skb2);
6014         return err;
6015 }
6016
6017 static void nft_obj_destroy(const struct nft_ctx *ctx, struct nft_object *obj)
6018 {
6019         if (obj->ops->destroy)
6020                 obj->ops->destroy(ctx, obj);
6021
6022         module_put(obj->ops->type->owner);
6023         kfree(obj->key.name);
6024         kfree(obj);
6025 }
6026
6027 static int nf_tables_delobj(struct net *net, struct sock *nlsk,
6028                             struct sk_buff *skb, const struct nlmsghdr *nlh,
6029                             const struct nlattr * const nla[],
6030                             struct netlink_ext_ack *extack)
6031 {
6032         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
6033         u8 genmask = nft_genmask_next(net);
6034         int family = nfmsg->nfgen_family;
6035         const struct nlattr *attr;
6036         struct nft_table *table;
6037         struct nft_object *obj;
6038         struct nft_ctx ctx;
6039         u32 objtype;
6040
6041         if (!nla[NFTA_OBJ_TYPE] ||
6042             (!nla[NFTA_OBJ_NAME] && !nla[NFTA_OBJ_HANDLE]))
6043                 return -EINVAL;
6044
6045         table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask);
6046         if (IS_ERR(table)) {
6047                 NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
6048                 return PTR_ERR(table);
6049         }
6050
6051         objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
6052         if (nla[NFTA_OBJ_HANDLE]) {
6053                 attr = nla[NFTA_OBJ_HANDLE];
6054                 obj = nft_obj_lookup_byhandle(table, attr, objtype, genmask);
6055         } else {
6056                 attr = nla[NFTA_OBJ_NAME];
6057                 obj = nft_obj_lookup(net, table, attr, objtype, genmask);
6058         }
6059
6060         if (IS_ERR(obj)) {
6061                 NL_SET_BAD_ATTR(extack, attr);
6062                 return PTR_ERR(obj);
6063         }
6064         if (obj->use > 0) {
6065                 NL_SET_BAD_ATTR(extack, attr);
6066                 return -EBUSY;
6067         }
6068
6069         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
6070
6071         return nft_delobj(&ctx, obj);
6072 }
6073
6074 void nft_obj_notify(struct net *net, const struct nft_table *table,
6075                     struct nft_object *obj, u32 portid, u32 seq, int event,
6076                     int family, int report, gfp_t gfp)
6077 {
6078         struct sk_buff *skb;
6079         int err;
6080
6081         if (!report &&
6082             !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
6083                 return;
6084
6085         skb = nlmsg_new(NLMSG_GOODSIZE, gfp);
6086         if (skb == NULL)
6087                 goto err;
6088
6089         err = nf_tables_fill_obj_info(skb, net, portid, seq, event, 0, family,
6090                                       table, obj, false);
6091         if (err < 0) {
6092                 kfree_skb(skb);
6093                 goto err;
6094         }
6095
6096         nfnetlink_send(skb, net, portid, NFNLGRP_NFTABLES, report, gfp);
6097         return;
6098 err:
6099         nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
6100 }
6101 EXPORT_SYMBOL_GPL(nft_obj_notify);
6102
6103 static void nf_tables_obj_notify(const struct nft_ctx *ctx,
6104                                  struct nft_object *obj, int event)
6105 {
6106         nft_obj_notify(ctx->net, ctx->table, obj, ctx->portid, ctx->seq, event,
6107                        ctx->family, ctx->report, GFP_KERNEL);
6108 }
6109
6110 /*
6111  * Flow tables
6112  */
6113 void nft_register_flowtable_type(struct nf_flowtable_type *type)
6114 {
6115         nfnl_lock(NFNL_SUBSYS_NFTABLES);
6116         list_add_tail_rcu(&type->list, &nf_tables_flowtables);
6117         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
6118 }
6119 EXPORT_SYMBOL_GPL(nft_register_flowtable_type);
6120
6121 void nft_unregister_flowtable_type(struct nf_flowtable_type *type)
6122 {
6123         nfnl_lock(NFNL_SUBSYS_NFTABLES);
6124         list_del_rcu(&type->list);
6125         nfnl_unlock(NFNL_SUBSYS_NFTABLES);
6126 }
6127 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type);
6128
6129 static const struct nla_policy nft_flowtable_policy[NFTA_FLOWTABLE_MAX + 1] = {
6130         [NFTA_FLOWTABLE_TABLE]          = { .type = NLA_STRING,
6131                                             .len = NFT_NAME_MAXLEN - 1 },
6132         [NFTA_FLOWTABLE_NAME]           = { .type = NLA_STRING,
6133                                             .len = NFT_NAME_MAXLEN - 1 },
6134         [NFTA_FLOWTABLE_HOOK]           = { .type = NLA_NESTED },
6135         [NFTA_FLOWTABLE_HANDLE]         = { .type = NLA_U64 },
6136         [NFTA_FLOWTABLE_FLAGS]          = { .type = NLA_U32 },
6137 };
6138
6139 struct nft_flowtable *nft_flowtable_lookup(const struct nft_table *table,
6140                                            const struct nlattr *nla, u8 genmask)
6141 {
6142         struct nft_flowtable *flowtable;
6143
6144         list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
6145                 if (!nla_strcmp(nla, flowtable->name) &&
6146                     nft_active_genmask(flowtable, genmask))
6147                         return flowtable;
6148         }
6149         return ERR_PTR(-ENOENT);
6150 }
6151 EXPORT_SYMBOL_GPL(nft_flowtable_lookup);
6152
6153 void nf_tables_deactivate_flowtable(const struct nft_ctx *ctx,
6154                                     struct nft_flowtable *flowtable,
6155                                     enum nft_trans_phase phase)
6156 {
6157         switch (phase) {
6158         case NFT_TRANS_PREPARE:
6159         case NFT_TRANS_ABORT:
6160         case NFT_TRANS_RELEASE:
6161                 flowtable->use--;
6162                 /* fall through */
6163         default:
6164                 return;
6165         }
6166 }
6167 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable);
6168
6169 static struct nft_flowtable *
6170 nft_flowtable_lookup_byhandle(const struct nft_table *table,
6171                               const struct nlattr *nla, u8 genmask)
6172 {
6173        struct nft_flowtable *flowtable;
6174
6175        list_for_each_entry(flowtable, &table->flowtables, list) {
6176                if (be64_to_cpu(nla_get_be64(nla)) == flowtable->handle &&
6177                    nft_active_genmask(flowtable, genmask))
6178                        return flowtable;
6179        }
6180        return ERR_PTR(-ENOENT);
6181 }
6182
6183 struct nft_flowtable_hook {
6184         u32                     num;
6185         int                     priority;
6186         struct list_head        list;
6187 };
6188
6189 static const struct nla_policy nft_flowtable_hook_policy[NFTA_FLOWTABLE_HOOK_MAX + 1] = {
6190         [NFTA_FLOWTABLE_HOOK_NUM]       = { .type = NLA_U32 },
6191         [NFTA_FLOWTABLE_HOOK_PRIORITY]  = { .type = NLA_U32 },
6192         [NFTA_FLOWTABLE_HOOK_DEVS]      = { .type = NLA_NESTED },
6193 };
6194
6195 static int nft_flowtable_parse_hook(const struct nft_ctx *ctx,
6196                                     const struct nlattr *attr,
6197                                     struct nft_flowtable_hook *flowtable_hook,
6198                                     struct nft_flowtable *flowtable, bool add)
6199 {
6200         struct nlattr *tb[NFTA_FLOWTABLE_HOOK_MAX + 1];
6201         struct nft_hook *hook;
6202         int hooknum, priority;
6203         int err;
6204
6205         INIT_LIST_HEAD(&flowtable_hook->list);
6206
6207         err = nla_parse_nested_deprecated(tb, NFTA_FLOWTABLE_HOOK_MAX, attr,
6208                                           nft_flowtable_hook_policy, NULL);
6209         if (err < 0)
6210                 return err;
6211
6212         if (add) {
6213                 if (!tb[NFTA_FLOWTABLE_HOOK_NUM] ||
6214                     !tb[NFTA_FLOWTABLE_HOOK_PRIORITY])
6215                         return -EINVAL;
6216
6217                 hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
6218                 if (hooknum != NF_NETDEV_INGRESS)
6219                         return -EOPNOTSUPP;
6220
6221                 priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
6222
6223                 flowtable_hook->priority        = priority;
6224                 flowtable_hook->num             = hooknum;
6225         } else {
6226                 if (tb[NFTA_FLOWTABLE_HOOK_NUM]) {
6227                         hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
6228                         if (hooknum != flowtable->hooknum)
6229                                 return -EOPNOTSUPP;
6230                 }
6231
6232                 if (tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) {
6233                         priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
6234                         if (priority != flowtable->data.priority)
6235                                 return -EOPNOTSUPP;
6236                 }
6237
6238                 flowtable_hook->priority        = flowtable->data.priority;
6239                 flowtable_hook->num             = flowtable->hooknum;
6240         }
6241
6242         if (tb[NFTA_FLOWTABLE_HOOK_DEVS]) {
6243                 err = nf_tables_parse_netdev_hooks(ctx->net,
6244                                                    tb[NFTA_FLOWTABLE_HOOK_DEVS],
6245                                                    &flowtable_hook->list);
6246                 if (err < 0)
6247                         return err;
6248         }
6249
6250         list_for_each_entry(hook, &flowtable_hook->list, list) {
6251                 hook->ops.pf            = NFPROTO_NETDEV;
6252                 hook->ops.hooknum       = flowtable_hook->num;
6253                 hook->ops.priority      = flowtable_hook->priority;
6254                 hook->ops.priv          = &flowtable->data;
6255                 hook->ops.hook          = flowtable->data.type->hook;
6256         }
6257
6258         return err;
6259 }
6260
6261 static const struct nf_flowtable_type *__nft_flowtable_type_get(u8 family)
6262 {
6263         const struct nf_flowtable_type *type;
6264
6265         list_for_each_entry(type, &nf_tables_flowtables, list) {
6266                 if (family == type->family)
6267                         return type;
6268         }
6269         return NULL;
6270 }
6271
6272 static const struct nf_flowtable_type *
6273 nft_flowtable_type_get(struct net *net, u8 family)
6274 {
6275         const struct nf_flowtable_type *type;
6276
6277         type = __nft_flowtable_type_get(family);
6278         if (type != NULL && try_module_get(type->owner))
6279                 return type;
6280
6281         lockdep_nfnl_nft_mutex_not_held();
6282 #ifdef CONFIG_MODULES
6283         if (type == NULL) {
6284                 if (nft_request_module(net, "nf-flowtable-%u", family) == -EAGAIN)
6285                         return ERR_PTR(-EAGAIN);
6286         }
6287 #endif
6288         return ERR_PTR(-ENOENT);
6289 }
6290
6291 /* Only called from error and netdev event paths. */
6292 static void nft_unregister_flowtable_hook(struct net *net,
6293                                           struct nft_flowtable *flowtable,
6294                                           struct nft_hook *hook)
6295 {
6296         nf_unregister_net_hook(net, &hook->ops);
6297         flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
6298                                     FLOW_BLOCK_UNBIND);
6299 }
6300
6301 static void nft_unregister_flowtable_net_hooks(struct net *net,
6302                                                struct list_head *hook_list)
6303 {
6304         struct nft_hook *hook;
6305
6306         list_for_each_entry(hook, hook_list, list)
6307                 nf_unregister_net_hook(net, &hook->ops);
6308 }
6309
6310 static int nft_register_flowtable_net_hooks(struct net *net,
6311                                             struct nft_table *table,
6312                                             struct list_head *hook_list,
6313                                             struct nft_flowtable *flowtable)
6314 {
6315         struct nft_hook *hook, *hook2, *next;
6316         struct nft_flowtable *ft;
6317         int err, i = 0;
6318
6319         list_for_each_entry(hook, hook_list, list) {
6320                 list_for_each_entry(ft, &table->flowtables, list) {
6321                         list_for_each_entry(hook2, &ft->hook_list, list) {
6322                                 if (hook->ops.dev == hook2->ops.dev &&
6323                                     hook->ops.pf == hook2->ops.pf) {
6324                                         err = -EBUSY;
6325                                         goto err_unregister_net_hooks;
6326                                 }
6327                         }
6328                 }
6329
6330                 err = flowtable->data.type->setup(&flowtable->data,
6331                                                   hook->ops.dev,
6332                                                   FLOW_BLOCK_BIND);
6333                 if (err < 0)
6334                         goto err_unregister_net_hooks;
6335
6336                 err = nf_register_net_hook(net, &hook->ops);
6337                 if (err < 0) {
6338                         flowtable->data.type->setup(&flowtable->data,
6339                                                     hook->ops.dev,
6340                                                     FLOW_BLOCK_UNBIND);
6341                         goto err_unregister_net_hooks;
6342                 }
6343
6344                 i++;
6345         }
6346
6347         return 0;
6348
6349 err_unregister_net_hooks:
6350         list_for_each_entry_safe(hook, next, hook_list, list) {
6351                 if (i-- <= 0)
6352                         break;
6353
6354                 nft_unregister_flowtable_hook(net, flowtable, hook);
6355                 list_del_rcu(&hook->list);
6356                 kfree_rcu(hook, rcu);
6357         }
6358
6359         return err;
6360 }
6361
6362 static void nft_flowtable_hooks_destroy(struct list_head *hook_list)
6363 {
6364         struct nft_hook *hook, *next;
6365
6366         list_for_each_entry_safe(hook, next, hook_list, list) {
6367                 list_del_rcu(&hook->list);
6368                 kfree_rcu(hook, rcu);
6369         }
6370 }
6371
6372 static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh,
6373                                 struct nft_flowtable *flowtable)
6374 {
6375         const struct nlattr * const *nla = ctx->nla;
6376         struct nft_flowtable_hook flowtable_hook;
6377         struct nft_hook *hook, *next;
6378         struct nft_trans *trans;
6379         bool unregister = false;
6380         int err;
6381
6382         err = nft_flowtable_parse_hook(ctx, nla[NFTA_FLOWTABLE_HOOK],
6383                                        &flowtable_hook, flowtable, false);
6384         if (err < 0)
6385                 return err;
6386
6387         list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
6388                 if (nft_hook_list_find(&flowtable->hook_list, hook)) {
6389                         list_del(&hook->list);
6390                         kfree(hook);
6391                 }
6392         }
6393
6394         err = nft_register_flowtable_net_hooks(ctx->net, ctx->table,
6395                                                &flowtable_hook.list, flowtable);
6396         if (err < 0)
6397                 goto err_flowtable_update_hook;
6398
6399         trans = nft_trans_alloc(ctx, NFT_MSG_NEWFLOWTABLE,
6400                                 sizeof(struct nft_trans_flowtable));
6401         if (!trans) {
6402                 unregister = true;
6403                 err = -ENOMEM;
6404                 goto err_flowtable_update_hook;
6405         }
6406
6407         nft_trans_flowtable(trans) = flowtable;
6408         nft_trans_flowtable_update(trans) = true;
6409         INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
6410         list_splice(&flowtable_hook.list, &nft_trans_flowtable_hooks(trans));
6411
6412         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
6413
6414         return 0;
6415
6416 err_flowtable_update_hook:
6417         list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
6418                 if (unregister)
6419                         nft_unregister_flowtable_hook(ctx->net, flowtable, hook);
6420                 list_del_rcu(&hook->list);
6421                 kfree_rcu(hook, rcu);
6422         }
6423
6424         return err;
6425
6426 }
6427
6428 static int nf_tables_newflowtable(struct net *net, struct sock *nlsk,
6429                                   struct sk_buff *skb,
6430                                   const struct nlmsghdr *nlh,
6431                                   const struct nlattr * const nla[],
6432                                   struct netlink_ext_ack *extack)
6433 {
6434         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
6435         struct nft_flowtable_hook flowtable_hook;
6436         const struct nf_flowtable_type *type;
6437         u8 genmask = nft_genmask_next(net);
6438         int family = nfmsg->nfgen_family;
6439         struct nft_flowtable *flowtable;
6440         struct nft_hook *hook, *next;
6441         struct nft_table *table;
6442         struct nft_ctx ctx;
6443         int err;
6444
6445         if (!nla[NFTA_FLOWTABLE_TABLE] ||
6446             !nla[NFTA_FLOWTABLE_NAME] ||
6447             !nla[NFTA_FLOWTABLE_HOOK])
6448                 return -EINVAL;
6449
6450         table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
6451                                  genmask);
6452         if (IS_ERR(table)) {
6453                 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
6454                 return PTR_ERR(table);
6455         }
6456
6457         flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME],
6458                                          genmask);
6459         if (IS_ERR(flowtable)) {
6460                 err = PTR_ERR(flowtable);
6461                 if (err != -ENOENT) {
6462                         NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
6463                         return err;
6464                 }
6465         } else {
6466                 if (nlh->nlmsg_flags & NLM_F_EXCL) {
6467                         NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
6468                         return -EEXIST;
6469                 }
6470
6471                 nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
6472
6473                 return nft_flowtable_update(&ctx, nlh, flowtable);
6474         }
6475
6476         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
6477
6478         flowtable = kzalloc(sizeof(*flowtable), GFP_KERNEL);
6479         if (!flowtable)
6480                 return -ENOMEM;
6481
6482         flowtable->table = table;
6483         flowtable->handle = nf_tables_alloc_handle(table);
6484         INIT_LIST_HEAD(&flowtable->hook_list);
6485
6486         flowtable->name = nla_strdup(nla[NFTA_FLOWTABLE_NAME], GFP_KERNEL);
6487         if (!flowtable->name) {
6488                 err = -ENOMEM;
6489                 goto err1;
6490         }
6491
6492         type = nft_flowtable_type_get(net, family);
6493         if (IS_ERR(type)) {
6494                 err = PTR_ERR(type);
6495                 goto err2;
6496         }
6497
6498         if (nla[NFTA_FLOWTABLE_FLAGS]) {
6499                 flowtable->data.flags =
6500                         ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
6501                 if (flowtable->data.flags & ~NFT_FLOWTABLE_MASK)
6502                         goto err3;
6503         }
6504
6505         write_pnet(&flowtable->data.net, net);
6506         flowtable->data.type = type;
6507         err = type->init(&flowtable->data);
6508         if (err < 0)
6509                 goto err3;
6510
6511         err = nft_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK],
6512                                        &flowtable_hook, flowtable, true);
6513         if (err < 0)
6514                 goto err4;
6515
6516         list_splice(&flowtable_hook.list, &flowtable->hook_list);
6517         flowtable->data.priority = flowtable_hook.priority;
6518         flowtable->hooknum = flowtable_hook.num;
6519
6520         err = nft_register_flowtable_net_hooks(ctx.net, table,
6521                                                &flowtable->hook_list,
6522                                                flowtable);
6523         if (err < 0) {
6524                 nft_flowtable_hooks_destroy(&flowtable->hook_list);
6525                 goto err4;
6526         }
6527
6528         err = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable);
6529         if (err < 0)
6530                 goto err5;
6531
6532         list_add_tail_rcu(&flowtable->list, &table->flowtables);
6533         table->use++;
6534
6535         return 0;
6536 err5:
6537         list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
6538                 nft_unregister_flowtable_hook(net, flowtable, hook);
6539                 list_del_rcu(&hook->list);
6540                 kfree_rcu(hook, rcu);
6541         }
6542 err4:
6543         flowtable->data.type->free(&flowtable->data);
6544 err3:
6545         module_put(type->owner);
6546 err2:
6547         kfree(flowtable->name);
6548 err1:
6549         kfree(flowtable);
6550         return err;
6551 }
6552
6553 static int nft_delflowtable_hook(struct nft_ctx *ctx,
6554                                  struct nft_flowtable *flowtable)
6555 {
6556         const struct nlattr * const *nla = ctx->nla;
6557         struct nft_flowtable_hook flowtable_hook;
6558         struct nft_hook *this, *next, *hook;
6559         struct nft_trans *trans;
6560         int err;
6561
6562         err = nft_flowtable_parse_hook(ctx, nla[NFTA_FLOWTABLE_HOOK],
6563                                        &flowtable_hook, flowtable, false);
6564         if (err < 0)
6565                 return err;
6566
6567         list_for_each_entry_safe(this, next, &flowtable_hook.list, list) {
6568                 hook = nft_hook_list_find(&flowtable->hook_list, this);
6569                 if (!hook) {
6570                         err = -ENOENT;
6571                         goto err_flowtable_del_hook;
6572                 }
6573                 hook->inactive = true;
6574                 list_del(&this->list);
6575                 kfree(this);
6576         }
6577
6578         trans = nft_trans_alloc(ctx, NFT_MSG_DELFLOWTABLE,
6579                                 sizeof(struct nft_trans_flowtable));
6580         if (!trans)
6581                 return -ENOMEM;
6582
6583         nft_trans_flowtable(trans) = flowtable;
6584         nft_trans_flowtable_update(trans) = true;
6585         INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
6586
6587         list_add_tail(&trans->list, &ctx->net->nft.commit_list);
6588
6589         return 0;
6590
6591 err_flowtable_del_hook:
6592         list_for_each_entry(hook, &flowtable_hook.list, list)
6593                 hook->inactive = false;
6594
6595         return err;
6596 }
6597
6598 static int nf_tables_delflowtable(struct net *net, struct sock *nlsk,
6599                                   struct sk_buff *skb,
6600                                   const struct nlmsghdr *nlh,
6601                                   const struct nlattr * const nla[],
6602                                   struct netlink_ext_ack *extack)
6603 {
6604         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
6605         u8 genmask = nft_genmask_next(net);
6606         int family = nfmsg->nfgen_family;
6607         struct nft_flowtable *flowtable;
6608         const struct nlattr *attr;
6609         struct nft_table *table;
6610         struct nft_ctx ctx;
6611
6612         if (!nla[NFTA_FLOWTABLE_TABLE] ||
6613             (!nla[NFTA_FLOWTABLE_NAME] &&
6614              !nla[NFTA_FLOWTABLE_HANDLE]))
6615                 return -EINVAL;
6616
6617         table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
6618                                  genmask);
6619         if (IS_ERR(table)) {
6620                 NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
6621                 return PTR_ERR(table);
6622         }
6623
6624         if (nla[NFTA_FLOWTABLE_HANDLE]) {
6625                 attr = nla[NFTA_FLOWTABLE_HANDLE];
6626                 flowtable = nft_flowtable_lookup_byhandle(table, attr, genmask);
6627         } else {
6628                 attr = nla[NFTA_FLOWTABLE_NAME];
6629                 flowtable = nft_flowtable_lookup(table, attr, genmask);
6630         }
6631
6632         if (IS_ERR(flowtable)) {
6633                 NL_SET_BAD_ATTR(extack, attr);
6634                 return PTR_ERR(flowtable);
6635         }
6636
6637         nft_ctx_init(&ctx, net, skb, nlh, family, table, NULL, nla);
6638
6639         if (nla[NFTA_FLOWTABLE_HOOK])
6640                 return nft_delflowtable_hook(&ctx, flowtable);
6641
6642         if (flowtable->use > 0) {
6643                 NL_SET_BAD_ATTR(extack, attr);
6644                 return -EBUSY;
6645         }
6646
6647         return nft_delflowtable(&ctx, flowtable);
6648 }
6649
6650 static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net,
6651                                          u32 portid, u32 seq, int event,
6652                                          u32 flags, int family,
6653                                          struct nft_flowtable *flowtable,
6654                                          struct list_head *hook_list)
6655 {
6656         struct nlattr *nest, *nest_devs;
6657         struct nfgenmsg *nfmsg;
6658         struct nft_hook *hook;
6659         struct nlmsghdr *nlh;
6660
6661         event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
6662         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), flags);
6663         if (nlh == NULL)
6664                 goto nla_put_failure;
6665
6666         nfmsg = nlmsg_data(nlh);
6667         nfmsg->nfgen_family     = family;
6668         nfmsg->version          = NFNETLINK_V0;
6669         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
6670
6671         if (nla_put_string(skb, NFTA_FLOWTABLE_TABLE, flowtable->table->name) ||
6672             nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
6673             nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
6674             nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),
6675                          NFTA_FLOWTABLE_PAD) ||
6676             nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags)))
6677                 goto nla_put_failure;
6678
6679         nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK);
6680         if (!nest)
6681                 goto nla_put_failure;
6682         if (nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_NUM, htonl(flowtable->hooknum)) ||
6683             nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_PRIORITY, htonl(flowtable->data.priority)))
6684                 goto nla_put_failure;
6685
6686         nest_devs = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK_DEVS);
6687         if (!nest_devs)
6688                 goto nla_put_failure;
6689
6690         list_for_each_entry_rcu(hook, hook_list, list) {
6691                 if (nla_put_string(skb, NFTA_DEVICE_NAME, hook->ops.dev->name))
6692                         goto nla_put_failure;
6693         }
6694         nla_nest_end(skb, nest_devs);
6695         nla_nest_end(skb, nest);
6696
6697         nlmsg_end(skb, nlh);
6698         return 0;
6699
6700 nla_put_failure:
6701         nlmsg_trim(skb, nlh);
6702         return -1;
6703 }
6704
6705 struct nft_flowtable_filter {
6706         char            *table;
6707 };
6708
6709 static int nf_tables_dump_flowtable(struct sk_buff *skb,
6710                                     struct netlink_callback *cb)
6711 {
6712         const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
6713         struct nft_flowtable_filter *filter = cb->data;
6714         unsigned int idx = 0, s_idx = cb->args[0];
6715         struct net *net = sock_net(skb->sk);
6716         int family = nfmsg->nfgen_family;
6717         struct nft_flowtable *flowtable;
6718         const struct nft_table *table;
6719
6720         rcu_read_lock();
6721         cb->seq = net->nft.base_seq;
6722
6723         list_for_each_entry_rcu(table, &net->nft.tables, list) {
6724                 if (family != NFPROTO_UNSPEC && family != table->family)
6725                         continue;
6726
6727                 list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
6728                         if (!nft_is_active(net, flowtable))
6729                                 goto cont;
6730                         if (idx < s_idx)
6731                                 goto cont;
6732                         if (idx > s_idx)
6733                                 memset(&cb->args[1], 0,
6734                                        sizeof(cb->args) - sizeof(cb->args[0]));
6735                         if (filter && filter->table &&
6736                             strcmp(filter->table, table->name))
6737                                 goto cont;
6738
6739                         if (nf_tables_fill_flowtable_info(skb, net, NETLINK_CB(cb->skb).portid,
6740                                                           cb->nlh->nlmsg_seq,
6741                                                           NFT_MSG_NEWFLOWTABLE,
6742                                                           NLM_F_MULTI | NLM_F_APPEND,
6743                                                           table->family,
6744                                                           flowtable,
6745                                                           &flowtable->hook_list) < 0)
6746                                 goto done;
6747
6748                         nl_dump_check_consistent(cb, nlmsg_hdr(skb));
6749 cont:
6750                         idx++;
6751                 }
6752         }
6753 done:
6754         rcu_read_unlock();
6755
6756         cb->args[0] = idx;
6757         return skb->len;
6758 }
6759
6760 static int nf_tables_dump_flowtable_start(struct netlink_callback *cb)
6761 {
6762         const struct nlattr * const *nla = cb->data;
6763         struct nft_flowtable_filter *filter = NULL;
6764
6765         if (nla[NFTA_FLOWTABLE_TABLE]) {
6766                 filter = kzalloc(sizeof(*filter), GFP_ATOMIC);
6767                 if (!filter)
6768                         return -ENOMEM;
6769
6770                 filter->table = nla_strdup(nla[NFTA_FLOWTABLE_TABLE],
6771                                            GFP_ATOMIC);
6772                 if (!filter->table) {
6773                         kfree(filter);
6774                         return -ENOMEM;
6775                 }
6776         }
6777
6778         cb->data = filter;
6779         return 0;
6780 }
6781
6782 static int nf_tables_dump_flowtable_done(struct netlink_callback *cb)
6783 {
6784         struct nft_flowtable_filter *filter = cb->data;
6785
6786         if (!filter)
6787                 return 0;
6788
6789         kfree(filter->table);
6790         kfree(filter);
6791
6792         return 0;
6793 }
6794
6795 /* called with rcu_read_lock held */
6796 static int nf_tables_getflowtable(struct net *net, struct sock *nlsk,
6797                                   struct sk_buff *skb,
6798                                   const struct nlmsghdr *nlh,
6799                                   const struct nlattr * const nla[],
6800                                   struct netlink_ext_ack *extack)
6801 {
6802         const struct nfgenmsg *nfmsg = nlmsg_data(nlh);
6803         u8 genmask = nft_genmask_cur(net);
6804         int family = nfmsg->nfgen_family;
6805         struct nft_flowtable *flowtable;
6806         const struct nft_table *table;
6807         struct sk_buff *skb2;
6808         int err;
6809
6810         if (nlh->nlmsg_flags & NLM_F_DUMP) {
6811                 struct netlink_dump_control c = {
6812                         .start = nf_tables_dump_flowtable_start,
6813                         .dump = nf_tables_dump_flowtable,
6814                         .done = nf_tables_dump_flowtable_done,
6815                         .module = THIS_MODULE,
6816                         .data = (void *)nla,
6817                 };
6818
6819                 return nft_netlink_dump_start_rcu(nlsk, skb, nlh, &c);
6820         }
6821
6822         if (!nla[NFTA_FLOWTABLE_NAME])
6823                 return -EINVAL;
6824
6825         table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
6826                                  genmask);
6827         if (IS_ERR(table))
6828                 return PTR_ERR(table);
6829
6830         flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME],
6831                                          genmask);
6832         if (IS_ERR(flowtable))
6833                 return PTR_ERR(flowtable);
6834
6835         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
6836         if (!skb2)
6837                 return -ENOMEM;
6838
6839         err = nf_tables_fill_flowtable_info(skb2, net, NETLINK_CB(skb).portid,
6840                                             nlh->nlmsg_seq,
6841                                             NFT_MSG_NEWFLOWTABLE, 0, family,
6842                                             flowtable, &flowtable->hook_list);
6843         if (err < 0)
6844                 goto err;
6845
6846         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
6847 err:
6848         kfree_skb(skb2);
6849         return err;
6850 }
6851
6852 static void nf_tables_flowtable_notify(struct nft_ctx *ctx,
6853                                        struct nft_flowtable *flowtable,
6854                                        struct list_head *hook_list,
6855                                        int event)
6856 {
6857         struct sk_buff *skb;
6858         int err;
6859
6860         if (ctx->report &&
6861             !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
6862                 return;
6863
6864         skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
6865         if (skb == NULL)
6866                 goto err;
6867
6868         err = nf_tables_fill_flowtable_info(skb, ctx->net, ctx->portid,
6869                                             ctx->seq, event, 0,
6870                                             ctx->family, flowtable, hook_list);
6871         if (err < 0) {
6872                 kfree_skb(skb);
6873                 goto err;
6874         }
6875
6876         nfnetlink_send(skb, ctx->net, ctx->portid, NFNLGRP_NFTABLES,
6877                        ctx->report, GFP_KERNEL);
6878         return;
6879 err:
6880         nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
6881 }
6882
6883 static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
6884 {
6885         struct nft_hook *hook, *next;
6886
6887         flowtable->data.type->free(&flowtable->data);
6888         list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
6889                 flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
6890                                             FLOW_BLOCK_UNBIND);
6891                 list_del_rcu(&hook->list);
6892                 kfree(hook);
6893         }
6894         kfree(flowtable->name);
6895         module_put(flowtable->data.type->owner);
6896         kfree(flowtable);
6897 }
6898
6899 static int nf_tables_fill_gen_info(struct sk_buff *skb, struct net *net,
6900                                    u32 portid, u32 seq)
6901 {
6902         struct nlmsghdr *nlh;
6903         struct nfgenmsg *nfmsg;
6904         char buf[TASK_COMM_LEN];
6905         int event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWGEN);
6906
6907         nlh = nlmsg_put(skb, portid, seq, event, sizeof(struct nfgenmsg), 0);
6908         if (nlh == NULL)
6909                 goto nla_put_failure;
6910
6911         nfmsg = nlmsg_data(nlh);
6912         nfmsg->nfgen_family     = AF_UNSPEC;
6913         nfmsg->version          = NFNETLINK_V0;
6914         nfmsg->res_id           = htons(net->nft.base_seq & 0xffff);
6915
6916         if (nla_put_be32(skb, NFTA_GEN_ID, htonl(net->nft.base_seq)) ||
6917             nla_put_be32(skb, NFTA_GEN_PROC_PID, htonl(task_pid_nr(current))) ||
6918             nla_put_string(skb, NFTA_GEN_PROC_NAME, get_task_comm(buf, current)))
6919                 goto nla_put_failure;
6920
6921         nlmsg_end(skb, nlh);
6922         return 0;
6923
6924 nla_put_failure:
6925         nlmsg_trim(skb, nlh);
6926         return -EMSGSIZE;
6927 }
6928
6929 static void nft_flowtable_event(unsigned long event, struct net_device *dev,
6930                                 struct nft_flowtable *flowtable)
6931 {
6932         struct nft_hook *hook;
6933
6934         list_for_each_entry(hook, &flowtable->hook_list, list) {
6935                 if (hook->ops.dev != dev)
6936                         continue;
6937
6938                 /* flow_offload_netdev_event() cleans up entries for us. */
6939                 nft_unregister_flowtable_hook(dev_net(dev), flowtable, hook);
6940                 list_del_rcu(&hook->list);
6941                 kfree_rcu(hook, rcu);
6942                 break;
6943         }
6944 }
6945
6946 static int nf_tables_flowtable_event(struct notifier_block *this,
6947                                      unsigned long event, void *ptr)
6948 {
6949         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
6950         struct nft_flowtable *flowtable;
6951         struct nft_table *table;
6952         struct net *net;
6953
6954         if (event != NETDEV_UNREGISTER)
6955                 return 0;
6956
6957         net = dev_net(dev);
6958         mutex_lock(&net->nft.commit_mutex);
6959         list_for_each_entry(table, &net->nft.tables, list) {
6960                 list_for_each_entry(flowtable, &table->flowtables, list) {
6961                         nft_flowtable_event(event, dev, flowtable);
6962                 }
6963         }
6964         mutex_unlock(&net->nft.commit_mutex);
6965
6966         return NOTIFY_DONE;
6967 }
6968
6969 static struct notifier_block nf_tables_flowtable_notifier = {
6970         .notifier_call  = nf_tables_flowtable_event,
6971 };
6972
6973 static void nf_tables_gen_notify(struct net *net, struct sk_buff *skb,
6974                                  int event)
6975 {
6976         struct nlmsghdr *nlh = nlmsg_hdr(skb);
6977         struct sk_buff *skb2;
6978         int err;
6979
6980         if (nlmsg_report(nlh) &&
6981             !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
6982                 return;
6983
6984         skb2 = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
6985         if (skb2 == NULL)
6986                 goto err;
6987
6988         err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
6989                                       nlh->nlmsg_seq);
6990         if (err < 0) {
6991                 kfree_skb(skb2);
6992                 goto err;
6993         }
6994
6995         nfnetlink_send(skb2, net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
6996                        nlmsg_report(nlh), GFP_KERNEL);
6997         return;
6998 err:
6999         nfnetlink_set_err(net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
7000                           -ENOBUFS);
7001 }
7002
7003 static int nf_tables_getgen(struct net *net, struct sock *nlsk,
7004                             struct sk_buff *skb, const struct nlmsghdr *nlh,
7005                             const struct nlattr * const nla[],
7006                             struct netlink_ext_ack *extack)
7007 {
7008         struct sk_buff *skb2;
7009         int err;
7010
7011         skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
7012         if (skb2 == NULL)
7013                 return -ENOMEM;
7014
7015         err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
7016                                       nlh->nlmsg_seq);
7017         if (err < 0)
7018                 goto err;
7019
7020         return nlmsg_unicast(nlsk, skb2, NETLINK_CB(skb).portid);
7021 err:
7022         kfree_skb(skb2);
7023         return err;
7024 }
7025
7026 static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = {
7027         [NFT_MSG_NEWTABLE] = {
7028                 .call_batch     = nf_tables_newtable,
7029                 .attr_count     = NFTA_TABLE_MAX,
7030                 .policy         = nft_table_policy,
7031         },
7032         [NFT_MSG_GETTABLE] = {
7033                 .call_rcu       = nf_tables_gettable,
7034                 .attr_count     = NFTA_TABLE_MAX,
7035                 .policy         = nft_table_policy,
7036         },
7037         [NFT_MSG_DELTABLE] = {
7038                 .call_batch     = nf_tables_deltable,
7039                 .attr_count     = NFTA_TABLE_MAX,
7040                 .policy         = nft_table_policy,
7041         },
7042         [NFT_MSG_NEWCHAIN] = {
7043                 .call_batch     = nf_tables_newchain,
7044                 .attr_count     = NFTA_CHAIN_MAX,
7045                 .policy         = nft_chain_policy,
7046         },
7047         [NFT_MSG_GETCHAIN] = {
7048                 .call_rcu       = nf_tables_getchain,
7049                 .attr_count     = NFTA_CHAIN_MAX,
7050                 .policy         = nft_chain_policy,
7051         },
7052         [NFT_MSG_DELCHAIN] = {
7053                 .call_batch     = nf_tables_delchain,
7054                 .attr_count     = NFTA_CHAIN_MAX,
7055                 .policy         = nft_chain_policy,
7056         },
7057         [NFT_MSG_NEWRULE] = {
7058                 .call_batch     = nf_tables_newrule,
7059                 .attr_count     = NFTA_RULE_MAX,
7060                 .policy         = nft_rule_policy,
7061         },
7062         [NFT_MSG_GETRULE] = {
7063                 .call_rcu       = nf_tables_getrule,
7064                 .attr_count     = NFTA_RULE_MAX,
7065                 .policy         = nft_rule_policy,
7066         },
7067         [NFT_MSG_DELRULE] = {
7068                 .call_batch     = nf_tables_delrule,
7069                 .attr_count     = NFTA_RULE_MAX,
7070                 .policy         = nft_rule_policy,
7071         },
7072         [NFT_MSG_NEWSET] = {
7073                 .call_batch     = nf_tables_newset,
7074                 .attr_count     = NFTA_SET_MAX,
7075                 .policy         = nft_set_policy,
7076         },
7077         [NFT_MSG_GETSET] = {
7078                 .call_rcu       = nf_tables_getset,
7079                 .attr_count     = NFTA_SET_MAX,
7080                 .policy         = nft_set_policy,
7081         },
7082         [NFT_MSG_DELSET] = {
7083                 .call_batch     = nf_tables_delset,
7084                 .attr_count     = NFTA_SET_MAX,
7085                 .policy         = nft_set_policy,
7086         },
7087         [NFT_MSG_NEWSETELEM] = {
7088                 .call_batch     = nf_tables_newsetelem,
7089                 .attr_count     = NFTA_SET_ELEM_LIST_MAX,
7090                 .policy         = nft_set_elem_list_policy,
7091         },
7092         [NFT_MSG_GETSETELEM] = {
7093                 .call_rcu       = nf_tables_getsetelem,
7094                 .attr_count     = NFTA_SET_ELEM_LIST_MAX,
7095                 .policy         = nft_set_elem_list_policy,
7096         },
7097         [NFT_MSG_DELSETELEM] = {
7098                 .call_batch     = nf_tables_delsetelem,
7099                 .attr_count     = NFTA_SET_ELEM_LIST_MAX,
7100                 .policy         = nft_set_elem_list_policy,
7101         },
7102         [NFT_MSG_GETGEN] = {
7103                 .call_rcu       = nf_tables_getgen,
7104         },
7105         [NFT_MSG_NEWOBJ] = {
7106                 .call_batch     = nf_tables_newobj,
7107                 .attr_count     = NFTA_OBJ_MAX,
7108                 .policy         = nft_obj_policy,
7109         },
7110         [NFT_MSG_GETOBJ] = {
7111                 .call_rcu       = nf_tables_getobj,
7112                 .attr_count     = NFTA_OBJ_MAX,
7113                 .policy         = nft_obj_policy,
7114         },
7115         [NFT_MSG_DELOBJ] = {
7116                 .call_batch     = nf_tables_delobj,
7117                 .attr_count     = NFTA_OBJ_MAX,
7118                 .policy         = nft_obj_policy,
7119         },
7120         [NFT_MSG_GETOBJ_RESET] = {
7121                 .call_rcu       = nf_tables_getobj,
7122                 .attr_count     = NFTA_OBJ_MAX,
7123                 .policy         = nft_obj_policy,
7124         },
7125         [NFT_MSG_NEWFLOWTABLE] = {
7126                 .call_batch     = nf_tables_newflowtable,
7127                 .attr_count     = NFTA_FLOWTABLE_MAX,
7128                 .policy         = nft_flowtable_policy,
7129         },
7130         [NFT_MSG_GETFLOWTABLE] = {
7131                 .call_rcu       = nf_tables_getflowtable,
7132                 .attr_count     = NFTA_FLOWTABLE_MAX,
7133                 .policy         = nft_flowtable_policy,
7134         },
7135         [NFT_MSG_DELFLOWTABLE] = {
7136                 .call_batch     = nf_tables_delflowtable,
7137                 .attr_count     = NFTA_FLOWTABLE_MAX,
7138                 .policy         = nft_flowtable_policy,
7139         },
7140 };
7141
7142 static int nf_tables_validate(struct net *net)
7143 {
7144         struct nft_table *table;
7145
7146         switch (net->nft.validate_state) {
7147         case NFT_VALIDATE_SKIP:
7148                 break;
7149         case NFT_VALIDATE_NEED:
7150                 nft_validate_state_update(net, NFT_VALIDATE_DO);
7151                 /* fall through */
7152         case NFT_VALIDATE_DO:
7153                 list_for_each_entry(table, &net->nft.tables, list) {
7154                         if (nft_table_validate(net, table) < 0)
7155                                 return -EAGAIN;
7156                 }
7157                 break;
7158         }
7159
7160         return 0;
7161 }
7162
7163 /* a drop policy has to be deferred until all rules have been activated,
7164  * otherwise a large ruleset that contains a drop-policy base chain will
7165  * cause all packets to get dropped until the full transaction has been
7166  * processed.
7167  *
7168  * We defer the drop policy until the transaction has been finalized.
7169  */
7170 static void nft_chain_commit_drop_policy(struct nft_trans *trans)
7171 {
7172         struct nft_base_chain *basechain;
7173
7174         if (nft_trans_chain_policy(trans) != NF_DROP)
7175                 return;
7176
7177         if (!nft_is_base_chain(trans->ctx.chain))
7178                 return;
7179
7180         basechain = nft_base_chain(trans->ctx.chain);
7181         basechain->policy = NF_DROP;
7182 }
7183
7184 static void nft_chain_commit_update(struct nft_trans *trans)
7185 {
7186         struct nft_base_chain *basechain;
7187
7188         if (nft_trans_chain_name(trans)) {
7189                 rhltable_remove(&trans->ctx.table->chains_ht,
7190                                 &trans->ctx.chain->rhlhead,
7191                                 nft_chain_ht_params);
7192                 swap(trans->ctx.chain->name, nft_trans_chain_name(trans));
7193                 rhltable_insert_key(&trans->ctx.table->chains_ht,
7194                                     trans->ctx.chain->name,
7195                                     &trans->ctx.chain->rhlhead,
7196                                     nft_chain_ht_params);
7197         }
7198
7199         if (!nft_is_base_chain(trans->ctx.chain))
7200                 return;
7201
7202         nft_chain_stats_replace(trans);
7203
7204         basechain = nft_base_chain(trans->ctx.chain);
7205
7206         switch (nft_trans_chain_policy(trans)) {
7207         case NF_DROP:
7208         case NF_ACCEPT:
7209                 basechain->policy = nft_trans_chain_policy(trans);
7210                 break;
7211         }
7212 }
7213
7214 static void nft_obj_commit_update(struct nft_trans *trans)
7215 {
7216         struct nft_object *newobj;
7217         struct nft_object *obj;
7218
7219         obj = nft_trans_obj(trans);
7220         newobj = nft_trans_obj_newobj(trans);
7221
7222         if (obj->ops->update)
7223                 obj->ops->update(obj, newobj);
7224
7225         kfree(newobj);
7226 }
7227
7228 static void nft_commit_release(struct nft_trans *trans)
7229 {
7230         switch (trans->msg_type) {
7231         case NFT_MSG_DELTABLE:
7232                 nf_tables_table_destroy(&trans->ctx);
7233                 break;
7234         case NFT_MSG_NEWCHAIN:
7235                 free_percpu(nft_trans_chain_stats(trans));
7236                 kfree(nft_trans_chain_name(trans));
7237                 break;
7238         case NFT_MSG_DELCHAIN:
7239                 nf_tables_chain_destroy(&trans->ctx);
7240                 break;
7241         case NFT_MSG_DELRULE:
7242                 nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans));
7243                 break;
7244         case NFT_MSG_DELSET:
7245                 nft_set_destroy(&trans->ctx, nft_trans_set(trans));
7246                 break;
7247         case NFT_MSG_DELSETELEM:
7248                 nf_tables_set_elem_destroy(&trans->ctx,
7249                                            nft_trans_elem_set(trans),
7250                                            nft_trans_elem(trans).priv);
7251                 break;
7252         case NFT_MSG_DELOBJ:
7253                 nft_obj_destroy(&trans->ctx, nft_trans_obj(trans));
7254                 break;
7255         case NFT_MSG_DELFLOWTABLE:
7256                 if (nft_trans_flowtable_update(trans))
7257                         nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans));
7258                 else
7259                         nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
7260                 break;
7261         }
7262
7263         if (trans->put_net)
7264                 put_net(trans->ctx.net);
7265
7266         kfree(trans);
7267 }
7268
7269 static void nf_tables_trans_destroy_work(struct work_struct *w)
7270 {
7271         struct nft_trans *trans, *next;
7272         LIST_HEAD(head);
7273
7274         spin_lock(&nf_tables_destroy_list_lock);
7275         list_splice_init(&nf_tables_destroy_list, &head);
7276         spin_unlock(&nf_tables_destroy_list_lock);
7277
7278         if (list_empty(&head))
7279                 return;
7280
7281         synchronize_rcu();
7282
7283         list_for_each_entry_safe(trans, next, &head, list) {
7284                 list_del(&trans->list);
7285                 nft_commit_release(trans);
7286         }
7287 }
7288
7289 static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *chain)
7290 {
7291         struct nft_rule *rule;
7292         unsigned int alloc = 0;
7293         int i;
7294
7295         /* already handled or inactive chain? */
7296         if (chain->rules_next || !nft_is_active_next(net, chain))
7297                 return 0;
7298
7299         rule = list_entry(&chain->rules, struct nft_rule, list);
7300         i = 0;
7301
7302         list_for_each_entry_continue(rule, &chain->rules, list) {
7303                 if (nft_is_active_next(net, rule))
7304                         alloc++;
7305         }
7306
7307         chain->rules_next = nf_tables_chain_alloc_rules(chain, alloc);
7308         if (!chain->rules_next)
7309                 return -ENOMEM;
7310
7311         list_for_each_entry_continue(rule, &chain->rules, list) {
7312                 if (nft_is_active_next(net, rule))
7313                         chain->rules_next[i++] = rule;
7314         }
7315
7316         chain->rules_next[i] = NULL;
7317         return 0;
7318 }
7319
7320 static void nf_tables_commit_chain_prepare_cancel(struct net *net)
7321 {
7322         struct nft_trans *trans, *next;
7323
7324         list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
7325                 struct nft_chain *chain = trans->ctx.chain;
7326
7327                 if (trans->msg_type == NFT_MSG_NEWRULE ||
7328                     trans->msg_type == NFT_MSG_DELRULE) {
7329                         kvfree(chain->rules_next);
7330                         chain->rules_next = NULL;
7331                 }
7332         }
7333 }
7334
7335 static void __nf_tables_commit_chain_free_rules_old(struct rcu_head *h)
7336 {
7337         struct nft_rules_old *o = container_of(h, struct nft_rules_old, h);
7338
7339         kvfree(o->start);
7340 }
7341
7342 static void nf_tables_commit_chain_free_rules_old(struct nft_rule **rules)
7343 {
7344         struct nft_rule **r = rules;
7345         struct nft_rules_old *old;
7346
7347         while (*r)
7348                 r++;
7349
7350         r++;    /* rcu_head is after end marker */
7351         old = (void *) r;
7352         old->start = rules;
7353
7354         call_rcu(&old->h, __nf_tables_commit_chain_free_rules_old);
7355 }
7356
7357 static void nf_tables_commit_chain(struct net *net, struct nft_chain *chain)
7358 {
7359         struct nft_rule **g0, **g1;
7360         bool next_genbit;
7361
7362         next_genbit = nft_gencursor_next(net);
7363
7364         g0 = rcu_dereference_protected(chain->rules_gen_0,
7365                                        lockdep_commit_lock_is_held(net));
7366         g1 = rcu_dereference_protected(chain->rules_gen_1,
7367                                        lockdep_commit_lock_is_held(net));
7368
7369         /* No changes to this chain? */
7370         if (chain->rules_next == NULL) {
7371                 /* chain had no change in last or next generation */
7372                 if (g0 == g1)
7373                         return;
7374                 /*
7375                  * chain had no change in this generation; make sure next
7376                  * one uses same rules as current generation.
7377                  */
7378                 if (next_genbit) {
7379                         rcu_assign_pointer(chain->rules_gen_1, g0);
7380                         nf_tables_commit_chain_free_rules_old(g1);
7381                 } else {
7382                         rcu_assign_pointer(chain->rules_gen_0, g1);
7383                         nf_tables_commit_chain_free_rules_old(g0);
7384                 }
7385
7386                 return;
7387         }
7388
7389         if (next_genbit)
7390                 rcu_assign_pointer(chain->rules_gen_1, chain->rules_next);
7391         else
7392                 rcu_assign_pointer(chain->rules_gen_0, chain->rules_next);
7393
7394         chain->rules_next = NULL;
7395
7396         if (g0 == g1)
7397                 return;
7398
7399         if (next_genbit)
7400                 nf_tables_commit_chain_free_rules_old(g1);
7401         else
7402                 nf_tables_commit_chain_free_rules_old(g0);
7403 }
7404
7405 static void nft_obj_del(struct nft_object *obj)
7406 {
7407         rhltable_remove(&nft_objname_ht, &obj->rhlhead, nft_objname_ht_params);
7408         list_del_rcu(&obj->list);
7409 }
7410
7411 static void nft_chain_del(struct nft_chain *chain)
7412 {
7413         struct nft_table *table = chain->table;
7414
7415         WARN_ON_ONCE(rhltable_remove(&table->chains_ht, &chain->rhlhead,
7416                                      nft_chain_ht_params));
7417         list_del_rcu(&chain->list);
7418 }
7419
7420 static void nft_flowtable_hooks_del(struct nft_flowtable *flowtable,
7421                                     struct list_head *hook_list)
7422 {
7423         struct nft_hook *hook, *next;
7424
7425         list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
7426                 if (hook->inactive)
7427                         list_move(&hook->list, hook_list);
7428         }
7429 }
7430
7431 static void nf_tables_module_autoload_cleanup(struct net *net)
7432 {
7433         struct nft_module_request *req, *next;
7434
7435         WARN_ON_ONCE(!list_empty(&net->nft.commit_list));
7436         list_for_each_entry_safe(req, next, &net->nft.module_list, list) {
7437                 WARN_ON_ONCE(!req->done);
7438                 list_del(&req->list);
7439                 kfree(req);
7440         }
7441 }
7442
7443 static void nf_tables_commit_release(struct net *net)
7444 {
7445         struct nft_trans *trans;
7446
7447         /* all side effects have to be made visible.
7448          * For example, if a chain named 'foo' has been deleted, a
7449          * new transaction must not find it anymore.
7450          *
7451          * Memory reclaim happens asynchronously from work queue
7452          * to prevent expensive synchronize_rcu() in commit phase.
7453          */
7454         if (list_empty(&net->nft.commit_list)) {
7455                 nf_tables_module_autoload_cleanup(net);
7456                 mutex_unlock(&net->nft.commit_mutex);
7457                 return;
7458         }
7459
7460         trans = list_last_entry(&net->nft.commit_list,
7461                                 struct nft_trans, list);
7462         get_net(trans->ctx.net);
7463         WARN_ON_ONCE(trans->put_net);
7464
7465         trans->put_net = true;
7466         spin_lock(&nf_tables_destroy_list_lock);
7467         list_splice_tail_init(&net->nft.commit_list, &nf_tables_destroy_list);
7468         spin_unlock(&nf_tables_destroy_list_lock);
7469
7470         nf_tables_module_autoload_cleanup(net);
7471         mutex_unlock(&net->nft.commit_mutex);
7472
7473         schedule_work(&trans_destroy_work);
7474 }
7475
7476 static int nf_tables_commit(struct net *net, struct sk_buff *skb)
7477 {
7478         struct nft_trans *trans, *next;
7479         struct nft_trans_elem *te;
7480         struct nft_chain *chain;
7481         struct nft_table *table;
7482         int err;
7483
7484         if (list_empty(&net->nft.commit_list)) {
7485                 mutex_unlock(&net->nft.commit_mutex);
7486                 return 0;
7487         }
7488
7489         /* 0. Validate ruleset, otherwise roll back for error reporting. */
7490         if (nf_tables_validate(net) < 0)
7491                 return -EAGAIN;
7492
7493         err = nft_flow_rule_offload_commit(net);
7494         if (err < 0)
7495                 return err;
7496
7497         /* 1.  Allocate space for next generation rules_gen_X[] */
7498         list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
7499                 int ret;
7500
7501                 if (trans->msg_type == NFT_MSG_NEWRULE ||
7502                     trans->msg_type == NFT_MSG_DELRULE) {
7503                         chain = trans->ctx.chain;
7504
7505                         ret = nf_tables_commit_chain_prepare(net, chain);
7506                         if (ret < 0) {
7507                                 nf_tables_commit_chain_prepare_cancel(net);
7508                                 return ret;
7509                         }
7510                 }
7511         }
7512
7513         /* step 2.  Make rules_gen_X visible to packet path */
7514         list_for_each_entry(table, &net->nft.tables, list) {
7515                 list_for_each_entry(chain, &table->chains, list)
7516                         nf_tables_commit_chain(net, chain);
7517         }
7518
7519         /*
7520          * Bump generation counter, invalidate any dump in progress.
7521          * Cannot fail after this point.
7522          */
7523         while (++net->nft.base_seq == 0);
7524
7525         /* step 3. Start new generation, rules_gen_X now in use. */
7526         net->nft.gencursor = nft_gencursor_next(net);
7527
7528         list_for_each_entry_safe(trans, next, &net->nft.commit_list, list) {
7529                 switch (trans->msg_type) {
7530                 case NFT_MSG_NEWTABLE:
7531                         if (nft_trans_table_update(trans)) {
7532                                 if (!nft_trans_table_enable(trans)) {
7533                                         nf_tables_table_disable(net,
7534                                                                 trans->ctx.table);
7535                                         trans->ctx.table->flags |= NFT_TABLE_F_DORMANT;
7536                                 }
7537                         } else {
7538                                 nft_clear(net, trans->ctx.table);
7539                         }
7540                         nf_tables_table_notify(&trans->ctx, NFT_MSG_NEWTABLE);
7541                         nft_trans_destroy(trans);
7542                         break;
7543                 case NFT_MSG_DELTABLE:
7544                         list_del_rcu(&trans->ctx.table->list);
7545                         nf_tables_table_notify(&trans->ctx, NFT_MSG_DELTABLE);
7546                         break;
7547                 case NFT_MSG_NEWCHAIN:
7548                         if (nft_trans_chain_update(trans)) {
7549                                 nft_chain_commit_update(trans);
7550                                 nf_tables_chain_notify(&trans->ctx, NFT_MSG_NEWCHAIN);
7551                                 /* trans destroyed after rcu grace period */
7552                         } else {
7553                                 nft_chain_commit_drop_policy(trans);
7554                                 nft_clear(net, trans->ctx.chain);
7555                                 nf_tables_chain_notify(&trans->ctx, NFT_MSG_NEWCHAIN);
7556                                 nft_trans_destroy(trans);
7557                         }
7558                         break;
7559                 case NFT_MSG_DELCHAIN:
7560                         nft_chain_del(trans->ctx.chain);
7561                         nf_tables_chain_notify(&trans->ctx, NFT_MSG_DELCHAIN);
7562                         nf_tables_unregister_hook(trans->ctx.net,
7563                                                   trans->ctx.table,
7564                                                   trans->ctx.chain);
7565                         break;
7566                 case NFT_MSG_NEWRULE:
7567                         nft_clear(trans->ctx.net, nft_trans_rule(trans));
7568                         nf_tables_rule_notify(&trans->ctx,
7569                                               nft_trans_rule(trans),
7570                                               NFT_MSG_NEWRULE);
7571                         nft_trans_destroy(trans);
7572                         break;
7573                 case NFT_MSG_DELRULE:
7574                         list_del_rcu(&nft_trans_rule(trans)->list);
7575                         nf_tables_rule_notify(&trans->ctx,
7576                                               nft_trans_rule(trans),
7577                                               NFT_MSG_DELRULE);
7578                         nft_rule_expr_deactivate(&trans->ctx,
7579                                                  nft_trans_rule(trans),
7580                                                  NFT_TRANS_COMMIT);
7581                         break;
7582                 case NFT_MSG_NEWSET:
7583                         nft_clear(net, nft_trans_set(trans));
7584                         /* This avoids hitting -EBUSY when deleting the table
7585                          * from the transaction.
7586                          */
7587                         if (nft_set_is_anonymous(nft_trans_set(trans)) &&
7588                             !list_empty(&nft_trans_set(trans)->bindings))
7589                                 trans->ctx.table->use--;
7590
7591                         nf_tables_set_notify(&trans->ctx, nft_trans_set(trans),
7592                                              NFT_MSG_NEWSET, GFP_KERNEL);
7593                         nft_trans_destroy(trans);
7594                         break;
7595                 case NFT_MSG_DELSET:
7596                         list_del_rcu(&nft_trans_set(trans)->list);
7597                         nf_tables_set_notify(&trans->ctx, nft_trans_set(trans),
7598                                              NFT_MSG_DELSET, GFP_KERNEL);
7599                         break;
7600                 case NFT_MSG_NEWSETELEM:
7601                         te = (struct nft_trans_elem *)trans->data;
7602
7603                         te->set->ops->activate(net, te->set, &te->elem);
7604                         nf_tables_setelem_notify(&trans->ctx, te->set,
7605                                                  &te->elem,
7606                                                  NFT_MSG_NEWSETELEM, 0);
7607                         nft_trans_destroy(trans);
7608                         break;
7609                 case NFT_MSG_DELSETELEM:
7610                         te = (struct nft_trans_elem *)trans->data;
7611
7612                         nf_tables_setelem_notify(&trans->ctx, te->set,
7613                                                  &te->elem,
7614                                                  NFT_MSG_DELSETELEM, 0);
7615                         te->set->ops->remove(net, te->set, &te->elem);
7616                         atomic_dec(&te->set->nelems);
7617                         te->set->ndeact--;
7618                         break;
7619                 case NFT_MSG_NEWOBJ:
7620                         if (nft_trans_obj_update(trans)) {
7621                                 nft_obj_commit_update(trans);
7622                                 nf_tables_obj_notify(&trans->ctx,
7623                                                      nft_trans_obj(trans),
7624                                                      NFT_MSG_NEWOBJ);
7625                         } else {
7626                                 nft_clear(net, nft_trans_obj(trans));
7627                                 nf_tables_obj_notify(&trans->ctx,
7628                                                      nft_trans_obj(trans),
7629                                                      NFT_MSG_NEWOBJ);
7630                                 nft_trans_destroy(trans);
7631                         }
7632                         break;
7633                 case NFT_MSG_DELOBJ:
7634                         nft_obj_del(nft_trans_obj(trans));
7635                         nf_tables_obj_notify(&trans->ctx, nft_trans_obj(trans),
7636                                              NFT_MSG_DELOBJ);
7637                         break;
7638                 case NFT_MSG_NEWFLOWTABLE:
7639                         if (nft_trans_flowtable_update(trans)) {
7640                                 nf_tables_flowtable_notify(&trans->ctx,
7641                                                            nft_trans_flowtable(trans),
7642                                                            &nft_trans_flowtable_hooks(trans),
7643                                                            NFT_MSG_NEWFLOWTABLE);
7644                                 list_splice(&nft_trans_flowtable_hooks(trans),
7645                                             &nft_trans_flowtable(trans)->hook_list);
7646                         } else {
7647                                 nft_clear(net, nft_trans_flowtable(trans));
7648                                 nf_tables_flowtable_notify(&trans->ctx,
7649                                                            nft_trans_flowtable(trans),
7650                                                            &nft_trans_flowtable(trans)->hook_list,
7651                                                            NFT_MSG_NEWFLOWTABLE);
7652                         }
7653                         nft_trans_destroy(trans);
7654                         break;
7655                 case NFT_MSG_DELFLOWTABLE:
7656                         if (nft_trans_flowtable_update(trans)) {
7657                                 nft_flowtable_hooks_del(nft_trans_flowtable(trans),
7658                                                         &nft_trans_flowtable_hooks(trans));
7659                                 nf_tables_flowtable_notify(&trans->ctx,
7660                                                            nft_trans_flowtable(trans),
7661                                                            &nft_trans_flowtable_hooks(trans),
7662                                                            NFT_MSG_DELFLOWTABLE);
7663                                 nft_unregister_flowtable_net_hooks(net,
7664                                                                    &nft_trans_flowtable_hooks(trans));
7665                         } else {
7666                                 list_del_rcu(&nft_trans_flowtable(trans)->list);
7667                                 nf_tables_flowtable_notify(&trans->ctx,
7668                                                            nft_trans_flowtable(trans),
7669                                                            &nft_trans_flowtable(trans)->hook_list,
7670                                                            NFT_MSG_DELFLOWTABLE);
7671                                 nft_unregister_flowtable_net_hooks(net,
7672                                                 &nft_trans_flowtable(trans)->hook_list);
7673                         }
7674                         break;
7675                 }
7676         }
7677
7678         nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
7679         nf_tables_commit_release(net);
7680
7681         return 0;
7682 }
7683
7684 static void nf_tables_module_autoload(struct net *net)
7685 {
7686         struct nft_module_request *req, *next;
7687         LIST_HEAD(module_list);
7688
7689         list_splice_init(&net->nft.module_list, &module_list);
7690         mutex_unlock(&net->nft.commit_mutex);
7691         list_for_each_entry_safe(req, next, &module_list, list) {
7692                 request_module("%s", req->module);
7693                 req->done = true;
7694         }
7695         mutex_lock(&net->nft.commit_mutex);
7696         list_splice(&module_list, &net->nft.module_list);
7697 }
7698
7699 static void nf_tables_abort_release(struct nft_trans *trans)
7700 {
7701         switch (trans->msg_type) {
7702         case NFT_MSG_NEWTABLE:
7703                 nf_tables_table_destroy(&trans->ctx);
7704                 break;
7705         case NFT_MSG_NEWCHAIN:
7706                 nf_tables_chain_destroy(&trans->ctx);
7707                 break;
7708         case NFT_MSG_NEWRULE:
7709                 nf_tables_rule_destroy(&trans->ctx, nft_trans_rule(trans));
7710                 break;
7711         case NFT_MSG_NEWSET:
7712                 nft_set_destroy(&trans->ctx, nft_trans_set(trans));
7713                 break;
7714         case NFT_MSG_NEWSETELEM:
7715                 nft_set_elem_destroy(nft_trans_elem_set(trans),
7716                                      nft_trans_elem(trans).priv, true);
7717                 break;
7718         case NFT_MSG_NEWOBJ:
7719                 nft_obj_destroy(&trans->ctx, nft_trans_obj(trans));
7720                 break;
7721         case NFT_MSG_NEWFLOWTABLE:
7722                 if (nft_trans_flowtable_update(trans))
7723                         nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans));
7724                 else
7725                         nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
7726                 break;
7727         }
7728         kfree(trans);
7729 }
7730
7731 static int __nf_tables_abort(struct net *net, bool autoload)
7732 {
7733         struct nft_trans *trans, *next;
7734         struct nft_trans_elem *te;
7735         struct nft_hook *hook;
7736
7737         list_for_each_entry_safe_reverse(trans, next, &net->nft.commit_list,
7738                                          list) {
7739                 switch (trans->msg_type) {
7740                 case NFT_MSG_NEWTABLE:
7741                         if (nft_trans_table_update(trans)) {
7742                                 if (nft_trans_table_enable(trans)) {
7743                                         nf_tables_table_disable(net,
7744                                                                 trans->ctx.table);
7745                                         trans->ctx.table->flags |= NFT_TABLE_F_DORMANT;
7746                                 }
7747                                 nft_trans_destroy(trans);
7748                         } else {
7749                                 list_del_rcu(&trans->ctx.table->list);
7750                         }
7751                         break;
7752                 case NFT_MSG_DELTABLE:
7753                         nft_clear(trans->ctx.net, trans->ctx.table);
7754                         nft_trans_destroy(trans);
7755                         break;
7756                 case NFT_MSG_NEWCHAIN:
7757                         if (nft_trans_chain_update(trans)) {
7758                                 free_percpu(nft_trans_chain_stats(trans));
7759                                 kfree(nft_trans_chain_name(trans));
7760                                 nft_trans_destroy(trans);
7761                         } else {
7762                                 trans->ctx.table->use--;
7763                                 nft_chain_del(trans->ctx.chain);
7764                                 nf_tables_unregister_hook(trans->ctx.net,
7765                                                           trans->ctx.table,
7766                                                           trans->ctx.chain);
7767                         }
7768                         break;
7769                 case NFT_MSG_DELCHAIN:
7770                         trans->ctx.table->use++;
7771                         nft_clear(trans->ctx.net, trans->ctx.chain);
7772                         nft_trans_destroy(trans);
7773                         break;
7774                 case NFT_MSG_NEWRULE:
7775                         trans->ctx.chain->use--;
7776                         list_del_rcu(&nft_trans_rule(trans)->list);
7777                         nft_rule_expr_deactivate(&trans->ctx,
7778                                                  nft_trans_rule(trans),
7779                                                  NFT_TRANS_ABORT);
7780                         break;
7781                 case NFT_MSG_DELRULE:
7782                         trans->ctx.chain->use++;
7783                         nft_clear(trans->ctx.net, nft_trans_rule(trans));
7784                         nft_rule_expr_activate(&trans->ctx, nft_trans_rule(trans));
7785                         nft_trans_destroy(trans);
7786                         break;
7787                 case NFT_MSG_NEWSET:
7788                         trans->ctx.table->use--;
7789                         if (nft_trans_set_bound(trans)) {
7790                                 nft_trans_destroy(trans);
7791                                 break;
7792                         }
7793                         list_del_rcu(&nft_trans_set(trans)->list);
7794                         break;
7795                 case NFT_MSG_DELSET:
7796                         trans->ctx.table->use++;
7797                         nft_clear(trans->ctx.net, nft_trans_set(trans));
7798                         nft_trans_destroy(trans);
7799                         break;
7800                 case NFT_MSG_NEWSETELEM:
7801                         if (nft_trans_elem_set_bound(trans)) {
7802                                 nft_trans_destroy(trans);
7803                                 break;
7804                         }
7805                         te = (struct nft_trans_elem *)trans->data;
7806                         te->set->ops->remove(net, te->set, &te->elem);
7807                         atomic_dec(&te->set->nelems);
7808                         break;
7809                 case NFT_MSG_DELSETELEM:
7810                         te = (struct nft_trans_elem *)trans->data;
7811
7812                         nft_set_elem_activate(net, te->set, &te->elem);
7813                         te->set->ops->activate(net, te->set, &te->elem);
7814                         te->set->ndeact--;
7815
7816                         nft_trans_destroy(trans);
7817                         break;
7818                 case NFT_MSG_NEWOBJ:
7819                         if (nft_trans_obj_update(trans)) {
7820                                 kfree(nft_trans_obj_newobj(trans));
7821                                 nft_trans_destroy(trans);
7822                         } else {
7823                                 trans->ctx.table->use--;
7824                                 nft_obj_del(nft_trans_obj(trans));
7825                         }
7826                         break;
7827                 case NFT_MSG_DELOBJ:
7828                         trans->ctx.table->use++;
7829                         nft_clear(trans->ctx.net, nft_trans_obj(trans));
7830                         nft_trans_destroy(trans);
7831                         break;
7832                 case NFT_MSG_NEWFLOWTABLE:
7833                         if (nft_trans_flowtable_update(trans)) {
7834                                 nft_unregister_flowtable_net_hooks(net,
7835                                                 &nft_trans_flowtable_hooks(trans));
7836                         } else {
7837                                 trans->ctx.table->use--;
7838                                 list_del_rcu(&nft_trans_flowtable(trans)->list);
7839                                 nft_unregister_flowtable_net_hooks(net,
7840                                                 &nft_trans_flowtable(trans)->hook_list);
7841                         }
7842                         break;
7843                 case NFT_MSG_DELFLOWTABLE:
7844                         if (nft_trans_flowtable_update(trans)) {
7845                                 list_for_each_entry(hook, &nft_trans_flowtable(trans)->hook_list, list)
7846                                         hook->inactive = false;
7847                         } else {
7848                                 trans->ctx.table->use++;
7849                                 nft_clear(trans->ctx.net, nft_trans_flowtable(trans));
7850                         }
7851                         nft_trans_destroy(trans);
7852                         break;
7853                 }
7854         }
7855
7856         synchronize_rcu();
7857
7858         list_for_each_entry_safe_reverse(trans, next,
7859                                          &net->nft.commit_list, list) {
7860                 list_del(&trans->list);
7861                 nf_tables_abort_release(trans);
7862         }
7863
7864         if (autoload)
7865                 nf_tables_module_autoload(net);
7866         else
7867                 nf_tables_module_autoload_cleanup(net);
7868
7869         return 0;
7870 }
7871
7872 static void nf_tables_cleanup(struct net *net)
7873 {
7874         nft_validate_state_update(net, NFT_VALIDATE_SKIP);
7875 }
7876
7877 static int nf_tables_abort(struct net *net, struct sk_buff *skb, bool autoload)
7878 {
7879         int ret = __nf_tables_abort(net, autoload);
7880
7881         mutex_unlock(&net->nft.commit_mutex);
7882
7883         return ret;
7884 }
7885
7886 static bool nf_tables_valid_genid(struct net *net, u32 genid)
7887 {
7888         bool genid_ok;
7889
7890         mutex_lock(&net->nft.commit_mutex);
7891
7892         genid_ok = genid == 0 || net->nft.base_seq == genid;
7893         if (!genid_ok)
7894                 mutex_unlock(&net->nft.commit_mutex);
7895
7896         /* else, commit mutex has to be released by commit or abort function */
7897         return genid_ok;
7898 }
7899
7900 static const struct nfnetlink_subsystem nf_tables_subsys = {
7901         .name           = "nf_tables",
7902         .subsys_id      = NFNL_SUBSYS_NFTABLES,
7903         .cb_count       = NFT_MSG_MAX,
7904         .cb             = nf_tables_cb,
7905         .commit         = nf_tables_commit,
7906         .abort          = nf_tables_abort,
7907         .cleanup        = nf_tables_cleanup,
7908         .valid_genid    = nf_tables_valid_genid,
7909         .owner          = THIS_MODULE,
7910 };
7911
7912 int nft_chain_validate_dependency(const struct nft_chain *chain,
7913                                   enum nft_chain_types type)
7914 {
7915         const struct nft_base_chain *basechain;
7916
7917         if (nft_is_base_chain(chain)) {
7918                 basechain = nft_base_chain(chain);
7919                 if (basechain->type->type != type)
7920                         return -EOPNOTSUPP;
7921         }
7922         return 0;
7923 }
7924 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency);
7925
7926 int nft_chain_validate_hooks(const struct nft_chain *chain,
7927                              unsigned int hook_flags)
7928 {
7929         struct nft_base_chain *basechain;
7930
7931         if (nft_is_base_chain(chain)) {
7932                 basechain = nft_base_chain(chain);
7933
7934                 if ((1 << basechain->ops.hooknum) & hook_flags)
7935                         return 0;
7936
7937                 return -EOPNOTSUPP;
7938         }
7939
7940         return 0;
7941 }
7942 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks);
7943
7944 /*
7945  * Loop detection - walk through the ruleset beginning at the destination chain
7946  * of a new jump until either the source chain is reached (loop) or all
7947  * reachable chains have been traversed.
7948  *
7949  * The loop check is performed whenever a new jump verdict is added to an
7950  * expression or verdict map or a verdict map is bound to a new chain.
7951  */
7952
7953 static int nf_tables_check_loops(const struct nft_ctx *ctx,
7954                                  const struct nft_chain *chain);
7955
7956 static int nf_tables_loop_check_setelem(const struct nft_ctx *ctx,
7957                                         struct nft_set *set,
7958                                         const struct nft_set_iter *iter,
7959                                         struct nft_set_elem *elem)
7960 {
7961         const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
7962         const struct nft_data *data;
7963
7964         if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
7965             *nft_set_ext_flags(ext) & NFT_SET_ELEM_INTERVAL_END)
7966                 return 0;
7967
7968         data = nft_set_ext_data(ext);
7969         switch (data->verdict.code) {
7970         case NFT_JUMP:
7971         case NFT_GOTO:
7972                 return nf_tables_check_loops(ctx, data->verdict.chain);
7973         default:
7974                 return 0;
7975         }
7976 }
7977
7978 static int nf_tables_check_loops(const struct nft_ctx *ctx,
7979                                  const struct nft_chain *chain)
7980 {
7981         const struct nft_rule *rule;
7982         const struct nft_expr *expr, *last;
7983         struct nft_set *set;
7984         struct nft_set_binding *binding;
7985         struct nft_set_iter iter;
7986
7987         if (ctx->chain == chain)
7988                 return -ELOOP;
7989
7990         list_for_each_entry(rule, &chain->rules, list) {
7991                 nft_rule_for_each_expr(expr, last, rule) {
7992                         struct nft_immediate_expr *priv;
7993                         const struct nft_data *data;
7994                         int err;
7995
7996                         if (strcmp(expr->ops->type->name, "immediate"))
7997                                 continue;
7998
7999                         priv = nft_expr_priv(expr);
8000                         if (priv->dreg != NFT_REG_VERDICT)
8001                                 continue;
8002
8003                         data = &priv->data;
8004                         switch (data->verdict.code) {
8005                         case NFT_JUMP:
8006                         case NFT_GOTO:
8007                                 err = nf_tables_check_loops(ctx,
8008                                                         data->verdict.chain);
8009                                 if (err < 0)
8010                                         return err;
8011                         default:
8012                                 break;
8013                         }
8014                 }
8015         }
8016
8017         list_for_each_entry(set, &ctx->table->sets, list) {
8018                 if (!nft_is_active_next(ctx->net, set))
8019                         continue;
8020                 if (!(set->flags & NFT_SET_MAP) ||
8021                     set->dtype != NFT_DATA_VERDICT)
8022                         continue;
8023
8024                 list_for_each_entry(binding, &set->bindings, list) {
8025                         if (!(binding->flags & NFT_SET_MAP) ||
8026                             binding->chain != chain)
8027                                 continue;
8028
8029                         iter.genmask    = nft_genmask_next(ctx->net);
8030                         iter.skip       = 0;
8031                         iter.count      = 0;
8032                         iter.err        = 0;
8033                         iter.fn         = nf_tables_loop_check_setelem;
8034
8035                         set->ops->walk(ctx, set, &iter);
8036                         if (iter.err < 0)
8037                                 return iter.err;
8038                 }
8039         }
8040
8041         return 0;
8042 }
8043
8044 /**
8045  *      nft_parse_u32_check - fetch u32 attribute and check for maximum value
8046  *
8047  *      @attr: netlink attribute to fetch value from
8048  *      @max: maximum value to be stored in dest
8049  *      @dest: pointer to the variable
8050  *
8051  *      Parse, check and store a given u32 netlink attribute into variable.
8052  *      This function returns -ERANGE if the value goes over maximum value.
8053  *      Otherwise a 0 is returned and the attribute value is stored in the
8054  *      destination variable.
8055  */
8056 int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
8057 {
8058         u32 val;
8059
8060         val = ntohl(nla_get_be32(attr));
8061         if (val > max)
8062                 return -ERANGE;
8063
8064         *dest = val;
8065         return 0;
8066 }
8067 EXPORT_SYMBOL_GPL(nft_parse_u32_check);
8068
8069 /**
8070  *      nft_parse_register - parse a register value from a netlink attribute
8071  *
8072  *      @attr: netlink attribute
8073  *
8074  *      Parse and translate a register value from a netlink attribute.
8075  *      Registers used to be 128 bit wide, these register numbers will be
8076  *      mapped to the corresponding 32 bit register numbers.
8077  */
8078 unsigned int nft_parse_register(const struct nlattr *attr)
8079 {
8080         unsigned int reg;
8081
8082         reg = ntohl(nla_get_be32(attr));
8083         switch (reg) {
8084         case NFT_REG_VERDICT...NFT_REG_4:
8085                 return reg * NFT_REG_SIZE / NFT_REG32_SIZE;
8086         default:
8087                 return reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
8088         }
8089 }
8090 EXPORT_SYMBOL_GPL(nft_parse_register);
8091
8092 /**
8093  *      nft_dump_register - dump a register value to a netlink attribute
8094  *
8095  *      @skb: socket buffer
8096  *      @attr: attribute number
8097  *      @reg: register number
8098  *
8099  *      Construct a netlink attribute containing the register number. For
8100  *      compatibility reasons, register numbers being a multiple of 4 are
8101  *      translated to the corresponding 128 bit register numbers.
8102  */
8103 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg)
8104 {
8105         if (reg % (NFT_REG_SIZE / NFT_REG32_SIZE) == 0)
8106                 reg = reg / (NFT_REG_SIZE / NFT_REG32_SIZE);
8107         else
8108                 reg = reg - NFT_REG_SIZE / NFT_REG32_SIZE + NFT_REG32_00;
8109
8110         return nla_put_be32(skb, attr, htonl(reg));
8111 }
8112 EXPORT_SYMBOL_GPL(nft_dump_register);
8113
8114 /**
8115  *      nft_validate_register_load - validate a load from a register
8116  *
8117  *      @reg: the register number
8118  *      @len: the length of the data
8119  *
8120  *      Validate that the input register is one of the general purpose
8121  *      registers and that the length of the load is within the bounds.
8122  */
8123 int nft_validate_register_load(enum nft_registers reg, unsigned int len)
8124 {
8125         if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
8126                 return -EINVAL;
8127         if (len == 0)
8128                 return -EINVAL;
8129         if (reg * NFT_REG32_SIZE + len > sizeof_field(struct nft_regs, data))
8130                 return -ERANGE;
8131
8132         return 0;
8133 }
8134 EXPORT_SYMBOL_GPL(nft_validate_register_load);
8135
8136 /**
8137  *      nft_validate_register_store - validate an expressions' register store
8138  *
8139  *      @ctx: context of the expression performing the load
8140  *      @reg: the destination register number
8141  *      @data: the data to load
8142  *      @type: the data type
8143  *      @len: the length of the data
8144  *
8145  *      Validate that a data load uses the appropriate data type for
8146  *      the destination register and the length is within the bounds.
8147  *      A value of NULL for the data means that its runtime gathered
8148  *      data.
8149  */
8150 int nft_validate_register_store(const struct nft_ctx *ctx,
8151                                 enum nft_registers reg,
8152                                 const struct nft_data *data,
8153                                 enum nft_data_types type, unsigned int len)
8154 {
8155         int err;
8156
8157         switch (reg) {
8158         case NFT_REG_VERDICT:
8159                 if (type != NFT_DATA_VERDICT)
8160                         return -EINVAL;
8161
8162                 if (data != NULL &&
8163                     (data->verdict.code == NFT_GOTO ||
8164                      data->verdict.code == NFT_JUMP)) {
8165                         err = nf_tables_check_loops(ctx, data->verdict.chain);
8166                         if (err < 0)
8167                                 return err;
8168                 }
8169
8170                 return 0;
8171         default:
8172                 if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
8173                         return -EINVAL;
8174                 if (len == 0)
8175                         return -EINVAL;
8176                 if (reg * NFT_REG32_SIZE + len >
8177                     sizeof_field(struct nft_regs, data))
8178                         return -ERANGE;
8179
8180                 if (data != NULL && type != NFT_DATA_VALUE)
8181                         return -EINVAL;
8182                 return 0;
8183         }
8184 }
8185 EXPORT_SYMBOL_GPL(nft_validate_register_store);
8186
8187 static const struct nla_policy nft_verdict_policy[NFTA_VERDICT_MAX + 1] = {
8188         [NFTA_VERDICT_CODE]     = { .type = NLA_U32 },
8189         [NFTA_VERDICT_CHAIN]    = { .type = NLA_STRING,
8190                                     .len = NFT_CHAIN_MAXNAMELEN - 1 },
8191 };
8192
8193 static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
8194                             struct nft_data_desc *desc, const struct nlattr *nla)
8195 {
8196         u8 genmask = nft_genmask_next(ctx->net);
8197         struct nlattr *tb[NFTA_VERDICT_MAX + 1];
8198         struct nft_chain *chain;
8199         int err;
8200
8201         err = nla_parse_nested_deprecated(tb, NFTA_VERDICT_MAX, nla,
8202                                           nft_verdict_policy, NULL);
8203         if (err < 0)
8204                 return err;
8205
8206         if (!tb[NFTA_VERDICT_CODE])
8207                 return -EINVAL;
8208         data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
8209
8210         switch (data->verdict.code) {
8211         default:
8212                 switch (data->verdict.code & NF_VERDICT_MASK) {
8213                 case NF_ACCEPT:
8214                 case NF_DROP:
8215                 case NF_QUEUE:
8216                         break;
8217                 default:
8218                         return -EINVAL;
8219                 }
8220                 /* fall through */
8221         case NFT_CONTINUE:
8222         case NFT_BREAK:
8223         case NFT_RETURN:
8224                 break;
8225         case NFT_JUMP:
8226         case NFT_GOTO:
8227                 if (!tb[NFTA_VERDICT_CHAIN])
8228                         return -EINVAL;
8229                 chain = nft_chain_lookup(ctx->net, ctx->table,
8230                                          tb[NFTA_VERDICT_CHAIN], genmask);
8231                 if (IS_ERR(chain))
8232                         return PTR_ERR(chain);
8233                 if (nft_is_base_chain(chain))
8234                         return -EOPNOTSUPP;
8235
8236                 chain->use++;
8237                 data->verdict.chain = chain;
8238                 break;
8239         }
8240
8241         desc->len = sizeof(data->verdict);
8242         desc->type = NFT_DATA_VERDICT;
8243         return 0;
8244 }
8245
8246 static void nft_verdict_uninit(const struct nft_data *data)
8247 {
8248         switch (data->verdict.code) {
8249         case NFT_JUMP:
8250         case NFT_GOTO:
8251                 data->verdict.chain->use--;
8252                 break;
8253         }
8254 }
8255
8256 int nft_verdict_dump(struct sk_buff *skb, int type, const struct nft_verdict *v)
8257 {
8258         struct nlattr *nest;
8259
8260         nest = nla_nest_start_noflag(skb, type);
8261         if (!nest)
8262                 goto nla_put_failure;
8263
8264         if (nla_put_be32(skb, NFTA_VERDICT_CODE, htonl(v->code)))
8265                 goto nla_put_failure;
8266
8267         switch (v->code) {
8268         case NFT_JUMP:
8269         case NFT_GOTO:
8270                 if (nla_put_string(skb, NFTA_VERDICT_CHAIN,
8271                                    v->chain->name))
8272                         goto nla_put_failure;
8273         }
8274         nla_nest_end(skb, nest);
8275         return 0;
8276
8277 nla_put_failure:
8278         return -1;
8279 }
8280
8281 static int nft_value_init(const struct nft_ctx *ctx,
8282                           struct nft_data *data, unsigned int size,
8283                           struct nft_data_desc *desc, const struct nlattr *nla)
8284 {
8285         unsigned int len;
8286
8287         len = nla_len(nla);
8288         if (len == 0)
8289                 return -EINVAL;
8290         if (len > size)
8291                 return -EOVERFLOW;
8292
8293         nla_memcpy(data->data, nla, len);
8294         desc->type = NFT_DATA_VALUE;
8295         desc->len  = len;
8296         return 0;
8297 }
8298
8299 static int nft_value_dump(struct sk_buff *skb, const struct nft_data *data,
8300                           unsigned int len)
8301 {
8302         return nla_put(skb, NFTA_DATA_VALUE, len, data->data);
8303 }
8304
8305 static const struct nla_policy nft_data_policy[NFTA_DATA_MAX + 1] = {
8306         [NFTA_DATA_VALUE]       = { .type = NLA_BINARY },
8307         [NFTA_DATA_VERDICT]     = { .type = NLA_NESTED },
8308 };
8309
8310 /**
8311  *      nft_data_init - parse nf_tables data netlink attributes
8312  *
8313  *      @ctx: context of the expression using the data
8314  *      @data: destination struct nft_data
8315  *      @size: maximum data length
8316  *      @desc: data description
8317  *      @nla: netlink attribute containing data
8318  *
8319  *      Parse the netlink data attributes and initialize a struct nft_data.
8320  *      The type and length of data are returned in the data description.
8321  *
8322  *      The caller can indicate that it only wants to accept data of type
8323  *      NFT_DATA_VALUE by passing NULL for the ctx argument.
8324  */
8325 int nft_data_init(const struct nft_ctx *ctx,
8326                   struct nft_data *data, unsigned int size,
8327                   struct nft_data_desc *desc, const struct nlattr *nla)
8328 {
8329         struct nlattr *tb[NFTA_DATA_MAX + 1];
8330         int err;
8331
8332         err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla,
8333                                           nft_data_policy, NULL);
8334         if (err < 0)
8335                 return err;
8336
8337         if (tb[NFTA_DATA_VALUE])
8338                 return nft_value_init(ctx, data, size, desc,
8339                                       tb[NFTA_DATA_VALUE]);
8340         if (tb[NFTA_DATA_VERDICT] && ctx != NULL)
8341                 return nft_verdict_init(ctx, data, desc, tb[NFTA_DATA_VERDICT]);
8342         return -EINVAL;
8343 }
8344 EXPORT_SYMBOL_GPL(nft_data_init);
8345
8346 /**
8347  *      nft_data_release - release a nft_data item
8348  *
8349  *      @data: struct nft_data to release
8350  *      @type: type of data
8351  *
8352  *      Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
8353  *      all others need to be released by calling this function.
8354  */
8355 void nft_data_release(const struct nft_data *data, enum nft_data_types type)
8356 {
8357         if (type < NFT_DATA_VERDICT)
8358                 return;
8359         switch (type) {
8360         case NFT_DATA_VERDICT:
8361                 return nft_verdict_uninit(data);
8362         default:
8363                 WARN_ON(1);
8364         }
8365 }
8366 EXPORT_SYMBOL_GPL(nft_data_release);
8367
8368 int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
8369                   enum nft_data_types type, unsigned int len)
8370 {
8371         struct nlattr *nest;
8372         int err;
8373
8374         nest = nla_nest_start_noflag(skb, attr);
8375         if (nest == NULL)
8376                 return -1;
8377
8378         switch (type) {
8379         case NFT_DATA_VALUE:
8380                 err = nft_value_dump(skb, data, len);
8381                 break;
8382         case NFT_DATA_VERDICT:
8383                 err = nft_verdict_dump(skb, NFTA_DATA_VERDICT, &data->verdict);
8384                 break;
8385         default:
8386                 err = -EINVAL;
8387                 WARN_ON(1);
8388         }
8389
8390         nla_nest_end(skb, nest);
8391         return err;
8392 }
8393 EXPORT_SYMBOL_GPL(nft_data_dump);
8394
8395 int __nft_release_basechain(struct nft_ctx *ctx)
8396 {
8397         struct nft_rule *rule, *nr;
8398
8399         if (WARN_ON(!nft_is_base_chain(ctx->chain)))
8400                 return 0;
8401
8402         nf_tables_unregister_hook(ctx->net, ctx->chain->table, ctx->chain);
8403         list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) {
8404                 list_del(&rule->list);
8405                 ctx->chain->use--;
8406                 nf_tables_rule_release(ctx, rule);
8407         }
8408         nft_chain_del(ctx->chain);
8409         ctx->table->use--;
8410         nf_tables_chain_destroy(ctx);
8411
8412         return 0;
8413 }
8414 EXPORT_SYMBOL_GPL(__nft_release_basechain);
8415
8416 static void __nft_release_tables(struct net *net)
8417 {
8418         struct nft_flowtable *flowtable, *nf;
8419         struct nft_table *table, *nt;
8420         struct nft_chain *chain, *nc;
8421         struct nft_object *obj, *ne;
8422         struct nft_rule *rule, *nr;
8423         struct nft_set *set, *ns;
8424         struct nft_ctx ctx = {
8425                 .net    = net,
8426                 .family = NFPROTO_NETDEV,
8427         };
8428
8429         list_for_each_entry_safe(table, nt, &net->nft.tables, list) {
8430                 ctx.family = table->family;
8431
8432                 list_for_each_entry(chain, &table->chains, list)
8433                         nf_tables_unregister_hook(net, table, chain);
8434                 /* No packets are walking on these chains anymore. */
8435                 ctx.table = table;
8436                 list_for_each_entry(chain, &table->chains, list) {
8437                         ctx.chain = chain;
8438                         list_for_each_entry_safe(rule, nr, &chain->rules, list) {
8439                                 list_del(&rule->list);
8440                                 chain->use--;
8441                                 nf_tables_rule_release(&ctx, rule);
8442                         }
8443                 }
8444                 list_for_each_entry_safe(flowtable, nf, &table->flowtables, list) {
8445                         list_del(&flowtable->list);
8446                         table->use--;
8447                         nf_tables_flowtable_destroy(flowtable);
8448                 }
8449                 list_for_each_entry_safe(set, ns, &table->sets, list) {
8450                         list_del(&set->list);
8451                         table->use--;
8452                         nft_set_destroy(&ctx, set);
8453                 }
8454                 list_for_each_entry_safe(obj, ne, &table->objects, list) {
8455                         nft_obj_del(obj);
8456                         table->use--;
8457                         nft_obj_destroy(&ctx, obj);
8458                 }
8459                 list_for_each_entry_safe(chain, nc, &table->chains, list) {
8460                         ctx.chain = chain;
8461                         nft_chain_del(chain);
8462                         table->use--;
8463                         nf_tables_chain_destroy(&ctx);
8464                 }
8465                 list_del(&table->list);
8466                 nf_tables_table_destroy(&ctx);
8467         }
8468 }
8469
8470 static int __net_init nf_tables_init_net(struct net *net)
8471 {
8472         INIT_LIST_HEAD(&net->nft.tables);
8473         INIT_LIST_HEAD(&net->nft.commit_list);
8474         INIT_LIST_HEAD(&net->nft.module_list);
8475         mutex_init(&net->nft.commit_mutex);
8476         net->nft.base_seq = 1;
8477         net->nft.validate_state = NFT_VALIDATE_SKIP;
8478
8479         return 0;
8480 }
8481
8482 static void __net_exit nf_tables_exit_net(struct net *net)
8483 {
8484         mutex_lock(&net->nft.commit_mutex);
8485         if (!list_empty(&net->nft.commit_list))
8486                 __nf_tables_abort(net, false);
8487         __nft_release_tables(net);
8488         mutex_unlock(&net->nft.commit_mutex);
8489         WARN_ON_ONCE(!list_empty(&net->nft.tables));
8490         WARN_ON_ONCE(!list_empty(&net->nft.module_list));
8491 }
8492
8493 static struct pernet_operations nf_tables_net_ops = {
8494         .init   = nf_tables_init_net,
8495         .exit   = nf_tables_exit_net,
8496 };
8497
8498 static int __init nf_tables_module_init(void)
8499 {
8500         int err;
8501
8502         spin_lock_init(&nf_tables_destroy_list_lock);
8503         err = register_pernet_subsys(&nf_tables_net_ops);
8504         if (err < 0)
8505                 return err;
8506
8507         err = nft_chain_filter_init();
8508         if (err < 0)
8509                 goto err1;
8510
8511         err = nf_tables_core_module_init();
8512         if (err < 0)
8513                 goto err2;
8514
8515         err = register_netdevice_notifier(&nf_tables_flowtable_notifier);
8516         if (err < 0)
8517                 goto err3;
8518
8519         err = rhltable_init(&nft_objname_ht, &nft_objname_ht_params);
8520         if (err < 0)
8521                 goto err4;
8522
8523         err = nft_offload_init();
8524         if (err < 0)
8525                 goto err5;
8526
8527         /* must be last */
8528         err = nfnetlink_subsys_register(&nf_tables_subsys);
8529         if (err < 0)
8530                 goto err6;
8531
8532         nft_chain_route_init();
8533
8534         return err;
8535 err6:
8536         nft_offload_exit();
8537 err5:
8538         rhltable_destroy(&nft_objname_ht);
8539 err4:
8540         unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
8541 err3:
8542         nf_tables_core_module_exit();
8543 err2:
8544         nft_chain_filter_fini();
8545 err1:
8546         unregister_pernet_subsys(&nf_tables_net_ops);
8547         return err;
8548 }
8549
8550 static void __exit nf_tables_module_exit(void)
8551 {
8552         nfnetlink_subsys_unregister(&nf_tables_subsys);
8553         nft_offload_exit();
8554         unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
8555         nft_chain_filter_fini();
8556         nft_chain_route_fini();
8557         unregister_pernet_subsys(&nf_tables_net_ops);
8558         cancel_work_sync(&trans_destroy_work);
8559         rcu_barrier();
8560         rhltable_destroy(&nft_objname_ht);
8561         nf_tables_core_module_exit();
8562 }
8563
8564 module_init(nf_tables_module_init);
8565 module_exit(nf_tables_module_exit);
8566
8567 MODULE_LICENSE("GPL");
8568 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
8569 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES);