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