2 * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net>
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.
8 * Development of this code funded by Astaro AG (http://www.astaro.com/)
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_tables_core.h>
21 #include <net/netfilter/nf_tables.h>
22 #include <net/net_namespace.h>
25 static LIST_HEAD(nf_tables_expressions
);
26 static LIST_HEAD(nf_tables_objects
);
29 * nft_register_afinfo - register nf_tables address family info
31 * @afi: address family info to register
33 * Register the address family for use with nf_tables. Returns zero on
34 * success or a negative errno code otherwise.
36 int nft_register_afinfo(struct net
*net
, struct nft_af_info
*afi
)
38 INIT_LIST_HEAD(&afi
->tables
);
39 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
40 list_add_tail_rcu(&afi
->list
, &net
->nft
.af_info
);
41 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
44 EXPORT_SYMBOL_GPL(nft_register_afinfo
);
46 static void __nft_release_afinfo(struct net
*net
, struct nft_af_info
*afi
);
49 * nft_unregister_afinfo - unregister nf_tables address family info
51 * @afi: address family info to unregister
53 * Unregister the address family for use with nf_tables.
55 void nft_unregister_afinfo(struct net
*net
, struct nft_af_info
*afi
)
57 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
58 __nft_release_afinfo(net
, afi
);
59 list_del_rcu(&afi
->list
);
60 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
62 EXPORT_SYMBOL_GPL(nft_unregister_afinfo
);
64 static struct nft_af_info
*nft_afinfo_lookup(struct net
*net
, int family
)
66 struct nft_af_info
*afi
;
68 list_for_each_entry(afi
, &net
->nft
.af_info
, list
) {
69 if (afi
->family
== family
)
75 static struct nft_af_info
*
76 nf_tables_afinfo_lookup(struct net
*net
, int family
, bool autoload
)
78 struct nft_af_info
*afi
;
80 afi
= nft_afinfo_lookup(net
, family
);
85 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
86 request_module("nft-afinfo-%u", family
);
87 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
88 afi
= nft_afinfo_lookup(net
, family
);
90 return ERR_PTR(-EAGAIN
);
93 return ERR_PTR(-EAFNOSUPPORT
);
96 static void nft_ctx_init(struct nft_ctx
*ctx
,
98 const struct sk_buff
*skb
,
99 const struct nlmsghdr
*nlh
,
100 struct nft_af_info
*afi
,
101 struct nft_table
*table
,
102 struct nft_chain
*chain
,
103 const struct nlattr
* const *nla
)
110 ctx
->portid
= NETLINK_CB(skb
).portid
;
111 ctx
->report
= nlmsg_report(nlh
);
112 ctx
->seq
= nlh
->nlmsg_seq
;
115 static struct nft_trans
*nft_trans_alloc_gfp(const struct nft_ctx
*ctx
,
116 int msg_type
, u32 size
, gfp_t gfp
)
118 struct nft_trans
*trans
;
120 trans
= kzalloc(sizeof(struct nft_trans
) + size
, gfp
);
124 trans
->msg_type
= msg_type
;
130 static struct nft_trans
*nft_trans_alloc(const struct nft_ctx
*ctx
,
131 int msg_type
, u32 size
)
133 return nft_trans_alloc_gfp(ctx
, msg_type
, size
, GFP_KERNEL
);
136 static void nft_trans_destroy(struct nft_trans
*trans
)
138 list_del(&trans
->list
);
142 static int nf_tables_register_hooks(struct net
*net
,
143 const struct nft_table
*table
,
144 struct nft_chain
*chain
,
145 unsigned int hook_nops
)
147 if (table
->flags
& NFT_TABLE_F_DORMANT
||
148 !nft_is_base_chain(chain
))
151 return nf_register_net_hooks(net
, nft_base_chain(chain
)->ops
,
155 static void nf_tables_unregister_hooks(struct net
*net
,
156 const struct nft_table
*table
,
157 struct nft_chain
*chain
,
158 unsigned int hook_nops
)
160 if (table
->flags
& NFT_TABLE_F_DORMANT
||
161 !nft_is_base_chain(chain
))
164 nf_unregister_net_hooks(net
, nft_base_chain(chain
)->ops
, hook_nops
);
167 static int nft_trans_table_add(struct nft_ctx
*ctx
, int msg_type
)
169 struct nft_trans
*trans
;
171 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_table
));
175 if (msg_type
== NFT_MSG_NEWTABLE
)
176 nft_activate_next(ctx
->net
, ctx
->table
);
178 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
182 static int nft_deltable(struct nft_ctx
*ctx
)
186 err
= nft_trans_table_add(ctx
, NFT_MSG_DELTABLE
);
190 nft_deactivate_next(ctx
->net
, ctx
->table
);
194 static int nft_trans_chain_add(struct nft_ctx
*ctx
, int msg_type
)
196 struct nft_trans
*trans
;
198 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_chain
));
202 if (msg_type
== NFT_MSG_NEWCHAIN
)
203 nft_activate_next(ctx
->net
, ctx
->chain
);
205 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
209 static int nft_delchain(struct nft_ctx
*ctx
)
213 err
= nft_trans_chain_add(ctx
, NFT_MSG_DELCHAIN
);
218 nft_deactivate_next(ctx
->net
, ctx
->chain
);
223 /* either expr ops provide both activate/deactivate, or neither */
224 static bool nft_expr_check_ops(const struct nft_expr_ops
*ops
)
229 if (WARN_ON_ONCE((!ops
->activate
^ !ops
->deactivate
)))
235 static void nft_rule_expr_activate(const struct nft_ctx
*ctx
,
236 struct nft_rule
*rule
)
238 struct nft_expr
*expr
;
240 expr
= nft_expr_first(rule
);
241 while (expr
!= nft_expr_last(rule
) && expr
->ops
) {
242 if (expr
->ops
->activate
)
243 expr
->ops
->activate(ctx
, expr
);
245 expr
= nft_expr_next(expr
);
249 static void nft_rule_expr_deactivate(const struct nft_ctx
*ctx
,
250 struct nft_rule
*rule
)
252 struct nft_expr
*expr
;
254 expr
= nft_expr_first(rule
);
255 while (expr
!= nft_expr_last(rule
) && expr
->ops
) {
256 if (expr
->ops
->deactivate
)
257 expr
->ops
->deactivate(ctx
, expr
);
259 expr
= nft_expr_next(expr
);
264 nf_tables_delrule_deactivate(struct nft_ctx
*ctx
, struct nft_rule
*rule
)
266 /* You cannot delete the same rule twice */
267 if (nft_is_active_next(ctx
->net
, rule
)) {
268 nft_deactivate_next(ctx
->net
, rule
);
275 static struct nft_trans
*nft_trans_rule_add(struct nft_ctx
*ctx
, int msg_type
,
276 struct nft_rule
*rule
)
278 struct nft_trans
*trans
;
280 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_rule
));
284 if (msg_type
== NFT_MSG_NEWRULE
&& ctx
->nla
[NFTA_RULE_ID
] != NULL
) {
285 nft_trans_rule_id(trans
) =
286 ntohl(nla_get_be32(ctx
->nla
[NFTA_RULE_ID
]));
288 nft_trans_rule(trans
) = rule
;
289 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
294 static int nft_delrule(struct nft_ctx
*ctx
, struct nft_rule
*rule
)
296 struct nft_trans
*trans
;
299 trans
= nft_trans_rule_add(ctx
, NFT_MSG_DELRULE
, rule
);
303 err
= nf_tables_delrule_deactivate(ctx
, rule
);
305 nft_trans_destroy(trans
);
308 nft_rule_expr_deactivate(ctx
, rule
);
313 static int nft_delrule_by_chain(struct nft_ctx
*ctx
)
315 struct nft_rule
*rule
;
318 list_for_each_entry(rule
, &ctx
->chain
->rules
, list
) {
319 if (!nft_is_active_next(ctx
->net
, rule
))
322 err
= nft_delrule(ctx
, rule
);
329 static int nft_trans_set_add(struct nft_ctx
*ctx
, int msg_type
,
332 struct nft_trans
*trans
;
334 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_set
));
338 if (msg_type
== NFT_MSG_NEWSET
&& ctx
->nla
[NFTA_SET_ID
] != NULL
) {
339 nft_trans_set_id(trans
) =
340 ntohl(nla_get_be32(ctx
->nla
[NFTA_SET_ID
]));
341 nft_activate_next(ctx
->net
, set
);
343 nft_trans_set(trans
) = set
;
344 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
349 static int nft_delset(struct nft_ctx
*ctx
, struct nft_set
*set
)
353 err
= nft_trans_set_add(ctx
, NFT_MSG_DELSET
, set
);
357 nft_deactivate_next(ctx
->net
, set
);
363 static int nft_trans_obj_add(struct nft_ctx
*ctx
, int msg_type
,
364 struct nft_object
*obj
)
366 struct nft_trans
*trans
;
368 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_obj
));
372 if (msg_type
== NFT_MSG_NEWOBJ
)
373 nft_activate_next(ctx
->net
, obj
);
375 nft_trans_obj(trans
) = obj
;
376 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
381 static int nft_delobj(struct nft_ctx
*ctx
, struct nft_object
*obj
)
385 err
= nft_trans_obj_add(ctx
, NFT_MSG_DELOBJ
, obj
);
389 nft_deactivate_next(ctx
->net
, obj
);
399 static struct nft_table
*nft_table_lookup(const struct nft_af_info
*afi
,
400 const struct nlattr
*nla
,
403 struct nft_table
*table
;
405 list_for_each_entry(table
, &afi
->tables
, list
) {
406 if (!nla_strcmp(nla
, table
->name
) &&
407 nft_active_genmask(table
, genmask
))
413 static struct nft_table
*nf_tables_table_lookup(const struct nft_af_info
*afi
,
414 const struct nlattr
*nla
,
417 struct nft_table
*table
;
420 return ERR_PTR(-EINVAL
);
422 table
= nft_table_lookup(afi
, nla
, genmask
);
426 return ERR_PTR(-ENOENT
);
429 static inline u64
nf_tables_alloc_handle(struct nft_table
*table
)
431 return ++table
->hgenerator
;
434 static const struct nf_chain_type
*chain_type
[NFPROTO_NUMPROTO
][NFT_CHAIN_T_MAX
];
436 static const struct nf_chain_type
*
437 __nf_tables_chain_type_lookup(int family
, const struct nlattr
*nla
)
441 for (i
= 0; i
< NFT_CHAIN_T_MAX
; i
++) {
442 if (chain_type
[family
][i
] != NULL
&&
443 !nla_strcmp(nla
, chain_type
[family
][i
]->name
))
444 return chain_type
[family
][i
];
449 static const struct nf_chain_type
*
450 nf_tables_chain_type_lookup(const struct nft_af_info
*afi
,
451 const struct nlattr
*nla
,
454 const struct nf_chain_type
*type
;
456 type
= __nf_tables_chain_type_lookup(afi
->family
, nla
);
459 #ifdef CONFIG_MODULES
461 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
462 request_module("nft-chain-%u-%.*s", afi
->family
,
463 nla_len(nla
), (const char *)nla_data(nla
));
464 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
465 type
= __nf_tables_chain_type_lookup(afi
->family
, nla
);
467 return ERR_PTR(-EAGAIN
);
470 return ERR_PTR(-ENOENT
);
473 static const struct nla_policy nft_table_policy
[NFTA_TABLE_MAX
+ 1] = {
474 [NFTA_TABLE_NAME
] = { .type
= NLA_STRING
,
475 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
476 [NFTA_TABLE_FLAGS
] = { .type
= NLA_U32
},
479 static int nf_tables_fill_table_info(struct sk_buff
*skb
, struct net
*net
,
480 u32 portid
, u32 seq
, int event
, u32 flags
,
481 int family
, const struct nft_table
*table
)
483 struct nlmsghdr
*nlh
;
484 struct nfgenmsg
*nfmsg
;
486 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
487 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
489 goto nla_put_failure
;
491 nfmsg
= nlmsg_data(nlh
);
492 nfmsg
->nfgen_family
= family
;
493 nfmsg
->version
= NFNETLINK_V0
;
494 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
496 if (nla_put_string(skb
, NFTA_TABLE_NAME
, table
->name
) ||
497 nla_put_be32(skb
, NFTA_TABLE_FLAGS
, htonl(table
->flags
)) ||
498 nla_put_be32(skb
, NFTA_TABLE_USE
, htonl(table
->use
)))
499 goto nla_put_failure
;
505 nlmsg_trim(skb
, nlh
);
509 static void nf_tables_table_notify(const struct nft_ctx
*ctx
, int event
)
515 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
518 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
522 err
= nf_tables_fill_table_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
523 event
, 0, ctx
->afi
->family
, ctx
->table
);
529 nfnetlink_send(skb
, ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
,
530 ctx
->report
, GFP_KERNEL
);
533 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
536 static int nf_tables_dump_tables(struct sk_buff
*skb
,
537 struct netlink_callback
*cb
)
539 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
540 const struct nft_af_info
*afi
;
541 const struct nft_table
*table
;
542 unsigned int idx
= 0, s_idx
= cb
->args
[0];
543 struct net
*net
= sock_net(skb
->sk
);
544 int family
= nfmsg
->nfgen_family
;
547 cb
->seq
= net
->nft
.base_seq
;
549 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
550 if (family
!= NFPROTO_UNSPEC
&& family
!= afi
->family
)
553 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
557 memset(&cb
->args
[1], 0,
558 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
559 if (!nft_is_active(net
, table
))
561 if (nf_tables_fill_table_info(skb
, net
,
562 NETLINK_CB(cb
->skb
).portid
,
566 afi
->family
, table
) < 0)
569 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
580 static int nf_tables_gettable(struct net
*net
, struct sock
*nlsk
,
581 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
582 const struct nlattr
* const nla
[],
583 struct netlink_ext_ack
*extack
)
585 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
586 u8 genmask
= nft_genmask_cur(net
);
587 const struct nft_af_info
*afi
;
588 const struct nft_table
*table
;
589 struct sk_buff
*skb2
;
590 int family
= nfmsg
->nfgen_family
;
593 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
594 struct netlink_dump_control c
= {
595 .dump
= nf_tables_dump_tables
,
597 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
600 afi
= nf_tables_afinfo_lookup(net
, family
, false);
604 table
= nf_tables_table_lookup(afi
, nla
[NFTA_TABLE_NAME
], genmask
);
606 return PTR_ERR(table
);
608 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
612 err
= nf_tables_fill_table_info(skb2
, net
, NETLINK_CB(skb
).portid
,
613 nlh
->nlmsg_seq
, NFT_MSG_NEWTABLE
, 0,
618 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
625 static void _nf_tables_table_disable(struct net
*net
,
626 const struct nft_af_info
*afi
,
627 struct nft_table
*table
,
630 struct nft_chain
*chain
;
633 list_for_each_entry(chain
, &table
->chains
, list
) {
634 if (!nft_is_active_next(net
, chain
))
636 if (!nft_is_base_chain(chain
))
639 if (cnt
&& i
++ == cnt
)
642 nf_unregister_net_hooks(net
, nft_base_chain(chain
)->ops
,
647 static int nf_tables_table_enable(struct net
*net
,
648 const struct nft_af_info
*afi
,
649 struct nft_table
*table
)
651 struct nft_chain
*chain
;
654 list_for_each_entry(chain
, &table
->chains
, list
) {
655 if (!nft_is_active_next(net
, chain
))
657 if (!nft_is_base_chain(chain
))
660 err
= nf_register_net_hooks(net
, nft_base_chain(chain
)->ops
,
670 _nf_tables_table_disable(net
, afi
, table
, i
);
674 static void nf_tables_table_disable(struct net
*net
,
675 const struct nft_af_info
*afi
,
676 struct nft_table
*table
)
678 _nf_tables_table_disable(net
, afi
, table
, 0);
681 static int nf_tables_updtable(struct nft_ctx
*ctx
)
683 struct nft_trans
*trans
;
687 if (!ctx
->nla
[NFTA_TABLE_FLAGS
])
690 flags
= ntohl(nla_get_be32(ctx
->nla
[NFTA_TABLE_FLAGS
]));
691 if (flags
& ~NFT_TABLE_F_DORMANT
)
694 if (flags
== ctx
->table
->flags
)
697 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWTABLE
,
698 sizeof(struct nft_trans_table
));
702 if ((flags
& NFT_TABLE_F_DORMANT
) &&
703 !(ctx
->table
->flags
& NFT_TABLE_F_DORMANT
)) {
704 nft_trans_table_enable(trans
) = false;
705 } else if (!(flags
& NFT_TABLE_F_DORMANT
) &&
706 ctx
->table
->flags
& NFT_TABLE_F_DORMANT
) {
707 ret
= nf_tables_table_enable(ctx
->net
, ctx
->afi
, ctx
->table
);
709 ctx
->table
->flags
&= ~NFT_TABLE_F_DORMANT
;
710 nft_trans_table_enable(trans
) = true;
716 nft_trans_table_update(trans
) = true;
717 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
720 nft_trans_destroy(trans
);
724 static int nf_tables_newtable(struct net
*net
, struct sock
*nlsk
,
725 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
726 const struct nlattr
* const nla
[],
727 struct netlink_ext_ack
*extack
)
729 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
730 u8 genmask
= nft_genmask_next(net
);
731 const struct nlattr
*name
;
732 struct nft_af_info
*afi
;
733 struct nft_table
*table
;
734 int family
= nfmsg
->nfgen_family
;
739 afi
= nf_tables_afinfo_lookup(net
, family
, true);
743 name
= nla
[NFTA_TABLE_NAME
];
744 table
= nf_tables_table_lookup(afi
, name
, genmask
);
746 if (PTR_ERR(table
) != -ENOENT
)
747 return PTR_ERR(table
);
749 if (nlh
->nlmsg_flags
& NLM_F_EXCL
)
751 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
754 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
755 return nf_tables_updtable(&ctx
);
758 if (nla
[NFTA_TABLE_FLAGS
]) {
759 flags
= ntohl(nla_get_be32(nla
[NFTA_TABLE_FLAGS
]));
760 if (flags
& ~NFT_TABLE_F_DORMANT
)
765 if (!try_module_get(afi
->owner
))
769 table
= kzalloc(sizeof(*table
), GFP_KERNEL
);
773 table
->name
= nla_strdup(name
, GFP_KERNEL
);
774 if (table
->name
== NULL
)
777 INIT_LIST_HEAD(&table
->chains
);
778 INIT_LIST_HEAD(&table
->sets
);
779 INIT_LIST_HEAD(&table
->objects
);
780 table
->flags
= flags
;
782 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
783 err
= nft_trans_table_add(&ctx
, NFT_MSG_NEWTABLE
);
787 list_add_tail_rcu(&table
->list
, &afi
->tables
);
794 module_put(afi
->owner
);
799 static int nft_flush_table(struct nft_ctx
*ctx
)
802 struct nft_chain
*chain
, *nc
;
803 struct nft_object
*obj
, *ne
;
804 struct nft_set
*set
, *ns
;
806 list_for_each_entry(chain
, &ctx
->table
->chains
, list
) {
807 if (!nft_is_active_next(ctx
->net
, chain
))
812 err
= nft_delrule_by_chain(ctx
);
817 list_for_each_entry_safe(set
, ns
, &ctx
->table
->sets
, list
) {
818 if (!nft_is_active_next(ctx
->net
, set
))
821 if (set
->flags
& NFT_SET_ANONYMOUS
&&
822 !list_empty(&set
->bindings
))
825 err
= nft_delset(ctx
, set
);
830 list_for_each_entry_safe(obj
, ne
, &ctx
->table
->objects
, list
) {
831 err
= nft_delobj(ctx
, obj
);
836 list_for_each_entry_safe(chain
, nc
, &ctx
->table
->chains
, list
) {
837 if (!nft_is_active_next(ctx
->net
, chain
))
842 err
= nft_delchain(ctx
);
847 err
= nft_deltable(ctx
);
852 static int nft_flush(struct nft_ctx
*ctx
, int family
)
854 struct nft_af_info
*afi
;
855 struct nft_table
*table
, *nt
;
856 const struct nlattr
* const *nla
= ctx
->nla
;
859 list_for_each_entry(afi
, &ctx
->net
->nft
.af_info
, list
) {
860 if (family
!= AF_UNSPEC
&& afi
->family
!= family
)
864 list_for_each_entry_safe(table
, nt
, &afi
->tables
, list
) {
865 if (!nft_is_active_next(ctx
->net
, table
))
868 if (nla
[NFTA_TABLE_NAME
] &&
869 nla_strcmp(nla
[NFTA_TABLE_NAME
], table
->name
) != 0)
874 err
= nft_flush_table(ctx
);
883 static int nf_tables_deltable(struct net
*net
, struct sock
*nlsk
,
884 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
885 const struct nlattr
* const nla
[],
886 struct netlink_ext_ack
*extack
)
888 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
889 u8 genmask
= nft_genmask_next(net
);
890 struct nft_af_info
*afi
;
891 struct nft_table
*table
;
892 int family
= nfmsg
->nfgen_family
;
895 nft_ctx_init(&ctx
, net
, skb
, nlh
, NULL
, NULL
, NULL
, nla
);
896 if (family
== AF_UNSPEC
|| nla
[NFTA_TABLE_NAME
] == NULL
)
897 return nft_flush(&ctx
, family
);
899 afi
= nf_tables_afinfo_lookup(net
, family
, false);
903 table
= nf_tables_table_lookup(afi
, nla
[NFTA_TABLE_NAME
], genmask
);
905 return PTR_ERR(table
);
907 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
914 return nft_flush_table(&ctx
);
917 static void nf_tables_table_destroy(struct nft_ctx
*ctx
)
919 if (WARN_ON(ctx
->table
->use
> 0))
922 kfree(ctx
->table
->name
);
924 module_put(ctx
->afi
->owner
);
927 int nft_register_chain_type(const struct nf_chain_type
*ctype
)
931 if (WARN_ON(ctype
->family
>= NFPROTO_NUMPROTO
))
934 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
935 if (chain_type
[ctype
->family
][ctype
->type
] != NULL
) {
939 chain_type
[ctype
->family
][ctype
->type
] = ctype
;
941 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
944 EXPORT_SYMBOL_GPL(nft_register_chain_type
);
946 void nft_unregister_chain_type(const struct nf_chain_type
*ctype
)
948 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
949 chain_type
[ctype
->family
][ctype
->type
] = NULL
;
950 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
952 EXPORT_SYMBOL_GPL(nft_unregister_chain_type
);
958 static struct nft_chain
*
959 nf_tables_chain_lookup_byhandle(const struct nft_table
*table
, u64 handle
,
962 struct nft_chain
*chain
;
964 list_for_each_entry(chain
, &table
->chains
, list
) {
965 if (chain
->handle
== handle
&&
966 nft_active_genmask(chain
, genmask
))
970 return ERR_PTR(-ENOENT
);
973 static struct nft_chain
*nf_tables_chain_lookup(const struct nft_table
*table
,
974 const struct nlattr
*nla
,
977 struct nft_chain
*chain
;
980 return ERR_PTR(-EINVAL
);
982 list_for_each_entry(chain
, &table
->chains
, list
) {
983 if (!nla_strcmp(nla
, chain
->name
) &&
984 nft_active_genmask(chain
, genmask
))
988 return ERR_PTR(-ENOENT
);
991 static const struct nla_policy nft_chain_policy
[NFTA_CHAIN_MAX
+ 1] = {
992 [NFTA_CHAIN_TABLE
] = { .type
= NLA_STRING
,
993 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
994 [NFTA_CHAIN_HANDLE
] = { .type
= NLA_U64
},
995 [NFTA_CHAIN_NAME
] = { .type
= NLA_STRING
,
996 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
997 [NFTA_CHAIN_HOOK
] = { .type
= NLA_NESTED
},
998 [NFTA_CHAIN_POLICY
] = { .type
= NLA_U32
},
999 [NFTA_CHAIN_TYPE
] = { .type
= NLA_STRING
},
1000 [NFTA_CHAIN_COUNTERS
] = { .type
= NLA_NESTED
},
1003 static const struct nla_policy nft_hook_policy
[NFTA_HOOK_MAX
+ 1] = {
1004 [NFTA_HOOK_HOOKNUM
] = { .type
= NLA_U32
},
1005 [NFTA_HOOK_PRIORITY
] = { .type
= NLA_U32
},
1006 [NFTA_HOOK_DEV
] = { .type
= NLA_STRING
,
1007 .len
= IFNAMSIZ
- 1 },
1010 static int nft_dump_stats(struct sk_buff
*skb
, struct nft_stats __percpu
*stats
)
1012 struct nft_stats
*cpu_stats
, total
;
1013 struct nlattr
*nest
;
1018 memset(&total
, 0, sizeof(total
));
1019 for_each_possible_cpu(cpu
) {
1020 cpu_stats
= per_cpu_ptr(stats
, cpu
);
1022 seq
= u64_stats_fetch_begin_irq(&cpu_stats
->syncp
);
1023 pkts
= cpu_stats
->pkts
;
1024 bytes
= cpu_stats
->bytes
;
1025 } while (u64_stats_fetch_retry_irq(&cpu_stats
->syncp
, seq
));
1027 total
.bytes
+= bytes
;
1029 nest
= nla_nest_start(skb
, NFTA_CHAIN_COUNTERS
);
1031 goto nla_put_failure
;
1033 if (nla_put_be64(skb
, NFTA_COUNTER_PACKETS
, cpu_to_be64(total
.pkts
),
1034 NFTA_COUNTER_PAD
) ||
1035 nla_put_be64(skb
, NFTA_COUNTER_BYTES
, cpu_to_be64(total
.bytes
),
1037 goto nla_put_failure
;
1039 nla_nest_end(skb
, nest
);
1046 static int nf_tables_fill_chain_info(struct sk_buff
*skb
, struct net
*net
,
1047 u32 portid
, u32 seq
, int event
, u32 flags
,
1048 int family
, const struct nft_table
*table
,
1049 const struct nft_chain
*chain
)
1051 struct nlmsghdr
*nlh
;
1052 struct nfgenmsg
*nfmsg
;
1054 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
1055 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
1057 goto nla_put_failure
;
1059 nfmsg
= nlmsg_data(nlh
);
1060 nfmsg
->nfgen_family
= family
;
1061 nfmsg
->version
= NFNETLINK_V0
;
1062 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
1064 if (nla_put_string(skb
, NFTA_CHAIN_TABLE
, table
->name
))
1065 goto nla_put_failure
;
1066 if (nla_put_be64(skb
, NFTA_CHAIN_HANDLE
, cpu_to_be64(chain
->handle
),
1068 goto nla_put_failure
;
1069 if (nla_put_string(skb
, NFTA_CHAIN_NAME
, chain
->name
))
1070 goto nla_put_failure
;
1072 if (nft_is_base_chain(chain
)) {
1073 const struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1074 const struct nf_hook_ops
*ops
= &basechain
->ops
[0];
1075 struct nlattr
*nest
;
1077 nest
= nla_nest_start(skb
, NFTA_CHAIN_HOOK
);
1079 goto nla_put_failure
;
1080 if (nla_put_be32(skb
, NFTA_HOOK_HOOKNUM
, htonl(ops
->hooknum
)))
1081 goto nla_put_failure
;
1082 if (nla_put_be32(skb
, NFTA_HOOK_PRIORITY
, htonl(ops
->priority
)))
1083 goto nla_put_failure
;
1084 if (basechain
->dev_name
[0] &&
1085 nla_put_string(skb
, NFTA_HOOK_DEV
, basechain
->dev_name
))
1086 goto nla_put_failure
;
1087 nla_nest_end(skb
, nest
);
1089 if (nla_put_be32(skb
, NFTA_CHAIN_POLICY
,
1090 htonl(basechain
->policy
)))
1091 goto nla_put_failure
;
1093 if (nla_put_string(skb
, NFTA_CHAIN_TYPE
, basechain
->type
->name
))
1094 goto nla_put_failure
;
1096 if (basechain
->stats
&& nft_dump_stats(skb
, basechain
->stats
))
1097 goto nla_put_failure
;
1100 if (nla_put_be32(skb
, NFTA_CHAIN_USE
, htonl(chain
->use
)))
1101 goto nla_put_failure
;
1103 nlmsg_end(skb
, nlh
);
1107 nlmsg_trim(skb
, nlh
);
1111 static void nf_tables_chain_notify(const struct nft_ctx
*ctx
, int event
)
1113 struct sk_buff
*skb
;
1117 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
1120 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
1124 err
= nf_tables_fill_chain_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
1125 event
, 0, ctx
->afi
->family
, ctx
->table
,
1132 nfnetlink_send(skb
, ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
,
1133 ctx
->report
, GFP_KERNEL
);
1136 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
1139 static int nf_tables_dump_chains(struct sk_buff
*skb
,
1140 struct netlink_callback
*cb
)
1142 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
1143 const struct nft_af_info
*afi
;
1144 const struct nft_table
*table
;
1145 const struct nft_chain
*chain
;
1146 unsigned int idx
= 0, s_idx
= cb
->args
[0];
1147 struct net
*net
= sock_net(skb
->sk
);
1148 int family
= nfmsg
->nfgen_family
;
1151 cb
->seq
= net
->nft
.base_seq
;
1153 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
1154 if (family
!= NFPROTO_UNSPEC
&& family
!= afi
->family
)
1157 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
1158 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
1162 memset(&cb
->args
[1], 0,
1163 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
1164 if (!nft_is_active(net
, chain
))
1166 if (nf_tables_fill_chain_info(skb
, net
,
1167 NETLINK_CB(cb
->skb
).portid
,
1171 afi
->family
, table
, chain
) < 0)
1174 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
1186 static int nf_tables_getchain(struct net
*net
, struct sock
*nlsk
,
1187 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1188 const struct nlattr
* const nla
[],
1189 struct netlink_ext_ack
*extack
)
1191 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1192 u8 genmask
= nft_genmask_cur(net
);
1193 const struct nft_af_info
*afi
;
1194 const struct nft_table
*table
;
1195 const struct nft_chain
*chain
;
1196 struct sk_buff
*skb2
;
1197 int family
= nfmsg
->nfgen_family
;
1200 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
1201 struct netlink_dump_control c
= {
1202 .dump
= nf_tables_dump_chains
,
1204 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
1207 afi
= nf_tables_afinfo_lookup(net
, family
, false);
1209 return PTR_ERR(afi
);
1211 table
= nf_tables_table_lookup(afi
, nla
[NFTA_CHAIN_TABLE
], genmask
);
1213 return PTR_ERR(table
);
1215 chain
= nf_tables_chain_lookup(table
, nla
[NFTA_CHAIN_NAME
], genmask
);
1217 return PTR_ERR(chain
);
1219 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
1223 err
= nf_tables_fill_chain_info(skb2
, net
, NETLINK_CB(skb
).portid
,
1224 nlh
->nlmsg_seq
, NFT_MSG_NEWCHAIN
, 0,
1225 family
, table
, chain
);
1229 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
1236 static const struct nla_policy nft_counter_policy
[NFTA_COUNTER_MAX
+ 1] = {
1237 [NFTA_COUNTER_PACKETS
] = { .type
= NLA_U64
},
1238 [NFTA_COUNTER_BYTES
] = { .type
= NLA_U64
},
1241 static struct nft_stats __percpu
*nft_stats_alloc(const struct nlattr
*attr
)
1243 struct nlattr
*tb
[NFTA_COUNTER_MAX
+1];
1244 struct nft_stats __percpu
*newstats
;
1245 struct nft_stats
*stats
;
1248 err
= nla_parse_nested(tb
, NFTA_COUNTER_MAX
, attr
, nft_counter_policy
,
1251 return ERR_PTR(err
);
1253 if (!tb
[NFTA_COUNTER_BYTES
] || !tb
[NFTA_COUNTER_PACKETS
])
1254 return ERR_PTR(-EINVAL
);
1256 newstats
= netdev_alloc_pcpu_stats(struct nft_stats
);
1257 if (newstats
== NULL
)
1258 return ERR_PTR(-ENOMEM
);
1260 /* Restore old counters on this cpu, no problem. Per-cpu statistics
1261 * are not exposed to userspace.
1264 stats
= this_cpu_ptr(newstats
);
1265 stats
->bytes
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_BYTES
]));
1266 stats
->pkts
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_PACKETS
]));
1272 static void nft_chain_stats_replace(struct nft_base_chain
*chain
,
1273 struct nft_stats __percpu
*newstats
)
1275 if (newstats
== NULL
)
1279 struct nft_stats __percpu
*oldstats
=
1280 nft_dereference(chain
->stats
);
1282 rcu_assign_pointer(chain
->stats
, newstats
);
1284 free_percpu(oldstats
);
1286 rcu_assign_pointer(chain
->stats
, newstats
);
1287 static_branch_inc(&nft_counters_enabled
);
1291 static void nf_tables_chain_destroy(struct nft_chain
*chain
)
1293 if (WARN_ON(chain
->use
> 0))
1296 if (nft_is_base_chain(chain
)) {
1297 struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1299 module_put(basechain
->type
->owner
);
1300 free_percpu(basechain
->stats
);
1301 if (basechain
->stats
)
1302 static_branch_dec(&nft_counters_enabled
);
1303 if (basechain
->ops
[0].dev
!= NULL
)
1304 dev_put(basechain
->ops
[0].dev
);
1313 struct nft_chain_hook
{
1316 const struct nf_chain_type
*type
;
1317 struct net_device
*dev
;
1320 static int nft_chain_parse_hook(struct net
*net
,
1321 const struct nlattr
* const nla
[],
1322 struct nft_af_info
*afi
,
1323 struct nft_chain_hook
*hook
, bool create
)
1325 struct nlattr
*ha
[NFTA_HOOK_MAX
+ 1];
1326 const struct nf_chain_type
*type
;
1327 struct net_device
*dev
;
1330 err
= nla_parse_nested(ha
, NFTA_HOOK_MAX
, nla
[NFTA_CHAIN_HOOK
],
1331 nft_hook_policy
, NULL
);
1335 if (ha
[NFTA_HOOK_HOOKNUM
] == NULL
||
1336 ha
[NFTA_HOOK_PRIORITY
] == NULL
)
1339 hook
->num
= ntohl(nla_get_be32(ha
[NFTA_HOOK_HOOKNUM
]));
1340 if (hook
->num
>= afi
->nhooks
)
1343 hook
->priority
= ntohl(nla_get_be32(ha
[NFTA_HOOK_PRIORITY
]));
1345 type
= chain_type
[afi
->family
][NFT_CHAIN_T_DEFAULT
];
1346 if (nla
[NFTA_CHAIN_TYPE
]) {
1347 type
= nf_tables_chain_type_lookup(afi
, nla
[NFTA_CHAIN_TYPE
],
1350 return PTR_ERR(type
);
1352 if (!(type
->hook_mask
& (1 << hook
->num
)))
1354 if (!try_module_get(type
->owner
))
1360 if (afi
->flags
& NFT_AF_NEEDS_DEV
) {
1361 char ifname
[IFNAMSIZ
];
1363 if (!ha
[NFTA_HOOK_DEV
]) {
1364 module_put(type
->owner
);
1368 nla_strlcpy(ifname
, ha
[NFTA_HOOK_DEV
], IFNAMSIZ
);
1369 dev
= dev_get_by_name(net
, ifname
);
1371 module_put(type
->owner
);
1375 } else if (ha
[NFTA_HOOK_DEV
]) {
1376 module_put(type
->owner
);
1383 static void nft_chain_release_hook(struct nft_chain_hook
*hook
)
1385 module_put(hook
->type
->owner
);
1386 if (hook
->dev
!= NULL
)
1390 static int nf_tables_addchain(struct nft_ctx
*ctx
, u8 family
, u8 genmask
,
1391 u8 policy
, bool create
)
1393 const struct nlattr
* const *nla
= ctx
->nla
;
1394 struct nft_table
*table
= ctx
->table
;
1395 struct nft_af_info
*afi
= ctx
->afi
;
1396 struct nft_base_chain
*basechain
;
1397 struct nft_stats __percpu
*stats
;
1398 struct net
*net
= ctx
->net
;
1399 struct nft_chain
*chain
;
1403 if (table
->use
== UINT_MAX
)
1406 if (nla
[NFTA_CHAIN_HOOK
]) {
1407 struct nft_chain_hook hook
;
1408 struct nf_hook_ops
*ops
;
1411 err
= nft_chain_parse_hook(net
, nla
, afi
, &hook
, create
);
1415 basechain
= kzalloc(sizeof(*basechain
), GFP_KERNEL
);
1416 if (basechain
== NULL
) {
1417 nft_chain_release_hook(&hook
);
1421 if (hook
.dev
!= NULL
)
1422 strncpy(basechain
->dev_name
, hook
.dev
->name
, IFNAMSIZ
);
1424 if (nla
[NFTA_CHAIN_COUNTERS
]) {
1425 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
1426 if (IS_ERR(stats
)) {
1427 nft_chain_release_hook(&hook
);
1429 return PTR_ERR(stats
);
1431 basechain
->stats
= stats
;
1432 static_branch_inc(&nft_counters_enabled
);
1435 hookfn
= hook
.type
->hooks
[hook
.num
];
1436 basechain
->type
= hook
.type
;
1437 chain
= &basechain
->chain
;
1439 for (i
= 0; i
< afi
->nops
; i
++) {
1440 ops
= &basechain
->ops
[i
];
1442 ops
->hooknum
= hook
.num
;
1443 ops
->priority
= hook
.priority
;
1445 ops
->hook
= afi
->hooks
[ops
->hooknum
];
1446 ops
->dev
= hook
.dev
;
1449 if (afi
->hook_ops_init
)
1450 afi
->hook_ops_init(ops
, i
);
1453 chain
->flags
|= NFT_BASE_CHAIN
;
1454 basechain
->policy
= policy
;
1456 chain
= kzalloc(sizeof(*chain
), GFP_KERNEL
);
1460 INIT_LIST_HEAD(&chain
->rules
);
1461 chain
->handle
= nf_tables_alloc_handle(table
);
1462 chain
->table
= table
;
1463 chain
->name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
1469 err
= nf_tables_register_hooks(net
, table
, chain
, afi
->nops
);
1474 err
= nft_trans_chain_add(ctx
, NFT_MSG_NEWCHAIN
);
1479 list_add_tail_rcu(&chain
->list
, &table
->chains
);
1483 nf_tables_unregister_hooks(net
, table
, chain
, afi
->nops
);
1485 nf_tables_chain_destroy(chain
);
1490 static int nf_tables_updchain(struct nft_ctx
*ctx
, u8 genmask
, u8 policy
,
1493 const struct nlattr
* const *nla
= ctx
->nla
;
1494 struct nft_table
*table
= ctx
->table
;
1495 struct nft_chain
*chain
= ctx
->chain
;
1496 struct nft_af_info
*afi
= ctx
->afi
;
1497 struct nft_base_chain
*basechain
;
1498 struct nft_stats
*stats
= NULL
;
1499 struct nft_chain_hook hook
;
1500 struct nf_hook_ops
*ops
;
1501 struct nft_trans
*trans
;
1504 if (nla
[NFTA_CHAIN_HOOK
]) {
1505 if (!nft_is_base_chain(chain
))
1508 err
= nft_chain_parse_hook(ctx
->net
, nla
, ctx
->afi
, &hook
,
1513 basechain
= nft_base_chain(chain
);
1514 if (basechain
->type
!= hook
.type
) {
1515 nft_chain_release_hook(&hook
);
1519 for (i
= 0; i
< afi
->nops
; i
++) {
1520 ops
= &basechain
->ops
[i
];
1521 if (ops
->hooknum
!= hook
.num
||
1522 ops
->priority
!= hook
.priority
||
1523 ops
->dev
!= hook
.dev
) {
1524 nft_chain_release_hook(&hook
);
1528 nft_chain_release_hook(&hook
);
1531 if (nla
[NFTA_CHAIN_HANDLE
] &&
1532 nla
[NFTA_CHAIN_NAME
]) {
1533 struct nft_chain
*chain2
;
1535 chain2
= nf_tables_chain_lookup(table
, nla
[NFTA_CHAIN_NAME
],
1537 if (!IS_ERR(chain2
))
1541 if (nla
[NFTA_CHAIN_COUNTERS
]) {
1542 if (!nft_is_base_chain(chain
))
1545 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
1547 return PTR_ERR(stats
);
1551 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWCHAIN
,
1552 sizeof(struct nft_trans_chain
));
1556 nft_trans_chain_stats(trans
) = stats
;
1557 nft_trans_chain_update(trans
) = true;
1559 if (nla
[NFTA_CHAIN_POLICY
])
1560 nft_trans_chain_policy(trans
) = policy
;
1562 nft_trans_chain_policy(trans
) = -1;
1564 if (nla
[NFTA_CHAIN_HANDLE
] &&
1565 nla
[NFTA_CHAIN_NAME
]) {
1566 struct nft_trans
*tmp
;
1570 name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
1575 list_for_each_entry(tmp
, &ctx
->net
->nft
.commit_list
, list
) {
1576 if (tmp
->msg_type
== NFT_MSG_NEWCHAIN
&&
1577 tmp
->ctx
.table
== table
&&
1578 nft_trans_chain_update(tmp
) &&
1579 nft_trans_chain_name(tmp
) &&
1580 strcmp(name
, nft_trans_chain_name(tmp
)) == 0) {
1586 nft_trans_chain_name(trans
) = name
;
1588 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
1597 static int nf_tables_newchain(struct net
*net
, struct sock
*nlsk
,
1598 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1599 const struct nlattr
* const nla
[],
1600 struct netlink_ext_ack
*extack
)
1602 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1603 const struct nlattr
* uninitialized_var(name
);
1604 u8 genmask
= nft_genmask_next(net
);
1605 int family
= nfmsg
->nfgen_family
;
1606 struct nft_af_info
*afi
;
1607 struct nft_table
*table
;
1608 struct nft_chain
*chain
;
1609 u8 policy
= NF_ACCEPT
;
1614 create
= nlh
->nlmsg_flags
& NLM_F_CREATE
? true : false;
1616 afi
= nf_tables_afinfo_lookup(net
, family
, true);
1618 return PTR_ERR(afi
);
1620 table
= nf_tables_table_lookup(afi
, nla
[NFTA_CHAIN_TABLE
], genmask
);
1622 return PTR_ERR(table
);
1625 name
= nla
[NFTA_CHAIN_NAME
];
1627 if (nla
[NFTA_CHAIN_HANDLE
]) {
1628 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_CHAIN_HANDLE
]));
1629 chain
= nf_tables_chain_lookup_byhandle(table
, handle
, genmask
);
1631 return PTR_ERR(chain
);
1633 chain
= nf_tables_chain_lookup(table
, name
, genmask
);
1634 if (IS_ERR(chain
)) {
1635 if (PTR_ERR(chain
) != -ENOENT
)
1636 return PTR_ERR(chain
);
1641 if (nla
[NFTA_CHAIN_POLICY
]) {
1642 if (chain
!= NULL
&&
1643 !nft_is_base_chain(chain
))
1646 if (chain
== NULL
&&
1647 nla
[NFTA_CHAIN_HOOK
] == NULL
)
1650 policy
= ntohl(nla_get_be32(nla
[NFTA_CHAIN_POLICY
]));
1660 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, chain
, nla
);
1662 if (chain
!= NULL
) {
1663 if (nlh
->nlmsg_flags
& NLM_F_EXCL
)
1665 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
1668 return nf_tables_updchain(&ctx
, genmask
, policy
, create
);
1671 return nf_tables_addchain(&ctx
, family
, genmask
, policy
, create
);
1674 static int nf_tables_delchain(struct net
*net
, struct sock
*nlsk
,
1675 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1676 const struct nlattr
* const nla
[],
1677 struct netlink_ext_ack
*extack
)
1679 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1680 u8 genmask
= nft_genmask_next(net
);
1681 struct nft_af_info
*afi
;
1682 struct nft_table
*table
;
1683 struct nft_chain
*chain
;
1684 struct nft_rule
*rule
;
1685 int family
= nfmsg
->nfgen_family
;
1690 afi
= nf_tables_afinfo_lookup(net
, family
, false);
1692 return PTR_ERR(afi
);
1694 table
= nf_tables_table_lookup(afi
, nla
[NFTA_CHAIN_TABLE
], genmask
);
1696 return PTR_ERR(table
);
1698 chain
= nf_tables_chain_lookup(table
, nla
[NFTA_CHAIN_NAME
], genmask
);
1700 return PTR_ERR(chain
);
1702 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
1706 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, chain
, nla
);
1709 list_for_each_entry(rule
, &chain
->rules
, list
) {
1710 if (!nft_is_active_next(net
, rule
))
1714 err
= nft_delrule(&ctx
, rule
);
1719 /* There are rules and elements that are still holding references to us,
1720 * we cannot do a recursive removal in this case.
1725 return nft_delchain(&ctx
);
1733 * nft_register_expr - register nf_tables expr type
1736 * Registers the expr type for use with nf_tables. Returns zero on
1737 * success or a negative errno code otherwise.
1739 int nft_register_expr(struct nft_expr_type
*type
)
1741 if (!nft_expr_check_ops(type
->ops
))
1744 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1745 if (type
->family
== NFPROTO_UNSPEC
)
1746 list_add_tail_rcu(&type
->list
, &nf_tables_expressions
);
1748 list_add_rcu(&type
->list
, &nf_tables_expressions
);
1749 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1752 EXPORT_SYMBOL_GPL(nft_register_expr
);
1755 * nft_unregister_expr - unregister nf_tables expr type
1758 * Unregisters the expr typefor use with nf_tables.
1760 void nft_unregister_expr(struct nft_expr_type
*type
)
1762 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1763 list_del_rcu(&type
->list
);
1764 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1766 EXPORT_SYMBOL_GPL(nft_unregister_expr
);
1768 static const struct nft_expr_type
*__nft_expr_type_get(u8 family
,
1771 const struct nft_expr_type
*type
;
1773 list_for_each_entry(type
, &nf_tables_expressions
, list
) {
1774 if (!nla_strcmp(nla
, type
->name
) &&
1775 (!type
->family
|| type
->family
== family
))
1781 static const struct nft_expr_type
*nft_expr_type_get(u8 family
,
1784 const struct nft_expr_type
*type
;
1787 return ERR_PTR(-EINVAL
);
1789 type
= __nft_expr_type_get(family
, nla
);
1790 if (type
!= NULL
&& try_module_get(type
->owner
))
1793 #ifdef CONFIG_MODULES
1795 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1796 request_module("nft-expr-%u-%.*s", family
,
1797 nla_len(nla
), (char *)nla_data(nla
));
1798 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1799 if (__nft_expr_type_get(family
, nla
))
1800 return ERR_PTR(-EAGAIN
);
1802 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1803 request_module("nft-expr-%.*s",
1804 nla_len(nla
), (char *)nla_data(nla
));
1805 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1806 if (__nft_expr_type_get(family
, nla
))
1807 return ERR_PTR(-EAGAIN
);
1810 return ERR_PTR(-ENOENT
);
1813 static const struct nla_policy nft_expr_policy
[NFTA_EXPR_MAX
+ 1] = {
1814 [NFTA_EXPR_NAME
] = { .type
= NLA_STRING
},
1815 [NFTA_EXPR_DATA
] = { .type
= NLA_NESTED
},
1818 static int nf_tables_fill_expr_info(struct sk_buff
*skb
,
1819 const struct nft_expr
*expr
)
1821 if (nla_put_string(skb
, NFTA_EXPR_NAME
, expr
->ops
->type
->name
))
1822 goto nla_put_failure
;
1824 if (expr
->ops
->dump
) {
1825 struct nlattr
*data
= nla_nest_start(skb
, NFTA_EXPR_DATA
);
1827 goto nla_put_failure
;
1828 if (expr
->ops
->dump(skb
, expr
) < 0)
1829 goto nla_put_failure
;
1830 nla_nest_end(skb
, data
);
1839 int nft_expr_dump(struct sk_buff
*skb
, unsigned int attr
,
1840 const struct nft_expr
*expr
)
1842 struct nlattr
*nest
;
1844 nest
= nla_nest_start(skb
, attr
);
1846 goto nla_put_failure
;
1847 if (nf_tables_fill_expr_info(skb
, expr
) < 0)
1848 goto nla_put_failure
;
1849 nla_nest_end(skb
, nest
);
1856 struct nft_expr_info
{
1857 const struct nft_expr_ops
*ops
;
1858 struct nlattr
*tb
[NFT_EXPR_MAXATTR
+ 1];
1861 static int nf_tables_expr_parse(const struct nft_ctx
*ctx
,
1862 const struct nlattr
*nla
,
1863 struct nft_expr_info
*info
)
1865 const struct nft_expr_type
*type
;
1866 const struct nft_expr_ops
*ops
;
1867 struct nlattr
*tb
[NFTA_EXPR_MAX
+ 1];
1870 err
= nla_parse_nested(tb
, NFTA_EXPR_MAX
, nla
, nft_expr_policy
, NULL
);
1874 type
= nft_expr_type_get(ctx
->afi
->family
, tb
[NFTA_EXPR_NAME
]);
1876 return PTR_ERR(type
);
1878 if (tb
[NFTA_EXPR_DATA
]) {
1879 err
= nla_parse_nested(info
->tb
, type
->maxattr
,
1880 tb
[NFTA_EXPR_DATA
], type
->policy
, NULL
);
1884 memset(info
->tb
, 0, sizeof(info
->tb
[0]) * (type
->maxattr
+ 1));
1886 if (type
->select_ops
!= NULL
) {
1887 ops
= type
->select_ops(ctx
,
1888 (const struct nlattr
* const *)info
->tb
);
1893 if (!nft_expr_check_ops(ops
)) {
1904 module_put(type
->owner
);
1908 static int nf_tables_newexpr(const struct nft_ctx
*ctx
,
1909 const struct nft_expr_info
*info
,
1910 struct nft_expr
*expr
)
1912 const struct nft_expr_ops
*ops
= info
->ops
;
1917 err
= ops
->init(ctx
, expr
, (const struct nlattr
**)info
->tb
);
1922 if (ops
->validate
) {
1923 const struct nft_data
*data
= NULL
;
1925 err
= ops
->validate(ctx
, expr
, &data
);
1934 ops
->destroy(ctx
, expr
);
1940 static void nf_tables_expr_destroy(const struct nft_ctx
*ctx
,
1941 struct nft_expr
*expr
)
1943 const struct nft_expr_type
*type
= expr
->ops
->type
;
1945 if (expr
->ops
->destroy
)
1946 expr
->ops
->destroy(ctx
, expr
);
1947 module_put(type
->owner
);
1950 struct nft_expr
*nft_expr_init(const struct nft_ctx
*ctx
,
1951 const struct nlattr
*nla
)
1953 struct nft_expr_info info
;
1954 struct nft_expr
*expr
;
1957 err
= nf_tables_expr_parse(ctx
, nla
, &info
);
1962 expr
= kzalloc(info
.ops
->size
, GFP_KERNEL
);
1966 err
= nf_tables_newexpr(ctx
, &info
, expr
);
1974 module_put(info
.ops
->type
->owner
);
1976 return ERR_PTR(err
);
1979 void nft_expr_destroy(const struct nft_ctx
*ctx
, struct nft_expr
*expr
)
1981 nf_tables_expr_destroy(ctx
, expr
);
1989 static struct nft_rule
*__nf_tables_rule_lookup(const struct nft_chain
*chain
,
1992 struct nft_rule
*rule
;
1994 // FIXME: this sucks
1995 list_for_each_entry(rule
, &chain
->rules
, list
) {
1996 if (handle
== rule
->handle
)
2000 return ERR_PTR(-ENOENT
);
2003 static struct nft_rule
*nf_tables_rule_lookup(const struct nft_chain
*chain
,
2004 const struct nlattr
*nla
)
2007 return ERR_PTR(-EINVAL
);
2009 return __nf_tables_rule_lookup(chain
, be64_to_cpu(nla_get_be64(nla
)));
2012 static const struct nla_policy nft_rule_policy
[NFTA_RULE_MAX
+ 1] = {
2013 [NFTA_RULE_TABLE
] = { .type
= NLA_STRING
,
2014 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
2015 [NFTA_RULE_CHAIN
] = { .type
= NLA_STRING
,
2016 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
2017 [NFTA_RULE_HANDLE
] = { .type
= NLA_U64
},
2018 [NFTA_RULE_EXPRESSIONS
] = { .type
= NLA_NESTED
},
2019 [NFTA_RULE_COMPAT
] = { .type
= NLA_NESTED
},
2020 [NFTA_RULE_POSITION
] = { .type
= NLA_U64
},
2021 [NFTA_RULE_USERDATA
] = { .type
= NLA_BINARY
,
2022 .len
= NFT_USERDATA_MAXLEN
},
2023 [NFTA_RULE_ID
] = { .type
= NLA_U32
},
2026 static int nf_tables_fill_rule_info(struct sk_buff
*skb
, struct net
*net
,
2027 u32 portid
, u32 seq
, int event
,
2028 u32 flags
, int family
,
2029 const struct nft_table
*table
,
2030 const struct nft_chain
*chain
,
2031 const struct nft_rule
*rule
)
2033 struct nlmsghdr
*nlh
;
2034 struct nfgenmsg
*nfmsg
;
2035 const struct nft_expr
*expr
, *next
;
2036 struct nlattr
*list
;
2037 const struct nft_rule
*prule
;
2038 u16 type
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
2040 nlh
= nlmsg_put(skb
, portid
, seq
, type
, sizeof(struct nfgenmsg
), flags
);
2042 goto nla_put_failure
;
2044 nfmsg
= nlmsg_data(nlh
);
2045 nfmsg
->nfgen_family
= family
;
2046 nfmsg
->version
= NFNETLINK_V0
;
2047 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
2049 if (nla_put_string(skb
, NFTA_RULE_TABLE
, table
->name
))
2050 goto nla_put_failure
;
2051 if (nla_put_string(skb
, NFTA_RULE_CHAIN
, chain
->name
))
2052 goto nla_put_failure
;
2053 if (nla_put_be64(skb
, NFTA_RULE_HANDLE
, cpu_to_be64(rule
->handle
),
2055 goto nla_put_failure
;
2057 if ((event
!= NFT_MSG_DELRULE
) && (rule
->list
.prev
!= &chain
->rules
)) {
2058 prule
= list_prev_entry(rule
, list
);
2059 if (nla_put_be64(skb
, NFTA_RULE_POSITION
,
2060 cpu_to_be64(prule
->handle
),
2062 goto nla_put_failure
;
2065 list
= nla_nest_start(skb
, NFTA_RULE_EXPRESSIONS
);
2067 goto nla_put_failure
;
2068 nft_rule_for_each_expr(expr
, next
, rule
) {
2069 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
, expr
) < 0)
2070 goto nla_put_failure
;
2072 nla_nest_end(skb
, list
);
2075 struct nft_userdata
*udata
= nft_userdata(rule
);
2076 if (nla_put(skb
, NFTA_RULE_USERDATA
, udata
->len
+ 1,
2078 goto nla_put_failure
;
2081 nlmsg_end(skb
, nlh
);
2085 nlmsg_trim(skb
, nlh
);
2089 static void nf_tables_rule_notify(const struct nft_ctx
*ctx
,
2090 const struct nft_rule
*rule
, int event
)
2092 struct sk_buff
*skb
;
2096 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
2099 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
2103 err
= nf_tables_fill_rule_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
2104 event
, 0, ctx
->afi
->family
, ctx
->table
,
2111 nfnetlink_send(skb
, ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
,
2112 ctx
->report
, GFP_KERNEL
);
2115 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
2118 struct nft_rule_dump_ctx
{
2123 static int nf_tables_dump_rules(struct sk_buff
*skb
,
2124 struct netlink_callback
*cb
)
2126 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
2127 const struct nft_rule_dump_ctx
*ctx
= cb
->data
;
2128 const struct nft_af_info
*afi
;
2129 const struct nft_table
*table
;
2130 const struct nft_chain
*chain
;
2131 const struct nft_rule
*rule
;
2132 unsigned int idx
= 0, s_idx
= cb
->args
[0];
2133 struct net
*net
= sock_net(skb
->sk
);
2134 int family
= nfmsg
->nfgen_family
;
2137 cb
->seq
= net
->nft
.base_seq
;
2139 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
2140 if (family
!= NFPROTO_UNSPEC
&& family
!= afi
->family
)
2143 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
2144 if (ctx
&& ctx
->table
&&
2145 strcmp(ctx
->table
, table
->name
) != 0)
2148 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
2149 if (ctx
&& ctx
->chain
&&
2150 strcmp(ctx
->chain
, chain
->name
) != 0)
2153 list_for_each_entry_rcu(rule
, &chain
->rules
, list
) {
2154 if (!nft_is_active(net
, rule
))
2159 memset(&cb
->args
[1], 0,
2160 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
2161 if (nf_tables_fill_rule_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
2164 NLM_F_MULTI
| NLM_F_APPEND
,
2165 afi
->family
, table
, chain
, rule
) < 0)
2168 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
2182 static int nf_tables_dump_rules_done(struct netlink_callback
*cb
)
2184 struct nft_rule_dump_ctx
*ctx
= cb
->data
;
2194 static int nf_tables_getrule(struct net
*net
, struct sock
*nlsk
,
2195 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2196 const struct nlattr
* const nla
[],
2197 struct netlink_ext_ack
*extack
)
2199 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2200 u8 genmask
= nft_genmask_cur(net
);
2201 const struct nft_af_info
*afi
;
2202 const struct nft_table
*table
;
2203 const struct nft_chain
*chain
;
2204 const struct nft_rule
*rule
;
2205 struct sk_buff
*skb2
;
2206 int family
= nfmsg
->nfgen_family
;
2209 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
2210 struct netlink_dump_control c
= {
2211 .dump
= nf_tables_dump_rules
,
2212 .done
= nf_tables_dump_rules_done
,
2215 if (nla
[NFTA_RULE_TABLE
] || nla
[NFTA_RULE_CHAIN
]) {
2216 struct nft_rule_dump_ctx
*ctx
;
2218 ctx
= kzalloc(sizeof(*ctx
), GFP_KERNEL
);
2222 if (nla
[NFTA_RULE_TABLE
]) {
2223 ctx
->table
= nla_strdup(nla
[NFTA_RULE_TABLE
],
2230 if (nla
[NFTA_RULE_CHAIN
]) {
2231 ctx
->chain
= nla_strdup(nla
[NFTA_RULE_CHAIN
],
2242 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
2245 afi
= nf_tables_afinfo_lookup(net
, family
, false);
2247 return PTR_ERR(afi
);
2249 table
= nf_tables_table_lookup(afi
, nla
[NFTA_RULE_TABLE
], genmask
);
2251 return PTR_ERR(table
);
2253 chain
= nf_tables_chain_lookup(table
, nla
[NFTA_RULE_CHAIN
], genmask
);
2255 return PTR_ERR(chain
);
2257 rule
= nf_tables_rule_lookup(chain
, nla
[NFTA_RULE_HANDLE
]);
2259 return PTR_ERR(rule
);
2261 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
2265 err
= nf_tables_fill_rule_info(skb2
, net
, NETLINK_CB(skb
).portid
,
2266 nlh
->nlmsg_seq
, NFT_MSG_NEWRULE
, 0,
2267 family
, table
, chain
, rule
);
2271 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
2278 static void nf_tables_rule_destroy(const struct nft_ctx
*ctx
,
2279 struct nft_rule
*rule
)
2281 struct nft_expr
*expr
, *next
;
2284 * Careful: some expressions might not be initialized in case this
2285 * is called on error from nf_tables_newrule().
2287 expr
= nft_expr_first(rule
);
2288 while (expr
!= nft_expr_last(rule
) && expr
->ops
) {
2289 next
= nft_expr_next(expr
);
2290 nf_tables_expr_destroy(ctx
, expr
);
2296 static void nf_tables_rule_release(const struct nft_ctx
*ctx
,
2297 struct nft_rule
*rule
)
2299 nft_rule_expr_deactivate(ctx
, rule
);
2300 nf_tables_rule_destroy(ctx
, rule
);
2303 #define NFT_RULE_MAXEXPRS 128
2305 static struct nft_expr_info
*info
;
2307 static int nf_tables_newrule(struct net
*net
, struct sock
*nlsk
,
2308 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2309 const struct nlattr
* const nla
[],
2310 struct netlink_ext_ack
*extack
)
2312 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2313 u8 genmask
= nft_genmask_next(net
);
2314 struct nft_af_info
*afi
;
2315 struct nft_table
*table
;
2316 struct nft_chain
*chain
;
2317 struct nft_rule
*rule
, *old_rule
= NULL
;
2318 struct nft_userdata
*udata
;
2319 struct nft_trans
*trans
= NULL
;
2320 struct nft_expr
*expr
;
2323 unsigned int size
, i
, n
, ulen
= 0, usize
= 0;
2326 u64 handle
, pos_handle
;
2328 create
= nlh
->nlmsg_flags
& NLM_F_CREATE
? true : false;
2330 afi
= nf_tables_afinfo_lookup(net
, nfmsg
->nfgen_family
, create
);
2332 return PTR_ERR(afi
);
2334 table
= nf_tables_table_lookup(afi
, nla
[NFTA_RULE_TABLE
], genmask
);
2336 return PTR_ERR(table
);
2338 chain
= nf_tables_chain_lookup(table
, nla
[NFTA_RULE_CHAIN
], genmask
);
2340 return PTR_ERR(chain
);
2342 if (nla
[NFTA_RULE_HANDLE
]) {
2343 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_HANDLE
]));
2344 rule
= __nf_tables_rule_lookup(chain
, handle
);
2346 return PTR_ERR(rule
);
2348 if (nlh
->nlmsg_flags
& NLM_F_EXCL
)
2350 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
2355 if (!create
|| nlh
->nlmsg_flags
& NLM_F_REPLACE
)
2357 handle
= nf_tables_alloc_handle(table
);
2359 if (chain
->use
== UINT_MAX
)
2362 if (nla
[NFTA_RULE_POSITION
]) {
2363 pos_handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_POSITION
]));
2364 old_rule
= __nf_tables_rule_lookup(chain
, pos_handle
);
2365 if (IS_ERR(old_rule
))
2366 return PTR_ERR(old_rule
);
2370 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, chain
, nla
);
2374 if (nla
[NFTA_RULE_EXPRESSIONS
]) {
2375 nla_for_each_nested(tmp
, nla
[NFTA_RULE_EXPRESSIONS
], rem
) {
2377 if (nla_type(tmp
) != NFTA_LIST_ELEM
)
2379 if (n
== NFT_RULE_MAXEXPRS
)
2381 err
= nf_tables_expr_parse(&ctx
, tmp
, &info
[n
]);
2384 size
+= info
[n
].ops
->size
;
2388 /* Check for overflow of dlen field */
2390 if (size
>= 1 << 12)
2393 if (nla
[NFTA_RULE_USERDATA
]) {
2394 ulen
= nla_len(nla
[NFTA_RULE_USERDATA
]);
2396 usize
= sizeof(struct nft_userdata
) + ulen
;
2400 rule
= kzalloc(sizeof(*rule
) + size
+ usize
, GFP_KERNEL
);
2404 nft_activate_next(net
, rule
);
2406 rule
->handle
= handle
;
2408 rule
->udata
= ulen
? 1 : 0;
2411 udata
= nft_userdata(rule
);
2412 udata
->len
= ulen
- 1;
2413 nla_memcpy(udata
->data
, nla
[NFTA_RULE_USERDATA
], ulen
);
2416 expr
= nft_expr_first(rule
);
2417 for (i
= 0; i
< n
; i
++) {
2418 err
= nf_tables_newexpr(&ctx
, &info
[i
], expr
);
2422 expr
= nft_expr_next(expr
);
2425 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
) {
2426 trans
= nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
);
2427 if (trans
== NULL
) {
2431 err
= nft_delrule(&ctx
, old_rule
);
2433 nft_trans_destroy(trans
);
2437 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
2439 if (nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
) == NULL
) {
2444 if (nlh
->nlmsg_flags
& NLM_F_APPEND
) {
2446 list_add_rcu(&rule
->list
, &old_rule
->list
);
2448 list_add_tail_rcu(&rule
->list
, &chain
->rules
);
2451 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
2453 list_add_rcu(&rule
->list
, &chain
->rules
);
2460 nf_tables_rule_release(&ctx
, rule
);
2462 for (i
= 0; i
< n
; i
++) {
2463 if (info
[i
].ops
!= NULL
)
2464 module_put(info
[i
].ops
->type
->owner
);
2469 static struct nft_rule
*nft_rule_lookup_byid(const struct net
*net
,
2470 const struct nlattr
*nla
)
2472 u32 id
= ntohl(nla_get_be32(nla
));
2473 struct nft_trans
*trans
;
2475 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
2476 struct nft_rule
*rule
= nft_trans_rule(trans
);
2478 if (trans
->msg_type
== NFT_MSG_NEWRULE
&&
2479 id
== nft_trans_rule_id(trans
))
2482 return ERR_PTR(-ENOENT
);
2485 static int nf_tables_delrule(struct net
*net
, struct sock
*nlsk
,
2486 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2487 const struct nlattr
* const nla
[],
2488 struct netlink_ext_ack
*extack
)
2490 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2491 u8 genmask
= nft_genmask_next(net
);
2492 struct nft_af_info
*afi
;
2493 struct nft_table
*table
;
2494 struct nft_chain
*chain
= NULL
;
2495 struct nft_rule
*rule
;
2496 int family
= nfmsg
->nfgen_family
, err
= 0;
2499 afi
= nf_tables_afinfo_lookup(net
, family
, false);
2501 return PTR_ERR(afi
);
2503 table
= nf_tables_table_lookup(afi
, nla
[NFTA_RULE_TABLE
], genmask
);
2505 return PTR_ERR(table
);
2507 if (nla
[NFTA_RULE_CHAIN
]) {
2508 chain
= nf_tables_chain_lookup(table
, nla
[NFTA_RULE_CHAIN
],
2511 return PTR_ERR(chain
);
2514 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, chain
, nla
);
2517 if (nla
[NFTA_RULE_HANDLE
]) {
2518 rule
= nf_tables_rule_lookup(chain
,
2519 nla
[NFTA_RULE_HANDLE
]);
2521 return PTR_ERR(rule
);
2523 err
= nft_delrule(&ctx
, rule
);
2524 } else if (nla
[NFTA_RULE_ID
]) {
2525 rule
= nft_rule_lookup_byid(net
, nla
[NFTA_RULE_ID
]);
2527 return PTR_ERR(rule
);
2529 err
= nft_delrule(&ctx
, rule
);
2531 err
= nft_delrule_by_chain(&ctx
);
2534 list_for_each_entry(chain
, &table
->chains
, list
) {
2535 if (!nft_is_active_next(net
, chain
))
2539 err
= nft_delrule_by_chain(&ctx
);
2552 static LIST_HEAD(nf_tables_set_types
);
2554 int nft_register_set(struct nft_set_type
*type
)
2556 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2557 list_add_tail_rcu(&type
->list
, &nf_tables_set_types
);
2558 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2561 EXPORT_SYMBOL_GPL(nft_register_set
);
2563 void nft_unregister_set(struct nft_set_type
*type
)
2565 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2566 list_del_rcu(&type
->list
);
2567 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2569 EXPORT_SYMBOL_GPL(nft_unregister_set
);
2571 #define NFT_SET_FEATURES (NFT_SET_INTERVAL | NFT_SET_MAP | \
2572 NFT_SET_TIMEOUT | NFT_SET_OBJECT)
2574 static bool nft_set_ops_candidate(const struct nft_set_ops
*ops
, u32 flags
)
2576 return (flags
& ops
->features
) == (flags
& NFT_SET_FEATURES
);
2580 * Select a set implementation based on the data characteristics and the
2581 * given policy. The total memory use might not be known if no size is
2582 * given, in that case the amount of memory per element is used.
2584 static const struct nft_set_ops
*
2585 nft_select_set_ops(const struct nft_ctx
*ctx
,
2586 const struct nlattr
* const nla
[],
2587 const struct nft_set_desc
*desc
,
2588 enum nft_set_policies policy
)
2590 const struct nft_set_ops
*ops
, *bops
;
2591 struct nft_set_estimate est
, best
;
2592 const struct nft_set_type
*type
;
2595 #ifdef CONFIG_MODULES
2596 if (list_empty(&nf_tables_set_types
)) {
2597 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2598 request_module("nft-set");
2599 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2600 if (!list_empty(&nf_tables_set_types
))
2601 return ERR_PTR(-EAGAIN
);
2604 if (nla
[NFTA_SET_FLAGS
] != NULL
)
2605 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
2612 list_for_each_entry(type
, &nf_tables_set_types
, list
) {
2613 if (!type
->select_ops
)
2616 ops
= type
->select_ops(ctx
, desc
, flags
);
2620 if (!nft_set_ops_candidate(ops
, flags
))
2622 if (!ops
->estimate(desc
, flags
, &est
))
2626 case NFT_SET_POL_PERFORMANCE
:
2627 if (est
.lookup
< best
.lookup
)
2629 if (est
.lookup
== best
.lookup
&&
2630 est
.space
< best
.space
)
2633 case NFT_SET_POL_MEMORY
:
2635 if (est
.space
< best
.space
)
2637 if (est
.space
== best
.space
&&
2638 est
.lookup
< best
.lookup
)
2640 } else if (est
.size
< best
.size
) {
2648 if (!try_module_get(type
->owner
))
2651 module_put(bops
->type
->owner
);
2660 return ERR_PTR(-EOPNOTSUPP
);
2663 static const struct nla_policy nft_set_policy
[NFTA_SET_MAX
+ 1] = {
2664 [NFTA_SET_TABLE
] = { .type
= NLA_STRING
,
2665 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
2666 [NFTA_SET_NAME
] = { .type
= NLA_STRING
,
2667 .len
= NFT_SET_MAXNAMELEN
- 1 },
2668 [NFTA_SET_FLAGS
] = { .type
= NLA_U32
},
2669 [NFTA_SET_KEY_TYPE
] = { .type
= NLA_U32
},
2670 [NFTA_SET_KEY_LEN
] = { .type
= NLA_U32
},
2671 [NFTA_SET_DATA_TYPE
] = { .type
= NLA_U32
},
2672 [NFTA_SET_DATA_LEN
] = { .type
= NLA_U32
},
2673 [NFTA_SET_POLICY
] = { .type
= NLA_U32
},
2674 [NFTA_SET_DESC
] = { .type
= NLA_NESTED
},
2675 [NFTA_SET_ID
] = { .type
= NLA_U32
},
2676 [NFTA_SET_TIMEOUT
] = { .type
= NLA_U64
},
2677 [NFTA_SET_GC_INTERVAL
] = { .type
= NLA_U32
},
2678 [NFTA_SET_USERDATA
] = { .type
= NLA_BINARY
,
2679 .len
= NFT_USERDATA_MAXLEN
},
2680 [NFTA_SET_OBJ_TYPE
] = { .type
= NLA_U32
},
2683 static const struct nla_policy nft_set_desc_policy
[NFTA_SET_DESC_MAX
+ 1] = {
2684 [NFTA_SET_DESC_SIZE
] = { .type
= NLA_U32
},
2687 static int nft_ctx_init_from_setattr(struct nft_ctx
*ctx
, struct net
*net
,
2688 const struct sk_buff
*skb
,
2689 const struct nlmsghdr
*nlh
,
2690 const struct nlattr
* const nla
[],
2693 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2694 struct nft_af_info
*afi
= NULL
;
2695 struct nft_table
*table
= NULL
;
2697 if (nfmsg
->nfgen_family
!= NFPROTO_UNSPEC
) {
2698 afi
= nf_tables_afinfo_lookup(net
, nfmsg
->nfgen_family
, false);
2700 return PTR_ERR(afi
);
2703 if (nla
[NFTA_SET_TABLE
] != NULL
) {
2705 return -EAFNOSUPPORT
;
2707 table
= nf_tables_table_lookup(afi
, nla
[NFTA_SET_TABLE
],
2710 return PTR_ERR(table
);
2713 nft_ctx_init(ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
2717 static struct nft_set
*nf_tables_set_lookup(const struct nft_table
*table
,
2718 const struct nlattr
*nla
, u8 genmask
)
2720 struct nft_set
*set
;
2723 return ERR_PTR(-EINVAL
);
2725 list_for_each_entry(set
, &table
->sets
, list
) {
2726 if (!nla_strcmp(nla
, set
->name
) &&
2727 nft_active_genmask(set
, genmask
))
2730 return ERR_PTR(-ENOENT
);
2733 static struct nft_set
*nf_tables_set_lookup_byid(const struct net
*net
,
2734 const struct nlattr
*nla
,
2737 struct nft_trans
*trans
;
2738 u32 id
= ntohl(nla_get_be32(nla
));
2740 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
2741 if (trans
->msg_type
== NFT_MSG_NEWSET
) {
2742 struct nft_set
*set
= nft_trans_set(trans
);
2744 if (id
== nft_trans_set_id(trans
) &&
2745 nft_active_genmask(set
, genmask
))
2749 return ERR_PTR(-ENOENT
);
2752 struct nft_set
*nft_set_lookup(const struct net
*net
,
2753 const struct nft_table
*table
,
2754 const struct nlattr
*nla_set_name
,
2755 const struct nlattr
*nla_set_id
,
2758 struct nft_set
*set
;
2760 set
= nf_tables_set_lookup(table
, nla_set_name
, genmask
);
2765 set
= nf_tables_set_lookup_byid(net
, nla_set_id
, genmask
);
2769 EXPORT_SYMBOL_GPL(nft_set_lookup
);
2771 static int nf_tables_set_alloc_name(struct nft_ctx
*ctx
, struct nft_set
*set
,
2774 const struct nft_set
*i
;
2776 unsigned long *inuse
;
2777 unsigned int n
= 0, min
= 0;
2779 p
= strchr(name
, '%');
2781 if (p
[1] != 'd' || strchr(p
+ 2, '%'))
2784 inuse
= (unsigned long *)get_zeroed_page(GFP_KERNEL
);
2788 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
2791 if (!nft_is_active_next(ctx
->net
, set
))
2793 if (!sscanf(i
->name
, name
, &tmp
))
2795 if (tmp
< min
|| tmp
>= min
+ BITS_PER_BYTE
* PAGE_SIZE
)
2798 set_bit(tmp
- min
, inuse
);
2801 n
= find_first_zero_bit(inuse
, BITS_PER_BYTE
* PAGE_SIZE
);
2802 if (n
>= BITS_PER_BYTE
* PAGE_SIZE
) {
2803 min
+= BITS_PER_BYTE
* PAGE_SIZE
;
2804 memset(inuse
, 0, PAGE_SIZE
);
2807 free_page((unsigned long)inuse
);
2810 set
->name
= kasprintf(GFP_KERNEL
, name
, min
+ n
);
2814 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
2815 if (!nft_is_active_next(ctx
->net
, i
))
2817 if (!strcmp(set
->name
, i
->name
)) {
2825 static int nf_tables_fill_set(struct sk_buff
*skb
, const struct nft_ctx
*ctx
,
2826 const struct nft_set
*set
, u16 event
, u16 flags
)
2828 struct nfgenmsg
*nfmsg
;
2829 struct nlmsghdr
*nlh
;
2830 struct nlattr
*desc
;
2831 u32 portid
= ctx
->portid
;
2834 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
2835 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
2838 goto nla_put_failure
;
2840 nfmsg
= nlmsg_data(nlh
);
2841 nfmsg
->nfgen_family
= ctx
->afi
->family
;
2842 nfmsg
->version
= NFNETLINK_V0
;
2843 nfmsg
->res_id
= htons(ctx
->net
->nft
.base_seq
& 0xffff);
2845 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
2846 goto nla_put_failure
;
2847 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
2848 goto nla_put_failure
;
2849 if (set
->flags
!= 0)
2850 if (nla_put_be32(skb
, NFTA_SET_FLAGS
, htonl(set
->flags
)))
2851 goto nla_put_failure
;
2853 if (nla_put_be32(skb
, NFTA_SET_KEY_TYPE
, htonl(set
->ktype
)))
2854 goto nla_put_failure
;
2855 if (nla_put_be32(skb
, NFTA_SET_KEY_LEN
, htonl(set
->klen
)))
2856 goto nla_put_failure
;
2857 if (set
->flags
& NFT_SET_MAP
) {
2858 if (nla_put_be32(skb
, NFTA_SET_DATA_TYPE
, htonl(set
->dtype
)))
2859 goto nla_put_failure
;
2860 if (nla_put_be32(skb
, NFTA_SET_DATA_LEN
, htonl(set
->dlen
)))
2861 goto nla_put_failure
;
2863 if (set
->flags
& NFT_SET_OBJECT
&&
2864 nla_put_be32(skb
, NFTA_SET_OBJ_TYPE
, htonl(set
->objtype
)))
2865 goto nla_put_failure
;
2868 nla_put_be64(skb
, NFTA_SET_TIMEOUT
,
2869 cpu_to_be64(jiffies_to_msecs(set
->timeout
)),
2871 goto nla_put_failure
;
2873 nla_put_be32(skb
, NFTA_SET_GC_INTERVAL
, htonl(set
->gc_int
)))
2874 goto nla_put_failure
;
2876 if (set
->policy
!= NFT_SET_POL_PERFORMANCE
) {
2877 if (nla_put_be32(skb
, NFTA_SET_POLICY
, htonl(set
->policy
)))
2878 goto nla_put_failure
;
2881 if (nla_put(skb
, NFTA_SET_USERDATA
, set
->udlen
, set
->udata
))
2882 goto nla_put_failure
;
2884 desc
= nla_nest_start(skb
, NFTA_SET_DESC
);
2886 goto nla_put_failure
;
2888 nla_put_be32(skb
, NFTA_SET_DESC_SIZE
, htonl(set
->size
)))
2889 goto nla_put_failure
;
2890 nla_nest_end(skb
, desc
);
2892 nlmsg_end(skb
, nlh
);
2896 nlmsg_trim(skb
, nlh
);
2900 static void nf_tables_set_notify(const struct nft_ctx
*ctx
,
2901 const struct nft_set
*set
, int event
,
2904 struct sk_buff
*skb
;
2905 u32 portid
= ctx
->portid
;
2909 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
2912 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp_flags
);
2916 err
= nf_tables_fill_set(skb
, ctx
, set
, event
, 0);
2922 nfnetlink_send(skb
, ctx
->net
, portid
, NFNLGRP_NFTABLES
, ctx
->report
,
2926 nfnetlink_set_err(ctx
->net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
2929 static int nf_tables_dump_sets(struct sk_buff
*skb
, struct netlink_callback
*cb
)
2931 const struct nft_set
*set
;
2932 unsigned int idx
, s_idx
= cb
->args
[0];
2933 struct nft_af_info
*afi
;
2934 struct nft_table
*table
, *cur_table
= (struct nft_table
*)cb
->args
[2];
2935 struct net
*net
= sock_net(skb
->sk
);
2936 int cur_family
= cb
->args
[3];
2937 struct nft_ctx
*ctx
= cb
->data
, ctx_set
;
2943 cb
->seq
= net
->nft
.base_seq
;
2945 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
2946 if (ctx
->afi
&& ctx
->afi
!= afi
)
2950 if (afi
->family
!= cur_family
)
2955 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
2956 if (ctx
->table
&& ctx
->table
!= table
)
2960 if (cur_table
!= table
)
2966 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
2969 if (!nft_is_active(net
, set
))
2973 ctx_set
.table
= table
;
2975 if (nf_tables_fill_set(skb
, &ctx_set
, set
,
2979 cb
->args
[2] = (unsigned long) table
;
2980 cb
->args
[3] = afi
->family
;
2983 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
2997 static int nf_tables_dump_sets_done(struct netlink_callback
*cb
)
3003 static int nf_tables_getset(struct net
*net
, struct sock
*nlsk
,
3004 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3005 const struct nlattr
* const nla
[],
3006 struct netlink_ext_ack
*extack
)
3008 u8 genmask
= nft_genmask_cur(net
);
3009 const struct nft_set
*set
;
3011 struct sk_buff
*skb2
;
3012 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3015 /* Verify existence before starting dump */
3016 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, genmask
);
3020 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
3021 struct netlink_dump_control c
= {
3022 .dump
= nf_tables_dump_sets
,
3023 .done
= nf_tables_dump_sets_done
,
3025 struct nft_ctx
*ctx_dump
;
3027 ctx_dump
= kmalloc(sizeof(*ctx_dump
), GFP_KERNEL
);
3028 if (ctx_dump
== NULL
)
3034 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
3037 /* Only accept unspec with dump */
3038 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
3039 return -EAFNOSUPPORT
;
3040 if (!nla
[NFTA_SET_TABLE
])
3043 set
= nf_tables_set_lookup(ctx
.table
, nla
[NFTA_SET_NAME
], genmask
);
3045 return PTR_ERR(set
);
3047 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
3051 err
= nf_tables_fill_set(skb2
, &ctx
, set
, NFT_MSG_NEWSET
, 0);
3055 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
3062 static int nf_tables_set_desc_parse(const struct nft_ctx
*ctx
,
3063 struct nft_set_desc
*desc
,
3064 const struct nlattr
*nla
)
3066 struct nlattr
*da
[NFTA_SET_DESC_MAX
+ 1];
3069 err
= nla_parse_nested(da
, NFTA_SET_DESC_MAX
, nla
,
3070 nft_set_desc_policy
, NULL
);
3074 if (da
[NFTA_SET_DESC_SIZE
] != NULL
)
3075 desc
->size
= ntohl(nla_get_be32(da
[NFTA_SET_DESC_SIZE
]));
3080 static int nf_tables_newset(struct net
*net
, struct sock
*nlsk
,
3081 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3082 const struct nlattr
* const nla
[],
3083 struct netlink_ext_ack
*extack
)
3085 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3086 u8 genmask
= nft_genmask_next(net
);
3087 const struct nft_set_ops
*ops
;
3088 struct nft_af_info
*afi
;
3089 struct nft_table
*table
;
3090 struct nft_set
*set
;
3096 u32 ktype
, dtype
, flags
, policy
, gc_int
, objtype
;
3097 struct nft_set_desc desc
;
3098 unsigned char *udata
;
3102 if (nla
[NFTA_SET_TABLE
] == NULL
||
3103 nla
[NFTA_SET_NAME
] == NULL
||
3104 nla
[NFTA_SET_KEY_LEN
] == NULL
||
3105 nla
[NFTA_SET_ID
] == NULL
)
3108 memset(&desc
, 0, sizeof(desc
));
3110 ktype
= NFT_DATA_VALUE
;
3111 if (nla
[NFTA_SET_KEY_TYPE
] != NULL
) {
3112 ktype
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_TYPE
]));
3113 if ((ktype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
)
3117 desc
.klen
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_LEN
]));
3118 if (desc
.klen
== 0 || desc
.klen
> NFT_DATA_VALUE_MAXLEN
)
3122 if (nla
[NFTA_SET_FLAGS
] != NULL
) {
3123 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
3124 if (flags
& ~(NFT_SET_ANONYMOUS
| NFT_SET_CONSTANT
|
3125 NFT_SET_INTERVAL
| NFT_SET_TIMEOUT
|
3126 NFT_SET_MAP
| NFT_SET_EVAL
|
3129 /* Only one of these operations is supported */
3130 if ((flags
& (NFT_SET_MAP
| NFT_SET_OBJECT
)) ==
3131 (NFT_SET_MAP
| NFT_SET_OBJECT
))
3133 if ((flags
& (NFT_SET_EVAL
| NFT_SET_OBJECT
)) ==
3134 (NFT_SET_EVAL
| NFT_SET_OBJECT
))
3139 if (nla
[NFTA_SET_DATA_TYPE
] != NULL
) {
3140 if (!(flags
& NFT_SET_MAP
))
3143 dtype
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_TYPE
]));
3144 if ((dtype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
&&
3145 dtype
!= NFT_DATA_VERDICT
)
3148 if (dtype
!= NFT_DATA_VERDICT
) {
3149 if (nla
[NFTA_SET_DATA_LEN
] == NULL
)
3151 desc
.dlen
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_LEN
]));
3152 if (desc
.dlen
== 0 || desc
.dlen
> NFT_DATA_VALUE_MAXLEN
)
3155 desc
.dlen
= sizeof(struct nft_verdict
);
3156 } else if (flags
& NFT_SET_MAP
)
3159 if (nla
[NFTA_SET_OBJ_TYPE
] != NULL
) {
3160 if (!(flags
& NFT_SET_OBJECT
))
3163 objtype
= ntohl(nla_get_be32(nla
[NFTA_SET_OBJ_TYPE
]));
3164 if (objtype
== NFT_OBJECT_UNSPEC
||
3165 objtype
> NFT_OBJECT_MAX
)
3167 } else if (flags
& NFT_SET_OBJECT
)
3170 objtype
= NFT_OBJECT_UNSPEC
;
3173 if (nla
[NFTA_SET_TIMEOUT
] != NULL
) {
3174 if (!(flags
& NFT_SET_TIMEOUT
))
3176 timeout
= msecs_to_jiffies(be64_to_cpu(nla_get_be64(
3177 nla
[NFTA_SET_TIMEOUT
])));
3180 if (nla
[NFTA_SET_GC_INTERVAL
] != NULL
) {
3181 if (!(flags
& NFT_SET_TIMEOUT
))
3183 gc_int
= ntohl(nla_get_be32(nla
[NFTA_SET_GC_INTERVAL
]));
3186 policy
= NFT_SET_POL_PERFORMANCE
;
3187 if (nla
[NFTA_SET_POLICY
] != NULL
)
3188 policy
= ntohl(nla_get_be32(nla
[NFTA_SET_POLICY
]));
3190 if (nla
[NFTA_SET_DESC
] != NULL
) {
3191 err
= nf_tables_set_desc_parse(&ctx
, &desc
, nla
[NFTA_SET_DESC
]);
3196 create
= nlh
->nlmsg_flags
& NLM_F_CREATE
? true : false;
3198 afi
= nf_tables_afinfo_lookup(net
, nfmsg
->nfgen_family
, create
);
3200 return PTR_ERR(afi
);
3202 table
= nf_tables_table_lookup(afi
, nla
[NFTA_SET_TABLE
], genmask
);
3204 return PTR_ERR(table
);
3206 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
3208 set
= nf_tables_set_lookup(table
, nla
[NFTA_SET_NAME
], genmask
);
3210 if (PTR_ERR(set
) != -ENOENT
)
3211 return PTR_ERR(set
);
3213 if (nlh
->nlmsg_flags
& NLM_F_EXCL
)
3215 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
3220 if (!(nlh
->nlmsg_flags
& NLM_F_CREATE
))
3223 ops
= nft_select_set_ops(&ctx
, nla
, &desc
, policy
);
3225 return PTR_ERR(ops
);
3228 if (nla
[NFTA_SET_USERDATA
])
3229 udlen
= nla_len(nla
[NFTA_SET_USERDATA
]);
3232 if (ops
->privsize
!= NULL
)
3233 size
= ops
->privsize(nla
, &desc
);
3235 set
= kvzalloc(sizeof(*set
) + size
+ udlen
, GFP_KERNEL
);
3241 name
= nla_strdup(nla
[NFTA_SET_NAME
], GFP_KERNEL
);
3247 err
= nf_tables_set_alloc_name(&ctx
, set
, name
);
3254 udata
= set
->data
+ size
;
3255 nla_memcpy(udata
, nla
[NFTA_SET_USERDATA
], udlen
);
3258 INIT_LIST_HEAD(&set
->bindings
);
3261 set
->klen
= desc
.klen
;
3263 set
->objtype
= objtype
;
3264 set
->dlen
= desc
.dlen
;
3266 set
->size
= desc
.size
;
3267 set
->policy
= policy
;
3270 set
->timeout
= timeout
;
3271 set
->gc_int
= gc_int
;
3273 err
= ops
->init(set
, &desc
, nla
);
3277 err
= nft_trans_set_add(&ctx
, NFT_MSG_NEWSET
, set
);
3281 list_add_tail_rcu(&set
->list
, &table
->sets
);
3292 module_put(ops
->type
->owner
);
3296 static void nft_set_destroy(struct nft_set
*set
)
3298 set
->ops
->destroy(set
);
3299 module_put(set
->ops
->type
->owner
);
3304 static void nf_tables_set_destroy(const struct nft_ctx
*ctx
, struct nft_set
*set
)
3306 list_del_rcu(&set
->list
);
3307 nf_tables_set_notify(ctx
, set
, NFT_MSG_DELSET
, GFP_ATOMIC
);
3308 nft_set_destroy(set
);
3311 static int nf_tables_delset(struct net
*net
, struct sock
*nlsk
,
3312 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3313 const struct nlattr
* const nla
[],
3314 struct netlink_ext_ack
*extack
)
3316 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3317 u8 genmask
= nft_genmask_next(net
);
3318 struct nft_set
*set
;
3322 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
3323 return -EAFNOSUPPORT
;
3324 if (nla
[NFTA_SET_TABLE
] == NULL
)
3327 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, genmask
);
3331 set
= nf_tables_set_lookup(ctx
.table
, nla
[NFTA_SET_NAME
], genmask
);
3333 return PTR_ERR(set
);
3335 if (!list_empty(&set
->bindings
) ||
3336 (nlh
->nlmsg_flags
& NLM_F_NONREC
&& atomic_read(&set
->nelems
) > 0))
3339 return nft_delset(&ctx
, set
);
3342 static int nf_tables_bind_check_setelem(const struct nft_ctx
*ctx
,
3343 struct nft_set
*set
,
3344 const struct nft_set_iter
*iter
,
3345 struct nft_set_elem
*elem
)
3347 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
3348 enum nft_registers dreg
;
3350 dreg
= nft_type_to_reg(set
->dtype
);
3351 return nft_validate_register_store(ctx
, dreg
, nft_set_ext_data(ext
),
3352 set
->dtype
== NFT_DATA_VERDICT
?
3353 NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
3357 int nf_tables_bind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
3358 struct nft_set_binding
*binding
)
3360 struct nft_set_binding
*i
;
3361 struct nft_set_iter iter
;
3363 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_ANONYMOUS
)
3366 if (binding
->flags
& NFT_SET_MAP
) {
3367 /* If the set is already bound to the same chain all
3368 * jumps are already validated for that chain.
3370 list_for_each_entry(i
, &set
->bindings
, list
) {
3371 if (i
->flags
& NFT_SET_MAP
&&
3372 i
->chain
== binding
->chain
)
3376 iter
.genmask
= nft_genmask_next(ctx
->net
);
3380 iter
.fn
= nf_tables_bind_check_setelem
;
3382 set
->ops
->walk(ctx
, set
, &iter
);
3387 binding
->chain
= ctx
->chain
;
3388 list_add_tail_rcu(&binding
->list
, &set
->bindings
);
3391 EXPORT_SYMBOL_GPL(nf_tables_bind_set
);
3393 void nf_tables_unbind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
3394 struct nft_set_binding
*binding
)
3396 list_del_rcu(&binding
->list
);
3398 if (list_empty(&set
->bindings
) && set
->flags
& NFT_SET_ANONYMOUS
&&
3399 nft_is_active(ctx
->net
, set
))
3400 nf_tables_set_destroy(ctx
, set
);
3402 EXPORT_SYMBOL_GPL(nf_tables_unbind_set
);
3404 const struct nft_set_ext_type nft_set_ext_types
[] = {
3405 [NFT_SET_EXT_KEY
] = {
3406 .align
= __alignof__(u32
),
3408 [NFT_SET_EXT_DATA
] = {
3409 .align
= __alignof__(u32
),
3411 [NFT_SET_EXT_EXPR
] = {
3412 .align
= __alignof__(struct nft_expr
),
3414 [NFT_SET_EXT_OBJREF
] = {
3415 .len
= sizeof(struct nft_object
*),
3416 .align
= __alignof__(struct nft_object
*),
3418 [NFT_SET_EXT_FLAGS
] = {
3420 .align
= __alignof__(u8
),
3422 [NFT_SET_EXT_TIMEOUT
] = {
3424 .align
= __alignof__(u64
),
3426 [NFT_SET_EXT_EXPIRATION
] = {
3427 .len
= sizeof(unsigned long),
3428 .align
= __alignof__(unsigned long),
3430 [NFT_SET_EXT_USERDATA
] = {
3431 .len
= sizeof(struct nft_userdata
),
3432 .align
= __alignof__(struct nft_userdata
),
3435 EXPORT_SYMBOL_GPL(nft_set_ext_types
);
3441 static const struct nla_policy nft_set_elem_policy
[NFTA_SET_ELEM_MAX
+ 1] = {
3442 [NFTA_SET_ELEM_KEY
] = { .type
= NLA_NESTED
},
3443 [NFTA_SET_ELEM_DATA
] = { .type
= NLA_NESTED
},
3444 [NFTA_SET_ELEM_FLAGS
] = { .type
= NLA_U32
},
3445 [NFTA_SET_ELEM_TIMEOUT
] = { .type
= NLA_U64
},
3446 [NFTA_SET_ELEM_USERDATA
] = { .type
= NLA_BINARY
,
3447 .len
= NFT_USERDATA_MAXLEN
},
3448 [NFTA_SET_ELEM_EXPR
] = { .type
= NLA_NESTED
},
3449 [NFTA_SET_ELEM_OBJREF
] = { .type
= NLA_STRING
},
3452 static const struct nla_policy nft_set_elem_list_policy
[NFTA_SET_ELEM_LIST_MAX
+ 1] = {
3453 [NFTA_SET_ELEM_LIST_TABLE
] = { .type
= NLA_STRING
,
3454 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
3455 [NFTA_SET_ELEM_LIST_SET
] = { .type
= NLA_STRING
,
3456 .len
= NFT_SET_MAXNAMELEN
- 1 },
3457 [NFTA_SET_ELEM_LIST_ELEMENTS
] = { .type
= NLA_NESTED
},
3458 [NFTA_SET_ELEM_LIST_SET_ID
] = { .type
= NLA_U32
},
3461 static int nft_ctx_init_from_elemattr(struct nft_ctx
*ctx
, struct net
*net
,
3462 const struct sk_buff
*skb
,
3463 const struct nlmsghdr
*nlh
,
3464 const struct nlattr
* const nla
[],
3467 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3468 struct nft_af_info
*afi
;
3469 struct nft_table
*table
;
3471 afi
= nf_tables_afinfo_lookup(net
, nfmsg
->nfgen_family
, false);
3473 return PTR_ERR(afi
);
3475 table
= nf_tables_table_lookup(afi
, nla
[NFTA_SET_ELEM_LIST_TABLE
],
3478 return PTR_ERR(table
);
3480 nft_ctx_init(ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
3484 static int nf_tables_fill_setelem(struct sk_buff
*skb
,
3485 const struct nft_set
*set
,
3486 const struct nft_set_elem
*elem
)
3488 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
3489 unsigned char *b
= skb_tail_pointer(skb
);
3490 struct nlattr
*nest
;
3492 nest
= nla_nest_start(skb
, NFTA_LIST_ELEM
);
3494 goto nla_put_failure
;
3496 if (nft_data_dump(skb
, NFTA_SET_ELEM_KEY
, nft_set_ext_key(ext
),
3497 NFT_DATA_VALUE
, set
->klen
) < 0)
3498 goto nla_put_failure
;
3500 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
3501 nft_data_dump(skb
, NFTA_SET_ELEM_DATA
, nft_set_ext_data(ext
),
3502 set
->dtype
== NFT_DATA_VERDICT
? NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
3504 goto nla_put_failure
;
3506 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPR
) &&
3507 nft_expr_dump(skb
, NFTA_SET_ELEM_EXPR
, nft_set_ext_expr(ext
)) < 0)
3508 goto nla_put_failure
;
3510 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
3511 nla_put_string(skb
, NFTA_SET_ELEM_OBJREF
,
3512 (*nft_set_ext_obj(ext
))->name
) < 0)
3513 goto nla_put_failure
;
3515 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
3516 nla_put_be32(skb
, NFTA_SET_ELEM_FLAGS
,
3517 htonl(*nft_set_ext_flags(ext
))))
3518 goto nla_put_failure
;
3520 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
) &&
3521 nla_put_be64(skb
, NFTA_SET_ELEM_TIMEOUT
,
3522 cpu_to_be64(jiffies_to_msecs(
3523 *nft_set_ext_timeout(ext
))),
3525 goto nla_put_failure
;
3527 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
)) {
3528 unsigned long expires
, now
= jiffies
;
3530 expires
= *nft_set_ext_expiration(ext
);
3531 if (time_before(now
, expires
))
3536 if (nla_put_be64(skb
, NFTA_SET_ELEM_EXPIRATION
,
3537 cpu_to_be64(jiffies_to_msecs(expires
)),
3539 goto nla_put_failure
;
3542 if (nft_set_ext_exists(ext
, NFT_SET_EXT_USERDATA
)) {
3543 struct nft_userdata
*udata
;
3545 udata
= nft_set_ext_userdata(ext
);
3546 if (nla_put(skb
, NFTA_SET_ELEM_USERDATA
,
3547 udata
->len
+ 1, udata
->data
))
3548 goto nla_put_failure
;
3551 nla_nest_end(skb
, nest
);
3559 struct nft_set_dump_args
{
3560 const struct netlink_callback
*cb
;
3561 struct nft_set_iter iter
;
3562 struct sk_buff
*skb
;
3565 static int nf_tables_dump_setelem(const struct nft_ctx
*ctx
,
3566 struct nft_set
*set
,
3567 const struct nft_set_iter
*iter
,
3568 struct nft_set_elem
*elem
)
3570 struct nft_set_dump_args
*args
;
3572 args
= container_of(iter
, struct nft_set_dump_args
, iter
);
3573 return nf_tables_fill_setelem(args
->skb
, set
, elem
);
3576 struct nft_set_dump_ctx
{
3577 const struct nft_set
*set
;
3581 static int nf_tables_dump_set(struct sk_buff
*skb
, struct netlink_callback
*cb
)
3583 struct nft_set_dump_ctx
*dump_ctx
= cb
->data
;
3584 struct net
*net
= sock_net(skb
->sk
);
3585 struct nft_af_info
*afi
;
3586 struct nft_table
*table
;
3587 struct nft_set
*set
;
3588 struct nft_set_dump_args args
;
3589 bool set_found
= false;
3590 struct nfgenmsg
*nfmsg
;
3591 struct nlmsghdr
*nlh
;
3592 struct nlattr
*nest
;
3597 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
3598 if (afi
!= dump_ctx
->ctx
.afi
)
3601 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
3602 if (table
!= dump_ctx
->ctx
.table
)
3605 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
3606 if (set
== dump_ctx
->set
) {
3621 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWSETELEM
);
3622 portid
= NETLINK_CB(cb
->skb
).portid
;
3623 seq
= cb
->nlh
->nlmsg_seq
;
3625 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
3628 goto nla_put_failure
;
3630 nfmsg
= nlmsg_data(nlh
);
3631 nfmsg
->nfgen_family
= afi
->family
;
3632 nfmsg
->version
= NFNETLINK_V0
;
3633 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
3635 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_TABLE
, table
->name
))
3636 goto nla_put_failure
;
3637 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_SET
, set
->name
))
3638 goto nla_put_failure
;
3640 nest
= nla_nest_start(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
3642 goto nla_put_failure
;
3646 args
.iter
.genmask
= nft_genmask_cur(net
);
3647 args
.iter
.skip
= cb
->args
[0];
3648 args
.iter
.count
= 0;
3650 args
.iter
.fn
= nf_tables_dump_setelem
;
3651 set
->ops
->walk(&dump_ctx
->ctx
, set
, &args
.iter
);
3654 nla_nest_end(skb
, nest
);
3655 nlmsg_end(skb
, nlh
);
3657 if (args
.iter
.err
&& args
.iter
.err
!= -EMSGSIZE
)
3658 return args
.iter
.err
;
3659 if (args
.iter
.count
== cb
->args
[0])
3662 cb
->args
[0] = args
.iter
.count
;
3670 static int nf_tables_dump_set_done(struct netlink_callback
*cb
)
3676 static int nf_tables_fill_setelem_info(struct sk_buff
*skb
,
3677 const struct nft_ctx
*ctx
, u32 seq
,
3678 u32 portid
, int event
, u16 flags
,
3679 const struct nft_set
*set
,
3680 const struct nft_set_elem
*elem
)
3682 struct nfgenmsg
*nfmsg
;
3683 struct nlmsghdr
*nlh
;
3684 struct nlattr
*nest
;
3687 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
3688 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
3691 goto nla_put_failure
;
3693 nfmsg
= nlmsg_data(nlh
);
3694 nfmsg
->nfgen_family
= ctx
->afi
->family
;
3695 nfmsg
->version
= NFNETLINK_V0
;
3696 nfmsg
->res_id
= htons(ctx
->net
->nft
.base_seq
& 0xffff);
3698 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
3699 goto nla_put_failure
;
3700 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
3701 goto nla_put_failure
;
3703 nest
= nla_nest_start(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
3705 goto nla_put_failure
;
3707 err
= nf_tables_fill_setelem(skb
, set
, elem
);
3709 goto nla_put_failure
;
3711 nla_nest_end(skb
, nest
);
3713 nlmsg_end(skb
, nlh
);
3717 nlmsg_trim(skb
, nlh
);
3721 static int nft_setelem_parse_flags(const struct nft_set
*set
,
3722 const struct nlattr
*attr
, u32
*flags
)
3727 *flags
= ntohl(nla_get_be32(attr
));
3728 if (*flags
& ~NFT_SET_ELEM_INTERVAL_END
)
3730 if (!(set
->flags
& NFT_SET_INTERVAL
) &&
3731 *flags
& NFT_SET_ELEM_INTERVAL_END
)
3737 static int nft_get_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
3738 const struct nlattr
*attr
)
3740 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
3741 const struct nft_set_ext
*ext
;
3742 struct nft_data_desc desc
;
3743 struct nft_set_elem elem
;
3744 struct sk_buff
*skb
;
3749 err
= nla_parse_nested(nla
, NFTA_SET_ELEM_MAX
, attr
,
3750 nft_set_elem_policy
, NULL
);
3754 if (!nla
[NFTA_SET_ELEM_KEY
])
3757 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
3761 err
= nft_data_init(ctx
, &elem
.key
.val
, sizeof(elem
.key
), &desc
,
3762 nla
[NFTA_SET_ELEM_KEY
]);
3767 if (desc
.type
!= NFT_DATA_VALUE
|| desc
.len
!= set
->klen
)
3770 priv
= set
->ops
->get(ctx
->net
, set
, &elem
, flags
);
3772 return PTR_ERR(priv
);
3775 ext
= nft_set_elem_ext(set
, &elem
);
3778 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
3782 err
= nf_tables_fill_setelem_info(skb
, ctx
, ctx
->seq
, ctx
->portid
,
3783 NFT_MSG_NEWSETELEM
, 0, set
, &elem
);
3787 err
= nfnetlink_unicast(skb
, ctx
->net
, ctx
->portid
, MSG_DONTWAIT
);
3788 /* This avoids a loop in nfnetlink. */
3796 /* this avoids a loop in nfnetlink. */
3797 return err
== -EAGAIN
? -ENOBUFS
: err
;
3800 static int nf_tables_getsetelem(struct net
*net
, struct sock
*nlsk
,
3801 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3802 const struct nlattr
* const nla
[],
3803 struct netlink_ext_ack
*extack
)
3805 u8 genmask
= nft_genmask_cur(net
);
3806 struct nft_set
*set
;
3807 struct nlattr
*attr
;
3811 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, genmask
);
3815 set
= nf_tables_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
],
3818 return PTR_ERR(set
);
3820 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
3821 struct netlink_dump_control c
= {
3822 .dump
= nf_tables_dump_set
,
3823 .done
= nf_tables_dump_set_done
,
3825 struct nft_set_dump_ctx
*dump_ctx
;
3827 dump_ctx
= kmalloc(sizeof(*dump_ctx
), GFP_KERNEL
);
3831 dump_ctx
->set
= set
;
3832 dump_ctx
->ctx
= ctx
;
3835 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
3838 if (!nla
[NFTA_SET_ELEM_LIST_ELEMENTS
])
3841 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
3842 err
= nft_get_set_elem(&ctx
, set
, attr
);
3850 static void nf_tables_setelem_notify(const struct nft_ctx
*ctx
,
3851 const struct nft_set
*set
,
3852 const struct nft_set_elem
*elem
,
3853 int event
, u16 flags
)
3855 struct net
*net
= ctx
->net
;
3856 u32 portid
= ctx
->portid
;
3857 struct sk_buff
*skb
;
3860 if (!ctx
->report
&& !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
3863 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
3867 err
= nf_tables_fill_setelem_info(skb
, ctx
, 0, portid
, event
, flags
,
3874 nfnetlink_send(skb
, net
, portid
, NFNLGRP_NFTABLES
, ctx
->report
,
3878 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
3881 static struct nft_trans
*nft_trans_elem_alloc(struct nft_ctx
*ctx
,
3883 struct nft_set
*set
)
3885 struct nft_trans
*trans
;
3887 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_elem
));
3891 nft_trans_elem_set(trans
) = set
;
3895 void *nft_set_elem_init(const struct nft_set
*set
,
3896 const struct nft_set_ext_tmpl
*tmpl
,
3897 const u32
*key
, const u32
*data
,
3898 u64 timeout
, gfp_t gfp
)
3900 struct nft_set_ext
*ext
;
3903 elem
= kzalloc(set
->ops
->elemsize
+ tmpl
->len
, gfp
);
3907 ext
= nft_set_elem_ext(set
, elem
);
3908 nft_set_ext_init(ext
, tmpl
);
3910 memcpy(nft_set_ext_key(ext
), key
, set
->klen
);
3911 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
3912 memcpy(nft_set_ext_data(ext
), data
, set
->dlen
);
3913 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
))
3914 *nft_set_ext_expiration(ext
) =
3916 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
))
3917 *nft_set_ext_timeout(ext
) = timeout
;
3922 void nft_set_elem_destroy(const struct nft_set
*set
, void *elem
,
3925 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
3927 nft_data_release(nft_set_ext_key(ext
), NFT_DATA_VALUE
);
3928 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
3929 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
3930 if (destroy_expr
&& nft_set_ext_exists(ext
, NFT_SET_EXT_EXPR
))
3931 nf_tables_expr_destroy(NULL
, nft_set_ext_expr(ext
));
3932 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
3933 (*nft_set_ext_obj(ext
))->use
--;
3936 EXPORT_SYMBOL_GPL(nft_set_elem_destroy
);
3938 /* Only called from commit path, nft_set_elem_deactivate() already deals with
3939 * the refcounting from the preparation phase.
3941 static void nf_tables_set_elem_destroy(const struct nft_set
*set
, void *elem
)
3943 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
3945 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPR
))
3946 nf_tables_expr_destroy(NULL
, nft_set_ext_expr(ext
));
3950 static int nft_add_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
3951 const struct nlattr
*attr
, u32 nlmsg_flags
)
3953 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
3954 u8 genmask
= nft_genmask_next(ctx
->net
);
3955 struct nft_data_desc d1
, d2
;
3956 struct nft_set_ext_tmpl tmpl
;
3957 struct nft_set_ext
*ext
, *ext2
;
3958 struct nft_set_elem elem
;
3959 struct nft_set_binding
*binding
;
3960 struct nft_object
*obj
= NULL
;
3961 struct nft_userdata
*udata
;
3962 struct nft_data data
;
3963 enum nft_registers dreg
;
3964 struct nft_trans
*trans
;
3970 err
= nla_parse_nested(nla
, NFTA_SET_ELEM_MAX
, attr
,
3971 nft_set_elem_policy
, NULL
);
3975 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
3978 nft_set_ext_prepare(&tmpl
);
3980 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
3984 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
3986 if (set
->flags
& NFT_SET_MAP
) {
3987 if (nla
[NFTA_SET_ELEM_DATA
] == NULL
&&
3988 !(flags
& NFT_SET_ELEM_INTERVAL_END
))
3990 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
&&
3991 flags
& NFT_SET_ELEM_INTERVAL_END
)
3994 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
3999 if (nla
[NFTA_SET_ELEM_TIMEOUT
] != NULL
) {
4000 if (!(set
->flags
& NFT_SET_TIMEOUT
))
4002 timeout
= msecs_to_jiffies(be64_to_cpu(nla_get_be64(
4003 nla
[NFTA_SET_ELEM_TIMEOUT
])));
4004 } else if (set
->flags
& NFT_SET_TIMEOUT
) {
4005 timeout
= set
->timeout
;
4008 err
= nft_data_init(ctx
, &elem
.key
.val
, sizeof(elem
.key
), &d1
,
4009 nla
[NFTA_SET_ELEM_KEY
]);
4013 if (d1
.type
!= NFT_DATA_VALUE
|| d1
.len
!= set
->klen
)
4016 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, d1
.len
);
4018 nft_set_ext_add(&tmpl
, NFT_SET_EXT_EXPIRATION
);
4019 if (timeout
!= set
->timeout
)
4020 nft_set_ext_add(&tmpl
, NFT_SET_EXT_TIMEOUT
);
4023 if (nla
[NFTA_SET_ELEM_OBJREF
] != NULL
) {
4024 if (!(set
->flags
& NFT_SET_OBJECT
)) {
4028 obj
= nf_tables_obj_lookup(ctx
->table
, nla
[NFTA_SET_ELEM_OBJREF
],
4029 set
->objtype
, genmask
);
4034 nft_set_ext_add(&tmpl
, NFT_SET_EXT_OBJREF
);
4037 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
) {
4038 err
= nft_data_init(ctx
, &data
, sizeof(data
), &d2
,
4039 nla
[NFTA_SET_ELEM_DATA
]);
4044 if (set
->dtype
!= NFT_DATA_VERDICT
&& d2
.len
!= set
->dlen
)
4047 dreg
= nft_type_to_reg(set
->dtype
);
4048 list_for_each_entry(binding
, &set
->bindings
, list
) {
4049 struct nft_ctx bind_ctx
= {
4052 .table
= ctx
->table
,
4053 .chain
= (struct nft_chain
*)binding
->chain
,
4056 if (!(binding
->flags
& NFT_SET_MAP
))
4059 err
= nft_validate_register_store(&bind_ctx
, dreg
,
4066 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_DATA
, d2
.len
);
4069 /* The full maximum length of userdata can exceed the maximum
4070 * offset value (U8_MAX) for following extensions, therefor it
4071 * must be the last extension added.
4074 if (nla
[NFTA_SET_ELEM_USERDATA
] != NULL
) {
4075 ulen
= nla_len(nla
[NFTA_SET_ELEM_USERDATA
]);
4077 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_USERDATA
,
4082 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
, data
.data
,
4083 timeout
, GFP_KERNEL
);
4084 if (elem
.priv
== NULL
)
4087 ext
= nft_set_elem_ext(set
, elem
.priv
);
4089 *nft_set_ext_flags(ext
) = flags
;
4091 udata
= nft_set_ext_userdata(ext
);
4092 udata
->len
= ulen
- 1;
4093 nla_memcpy(&udata
->data
, nla
[NFTA_SET_ELEM_USERDATA
], ulen
);
4096 *nft_set_ext_obj(ext
) = obj
;
4100 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_NEWSETELEM
, set
);
4104 ext
->genmask
= nft_genmask_cur(ctx
->net
) | NFT_SET_ELEM_BUSY_MASK
;
4105 err
= set
->ops
->insert(ctx
->net
, set
, &elem
, &ext2
);
4107 if (err
== -EEXIST
) {
4108 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) ^
4109 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) ||
4110 nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) ^
4111 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
)) {
4115 if ((nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
4116 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) &&
4117 memcmp(nft_set_ext_data(ext
),
4118 nft_set_ext_data(ext2
), set
->dlen
) != 0) ||
4119 (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
4120 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
) &&
4121 *nft_set_ext_obj(ext
) != *nft_set_ext_obj(ext2
)))
4123 else if (!(nlmsg_flags
& NLM_F_EXCL
))
4130 !atomic_add_unless(&set
->nelems
, 1, set
->size
+ set
->ndeact
)) {
4135 nft_trans_elem(trans
) = elem
;
4136 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
4140 set
->ops
->remove(ctx
->net
, set
, &elem
);
4148 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
4149 nft_data_release(&data
, d2
.type
);
4151 nft_data_release(&elem
.key
.val
, d1
.type
);
4156 static int nf_tables_newsetelem(struct net
*net
, struct sock
*nlsk
,
4157 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4158 const struct nlattr
* const nla
[],
4159 struct netlink_ext_ack
*extack
)
4161 u8 genmask
= nft_genmask_next(net
);
4162 const struct nlattr
*attr
;
4163 struct nft_set
*set
;
4167 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
)
4170 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, genmask
);
4174 set
= nf_tables_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
],
4177 if (nla
[NFTA_SET_ELEM_LIST_SET_ID
]) {
4178 set
= nf_tables_set_lookup_byid(net
,
4179 nla
[NFTA_SET_ELEM_LIST_SET_ID
],
4183 return PTR_ERR(set
);
4186 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
4189 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
4190 err
= nft_add_set_elem(&ctx
, set
, attr
, nlh
->nlmsg_flags
);
4198 * nft_data_hold - hold a nft_data item
4200 * @data: struct nft_data to release
4201 * @type: type of data
4203 * Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
4204 * NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
4205 * NFT_GOTO verdicts. This function must be called on active data objects
4206 * from the second phase of the commit protocol.
4208 void nft_data_hold(const struct nft_data
*data
, enum nft_data_types type
)
4210 if (type
== NFT_DATA_VERDICT
) {
4211 switch (data
->verdict
.code
) {
4214 data
->verdict
.chain
->use
++;
4220 static void nft_set_elem_activate(const struct net
*net
,
4221 const struct nft_set
*set
,
4222 struct nft_set_elem
*elem
)
4224 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4226 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
4227 nft_data_hold(nft_set_ext_data(ext
), set
->dtype
);
4228 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
4229 (*nft_set_ext_obj(ext
))->use
++;
4232 static void nft_set_elem_deactivate(const struct net
*net
,
4233 const struct nft_set
*set
,
4234 struct nft_set_elem
*elem
)
4236 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4238 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
4239 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
4240 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
4241 (*nft_set_ext_obj(ext
))->use
--;
4244 static int nft_del_setelem(struct nft_ctx
*ctx
, struct nft_set
*set
,
4245 const struct nlattr
*attr
)
4247 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
4248 struct nft_set_ext_tmpl tmpl
;
4249 struct nft_data_desc desc
;
4250 struct nft_set_elem elem
;
4251 struct nft_set_ext
*ext
;
4252 struct nft_trans
*trans
;
4257 err
= nla_parse_nested(nla
, NFTA_SET_ELEM_MAX
, attr
,
4258 nft_set_elem_policy
, NULL
);
4263 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
4266 nft_set_ext_prepare(&tmpl
);
4268 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
4272 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
4274 err
= nft_data_init(ctx
, &elem
.key
.val
, sizeof(elem
.key
), &desc
,
4275 nla
[NFTA_SET_ELEM_KEY
]);
4280 if (desc
.type
!= NFT_DATA_VALUE
|| desc
.len
!= set
->klen
)
4283 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, desc
.len
);
4286 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
, NULL
, 0,
4288 if (elem
.priv
== NULL
)
4291 ext
= nft_set_elem_ext(set
, elem
.priv
);
4293 *nft_set_ext_flags(ext
) = flags
;
4295 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_DELSETELEM
, set
);
4296 if (trans
== NULL
) {
4301 priv
= set
->ops
->deactivate(ctx
->net
, set
, &elem
);
4309 nft_set_elem_deactivate(ctx
->net
, set
, &elem
);
4311 nft_trans_elem(trans
) = elem
;
4312 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
4320 nft_data_release(&elem
.key
.val
, desc
.type
);
4325 static int nft_flush_set(const struct nft_ctx
*ctx
,
4326 struct nft_set
*set
,
4327 const struct nft_set_iter
*iter
,
4328 struct nft_set_elem
*elem
)
4330 struct nft_trans
*trans
;
4333 trans
= nft_trans_alloc_gfp(ctx
, NFT_MSG_DELSETELEM
,
4334 sizeof(struct nft_trans_elem
), GFP_ATOMIC
);
4338 if (!set
->ops
->flush(ctx
->net
, set
, elem
->priv
)) {
4344 nft_set_elem_deactivate(ctx
->net
, set
, elem
);
4345 nft_trans_elem_set(trans
) = set
;
4346 nft_trans_elem(trans
) = *elem
;
4347 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
4355 static int nf_tables_delsetelem(struct net
*net
, struct sock
*nlsk
,
4356 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4357 const struct nlattr
* const nla
[],
4358 struct netlink_ext_ack
*extack
)
4360 u8 genmask
= nft_genmask_next(net
);
4361 const struct nlattr
*attr
;
4362 struct nft_set
*set
;
4366 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, genmask
);
4370 set
= nf_tables_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
],
4373 return PTR_ERR(set
);
4374 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
4377 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
) {
4378 struct nft_set_iter iter
= {
4380 .fn
= nft_flush_set
,
4382 set
->ops
->walk(&ctx
, set
, &iter
);
4387 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
4388 err
= nft_del_setelem(&ctx
, set
, attr
);
4397 void nft_set_gc_batch_release(struct rcu_head
*rcu
)
4399 struct nft_set_gc_batch
*gcb
;
4402 gcb
= container_of(rcu
, struct nft_set_gc_batch
, head
.rcu
);
4403 for (i
= 0; i
< gcb
->head
.cnt
; i
++)
4404 nft_set_elem_destroy(gcb
->head
.set
, gcb
->elems
[i
], true);
4407 EXPORT_SYMBOL_GPL(nft_set_gc_batch_release
);
4409 struct nft_set_gc_batch
*nft_set_gc_batch_alloc(const struct nft_set
*set
,
4412 struct nft_set_gc_batch
*gcb
;
4414 gcb
= kzalloc(sizeof(*gcb
), gfp
);
4417 gcb
->head
.set
= set
;
4420 EXPORT_SYMBOL_GPL(nft_set_gc_batch_alloc
);
4427 * nft_register_obj- register nf_tables stateful object type
4430 * Registers the object type for use with nf_tables. Returns zero on
4431 * success or a negative errno code otherwise.
4433 int nft_register_obj(struct nft_object_type
*obj_type
)
4435 if (obj_type
->type
== NFT_OBJECT_UNSPEC
)
4438 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
4439 list_add_rcu(&obj_type
->list
, &nf_tables_objects
);
4440 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
4443 EXPORT_SYMBOL_GPL(nft_register_obj
);
4446 * nft_unregister_obj - unregister nf_tables object type
4449 * Unregisters the object type for use with nf_tables.
4451 void nft_unregister_obj(struct nft_object_type
*obj_type
)
4453 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
4454 list_del_rcu(&obj_type
->list
);
4455 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
4457 EXPORT_SYMBOL_GPL(nft_unregister_obj
);
4459 struct nft_object
*nf_tables_obj_lookup(const struct nft_table
*table
,
4460 const struct nlattr
*nla
,
4461 u32 objtype
, u8 genmask
)
4463 struct nft_object
*obj
;
4465 list_for_each_entry(obj
, &table
->objects
, list
) {
4466 if (!nla_strcmp(nla
, obj
->name
) &&
4467 objtype
== obj
->ops
->type
->type
&&
4468 nft_active_genmask(obj
, genmask
))
4471 return ERR_PTR(-ENOENT
);
4473 EXPORT_SYMBOL_GPL(nf_tables_obj_lookup
);
4475 static const struct nla_policy nft_obj_policy
[NFTA_OBJ_MAX
+ 1] = {
4476 [NFTA_OBJ_TABLE
] = { .type
= NLA_STRING
,
4477 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
4478 [NFTA_OBJ_NAME
] = { .type
= NLA_STRING
,
4479 .len
= NFT_OBJ_MAXNAMELEN
- 1 },
4480 [NFTA_OBJ_TYPE
] = { .type
= NLA_U32
},
4481 [NFTA_OBJ_DATA
] = { .type
= NLA_NESTED
},
4484 static struct nft_object
*nft_obj_init(const struct nft_ctx
*ctx
,
4485 const struct nft_object_type
*type
,
4486 const struct nlattr
*attr
)
4488 struct nlattr
*tb
[type
->maxattr
+ 1];
4489 const struct nft_object_ops
*ops
;
4490 struct nft_object
*obj
;
4494 err
= nla_parse_nested(tb
, type
->maxattr
, attr
, type
->policy
,
4499 memset(tb
, 0, sizeof(tb
[0]) * (type
->maxattr
+ 1));
4502 if (type
->select_ops
) {
4503 ops
= type
->select_ops(ctx
, (const struct nlattr
* const *)tb
);
4513 obj
= kzalloc(sizeof(*obj
) + ops
->size
, GFP_KERNEL
);
4517 err
= ops
->init(ctx
, (const struct nlattr
* const *)tb
, obj
);
4527 return ERR_PTR(err
);
4530 static int nft_object_dump(struct sk_buff
*skb
, unsigned int attr
,
4531 struct nft_object
*obj
, bool reset
)
4533 struct nlattr
*nest
;
4535 nest
= nla_nest_start(skb
, attr
);
4537 goto nla_put_failure
;
4538 if (obj
->ops
->dump(skb
, obj
, reset
) < 0)
4539 goto nla_put_failure
;
4540 nla_nest_end(skb
, nest
);
4547 static const struct nft_object_type
*__nft_obj_type_get(u32 objtype
)
4549 const struct nft_object_type
*type
;
4551 list_for_each_entry(type
, &nf_tables_objects
, list
) {
4552 if (objtype
== type
->type
)
4558 static const struct nft_object_type
*nft_obj_type_get(u32 objtype
)
4560 const struct nft_object_type
*type
;
4562 type
= __nft_obj_type_get(objtype
);
4563 if (type
!= NULL
&& try_module_get(type
->owner
))
4566 #ifdef CONFIG_MODULES
4568 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
4569 request_module("nft-obj-%u", objtype
);
4570 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
4571 if (__nft_obj_type_get(objtype
))
4572 return ERR_PTR(-EAGAIN
);
4575 return ERR_PTR(-ENOENT
);
4578 static int nf_tables_newobj(struct net
*net
, struct sock
*nlsk
,
4579 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4580 const struct nlattr
* const nla
[],
4581 struct netlink_ext_ack
*extack
)
4583 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4584 const struct nft_object_type
*type
;
4585 u8 genmask
= nft_genmask_next(net
);
4586 int family
= nfmsg
->nfgen_family
;
4587 struct nft_af_info
*afi
;
4588 struct nft_table
*table
;
4589 struct nft_object
*obj
;
4594 if (!nla
[NFTA_OBJ_TYPE
] ||
4595 !nla
[NFTA_OBJ_NAME
] ||
4596 !nla
[NFTA_OBJ_DATA
])
4599 afi
= nf_tables_afinfo_lookup(net
, family
, true);
4601 return PTR_ERR(afi
);
4603 table
= nf_tables_table_lookup(afi
, nla
[NFTA_OBJ_TABLE
], genmask
);
4605 return PTR_ERR(table
);
4607 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
4608 obj
= nf_tables_obj_lookup(table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
4615 if (nlh
->nlmsg_flags
& NLM_F_EXCL
)
4621 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
4623 type
= nft_obj_type_get(objtype
);
4625 return PTR_ERR(type
);
4627 obj
= nft_obj_init(&ctx
, type
, nla
[NFTA_OBJ_DATA
]);
4633 obj
->name
= nla_strdup(nla
[NFTA_OBJ_NAME
], GFP_KERNEL
);
4639 err
= nft_trans_obj_add(&ctx
, NFT_MSG_NEWOBJ
, obj
);
4643 list_add_tail_rcu(&obj
->list
, &table
->objects
);
4649 if (obj
->ops
->destroy
)
4650 obj
->ops
->destroy(obj
);
4653 module_put(type
->owner
);
4657 static int nf_tables_fill_obj_info(struct sk_buff
*skb
, struct net
*net
,
4658 u32 portid
, u32 seq
, int event
, u32 flags
,
4659 int family
, const struct nft_table
*table
,
4660 struct nft_object
*obj
, bool reset
)
4662 struct nfgenmsg
*nfmsg
;
4663 struct nlmsghdr
*nlh
;
4665 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
4666 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
4668 goto nla_put_failure
;
4670 nfmsg
= nlmsg_data(nlh
);
4671 nfmsg
->nfgen_family
= family
;
4672 nfmsg
->version
= NFNETLINK_V0
;
4673 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
4675 if (nla_put_string(skb
, NFTA_OBJ_TABLE
, table
->name
) ||
4676 nla_put_string(skb
, NFTA_OBJ_NAME
, obj
->name
) ||
4677 nla_put_be32(skb
, NFTA_OBJ_TYPE
, htonl(obj
->ops
->type
->type
)) ||
4678 nla_put_be32(skb
, NFTA_OBJ_USE
, htonl(obj
->use
)) ||
4679 nft_object_dump(skb
, NFTA_OBJ_DATA
, obj
, reset
))
4680 goto nla_put_failure
;
4682 nlmsg_end(skb
, nlh
);
4686 nlmsg_trim(skb
, nlh
);
4690 struct nft_obj_filter
{
4695 static int nf_tables_dump_obj(struct sk_buff
*skb
, struct netlink_callback
*cb
)
4697 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
4698 const struct nft_af_info
*afi
;
4699 const struct nft_table
*table
;
4700 unsigned int idx
= 0, s_idx
= cb
->args
[0];
4701 struct nft_obj_filter
*filter
= cb
->data
;
4702 struct net
*net
= sock_net(skb
->sk
);
4703 int family
= nfmsg
->nfgen_family
;
4704 struct nft_object
*obj
;
4707 if (NFNL_MSG_TYPE(cb
->nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
4711 cb
->seq
= net
->nft
.base_seq
;
4713 list_for_each_entry_rcu(afi
, &net
->nft
.af_info
, list
) {
4714 if (family
!= NFPROTO_UNSPEC
&& family
!= afi
->family
)
4717 list_for_each_entry_rcu(table
, &afi
->tables
, list
) {
4718 list_for_each_entry_rcu(obj
, &table
->objects
, list
) {
4719 if (!nft_is_active(net
, obj
))
4724 memset(&cb
->args
[1], 0,
4725 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
4726 if (filter
&& filter
->table
&&
4727 strcmp(filter
->table
, table
->name
))
4730 filter
->type
!= NFT_OBJECT_UNSPEC
&&
4731 obj
->ops
->type
->type
!= filter
->type
)
4734 if (nf_tables_fill_obj_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
4737 NLM_F_MULTI
| NLM_F_APPEND
,
4738 afi
->family
, table
, obj
, reset
) < 0)
4741 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
4754 static int nf_tables_dump_obj_done(struct netlink_callback
*cb
)
4756 struct nft_obj_filter
*filter
= cb
->data
;
4759 kfree(filter
->table
);
4766 static struct nft_obj_filter
*
4767 nft_obj_filter_alloc(const struct nlattr
* const nla
[])
4769 struct nft_obj_filter
*filter
;
4771 filter
= kzalloc(sizeof(*filter
), GFP_KERNEL
);
4773 return ERR_PTR(-ENOMEM
);
4775 if (nla
[NFTA_OBJ_TABLE
]) {
4776 filter
->table
= nla_strdup(nla
[NFTA_OBJ_TABLE
], GFP_KERNEL
);
4777 if (!filter
->table
) {
4779 return ERR_PTR(-ENOMEM
);
4782 if (nla
[NFTA_OBJ_TYPE
])
4783 filter
->type
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
4788 static int nf_tables_getobj(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
)
4793 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4794 u8 genmask
= nft_genmask_cur(net
);
4795 int family
= nfmsg
->nfgen_family
;
4796 const struct nft_af_info
*afi
;
4797 const struct nft_table
*table
;
4798 struct nft_object
*obj
;
4799 struct sk_buff
*skb2
;
4804 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
4805 struct netlink_dump_control c
= {
4806 .dump
= nf_tables_dump_obj
,
4807 .done
= nf_tables_dump_obj_done
,
4810 if (nla
[NFTA_OBJ_TABLE
] ||
4811 nla
[NFTA_OBJ_TYPE
]) {
4812 struct nft_obj_filter
*filter
;
4814 filter
= nft_obj_filter_alloc(nla
);
4820 return netlink_dump_start(nlsk
, skb
, nlh
, &c
);
4823 if (!nla
[NFTA_OBJ_NAME
] ||
4824 !nla
[NFTA_OBJ_TYPE
])
4827 afi
= nf_tables_afinfo_lookup(net
, family
, false);
4829 return PTR_ERR(afi
);
4831 table
= nf_tables_table_lookup(afi
, nla
[NFTA_OBJ_TABLE
], genmask
);
4833 return PTR_ERR(table
);
4835 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
4836 obj
= nf_tables_obj_lookup(table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
4838 return PTR_ERR(obj
);
4840 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
4844 if (NFNL_MSG_TYPE(nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
4847 err
= nf_tables_fill_obj_info(skb2
, net
, NETLINK_CB(skb
).portid
,
4848 nlh
->nlmsg_seq
, NFT_MSG_NEWOBJ
, 0,
4849 family
, table
, obj
, reset
);
4853 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
4859 static void nft_obj_destroy(struct nft_object
*obj
)
4861 if (obj
->ops
->destroy
)
4862 obj
->ops
->destroy(obj
);
4864 module_put(obj
->ops
->type
->owner
);
4869 static int nf_tables_delobj(struct net
*net
, struct sock
*nlsk
,
4870 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4871 const struct nlattr
* const nla
[],
4872 struct netlink_ext_ack
*extack
)
4874 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4875 u8 genmask
= nft_genmask_next(net
);
4876 int family
= nfmsg
->nfgen_family
;
4877 struct nft_af_info
*afi
;
4878 struct nft_table
*table
;
4879 struct nft_object
*obj
;
4883 if (!nla
[NFTA_OBJ_TYPE
] ||
4884 !nla
[NFTA_OBJ_NAME
])
4887 afi
= nf_tables_afinfo_lookup(net
, family
, true);
4889 return PTR_ERR(afi
);
4891 table
= nf_tables_table_lookup(afi
, nla
[NFTA_OBJ_TABLE
], genmask
);
4893 return PTR_ERR(table
);
4895 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
4896 obj
= nf_tables_obj_lookup(table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
4898 return PTR_ERR(obj
);
4902 nft_ctx_init(&ctx
, net
, skb
, nlh
, afi
, table
, NULL
, nla
);
4904 return nft_delobj(&ctx
, obj
);
4907 void nft_obj_notify(struct net
*net
, struct nft_table
*table
,
4908 struct nft_object
*obj
, u32 portid
, u32 seq
, int event
,
4909 int family
, int report
, gfp_t gfp
)
4911 struct sk_buff
*skb
;
4915 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
4918 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp
);
4922 err
= nf_tables_fill_obj_info(skb
, net
, portid
, seq
, event
, 0, family
,
4929 nfnetlink_send(skb
, net
, portid
, NFNLGRP_NFTABLES
, report
, gfp
);
4932 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
4934 EXPORT_SYMBOL_GPL(nft_obj_notify
);
4936 static void nf_tables_obj_notify(const struct nft_ctx
*ctx
,
4937 struct nft_object
*obj
, int event
)
4939 nft_obj_notify(ctx
->net
, ctx
->table
, obj
, ctx
->portid
, ctx
->seq
, event
,
4940 ctx
->afi
->family
, ctx
->report
, GFP_KERNEL
);
4943 static int nf_tables_fill_gen_info(struct sk_buff
*skb
, struct net
*net
,
4944 u32 portid
, u32 seq
)
4946 struct nlmsghdr
*nlh
;
4947 struct nfgenmsg
*nfmsg
;
4948 char buf
[TASK_COMM_LEN
];
4949 int event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWGEN
);
4951 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), 0);
4953 goto nla_put_failure
;
4955 nfmsg
= nlmsg_data(nlh
);
4956 nfmsg
->nfgen_family
= AF_UNSPEC
;
4957 nfmsg
->version
= NFNETLINK_V0
;
4958 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
4960 if (nla_put_be32(skb
, NFTA_GEN_ID
, htonl(net
->nft
.base_seq
)) ||
4961 nla_put_be32(skb
, NFTA_GEN_PROC_PID
, htonl(task_pid_nr(current
))) ||
4962 nla_put_string(skb
, NFTA_GEN_PROC_NAME
, get_task_comm(buf
, current
)))
4963 goto nla_put_failure
;
4965 nlmsg_end(skb
, nlh
);
4969 nlmsg_trim(skb
, nlh
);
4973 static void nf_tables_gen_notify(struct net
*net
, struct sk_buff
*skb
,
4976 struct nlmsghdr
*nlh
= nlmsg_hdr(skb
);
4977 struct sk_buff
*skb2
;
4980 if (nlmsg_report(nlh
) &&
4981 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
4984 skb2
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
4988 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
4995 nfnetlink_send(skb2
, net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
4996 nlmsg_report(nlh
), GFP_KERNEL
);
4999 nfnetlink_set_err(net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
5003 static int nf_tables_getgen(struct net
*net
, struct sock
*nlsk
,
5004 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5005 const struct nlattr
* const nla
[],
5006 struct netlink_ext_ack
*extack
)
5008 struct sk_buff
*skb2
;
5011 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_KERNEL
);
5015 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
5020 return nlmsg_unicast(nlsk
, skb2
, NETLINK_CB(skb
).portid
);
5026 static const struct nfnl_callback nf_tables_cb
[NFT_MSG_MAX
] = {
5027 [NFT_MSG_NEWTABLE
] = {
5028 .call_batch
= nf_tables_newtable
,
5029 .attr_count
= NFTA_TABLE_MAX
,
5030 .policy
= nft_table_policy
,
5032 [NFT_MSG_GETTABLE
] = {
5033 .call
= nf_tables_gettable
,
5034 .attr_count
= NFTA_TABLE_MAX
,
5035 .policy
= nft_table_policy
,
5037 [NFT_MSG_DELTABLE
] = {
5038 .call_batch
= nf_tables_deltable
,
5039 .attr_count
= NFTA_TABLE_MAX
,
5040 .policy
= nft_table_policy
,
5042 [NFT_MSG_NEWCHAIN
] = {
5043 .call_batch
= nf_tables_newchain
,
5044 .attr_count
= NFTA_CHAIN_MAX
,
5045 .policy
= nft_chain_policy
,
5047 [NFT_MSG_GETCHAIN
] = {
5048 .call
= nf_tables_getchain
,
5049 .attr_count
= NFTA_CHAIN_MAX
,
5050 .policy
= nft_chain_policy
,
5052 [NFT_MSG_DELCHAIN
] = {
5053 .call_batch
= nf_tables_delchain
,
5054 .attr_count
= NFTA_CHAIN_MAX
,
5055 .policy
= nft_chain_policy
,
5057 [NFT_MSG_NEWRULE
] = {
5058 .call_batch
= nf_tables_newrule
,
5059 .attr_count
= NFTA_RULE_MAX
,
5060 .policy
= nft_rule_policy
,
5062 [NFT_MSG_GETRULE
] = {
5063 .call
= nf_tables_getrule
,
5064 .attr_count
= NFTA_RULE_MAX
,
5065 .policy
= nft_rule_policy
,
5067 [NFT_MSG_DELRULE
] = {
5068 .call_batch
= nf_tables_delrule
,
5069 .attr_count
= NFTA_RULE_MAX
,
5070 .policy
= nft_rule_policy
,
5072 [NFT_MSG_NEWSET
] = {
5073 .call_batch
= nf_tables_newset
,
5074 .attr_count
= NFTA_SET_MAX
,
5075 .policy
= nft_set_policy
,
5077 [NFT_MSG_GETSET
] = {
5078 .call
= nf_tables_getset
,
5079 .attr_count
= NFTA_SET_MAX
,
5080 .policy
= nft_set_policy
,
5082 [NFT_MSG_DELSET
] = {
5083 .call_batch
= nf_tables_delset
,
5084 .attr_count
= NFTA_SET_MAX
,
5085 .policy
= nft_set_policy
,
5087 [NFT_MSG_NEWSETELEM
] = {
5088 .call_batch
= nf_tables_newsetelem
,
5089 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
5090 .policy
= nft_set_elem_list_policy
,
5092 [NFT_MSG_GETSETELEM
] = {
5093 .call
= nf_tables_getsetelem
,
5094 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
5095 .policy
= nft_set_elem_list_policy
,
5097 [NFT_MSG_DELSETELEM
] = {
5098 .call_batch
= nf_tables_delsetelem
,
5099 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
5100 .policy
= nft_set_elem_list_policy
,
5102 [NFT_MSG_GETGEN
] = {
5103 .call
= nf_tables_getgen
,
5105 [NFT_MSG_NEWOBJ
] = {
5106 .call_batch
= nf_tables_newobj
,
5107 .attr_count
= NFTA_OBJ_MAX
,
5108 .policy
= nft_obj_policy
,
5110 [NFT_MSG_GETOBJ
] = {
5111 .call
= nf_tables_getobj
,
5112 .attr_count
= NFTA_OBJ_MAX
,
5113 .policy
= nft_obj_policy
,
5115 [NFT_MSG_DELOBJ
] = {
5116 .call_batch
= nf_tables_delobj
,
5117 .attr_count
= NFTA_OBJ_MAX
,
5118 .policy
= nft_obj_policy
,
5120 [NFT_MSG_GETOBJ_RESET
] = {
5121 .call
= nf_tables_getobj
,
5122 .attr_count
= NFTA_OBJ_MAX
,
5123 .policy
= nft_obj_policy
,
5127 static void nft_chain_commit_update(struct nft_trans
*trans
)
5129 struct nft_base_chain
*basechain
;
5131 if (nft_trans_chain_name(trans
))
5132 swap(trans
->ctx
.chain
->name
, nft_trans_chain_name(trans
));
5134 if (!nft_is_base_chain(trans
->ctx
.chain
))
5137 basechain
= nft_base_chain(trans
->ctx
.chain
);
5138 nft_chain_stats_replace(basechain
, nft_trans_chain_stats(trans
));
5140 switch (nft_trans_chain_policy(trans
)) {
5143 basechain
->policy
= nft_trans_chain_policy(trans
);
5148 static void nf_tables_commit_release(struct nft_trans
*trans
)
5150 switch (trans
->msg_type
) {
5151 case NFT_MSG_DELTABLE
:
5152 nf_tables_table_destroy(&trans
->ctx
);
5154 case NFT_MSG_NEWCHAIN
:
5155 kfree(nft_trans_chain_name(trans
));
5157 case NFT_MSG_DELCHAIN
:
5158 nf_tables_chain_destroy(trans
->ctx
.chain
);
5160 case NFT_MSG_DELRULE
:
5161 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
5163 case NFT_MSG_DELSET
:
5164 nft_set_destroy(nft_trans_set(trans
));
5166 case NFT_MSG_DELSETELEM
:
5167 nf_tables_set_elem_destroy(nft_trans_elem_set(trans
),
5168 nft_trans_elem(trans
).priv
);
5170 case NFT_MSG_DELOBJ
:
5171 nft_obj_destroy(nft_trans_obj(trans
));
5177 static int nf_tables_commit(struct net
*net
, struct sk_buff
*skb
)
5179 struct nft_trans
*trans
, *next
;
5180 struct nft_trans_elem
*te
;
5182 /* Bump generation counter, invalidate any dump in progress */
5183 while (++net
->nft
.base_seq
== 0);
5185 /* A new generation has just started */
5186 net
->nft
.gencursor
= nft_gencursor_next(net
);
5188 /* Make sure all packets have left the previous generation before
5189 * purging old rules.
5193 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
5194 switch (trans
->msg_type
) {
5195 case NFT_MSG_NEWTABLE
:
5196 if (nft_trans_table_update(trans
)) {
5197 if (!nft_trans_table_enable(trans
)) {
5198 nf_tables_table_disable(net
,
5201 trans
->ctx
.table
->flags
|= NFT_TABLE_F_DORMANT
;
5204 nft_clear(net
, trans
->ctx
.table
);
5206 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_NEWTABLE
);
5207 nft_trans_destroy(trans
);
5209 case NFT_MSG_DELTABLE
:
5210 list_del_rcu(&trans
->ctx
.table
->list
);
5211 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_DELTABLE
);
5213 case NFT_MSG_NEWCHAIN
:
5214 if (nft_trans_chain_update(trans
)) {
5215 nft_chain_commit_update(trans
);
5216 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
5217 /* trans destroyed after rcu grace period */
5219 nft_clear(net
, trans
->ctx
.chain
);
5220 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
5221 nft_trans_destroy(trans
);
5224 case NFT_MSG_DELCHAIN
:
5225 list_del_rcu(&trans
->ctx
.chain
->list
);
5226 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_DELCHAIN
);
5227 nf_tables_unregister_hooks(trans
->ctx
.net
,
5230 trans
->ctx
.afi
->nops
);
5232 case NFT_MSG_NEWRULE
:
5233 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
5234 nf_tables_rule_notify(&trans
->ctx
,
5235 nft_trans_rule(trans
),
5237 nft_trans_destroy(trans
);
5239 case NFT_MSG_DELRULE
:
5240 list_del_rcu(&nft_trans_rule(trans
)->list
);
5241 nf_tables_rule_notify(&trans
->ctx
,
5242 nft_trans_rule(trans
),
5245 case NFT_MSG_NEWSET
:
5246 nft_clear(net
, nft_trans_set(trans
));
5247 /* This avoids hitting -EBUSY when deleting the table
5248 * from the transaction.
5250 if (nft_trans_set(trans
)->flags
& NFT_SET_ANONYMOUS
&&
5251 !list_empty(&nft_trans_set(trans
)->bindings
))
5252 trans
->ctx
.table
->use
--;
5254 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
5255 NFT_MSG_NEWSET
, GFP_KERNEL
);
5256 nft_trans_destroy(trans
);
5258 case NFT_MSG_DELSET
:
5259 list_del_rcu(&nft_trans_set(trans
)->list
);
5260 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
5261 NFT_MSG_DELSET
, GFP_KERNEL
);
5263 case NFT_MSG_NEWSETELEM
:
5264 te
= (struct nft_trans_elem
*)trans
->data
;
5266 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
5267 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
5269 NFT_MSG_NEWSETELEM
, 0);
5270 nft_trans_destroy(trans
);
5272 case NFT_MSG_DELSETELEM
:
5273 te
= (struct nft_trans_elem
*)trans
->data
;
5275 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
5277 NFT_MSG_DELSETELEM
, 0);
5278 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
5279 atomic_dec(&te
->set
->nelems
);
5282 case NFT_MSG_NEWOBJ
:
5283 nft_clear(net
, nft_trans_obj(trans
));
5284 nf_tables_obj_notify(&trans
->ctx
, nft_trans_obj(trans
),
5286 nft_trans_destroy(trans
);
5288 case NFT_MSG_DELOBJ
:
5289 list_del_rcu(&nft_trans_obj(trans
)->list
);
5290 nf_tables_obj_notify(&trans
->ctx
, nft_trans_obj(trans
),
5298 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
5299 list_del(&trans
->list
);
5300 nf_tables_commit_release(trans
);
5303 nf_tables_gen_notify(net
, skb
, NFT_MSG_NEWGEN
);
5308 static void nf_tables_abort_release(struct nft_trans
*trans
)
5310 switch (trans
->msg_type
) {
5311 case NFT_MSG_NEWTABLE
:
5312 nf_tables_table_destroy(&trans
->ctx
);
5314 case NFT_MSG_NEWCHAIN
:
5315 nf_tables_chain_destroy(trans
->ctx
.chain
);
5317 case NFT_MSG_NEWRULE
:
5318 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
5320 case NFT_MSG_NEWSET
:
5321 nft_set_destroy(nft_trans_set(trans
));
5323 case NFT_MSG_NEWSETELEM
:
5324 nft_set_elem_destroy(nft_trans_elem_set(trans
),
5325 nft_trans_elem(trans
).priv
, true);
5327 case NFT_MSG_NEWOBJ
:
5328 nft_obj_destroy(nft_trans_obj(trans
));
5334 static int nf_tables_abort(struct net
*net
, struct sk_buff
*skb
)
5336 struct nft_trans
*trans
, *next
;
5337 struct nft_trans_elem
*te
;
5339 list_for_each_entry_safe_reverse(trans
, next
, &net
->nft
.commit_list
,
5341 switch (trans
->msg_type
) {
5342 case NFT_MSG_NEWTABLE
:
5343 if (nft_trans_table_update(trans
)) {
5344 if (nft_trans_table_enable(trans
)) {
5345 nf_tables_table_disable(net
,
5348 trans
->ctx
.table
->flags
|= NFT_TABLE_F_DORMANT
;
5350 nft_trans_destroy(trans
);
5352 list_del_rcu(&trans
->ctx
.table
->list
);
5355 case NFT_MSG_DELTABLE
:
5356 nft_clear(trans
->ctx
.net
, trans
->ctx
.table
);
5357 nft_trans_destroy(trans
);
5359 case NFT_MSG_NEWCHAIN
:
5360 if (nft_trans_chain_update(trans
)) {
5361 free_percpu(nft_trans_chain_stats(trans
));
5362 kfree(nft_trans_chain_name(trans
));
5363 nft_trans_destroy(trans
);
5365 trans
->ctx
.table
->use
--;
5366 list_del_rcu(&trans
->ctx
.chain
->list
);
5367 nf_tables_unregister_hooks(trans
->ctx
.net
,
5370 trans
->ctx
.afi
->nops
);
5373 case NFT_MSG_DELCHAIN
:
5374 trans
->ctx
.table
->use
++;
5375 nft_clear(trans
->ctx
.net
, trans
->ctx
.chain
);
5376 nft_trans_destroy(trans
);
5378 case NFT_MSG_NEWRULE
:
5379 trans
->ctx
.chain
->use
--;
5380 list_del_rcu(&nft_trans_rule(trans
)->list
);
5381 nft_rule_expr_deactivate(&trans
->ctx
, nft_trans_rule(trans
));
5383 case NFT_MSG_DELRULE
:
5384 trans
->ctx
.chain
->use
++;
5385 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
5386 nft_rule_expr_activate(&trans
->ctx
, nft_trans_rule(trans
));
5387 nft_trans_destroy(trans
);
5389 case NFT_MSG_NEWSET
:
5390 trans
->ctx
.table
->use
--;
5391 list_del_rcu(&nft_trans_set(trans
)->list
);
5393 case NFT_MSG_DELSET
:
5394 trans
->ctx
.table
->use
++;
5395 nft_clear(trans
->ctx
.net
, nft_trans_set(trans
));
5396 nft_trans_destroy(trans
);
5398 case NFT_MSG_NEWSETELEM
:
5399 te
= (struct nft_trans_elem
*)trans
->data
;
5401 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
5402 atomic_dec(&te
->set
->nelems
);
5404 case NFT_MSG_DELSETELEM
:
5405 te
= (struct nft_trans_elem
*)trans
->data
;
5407 nft_set_elem_activate(net
, te
->set
, &te
->elem
);
5408 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
5411 nft_trans_destroy(trans
);
5413 case NFT_MSG_NEWOBJ
:
5414 trans
->ctx
.table
->use
--;
5415 list_del_rcu(&nft_trans_obj(trans
)->list
);
5417 case NFT_MSG_DELOBJ
:
5418 trans
->ctx
.table
->use
++;
5419 nft_clear(trans
->ctx
.net
, nft_trans_obj(trans
));
5420 nft_trans_destroy(trans
);
5427 list_for_each_entry_safe_reverse(trans
, next
,
5428 &net
->nft
.commit_list
, list
) {
5429 list_del(&trans
->list
);
5430 nf_tables_abort_release(trans
);
5436 static bool nf_tables_valid_genid(struct net
*net
, u32 genid
)
5438 return net
->nft
.base_seq
== genid
;
5441 static const struct nfnetlink_subsystem nf_tables_subsys
= {
5442 .name
= "nf_tables",
5443 .subsys_id
= NFNL_SUBSYS_NFTABLES
,
5444 .cb_count
= NFT_MSG_MAX
,
5446 .commit
= nf_tables_commit
,
5447 .abort
= nf_tables_abort
,
5448 .valid_genid
= nf_tables_valid_genid
,
5451 int nft_chain_validate_dependency(const struct nft_chain
*chain
,
5452 enum nft_chain_type type
)
5454 const struct nft_base_chain
*basechain
;
5456 if (nft_is_base_chain(chain
)) {
5457 basechain
= nft_base_chain(chain
);
5458 if (basechain
->type
->type
!= type
)
5463 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency
);
5465 int nft_chain_validate_hooks(const struct nft_chain
*chain
,
5466 unsigned int hook_flags
)
5468 struct nft_base_chain
*basechain
;
5470 if (nft_is_base_chain(chain
)) {
5471 basechain
= nft_base_chain(chain
);
5473 if ((1 << basechain
->ops
[0].hooknum
) & hook_flags
)
5481 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks
);
5484 * Loop detection - walk through the ruleset beginning at the destination chain
5485 * of a new jump until either the source chain is reached (loop) or all
5486 * reachable chains have been traversed.
5488 * The loop check is performed whenever a new jump verdict is added to an
5489 * expression or verdict map or a verdict map is bound to a new chain.
5492 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
5493 const struct nft_chain
*chain
);
5495 static int nf_tables_loop_check_setelem(const struct nft_ctx
*ctx
,
5496 struct nft_set
*set
,
5497 const struct nft_set_iter
*iter
,
5498 struct nft_set_elem
*elem
)
5500 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
5501 const struct nft_data
*data
;
5503 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
5504 *nft_set_ext_flags(ext
) & NFT_SET_ELEM_INTERVAL_END
)
5507 data
= nft_set_ext_data(ext
);
5508 switch (data
->verdict
.code
) {
5511 return nf_tables_check_loops(ctx
, data
->verdict
.chain
);
5517 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
5518 const struct nft_chain
*chain
)
5520 const struct nft_rule
*rule
;
5521 const struct nft_expr
*expr
, *last
;
5522 struct nft_set
*set
;
5523 struct nft_set_binding
*binding
;
5524 struct nft_set_iter iter
;
5526 if (ctx
->chain
== chain
)
5529 list_for_each_entry(rule
, &chain
->rules
, list
) {
5530 nft_rule_for_each_expr(expr
, last
, rule
) {
5531 const struct nft_data
*data
= NULL
;
5534 if (!expr
->ops
->validate
)
5537 err
= expr
->ops
->validate(ctx
, expr
, &data
);
5544 switch (data
->verdict
.code
) {
5547 err
= nf_tables_check_loops(ctx
,
5548 data
->verdict
.chain
);
5557 list_for_each_entry(set
, &ctx
->table
->sets
, list
) {
5558 if (!nft_is_active_next(ctx
->net
, set
))
5560 if (!(set
->flags
& NFT_SET_MAP
) ||
5561 set
->dtype
!= NFT_DATA_VERDICT
)
5564 list_for_each_entry(binding
, &set
->bindings
, list
) {
5565 if (!(binding
->flags
& NFT_SET_MAP
) ||
5566 binding
->chain
!= chain
)
5569 iter
.genmask
= nft_genmask_next(ctx
->net
);
5573 iter
.fn
= nf_tables_loop_check_setelem
;
5575 set
->ops
->walk(ctx
, set
, &iter
);
5585 * nft_parse_u32_check - fetch u32 attribute and check for maximum value
5587 * @attr: netlink attribute to fetch value from
5588 * @max: maximum value to be stored in dest
5589 * @dest: pointer to the variable
5591 * Parse, check and store a given u32 netlink attribute into variable.
5592 * This function returns -ERANGE if the value goes over maximum value.
5593 * Otherwise a 0 is returned and the attribute value is stored in the
5594 * destination variable.
5596 int nft_parse_u32_check(const struct nlattr
*attr
, int max
, u32
*dest
)
5600 val
= ntohl(nla_get_be32(attr
));
5607 EXPORT_SYMBOL_GPL(nft_parse_u32_check
);
5610 * nft_parse_register - parse a register value from a netlink attribute
5612 * @attr: netlink attribute
5614 * Parse and translate a register value from a netlink attribute.
5615 * Registers used to be 128 bit wide, these register numbers will be
5616 * mapped to the corresponding 32 bit register numbers.
5618 unsigned int nft_parse_register(const struct nlattr
*attr
)
5622 reg
= ntohl(nla_get_be32(attr
));
5624 case NFT_REG_VERDICT
...NFT_REG_4
:
5625 return reg
* NFT_REG_SIZE
/ NFT_REG32_SIZE
;
5627 return reg
+ NFT_REG_SIZE
/ NFT_REG32_SIZE
- NFT_REG32_00
;
5630 EXPORT_SYMBOL_GPL(nft_parse_register
);
5633 * nft_dump_register - dump a register value to a netlink attribute
5635 * @skb: socket buffer
5636 * @attr: attribute number
5637 * @reg: register number
5639 * Construct a netlink attribute containing the register number. For
5640 * compatibility reasons, register numbers being a multiple of 4 are
5641 * translated to the corresponding 128 bit register numbers.
5643 int nft_dump_register(struct sk_buff
*skb
, unsigned int attr
, unsigned int reg
)
5645 if (reg
% (NFT_REG_SIZE
/ NFT_REG32_SIZE
) == 0)
5646 reg
= reg
/ (NFT_REG_SIZE
/ NFT_REG32_SIZE
);
5648 reg
= reg
- NFT_REG_SIZE
/ NFT_REG32_SIZE
+ NFT_REG32_00
;
5650 return nla_put_be32(skb
, attr
, htonl(reg
));
5652 EXPORT_SYMBOL_GPL(nft_dump_register
);
5655 * nft_validate_register_load - validate a load from a register
5657 * @reg: the register number
5658 * @len: the length of the data
5660 * Validate that the input register is one of the general purpose
5661 * registers and that the length of the load is within the bounds.
5663 int nft_validate_register_load(enum nft_registers reg
, unsigned int len
)
5665 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
5669 if (reg
* NFT_REG32_SIZE
+ len
> FIELD_SIZEOF(struct nft_regs
, data
))
5674 EXPORT_SYMBOL_GPL(nft_validate_register_load
);
5677 * nft_validate_register_store - validate an expressions' register store
5679 * @ctx: context of the expression performing the load
5680 * @reg: the destination register number
5681 * @data: the data to load
5682 * @type: the data type
5683 * @len: the length of the data
5685 * Validate that a data load uses the appropriate data type for
5686 * the destination register and the length is within the bounds.
5687 * A value of NULL for the data means that its runtime gathered
5690 int nft_validate_register_store(const struct nft_ctx
*ctx
,
5691 enum nft_registers reg
,
5692 const struct nft_data
*data
,
5693 enum nft_data_types type
, unsigned int len
)
5698 case NFT_REG_VERDICT
:
5699 if (type
!= NFT_DATA_VERDICT
)
5703 (data
->verdict
.code
== NFT_GOTO
||
5704 data
->verdict
.code
== NFT_JUMP
)) {
5705 err
= nf_tables_check_loops(ctx
, data
->verdict
.chain
);
5709 if (ctx
->chain
->level
+ 1 >
5710 data
->verdict
.chain
->level
) {
5711 if (ctx
->chain
->level
+ 1 == NFT_JUMP_STACK_SIZE
)
5713 data
->verdict
.chain
->level
= ctx
->chain
->level
+ 1;
5719 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
5723 if (reg
* NFT_REG32_SIZE
+ len
>
5724 FIELD_SIZEOF(struct nft_regs
, data
))
5727 if (data
!= NULL
&& type
!= NFT_DATA_VALUE
)
5732 EXPORT_SYMBOL_GPL(nft_validate_register_store
);
5734 static const struct nla_policy nft_verdict_policy
[NFTA_VERDICT_MAX
+ 1] = {
5735 [NFTA_VERDICT_CODE
] = { .type
= NLA_U32
},
5736 [NFTA_VERDICT_CHAIN
] = { .type
= NLA_STRING
,
5737 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
5740 static int nft_verdict_init(const struct nft_ctx
*ctx
, struct nft_data
*data
,
5741 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
5743 u8 genmask
= nft_genmask_next(ctx
->net
);
5744 struct nlattr
*tb
[NFTA_VERDICT_MAX
+ 1];
5745 struct nft_chain
*chain
;
5748 err
= nla_parse_nested(tb
, NFTA_VERDICT_MAX
, nla
, nft_verdict_policy
,
5753 if (!tb
[NFTA_VERDICT_CODE
])
5755 data
->verdict
.code
= ntohl(nla_get_be32(tb
[NFTA_VERDICT_CODE
]));
5757 switch (data
->verdict
.code
) {
5759 switch (data
->verdict
.code
& NF_VERDICT_MASK
) {
5774 if (!tb
[NFTA_VERDICT_CHAIN
])
5776 chain
= nf_tables_chain_lookup(ctx
->table
,
5777 tb
[NFTA_VERDICT_CHAIN
], genmask
);
5779 return PTR_ERR(chain
);
5780 if (nft_is_base_chain(chain
))
5784 data
->verdict
.chain
= chain
;
5788 desc
->len
= sizeof(data
->verdict
);
5789 desc
->type
= NFT_DATA_VERDICT
;
5793 static void nft_verdict_uninit(const struct nft_data
*data
)
5795 switch (data
->verdict
.code
) {
5798 data
->verdict
.chain
->use
--;
5803 int nft_verdict_dump(struct sk_buff
*skb
, int type
, const struct nft_verdict
*v
)
5805 struct nlattr
*nest
;
5807 nest
= nla_nest_start(skb
, type
);
5809 goto nla_put_failure
;
5811 if (nla_put_be32(skb
, NFTA_VERDICT_CODE
, htonl(v
->code
)))
5812 goto nla_put_failure
;
5817 if (nla_put_string(skb
, NFTA_VERDICT_CHAIN
,
5819 goto nla_put_failure
;
5821 nla_nest_end(skb
, nest
);
5828 static int nft_value_init(const struct nft_ctx
*ctx
,
5829 struct nft_data
*data
, unsigned int size
,
5830 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
5840 nla_memcpy(data
->data
, nla
, len
);
5841 desc
->type
= NFT_DATA_VALUE
;
5846 static int nft_value_dump(struct sk_buff
*skb
, const struct nft_data
*data
,
5849 return nla_put(skb
, NFTA_DATA_VALUE
, len
, data
->data
);
5852 static const struct nla_policy nft_data_policy
[NFTA_DATA_MAX
+ 1] = {
5853 [NFTA_DATA_VALUE
] = { .type
= NLA_BINARY
},
5854 [NFTA_DATA_VERDICT
] = { .type
= NLA_NESTED
},
5858 * nft_data_init - parse nf_tables data netlink attributes
5860 * @ctx: context of the expression using the data
5861 * @data: destination struct nft_data
5862 * @size: maximum data length
5863 * @desc: data description
5864 * @nla: netlink attribute containing data
5866 * Parse the netlink data attributes and initialize a struct nft_data.
5867 * The type and length of data are returned in the data description.
5869 * The caller can indicate that it only wants to accept data of type
5870 * NFT_DATA_VALUE by passing NULL for the ctx argument.
5872 int nft_data_init(const struct nft_ctx
*ctx
,
5873 struct nft_data
*data
, unsigned int size
,
5874 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
5876 struct nlattr
*tb
[NFTA_DATA_MAX
+ 1];
5879 err
= nla_parse_nested(tb
, NFTA_DATA_MAX
, nla
, nft_data_policy
, NULL
);
5883 if (tb
[NFTA_DATA_VALUE
])
5884 return nft_value_init(ctx
, data
, size
, desc
,
5885 tb
[NFTA_DATA_VALUE
]);
5886 if (tb
[NFTA_DATA_VERDICT
] && ctx
!= NULL
)
5887 return nft_verdict_init(ctx
, data
, desc
, tb
[NFTA_DATA_VERDICT
]);
5890 EXPORT_SYMBOL_GPL(nft_data_init
);
5893 * nft_data_release - release a nft_data item
5895 * @data: struct nft_data to release
5896 * @type: type of data
5898 * Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
5899 * all others need to be released by calling this function.
5901 void nft_data_release(const struct nft_data
*data
, enum nft_data_types type
)
5903 if (type
< NFT_DATA_VERDICT
)
5906 case NFT_DATA_VERDICT
:
5907 return nft_verdict_uninit(data
);
5912 EXPORT_SYMBOL_GPL(nft_data_release
);
5914 int nft_data_dump(struct sk_buff
*skb
, int attr
, const struct nft_data
*data
,
5915 enum nft_data_types type
, unsigned int len
)
5917 struct nlattr
*nest
;
5920 nest
= nla_nest_start(skb
, attr
);
5925 case NFT_DATA_VALUE
:
5926 err
= nft_value_dump(skb
, data
, len
);
5928 case NFT_DATA_VERDICT
:
5929 err
= nft_verdict_dump(skb
, NFTA_DATA_VERDICT
, &data
->verdict
);
5936 nla_nest_end(skb
, nest
);
5939 EXPORT_SYMBOL_GPL(nft_data_dump
);
5941 static int __net_init
nf_tables_init_net(struct net
*net
)
5943 INIT_LIST_HEAD(&net
->nft
.af_info
);
5944 INIT_LIST_HEAD(&net
->nft
.commit_list
);
5945 net
->nft
.base_seq
= 1;
5949 static void __net_exit
nf_tables_exit_net(struct net
*net
)
5951 WARN_ON_ONCE(!list_empty(&net
->nft
.af_info
));
5952 WARN_ON_ONCE(!list_empty(&net
->nft
.commit_list
));
5955 int __nft_release_basechain(struct nft_ctx
*ctx
)
5957 struct nft_rule
*rule
, *nr
;
5959 if (WARN_ON(!nft_is_base_chain(ctx
->chain
)))
5962 nf_tables_unregister_hooks(ctx
->net
, ctx
->chain
->table
, ctx
->chain
,
5964 list_for_each_entry_safe(rule
, nr
, &ctx
->chain
->rules
, list
) {
5965 list_del(&rule
->list
);
5967 nf_tables_rule_release(ctx
, rule
);
5969 list_del(&ctx
->chain
->list
);
5971 nf_tables_chain_destroy(ctx
->chain
);
5975 EXPORT_SYMBOL_GPL(__nft_release_basechain
);
5977 /* Called by nft_unregister_afinfo() from __net_exit path, nfnl_lock is held. */
5978 static void __nft_release_afinfo(struct net
*net
, struct nft_af_info
*afi
)
5980 struct nft_table
*table
, *nt
;
5981 struct nft_chain
*chain
, *nc
;
5982 struct nft_object
*obj
, *ne
;
5983 struct nft_rule
*rule
, *nr
;
5984 struct nft_set
*set
, *ns
;
5985 struct nft_ctx ctx
= {
5990 list_for_each_entry_safe(table
, nt
, &afi
->tables
, list
) {
5991 list_for_each_entry(chain
, &table
->chains
, list
)
5992 nf_tables_unregister_hooks(net
, table
, chain
,
5994 /* No packets are walking on these chains anymore. */
5996 list_for_each_entry(chain
, &table
->chains
, list
) {
5998 list_for_each_entry_safe(rule
, nr
, &chain
->rules
, list
) {
5999 list_del(&rule
->list
);
6001 nf_tables_rule_release(&ctx
, rule
);
6004 list_for_each_entry_safe(set
, ns
, &table
->sets
, list
) {
6005 list_del(&set
->list
);
6007 nft_set_destroy(set
);
6009 list_for_each_entry_safe(obj
, ne
, &table
->objects
, list
) {
6010 list_del(&obj
->list
);
6012 nft_obj_destroy(obj
);
6014 list_for_each_entry_safe(chain
, nc
, &table
->chains
, list
) {
6015 list_del(&chain
->list
);
6017 nf_tables_chain_destroy(chain
);
6019 list_del(&table
->list
);
6020 nf_tables_table_destroy(&ctx
);
6024 static struct pernet_operations nf_tables_net_ops
= {
6025 .init
= nf_tables_init_net
,
6026 .exit
= nf_tables_exit_net
,
6029 static int __init
nf_tables_module_init(void)
6033 info
= kmalloc(sizeof(struct nft_expr_info
) * NFT_RULE_MAXEXPRS
,
6040 err
= nf_tables_core_module_init();
6044 err
= nfnetlink_subsys_register(&nf_tables_subsys
);
6048 pr_info("nf_tables: (c) 2007-2009 Patrick McHardy <kaber@trash.net>\n");
6049 return register_pernet_subsys(&nf_tables_net_ops
);
6051 nf_tables_core_module_exit();
6058 static void __exit
nf_tables_module_exit(void)
6060 unregister_pernet_subsys(&nf_tables_net_ops
);
6061 nfnetlink_subsys_unregister(&nf_tables_subsys
);
6063 nf_tables_core_module_exit();
6067 module_init(nf_tables_module_init
);
6068 module_exit(nf_tables_module_exit
);
6070 MODULE_LICENSE("GPL");
6071 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
6072 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES
);