OSDN Git Service

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