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