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