1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net>
5 * Development of this code funded by Astaro AG (http://www.astaro.com/)
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/list.h>
11 #include <linux/skbuff.h>
12 #include <linux/netlink.h>
13 #include <linux/vmalloc.h>
14 #include <linux/rhashtable.h>
15 #include <linux/audit.h>
16 #include <linux/netfilter.h>
17 #include <linux/netfilter/nfnetlink.h>
18 #include <linux/netfilter/nf_tables.h>
19 #include <net/netfilter/nf_flow_table.h>
20 #include <net/netfilter/nf_tables_core.h>
21 #include <net/netfilter/nf_tables.h>
22 #include <net/netfilter/nf_tables_offload.h>
23 #include <net/net_namespace.h>
26 #define NFT_MODULE_AUTOLOAD_LIMIT (MODULE_NAME_LEN - sizeof("nft-expr-255-"))
28 static LIST_HEAD(nf_tables_expressions
);
29 static LIST_HEAD(nf_tables_objects
);
30 static LIST_HEAD(nf_tables_flowtables
);
31 static LIST_HEAD(nf_tables_destroy_list
);
32 static DEFINE_SPINLOCK(nf_tables_destroy_list_lock
);
33 static u64 table_handle
;
36 NFT_VALIDATE_SKIP
= 0,
41 static struct rhltable nft_objname_ht
;
43 static u32
nft_chain_hash(const void *data
, u32 len
, u32 seed
);
44 static u32
nft_chain_hash_obj(const void *data
, u32 len
, u32 seed
);
45 static int nft_chain_hash_cmp(struct rhashtable_compare_arg
*, const void *);
47 static u32
nft_objname_hash(const void *data
, u32 len
, u32 seed
);
48 static u32
nft_objname_hash_obj(const void *data
, u32 len
, u32 seed
);
49 static int nft_objname_hash_cmp(struct rhashtable_compare_arg
*, const void *);
51 static const struct rhashtable_params nft_chain_ht_params
= {
52 .head_offset
= offsetof(struct nft_chain
, rhlhead
),
53 .key_offset
= offsetof(struct nft_chain
, name
),
54 .hashfn
= nft_chain_hash
,
55 .obj_hashfn
= nft_chain_hash_obj
,
56 .obj_cmpfn
= nft_chain_hash_cmp
,
57 .automatic_shrinking
= true,
60 static const struct rhashtable_params nft_objname_ht_params
= {
61 .head_offset
= offsetof(struct nft_object
, rhlhead
),
62 .key_offset
= offsetof(struct nft_object
, key
),
63 .hashfn
= nft_objname_hash
,
64 .obj_hashfn
= nft_objname_hash_obj
,
65 .obj_cmpfn
= nft_objname_hash_cmp
,
66 .automatic_shrinking
= true,
69 struct nft_audit_data
{
70 struct nft_table
*table
;
73 struct list_head list
;
76 static const u8 nft2audit_op
[NFT_MSG_MAX
] = { // enum nf_tables_msg_types
77 [NFT_MSG_NEWTABLE
] = AUDIT_NFT_OP_TABLE_REGISTER
,
78 [NFT_MSG_GETTABLE
] = AUDIT_NFT_OP_INVALID
,
79 [NFT_MSG_DELTABLE
] = AUDIT_NFT_OP_TABLE_UNREGISTER
,
80 [NFT_MSG_NEWCHAIN
] = AUDIT_NFT_OP_CHAIN_REGISTER
,
81 [NFT_MSG_GETCHAIN
] = AUDIT_NFT_OP_INVALID
,
82 [NFT_MSG_DELCHAIN
] = AUDIT_NFT_OP_CHAIN_UNREGISTER
,
83 [NFT_MSG_NEWRULE
] = AUDIT_NFT_OP_RULE_REGISTER
,
84 [NFT_MSG_GETRULE
] = AUDIT_NFT_OP_INVALID
,
85 [NFT_MSG_DELRULE
] = AUDIT_NFT_OP_RULE_UNREGISTER
,
86 [NFT_MSG_NEWSET
] = AUDIT_NFT_OP_SET_REGISTER
,
87 [NFT_MSG_GETSET
] = AUDIT_NFT_OP_INVALID
,
88 [NFT_MSG_DELSET
] = AUDIT_NFT_OP_SET_UNREGISTER
,
89 [NFT_MSG_NEWSETELEM
] = AUDIT_NFT_OP_SETELEM_REGISTER
,
90 [NFT_MSG_GETSETELEM
] = AUDIT_NFT_OP_INVALID
,
91 [NFT_MSG_DELSETELEM
] = AUDIT_NFT_OP_SETELEM_UNREGISTER
,
92 [NFT_MSG_NEWGEN
] = AUDIT_NFT_OP_GEN_REGISTER
,
93 [NFT_MSG_GETGEN
] = AUDIT_NFT_OP_INVALID
,
94 [NFT_MSG_TRACE
] = AUDIT_NFT_OP_INVALID
,
95 [NFT_MSG_NEWOBJ
] = AUDIT_NFT_OP_OBJ_REGISTER
,
96 [NFT_MSG_GETOBJ
] = AUDIT_NFT_OP_INVALID
,
97 [NFT_MSG_DELOBJ
] = AUDIT_NFT_OP_OBJ_UNREGISTER
,
98 [NFT_MSG_GETOBJ_RESET
] = AUDIT_NFT_OP_OBJ_RESET
,
99 [NFT_MSG_NEWFLOWTABLE
] = AUDIT_NFT_OP_FLOWTABLE_REGISTER
,
100 [NFT_MSG_GETFLOWTABLE
] = AUDIT_NFT_OP_INVALID
,
101 [NFT_MSG_DELFLOWTABLE
] = AUDIT_NFT_OP_FLOWTABLE_UNREGISTER
,
104 static void nft_validate_state_update(struct net
*net
, u8 new_validate_state
)
106 switch (net
->nft
.validate_state
) {
107 case NFT_VALIDATE_SKIP
:
108 WARN_ON_ONCE(new_validate_state
== NFT_VALIDATE_DO
);
110 case NFT_VALIDATE_NEED
:
112 case NFT_VALIDATE_DO
:
113 if (new_validate_state
== NFT_VALIDATE_NEED
)
117 net
->nft
.validate_state
= new_validate_state
;
119 static void nf_tables_trans_destroy_work(struct work_struct
*w
);
120 static DECLARE_WORK(trans_destroy_work
, nf_tables_trans_destroy_work
);
122 static void nft_ctx_init(struct nft_ctx
*ctx
,
124 const struct sk_buff
*skb
,
125 const struct nlmsghdr
*nlh
,
127 struct nft_table
*table
,
128 struct nft_chain
*chain
,
129 const struct nlattr
* const *nla
)
132 ctx
->family
= family
;
137 ctx
->portid
= NETLINK_CB(skb
).portid
;
138 ctx
->report
= nlmsg_report(nlh
);
139 ctx
->flags
= nlh
->nlmsg_flags
;
140 ctx
->seq
= nlh
->nlmsg_seq
;
143 static struct nft_trans
*nft_trans_alloc_gfp(const struct nft_ctx
*ctx
,
144 int msg_type
, u32 size
, gfp_t gfp
)
146 struct nft_trans
*trans
;
148 trans
= kzalloc(sizeof(struct nft_trans
) + size
, gfp
);
152 trans
->msg_type
= msg_type
;
158 static struct nft_trans
*nft_trans_alloc(const struct nft_ctx
*ctx
,
159 int msg_type
, u32 size
)
161 return nft_trans_alloc_gfp(ctx
, msg_type
, size
, GFP_KERNEL
);
164 static void nft_trans_destroy(struct nft_trans
*trans
)
166 list_del(&trans
->list
);
170 static void nft_set_trans_bind(const struct nft_ctx
*ctx
, struct nft_set
*set
)
172 struct net
*net
= ctx
->net
;
173 struct nft_trans
*trans
;
175 if (!nft_set_is_anonymous(set
))
178 list_for_each_entry_reverse(trans
, &net
->nft
.commit_list
, list
) {
179 switch (trans
->msg_type
) {
181 if (nft_trans_set(trans
) == set
)
182 nft_trans_set_bound(trans
) = true;
184 case NFT_MSG_NEWSETELEM
:
185 if (nft_trans_elem_set(trans
) == set
)
186 nft_trans_elem_set_bound(trans
) = true;
192 static int nft_netdev_register_hooks(struct net
*net
,
193 struct list_head
*hook_list
)
195 struct nft_hook
*hook
;
199 list_for_each_entry(hook
, hook_list
, list
) {
200 err
= nf_register_net_hook(net
, &hook
->ops
);
209 list_for_each_entry(hook
, hook_list
, list
) {
213 nf_unregister_net_hook(net
, &hook
->ops
);
218 static void nft_netdev_unregister_hooks(struct net
*net
,
219 struct list_head
*hook_list
)
221 struct nft_hook
*hook
;
223 list_for_each_entry(hook
, hook_list
, list
)
224 nf_unregister_net_hook(net
, &hook
->ops
);
227 static int nf_tables_register_hook(struct net
*net
,
228 const struct nft_table
*table
,
229 struct nft_chain
*chain
)
231 struct nft_base_chain
*basechain
;
232 const struct nf_hook_ops
*ops
;
234 if (table
->flags
& NFT_TABLE_F_DORMANT
||
235 !nft_is_base_chain(chain
))
238 basechain
= nft_base_chain(chain
);
239 ops
= &basechain
->ops
;
241 if (basechain
->type
->ops_register
)
242 return basechain
->type
->ops_register(net
, ops
);
244 if (nft_base_chain_netdev(table
->family
, basechain
->ops
.hooknum
))
245 return nft_netdev_register_hooks(net
, &basechain
->hook_list
);
247 return nf_register_net_hook(net
, &basechain
->ops
);
250 static void nf_tables_unregister_hook(struct net
*net
,
251 const struct nft_table
*table
,
252 struct nft_chain
*chain
)
254 struct nft_base_chain
*basechain
;
255 const struct nf_hook_ops
*ops
;
257 if (table
->flags
& NFT_TABLE_F_DORMANT
||
258 !nft_is_base_chain(chain
))
260 basechain
= nft_base_chain(chain
);
261 ops
= &basechain
->ops
;
263 if (basechain
->type
->ops_unregister
)
264 return basechain
->type
->ops_unregister(net
, ops
);
266 if (nft_base_chain_netdev(table
->family
, basechain
->ops
.hooknum
))
267 nft_netdev_unregister_hooks(net
, &basechain
->hook_list
);
269 nf_unregister_net_hook(net
, &basechain
->ops
);
272 static int nft_trans_table_add(struct nft_ctx
*ctx
, int msg_type
)
274 struct nft_trans
*trans
;
276 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_table
));
280 if (msg_type
== NFT_MSG_NEWTABLE
)
281 nft_activate_next(ctx
->net
, ctx
->table
);
283 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
287 static int nft_deltable(struct nft_ctx
*ctx
)
291 err
= nft_trans_table_add(ctx
, NFT_MSG_DELTABLE
);
295 nft_deactivate_next(ctx
->net
, ctx
->table
);
299 static struct nft_trans
*nft_trans_chain_add(struct nft_ctx
*ctx
, int msg_type
)
301 struct nft_trans
*trans
;
303 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_chain
));
305 return ERR_PTR(-ENOMEM
);
307 if (msg_type
== NFT_MSG_NEWCHAIN
) {
308 nft_activate_next(ctx
->net
, ctx
->chain
);
310 if (ctx
->nla
[NFTA_CHAIN_ID
]) {
311 nft_trans_chain_id(trans
) =
312 ntohl(nla_get_be32(ctx
->nla
[NFTA_CHAIN_ID
]));
316 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
320 static int nft_delchain(struct nft_ctx
*ctx
)
322 struct nft_trans
*trans
;
324 trans
= nft_trans_chain_add(ctx
, NFT_MSG_DELCHAIN
);
326 return PTR_ERR(trans
);
329 nft_deactivate_next(ctx
->net
, ctx
->chain
);
334 static void nft_rule_expr_activate(const struct nft_ctx
*ctx
,
335 struct nft_rule
*rule
)
337 struct nft_expr
*expr
;
339 expr
= nft_expr_first(rule
);
340 while (nft_expr_more(rule
, expr
)) {
341 if (expr
->ops
->activate
)
342 expr
->ops
->activate(ctx
, expr
);
344 expr
= nft_expr_next(expr
);
348 static void nft_rule_expr_deactivate(const struct nft_ctx
*ctx
,
349 struct nft_rule
*rule
,
350 enum nft_trans_phase phase
)
352 struct nft_expr
*expr
;
354 expr
= nft_expr_first(rule
);
355 while (nft_expr_more(rule
, expr
)) {
356 if (expr
->ops
->deactivate
)
357 expr
->ops
->deactivate(ctx
, expr
, phase
);
359 expr
= nft_expr_next(expr
);
364 nf_tables_delrule_deactivate(struct nft_ctx
*ctx
, struct nft_rule
*rule
)
366 /* You cannot delete the same rule twice */
367 if (nft_is_active_next(ctx
->net
, rule
)) {
368 nft_deactivate_next(ctx
->net
, rule
);
375 static struct nft_trans
*nft_trans_rule_add(struct nft_ctx
*ctx
, int msg_type
,
376 struct nft_rule
*rule
)
378 struct nft_trans
*trans
;
380 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_rule
));
384 if (msg_type
== NFT_MSG_NEWRULE
&& ctx
->nla
[NFTA_RULE_ID
] != NULL
) {
385 nft_trans_rule_id(trans
) =
386 ntohl(nla_get_be32(ctx
->nla
[NFTA_RULE_ID
]));
388 nft_trans_rule(trans
) = rule
;
389 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
394 static int nft_delrule(struct nft_ctx
*ctx
, struct nft_rule
*rule
)
396 struct nft_flow_rule
*flow
;
397 struct nft_trans
*trans
;
400 trans
= nft_trans_rule_add(ctx
, NFT_MSG_DELRULE
, rule
);
404 if (ctx
->chain
->flags
& NFT_CHAIN_HW_OFFLOAD
) {
405 flow
= nft_flow_rule_create(ctx
->net
, rule
);
407 nft_trans_destroy(trans
);
408 return PTR_ERR(flow
);
411 nft_trans_flow_rule(trans
) = flow
;
414 err
= nf_tables_delrule_deactivate(ctx
, rule
);
416 nft_trans_destroy(trans
);
419 nft_rule_expr_deactivate(ctx
, rule
, NFT_TRANS_PREPARE
);
424 static int nft_delrule_by_chain(struct nft_ctx
*ctx
)
426 struct nft_rule
*rule
;
429 list_for_each_entry(rule
, &ctx
->chain
->rules
, list
) {
430 if (!nft_is_active_next(ctx
->net
, rule
))
433 err
= nft_delrule(ctx
, rule
);
440 static int nft_trans_set_add(const struct nft_ctx
*ctx
, int msg_type
,
443 struct nft_trans
*trans
;
445 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_set
));
449 if (msg_type
== NFT_MSG_NEWSET
&& ctx
->nla
[NFTA_SET_ID
] != NULL
) {
450 nft_trans_set_id(trans
) =
451 ntohl(nla_get_be32(ctx
->nla
[NFTA_SET_ID
]));
452 nft_activate_next(ctx
->net
, set
);
454 nft_trans_set(trans
) = set
;
455 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
460 static int nft_delset(const struct nft_ctx
*ctx
, struct nft_set
*set
)
464 err
= nft_trans_set_add(ctx
, NFT_MSG_DELSET
, set
);
468 nft_deactivate_next(ctx
->net
, set
);
474 static int nft_trans_obj_add(struct nft_ctx
*ctx
, int msg_type
,
475 struct nft_object
*obj
)
477 struct nft_trans
*trans
;
479 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_obj
));
483 if (msg_type
== NFT_MSG_NEWOBJ
)
484 nft_activate_next(ctx
->net
, obj
);
486 nft_trans_obj(trans
) = obj
;
487 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
492 static int nft_delobj(struct nft_ctx
*ctx
, struct nft_object
*obj
)
496 err
= nft_trans_obj_add(ctx
, NFT_MSG_DELOBJ
, obj
);
500 nft_deactivate_next(ctx
->net
, obj
);
506 static int nft_trans_flowtable_add(struct nft_ctx
*ctx
, int msg_type
,
507 struct nft_flowtable
*flowtable
)
509 struct nft_trans
*trans
;
511 trans
= nft_trans_alloc(ctx
, msg_type
,
512 sizeof(struct nft_trans_flowtable
));
516 if (msg_type
== NFT_MSG_NEWFLOWTABLE
)
517 nft_activate_next(ctx
->net
, flowtable
);
519 nft_trans_flowtable(trans
) = flowtable
;
520 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
525 static int nft_delflowtable(struct nft_ctx
*ctx
,
526 struct nft_flowtable
*flowtable
)
530 err
= nft_trans_flowtable_add(ctx
, NFT_MSG_DELFLOWTABLE
, flowtable
);
534 nft_deactivate_next(ctx
->net
, flowtable
);
544 static struct nft_table
*nft_table_lookup(const struct net
*net
,
545 const struct nlattr
*nla
,
546 u8 family
, u8 genmask
, u32 nlpid
)
548 struct nft_table
*table
;
551 return ERR_PTR(-EINVAL
);
553 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
,
554 lockdep_is_held(&net
->nft
.commit_mutex
)) {
555 if (!nla_strcmp(nla
, table
->name
) &&
556 table
->family
== family
&&
557 nft_active_genmask(table
, genmask
)) {
558 if (nft_table_has_owner(table
) &&
559 table
->nlpid
!= nlpid
)
560 return ERR_PTR(-EPERM
);
566 return ERR_PTR(-ENOENT
);
569 static struct nft_table
*nft_table_lookup_byhandle(const struct net
*net
,
570 const struct nlattr
*nla
,
573 struct nft_table
*table
;
575 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
576 if (be64_to_cpu(nla_get_be64(nla
)) == table
->handle
&&
577 nft_active_genmask(table
, genmask
))
581 return ERR_PTR(-ENOENT
);
584 static inline u64
nf_tables_alloc_handle(struct nft_table
*table
)
586 return ++table
->hgenerator
;
589 static const struct nft_chain_type
*chain_type
[NFPROTO_NUMPROTO
][NFT_CHAIN_T_MAX
];
591 static const struct nft_chain_type
*
592 __nft_chain_type_get(u8 family
, enum nft_chain_types type
)
594 if (family
>= NFPROTO_NUMPROTO
||
595 type
>= NFT_CHAIN_T_MAX
)
598 return chain_type
[family
][type
];
601 static const struct nft_chain_type
*
602 __nf_tables_chain_type_lookup(const struct nlattr
*nla
, u8 family
)
604 const struct nft_chain_type
*type
;
607 for (i
= 0; i
< NFT_CHAIN_T_MAX
; i
++) {
608 type
= __nft_chain_type_get(family
, i
);
611 if (!nla_strcmp(nla
, type
->name
))
617 struct nft_module_request
{
618 struct list_head list
;
619 char module
[MODULE_NAME_LEN
];
623 #ifdef CONFIG_MODULES
624 __printf(2, 3) int nft_request_module(struct net
*net
, const char *fmt
,
627 char module_name
[MODULE_NAME_LEN
];
628 struct nft_module_request
*req
;
633 ret
= vsnprintf(module_name
, MODULE_NAME_LEN
, fmt
, args
);
635 if (ret
>= MODULE_NAME_LEN
)
638 list_for_each_entry(req
, &net
->nft
.module_list
, list
) {
639 if (!strcmp(req
->module
, module_name
)) {
643 /* A request to load this module already exists. */
648 req
= kmalloc(sizeof(*req
), GFP_KERNEL
);
653 strlcpy(req
->module
, module_name
, MODULE_NAME_LEN
);
654 list_add_tail(&req
->list
, &net
->nft
.module_list
);
658 EXPORT_SYMBOL_GPL(nft_request_module
);
661 static void lockdep_nfnl_nft_mutex_not_held(void)
663 #ifdef CONFIG_PROVE_LOCKING
665 WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES
));
669 static const struct nft_chain_type
*
670 nf_tables_chain_type_lookup(struct net
*net
, const struct nlattr
*nla
,
671 u8 family
, bool autoload
)
673 const struct nft_chain_type
*type
;
675 type
= __nf_tables_chain_type_lookup(nla
, family
);
679 lockdep_nfnl_nft_mutex_not_held();
680 #ifdef CONFIG_MODULES
682 if (nft_request_module(net
, "nft-chain-%u-%.*s", family
,
684 (const char *)nla_data(nla
)) == -EAGAIN
)
685 return ERR_PTR(-EAGAIN
);
688 return ERR_PTR(-ENOENT
);
691 static const struct nla_policy nft_table_policy
[NFTA_TABLE_MAX
+ 1] = {
692 [NFTA_TABLE_NAME
] = { .type
= NLA_STRING
,
693 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
694 [NFTA_TABLE_FLAGS
] = { .type
= NLA_U32
},
695 [NFTA_TABLE_HANDLE
] = { .type
= NLA_U64
},
696 [NFTA_TABLE_USERDATA
] = { .type
= NLA_BINARY
,
697 .len
= NFT_USERDATA_MAXLEN
}
700 static int nf_tables_fill_table_info(struct sk_buff
*skb
, struct net
*net
,
701 u32 portid
, u32 seq
, int event
, u32 flags
,
702 int family
, const struct nft_table
*table
)
704 struct nlmsghdr
*nlh
;
705 struct nfgenmsg
*nfmsg
;
707 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
708 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
710 goto nla_put_failure
;
712 nfmsg
= nlmsg_data(nlh
);
713 nfmsg
->nfgen_family
= family
;
714 nfmsg
->version
= NFNETLINK_V0
;
715 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
717 if (nla_put_string(skb
, NFTA_TABLE_NAME
, table
->name
) ||
718 nla_put_be32(skb
, NFTA_TABLE_FLAGS
, htonl(table
->flags
)) ||
719 nla_put_be32(skb
, NFTA_TABLE_USE
, htonl(table
->use
)) ||
720 nla_put_be64(skb
, NFTA_TABLE_HANDLE
, cpu_to_be64(table
->handle
),
722 goto nla_put_failure
;
723 if (nft_table_has_owner(table
) &&
724 nla_put_be32(skb
, NFTA_TABLE_OWNER
, htonl(table
->nlpid
)))
725 goto nla_put_failure
;
728 if (nla_put(skb
, NFTA_TABLE_USERDATA
, table
->udlen
, table
->udata
))
729 goto nla_put_failure
;
736 nlmsg_trim(skb
, nlh
);
740 struct nftnl_skb_parms
{
743 #define NFT_CB(skb) (*(struct nftnl_skb_parms*)&((skb)->cb))
745 static void nft_notify_enqueue(struct sk_buff
*skb
, bool report
,
746 struct list_head
*notify_list
)
748 NFT_CB(skb
).report
= report
;
749 list_add_tail(&skb
->list
, notify_list
);
752 static void nf_tables_table_notify(const struct nft_ctx
*ctx
, int event
)
758 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
761 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
765 err
= nf_tables_fill_table_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
766 event
, 0, ctx
->family
, ctx
->table
);
772 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
775 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
778 static int nf_tables_dump_tables(struct sk_buff
*skb
,
779 struct netlink_callback
*cb
)
781 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
782 const struct nft_table
*table
;
783 unsigned int idx
= 0, s_idx
= cb
->args
[0];
784 struct net
*net
= sock_net(skb
->sk
);
785 int family
= nfmsg
->nfgen_family
;
788 cb
->seq
= net
->nft
.base_seq
;
790 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
791 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
797 memset(&cb
->args
[1], 0,
798 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
799 if (!nft_is_active(net
, table
))
801 if (nf_tables_fill_table_info(skb
, net
,
802 NETLINK_CB(cb
->skb
).portid
,
804 NFT_MSG_NEWTABLE
, NLM_F_MULTI
,
805 table
->family
, table
) < 0)
808 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
818 static int nft_netlink_dump_start_rcu(struct sock
*nlsk
, struct sk_buff
*skb
,
819 const struct nlmsghdr
*nlh
,
820 struct netlink_dump_control
*c
)
824 if (!try_module_get(THIS_MODULE
))
828 err
= netlink_dump_start(nlsk
, skb
, nlh
, c
);
830 module_put(THIS_MODULE
);
835 /* called with rcu_read_lock held */
836 static int nf_tables_gettable(struct net
*net
, struct sock
*nlsk
,
837 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
838 const struct nlattr
* const nla
[],
839 struct netlink_ext_ack
*extack
)
841 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
842 u8 genmask
= nft_genmask_cur(net
);
843 const struct nft_table
*table
;
844 struct sk_buff
*skb2
;
845 int family
= nfmsg
->nfgen_family
;
848 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
849 struct netlink_dump_control c
= {
850 .dump
= nf_tables_dump_tables
,
851 .module
= THIS_MODULE
,
854 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
857 table
= nft_table_lookup(net
, nla
[NFTA_TABLE_NAME
], family
, genmask
, 0);
859 NL_SET_BAD_ATTR(extack
, nla
[NFTA_TABLE_NAME
]);
860 return PTR_ERR(table
);
863 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
867 err
= nf_tables_fill_table_info(skb2
, net
, NETLINK_CB(skb
).portid
,
868 nlh
->nlmsg_seq
, NFT_MSG_NEWTABLE
, 0,
871 goto err_fill_table_info
;
873 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
880 static void nft_table_disable(struct net
*net
, struct nft_table
*table
, u32 cnt
)
882 struct nft_chain
*chain
;
885 list_for_each_entry(chain
, &table
->chains
, list
) {
886 if (!nft_is_active_next(net
, chain
))
888 if (!nft_is_base_chain(chain
))
891 if (cnt
&& i
++ == cnt
)
894 nf_tables_unregister_hook(net
, table
, chain
);
898 static int nf_tables_table_enable(struct net
*net
, struct nft_table
*table
)
900 struct nft_chain
*chain
;
903 list_for_each_entry(chain
, &table
->chains
, list
) {
904 if (!nft_is_active_next(net
, chain
))
906 if (!nft_is_base_chain(chain
))
909 err
= nf_tables_register_hook(net
, table
, chain
);
911 goto err_register_hooks
;
919 nft_table_disable(net
, table
, i
);
923 static void nf_tables_table_disable(struct net
*net
, struct nft_table
*table
)
925 nft_table_disable(net
, table
, 0);
929 NFT_TABLE_STATE_UNCHANGED
= 0,
930 NFT_TABLE_STATE_DORMANT
,
931 NFT_TABLE_STATE_WAKEUP
934 static int nf_tables_updtable(struct nft_ctx
*ctx
)
936 struct nft_trans
*trans
;
940 if (!ctx
->nla
[NFTA_TABLE_FLAGS
])
943 flags
= ntohl(nla_get_be32(ctx
->nla
[NFTA_TABLE_FLAGS
]));
944 if (flags
& ~NFT_TABLE_F_MASK
)
947 if (flags
== ctx
->table
->flags
)
950 if ((nft_table_has_owner(ctx
->table
) &&
951 !(flags
& NFT_TABLE_F_OWNER
)) ||
952 (!nft_table_has_owner(ctx
->table
) &&
953 flags
& NFT_TABLE_F_OWNER
))
956 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWTABLE
,
957 sizeof(struct nft_trans_table
));
961 if ((flags
& NFT_TABLE_F_DORMANT
) &&
962 !(ctx
->table
->flags
& NFT_TABLE_F_DORMANT
)) {
963 nft_trans_table_state(trans
) = NFT_TABLE_STATE_DORMANT
;
964 } else if (!(flags
& NFT_TABLE_F_DORMANT
) &&
965 ctx
->table
->flags
& NFT_TABLE_F_DORMANT
) {
966 ret
= nf_tables_table_enable(ctx
->net
, ctx
->table
);
968 nft_trans_table_state(trans
) = NFT_TABLE_STATE_WAKEUP
;
973 nft_trans_table_flags(trans
) = flags
;
974 nft_trans_table_update(trans
) = true;
975 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
978 nft_trans_destroy(trans
);
982 static u32
nft_chain_hash(const void *data
, u32 len
, u32 seed
)
984 const char *name
= data
;
986 return jhash(name
, strlen(name
), seed
);
989 static u32
nft_chain_hash_obj(const void *data
, u32 len
, u32 seed
)
991 const struct nft_chain
*chain
= data
;
993 return nft_chain_hash(chain
->name
, 0, seed
);
996 static int nft_chain_hash_cmp(struct rhashtable_compare_arg
*arg
,
999 const struct nft_chain
*chain
= ptr
;
1000 const char *name
= arg
->key
;
1002 return strcmp(chain
->name
, name
);
1005 static u32
nft_objname_hash(const void *data
, u32 len
, u32 seed
)
1007 const struct nft_object_hash_key
*k
= data
;
1009 seed
^= hash_ptr(k
->table
, 32);
1011 return jhash(k
->name
, strlen(k
->name
), seed
);
1014 static u32
nft_objname_hash_obj(const void *data
, u32 len
, u32 seed
)
1016 const struct nft_object
*obj
= data
;
1018 return nft_objname_hash(&obj
->key
, 0, seed
);
1021 static int nft_objname_hash_cmp(struct rhashtable_compare_arg
*arg
,
1024 const struct nft_object_hash_key
*k
= arg
->key
;
1025 const struct nft_object
*obj
= ptr
;
1027 if (obj
->key
.table
!= k
->table
)
1030 return strcmp(obj
->key
.name
, k
->name
);
1033 static int nf_tables_newtable(struct net
*net
, struct sock
*nlsk
,
1034 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1035 const struct nlattr
* const nla
[],
1036 struct netlink_ext_ack
*extack
)
1038 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1039 u8 genmask
= nft_genmask_next(net
);
1040 int family
= nfmsg
->nfgen_family
;
1041 const struct nlattr
*attr
;
1042 struct nft_table
*table
;
1047 lockdep_assert_held(&net
->nft
.commit_mutex
);
1048 attr
= nla
[NFTA_TABLE_NAME
];
1049 table
= nft_table_lookup(net
, attr
, family
, genmask
,
1050 NETLINK_CB(skb
).portid
);
1051 if (IS_ERR(table
)) {
1052 if (PTR_ERR(table
) != -ENOENT
)
1053 return PTR_ERR(table
);
1055 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
1056 NL_SET_BAD_ATTR(extack
, attr
);
1059 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
1062 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
1063 return nf_tables_updtable(&ctx
);
1066 if (nla
[NFTA_TABLE_FLAGS
]) {
1067 flags
= ntohl(nla_get_be32(nla
[NFTA_TABLE_FLAGS
]));
1068 if (flags
& ~NFT_TABLE_F_MASK
)
1073 table
= kzalloc(sizeof(*table
), GFP_KERNEL
);
1077 table
->name
= nla_strdup(attr
, GFP_KERNEL
);
1078 if (table
->name
== NULL
)
1081 if (nla
[NFTA_TABLE_USERDATA
]) {
1082 table
->udata
= nla_memdup(nla
[NFTA_TABLE_USERDATA
], GFP_KERNEL
);
1083 if (table
->udata
== NULL
)
1084 goto err_table_udata
;
1086 table
->udlen
= nla_len(nla
[NFTA_TABLE_USERDATA
]);
1089 err
= rhltable_init(&table
->chains_ht
, &nft_chain_ht_params
);
1093 INIT_LIST_HEAD(&table
->chains
);
1094 INIT_LIST_HEAD(&table
->sets
);
1095 INIT_LIST_HEAD(&table
->objects
);
1096 INIT_LIST_HEAD(&table
->flowtables
);
1097 table
->family
= family
;
1098 table
->flags
= flags
;
1099 table
->handle
= ++table_handle
;
1100 if (table
->flags
& NFT_TABLE_F_OWNER
)
1101 table
->nlpid
= NETLINK_CB(skb
).portid
;
1103 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
1104 err
= nft_trans_table_add(&ctx
, NFT_MSG_NEWTABLE
);
1108 list_add_tail_rcu(&table
->list
, &net
->nft
.tables
);
1111 rhltable_destroy(&table
->chains_ht
);
1113 kfree(table
->udata
);
1122 static int nft_flush_table(struct nft_ctx
*ctx
)
1124 struct nft_flowtable
*flowtable
, *nft
;
1125 struct nft_chain
*chain
, *nc
;
1126 struct nft_object
*obj
, *ne
;
1127 struct nft_set
*set
, *ns
;
1130 list_for_each_entry(chain
, &ctx
->table
->chains
, list
) {
1131 if (!nft_is_active_next(ctx
->net
, chain
))
1134 if (nft_chain_is_bound(chain
))
1139 err
= nft_delrule_by_chain(ctx
);
1144 list_for_each_entry_safe(set
, ns
, &ctx
->table
->sets
, list
) {
1145 if (!nft_is_active_next(ctx
->net
, set
))
1148 if (nft_set_is_anonymous(set
) &&
1149 !list_empty(&set
->bindings
))
1152 err
= nft_delset(ctx
, set
);
1157 list_for_each_entry_safe(flowtable
, nft
, &ctx
->table
->flowtables
, list
) {
1158 if (!nft_is_active_next(ctx
->net
, flowtable
))
1161 err
= nft_delflowtable(ctx
, flowtable
);
1166 list_for_each_entry_safe(obj
, ne
, &ctx
->table
->objects
, list
) {
1167 if (!nft_is_active_next(ctx
->net
, obj
))
1170 err
= nft_delobj(ctx
, obj
);
1175 list_for_each_entry_safe(chain
, nc
, &ctx
->table
->chains
, list
) {
1176 if (!nft_is_active_next(ctx
->net
, chain
))
1179 if (nft_chain_is_bound(chain
))
1184 err
= nft_delchain(ctx
);
1189 err
= nft_deltable(ctx
);
1194 static int nft_flush(struct nft_ctx
*ctx
, int family
)
1196 struct nft_table
*table
, *nt
;
1197 const struct nlattr
* const *nla
= ctx
->nla
;
1200 list_for_each_entry_safe(table
, nt
, &ctx
->net
->nft
.tables
, list
) {
1201 if (family
!= AF_UNSPEC
&& table
->family
!= family
)
1204 ctx
->family
= table
->family
;
1206 if (!nft_is_active_next(ctx
->net
, table
))
1209 if (nft_table_has_owner(table
) && table
->nlpid
!= ctx
->portid
)
1212 if (nla
[NFTA_TABLE_NAME
] &&
1213 nla_strcmp(nla
[NFTA_TABLE_NAME
], table
->name
) != 0)
1218 err
= nft_flush_table(ctx
);
1226 static int nf_tables_deltable(struct net
*net
, struct sock
*nlsk
,
1227 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1228 const struct nlattr
* const nla
[],
1229 struct netlink_ext_ack
*extack
)
1231 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1232 u8 genmask
= nft_genmask_next(net
);
1233 int family
= nfmsg
->nfgen_family
;
1234 const struct nlattr
*attr
;
1235 struct nft_table
*table
;
1238 nft_ctx_init(&ctx
, net
, skb
, nlh
, 0, NULL
, NULL
, nla
);
1239 if (family
== AF_UNSPEC
||
1240 (!nla
[NFTA_TABLE_NAME
] && !nla
[NFTA_TABLE_HANDLE
]))
1241 return nft_flush(&ctx
, family
);
1243 if (nla
[NFTA_TABLE_HANDLE
]) {
1244 attr
= nla
[NFTA_TABLE_HANDLE
];
1245 table
= nft_table_lookup_byhandle(net
, attr
, genmask
);
1247 attr
= nla
[NFTA_TABLE_NAME
];
1248 table
= nft_table_lookup(net
, attr
, family
, genmask
,
1249 NETLINK_CB(skb
).portid
);
1252 if (IS_ERR(table
)) {
1253 NL_SET_BAD_ATTR(extack
, attr
);
1254 return PTR_ERR(table
);
1257 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
1261 ctx
.family
= family
;
1264 return nft_flush_table(&ctx
);
1267 static void nf_tables_table_destroy(struct nft_ctx
*ctx
)
1269 if (WARN_ON(ctx
->table
->use
> 0))
1272 rhltable_destroy(&ctx
->table
->chains_ht
);
1273 kfree(ctx
->table
->name
);
1274 kfree(ctx
->table
->udata
);
1278 void nft_register_chain_type(const struct nft_chain_type
*ctype
)
1280 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1281 if (WARN_ON(__nft_chain_type_get(ctype
->family
, ctype
->type
))) {
1282 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1285 chain_type
[ctype
->family
][ctype
->type
] = ctype
;
1286 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1288 EXPORT_SYMBOL_GPL(nft_register_chain_type
);
1290 void nft_unregister_chain_type(const struct nft_chain_type
*ctype
)
1292 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1293 chain_type
[ctype
->family
][ctype
->type
] = NULL
;
1294 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1296 EXPORT_SYMBOL_GPL(nft_unregister_chain_type
);
1302 static struct nft_chain
*
1303 nft_chain_lookup_byhandle(const struct nft_table
*table
, u64 handle
, u8 genmask
)
1305 struct nft_chain
*chain
;
1307 list_for_each_entry(chain
, &table
->chains
, list
) {
1308 if (chain
->handle
== handle
&&
1309 nft_active_genmask(chain
, genmask
))
1313 return ERR_PTR(-ENOENT
);
1316 static bool lockdep_commit_lock_is_held(const struct net
*net
)
1318 #ifdef CONFIG_PROVE_LOCKING
1319 return lockdep_is_held(&net
->nft
.commit_mutex
);
1325 static struct nft_chain
*nft_chain_lookup(struct net
*net
,
1326 struct nft_table
*table
,
1327 const struct nlattr
*nla
, u8 genmask
)
1329 char search
[NFT_CHAIN_MAXNAMELEN
+ 1];
1330 struct rhlist_head
*tmp
, *list
;
1331 struct nft_chain
*chain
;
1334 return ERR_PTR(-EINVAL
);
1336 nla_strscpy(search
, nla
, sizeof(search
));
1338 WARN_ON(!rcu_read_lock_held() &&
1339 !lockdep_commit_lock_is_held(net
));
1341 chain
= ERR_PTR(-ENOENT
);
1343 list
= rhltable_lookup(&table
->chains_ht
, search
, nft_chain_ht_params
);
1347 rhl_for_each_entry_rcu(chain
, tmp
, list
, rhlhead
) {
1348 if (nft_active_genmask(chain
, genmask
))
1351 chain
= ERR_PTR(-ENOENT
);
1357 static const struct nla_policy nft_chain_policy
[NFTA_CHAIN_MAX
+ 1] = {
1358 [NFTA_CHAIN_TABLE
] = { .type
= NLA_STRING
,
1359 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
1360 [NFTA_CHAIN_HANDLE
] = { .type
= NLA_U64
},
1361 [NFTA_CHAIN_NAME
] = { .type
= NLA_STRING
,
1362 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
1363 [NFTA_CHAIN_HOOK
] = { .type
= NLA_NESTED
},
1364 [NFTA_CHAIN_POLICY
] = { .type
= NLA_U32
},
1365 [NFTA_CHAIN_TYPE
] = { .type
= NLA_STRING
,
1366 .len
= NFT_MODULE_AUTOLOAD_LIMIT
},
1367 [NFTA_CHAIN_COUNTERS
] = { .type
= NLA_NESTED
},
1368 [NFTA_CHAIN_FLAGS
] = { .type
= NLA_U32
},
1369 [NFTA_CHAIN_ID
] = { .type
= NLA_U32
},
1370 [NFTA_CHAIN_USERDATA
] = { .type
= NLA_BINARY
,
1371 .len
= NFT_USERDATA_MAXLEN
},
1374 static const struct nla_policy nft_hook_policy
[NFTA_HOOK_MAX
+ 1] = {
1375 [NFTA_HOOK_HOOKNUM
] = { .type
= NLA_U32
},
1376 [NFTA_HOOK_PRIORITY
] = { .type
= NLA_U32
},
1377 [NFTA_HOOK_DEV
] = { .type
= NLA_STRING
,
1378 .len
= IFNAMSIZ
- 1 },
1381 static int nft_dump_stats(struct sk_buff
*skb
, struct nft_stats __percpu
*stats
)
1383 struct nft_stats
*cpu_stats
, total
;
1384 struct nlattr
*nest
;
1392 memset(&total
, 0, sizeof(total
));
1393 for_each_possible_cpu(cpu
) {
1394 cpu_stats
= per_cpu_ptr(stats
, cpu
);
1396 seq
= u64_stats_fetch_begin_irq(&cpu_stats
->syncp
);
1397 pkts
= cpu_stats
->pkts
;
1398 bytes
= cpu_stats
->bytes
;
1399 } while (u64_stats_fetch_retry_irq(&cpu_stats
->syncp
, seq
));
1401 total
.bytes
+= bytes
;
1403 nest
= nla_nest_start_noflag(skb
, NFTA_CHAIN_COUNTERS
);
1405 goto nla_put_failure
;
1407 if (nla_put_be64(skb
, NFTA_COUNTER_PACKETS
, cpu_to_be64(total
.pkts
),
1408 NFTA_COUNTER_PAD
) ||
1409 nla_put_be64(skb
, NFTA_COUNTER_BYTES
, cpu_to_be64(total
.bytes
),
1411 goto nla_put_failure
;
1413 nla_nest_end(skb
, nest
);
1420 static int nft_dump_basechain_hook(struct sk_buff
*skb
, int family
,
1421 const struct nft_base_chain
*basechain
)
1423 const struct nf_hook_ops
*ops
= &basechain
->ops
;
1424 struct nft_hook
*hook
, *first
= NULL
;
1425 struct nlattr
*nest
, *nest_devs
;
1428 nest
= nla_nest_start_noflag(skb
, NFTA_CHAIN_HOOK
);
1430 goto nla_put_failure
;
1431 if (nla_put_be32(skb
, NFTA_HOOK_HOOKNUM
, htonl(ops
->hooknum
)))
1432 goto nla_put_failure
;
1433 if (nla_put_be32(skb
, NFTA_HOOK_PRIORITY
, htonl(ops
->priority
)))
1434 goto nla_put_failure
;
1436 if (nft_base_chain_netdev(family
, ops
->hooknum
)) {
1437 nest_devs
= nla_nest_start_noflag(skb
, NFTA_HOOK_DEVS
);
1438 list_for_each_entry(hook
, &basechain
->hook_list
, list
) {
1442 if (nla_put_string(skb
, NFTA_DEVICE_NAME
,
1443 hook
->ops
.dev
->name
))
1444 goto nla_put_failure
;
1447 nla_nest_end(skb
, nest_devs
);
1450 nla_put_string(skb
, NFTA_HOOK_DEV
, first
->ops
.dev
->name
))
1451 goto nla_put_failure
;
1453 nla_nest_end(skb
, nest
);
1460 static int nf_tables_fill_chain_info(struct sk_buff
*skb
, struct net
*net
,
1461 u32 portid
, u32 seq
, int event
, u32 flags
,
1462 int family
, const struct nft_table
*table
,
1463 const struct nft_chain
*chain
)
1465 struct nlmsghdr
*nlh
;
1466 struct nfgenmsg
*nfmsg
;
1468 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
1469 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
1471 goto nla_put_failure
;
1473 nfmsg
= nlmsg_data(nlh
);
1474 nfmsg
->nfgen_family
= family
;
1475 nfmsg
->version
= NFNETLINK_V0
;
1476 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
1478 if (nla_put_string(skb
, NFTA_CHAIN_TABLE
, table
->name
))
1479 goto nla_put_failure
;
1480 if (nla_put_be64(skb
, NFTA_CHAIN_HANDLE
, cpu_to_be64(chain
->handle
),
1482 goto nla_put_failure
;
1483 if (nla_put_string(skb
, NFTA_CHAIN_NAME
, chain
->name
))
1484 goto nla_put_failure
;
1486 if (nft_is_base_chain(chain
)) {
1487 const struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1488 struct nft_stats __percpu
*stats
;
1490 if (nft_dump_basechain_hook(skb
, family
, basechain
))
1491 goto nla_put_failure
;
1493 if (nla_put_be32(skb
, NFTA_CHAIN_POLICY
,
1494 htonl(basechain
->policy
)))
1495 goto nla_put_failure
;
1497 if (nla_put_string(skb
, NFTA_CHAIN_TYPE
, basechain
->type
->name
))
1498 goto nla_put_failure
;
1500 stats
= rcu_dereference_check(basechain
->stats
,
1501 lockdep_commit_lock_is_held(net
));
1502 if (nft_dump_stats(skb
, stats
))
1503 goto nla_put_failure
;
1507 nla_put_be32(skb
, NFTA_CHAIN_FLAGS
, htonl(chain
->flags
)))
1508 goto nla_put_failure
;
1510 if (nla_put_be32(skb
, NFTA_CHAIN_USE
, htonl(chain
->use
)))
1511 goto nla_put_failure
;
1514 nla_put(skb
, NFTA_CHAIN_USERDATA
, chain
->udlen
, chain
->udata
))
1515 goto nla_put_failure
;
1517 nlmsg_end(skb
, nlh
);
1521 nlmsg_trim(skb
, nlh
);
1525 static void nf_tables_chain_notify(const struct nft_ctx
*ctx
, int event
)
1527 struct sk_buff
*skb
;
1531 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
1534 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
1538 err
= nf_tables_fill_chain_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
1539 event
, 0, ctx
->family
, ctx
->table
,
1546 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
1549 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
1552 static int nf_tables_dump_chains(struct sk_buff
*skb
,
1553 struct netlink_callback
*cb
)
1555 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
1556 const struct nft_table
*table
;
1557 const struct nft_chain
*chain
;
1558 unsigned int idx
= 0, s_idx
= cb
->args
[0];
1559 struct net
*net
= sock_net(skb
->sk
);
1560 int family
= nfmsg
->nfgen_family
;
1563 cb
->seq
= net
->nft
.base_seq
;
1565 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
1566 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
1569 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
1573 memset(&cb
->args
[1], 0,
1574 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
1575 if (!nft_is_active(net
, chain
))
1577 if (nf_tables_fill_chain_info(skb
, net
,
1578 NETLINK_CB(cb
->skb
).portid
,
1582 table
->family
, table
,
1586 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
1597 /* called with rcu_read_lock held */
1598 static int nf_tables_getchain(struct net
*net
, struct sock
*nlsk
,
1599 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1600 const struct nlattr
* const nla
[],
1601 struct netlink_ext_ack
*extack
)
1603 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1604 u8 genmask
= nft_genmask_cur(net
);
1605 const struct nft_chain
*chain
;
1606 struct nft_table
*table
;
1607 struct sk_buff
*skb2
;
1608 int family
= nfmsg
->nfgen_family
;
1611 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
1612 struct netlink_dump_control c
= {
1613 .dump
= nf_tables_dump_chains
,
1614 .module
= THIS_MODULE
,
1617 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
1620 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
, 0);
1621 if (IS_ERR(table
)) {
1622 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
1623 return PTR_ERR(table
);
1626 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_CHAIN_NAME
], genmask
);
1627 if (IS_ERR(chain
)) {
1628 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
1629 return PTR_ERR(chain
);
1632 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
1636 err
= nf_tables_fill_chain_info(skb2
, net
, NETLINK_CB(skb
).portid
,
1637 nlh
->nlmsg_seq
, NFT_MSG_NEWCHAIN
, 0,
1638 family
, table
, chain
);
1640 goto err_fill_chain_info
;
1642 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
1644 err_fill_chain_info
:
1649 static const struct nla_policy nft_counter_policy
[NFTA_COUNTER_MAX
+ 1] = {
1650 [NFTA_COUNTER_PACKETS
] = { .type
= NLA_U64
},
1651 [NFTA_COUNTER_BYTES
] = { .type
= NLA_U64
},
1654 static struct nft_stats __percpu
*nft_stats_alloc(const struct nlattr
*attr
)
1656 struct nlattr
*tb
[NFTA_COUNTER_MAX
+1];
1657 struct nft_stats __percpu
*newstats
;
1658 struct nft_stats
*stats
;
1661 err
= nla_parse_nested_deprecated(tb
, NFTA_COUNTER_MAX
, attr
,
1662 nft_counter_policy
, NULL
);
1664 return ERR_PTR(err
);
1666 if (!tb
[NFTA_COUNTER_BYTES
] || !tb
[NFTA_COUNTER_PACKETS
])
1667 return ERR_PTR(-EINVAL
);
1669 newstats
= netdev_alloc_pcpu_stats(struct nft_stats
);
1670 if (newstats
== NULL
)
1671 return ERR_PTR(-ENOMEM
);
1673 /* Restore old counters on this cpu, no problem. Per-cpu statistics
1674 * are not exposed to userspace.
1677 stats
= this_cpu_ptr(newstats
);
1678 stats
->bytes
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_BYTES
]));
1679 stats
->pkts
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_PACKETS
]));
1685 static void nft_chain_stats_replace(struct nft_trans
*trans
)
1687 struct nft_base_chain
*chain
= nft_base_chain(trans
->ctx
.chain
);
1689 if (!nft_trans_chain_stats(trans
))
1692 nft_trans_chain_stats(trans
) =
1693 rcu_replace_pointer(chain
->stats
, nft_trans_chain_stats(trans
),
1694 lockdep_commit_lock_is_held(trans
->ctx
.net
));
1696 if (!nft_trans_chain_stats(trans
))
1697 static_branch_inc(&nft_counters_enabled
);
1700 static void nf_tables_chain_free_chain_rules(struct nft_chain
*chain
)
1702 struct nft_rule
**g0
= rcu_dereference_raw(chain
->rules_gen_0
);
1703 struct nft_rule
**g1
= rcu_dereference_raw(chain
->rules_gen_1
);
1709 /* should be NULL either via abort or via successful commit */
1710 WARN_ON_ONCE(chain
->rules_next
);
1711 kvfree(chain
->rules_next
);
1714 void nf_tables_chain_destroy(struct nft_ctx
*ctx
)
1716 struct nft_chain
*chain
= ctx
->chain
;
1717 struct nft_hook
*hook
, *next
;
1719 if (WARN_ON(chain
->use
> 0))
1722 /* no concurrent access possible anymore */
1723 nf_tables_chain_free_chain_rules(chain
);
1725 if (nft_is_base_chain(chain
)) {
1726 struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1728 if (nft_base_chain_netdev(ctx
->family
, basechain
->ops
.hooknum
)) {
1729 list_for_each_entry_safe(hook
, next
,
1730 &basechain
->hook_list
, list
) {
1731 list_del_rcu(&hook
->list
);
1732 kfree_rcu(hook
, rcu
);
1735 module_put(basechain
->type
->owner
);
1736 if (rcu_access_pointer(basechain
->stats
)) {
1737 static_branch_dec(&nft_counters_enabled
);
1738 free_percpu(rcu_dereference_raw(basechain
->stats
));
1741 kfree(chain
->udata
);
1745 kfree(chain
->udata
);
1750 static struct nft_hook
*nft_netdev_hook_alloc(struct net
*net
,
1751 const struct nlattr
*attr
)
1753 struct net_device
*dev
;
1754 char ifname
[IFNAMSIZ
];
1755 struct nft_hook
*hook
;
1758 hook
= kmalloc(sizeof(struct nft_hook
), GFP_KERNEL
);
1761 goto err_hook_alloc
;
1764 nla_strscpy(ifname
, attr
, IFNAMSIZ
);
1765 /* nf_tables_netdev_event() is called under rtnl_mutex, this is
1766 * indirectly serializing all the other holders of the commit_mutex with
1769 dev
= __dev_get_by_name(net
, ifname
);
1774 hook
->ops
.dev
= dev
;
1775 hook
->inactive
= false;
1782 return ERR_PTR(err
);
1785 static struct nft_hook
*nft_hook_list_find(struct list_head
*hook_list
,
1786 const struct nft_hook
*this)
1788 struct nft_hook
*hook
;
1790 list_for_each_entry(hook
, hook_list
, list
) {
1791 if (this->ops
.dev
== hook
->ops
.dev
)
1798 static int nf_tables_parse_netdev_hooks(struct net
*net
,
1799 const struct nlattr
*attr
,
1800 struct list_head
*hook_list
)
1802 struct nft_hook
*hook
, *next
;
1803 const struct nlattr
*tmp
;
1804 int rem
, n
= 0, err
;
1806 nla_for_each_nested(tmp
, attr
, rem
) {
1807 if (nla_type(tmp
) != NFTA_DEVICE_NAME
) {
1812 hook
= nft_netdev_hook_alloc(net
, tmp
);
1814 err
= PTR_ERR(hook
);
1817 if (nft_hook_list_find(hook_list
, hook
)) {
1822 list_add_tail(&hook
->list
, hook_list
);
1825 if (n
== NFT_NETDEVICE_MAX
) {
1834 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
1835 list_del(&hook
->list
);
1841 struct nft_chain_hook
{
1844 const struct nft_chain_type
*type
;
1845 struct list_head list
;
1848 static int nft_chain_parse_netdev(struct net
*net
,
1849 struct nlattr
*tb
[],
1850 struct list_head
*hook_list
)
1852 struct nft_hook
*hook
;
1855 if (tb
[NFTA_HOOK_DEV
]) {
1856 hook
= nft_netdev_hook_alloc(net
, tb
[NFTA_HOOK_DEV
]);
1858 return PTR_ERR(hook
);
1860 list_add_tail(&hook
->list
, hook_list
);
1861 } else if (tb
[NFTA_HOOK_DEVS
]) {
1862 err
= nf_tables_parse_netdev_hooks(net
, tb
[NFTA_HOOK_DEVS
],
1867 if (list_empty(hook_list
))
1876 static int nft_chain_parse_hook(struct net
*net
,
1877 const struct nlattr
* const nla
[],
1878 struct nft_chain_hook
*hook
, u8 family
,
1881 struct nlattr
*ha
[NFTA_HOOK_MAX
+ 1];
1882 const struct nft_chain_type
*type
;
1885 lockdep_assert_held(&net
->nft
.commit_mutex
);
1886 lockdep_nfnl_nft_mutex_not_held();
1888 err
= nla_parse_nested_deprecated(ha
, NFTA_HOOK_MAX
,
1889 nla
[NFTA_CHAIN_HOOK
],
1890 nft_hook_policy
, NULL
);
1894 if (ha
[NFTA_HOOK_HOOKNUM
] == NULL
||
1895 ha
[NFTA_HOOK_PRIORITY
] == NULL
)
1898 hook
->num
= ntohl(nla_get_be32(ha
[NFTA_HOOK_HOOKNUM
]));
1899 hook
->priority
= ntohl(nla_get_be32(ha
[NFTA_HOOK_PRIORITY
]));
1901 type
= __nft_chain_type_get(family
, NFT_CHAIN_T_DEFAULT
);
1905 if (nla
[NFTA_CHAIN_TYPE
]) {
1906 type
= nf_tables_chain_type_lookup(net
, nla
[NFTA_CHAIN_TYPE
],
1909 return PTR_ERR(type
);
1911 if (hook
->num
>= NFT_MAX_HOOKS
|| !(type
->hook_mask
& (1 << hook
->num
)))
1914 if (type
->type
== NFT_CHAIN_T_NAT
&&
1915 hook
->priority
<= NF_IP_PRI_CONNTRACK
)
1918 if (!try_module_get(type
->owner
))
1923 INIT_LIST_HEAD(&hook
->list
);
1924 if (nft_base_chain_netdev(family
, hook
->num
)) {
1925 err
= nft_chain_parse_netdev(net
, ha
, &hook
->list
);
1927 module_put(type
->owner
);
1930 } else if (ha
[NFTA_HOOK_DEV
] || ha
[NFTA_HOOK_DEVS
]) {
1931 module_put(type
->owner
);
1938 static void nft_chain_release_hook(struct nft_chain_hook
*hook
)
1940 struct nft_hook
*h
, *next
;
1942 list_for_each_entry_safe(h
, next
, &hook
->list
, list
) {
1946 module_put(hook
->type
->owner
);
1949 struct nft_rules_old
{
1951 struct nft_rule
**start
;
1954 static struct nft_rule
**nf_tables_chain_alloc_rules(const struct nft_chain
*chain
,
1957 if (alloc
> INT_MAX
)
1960 alloc
+= 1; /* NULL, ends rules */
1961 if (sizeof(struct nft_rule
*) > INT_MAX
/ alloc
)
1964 alloc
*= sizeof(struct nft_rule
*);
1965 alloc
+= sizeof(struct nft_rules_old
);
1967 return kvmalloc(alloc
, GFP_KERNEL
);
1970 static void nft_basechain_hook_init(struct nf_hook_ops
*ops
, u8 family
,
1971 const struct nft_chain_hook
*hook
,
1972 struct nft_chain
*chain
)
1975 ops
->hooknum
= hook
->num
;
1976 ops
->priority
= hook
->priority
;
1978 ops
->hook
= hook
->type
->hooks
[ops
->hooknum
];
1981 static int nft_basechain_init(struct nft_base_chain
*basechain
, u8 family
,
1982 struct nft_chain_hook
*hook
, u32 flags
)
1984 struct nft_chain
*chain
;
1987 basechain
->type
= hook
->type
;
1988 INIT_LIST_HEAD(&basechain
->hook_list
);
1989 chain
= &basechain
->chain
;
1991 if (nft_base_chain_netdev(family
, hook
->num
)) {
1992 list_splice_init(&hook
->list
, &basechain
->hook_list
);
1993 list_for_each_entry(h
, &basechain
->hook_list
, list
)
1994 nft_basechain_hook_init(&h
->ops
, family
, hook
, chain
);
1996 basechain
->ops
.hooknum
= hook
->num
;
1997 basechain
->ops
.priority
= hook
->priority
;
1999 nft_basechain_hook_init(&basechain
->ops
, family
, hook
, chain
);
2002 chain
->flags
|= NFT_CHAIN_BASE
| flags
;
2003 basechain
->policy
= NF_ACCEPT
;
2004 if (chain
->flags
& NFT_CHAIN_HW_OFFLOAD
&&
2005 nft_chain_offload_priority(basechain
) < 0)
2008 flow_block_init(&basechain
->flow_block
);
2013 static int nft_chain_add(struct nft_table
*table
, struct nft_chain
*chain
)
2017 err
= rhltable_insert_key(&table
->chains_ht
, chain
->name
,
2018 &chain
->rhlhead
, nft_chain_ht_params
);
2022 list_add_tail_rcu(&chain
->list
, &table
->chains
);
2027 static u64 chain_id
;
2029 static int nf_tables_addchain(struct nft_ctx
*ctx
, u8 family
, u8 genmask
,
2030 u8 policy
, u32 flags
)
2032 const struct nlattr
* const *nla
= ctx
->nla
;
2033 struct nft_table
*table
= ctx
->table
;
2034 struct nft_base_chain
*basechain
;
2035 struct nft_stats __percpu
*stats
;
2036 struct net
*net
= ctx
->net
;
2037 char name
[NFT_NAME_MAXLEN
];
2038 struct nft_trans
*trans
;
2039 struct nft_chain
*chain
;
2040 struct nft_rule
**rules
;
2043 if (table
->use
== UINT_MAX
)
2046 if (nla
[NFTA_CHAIN_HOOK
]) {
2047 struct nft_chain_hook hook
;
2049 if (flags
& NFT_CHAIN_BINDING
)
2052 err
= nft_chain_parse_hook(net
, nla
, &hook
, family
, true);
2056 basechain
= kzalloc(sizeof(*basechain
), GFP_KERNEL
);
2057 if (basechain
== NULL
) {
2058 nft_chain_release_hook(&hook
);
2061 chain
= &basechain
->chain
;
2063 if (nla
[NFTA_CHAIN_COUNTERS
]) {
2064 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
2065 if (IS_ERR(stats
)) {
2066 nft_chain_release_hook(&hook
);
2068 return PTR_ERR(stats
);
2070 rcu_assign_pointer(basechain
->stats
, stats
);
2071 static_branch_inc(&nft_counters_enabled
);
2074 err
= nft_basechain_init(basechain
, family
, &hook
, flags
);
2076 nft_chain_release_hook(&hook
);
2081 if (flags
& NFT_CHAIN_BASE
)
2083 if (flags
& NFT_CHAIN_HW_OFFLOAD
)
2086 chain
= kzalloc(sizeof(*chain
), GFP_KERNEL
);
2090 chain
->flags
= flags
;
2094 INIT_LIST_HEAD(&chain
->rules
);
2095 chain
->handle
= nf_tables_alloc_handle(table
);
2096 chain
->table
= table
;
2098 if (nla
[NFTA_CHAIN_NAME
]) {
2099 chain
->name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
2101 if (!(flags
& NFT_CHAIN_BINDING
)) {
2103 goto err_destroy_chain
;
2106 snprintf(name
, sizeof(name
), "__chain%llu", ++chain_id
);
2107 chain
->name
= kstrdup(name
, GFP_KERNEL
);
2112 goto err_destroy_chain
;
2115 if (nla
[NFTA_CHAIN_USERDATA
]) {
2116 chain
->udata
= nla_memdup(nla
[NFTA_CHAIN_USERDATA
], GFP_KERNEL
);
2117 if (chain
->udata
== NULL
) {
2119 goto err_destroy_chain
;
2121 chain
->udlen
= nla_len(nla
[NFTA_CHAIN_USERDATA
]);
2124 rules
= nf_tables_chain_alloc_rules(chain
, 0);
2127 goto err_destroy_chain
;
2131 rcu_assign_pointer(chain
->rules_gen_0
, rules
);
2132 rcu_assign_pointer(chain
->rules_gen_1
, rules
);
2134 err
= nf_tables_register_hook(net
, table
, chain
);
2136 goto err_destroy_chain
;
2138 trans
= nft_trans_chain_add(ctx
, NFT_MSG_NEWCHAIN
);
2139 if (IS_ERR(trans
)) {
2140 err
= PTR_ERR(trans
);
2141 goto err_unregister_hook
;
2144 nft_trans_chain_policy(trans
) = NFT_CHAIN_POLICY_UNSET
;
2145 if (nft_is_base_chain(chain
))
2146 nft_trans_chain_policy(trans
) = policy
;
2148 err
= nft_chain_add(table
, chain
);
2150 nft_trans_destroy(trans
);
2151 goto err_unregister_hook
;
2157 err_unregister_hook
:
2158 nf_tables_unregister_hook(net
, table
, chain
);
2160 nf_tables_chain_destroy(ctx
);
2165 static bool nft_hook_list_equal(struct list_head
*hook_list1
,
2166 struct list_head
*hook_list2
)
2168 struct nft_hook
*hook
;
2172 list_for_each_entry(hook
, hook_list2
, list
) {
2173 if (!nft_hook_list_find(hook_list1
, hook
))
2178 list_for_each_entry(hook
, hook_list1
, list
)
2184 static int nf_tables_updchain(struct nft_ctx
*ctx
, u8 genmask
, u8 policy
,
2185 u32 flags
, const struct nlattr
*attr
,
2186 struct netlink_ext_ack
*extack
)
2188 const struct nlattr
* const *nla
= ctx
->nla
;
2189 struct nft_table
*table
= ctx
->table
;
2190 struct nft_chain
*chain
= ctx
->chain
;
2191 struct nft_base_chain
*basechain
;
2192 struct nft_stats
*stats
= NULL
;
2193 struct nft_chain_hook hook
;
2194 struct nf_hook_ops
*ops
;
2195 struct nft_trans
*trans
;
2198 if (chain
->flags
^ flags
)
2201 if (nla
[NFTA_CHAIN_HOOK
]) {
2202 if (!nft_is_base_chain(chain
)) {
2203 NL_SET_BAD_ATTR(extack
, attr
);
2206 err
= nft_chain_parse_hook(ctx
->net
, nla
, &hook
, ctx
->family
,
2211 basechain
= nft_base_chain(chain
);
2212 if (basechain
->type
!= hook
.type
) {
2213 nft_chain_release_hook(&hook
);
2214 NL_SET_BAD_ATTR(extack
, attr
);
2218 if (nft_base_chain_netdev(ctx
->family
, hook
.num
)) {
2219 if (!nft_hook_list_equal(&basechain
->hook_list
,
2221 nft_chain_release_hook(&hook
);
2222 NL_SET_BAD_ATTR(extack
, attr
);
2226 ops
= &basechain
->ops
;
2227 if (ops
->hooknum
!= hook
.num
||
2228 ops
->priority
!= hook
.priority
) {
2229 nft_chain_release_hook(&hook
);
2230 NL_SET_BAD_ATTR(extack
, attr
);
2234 nft_chain_release_hook(&hook
);
2237 if (nla
[NFTA_CHAIN_HANDLE
] &&
2238 nla
[NFTA_CHAIN_NAME
]) {
2239 struct nft_chain
*chain2
;
2241 chain2
= nft_chain_lookup(ctx
->net
, table
,
2242 nla
[NFTA_CHAIN_NAME
], genmask
);
2243 if (!IS_ERR(chain2
)) {
2244 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
2249 if (nla
[NFTA_CHAIN_COUNTERS
]) {
2250 if (!nft_is_base_chain(chain
))
2253 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
2255 return PTR_ERR(stats
);
2259 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWCHAIN
,
2260 sizeof(struct nft_trans_chain
));
2264 nft_trans_chain_stats(trans
) = stats
;
2265 nft_trans_chain_update(trans
) = true;
2267 if (nla
[NFTA_CHAIN_POLICY
])
2268 nft_trans_chain_policy(trans
) = policy
;
2270 nft_trans_chain_policy(trans
) = -1;
2272 if (nla
[NFTA_CHAIN_HANDLE
] &&
2273 nla
[NFTA_CHAIN_NAME
]) {
2274 struct nft_trans
*tmp
;
2278 name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
2283 list_for_each_entry(tmp
, &ctx
->net
->nft
.commit_list
, list
) {
2284 if (tmp
->msg_type
== NFT_MSG_NEWCHAIN
&&
2285 tmp
->ctx
.table
== table
&&
2286 nft_trans_chain_update(tmp
) &&
2287 nft_trans_chain_name(tmp
) &&
2288 strcmp(name
, nft_trans_chain_name(tmp
)) == 0) {
2289 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
2295 nft_trans_chain_name(trans
) = name
;
2297 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
2306 static struct nft_chain
*nft_chain_lookup_byid(const struct net
*net
,
2307 const struct nlattr
*nla
)
2309 u32 id
= ntohl(nla_get_be32(nla
));
2310 struct nft_trans
*trans
;
2312 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
2313 struct nft_chain
*chain
= trans
->ctx
.chain
;
2315 if (trans
->msg_type
== NFT_MSG_NEWCHAIN
&&
2316 id
== nft_trans_chain_id(trans
))
2319 return ERR_PTR(-ENOENT
);
2322 static int nf_tables_newchain(struct net
*net
, struct sock
*nlsk
,
2323 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2324 const struct nlattr
* const nla
[],
2325 struct netlink_ext_ack
*extack
)
2327 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2328 u8 genmask
= nft_genmask_next(net
);
2329 int family
= nfmsg
->nfgen_family
;
2330 struct nft_chain
*chain
= NULL
;
2331 const struct nlattr
*attr
;
2332 struct nft_table
*table
;
2333 u8 policy
= NF_ACCEPT
;
2338 lockdep_assert_held(&net
->nft
.commit_mutex
);
2340 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
,
2341 NETLINK_CB(skb
).portid
);
2342 if (IS_ERR(table
)) {
2343 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
2344 return PTR_ERR(table
);
2348 attr
= nla
[NFTA_CHAIN_NAME
];
2350 if (nla
[NFTA_CHAIN_HANDLE
]) {
2351 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_CHAIN_HANDLE
]));
2352 chain
= nft_chain_lookup_byhandle(table
, handle
, genmask
);
2353 if (IS_ERR(chain
)) {
2354 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_HANDLE
]);
2355 return PTR_ERR(chain
);
2357 attr
= nla
[NFTA_CHAIN_HANDLE
];
2358 } else if (nla
[NFTA_CHAIN_NAME
]) {
2359 chain
= nft_chain_lookup(net
, table
, attr
, genmask
);
2360 if (IS_ERR(chain
)) {
2361 if (PTR_ERR(chain
) != -ENOENT
) {
2362 NL_SET_BAD_ATTR(extack
, attr
);
2363 return PTR_ERR(chain
);
2367 } else if (!nla
[NFTA_CHAIN_ID
]) {
2371 if (nla
[NFTA_CHAIN_POLICY
]) {
2372 if (chain
!= NULL
&&
2373 !nft_is_base_chain(chain
)) {
2374 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_POLICY
]);
2378 if (chain
== NULL
&&
2379 nla
[NFTA_CHAIN_HOOK
] == NULL
) {
2380 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_POLICY
]);
2384 policy
= ntohl(nla_get_be32(nla
[NFTA_CHAIN_POLICY
]));
2394 if (nla
[NFTA_CHAIN_FLAGS
])
2395 flags
= ntohl(nla_get_be32(nla
[NFTA_CHAIN_FLAGS
]));
2397 flags
= chain
->flags
;
2399 if (flags
& ~NFT_CHAIN_FLAGS
)
2402 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
2404 if (chain
!= NULL
) {
2405 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
2406 NL_SET_BAD_ATTR(extack
, attr
);
2409 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
2412 flags
|= chain
->flags
& NFT_CHAIN_BASE
;
2413 return nf_tables_updchain(&ctx
, genmask
, policy
, flags
, attr
,
2417 return nf_tables_addchain(&ctx
, family
, genmask
, policy
, flags
);
2420 static int nf_tables_delchain(struct net
*net
, struct sock
*nlsk
,
2421 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2422 const struct nlattr
* const nla
[],
2423 struct netlink_ext_ack
*extack
)
2425 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2426 u8 genmask
= nft_genmask_next(net
);
2427 int family
= nfmsg
->nfgen_family
;
2428 const struct nlattr
*attr
;
2429 struct nft_table
*table
;
2430 struct nft_chain
*chain
;
2431 struct nft_rule
*rule
;
2437 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
,
2438 NETLINK_CB(skb
).portid
);
2439 if (IS_ERR(table
)) {
2440 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
2441 return PTR_ERR(table
);
2444 if (nla
[NFTA_CHAIN_HANDLE
]) {
2445 attr
= nla
[NFTA_CHAIN_HANDLE
];
2446 handle
= be64_to_cpu(nla_get_be64(attr
));
2447 chain
= nft_chain_lookup_byhandle(table
, handle
, genmask
);
2449 attr
= nla
[NFTA_CHAIN_NAME
];
2450 chain
= nft_chain_lookup(net
, table
, attr
, genmask
);
2452 if (IS_ERR(chain
)) {
2453 NL_SET_BAD_ATTR(extack
, attr
);
2454 return PTR_ERR(chain
);
2457 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
2461 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
2464 list_for_each_entry(rule
, &chain
->rules
, list
) {
2465 if (!nft_is_active_next(net
, rule
))
2469 err
= nft_delrule(&ctx
, rule
);
2474 /* There are rules and elements that are still holding references to us,
2475 * we cannot do a recursive removal in this case.
2478 NL_SET_BAD_ATTR(extack
, attr
);
2482 return nft_delchain(&ctx
);
2490 * nft_register_expr - register nf_tables expr type
2493 * Registers the expr type for use with nf_tables. Returns zero on
2494 * success or a negative errno code otherwise.
2496 int nft_register_expr(struct nft_expr_type
*type
)
2498 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2499 if (type
->family
== NFPROTO_UNSPEC
)
2500 list_add_tail_rcu(&type
->list
, &nf_tables_expressions
);
2502 list_add_rcu(&type
->list
, &nf_tables_expressions
);
2503 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2506 EXPORT_SYMBOL_GPL(nft_register_expr
);
2509 * nft_unregister_expr - unregister nf_tables expr type
2512 * Unregisters the expr typefor use with nf_tables.
2514 void nft_unregister_expr(struct nft_expr_type
*type
)
2516 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2517 list_del_rcu(&type
->list
);
2518 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2520 EXPORT_SYMBOL_GPL(nft_unregister_expr
);
2522 static const struct nft_expr_type
*__nft_expr_type_get(u8 family
,
2525 const struct nft_expr_type
*type
, *candidate
= NULL
;
2527 list_for_each_entry(type
, &nf_tables_expressions
, list
) {
2528 if (!nla_strcmp(nla
, type
->name
)) {
2529 if (!type
->family
&& !candidate
)
2531 else if (type
->family
== family
)
2538 #ifdef CONFIG_MODULES
2539 static int nft_expr_type_request_module(struct net
*net
, u8 family
,
2542 if (nft_request_module(net
, "nft-expr-%u-%.*s", family
,
2543 nla_len(nla
), (char *)nla_data(nla
)) == -EAGAIN
)
2550 static const struct nft_expr_type
*nft_expr_type_get(struct net
*net
,
2554 const struct nft_expr_type
*type
;
2557 return ERR_PTR(-EINVAL
);
2559 type
= __nft_expr_type_get(family
, nla
);
2560 if (type
!= NULL
&& try_module_get(type
->owner
))
2563 lockdep_nfnl_nft_mutex_not_held();
2564 #ifdef CONFIG_MODULES
2566 if (nft_expr_type_request_module(net
, family
, nla
) == -EAGAIN
)
2567 return ERR_PTR(-EAGAIN
);
2569 if (nft_request_module(net
, "nft-expr-%.*s",
2571 (char *)nla_data(nla
)) == -EAGAIN
)
2572 return ERR_PTR(-EAGAIN
);
2575 return ERR_PTR(-ENOENT
);
2578 static const struct nla_policy nft_expr_policy
[NFTA_EXPR_MAX
+ 1] = {
2579 [NFTA_EXPR_NAME
] = { .type
= NLA_STRING
,
2580 .len
= NFT_MODULE_AUTOLOAD_LIMIT
},
2581 [NFTA_EXPR_DATA
] = { .type
= NLA_NESTED
},
2584 static int nf_tables_fill_expr_info(struct sk_buff
*skb
,
2585 const struct nft_expr
*expr
)
2587 if (nla_put_string(skb
, NFTA_EXPR_NAME
, expr
->ops
->type
->name
))
2588 goto nla_put_failure
;
2590 if (expr
->ops
->dump
) {
2591 struct nlattr
*data
= nla_nest_start_noflag(skb
,
2594 goto nla_put_failure
;
2595 if (expr
->ops
->dump(skb
, expr
) < 0)
2596 goto nla_put_failure
;
2597 nla_nest_end(skb
, data
);
2606 int nft_expr_dump(struct sk_buff
*skb
, unsigned int attr
,
2607 const struct nft_expr
*expr
)
2609 struct nlattr
*nest
;
2611 nest
= nla_nest_start_noflag(skb
, attr
);
2613 goto nla_put_failure
;
2614 if (nf_tables_fill_expr_info(skb
, expr
) < 0)
2615 goto nla_put_failure
;
2616 nla_nest_end(skb
, nest
);
2623 struct nft_expr_info
{
2624 const struct nft_expr_ops
*ops
;
2625 const struct nlattr
*attr
;
2626 struct nlattr
*tb
[NFT_EXPR_MAXATTR
+ 1];
2629 static int nf_tables_expr_parse(const struct nft_ctx
*ctx
,
2630 const struct nlattr
*nla
,
2631 struct nft_expr_info
*info
)
2633 const struct nft_expr_type
*type
;
2634 const struct nft_expr_ops
*ops
;
2635 struct nlattr
*tb
[NFTA_EXPR_MAX
+ 1];
2638 err
= nla_parse_nested_deprecated(tb
, NFTA_EXPR_MAX
, nla
,
2639 nft_expr_policy
, NULL
);
2643 type
= nft_expr_type_get(ctx
->net
, ctx
->family
, tb
[NFTA_EXPR_NAME
]);
2645 return PTR_ERR(type
);
2647 if (tb
[NFTA_EXPR_DATA
]) {
2648 err
= nla_parse_nested_deprecated(info
->tb
, type
->maxattr
,
2650 type
->policy
, NULL
);
2654 memset(info
->tb
, 0, sizeof(info
->tb
[0]) * (type
->maxattr
+ 1));
2656 if (type
->select_ops
!= NULL
) {
2657 ops
= type
->select_ops(ctx
,
2658 (const struct nlattr
* const *)info
->tb
);
2661 #ifdef CONFIG_MODULES
2663 if (nft_expr_type_request_module(ctx
->net
,
2665 tb
[NFTA_EXPR_NAME
]) != -EAGAIN
)
2679 module_put(type
->owner
);
2683 static int nf_tables_newexpr(const struct nft_ctx
*ctx
,
2684 const struct nft_expr_info
*info
,
2685 struct nft_expr
*expr
)
2687 const struct nft_expr_ops
*ops
= info
->ops
;
2692 err
= ops
->init(ctx
, expr
, (const struct nlattr
**)info
->tb
);
2703 static void nf_tables_expr_destroy(const struct nft_ctx
*ctx
,
2704 struct nft_expr
*expr
)
2706 const struct nft_expr_type
*type
= expr
->ops
->type
;
2708 if (expr
->ops
->destroy
)
2709 expr
->ops
->destroy(ctx
, expr
);
2710 module_put(type
->owner
);
2713 static struct nft_expr
*nft_expr_init(const struct nft_ctx
*ctx
,
2714 const struct nlattr
*nla
)
2716 struct nft_expr_info info
;
2717 struct nft_expr
*expr
;
2718 struct module
*owner
;
2721 err
= nf_tables_expr_parse(ctx
, nla
, &info
);
2726 expr
= kzalloc(info
.ops
->size
, GFP_KERNEL
);
2730 err
= nf_tables_newexpr(ctx
, &info
, expr
);
2738 owner
= info
.ops
->type
->owner
;
2739 if (info
.ops
->type
->release_ops
)
2740 info
.ops
->type
->release_ops(info
.ops
);
2744 return ERR_PTR(err
);
2747 int nft_expr_clone(struct nft_expr
*dst
, struct nft_expr
*src
)
2751 if (src
->ops
->clone
) {
2752 dst
->ops
= src
->ops
;
2753 err
= src
->ops
->clone(dst
, src
);
2757 memcpy(dst
, src
, src
->ops
->size
);
2760 __module_get(src
->ops
->type
->owner
);
2765 void nft_expr_destroy(const struct nft_ctx
*ctx
, struct nft_expr
*expr
)
2767 nf_tables_expr_destroy(ctx
, expr
);
2775 static struct nft_rule
*__nft_rule_lookup(const struct nft_chain
*chain
,
2778 struct nft_rule
*rule
;
2780 // FIXME: this sucks
2781 list_for_each_entry_rcu(rule
, &chain
->rules
, list
) {
2782 if (handle
== rule
->handle
)
2786 return ERR_PTR(-ENOENT
);
2789 static struct nft_rule
*nft_rule_lookup(const struct nft_chain
*chain
,
2790 const struct nlattr
*nla
)
2793 return ERR_PTR(-EINVAL
);
2795 return __nft_rule_lookup(chain
, be64_to_cpu(nla_get_be64(nla
)));
2798 static const struct nla_policy nft_rule_policy
[NFTA_RULE_MAX
+ 1] = {
2799 [NFTA_RULE_TABLE
] = { .type
= NLA_STRING
,
2800 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
2801 [NFTA_RULE_CHAIN
] = { .type
= NLA_STRING
,
2802 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
2803 [NFTA_RULE_HANDLE
] = { .type
= NLA_U64
},
2804 [NFTA_RULE_EXPRESSIONS
] = { .type
= NLA_NESTED
},
2805 [NFTA_RULE_COMPAT
] = { .type
= NLA_NESTED
},
2806 [NFTA_RULE_POSITION
] = { .type
= NLA_U64
},
2807 [NFTA_RULE_USERDATA
] = { .type
= NLA_BINARY
,
2808 .len
= NFT_USERDATA_MAXLEN
},
2809 [NFTA_RULE_ID
] = { .type
= NLA_U32
},
2810 [NFTA_RULE_POSITION_ID
] = { .type
= NLA_U32
},
2811 [NFTA_RULE_CHAIN_ID
] = { .type
= NLA_U32
},
2814 static int nf_tables_fill_rule_info(struct sk_buff
*skb
, struct net
*net
,
2815 u32 portid
, u32 seq
, int event
,
2816 u32 flags
, int family
,
2817 const struct nft_table
*table
,
2818 const struct nft_chain
*chain
,
2819 const struct nft_rule
*rule
,
2820 const struct nft_rule
*prule
)
2822 struct nlmsghdr
*nlh
;
2823 struct nfgenmsg
*nfmsg
;
2824 const struct nft_expr
*expr
, *next
;
2825 struct nlattr
*list
;
2826 u16 type
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
2828 nlh
= nlmsg_put(skb
, portid
, seq
, type
, sizeof(struct nfgenmsg
), flags
);
2830 goto nla_put_failure
;
2832 nfmsg
= nlmsg_data(nlh
);
2833 nfmsg
->nfgen_family
= family
;
2834 nfmsg
->version
= NFNETLINK_V0
;
2835 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
2837 if (nla_put_string(skb
, NFTA_RULE_TABLE
, table
->name
))
2838 goto nla_put_failure
;
2839 if (nla_put_string(skb
, NFTA_RULE_CHAIN
, chain
->name
))
2840 goto nla_put_failure
;
2841 if (nla_put_be64(skb
, NFTA_RULE_HANDLE
, cpu_to_be64(rule
->handle
),
2843 goto nla_put_failure
;
2845 if (event
!= NFT_MSG_DELRULE
&& prule
) {
2846 if (nla_put_be64(skb
, NFTA_RULE_POSITION
,
2847 cpu_to_be64(prule
->handle
),
2849 goto nla_put_failure
;
2852 list
= nla_nest_start_noflag(skb
, NFTA_RULE_EXPRESSIONS
);
2854 goto nla_put_failure
;
2855 nft_rule_for_each_expr(expr
, next
, rule
) {
2856 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
, expr
) < 0)
2857 goto nla_put_failure
;
2859 nla_nest_end(skb
, list
);
2862 struct nft_userdata
*udata
= nft_userdata(rule
);
2863 if (nla_put(skb
, NFTA_RULE_USERDATA
, udata
->len
+ 1,
2865 goto nla_put_failure
;
2868 nlmsg_end(skb
, nlh
);
2872 nlmsg_trim(skb
, nlh
);
2876 static void nf_tables_rule_notify(const struct nft_ctx
*ctx
,
2877 const struct nft_rule
*rule
, int event
)
2879 struct sk_buff
*skb
;
2883 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
2886 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
2890 err
= nf_tables_fill_rule_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
2891 event
, 0, ctx
->family
, ctx
->table
,
2892 ctx
->chain
, rule
, NULL
);
2898 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
2901 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
2904 struct nft_rule_dump_ctx
{
2909 static int __nf_tables_dump_rules(struct sk_buff
*skb
,
2911 struct netlink_callback
*cb
,
2912 const struct nft_table
*table
,
2913 const struct nft_chain
*chain
)
2915 struct net
*net
= sock_net(skb
->sk
);
2916 const struct nft_rule
*rule
, *prule
;
2917 unsigned int s_idx
= cb
->args
[0];
2920 list_for_each_entry_rcu(rule
, &chain
->rules
, list
) {
2921 if (!nft_is_active(net
, rule
))
2926 memset(&cb
->args
[1], 0,
2927 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
2929 if (nf_tables_fill_rule_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
2932 NLM_F_MULTI
| NLM_F_APPEND
,
2934 table
, chain
, rule
, prule
) < 0)
2937 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
2946 static int nf_tables_dump_rules(struct sk_buff
*skb
,
2947 struct netlink_callback
*cb
)
2949 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
2950 const struct nft_rule_dump_ctx
*ctx
= cb
->data
;
2951 struct nft_table
*table
;
2952 const struct nft_chain
*chain
;
2953 unsigned int idx
= 0;
2954 struct net
*net
= sock_net(skb
->sk
);
2955 int family
= nfmsg
->nfgen_family
;
2958 cb
->seq
= net
->nft
.base_seq
;
2960 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
2961 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
2964 if (ctx
&& ctx
->table
&& strcmp(ctx
->table
, table
->name
) != 0)
2967 if (ctx
&& ctx
->table
&& ctx
->chain
) {
2968 struct rhlist_head
*list
, *tmp
;
2970 list
= rhltable_lookup(&table
->chains_ht
, ctx
->chain
,
2971 nft_chain_ht_params
);
2975 rhl_for_each_entry_rcu(chain
, tmp
, list
, rhlhead
) {
2976 if (!nft_is_active(net
, chain
))
2978 __nf_tables_dump_rules(skb
, &idx
,
2985 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
2986 if (__nf_tables_dump_rules(skb
, &idx
, cb
, table
, chain
))
2990 if (ctx
&& ctx
->table
)
3000 static int nf_tables_dump_rules_start(struct netlink_callback
*cb
)
3002 const struct nlattr
* const *nla
= cb
->data
;
3003 struct nft_rule_dump_ctx
*ctx
= NULL
;
3005 if (nla
[NFTA_RULE_TABLE
] || nla
[NFTA_RULE_CHAIN
]) {
3006 ctx
= kzalloc(sizeof(*ctx
), GFP_ATOMIC
);
3010 if (nla
[NFTA_RULE_TABLE
]) {
3011 ctx
->table
= nla_strdup(nla
[NFTA_RULE_TABLE
],
3018 if (nla
[NFTA_RULE_CHAIN
]) {
3019 ctx
->chain
= nla_strdup(nla
[NFTA_RULE_CHAIN
],
3033 static int nf_tables_dump_rules_done(struct netlink_callback
*cb
)
3035 struct nft_rule_dump_ctx
*ctx
= cb
->data
;
3045 /* called with rcu_read_lock held */
3046 static int nf_tables_getrule(struct net
*net
, struct sock
*nlsk
,
3047 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3048 const struct nlattr
* const nla
[],
3049 struct netlink_ext_ack
*extack
)
3051 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3052 u8 genmask
= nft_genmask_cur(net
);
3053 const struct nft_chain
*chain
;
3054 const struct nft_rule
*rule
;
3055 struct nft_table
*table
;
3056 struct sk_buff
*skb2
;
3057 int family
= nfmsg
->nfgen_family
;
3060 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
3061 struct netlink_dump_control c
= {
3062 .start
= nf_tables_dump_rules_start
,
3063 .dump
= nf_tables_dump_rules
,
3064 .done
= nf_tables_dump_rules_done
,
3065 .module
= THIS_MODULE
,
3066 .data
= (void *)nla
,
3069 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
3072 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
, 0);
3073 if (IS_ERR(table
)) {
3074 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3075 return PTR_ERR(table
);
3078 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
], genmask
);
3079 if (IS_ERR(chain
)) {
3080 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3081 return PTR_ERR(chain
);
3084 rule
= nft_rule_lookup(chain
, nla
[NFTA_RULE_HANDLE
]);
3086 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3087 return PTR_ERR(rule
);
3090 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
3094 err
= nf_tables_fill_rule_info(skb2
, net
, NETLINK_CB(skb
).portid
,
3095 nlh
->nlmsg_seq
, NFT_MSG_NEWRULE
, 0,
3096 family
, table
, chain
, rule
, NULL
);
3098 goto err_fill_rule_info
;
3100 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
3107 static void nf_tables_rule_destroy(const struct nft_ctx
*ctx
,
3108 struct nft_rule
*rule
)
3110 struct nft_expr
*expr
, *next
;
3113 * Careful: some expressions might not be initialized in case this
3114 * is called on error from nf_tables_newrule().
3116 expr
= nft_expr_first(rule
);
3117 while (nft_expr_more(rule
, expr
)) {
3118 next
= nft_expr_next(expr
);
3119 nf_tables_expr_destroy(ctx
, expr
);
3125 void nf_tables_rule_release(const struct nft_ctx
*ctx
, struct nft_rule
*rule
)
3127 nft_rule_expr_deactivate(ctx
, rule
, NFT_TRANS_RELEASE
);
3128 nf_tables_rule_destroy(ctx
, rule
);
3131 int nft_chain_validate(const struct nft_ctx
*ctx
, const struct nft_chain
*chain
)
3133 struct nft_expr
*expr
, *last
;
3134 const struct nft_data
*data
;
3135 struct nft_rule
*rule
;
3138 if (ctx
->level
== NFT_JUMP_STACK_SIZE
)
3141 list_for_each_entry(rule
, &chain
->rules
, list
) {
3142 if (!nft_is_active_next(ctx
->net
, rule
))
3145 nft_rule_for_each_expr(expr
, last
, rule
) {
3146 if (!expr
->ops
->validate
)
3149 err
= expr
->ops
->validate(ctx
, expr
, &data
);
3157 EXPORT_SYMBOL_GPL(nft_chain_validate
);
3159 static int nft_table_validate(struct net
*net
, const struct nft_table
*table
)
3161 struct nft_chain
*chain
;
3162 struct nft_ctx ctx
= {
3164 .family
= table
->family
,
3168 list_for_each_entry(chain
, &table
->chains
, list
) {
3169 if (!nft_is_base_chain(chain
))
3173 err
= nft_chain_validate(&ctx
, chain
);
3181 static struct nft_rule
*nft_rule_lookup_byid(const struct net
*net
,
3182 const struct nlattr
*nla
);
3184 #define NFT_RULE_MAXEXPRS 128
3186 static int nf_tables_newrule(struct net
*net
, struct sock
*nlsk
,
3187 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3188 const struct nlattr
* const nla
[],
3189 struct netlink_ext_ack
*extack
)
3191 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3192 u8 genmask
= nft_genmask_next(net
);
3193 struct nft_expr_info
*info
= NULL
;
3194 int family
= nfmsg
->nfgen_family
;
3195 struct nft_flow_rule
*flow
;
3196 struct nft_table
*table
;
3197 struct nft_chain
*chain
;
3198 struct nft_rule
*rule
, *old_rule
= NULL
;
3199 struct nft_userdata
*udata
;
3200 struct nft_trans
*trans
= NULL
;
3201 struct nft_expr
*expr
;
3204 unsigned int size
, i
, n
, ulen
= 0, usize
= 0;
3206 u64 handle
, pos_handle
;
3208 lockdep_assert_held(&net
->nft
.commit_mutex
);
3210 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
,
3211 NETLINK_CB(skb
).portid
);
3212 if (IS_ERR(table
)) {
3213 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3214 return PTR_ERR(table
);
3217 if (nla
[NFTA_RULE_CHAIN
]) {
3218 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
],
3220 if (IS_ERR(chain
)) {
3221 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3222 return PTR_ERR(chain
);
3224 if (nft_chain_is_bound(chain
))
3227 } else if (nla
[NFTA_RULE_CHAIN_ID
]) {
3228 chain
= nft_chain_lookup_byid(net
, nla
[NFTA_RULE_CHAIN_ID
]);
3229 if (IS_ERR(chain
)) {
3230 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN_ID
]);
3231 return PTR_ERR(chain
);
3237 if (nla
[NFTA_RULE_HANDLE
]) {
3238 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_HANDLE
]));
3239 rule
= __nft_rule_lookup(chain
, handle
);
3241 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3242 return PTR_ERR(rule
);
3245 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
3246 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3249 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
3254 if (!(nlh
->nlmsg_flags
& NLM_F_CREATE
) ||
3255 nlh
->nlmsg_flags
& NLM_F_REPLACE
)
3257 handle
= nf_tables_alloc_handle(table
);
3259 if (chain
->use
== UINT_MAX
)
3262 if (nla
[NFTA_RULE_POSITION
]) {
3263 pos_handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_POSITION
]));
3264 old_rule
= __nft_rule_lookup(chain
, pos_handle
);
3265 if (IS_ERR(old_rule
)) {
3266 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_POSITION
]);
3267 return PTR_ERR(old_rule
);
3269 } else if (nla
[NFTA_RULE_POSITION_ID
]) {
3270 old_rule
= nft_rule_lookup_byid(net
, nla
[NFTA_RULE_POSITION_ID
]);
3271 if (IS_ERR(old_rule
)) {
3272 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_POSITION_ID
]);
3273 return PTR_ERR(old_rule
);
3278 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
3282 if (nla
[NFTA_RULE_EXPRESSIONS
]) {
3283 info
= kvmalloc_array(NFT_RULE_MAXEXPRS
,
3284 sizeof(struct nft_expr_info
),
3289 nla_for_each_nested(tmp
, nla
[NFTA_RULE_EXPRESSIONS
], rem
) {
3291 if (nla_type(tmp
) != NFTA_LIST_ELEM
)
3293 if (n
== NFT_RULE_MAXEXPRS
)
3295 err
= nf_tables_expr_parse(&ctx
, tmp
, &info
[n
]);
3298 size
+= info
[n
].ops
->size
;
3302 /* Check for overflow of dlen field */
3304 if (size
>= 1 << 12)
3307 if (nla
[NFTA_RULE_USERDATA
]) {
3308 ulen
= nla_len(nla
[NFTA_RULE_USERDATA
]);
3310 usize
= sizeof(struct nft_userdata
) + ulen
;
3314 rule
= kzalloc(sizeof(*rule
) + size
+ usize
, GFP_KERNEL
);
3318 nft_activate_next(net
, rule
);
3320 rule
->handle
= handle
;
3322 rule
->udata
= ulen
? 1 : 0;
3325 udata
= nft_userdata(rule
);
3326 udata
->len
= ulen
- 1;
3327 nla_memcpy(udata
->data
, nla
[NFTA_RULE_USERDATA
], ulen
);
3330 expr
= nft_expr_first(rule
);
3331 for (i
= 0; i
< n
; i
++) {
3332 err
= nf_tables_newexpr(&ctx
, &info
[i
], expr
);
3334 NL_SET_BAD_ATTR(extack
, info
[i
].attr
);
3338 if (info
[i
].ops
->validate
)
3339 nft_validate_state_update(net
, NFT_VALIDATE_NEED
);
3342 expr
= nft_expr_next(expr
);
3345 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
) {
3346 trans
= nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
);
3347 if (trans
== NULL
) {
3351 err
= nft_delrule(&ctx
, old_rule
);
3353 nft_trans_destroy(trans
);
3357 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
3359 trans
= nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
);
3365 if (nlh
->nlmsg_flags
& NLM_F_APPEND
) {
3367 list_add_rcu(&rule
->list
, &old_rule
->list
);
3369 list_add_tail_rcu(&rule
->list
, &chain
->rules
);
3372 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
3374 list_add_rcu(&rule
->list
, &chain
->rules
);
3380 if (net
->nft
.validate_state
== NFT_VALIDATE_DO
)
3381 return nft_table_validate(net
, table
);
3383 if (chain
->flags
& NFT_CHAIN_HW_OFFLOAD
) {
3384 flow
= nft_flow_rule_create(net
, rule
);
3386 return PTR_ERR(flow
);
3388 nft_trans_flow_rule(trans
) = flow
;
3393 nf_tables_rule_release(&ctx
, rule
);
3395 for (i
= 0; i
< n
; i
++) {
3397 module_put(info
[i
].ops
->type
->owner
);
3398 if (info
[i
].ops
->type
->release_ops
)
3399 info
[i
].ops
->type
->release_ops(info
[i
].ops
);
3406 static struct nft_rule
*nft_rule_lookup_byid(const struct net
*net
,
3407 const struct nlattr
*nla
)
3409 u32 id
= ntohl(nla_get_be32(nla
));
3410 struct nft_trans
*trans
;
3412 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
3413 struct nft_rule
*rule
= nft_trans_rule(trans
);
3415 if (trans
->msg_type
== NFT_MSG_NEWRULE
&&
3416 id
== nft_trans_rule_id(trans
))
3419 return ERR_PTR(-ENOENT
);
3422 static int nf_tables_delrule(struct net
*net
, struct sock
*nlsk
,
3423 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3424 const struct nlattr
* const nla
[],
3425 struct netlink_ext_ack
*extack
)
3427 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3428 u8 genmask
= nft_genmask_next(net
);
3429 struct nft_table
*table
;
3430 struct nft_chain
*chain
= NULL
;
3431 struct nft_rule
*rule
;
3432 int family
= nfmsg
->nfgen_family
, err
= 0;
3435 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
,
3436 NETLINK_CB(skb
).portid
);
3437 if (IS_ERR(table
)) {
3438 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3439 return PTR_ERR(table
);
3442 if (nla
[NFTA_RULE_CHAIN
]) {
3443 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
],
3445 if (IS_ERR(chain
)) {
3446 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3447 return PTR_ERR(chain
);
3449 if (nft_chain_is_bound(chain
))
3453 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
3456 if (nla
[NFTA_RULE_HANDLE
]) {
3457 rule
= nft_rule_lookup(chain
, nla
[NFTA_RULE_HANDLE
]);
3459 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3460 return PTR_ERR(rule
);
3463 err
= nft_delrule(&ctx
, rule
);
3464 } else if (nla
[NFTA_RULE_ID
]) {
3465 rule
= nft_rule_lookup_byid(net
, nla
[NFTA_RULE_ID
]);
3467 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_ID
]);
3468 return PTR_ERR(rule
);
3471 err
= nft_delrule(&ctx
, rule
);
3473 err
= nft_delrule_by_chain(&ctx
);
3476 list_for_each_entry(chain
, &table
->chains
, list
) {
3477 if (!nft_is_active_next(net
, chain
))
3481 err
= nft_delrule_by_chain(&ctx
);
3493 static const struct nft_set_type
*nft_set_types
[] = {
3494 &nft_set_hash_fast_type
,
3496 &nft_set_rhash_type
,
3497 &nft_set_bitmap_type
,
3498 &nft_set_rbtree_type
,
3499 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
3500 &nft_set_pipapo_avx2_type
,
3502 &nft_set_pipapo_type
,
3505 #define NFT_SET_FEATURES (NFT_SET_INTERVAL | NFT_SET_MAP | \
3506 NFT_SET_TIMEOUT | NFT_SET_OBJECT | \
3509 static bool nft_set_ops_candidate(const struct nft_set_type
*type
, u32 flags
)
3511 return (flags
& type
->features
) == (flags
& NFT_SET_FEATURES
);
3515 * Select a set implementation based on the data characteristics and the
3516 * given policy. The total memory use might not be known if no size is
3517 * given, in that case the amount of memory per element is used.
3519 static const struct nft_set_ops
*
3520 nft_select_set_ops(const struct nft_ctx
*ctx
,
3521 const struct nlattr
* const nla
[],
3522 const struct nft_set_desc
*desc
,
3523 enum nft_set_policies policy
)
3525 const struct nft_set_ops
*ops
, *bops
;
3526 struct nft_set_estimate est
, best
;
3527 const struct nft_set_type
*type
;
3531 lockdep_assert_held(&ctx
->net
->nft
.commit_mutex
);
3532 lockdep_nfnl_nft_mutex_not_held();
3534 if (nla
[NFTA_SET_FLAGS
] != NULL
)
3535 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
3542 for (i
= 0; i
< ARRAY_SIZE(nft_set_types
); i
++) {
3543 type
= nft_set_types
[i
];
3546 if (!nft_set_ops_candidate(type
, flags
))
3548 if (!ops
->estimate(desc
, flags
, &est
))
3552 case NFT_SET_POL_PERFORMANCE
:
3553 if (est
.lookup
< best
.lookup
)
3555 if (est
.lookup
== best
.lookup
&&
3556 est
.space
< best
.space
)
3559 case NFT_SET_POL_MEMORY
:
3561 if (est
.space
< best
.space
)
3563 if (est
.space
== best
.space
&&
3564 est
.lookup
< best
.lookup
)
3566 } else if (est
.size
< best
.size
|| !bops
) {
3581 return ERR_PTR(-EOPNOTSUPP
);
3584 static const struct nla_policy nft_set_policy
[NFTA_SET_MAX
+ 1] = {
3585 [NFTA_SET_TABLE
] = { .type
= NLA_STRING
,
3586 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
3587 [NFTA_SET_NAME
] = { .type
= NLA_STRING
,
3588 .len
= NFT_SET_MAXNAMELEN
- 1 },
3589 [NFTA_SET_FLAGS
] = { .type
= NLA_U32
},
3590 [NFTA_SET_KEY_TYPE
] = { .type
= NLA_U32
},
3591 [NFTA_SET_KEY_LEN
] = { .type
= NLA_U32
},
3592 [NFTA_SET_DATA_TYPE
] = { .type
= NLA_U32
},
3593 [NFTA_SET_DATA_LEN
] = { .type
= NLA_U32
},
3594 [NFTA_SET_POLICY
] = { .type
= NLA_U32
},
3595 [NFTA_SET_DESC
] = { .type
= NLA_NESTED
},
3596 [NFTA_SET_ID
] = { .type
= NLA_U32
},
3597 [NFTA_SET_TIMEOUT
] = { .type
= NLA_U64
},
3598 [NFTA_SET_GC_INTERVAL
] = { .type
= NLA_U32
},
3599 [NFTA_SET_USERDATA
] = { .type
= NLA_BINARY
,
3600 .len
= NFT_USERDATA_MAXLEN
},
3601 [NFTA_SET_OBJ_TYPE
] = { .type
= NLA_U32
},
3602 [NFTA_SET_HANDLE
] = { .type
= NLA_U64
},
3603 [NFTA_SET_EXPR
] = { .type
= NLA_NESTED
},
3604 [NFTA_SET_EXPRESSIONS
] = { .type
= NLA_NESTED
},
3607 static const struct nla_policy nft_set_desc_policy
[NFTA_SET_DESC_MAX
+ 1] = {
3608 [NFTA_SET_DESC_SIZE
] = { .type
= NLA_U32
},
3609 [NFTA_SET_DESC_CONCAT
] = { .type
= NLA_NESTED
},
3612 static int nft_ctx_init_from_setattr(struct nft_ctx
*ctx
, struct net
*net
,
3613 const struct sk_buff
*skb
,
3614 const struct nlmsghdr
*nlh
,
3615 const struct nlattr
* const nla
[],
3616 struct netlink_ext_ack
*extack
,
3617 u8 genmask
, u32 nlpid
)
3619 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3620 int family
= nfmsg
->nfgen_family
;
3621 struct nft_table
*table
= NULL
;
3623 if (nla
[NFTA_SET_TABLE
] != NULL
) {
3624 table
= nft_table_lookup(net
, nla
[NFTA_SET_TABLE
], family
,
3626 if (IS_ERR(table
)) {
3627 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_TABLE
]);
3628 return PTR_ERR(table
);
3632 nft_ctx_init(ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
3636 static struct nft_set
*nft_set_lookup(const struct nft_table
*table
,
3637 const struct nlattr
*nla
, u8 genmask
)
3639 struct nft_set
*set
;
3642 return ERR_PTR(-EINVAL
);
3644 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
3645 if (!nla_strcmp(nla
, set
->name
) &&
3646 nft_active_genmask(set
, genmask
))
3649 return ERR_PTR(-ENOENT
);
3652 static struct nft_set
*nft_set_lookup_byhandle(const struct nft_table
*table
,
3653 const struct nlattr
*nla
,
3656 struct nft_set
*set
;
3658 list_for_each_entry(set
, &table
->sets
, list
) {
3659 if (be64_to_cpu(nla_get_be64(nla
)) == set
->handle
&&
3660 nft_active_genmask(set
, genmask
))
3663 return ERR_PTR(-ENOENT
);
3666 static struct nft_set
*nft_set_lookup_byid(const struct net
*net
,
3667 const struct nlattr
*nla
, u8 genmask
)
3669 struct nft_trans
*trans
;
3670 u32 id
= ntohl(nla_get_be32(nla
));
3672 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
3673 if (trans
->msg_type
== NFT_MSG_NEWSET
) {
3674 struct nft_set
*set
= nft_trans_set(trans
);
3676 if (id
== nft_trans_set_id(trans
) &&
3677 nft_active_genmask(set
, genmask
))
3681 return ERR_PTR(-ENOENT
);
3684 struct nft_set
*nft_set_lookup_global(const struct net
*net
,
3685 const struct nft_table
*table
,
3686 const struct nlattr
*nla_set_name
,
3687 const struct nlattr
*nla_set_id
,
3690 struct nft_set
*set
;
3692 set
= nft_set_lookup(table
, nla_set_name
, genmask
);
3697 set
= nft_set_lookup_byid(net
, nla_set_id
, genmask
);
3701 EXPORT_SYMBOL_GPL(nft_set_lookup_global
);
3703 static int nf_tables_set_alloc_name(struct nft_ctx
*ctx
, struct nft_set
*set
,
3706 const struct nft_set
*i
;
3708 unsigned long *inuse
;
3709 unsigned int n
= 0, min
= 0;
3711 p
= strchr(name
, '%');
3713 if (p
[1] != 'd' || strchr(p
+ 2, '%'))
3716 inuse
= (unsigned long *)get_zeroed_page(GFP_KERNEL
);
3720 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
3723 if (!nft_is_active_next(ctx
->net
, set
))
3725 if (!sscanf(i
->name
, name
, &tmp
))
3727 if (tmp
< min
|| tmp
>= min
+ BITS_PER_BYTE
* PAGE_SIZE
)
3730 set_bit(tmp
- min
, inuse
);
3733 n
= find_first_zero_bit(inuse
, BITS_PER_BYTE
* PAGE_SIZE
);
3734 if (n
>= BITS_PER_BYTE
* PAGE_SIZE
) {
3735 min
+= BITS_PER_BYTE
* PAGE_SIZE
;
3736 memset(inuse
, 0, PAGE_SIZE
);
3739 free_page((unsigned long)inuse
);
3742 set
->name
= kasprintf(GFP_KERNEL
, name
, min
+ n
);
3746 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
3747 if (!nft_is_active_next(ctx
->net
, i
))
3749 if (!strcmp(set
->name
, i
->name
)) {
3758 int nf_msecs_to_jiffies64(const struct nlattr
*nla
, u64
*result
)
3760 u64 ms
= be64_to_cpu(nla_get_be64(nla
));
3761 u64 max
= (u64
)(~((u64
)0));
3763 max
= div_u64(max
, NSEC_PER_MSEC
);
3767 ms
*= NSEC_PER_MSEC
;
3768 *result
= nsecs_to_jiffies64(ms
);
3772 __be64
nf_jiffies64_to_msecs(u64 input
)
3774 return cpu_to_be64(jiffies64_to_msecs(input
));
3777 static int nf_tables_fill_set_concat(struct sk_buff
*skb
,
3778 const struct nft_set
*set
)
3780 struct nlattr
*concat
, *field
;
3783 concat
= nla_nest_start_noflag(skb
, NFTA_SET_DESC_CONCAT
);
3787 for (i
= 0; i
< set
->field_count
; i
++) {
3788 field
= nla_nest_start_noflag(skb
, NFTA_LIST_ELEM
);
3792 if (nla_put_be32(skb
, NFTA_SET_FIELD_LEN
,
3793 htonl(set
->field_len
[i
])))
3796 nla_nest_end(skb
, field
);
3799 nla_nest_end(skb
, concat
);
3804 static int nf_tables_fill_set(struct sk_buff
*skb
, const struct nft_ctx
*ctx
,
3805 const struct nft_set
*set
, u16 event
, u16 flags
)
3807 struct nfgenmsg
*nfmsg
;
3808 struct nlmsghdr
*nlh
;
3809 u32 portid
= ctx
->portid
;
3810 struct nlattr
*nest
;
3814 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
3815 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
3818 goto nla_put_failure
;
3820 nfmsg
= nlmsg_data(nlh
);
3821 nfmsg
->nfgen_family
= ctx
->family
;
3822 nfmsg
->version
= NFNETLINK_V0
;
3823 nfmsg
->res_id
= htons(ctx
->net
->nft
.base_seq
& 0xffff);
3825 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
3826 goto nla_put_failure
;
3827 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
3828 goto nla_put_failure
;
3829 if (nla_put_be64(skb
, NFTA_SET_HANDLE
, cpu_to_be64(set
->handle
),
3831 goto nla_put_failure
;
3832 if (set
->flags
!= 0)
3833 if (nla_put_be32(skb
, NFTA_SET_FLAGS
, htonl(set
->flags
)))
3834 goto nla_put_failure
;
3836 if (nla_put_be32(skb
, NFTA_SET_KEY_TYPE
, htonl(set
->ktype
)))
3837 goto nla_put_failure
;
3838 if (nla_put_be32(skb
, NFTA_SET_KEY_LEN
, htonl(set
->klen
)))
3839 goto nla_put_failure
;
3840 if (set
->flags
& NFT_SET_MAP
) {
3841 if (nla_put_be32(skb
, NFTA_SET_DATA_TYPE
, htonl(set
->dtype
)))
3842 goto nla_put_failure
;
3843 if (nla_put_be32(skb
, NFTA_SET_DATA_LEN
, htonl(set
->dlen
)))
3844 goto nla_put_failure
;
3846 if (set
->flags
& NFT_SET_OBJECT
&&
3847 nla_put_be32(skb
, NFTA_SET_OBJ_TYPE
, htonl(set
->objtype
)))
3848 goto nla_put_failure
;
3851 nla_put_be64(skb
, NFTA_SET_TIMEOUT
,
3852 nf_jiffies64_to_msecs(set
->timeout
),
3854 goto nla_put_failure
;
3856 nla_put_be32(skb
, NFTA_SET_GC_INTERVAL
, htonl(set
->gc_int
)))
3857 goto nla_put_failure
;
3859 if (set
->policy
!= NFT_SET_POL_PERFORMANCE
) {
3860 if (nla_put_be32(skb
, NFTA_SET_POLICY
, htonl(set
->policy
)))
3861 goto nla_put_failure
;
3865 nla_put(skb
, NFTA_SET_USERDATA
, set
->udlen
, set
->udata
))
3866 goto nla_put_failure
;
3868 nest
= nla_nest_start_noflag(skb
, NFTA_SET_DESC
);
3870 goto nla_put_failure
;
3872 nla_put_be32(skb
, NFTA_SET_DESC_SIZE
, htonl(set
->size
)))
3873 goto nla_put_failure
;
3875 if (set
->field_count
> 1 &&
3876 nf_tables_fill_set_concat(skb
, set
))
3877 goto nla_put_failure
;
3879 nla_nest_end(skb
, nest
);
3881 if (set
->num_exprs
== 1) {
3882 nest
= nla_nest_start_noflag(skb
, NFTA_SET_EXPR
);
3883 if (nf_tables_fill_expr_info(skb
, set
->exprs
[0]) < 0)
3884 goto nla_put_failure
;
3886 nla_nest_end(skb
, nest
);
3887 } else if (set
->num_exprs
> 1) {
3888 nest
= nla_nest_start_noflag(skb
, NFTA_SET_EXPRESSIONS
);
3890 goto nla_put_failure
;
3892 for (i
= 0; i
< set
->num_exprs
; i
++) {
3893 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
,
3895 goto nla_put_failure
;
3897 nla_nest_end(skb
, nest
);
3900 nlmsg_end(skb
, nlh
);
3904 nlmsg_trim(skb
, nlh
);
3908 static void nf_tables_set_notify(const struct nft_ctx
*ctx
,
3909 const struct nft_set
*set
, int event
,
3912 struct sk_buff
*skb
;
3913 u32 portid
= ctx
->portid
;
3917 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
3920 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp_flags
);
3924 err
= nf_tables_fill_set(skb
, ctx
, set
, event
, 0);
3930 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
3933 nfnetlink_set_err(ctx
->net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
3936 static int nf_tables_dump_sets(struct sk_buff
*skb
, struct netlink_callback
*cb
)
3938 const struct nft_set
*set
;
3939 unsigned int idx
, s_idx
= cb
->args
[0];
3940 struct nft_table
*table
, *cur_table
= (struct nft_table
*)cb
->args
[2];
3941 struct net
*net
= sock_net(skb
->sk
);
3942 struct nft_ctx
*ctx
= cb
->data
, ctx_set
;
3948 cb
->seq
= net
->nft
.base_seq
;
3950 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
3951 if (ctx
->family
!= NFPROTO_UNSPEC
&&
3952 ctx
->family
!= table
->family
)
3955 if (ctx
->table
&& ctx
->table
!= table
)
3959 if (cur_table
!= table
)
3965 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
3968 if (!nft_is_active(net
, set
))
3972 ctx_set
.table
= table
;
3973 ctx_set
.family
= table
->family
;
3975 if (nf_tables_fill_set(skb
, &ctx_set
, set
,
3979 cb
->args
[2] = (unsigned long) table
;
3982 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
3995 static int nf_tables_dump_sets_start(struct netlink_callback
*cb
)
3997 struct nft_ctx
*ctx_dump
= NULL
;
3999 ctx_dump
= kmemdup(cb
->data
, sizeof(*ctx_dump
), GFP_ATOMIC
);
4000 if (ctx_dump
== NULL
)
4003 cb
->data
= ctx_dump
;
4007 static int nf_tables_dump_sets_done(struct netlink_callback
*cb
)
4013 /* called with rcu_read_lock held */
4014 static int nf_tables_getset(struct net
*net
, struct sock
*nlsk
,
4015 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4016 const struct nlattr
* const nla
[],
4017 struct netlink_ext_ack
*extack
)
4019 u8 genmask
= nft_genmask_cur(net
);
4020 const struct nft_set
*set
;
4022 struct sk_buff
*skb2
;
4023 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4026 /* Verify existence before starting dump */
4027 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
4032 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
4033 struct netlink_dump_control c
= {
4034 .start
= nf_tables_dump_sets_start
,
4035 .dump
= nf_tables_dump_sets
,
4036 .done
= nf_tables_dump_sets_done
,
4038 .module
= THIS_MODULE
,
4041 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
4044 /* Only accept unspec with dump */
4045 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
4046 return -EAFNOSUPPORT
;
4047 if (!nla
[NFTA_SET_TABLE
])
4050 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_NAME
], genmask
);
4052 return PTR_ERR(set
);
4054 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
4058 err
= nf_tables_fill_set(skb2
, &ctx
, set
, NFT_MSG_NEWSET
, 0);
4060 goto err_fill_set_info
;
4062 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
4069 static const struct nla_policy nft_concat_policy
[NFTA_SET_FIELD_MAX
+ 1] = {
4070 [NFTA_SET_FIELD_LEN
] = { .type
= NLA_U32
},
4073 static int nft_set_desc_concat_parse(const struct nlattr
*attr
,
4074 struct nft_set_desc
*desc
)
4076 struct nlattr
*tb
[NFTA_SET_FIELD_MAX
+ 1];
4080 err
= nla_parse_nested_deprecated(tb
, NFTA_SET_FIELD_MAX
, attr
,
4081 nft_concat_policy
, NULL
);
4085 if (!tb
[NFTA_SET_FIELD_LEN
])
4088 len
= ntohl(nla_get_be32(tb
[NFTA_SET_FIELD_LEN
]));
4090 if (len
* BITS_PER_BYTE
/ 32 > NFT_REG32_COUNT
)
4093 desc
->field_len
[desc
->field_count
++] = len
;
4098 static int nft_set_desc_concat(struct nft_set_desc
*desc
,
4099 const struct nlattr
*nla
)
4101 struct nlattr
*attr
;
4104 nla_for_each_nested(attr
, nla
, rem
) {
4105 if (nla_type(attr
) != NFTA_LIST_ELEM
)
4108 err
= nft_set_desc_concat_parse(attr
, desc
);
4116 static int nf_tables_set_desc_parse(struct nft_set_desc
*desc
,
4117 const struct nlattr
*nla
)
4119 struct nlattr
*da
[NFTA_SET_DESC_MAX
+ 1];
4122 err
= nla_parse_nested_deprecated(da
, NFTA_SET_DESC_MAX
, nla
,
4123 nft_set_desc_policy
, NULL
);
4127 if (da
[NFTA_SET_DESC_SIZE
] != NULL
)
4128 desc
->size
= ntohl(nla_get_be32(da
[NFTA_SET_DESC_SIZE
]));
4129 if (da
[NFTA_SET_DESC_CONCAT
])
4130 err
= nft_set_desc_concat(desc
, da
[NFTA_SET_DESC_CONCAT
]);
4135 static int nf_tables_newset(struct net
*net
, struct sock
*nlsk
,
4136 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4137 const struct nlattr
* const nla
[],
4138 struct netlink_ext_ack
*extack
)
4140 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4141 u8 genmask
= nft_genmask_next(net
);
4142 int family
= nfmsg
->nfgen_family
;
4143 const struct nft_set_ops
*ops
;
4144 struct nft_expr
*expr
= NULL
;
4145 struct nft_table
*table
;
4146 struct nft_set
*set
;
4151 u32 ktype
, dtype
, flags
, policy
, gc_int
, objtype
;
4152 struct nft_set_desc desc
;
4153 unsigned char *udata
;
4158 if (nla
[NFTA_SET_TABLE
] == NULL
||
4159 nla
[NFTA_SET_NAME
] == NULL
||
4160 nla
[NFTA_SET_KEY_LEN
] == NULL
||
4161 nla
[NFTA_SET_ID
] == NULL
)
4164 memset(&desc
, 0, sizeof(desc
));
4166 ktype
= NFT_DATA_VALUE
;
4167 if (nla
[NFTA_SET_KEY_TYPE
] != NULL
) {
4168 ktype
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_TYPE
]));
4169 if ((ktype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
)
4173 desc
.klen
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_LEN
]));
4174 if (desc
.klen
== 0 || desc
.klen
> NFT_DATA_VALUE_MAXLEN
)
4178 if (nla
[NFTA_SET_FLAGS
] != NULL
) {
4179 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
4180 if (flags
& ~(NFT_SET_ANONYMOUS
| NFT_SET_CONSTANT
|
4181 NFT_SET_INTERVAL
| NFT_SET_TIMEOUT
|
4182 NFT_SET_MAP
| NFT_SET_EVAL
|
4183 NFT_SET_OBJECT
| NFT_SET_CONCAT
| NFT_SET_EXPR
))
4185 /* Only one of these operations is supported */
4186 if ((flags
& (NFT_SET_MAP
| NFT_SET_OBJECT
)) ==
4187 (NFT_SET_MAP
| NFT_SET_OBJECT
))
4189 if ((flags
& (NFT_SET_EVAL
| NFT_SET_OBJECT
)) ==
4190 (NFT_SET_EVAL
| NFT_SET_OBJECT
))
4195 if (nla
[NFTA_SET_DATA_TYPE
] != NULL
) {
4196 if (!(flags
& NFT_SET_MAP
))
4199 dtype
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_TYPE
]));
4200 if ((dtype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
&&
4201 dtype
!= NFT_DATA_VERDICT
)
4204 if (dtype
!= NFT_DATA_VERDICT
) {
4205 if (nla
[NFTA_SET_DATA_LEN
] == NULL
)
4207 desc
.dlen
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_LEN
]));
4208 if (desc
.dlen
== 0 || desc
.dlen
> NFT_DATA_VALUE_MAXLEN
)
4211 desc
.dlen
= sizeof(struct nft_verdict
);
4212 } else if (flags
& NFT_SET_MAP
)
4215 if (nla
[NFTA_SET_OBJ_TYPE
] != NULL
) {
4216 if (!(flags
& NFT_SET_OBJECT
))
4219 objtype
= ntohl(nla_get_be32(nla
[NFTA_SET_OBJ_TYPE
]));
4220 if (objtype
== NFT_OBJECT_UNSPEC
||
4221 objtype
> NFT_OBJECT_MAX
)
4223 } else if (flags
& NFT_SET_OBJECT
)
4226 objtype
= NFT_OBJECT_UNSPEC
;
4229 if (nla
[NFTA_SET_TIMEOUT
] != NULL
) {
4230 if (!(flags
& NFT_SET_TIMEOUT
))
4233 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_TIMEOUT
], &timeout
);
4238 if (nla
[NFTA_SET_GC_INTERVAL
] != NULL
) {
4239 if (!(flags
& NFT_SET_TIMEOUT
))
4241 gc_int
= ntohl(nla_get_be32(nla
[NFTA_SET_GC_INTERVAL
]));
4244 policy
= NFT_SET_POL_PERFORMANCE
;
4245 if (nla
[NFTA_SET_POLICY
] != NULL
)
4246 policy
= ntohl(nla_get_be32(nla
[NFTA_SET_POLICY
]));
4248 if (nla
[NFTA_SET_DESC
] != NULL
) {
4249 err
= nf_tables_set_desc_parse(&desc
, nla
[NFTA_SET_DESC
]);
4254 if (nla
[NFTA_SET_EXPR
] || nla
[NFTA_SET_EXPRESSIONS
])
4257 table
= nft_table_lookup(net
, nla
[NFTA_SET_TABLE
], family
, genmask
,
4258 NETLINK_CB(skb
).portid
);
4259 if (IS_ERR(table
)) {
4260 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_TABLE
]);
4261 return PTR_ERR(table
);
4264 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
4266 set
= nft_set_lookup(table
, nla
[NFTA_SET_NAME
], genmask
);
4268 if (PTR_ERR(set
) != -ENOENT
) {
4269 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_NAME
]);
4270 return PTR_ERR(set
);
4273 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
4274 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_NAME
]);
4277 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
4283 if (!(nlh
->nlmsg_flags
& NLM_F_CREATE
))
4286 ops
= nft_select_set_ops(&ctx
, nla
, &desc
, policy
);
4288 return PTR_ERR(ops
);
4291 if (nla
[NFTA_SET_USERDATA
])
4292 udlen
= nla_len(nla
[NFTA_SET_USERDATA
]);
4295 if (ops
->privsize
!= NULL
)
4296 size
= ops
->privsize(nla
, &desc
);
4298 set
= kvzalloc(sizeof(*set
) + size
+ udlen
, GFP_KERNEL
);
4302 name
= nla_strdup(nla
[NFTA_SET_NAME
], GFP_KERNEL
);
4308 err
= nf_tables_set_alloc_name(&ctx
, set
, name
);
4311 goto err_set_alloc_name
;
4313 if (nla
[NFTA_SET_EXPR
]) {
4314 expr
= nft_set_elem_expr_alloc(&ctx
, set
, nla
[NFTA_SET_EXPR
]);
4316 err
= PTR_ERR(expr
);
4317 goto err_set_alloc_name
;
4319 set
->exprs
[0] = expr
;
4321 } else if (nla
[NFTA_SET_EXPRESSIONS
]) {
4322 struct nft_expr
*expr
;
4326 if (!(flags
& NFT_SET_EXPR
)) {
4328 goto err_set_alloc_name
;
4331 nla_for_each_nested(tmp
, nla
[NFTA_SET_EXPRESSIONS
], left
) {
4332 if (i
== NFT_SET_EXPR_MAX
) {
4336 if (nla_type(tmp
) != NFTA_LIST_ELEM
) {
4340 expr
= nft_set_elem_expr_alloc(&ctx
, set
, tmp
);
4342 err
= PTR_ERR(expr
);
4345 set
->exprs
[i
++] = expr
;
4352 udata
= set
->data
+ size
;
4353 nla_memcpy(udata
, nla
[NFTA_SET_USERDATA
], udlen
);
4356 INIT_LIST_HEAD(&set
->bindings
);
4358 write_pnet(&set
->net
, net
);
4361 set
->klen
= desc
.klen
;
4363 set
->objtype
= objtype
;
4364 set
->dlen
= desc
.dlen
;
4366 set
->size
= desc
.size
;
4367 set
->policy
= policy
;
4370 set
->timeout
= timeout
;
4371 set
->gc_int
= gc_int
;
4372 set
->handle
= nf_tables_alloc_handle(table
);
4374 set
->field_count
= desc
.field_count
;
4375 for (i
= 0; i
< desc
.field_count
; i
++)
4376 set
->field_len
[i
] = desc
.field_len
[i
];
4378 err
= ops
->init(set
, &desc
, nla
);
4382 err
= nft_trans_set_add(&ctx
, NFT_MSG_NEWSET
, set
);
4386 list_add_tail_rcu(&set
->list
, &table
->sets
);
4393 for (i
= 0; i
< set
->num_exprs
; i
++)
4394 nft_expr_destroy(&ctx
, set
->exprs
[i
]);
4402 static void nft_set_destroy(const struct nft_ctx
*ctx
, struct nft_set
*set
)
4406 if (WARN_ON(set
->use
> 0))
4409 for (i
= 0; i
< set
->num_exprs
; i
++)
4410 nft_expr_destroy(ctx
, set
->exprs
[i
]);
4412 set
->ops
->destroy(set
);
4417 static int nf_tables_delset(struct net
*net
, struct sock
*nlsk
,
4418 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4419 const struct nlattr
* const nla
[],
4420 struct netlink_ext_ack
*extack
)
4422 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4423 u8 genmask
= nft_genmask_next(net
);
4424 const struct nlattr
*attr
;
4425 struct nft_set
*set
;
4429 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
4430 return -EAFNOSUPPORT
;
4431 if (nla
[NFTA_SET_TABLE
] == NULL
)
4434 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
4435 genmask
, NETLINK_CB(skb
).portid
);
4439 if (nla
[NFTA_SET_HANDLE
]) {
4440 attr
= nla
[NFTA_SET_HANDLE
];
4441 set
= nft_set_lookup_byhandle(ctx
.table
, attr
, genmask
);
4443 attr
= nla
[NFTA_SET_NAME
];
4444 set
= nft_set_lookup(ctx
.table
, attr
, genmask
);
4448 NL_SET_BAD_ATTR(extack
, attr
);
4449 return PTR_ERR(set
);
4452 (nlh
->nlmsg_flags
& NLM_F_NONREC
&& atomic_read(&set
->nelems
) > 0)) {
4453 NL_SET_BAD_ATTR(extack
, attr
);
4457 return nft_delset(&ctx
, set
);
4460 static int nft_validate_register_store(const struct nft_ctx
*ctx
,
4461 enum nft_registers reg
,
4462 const struct nft_data
*data
,
4463 enum nft_data_types type
,
4466 static int nf_tables_bind_check_setelem(const struct nft_ctx
*ctx
,
4467 struct nft_set
*set
,
4468 const struct nft_set_iter
*iter
,
4469 struct nft_set_elem
*elem
)
4471 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4472 enum nft_registers dreg
;
4474 dreg
= nft_type_to_reg(set
->dtype
);
4475 return nft_validate_register_store(ctx
, dreg
, nft_set_ext_data(ext
),
4476 set
->dtype
== NFT_DATA_VERDICT
?
4477 NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
4481 int nf_tables_bind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4482 struct nft_set_binding
*binding
)
4484 struct nft_set_binding
*i
;
4485 struct nft_set_iter iter
;
4487 if (set
->use
== UINT_MAX
)
4490 if (!list_empty(&set
->bindings
) && nft_set_is_anonymous(set
))
4493 if (binding
->flags
& NFT_SET_MAP
) {
4494 /* If the set is already bound to the same chain all
4495 * jumps are already validated for that chain.
4497 list_for_each_entry(i
, &set
->bindings
, list
) {
4498 if (i
->flags
& NFT_SET_MAP
&&
4499 i
->chain
== binding
->chain
)
4503 iter
.genmask
= nft_genmask_next(ctx
->net
);
4507 iter
.fn
= nf_tables_bind_check_setelem
;
4509 set
->ops
->walk(ctx
, set
, &iter
);
4514 binding
->chain
= ctx
->chain
;
4515 list_add_tail_rcu(&binding
->list
, &set
->bindings
);
4516 nft_set_trans_bind(ctx
, set
);
4521 EXPORT_SYMBOL_GPL(nf_tables_bind_set
);
4523 static void nf_tables_unbind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4524 struct nft_set_binding
*binding
, bool event
)
4526 list_del_rcu(&binding
->list
);
4528 if (list_empty(&set
->bindings
) && nft_set_is_anonymous(set
)) {
4529 list_del_rcu(&set
->list
);
4531 nf_tables_set_notify(ctx
, set
, NFT_MSG_DELSET
,
4536 void nf_tables_deactivate_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4537 struct nft_set_binding
*binding
,
4538 enum nft_trans_phase phase
)
4541 case NFT_TRANS_PREPARE
:
4544 case NFT_TRANS_ABORT
:
4545 case NFT_TRANS_RELEASE
:
4549 nf_tables_unbind_set(ctx
, set
, binding
,
4550 phase
== NFT_TRANS_COMMIT
);
4553 EXPORT_SYMBOL_GPL(nf_tables_deactivate_set
);
4555 void nf_tables_destroy_set(const struct nft_ctx
*ctx
, struct nft_set
*set
)
4557 if (list_empty(&set
->bindings
) && nft_set_is_anonymous(set
))
4558 nft_set_destroy(ctx
, set
);
4560 EXPORT_SYMBOL_GPL(nf_tables_destroy_set
);
4562 const struct nft_set_ext_type nft_set_ext_types
[] = {
4563 [NFT_SET_EXT_KEY
] = {
4564 .align
= __alignof__(u32
),
4566 [NFT_SET_EXT_DATA
] = {
4567 .align
= __alignof__(u32
),
4569 [NFT_SET_EXT_EXPRESSIONS
] = {
4570 .align
= __alignof__(struct nft_set_elem_expr
),
4572 [NFT_SET_EXT_OBJREF
] = {
4573 .len
= sizeof(struct nft_object
*),
4574 .align
= __alignof__(struct nft_object
*),
4576 [NFT_SET_EXT_FLAGS
] = {
4578 .align
= __alignof__(u8
),
4580 [NFT_SET_EXT_TIMEOUT
] = {
4582 .align
= __alignof__(u64
),
4584 [NFT_SET_EXT_EXPIRATION
] = {
4586 .align
= __alignof__(u64
),
4588 [NFT_SET_EXT_USERDATA
] = {
4589 .len
= sizeof(struct nft_userdata
),
4590 .align
= __alignof__(struct nft_userdata
),
4592 [NFT_SET_EXT_KEY_END
] = {
4593 .align
= __alignof__(u32
),
4601 static const struct nla_policy nft_set_elem_policy
[NFTA_SET_ELEM_MAX
+ 1] = {
4602 [NFTA_SET_ELEM_KEY
] = { .type
= NLA_NESTED
},
4603 [NFTA_SET_ELEM_DATA
] = { .type
= NLA_NESTED
},
4604 [NFTA_SET_ELEM_FLAGS
] = { .type
= NLA_U32
},
4605 [NFTA_SET_ELEM_TIMEOUT
] = { .type
= NLA_U64
},
4606 [NFTA_SET_ELEM_EXPIRATION
] = { .type
= NLA_U64
},
4607 [NFTA_SET_ELEM_USERDATA
] = { .type
= NLA_BINARY
,
4608 .len
= NFT_USERDATA_MAXLEN
},
4609 [NFTA_SET_ELEM_EXPR
] = { .type
= NLA_NESTED
},
4610 [NFTA_SET_ELEM_OBJREF
] = { .type
= NLA_STRING
,
4611 .len
= NFT_OBJ_MAXNAMELEN
- 1 },
4612 [NFTA_SET_ELEM_KEY_END
] = { .type
= NLA_NESTED
},
4613 [NFTA_SET_ELEM_EXPRESSIONS
] = { .type
= NLA_NESTED
},
4616 static const struct nla_policy nft_set_elem_list_policy
[NFTA_SET_ELEM_LIST_MAX
+ 1] = {
4617 [NFTA_SET_ELEM_LIST_TABLE
] = { .type
= NLA_STRING
,
4618 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
4619 [NFTA_SET_ELEM_LIST_SET
] = { .type
= NLA_STRING
,
4620 .len
= NFT_SET_MAXNAMELEN
- 1 },
4621 [NFTA_SET_ELEM_LIST_ELEMENTS
] = { .type
= NLA_NESTED
},
4622 [NFTA_SET_ELEM_LIST_SET_ID
] = { .type
= NLA_U32
},
4625 static int nft_ctx_init_from_elemattr(struct nft_ctx
*ctx
, struct net
*net
,
4626 const struct sk_buff
*skb
,
4627 const struct nlmsghdr
*nlh
,
4628 const struct nlattr
* const nla
[],
4629 struct netlink_ext_ack
*extack
,
4630 u8 genmask
, u32 nlpid
)
4632 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4633 int family
= nfmsg
->nfgen_family
;
4634 struct nft_table
*table
;
4636 table
= nft_table_lookup(net
, nla
[NFTA_SET_ELEM_LIST_TABLE
], family
,
4638 if (IS_ERR(table
)) {
4639 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_ELEM_LIST_TABLE
]);
4640 return PTR_ERR(table
);
4643 nft_ctx_init(ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
4647 static int nft_set_elem_expr_dump(struct sk_buff
*skb
,
4648 const struct nft_set
*set
,
4649 const struct nft_set_ext
*ext
)
4651 struct nft_set_elem_expr
*elem_expr
;
4652 u32 size
, num_exprs
= 0;
4653 struct nft_expr
*expr
;
4654 struct nlattr
*nest
;
4656 elem_expr
= nft_set_ext_expr(ext
);
4657 nft_setelem_expr_foreach(expr
, elem_expr
, size
)
4660 if (num_exprs
== 1) {
4661 expr
= nft_setelem_expr_at(elem_expr
, 0);
4662 if (nft_expr_dump(skb
, NFTA_SET_ELEM_EXPR
, expr
) < 0)
4666 } else if (num_exprs
> 1) {
4667 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_EXPRESSIONS
);
4669 goto nla_put_failure
;
4671 nft_setelem_expr_foreach(expr
, elem_expr
, size
) {
4672 expr
= nft_setelem_expr_at(elem_expr
, size
);
4673 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
, expr
) < 0)
4674 goto nla_put_failure
;
4676 nla_nest_end(skb
, nest
);
4684 static int nf_tables_fill_setelem(struct sk_buff
*skb
,
4685 const struct nft_set
*set
,
4686 const struct nft_set_elem
*elem
)
4688 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4689 unsigned char *b
= skb_tail_pointer(skb
);
4690 struct nlattr
*nest
;
4692 nest
= nla_nest_start_noflag(skb
, NFTA_LIST_ELEM
);
4694 goto nla_put_failure
;
4696 if (nft_data_dump(skb
, NFTA_SET_ELEM_KEY
, nft_set_ext_key(ext
),
4697 NFT_DATA_VALUE
, set
->klen
) < 0)
4698 goto nla_put_failure
;
4700 if (nft_set_ext_exists(ext
, NFT_SET_EXT_KEY_END
) &&
4701 nft_data_dump(skb
, NFTA_SET_ELEM_KEY_END
, nft_set_ext_key_end(ext
),
4702 NFT_DATA_VALUE
, set
->klen
) < 0)
4703 goto nla_put_failure
;
4705 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
4706 nft_data_dump(skb
, NFTA_SET_ELEM_DATA
, nft_set_ext_data(ext
),
4707 set
->dtype
== NFT_DATA_VERDICT
? NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
4709 goto nla_put_failure
;
4711 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
) &&
4712 nft_set_elem_expr_dump(skb
, set
, ext
))
4713 goto nla_put_failure
;
4715 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
4716 nla_put_string(skb
, NFTA_SET_ELEM_OBJREF
,
4717 (*nft_set_ext_obj(ext
))->key
.name
) < 0)
4718 goto nla_put_failure
;
4720 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
4721 nla_put_be32(skb
, NFTA_SET_ELEM_FLAGS
,
4722 htonl(*nft_set_ext_flags(ext
))))
4723 goto nla_put_failure
;
4725 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
) &&
4726 nla_put_be64(skb
, NFTA_SET_ELEM_TIMEOUT
,
4727 nf_jiffies64_to_msecs(*nft_set_ext_timeout(ext
)),
4729 goto nla_put_failure
;
4731 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
)) {
4732 u64 expires
, now
= get_jiffies_64();
4734 expires
= *nft_set_ext_expiration(ext
);
4735 if (time_before64(now
, expires
))
4740 if (nla_put_be64(skb
, NFTA_SET_ELEM_EXPIRATION
,
4741 nf_jiffies64_to_msecs(expires
),
4743 goto nla_put_failure
;
4746 if (nft_set_ext_exists(ext
, NFT_SET_EXT_USERDATA
)) {
4747 struct nft_userdata
*udata
;
4749 udata
= nft_set_ext_userdata(ext
);
4750 if (nla_put(skb
, NFTA_SET_ELEM_USERDATA
,
4751 udata
->len
+ 1, udata
->data
))
4752 goto nla_put_failure
;
4755 nla_nest_end(skb
, nest
);
4763 struct nft_set_dump_args
{
4764 const struct netlink_callback
*cb
;
4765 struct nft_set_iter iter
;
4766 struct sk_buff
*skb
;
4769 static int nf_tables_dump_setelem(const struct nft_ctx
*ctx
,
4770 struct nft_set
*set
,
4771 const struct nft_set_iter
*iter
,
4772 struct nft_set_elem
*elem
)
4774 struct nft_set_dump_args
*args
;
4776 args
= container_of(iter
, struct nft_set_dump_args
, iter
);
4777 return nf_tables_fill_setelem(args
->skb
, set
, elem
);
4780 struct nft_set_dump_ctx
{
4781 const struct nft_set
*set
;
4785 static int nf_tables_dump_set(struct sk_buff
*skb
, struct netlink_callback
*cb
)
4787 struct nft_set_dump_ctx
*dump_ctx
= cb
->data
;
4788 struct net
*net
= sock_net(skb
->sk
);
4789 struct nft_table
*table
;
4790 struct nft_set
*set
;
4791 struct nft_set_dump_args args
;
4792 bool set_found
= false;
4793 struct nfgenmsg
*nfmsg
;
4794 struct nlmsghdr
*nlh
;
4795 struct nlattr
*nest
;
4800 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
4801 if (dump_ctx
->ctx
.family
!= NFPROTO_UNSPEC
&&
4802 dump_ctx
->ctx
.family
!= table
->family
)
4805 if (table
!= dump_ctx
->ctx
.table
)
4808 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
4809 if (set
== dump_ctx
->set
) {
4822 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWSETELEM
);
4823 portid
= NETLINK_CB(cb
->skb
).portid
;
4824 seq
= cb
->nlh
->nlmsg_seq
;
4826 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
4829 goto nla_put_failure
;
4831 nfmsg
= nlmsg_data(nlh
);
4832 nfmsg
->nfgen_family
= table
->family
;
4833 nfmsg
->version
= NFNETLINK_V0
;
4834 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
4836 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_TABLE
, table
->name
))
4837 goto nla_put_failure
;
4838 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_SET
, set
->name
))
4839 goto nla_put_failure
;
4841 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
4843 goto nla_put_failure
;
4847 args
.iter
.genmask
= nft_genmask_cur(net
);
4848 args
.iter
.skip
= cb
->args
[0];
4849 args
.iter
.count
= 0;
4851 args
.iter
.fn
= nf_tables_dump_setelem
;
4852 set
->ops
->walk(&dump_ctx
->ctx
, set
, &args
.iter
);
4855 nla_nest_end(skb
, nest
);
4856 nlmsg_end(skb
, nlh
);
4858 if (args
.iter
.err
&& args
.iter
.err
!= -EMSGSIZE
)
4859 return args
.iter
.err
;
4860 if (args
.iter
.count
== cb
->args
[0])
4863 cb
->args
[0] = args
.iter
.count
;
4871 static int nf_tables_dump_set_start(struct netlink_callback
*cb
)
4873 struct nft_set_dump_ctx
*dump_ctx
= cb
->data
;
4875 cb
->data
= kmemdup(dump_ctx
, sizeof(*dump_ctx
), GFP_ATOMIC
);
4877 return cb
->data
? 0 : -ENOMEM
;
4880 static int nf_tables_dump_set_done(struct netlink_callback
*cb
)
4886 static int nf_tables_fill_setelem_info(struct sk_buff
*skb
,
4887 const struct nft_ctx
*ctx
, u32 seq
,
4888 u32 portid
, int event
, u16 flags
,
4889 const struct nft_set
*set
,
4890 const struct nft_set_elem
*elem
)
4892 struct nfgenmsg
*nfmsg
;
4893 struct nlmsghdr
*nlh
;
4894 struct nlattr
*nest
;
4897 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
4898 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
4901 goto nla_put_failure
;
4903 nfmsg
= nlmsg_data(nlh
);
4904 nfmsg
->nfgen_family
= ctx
->family
;
4905 nfmsg
->version
= NFNETLINK_V0
;
4906 nfmsg
->res_id
= htons(ctx
->net
->nft
.base_seq
& 0xffff);
4908 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
4909 goto nla_put_failure
;
4910 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
4911 goto nla_put_failure
;
4913 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
4915 goto nla_put_failure
;
4917 err
= nf_tables_fill_setelem(skb
, set
, elem
);
4919 goto nla_put_failure
;
4921 nla_nest_end(skb
, nest
);
4923 nlmsg_end(skb
, nlh
);
4927 nlmsg_trim(skb
, nlh
);
4931 static int nft_setelem_parse_flags(const struct nft_set
*set
,
4932 const struct nlattr
*attr
, u32
*flags
)
4937 *flags
= ntohl(nla_get_be32(attr
));
4938 if (*flags
& ~NFT_SET_ELEM_INTERVAL_END
)
4940 if (!(set
->flags
& NFT_SET_INTERVAL
) &&
4941 *flags
& NFT_SET_ELEM_INTERVAL_END
)
4947 static int nft_setelem_parse_key(struct nft_ctx
*ctx
, struct nft_set
*set
,
4948 struct nft_data
*key
, struct nlattr
*attr
)
4950 struct nft_data_desc desc
;
4953 err
= nft_data_init(ctx
, key
, NFT_DATA_VALUE_MAXLEN
, &desc
, attr
);
4957 if (desc
.type
!= NFT_DATA_VALUE
|| desc
.len
!= set
->klen
) {
4958 nft_data_release(key
, desc
.type
);
4965 static int nft_setelem_parse_data(struct nft_ctx
*ctx
, struct nft_set
*set
,
4966 struct nft_data_desc
*desc
,
4967 struct nft_data
*data
,
4968 struct nlattr
*attr
)
4972 err
= nft_data_init(ctx
, data
, NFT_DATA_VALUE_MAXLEN
, desc
, attr
);
4976 if (desc
->type
!= NFT_DATA_VERDICT
&& desc
->len
!= set
->dlen
) {
4977 nft_data_release(data
, desc
->type
);
4984 static int nft_get_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
4985 const struct nlattr
*attr
)
4987 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
4988 struct nft_set_elem elem
;
4989 struct sk_buff
*skb
;
4994 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
4995 nft_set_elem_policy
, NULL
);
4999 if (!nla
[NFTA_SET_ELEM_KEY
])
5002 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5006 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5007 nla
[NFTA_SET_ELEM_KEY
]);
5011 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5012 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5013 nla
[NFTA_SET_ELEM_KEY_END
]);
5018 priv
= set
->ops
->get(ctx
->net
, set
, &elem
, flags
);
5020 return PTR_ERR(priv
);
5025 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_ATOMIC
);
5029 err
= nf_tables_fill_setelem_info(skb
, ctx
, ctx
->seq
, ctx
->portid
,
5030 NFT_MSG_NEWSETELEM
, 0, set
, &elem
);
5032 goto err_fill_setelem
;
5034 return nfnetlink_unicast(skb
, ctx
->net
, ctx
->portid
);
5041 /* called with rcu_read_lock held */
5042 static int nf_tables_getsetelem(struct net
*net
, struct sock
*nlsk
,
5043 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5044 const struct nlattr
* const nla
[],
5045 struct netlink_ext_ack
*extack
)
5047 u8 genmask
= nft_genmask_cur(net
);
5048 struct nft_set
*set
;
5049 struct nlattr
*attr
;
5053 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5054 genmask
, NETLINK_CB(skb
).portid
);
5058 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
], genmask
);
5060 return PTR_ERR(set
);
5062 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
5063 struct netlink_dump_control c
= {
5064 .start
= nf_tables_dump_set_start
,
5065 .dump
= nf_tables_dump_set
,
5066 .done
= nf_tables_dump_set_done
,
5067 .module
= THIS_MODULE
,
5069 struct nft_set_dump_ctx dump_ctx
= {
5075 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
5078 if (!nla
[NFTA_SET_ELEM_LIST_ELEMENTS
])
5081 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5082 err
= nft_get_set_elem(&ctx
, set
, attr
);
5090 static void nf_tables_setelem_notify(const struct nft_ctx
*ctx
,
5091 const struct nft_set
*set
,
5092 const struct nft_set_elem
*elem
,
5093 int event
, u16 flags
)
5095 struct net
*net
= ctx
->net
;
5096 u32 portid
= ctx
->portid
;
5097 struct sk_buff
*skb
;
5100 if (!ctx
->report
&& !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
5103 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
5107 err
= nf_tables_fill_setelem_info(skb
, ctx
, 0, portid
, event
, flags
,
5114 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
5117 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
5120 static struct nft_trans
*nft_trans_elem_alloc(struct nft_ctx
*ctx
,
5122 struct nft_set
*set
)
5124 struct nft_trans
*trans
;
5126 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_elem
));
5130 nft_trans_elem_set(trans
) = set
;
5134 struct nft_expr
*nft_set_elem_expr_alloc(const struct nft_ctx
*ctx
,
5135 const struct nft_set
*set
,
5136 const struct nlattr
*attr
)
5138 struct nft_expr
*expr
;
5141 expr
= nft_expr_init(ctx
, attr
);
5146 if (!(expr
->ops
->type
->flags
& NFT_EXPR_STATEFUL
))
5147 goto err_set_elem_expr
;
5149 if (expr
->ops
->type
->flags
& NFT_EXPR_GC
) {
5150 if (set
->flags
& NFT_SET_TIMEOUT
)
5151 goto err_set_elem_expr
;
5152 if (!set
->ops
->gc_init
)
5153 goto err_set_elem_expr
;
5154 set
->ops
->gc_init(set
);
5160 nft_expr_destroy(ctx
, expr
);
5161 return ERR_PTR(err
);
5164 void *nft_set_elem_init(const struct nft_set
*set
,
5165 const struct nft_set_ext_tmpl
*tmpl
,
5166 const u32
*key
, const u32
*key_end
,
5167 const u32
*data
, u64 timeout
, u64 expiration
, gfp_t gfp
)
5169 struct nft_set_ext
*ext
;
5172 elem
= kzalloc(set
->ops
->elemsize
+ tmpl
->len
, gfp
);
5176 ext
= nft_set_elem_ext(set
, elem
);
5177 nft_set_ext_init(ext
, tmpl
);
5179 memcpy(nft_set_ext_key(ext
), key
, set
->klen
);
5180 if (nft_set_ext_exists(ext
, NFT_SET_EXT_KEY_END
))
5181 memcpy(nft_set_ext_key_end(ext
), key_end
, set
->klen
);
5182 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5183 memcpy(nft_set_ext_data(ext
), data
, set
->dlen
);
5184 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
)) {
5185 *nft_set_ext_expiration(ext
) = get_jiffies_64() + expiration
;
5186 if (expiration
== 0)
5187 *nft_set_ext_expiration(ext
) += timeout
;
5189 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
))
5190 *nft_set_ext_timeout(ext
) = timeout
;
5195 static void __nft_set_elem_expr_destroy(const struct nft_ctx
*ctx
,
5196 struct nft_expr
*expr
)
5198 if (expr
->ops
->destroy_clone
) {
5199 expr
->ops
->destroy_clone(ctx
, expr
);
5200 module_put(expr
->ops
->type
->owner
);
5202 nf_tables_expr_destroy(ctx
, expr
);
5206 static void nft_set_elem_expr_destroy(const struct nft_ctx
*ctx
,
5207 struct nft_set_elem_expr
*elem_expr
)
5209 struct nft_expr
*expr
;
5212 nft_setelem_expr_foreach(expr
, elem_expr
, size
)
5213 __nft_set_elem_expr_destroy(ctx
, expr
);
5216 void nft_set_elem_destroy(const struct nft_set
*set
, void *elem
,
5219 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
5220 struct nft_ctx ctx
= {
5221 .net
= read_pnet(&set
->net
),
5222 .family
= set
->table
->family
,
5225 nft_data_release(nft_set_ext_key(ext
), NFT_DATA_VALUE
);
5226 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5227 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
5228 if (destroy_expr
&& nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
))
5229 nft_set_elem_expr_destroy(&ctx
, nft_set_ext_expr(ext
));
5231 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5232 (*nft_set_ext_obj(ext
))->use
--;
5235 EXPORT_SYMBOL_GPL(nft_set_elem_destroy
);
5237 /* Only called from commit path, nft_set_elem_deactivate() already deals with
5238 * the refcounting from the preparation phase.
5240 static void nf_tables_set_elem_destroy(const struct nft_ctx
*ctx
,
5241 const struct nft_set
*set
, void *elem
)
5243 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
5245 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
))
5246 nft_set_elem_expr_destroy(ctx
, nft_set_ext_expr(ext
));
5251 int nft_set_elem_expr_clone(const struct nft_ctx
*ctx
, struct nft_set
*set
,
5252 struct nft_expr
*expr_array
[])
5254 struct nft_expr
*expr
;
5257 for (i
= 0; i
< set
->num_exprs
; i
++) {
5258 expr
= kzalloc(set
->exprs
[i
]->ops
->size
, GFP_KERNEL
);
5262 err
= nft_expr_clone(expr
, set
->exprs
[i
]);
5264 nft_expr_destroy(ctx
, expr
);
5267 expr_array
[i
] = expr
;
5273 for (k
= i
- 1; k
>= 0; k
--)
5274 nft_expr_destroy(ctx
, expr_array
[k
]);
5279 static void nft_set_elem_expr_setup(const struct nft_set_ext
*ext
, int i
,
5280 struct nft_expr
*expr_array
[])
5282 struct nft_set_elem_expr
*elem_expr
= nft_set_ext_expr(ext
);
5283 struct nft_expr
*expr
= nft_setelem_expr_at(elem_expr
, elem_expr
->size
);
5285 memcpy(expr
, expr_array
[i
], expr_array
[i
]->ops
->size
);
5286 elem_expr
->size
+= expr_array
[i
]->ops
->size
;
5287 kfree(expr_array
[i
]);
5288 expr_array
[i
] = NULL
;
5291 static int nft_add_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
5292 const struct nlattr
*attr
, u32 nlmsg_flags
)
5294 struct nft_expr
*expr_array
[NFT_SET_EXPR_MAX
] = {};
5295 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
5296 u8 genmask
= nft_genmask_next(ctx
->net
);
5297 u32 flags
= 0, size
= 0, num_exprs
= 0;
5298 struct nft_set_ext_tmpl tmpl
;
5299 struct nft_set_ext
*ext
, *ext2
;
5300 struct nft_set_elem elem
;
5301 struct nft_set_binding
*binding
;
5302 struct nft_object
*obj
= NULL
;
5303 struct nft_userdata
*udata
;
5304 struct nft_data_desc desc
;
5305 enum nft_registers dreg
;
5306 struct nft_trans
*trans
;
5312 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
5313 nft_set_elem_policy
, NULL
);
5317 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
5320 nft_set_ext_prepare(&tmpl
);
5322 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5326 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
5328 if (set
->flags
& NFT_SET_MAP
) {
5329 if (nla
[NFTA_SET_ELEM_DATA
] == NULL
&&
5330 !(flags
& NFT_SET_ELEM_INTERVAL_END
))
5333 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
5337 if ((flags
& NFT_SET_ELEM_INTERVAL_END
) &&
5338 (nla
[NFTA_SET_ELEM_DATA
] ||
5339 nla
[NFTA_SET_ELEM_OBJREF
] ||
5340 nla
[NFTA_SET_ELEM_TIMEOUT
] ||
5341 nla
[NFTA_SET_ELEM_EXPIRATION
] ||
5342 nla
[NFTA_SET_ELEM_USERDATA
] ||
5343 nla
[NFTA_SET_ELEM_EXPR
] ||
5344 nla
[NFTA_SET_ELEM_EXPRESSIONS
]))
5348 if (nla
[NFTA_SET_ELEM_TIMEOUT
] != NULL
) {
5349 if (!(set
->flags
& NFT_SET_TIMEOUT
))
5351 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_ELEM_TIMEOUT
],
5355 } else if (set
->flags
& NFT_SET_TIMEOUT
) {
5356 timeout
= set
->timeout
;
5360 if (nla
[NFTA_SET_ELEM_EXPIRATION
] != NULL
) {
5361 if (!(set
->flags
& NFT_SET_TIMEOUT
))
5363 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_ELEM_EXPIRATION
],
5369 if (nla
[NFTA_SET_ELEM_EXPR
]) {
5370 struct nft_expr
*expr
;
5372 if (set
->num_exprs
&& set
->num_exprs
!= 1)
5375 expr
= nft_set_elem_expr_alloc(ctx
, set
,
5376 nla
[NFTA_SET_ELEM_EXPR
]);
5378 return PTR_ERR(expr
);
5380 expr_array
[0] = expr
;
5383 if (set
->num_exprs
&& set
->exprs
[0]->ops
!= expr
->ops
) {
5385 goto err_set_elem_expr
;
5387 } else if (nla
[NFTA_SET_ELEM_EXPRESSIONS
]) {
5388 struct nft_expr
*expr
;
5393 nla_for_each_nested(tmp
, nla
[NFTA_SET_ELEM_EXPRESSIONS
], left
) {
5394 if (i
== NFT_SET_EXPR_MAX
||
5395 (set
->num_exprs
&& set
->num_exprs
== i
)) {
5397 goto err_set_elem_expr
;
5399 if (nla_type(tmp
) != NFTA_LIST_ELEM
) {
5401 goto err_set_elem_expr
;
5403 expr
= nft_set_elem_expr_alloc(ctx
, set
, tmp
);
5405 err
= PTR_ERR(expr
);
5406 goto err_set_elem_expr
;
5408 expr_array
[i
] = expr
;
5411 if (set
->num_exprs
&& expr
->ops
!= set
->exprs
[i
]->ops
) {
5413 goto err_set_elem_expr
;
5417 if (set
->num_exprs
&& set
->num_exprs
!= i
) {
5419 goto err_set_elem_expr
;
5421 } else if (set
->num_exprs
> 0) {
5422 err
= nft_set_elem_expr_clone(ctx
, set
, expr_array
);
5424 goto err_set_elem_expr_clone
;
5426 num_exprs
= set
->num_exprs
;
5429 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5430 nla
[NFTA_SET_ELEM_KEY
]);
5432 goto err_set_elem_expr
;
5434 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, set
->klen
);
5436 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5437 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5438 nla
[NFTA_SET_ELEM_KEY_END
]);
5442 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY_END
, set
->klen
);
5446 nft_set_ext_add(&tmpl
, NFT_SET_EXT_EXPIRATION
);
5447 if (timeout
!= set
->timeout
)
5448 nft_set_ext_add(&tmpl
, NFT_SET_EXT_TIMEOUT
);
5452 for (i
= 0; i
< num_exprs
; i
++)
5453 size
+= expr_array
[i
]->ops
->size
;
5455 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_EXPRESSIONS
,
5456 sizeof(struct nft_set_elem_expr
) +
5460 if (nla
[NFTA_SET_ELEM_OBJREF
] != NULL
) {
5461 if (!(set
->flags
& NFT_SET_OBJECT
)) {
5463 goto err_parse_key_end
;
5465 obj
= nft_obj_lookup(ctx
->net
, ctx
->table
,
5466 nla
[NFTA_SET_ELEM_OBJREF
],
5467 set
->objtype
, genmask
);
5470 goto err_parse_key_end
;
5472 nft_set_ext_add(&tmpl
, NFT_SET_EXT_OBJREF
);
5475 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
) {
5476 err
= nft_setelem_parse_data(ctx
, set
, &desc
, &elem
.data
.val
,
5477 nla
[NFTA_SET_ELEM_DATA
]);
5479 goto err_parse_key_end
;
5481 dreg
= nft_type_to_reg(set
->dtype
);
5482 list_for_each_entry(binding
, &set
->bindings
, list
) {
5483 struct nft_ctx bind_ctx
= {
5485 .family
= ctx
->family
,
5486 .table
= ctx
->table
,
5487 .chain
= (struct nft_chain
*)binding
->chain
,
5490 if (!(binding
->flags
& NFT_SET_MAP
))
5493 err
= nft_validate_register_store(&bind_ctx
, dreg
,
5495 desc
.type
, desc
.len
);
5497 goto err_parse_data
;
5499 if (desc
.type
== NFT_DATA_VERDICT
&&
5500 (elem
.data
.val
.verdict
.code
== NFT_GOTO
||
5501 elem
.data
.val
.verdict
.code
== NFT_JUMP
))
5502 nft_validate_state_update(ctx
->net
,
5506 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_DATA
, desc
.len
);
5509 /* The full maximum length of userdata can exceed the maximum
5510 * offset value (U8_MAX) for following extensions, therefor it
5511 * must be the last extension added.
5514 if (nla
[NFTA_SET_ELEM_USERDATA
] != NULL
) {
5515 ulen
= nla_len(nla
[NFTA_SET_ELEM_USERDATA
]);
5517 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_USERDATA
,
5522 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
,
5523 elem
.key_end
.val
.data
, elem
.data
.val
.data
,
5524 timeout
, expiration
, GFP_KERNEL
);
5525 if (elem
.priv
== NULL
)
5526 goto err_parse_data
;
5528 ext
= nft_set_elem_ext(set
, elem
.priv
);
5530 *nft_set_ext_flags(ext
) = flags
;
5532 udata
= nft_set_ext_userdata(ext
);
5533 udata
->len
= ulen
- 1;
5534 nla_memcpy(&udata
->data
, nla
[NFTA_SET_ELEM_USERDATA
], ulen
);
5537 *nft_set_ext_obj(ext
) = obj
;
5540 for (i
= 0; i
< num_exprs
; i
++)
5541 nft_set_elem_expr_setup(ext
, i
, expr_array
);
5543 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_NEWSETELEM
, set
);
5547 ext
->genmask
= nft_genmask_cur(ctx
->net
) | NFT_SET_ELEM_BUSY_MASK
;
5548 err
= set
->ops
->insert(ctx
->net
, set
, &elem
, &ext2
);
5550 if (err
== -EEXIST
) {
5551 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) ^
5552 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) ||
5553 nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) ^
5554 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
))
5555 goto err_element_clash
;
5556 if ((nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
5557 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) &&
5558 memcmp(nft_set_ext_data(ext
),
5559 nft_set_ext_data(ext2
), set
->dlen
) != 0) ||
5560 (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
5561 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
) &&
5562 *nft_set_ext_obj(ext
) != *nft_set_ext_obj(ext2
)))
5563 goto err_element_clash
;
5564 else if (!(nlmsg_flags
& NLM_F_EXCL
))
5566 } else if (err
== -ENOTEMPTY
) {
5567 /* ENOTEMPTY reports overlapping between this element
5568 * and an existing one.
5572 goto err_element_clash
;
5576 !atomic_add_unless(&set
->nelems
, 1, set
->size
+ set
->ndeact
)) {
5581 nft_trans_elem(trans
) = elem
;
5582 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5586 set
->ops
->remove(ctx
->net
, set
, &elem
);
5593 nf_tables_set_elem_destroy(ctx
, set
, elem
.priv
);
5595 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
5596 nft_data_release(&elem
.data
.val
, desc
.type
);
5598 nft_data_release(&elem
.key_end
.val
, NFT_DATA_VALUE
);
5600 nft_data_release(&elem
.key
.val
, NFT_DATA_VALUE
);
5602 for (i
= 0; i
< num_exprs
&& expr_array
[i
]; i
++)
5603 nft_expr_destroy(ctx
, expr_array
[i
]);
5604 err_set_elem_expr_clone
:
5608 static int nf_tables_newsetelem(struct net
*net
, struct sock
*nlsk
,
5609 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5610 const struct nlattr
* const nla
[],
5611 struct netlink_ext_ack
*extack
)
5613 u8 genmask
= nft_genmask_next(net
);
5614 const struct nlattr
*attr
;
5615 struct nft_set
*set
;
5619 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
)
5622 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5623 genmask
, NETLINK_CB(skb
).portid
);
5627 set
= nft_set_lookup_global(net
, ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
],
5628 nla
[NFTA_SET_ELEM_LIST_SET_ID
], genmask
);
5630 return PTR_ERR(set
);
5632 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
5635 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5636 err
= nft_add_set_elem(&ctx
, set
, attr
, nlh
->nlmsg_flags
);
5641 if (net
->nft
.validate_state
== NFT_VALIDATE_DO
)
5642 return nft_table_validate(net
, ctx
.table
);
5648 * nft_data_hold - hold a nft_data item
5650 * @data: struct nft_data to release
5651 * @type: type of data
5653 * Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
5654 * NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
5655 * NFT_GOTO verdicts. This function must be called on active data objects
5656 * from the second phase of the commit protocol.
5658 void nft_data_hold(const struct nft_data
*data
, enum nft_data_types type
)
5660 struct nft_chain
*chain
;
5661 struct nft_rule
*rule
;
5663 if (type
== NFT_DATA_VERDICT
) {
5664 switch (data
->verdict
.code
) {
5667 chain
= data
->verdict
.chain
;
5670 if (!nft_chain_is_bound(chain
))
5673 chain
->table
->use
++;
5674 list_for_each_entry(rule
, &chain
->rules
, list
)
5677 nft_chain_add(chain
->table
, chain
);
5683 static void nft_set_elem_activate(const struct net
*net
,
5684 const struct nft_set
*set
,
5685 struct nft_set_elem
*elem
)
5687 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
5689 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5690 nft_data_hold(nft_set_ext_data(ext
), set
->dtype
);
5691 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5692 (*nft_set_ext_obj(ext
))->use
++;
5695 static void nft_set_elem_deactivate(const struct net
*net
,
5696 const struct nft_set
*set
,
5697 struct nft_set_elem
*elem
)
5699 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
5701 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5702 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
5703 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5704 (*nft_set_ext_obj(ext
))->use
--;
5707 static int nft_del_setelem(struct nft_ctx
*ctx
, struct nft_set
*set
,
5708 const struct nlattr
*attr
)
5710 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
5711 struct nft_set_ext_tmpl tmpl
;
5712 struct nft_set_elem elem
;
5713 struct nft_set_ext
*ext
;
5714 struct nft_trans
*trans
;
5719 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
5720 nft_set_elem_policy
, NULL
);
5724 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
5727 nft_set_ext_prepare(&tmpl
);
5729 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5733 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
5735 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5736 nla
[NFTA_SET_ELEM_KEY
]);
5740 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, set
->klen
);
5742 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5743 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5744 nla
[NFTA_SET_ELEM_KEY_END
]);
5748 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY_END
, set
->klen
);
5752 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
,
5753 elem
.key_end
.val
.data
, NULL
, 0, 0,
5755 if (elem
.priv
== NULL
)
5758 ext
= nft_set_elem_ext(set
, elem
.priv
);
5760 *nft_set_ext_flags(ext
) = flags
;
5762 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_DELSETELEM
, set
);
5766 priv
= set
->ops
->deactivate(ctx
->net
, set
, &elem
);
5774 nft_set_elem_deactivate(ctx
->net
, set
, &elem
);
5776 nft_trans_elem(trans
) = elem
;
5777 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5785 nft_data_release(&elem
.key
.val
, NFT_DATA_VALUE
);
5789 static int nft_flush_set(const struct nft_ctx
*ctx
,
5790 struct nft_set
*set
,
5791 const struct nft_set_iter
*iter
,
5792 struct nft_set_elem
*elem
)
5794 struct nft_trans
*trans
;
5797 trans
= nft_trans_alloc_gfp(ctx
, NFT_MSG_DELSETELEM
,
5798 sizeof(struct nft_trans_elem
), GFP_ATOMIC
);
5802 if (!set
->ops
->flush(ctx
->net
, set
, elem
->priv
)) {
5808 nft_set_elem_deactivate(ctx
->net
, set
, elem
);
5809 nft_trans_elem_set(trans
) = set
;
5810 nft_trans_elem(trans
) = *elem
;
5811 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5819 static int nf_tables_delsetelem(struct net
*net
, struct sock
*nlsk
,
5820 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5821 const struct nlattr
* const nla
[],
5822 struct netlink_ext_ack
*extack
)
5824 u8 genmask
= nft_genmask_next(net
);
5825 const struct nlattr
*attr
;
5826 struct nft_set
*set
;
5830 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5831 genmask
, NETLINK_CB(skb
).portid
);
5835 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
], genmask
);
5837 return PTR_ERR(set
);
5838 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
5841 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
) {
5842 struct nft_set_iter iter
= {
5844 .fn
= nft_flush_set
,
5846 set
->ops
->walk(&ctx
, set
, &iter
);
5851 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5852 err
= nft_del_setelem(&ctx
, set
, attr
);
5861 void nft_set_gc_batch_release(struct rcu_head
*rcu
)
5863 struct nft_set_gc_batch
*gcb
;
5866 gcb
= container_of(rcu
, struct nft_set_gc_batch
, head
.rcu
);
5867 for (i
= 0; i
< gcb
->head
.cnt
; i
++)
5868 nft_set_elem_destroy(gcb
->head
.set
, gcb
->elems
[i
], true);
5872 struct nft_set_gc_batch
*nft_set_gc_batch_alloc(const struct nft_set
*set
,
5875 struct nft_set_gc_batch
*gcb
;
5877 gcb
= kzalloc(sizeof(*gcb
), gfp
);
5880 gcb
->head
.set
= set
;
5889 * nft_register_obj- register nf_tables stateful object type
5890 * @obj_type: object type
5892 * Registers the object type for use with nf_tables. Returns zero on
5893 * success or a negative errno code otherwise.
5895 int nft_register_obj(struct nft_object_type
*obj_type
)
5897 if (obj_type
->type
== NFT_OBJECT_UNSPEC
)
5900 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
5901 list_add_rcu(&obj_type
->list
, &nf_tables_objects
);
5902 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
5905 EXPORT_SYMBOL_GPL(nft_register_obj
);
5908 * nft_unregister_obj - unregister nf_tables object type
5909 * @obj_type: object type
5911 * Unregisters the object type for use with nf_tables.
5913 void nft_unregister_obj(struct nft_object_type
*obj_type
)
5915 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
5916 list_del_rcu(&obj_type
->list
);
5917 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
5919 EXPORT_SYMBOL_GPL(nft_unregister_obj
);
5921 struct nft_object
*nft_obj_lookup(const struct net
*net
,
5922 const struct nft_table
*table
,
5923 const struct nlattr
*nla
, u32 objtype
,
5926 struct nft_object_hash_key k
= { .table
= table
};
5927 char search
[NFT_OBJ_MAXNAMELEN
];
5928 struct rhlist_head
*tmp
, *list
;
5929 struct nft_object
*obj
;
5931 nla_strscpy(search
, nla
, sizeof(search
));
5934 WARN_ON_ONCE(!rcu_read_lock_held() &&
5935 !lockdep_commit_lock_is_held(net
));
5938 list
= rhltable_lookup(&nft_objname_ht
, &k
, nft_objname_ht_params
);
5942 rhl_for_each_entry_rcu(obj
, tmp
, list
, rhlhead
) {
5943 if (objtype
== obj
->ops
->type
->type
&&
5944 nft_active_genmask(obj
, genmask
)) {
5951 return ERR_PTR(-ENOENT
);
5953 EXPORT_SYMBOL_GPL(nft_obj_lookup
);
5955 static struct nft_object
*nft_obj_lookup_byhandle(const struct nft_table
*table
,
5956 const struct nlattr
*nla
,
5957 u32 objtype
, u8 genmask
)
5959 struct nft_object
*obj
;
5961 list_for_each_entry(obj
, &table
->objects
, list
) {
5962 if (be64_to_cpu(nla_get_be64(nla
)) == obj
->handle
&&
5963 objtype
== obj
->ops
->type
->type
&&
5964 nft_active_genmask(obj
, genmask
))
5967 return ERR_PTR(-ENOENT
);
5970 static const struct nla_policy nft_obj_policy
[NFTA_OBJ_MAX
+ 1] = {
5971 [NFTA_OBJ_TABLE
] = { .type
= NLA_STRING
,
5972 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
5973 [NFTA_OBJ_NAME
] = { .type
= NLA_STRING
,
5974 .len
= NFT_OBJ_MAXNAMELEN
- 1 },
5975 [NFTA_OBJ_TYPE
] = { .type
= NLA_U32
},
5976 [NFTA_OBJ_DATA
] = { .type
= NLA_NESTED
},
5977 [NFTA_OBJ_HANDLE
] = { .type
= NLA_U64
},
5978 [NFTA_OBJ_USERDATA
] = { .type
= NLA_BINARY
,
5979 .len
= NFT_USERDATA_MAXLEN
},
5982 static struct nft_object
*nft_obj_init(const struct nft_ctx
*ctx
,
5983 const struct nft_object_type
*type
,
5984 const struct nlattr
*attr
)
5987 const struct nft_object_ops
*ops
;
5988 struct nft_object
*obj
;
5991 tb
= kmalloc_array(type
->maxattr
+ 1, sizeof(*tb
), GFP_KERNEL
);
5996 err
= nla_parse_nested_deprecated(tb
, type
->maxattr
, attr
,
5997 type
->policy
, NULL
);
6001 memset(tb
, 0, sizeof(tb
[0]) * (type
->maxattr
+ 1));
6004 if (type
->select_ops
) {
6005 ops
= type
->select_ops(ctx
, (const struct nlattr
* const *)tb
);
6015 obj
= kzalloc(sizeof(*obj
) + ops
->size
, GFP_KERNEL
);
6019 err
= ops
->init(ctx
, (const struct nlattr
* const *)tb
, obj
);
6032 return ERR_PTR(err
);
6035 static int nft_object_dump(struct sk_buff
*skb
, unsigned int attr
,
6036 struct nft_object
*obj
, bool reset
)
6038 struct nlattr
*nest
;
6040 nest
= nla_nest_start_noflag(skb
, attr
);
6042 goto nla_put_failure
;
6043 if (obj
->ops
->dump(skb
, obj
, reset
) < 0)
6044 goto nla_put_failure
;
6045 nla_nest_end(skb
, nest
);
6052 static const struct nft_object_type
*__nft_obj_type_get(u32 objtype
)
6054 const struct nft_object_type
*type
;
6056 list_for_each_entry(type
, &nf_tables_objects
, list
) {
6057 if (objtype
== type
->type
)
6063 static const struct nft_object_type
*
6064 nft_obj_type_get(struct net
*net
, u32 objtype
)
6066 const struct nft_object_type
*type
;
6068 type
= __nft_obj_type_get(objtype
);
6069 if (type
!= NULL
&& try_module_get(type
->owner
))
6072 lockdep_nfnl_nft_mutex_not_held();
6073 #ifdef CONFIG_MODULES
6075 if (nft_request_module(net
, "nft-obj-%u", objtype
) == -EAGAIN
)
6076 return ERR_PTR(-EAGAIN
);
6079 return ERR_PTR(-ENOENT
);
6082 static int nf_tables_updobj(const struct nft_ctx
*ctx
,
6083 const struct nft_object_type
*type
,
6084 const struct nlattr
*attr
,
6085 struct nft_object
*obj
)
6087 struct nft_object
*newobj
;
6088 struct nft_trans
*trans
;
6091 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWOBJ
,
6092 sizeof(struct nft_trans_obj
));
6096 newobj
= nft_obj_init(ctx
, type
, attr
);
6097 if (IS_ERR(newobj
)) {
6098 err
= PTR_ERR(newobj
);
6099 goto err_free_trans
;
6102 nft_trans_obj(trans
) = obj
;
6103 nft_trans_obj_update(trans
) = true;
6104 nft_trans_obj_newobj(trans
) = newobj
;
6105 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
6114 static int nf_tables_newobj(struct net
*net
, struct sock
*nlsk
,
6115 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6116 const struct nlattr
* const nla
[],
6117 struct netlink_ext_ack
*extack
)
6119 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6120 const struct nft_object_type
*type
;
6121 u8 genmask
= nft_genmask_next(net
);
6122 int family
= nfmsg
->nfgen_family
;
6123 struct nft_table
*table
;
6124 struct nft_object
*obj
;
6129 if (!nla
[NFTA_OBJ_TYPE
] ||
6130 !nla
[NFTA_OBJ_NAME
] ||
6131 !nla
[NFTA_OBJ_DATA
])
6134 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
,
6135 NETLINK_CB(skb
).portid
);
6136 if (IS_ERR(table
)) {
6137 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6138 return PTR_ERR(table
);
6141 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6142 obj
= nft_obj_lookup(net
, table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
6145 if (err
!= -ENOENT
) {
6146 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6150 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
6151 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6154 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
6157 type
= __nft_obj_type_get(objtype
);
6158 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6160 return nf_tables_updobj(&ctx
, type
, nla
[NFTA_OBJ_DATA
], obj
);
6163 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6165 type
= nft_obj_type_get(net
, objtype
);
6167 return PTR_ERR(type
);
6169 obj
= nft_obj_init(&ctx
, type
, nla
[NFTA_OBJ_DATA
]);
6174 obj
->key
.table
= table
;
6175 obj
->handle
= nf_tables_alloc_handle(table
);
6177 obj
->key
.name
= nla_strdup(nla
[NFTA_OBJ_NAME
], GFP_KERNEL
);
6178 if (!obj
->key
.name
) {
6183 if (nla
[NFTA_OBJ_USERDATA
]) {
6184 obj
->udata
= nla_memdup(nla
[NFTA_OBJ_USERDATA
], GFP_KERNEL
);
6185 if (obj
->udata
== NULL
)
6188 obj
->udlen
= nla_len(nla
[NFTA_OBJ_USERDATA
]);
6191 err
= nft_trans_obj_add(&ctx
, NFT_MSG_NEWOBJ
, obj
);
6195 err
= rhltable_insert(&nft_objname_ht
, &obj
->rhlhead
,
6196 nft_objname_ht_params
);
6200 list_add_tail_rcu(&obj
->list
, &table
->objects
);
6204 /* queued in transaction log */
6205 INIT_LIST_HEAD(&obj
->list
);
6208 kfree(obj
->key
.name
);
6212 if (obj
->ops
->destroy
)
6213 obj
->ops
->destroy(&ctx
, obj
);
6216 module_put(type
->owner
);
6220 static int nf_tables_fill_obj_info(struct sk_buff
*skb
, struct net
*net
,
6221 u32 portid
, u32 seq
, int event
, u32 flags
,
6222 int family
, const struct nft_table
*table
,
6223 struct nft_object
*obj
, bool reset
)
6225 struct nfgenmsg
*nfmsg
;
6226 struct nlmsghdr
*nlh
;
6228 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
6229 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
6231 goto nla_put_failure
;
6233 nfmsg
= nlmsg_data(nlh
);
6234 nfmsg
->nfgen_family
= family
;
6235 nfmsg
->version
= NFNETLINK_V0
;
6236 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
6238 if (nla_put_string(skb
, NFTA_OBJ_TABLE
, table
->name
) ||
6239 nla_put_string(skb
, NFTA_OBJ_NAME
, obj
->key
.name
) ||
6240 nla_put_be32(skb
, NFTA_OBJ_TYPE
, htonl(obj
->ops
->type
->type
)) ||
6241 nla_put_be32(skb
, NFTA_OBJ_USE
, htonl(obj
->use
)) ||
6242 nft_object_dump(skb
, NFTA_OBJ_DATA
, obj
, reset
) ||
6243 nla_put_be64(skb
, NFTA_OBJ_HANDLE
, cpu_to_be64(obj
->handle
),
6245 goto nla_put_failure
;
6248 nla_put(skb
, NFTA_OBJ_USERDATA
, obj
->udlen
, obj
->udata
))
6249 goto nla_put_failure
;
6251 nlmsg_end(skb
, nlh
);
6255 nlmsg_trim(skb
, nlh
);
6259 struct nft_obj_filter
{
6264 static int nf_tables_dump_obj(struct sk_buff
*skb
, struct netlink_callback
*cb
)
6266 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
6267 const struct nft_table
*table
;
6268 unsigned int idx
= 0, s_idx
= cb
->args
[0];
6269 struct nft_obj_filter
*filter
= cb
->data
;
6270 struct net
*net
= sock_net(skb
->sk
);
6271 int family
= nfmsg
->nfgen_family
;
6272 struct nft_object
*obj
;
6275 if (NFNL_MSG_TYPE(cb
->nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
6279 cb
->seq
= net
->nft
.base_seq
;
6281 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
6282 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
6285 list_for_each_entry_rcu(obj
, &table
->objects
, list
) {
6286 if (!nft_is_active(net
, obj
))
6291 memset(&cb
->args
[1], 0,
6292 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
6293 if (filter
&& filter
->table
&&
6294 strcmp(filter
->table
, table
->name
))
6297 filter
->type
!= NFT_OBJECT_UNSPEC
&&
6298 obj
->ops
->type
->type
!= filter
->type
)
6301 char *buf
= kasprintf(GFP_ATOMIC
,
6306 audit_log_nfcfg(buf
,
6309 AUDIT_NFT_OP_OBJ_RESET
,
6314 if (nf_tables_fill_obj_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
6317 NLM_F_MULTI
| NLM_F_APPEND
,
6318 table
->family
, table
,
6322 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
6334 static int nf_tables_dump_obj_start(struct netlink_callback
*cb
)
6336 const struct nlattr
* const *nla
= cb
->data
;
6337 struct nft_obj_filter
*filter
= NULL
;
6339 if (nla
[NFTA_OBJ_TABLE
] || nla
[NFTA_OBJ_TYPE
]) {
6340 filter
= kzalloc(sizeof(*filter
), GFP_ATOMIC
);
6344 if (nla
[NFTA_OBJ_TABLE
]) {
6345 filter
->table
= nla_strdup(nla
[NFTA_OBJ_TABLE
], GFP_ATOMIC
);
6346 if (!filter
->table
) {
6352 if (nla
[NFTA_OBJ_TYPE
])
6353 filter
->type
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6360 static int nf_tables_dump_obj_done(struct netlink_callback
*cb
)
6362 struct nft_obj_filter
*filter
= cb
->data
;
6365 kfree(filter
->table
);
6372 /* called with rcu_read_lock held */
6373 static int nf_tables_getobj(struct net
*net
, struct sock
*nlsk
,
6374 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6375 const struct nlattr
* const nla
[],
6376 struct netlink_ext_ack
*extack
)
6378 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6379 u8 genmask
= nft_genmask_cur(net
);
6380 int family
= nfmsg
->nfgen_family
;
6381 const struct nft_table
*table
;
6382 struct nft_object
*obj
;
6383 struct sk_buff
*skb2
;
6388 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
6389 struct netlink_dump_control c
= {
6390 .start
= nf_tables_dump_obj_start
,
6391 .dump
= nf_tables_dump_obj
,
6392 .done
= nf_tables_dump_obj_done
,
6393 .module
= THIS_MODULE
,
6394 .data
= (void *)nla
,
6397 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
6400 if (!nla
[NFTA_OBJ_NAME
] ||
6401 !nla
[NFTA_OBJ_TYPE
])
6404 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
, 0);
6405 if (IS_ERR(table
)) {
6406 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6407 return PTR_ERR(table
);
6410 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6411 obj
= nft_obj_lookup(net
, table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
6413 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6414 return PTR_ERR(obj
);
6417 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
6421 if (NFNL_MSG_TYPE(nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
6425 char *buf
= kasprintf(GFP_ATOMIC
, "%s:%u",
6426 table
->name
, net
->nft
.base_seq
);
6428 audit_log_nfcfg(buf
,
6431 AUDIT_NFT_OP_OBJ_RESET
,
6436 err
= nf_tables_fill_obj_info(skb2
, net
, NETLINK_CB(skb
).portid
,
6437 nlh
->nlmsg_seq
, NFT_MSG_NEWOBJ
, 0,
6438 family
, table
, obj
, reset
);
6440 goto err_fill_obj_info
;
6442 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
6449 static void nft_obj_destroy(const struct nft_ctx
*ctx
, struct nft_object
*obj
)
6451 if (obj
->ops
->destroy
)
6452 obj
->ops
->destroy(ctx
, obj
);
6454 module_put(obj
->ops
->type
->owner
);
6455 kfree(obj
->key
.name
);
6460 static int nf_tables_delobj(struct net
*net
, struct sock
*nlsk
,
6461 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6462 const struct nlattr
* const nla
[],
6463 struct netlink_ext_ack
*extack
)
6465 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6466 u8 genmask
= nft_genmask_next(net
);
6467 int family
= nfmsg
->nfgen_family
;
6468 const struct nlattr
*attr
;
6469 struct nft_table
*table
;
6470 struct nft_object
*obj
;
6474 if (!nla
[NFTA_OBJ_TYPE
] ||
6475 (!nla
[NFTA_OBJ_NAME
] && !nla
[NFTA_OBJ_HANDLE
]))
6478 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
,
6479 NETLINK_CB(skb
).portid
);
6480 if (IS_ERR(table
)) {
6481 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6482 return PTR_ERR(table
);
6485 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6486 if (nla
[NFTA_OBJ_HANDLE
]) {
6487 attr
= nla
[NFTA_OBJ_HANDLE
];
6488 obj
= nft_obj_lookup_byhandle(table
, attr
, objtype
, genmask
);
6490 attr
= nla
[NFTA_OBJ_NAME
];
6491 obj
= nft_obj_lookup(net
, table
, attr
, objtype
, genmask
);
6495 NL_SET_BAD_ATTR(extack
, attr
);
6496 return PTR_ERR(obj
);
6499 NL_SET_BAD_ATTR(extack
, attr
);
6503 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6505 return nft_delobj(&ctx
, obj
);
6508 void nft_obj_notify(struct net
*net
, const struct nft_table
*table
,
6509 struct nft_object
*obj
, u32 portid
, u32 seq
, int event
,
6510 int family
, int report
, gfp_t gfp
)
6512 struct sk_buff
*skb
;
6514 char *buf
= kasprintf(gfp
, "%s:%u",
6515 table
->name
, net
->nft
.base_seq
);
6517 audit_log_nfcfg(buf
,
6520 event
== NFT_MSG_NEWOBJ
?
6521 AUDIT_NFT_OP_OBJ_REGISTER
:
6522 AUDIT_NFT_OP_OBJ_UNREGISTER
,
6527 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
6530 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp
);
6534 err
= nf_tables_fill_obj_info(skb
, net
, portid
, seq
, event
, 0, family
,
6541 nft_notify_enqueue(skb
, report
, &net
->nft
.notify_list
);
6544 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
6546 EXPORT_SYMBOL_GPL(nft_obj_notify
);
6548 static void nf_tables_obj_notify(const struct nft_ctx
*ctx
,
6549 struct nft_object
*obj
, int event
)
6551 nft_obj_notify(ctx
->net
, ctx
->table
, obj
, ctx
->portid
, ctx
->seq
, event
,
6552 ctx
->family
, ctx
->report
, GFP_KERNEL
);
6558 void nft_register_flowtable_type(struct nf_flowtable_type
*type
)
6560 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
6561 list_add_tail_rcu(&type
->list
, &nf_tables_flowtables
);
6562 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
6564 EXPORT_SYMBOL_GPL(nft_register_flowtable_type
);
6566 void nft_unregister_flowtable_type(struct nf_flowtable_type
*type
)
6568 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
6569 list_del_rcu(&type
->list
);
6570 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
6572 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type
);
6574 static const struct nla_policy nft_flowtable_policy
[NFTA_FLOWTABLE_MAX
+ 1] = {
6575 [NFTA_FLOWTABLE_TABLE
] = { .type
= NLA_STRING
,
6576 .len
= NFT_NAME_MAXLEN
- 1 },
6577 [NFTA_FLOWTABLE_NAME
] = { .type
= NLA_STRING
,
6578 .len
= NFT_NAME_MAXLEN
- 1 },
6579 [NFTA_FLOWTABLE_HOOK
] = { .type
= NLA_NESTED
},
6580 [NFTA_FLOWTABLE_HANDLE
] = { .type
= NLA_U64
},
6581 [NFTA_FLOWTABLE_FLAGS
] = { .type
= NLA_U32
},
6584 struct nft_flowtable
*nft_flowtable_lookup(const struct nft_table
*table
,
6585 const struct nlattr
*nla
, u8 genmask
)
6587 struct nft_flowtable
*flowtable
;
6589 list_for_each_entry_rcu(flowtable
, &table
->flowtables
, list
) {
6590 if (!nla_strcmp(nla
, flowtable
->name
) &&
6591 nft_active_genmask(flowtable
, genmask
))
6594 return ERR_PTR(-ENOENT
);
6596 EXPORT_SYMBOL_GPL(nft_flowtable_lookup
);
6598 void nf_tables_deactivate_flowtable(const struct nft_ctx
*ctx
,
6599 struct nft_flowtable
*flowtable
,
6600 enum nft_trans_phase phase
)
6603 case NFT_TRANS_PREPARE
:
6604 case NFT_TRANS_ABORT
:
6605 case NFT_TRANS_RELEASE
:
6612 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable
);
6614 static struct nft_flowtable
*
6615 nft_flowtable_lookup_byhandle(const struct nft_table
*table
,
6616 const struct nlattr
*nla
, u8 genmask
)
6618 struct nft_flowtable
*flowtable
;
6620 list_for_each_entry(flowtable
, &table
->flowtables
, list
) {
6621 if (be64_to_cpu(nla_get_be64(nla
)) == flowtable
->handle
&&
6622 nft_active_genmask(flowtable
, genmask
))
6625 return ERR_PTR(-ENOENT
);
6628 struct nft_flowtable_hook
{
6631 struct list_head list
;
6634 static const struct nla_policy nft_flowtable_hook_policy
[NFTA_FLOWTABLE_HOOK_MAX
+ 1] = {
6635 [NFTA_FLOWTABLE_HOOK_NUM
] = { .type
= NLA_U32
},
6636 [NFTA_FLOWTABLE_HOOK_PRIORITY
] = { .type
= NLA_U32
},
6637 [NFTA_FLOWTABLE_HOOK_DEVS
] = { .type
= NLA_NESTED
},
6640 static int nft_flowtable_parse_hook(const struct nft_ctx
*ctx
,
6641 const struct nlattr
*attr
,
6642 struct nft_flowtable_hook
*flowtable_hook
,
6643 struct nft_flowtable
*flowtable
, bool add
)
6645 struct nlattr
*tb
[NFTA_FLOWTABLE_HOOK_MAX
+ 1];
6646 struct nft_hook
*hook
;
6647 int hooknum
, priority
;
6650 INIT_LIST_HEAD(&flowtable_hook
->list
);
6652 err
= nla_parse_nested_deprecated(tb
, NFTA_FLOWTABLE_HOOK_MAX
, attr
,
6653 nft_flowtable_hook_policy
, NULL
);
6658 if (!tb
[NFTA_FLOWTABLE_HOOK_NUM
] ||
6659 !tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
])
6662 hooknum
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_NUM
]));
6663 if (hooknum
!= NF_NETDEV_INGRESS
)
6666 priority
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]));
6668 flowtable_hook
->priority
= priority
;
6669 flowtable_hook
->num
= hooknum
;
6671 if (tb
[NFTA_FLOWTABLE_HOOK_NUM
]) {
6672 hooknum
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_NUM
]));
6673 if (hooknum
!= flowtable
->hooknum
)
6677 if (tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]) {
6678 priority
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]));
6679 if (priority
!= flowtable
->data
.priority
)
6683 flowtable_hook
->priority
= flowtable
->data
.priority
;
6684 flowtable_hook
->num
= flowtable
->hooknum
;
6687 if (tb
[NFTA_FLOWTABLE_HOOK_DEVS
]) {
6688 err
= nf_tables_parse_netdev_hooks(ctx
->net
,
6689 tb
[NFTA_FLOWTABLE_HOOK_DEVS
],
6690 &flowtable_hook
->list
);
6695 list_for_each_entry(hook
, &flowtable_hook
->list
, list
) {
6696 hook
->ops
.pf
= NFPROTO_NETDEV
;
6697 hook
->ops
.hooknum
= flowtable_hook
->num
;
6698 hook
->ops
.priority
= flowtable_hook
->priority
;
6699 hook
->ops
.priv
= &flowtable
->data
;
6700 hook
->ops
.hook
= flowtable
->data
.type
->hook
;
6706 static const struct nf_flowtable_type
*__nft_flowtable_type_get(u8 family
)
6708 const struct nf_flowtable_type
*type
;
6710 list_for_each_entry(type
, &nf_tables_flowtables
, list
) {
6711 if (family
== type
->family
)
6717 static const struct nf_flowtable_type
*
6718 nft_flowtable_type_get(struct net
*net
, u8 family
)
6720 const struct nf_flowtable_type
*type
;
6722 type
= __nft_flowtable_type_get(family
);
6723 if (type
!= NULL
&& try_module_get(type
->owner
))
6726 lockdep_nfnl_nft_mutex_not_held();
6727 #ifdef CONFIG_MODULES
6729 if (nft_request_module(net
, "nf-flowtable-%u", family
) == -EAGAIN
)
6730 return ERR_PTR(-EAGAIN
);
6733 return ERR_PTR(-ENOENT
);
6736 /* Only called from error and netdev event paths. */
6737 static void nft_unregister_flowtable_hook(struct net
*net
,
6738 struct nft_flowtable
*flowtable
,
6739 struct nft_hook
*hook
)
6741 nf_unregister_net_hook(net
, &hook
->ops
);
6742 flowtable
->data
.type
->setup(&flowtable
->data
, hook
->ops
.dev
,
6746 static void nft_unregister_flowtable_net_hooks(struct net
*net
,
6747 struct list_head
*hook_list
)
6749 struct nft_hook
*hook
;
6751 list_for_each_entry(hook
, hook_list
, list
)
6752 nf_unregister_net_hook(net
, &hook
->ops
);
6755 static int nft_register_flowtable_net_hooks(struct net
*net
,
6756 struct nft_table
*table
,
6757 struct list_head
*hook_list
,
6758 struct nft_flowtable
*flowtable
)
6760 struct nft_hook
*hook
, *hook2
, *next
;
6761 struct nft_flowtable
*ft
;
6764 list_for_each_entry(hook
, hook_list
, list
) {
6765 list_for_each_entry(ft
, &table
->flowtables
, list
) {
6766 if (!nft_is_active_next(net
, ft
))
6769 list_for_each_entry(hook2
, &ft
->hook_list
, list
) {
6770 if (hook
->ops
.dev
== hook2
->ops
.dev
&&
6771 hook
->ops
.pf
== hook2
->ops
.pf
) {
6773 goto err_unregister_net_hooks
;
6778 err
= flowtable
->data
.type
->setup(&flowtable
->data
,
6782 goto err_unregister_net_hooks
;
6784 err
= nf_register_net_hook(net
, &hook
->ops
);
6786 flowtable
->data
.type
->setup(&flowtable
->data
,
6789 goto err_unregister_net_hooks
;
6797 err_unregister_net_hooks
:
6798 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
6802 nft_unregister_flowtable_hook(net
, flowtable
, hook
);
6803 list_del_rcu(&hook
->list
);
6804 kfree_rcu(hook
, rcu
);
6810 static void nft_flowtable_hooks_destroy(struct list_head
*hook_list
)
6812 struct nft_hook
*hook
, *next
;
6814 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
6815 list_del_rcu(&hook
->list
);
6816 kfree_rcu(hook
, rcu
);
6820 static int nft_flowtable_update(struct nft_ctx
*ctx
, const struct nlmsghdr
*nlh
,
6821 struct nft_flowtable
*flowtable
)
6823 const struct nlattr
* const *nla
= ctx
->nla
;
6824 struct nft_flowtable_hook flowtable_hook
;
6825 struct nft_hook
*hook
, *next
;
6826 struct nft_trans
*trans
;
6827 bool unregister
= false;
6831 err
= nft_flowtable_parse_hook(ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
6832 &flowtable_hook
, flowtable
, false);
6836 list_for_each_entry_safe(hook
, next
, &flowtable_hook
.list
, list
) {
6837 if (nft_hook_list_find(&flowtable
->hook_list
, hook
)) {
6838 list_del(&hook
->list
);
6843 if (nla
[NFTA_FLOWTABLE_FLAGS
]) {
6844 flags
= ntohl(nla_get_be32(nla
[NFTA_FLOWTABLE_FLAGS
]));
6845 if (flags
& ~NFT_FLOWTABLE_MASK
)
6847 if ((flowtable
->data
.flags
& NFT_FLOWTABLE_HW_OFFLOAD
) ^
6848 (flags
& NFT_FLOWTABLE_HW_OFFLOAD
))
6851 flags
= flowtable
->data
.flags
;
6854 err
= nft_register_flowtable_net_hooks(ctx
->net
, ctx
->table
,
6855 &flowtable_hook
.list
, flowtable
);
6857 goto err_flowtable_update_hook
;
6859 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWFLOWTABLE
,
6860 sizeof(struct nft_trans_flowtable
));
6864 goto err_flowtable_update_hook
;
6867 nft_trans_flowtable_flags(trans
) = flags
;
6868 nft_trans_flowtable(trans
) = flowtable
;
6869 nft_trans_flowtable_update(trans
) = true;
6870 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans
));
6871 list_splice(&flowtable_hook
.list
, &nft_trans_flowtable_hooks(trans
));
6873 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
6877 err_flowtable_update_hook
:
6878 list_for_each_entry_safe(hook
, next
, &flowtable_hook
.list
, list
) {
6880 nft_unregister_flowtable_hook(ctx
->net
, flowtable
, hook
);
6881 list_del_rcu(&hook
->list
);
6882 kfree_rcu(hook
, rcu
);
6889 static int nf_tables_newflowtable(struct net
*net
, struct sock
*nlsk
,
6890 struct sk_buff
*skb
,
6891 const struct nlmsghdr
*nlh
,
6892 const struct nlattr
* const nla
[],
6893 struct netlink_ext_ack
*extack
)
6895 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6896 struct nft_flowtable_hook flowtable_hook
;
6897 const struct nf_flowtable_type
*type
;
6898 u8 genmask
= nft_genmask_next(net
);
6899 int family
= nfmsg
->nfgen_family
;
6900 struct nft_flowtable
*flowtable
;
6901 struct nft_hook
*hook
, *next
;
6902 struct nft_table
*table
;
6906 if (!nla
[NFTA_FLOWTABLE_TABLE
] ||
6907 !nla
[NFTA_FLOWTABLE_NAME
] ||
6908 !nla
[NFTA_FLOWTABLE_HOOK
])
6911 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
6912 genmask
, NETLINK_CB(skb
).portid
);
6913 if (IS_ERR(table
)) {
6914 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_TABLE
]);
6915 return PTR_ERR(table
);
6918 flowtable
= nft_flowtable_lookup(table
, nla
[NFTA_FLOWTABLE_NAME
],
6920 if (IS_ERR(flowtable
)) {
6921 err
= PTR_ERR(flowtable
);
6922 if (err
!= -ENOENT
) {
6923 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_NAME
]);
6927 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
6928 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_NAME
]);
6932 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6934 return nft_flowtable_update(&ctx
, nlh
, flowtable
);
6937 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6939 flowtable
= kzalloc(sizeof(*flowtable
), GFP_KERNEL
);
6943 flowtable
->table
= table
;
6944 flowtable
->handle
= nf_tables_alloc_handle(table
);
6945 INIT_LIST_HEAD(&flowtable
->hook_list
);
6947 flowtable
->name
= nla_strdup(nla
[NFTA_FLOWTABLE_NAME
], GFP_KERNEL
);
6948 if (!flowtable
->name
) {
6953 type
= nft_flowtable_type_get(net
, family
);
6955 err
= PTR_ERR(type
);
6959 if (nla
[NFTA_FLOWTABLE_FLAGS
]) {
6960 flowtable
->data
.flags
=
6961 ntohl(nla_get_be32(nla
[NFTA_FLOWTABLE_FLAGS
]));
6962 if (flowtable
->data
.flags
& ~NFT_FLOWTABLE_MASK
) {
6968 write_pnet(&flowtable
->data
.net
, net
);
6969 flowtable
->data
.type
= type
;
6970 err
= type
->init(&flowtable
->data
);
6974 err
= nft_flowtable_parse_hook(&ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
6975 &flowtable_hook
, flowtable
, true);
6979 list_splice(&flowtable_hook
.list
, &flowtable
->hook_list
);
6980 flowtable
->data
.priority
= flowtable_hook
.priority
;
6981 flowtable
->hooknum
= flowtable_hook
.num
;
6983 err
= nft_register_flowtable_net_hooks(ctx
.net
, table
,
6984 &flowtable
->hook_list
,
6987 nft_flowtable_hooks_destroy(&flowtable
->hook_list
);
6991 err
= nft_trans_flowtable_add(&ctx
, NFT_MSG_NEWFLOWTABLE
, flowtable
);
6995 list_add_tail_rcu(&flowtable
->list
, &table
->flowtables
);
7000 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7001 nft_unregister_flowtable_hook(net
, flowtable
, hook
);
7002 list_del_rcu(&hook
->list
);
7003 kfree_rcu(hook
, rcu
);
7006 flowtable
->data
.type
->free(&flowtable
->data
);
7008 module_put(type
->owner
);
7010 kfree(flowtable
->name
);
7016 static void nft_flowtable_hook_release(struct nft_flowtable_hook
*flowtable_hook
)
7018 struct nft_hook
*this, *next
;
7020 list_for_each_entry_safe(this, next
, &flowtable_hook
->list
, list
) {
7021 list_del(&this->list
);
7026 static int nft_delflowtable_hook(struct nft_ctx
*ctx
,
7027 struct nft_flowtable
*flowtable
)
7029 const struct nlattr
* const *nla
= ctx
->nla
;
7030 struct nft_flowtable_hook flowtable_hook
;
7031 struct nft_hook
*this, *hook
;
7032 struct nft_trans
*trans
;
7035 err
= nft_flowtable_parse_hook(ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
7036 &flowtable_hook
, flowtable
, false);
7040 list_for_each_entry(this, &flowtable_hook
.list
, list
) {
7041 hook
= nft_hook_list_find(&flowtable
->hook_list
, this);
7044 goto err_flowtable_del_hook
;
7046 hook
->inactive
= true;
7049 trans
= nft_trans_alloc(ctx
, NFT_MSG_DELFLOWTABLE
,
7050 sizeof(struct nft_trans_flowtable
));
7053 goto err_flowtable_del_hook
;
7056 nft_trans_flowtable(trans
) = flowtable
;
7057 nft_trans_flowtable_update(trans
) = true;
7058 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans
));
7059 nft_flowtable_hook_release(&flowtable_hook
);
7061 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
7065 err_flowtable_del_hook
:
7066 list_for_each_entry(this, &flowtable_hook
.list
, list
) {
7067 hook
= nft_hook_list_find(&flowtable
->hook_list
, this);
7071 hook
->inactive
= false;
7073 nft_flowtable_hook_release(&flowtable_hook
);
7078 static int nf_tables_delflowtable(struct net
*net
, struct sock
*nlsk
,
7079 struct sk_buff
*skb
,
7080 const struct nlmsghdr
*nlh
,
7081 const struct nlattr
* const nla
[],
7082 struct netlink_ext_ack
*extack
)
7084 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
7085 u8 genmask
= nft_genmask_next(net
);
7086 int family
= nfmsg
->nfgen_family
;
7087 struct nft_flowtable
*flowtable
;
7088 const struct nlattr
*attr
;
7089 struct nft_table
*table
;
7092 if (!nla
[NFTA_FLOWTABLE_TABLE
] ||
7093 (!nla
[NFTA_FLOWTABLE_NAME
] &&
7094 !nla
[NFTA_FLOWTABLE_HANDLE
]))
7097 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
7098 genmask
, NETLINK_CB(skb
).portid
);
7099 if (IS_ERR(table
)) {
7100 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_TABLE
]);
7101 return PTR_ERR(table
);
7104 if (nla
[NFTA_FLOWTABLE_HANDLE
]) {
7105 attr
= nla
[NFTA_FLOWTABLE_HANDLE
];
7106 flowtable
= nft_flowtable_lookup_byhandle(table
, attr
, genmask
);
7108 attr
= nla
[NFTA_FLOWTABLE_NAME
];
7109 flowtable
= nft_flowtable_lookup(table
, attr
, genmask
);
7112 if (IS_ERR(flowtable
)) {
7113 NL_SET_BAD_ATTR(extack
, attr
);
7114 return PTR_ERR(flowtable
);
7117 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
7119 if (nla
[NFTA_FLOWTABLE_HOOK
])
7120 return nft_delflowtable_hook(&ctx
, flowtable
);
7122 if (flowtable
->use
> 0) {
7123 NL_SET_BAD_ATTR(extack
, attr
);
7127 return nft_delflowtable(&ctx
, flowtable
);
7130 static int nf_tables_fill_flowtable_info(struct sk_buff
*skb
, struct net
*net
,
7131 u32 portid
, u32 seq
, int event
,
7132 u32 flags
, int family
,
7133 struct nft_flowtable
*flowtable
,
7134 struct list_head
*hook_list
)
7136 struct nlattr
*nest
, *nest_devs
;
7137 struct nfgenmsg
*nfmsg
;
7138 struct nft_hook
*hook
;
7139 struct nlmsghdr
*nlh
;
7141 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
7142 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
7144 goto nla_put_failure
;
7146 nfmsg
= nlmsg_data(nlh
);
7147 nfmsg
->nfgen_family
= family
;
7148 nfmsg
->version
= NFNETLINK_V0
;
7149 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
7151 if (nla_put_string(skb
, NFTA_FLOWTABLE_TABLE
, flowtable
->table
->name
) ||
7152 nla_put_string(skb
, NFTA_FLOWTABLE_NAME
, flowtable
->name
) ||
7153 nla_put_be32(skb
, NFTA_FLOWTABLE_USE
, htonl(flowtable
->use
)) ||
7154 nla_put_be64(skb
, NFTA_FLOWTABLE_HANDLE
, cpu_to_be64(flowtable
->handle
),
7155 NFTA_FLOWTABLE_PAD
) ||
7156 nla_put_be32(skb
, NFTA_FLOWTABLE_FLAGS
, htonl(flowtable
->data
.flags
)))
7157 goto nla_put_failure
;
7159 nest
= nla_nest_start_noflag(skb
, NFTA_FLOWTABLE_HOOK
);
7161 goto nla_put_failure
;
7162 if (nla_put_be32(skb
, NFTA_FLOWTABLE_HOOK_NUM
, htonl(flowtable
->hooknum
)) ||
7163 nla_put_be32(skb
, NFTA_FLOWTABLE_HOOK_PRIORITY
, htonl(flowtable
->data
.priority
)))
7164 goto nla_put_failure
;
7166 nest_devs
= nla_nest_start_noflag(skb
, NFTA_FLOWTABLE_HOOK_DEVS
);
7168 goto nla_put_failure
;
7170 list_for_each_entry_rcu(hook
, hook_list
, list
) {
7171 if (nla_put_string(skb
, NFTA_DEVICE_NAME
, hook
->ops
.dev
->name
))
7172 goto nla_put_failure
;
7174 nla_nest_end(skb
, nest_devs
);
7175 nla_nest_end(skb
, nest
);
7177 nlmsg_end(skb
, nlh
);
7181 nlmsg_trim(skb
, nlh
);
7185 struct nft_flowtable_filter
{
7189 static int nf_tables_dump_flowtable(struct sk_buff
*skb
,
7190 struct netlink_callback
*cb
)
7192 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
7193 struct nft_flowtable_filter
*filter
= cb
->data
;
7194 unsigned int idx
= 0, s_idx
= cb
->args
[0];
7195 struct net
*net
= sock_net(skb
->sk
);
7196 int family
= nfmsg
->nfgen_family
;
7197 struct nft_flowtable
*flowtable
;
7198 const struct nft_table
*table
;
7201 cb
->seq
= net
->nft
.base_seq
;
7203 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
7204 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
7207 list_for_each_entry_rcu(flowtable
, &table
->flowtables
, list
) {
7208 if (!nft_is_active(net
, flowtable
))
7213 memset(&cb
->args
[1], 0,
7214 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
7215 if (filter
&& filter
->table
&&
7216 strcmp(filter
->table
, table
->name
))
7219 if (nf_tables_fill_flowtable_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
7221 NFT_MSG_NEWFLOWTABLE
,
7222 NLM_F_MULTI
| NLM_F_APPEND
,
7225 &flowtable
->hook_list
) < 0)
7228 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
7240 static int nf_tables_dump_flowtable_start(struct netlink_callback
*cb
)
7242 const struct nlattr
* const *nla
= cb
->data
;
7243 struct nft_flowtable_filter
*filter
= NULL
;
7245 if (nla
[NFTA_FLOWTABLE_TABLE
]) {
7246 filter
= kzalloc(sizeof(*filter
), GFP_ATOMIC
);
7250 filter
->table
= nla_strdup(nla
[NFTA_FLOWTABLE_TABLE
],
7252 if (!filter
->table
) {
7262 static int nf_tables_dump_flowtable_done(struct netlink_callback
*cb
)
7264 struct nft_flowtable_filter
*filter
= cb
->data
;
7269 kfree(filter
->table
);
7275 /* called with rcu_read_lock held */
7276 static int nf_tables_getflowtable(struct net
*net
, struct sock
*nlsk
,
7277 struct sk_buff
*skb
,
7278 const struct nlmsghdr
*nlh
,
7279 const struct nlattr
* const nla
[],
7280 struct netlink_ext_ack
*extack
)
7282 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
7283 u8 genmask
= nft_genmask_cur(net
);
7284 int family
= nfmsg
->nfgen_family
;
7285 struct nft_flowtable
*flowtable
;
7286 const struct nft_table
*table
;
7287 struct sk_buff
*skb2
;
7290 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
7291 struct netlink_dump_control c
= {
7292 .start
= nf_tables_dump_flowtable_start
,
7293 .dump
= nf_tables_dump_flowtable
,
7294 .done
= nf_tables_dump_flowtable_done
,
7295 .module
= THIS_MODULE
,
7296 .data
= (void *)nla
,
7299 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
7302 if (!nla
[NFTA_FLOWTABLE_NAME
])
7305 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
7308 return PTR_ERR(table
);
7310 flowtable
= nft_flowtable_lookup(table
, nla
[NFTA_FLOWTABLE_NAME
],
7312 if (IS_ERR(flowtable
))
7313 return PTR_ERR(flowtable
);
7315 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
7319 err
= nf_tables_fill_flowtable_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7321 NFT_MSG_NEWFLOWTABLE
, 0, family
,
7322 flowtable
, &flowtable
->hook_list
);
7324 goto err_fill_flowtable_info
;
7326 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
7328 err_fill_flowtable_info
:
7333 static void nf_tables_flowtable_notify(struct nft_ctx
*ctx
,
7334 struct nft_flowtable
*flowtable
,
7335 struct list_head
*hook_list
,
7338 struct sk_buff
*skb
;
7342 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
7345 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
7349 err
= nf_tables_fill_flowtable_info(skb
, ctx
->net
, ctx
->portid
,
7351 ctx
->family
, flowtable
, hook_list
);
7357 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
7360 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
7363 static void nf_tables_flowtable_destroy(struct nft_flowtable
*flowtable
)
7365 struct nft_hook
*hook
, *next
;
7367 flowtable
->data
.type
->free(&flowtable
->data
);
7368 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7369 flowtable
->data
.type
->setup(&flowtable
->data
, hook
->ops
.dev
,
7371 list_del_rcu(&hook
->list
);
7374 kfree(flowtable
->name
);
7375 module_put(flowtable
->data
.type
->owner
);
7379 static int nf_tables_fill_gen_info(struct sk_buff
*skb
, struct net
*net
,
7380 u32 portid
, u32 seq
)
7382 struct nlmsghdr
*nlh
;
7383 struct nfgenmsg
*nfmsg
;
7384 char buf
[TASK_COMM_LEN
];
7385 int event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWGEN
);
7387 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), 0);
7389 goto nla_put_failure
;
7391 nfmsg
= nlmsg_data(nlh
);
7392 nfmsg
->nfgen_family
= AF_UNSPEC
;
7393 nfmsg
->version
= NFNETLINK_V0
;
7394 nfmsg
->res_id
= htons(net
->nft
.base_seq
& 0xffff);
7396 if (nla_put_be32(skb
, NFTA_GEN_ID
, htonl(net
->nft
.base_seq
)) ||
7397 nla_put_be32(skb
, NFTA_GEN_PROC_PID
, htonl(task_pid_nr(current
))) ||
7398 nla_put_string(skb
, NFTA_GEN_PROC_NAME
, get_task_comm(buf
, current
)))
7399 goto nla_put_failure
;
7401 nlmsg_end(skb
, nlh
);
7405 nlmsg_trim(skb
, nlh
);
7409 static void nft_flowtable_event(unsigned long event
, struct net_device
*dev
,
7410 struct nft_flowtable
*flowtable
)
7412 struct nft_hook
*hook
;
7414 list_for_each_entry(hook
, &flowtable
->hook_list
, list
) {
7415 if (hook
->ops
.dev
!= dev
)
7418 /* flow_offload_netdev_event() cleans up entries for us. */
7419 nft_unregister_flowtable_hook(dev_net(dev
), flowtable
, hook
);
7420 list_del_rcu(&hook
->list
);
7421 kfree_rcu(hook
, rcu
);
7426 static int nf_tables_flowtable_event(struct notifier_block
*this,
7427 unsigned long event
, void *ptr
)
7429 struct net_device
*dev
= netdev_notifier_info_to_dev(ptr
);
7430 struct nft_flowtable
*flowtable
;
7431 struct nft_table
*table
;
7434 if (event
!= NETDEV_UNREGISTER
)
7438 mutex_lock(&net
->nft
.commit_mutex
);
7439 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
7440 list_for_each_entry(flowtable
, &table
->flowtables
, list
) {
7441 nft_flowtable_event(event
, dev
, flowtable
);
7444 mutex_unlock(&net
->nft
.commit_mutex
);
7449 static struct notifier_block nf_tables_flowtable_notifier
= {
7450 .notifier_call
= nf_tables_flowtable_event
,
7453 static void nf_tables_gen_notify(struct net
*net
, struct sk_buff
*skb
,
7456 struct nlmsghdr
*nlh
= nlmsg_hdr(skb
);
7457 struct sk_buff
*skb2
;
7460 if (!nlmsg_report(nlh
) &&
7461 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
7464 skb2
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
7468 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7475 nfnetlink_send(skb2
, net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
7476 nlmsg_report(nlh
), GFP_KERNEL
);
7479 nfnetlink_set_err(net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
7483 static int nf_tables_getgen(struct net
*net
, struct sock
*nlsk
,
7484 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
7485 const struct nlattr
* const nla
[],
7486 struct netlink_ext_ack
*extack
)
7488 struct sk_buff
*skb2
;
7491 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
7495 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7498 goto err_fill_gen_info
;
7500 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
7507 static const struct nfnl_callback nf_tables_cb
[NFT_MSG_MAX
] = {
7508 [NFT_MSG_NEWTABLE
] = {
7509 .call_batch
= nf_tables_newtable
,
7510 .attr_count
= NFTA_TABLE_MAX
,
7511 .policy
= nft_table_policy
,
7513 [NFT_MSG_GETTABLE
] = {
7514 .call_rcu
= nf_tables_gettable
,
7515 .attr_count
= NFTA_TABLE_MAX
,
7516 .policy
= nft_table_policy
,
7518 [NFT_MSG_DELTABLE
] = {
7519 .call_batch
= nf_tables_deltable
,
7520 .attr_count
= NFTA_TABLE_MAX
,
7521 .policy
= nft_table_policy
,
7523 [NFT_MSG_NEWCHAIN
] = {
7524 .call_batch
= nf_tables_newchain
,
7525 .attr_count
= NFTA_CHAIN_MAX
,
7526 .policy
= nft_chain_policy
,
7528 [NFT_MSG_GETCHAIN
] = {
7529 .call_rcu
= nf_tables_getchain
,
7530 .attr_count
= NFTA_CHAIN_MAX
,
7531 .policy
= nft_chain_policy
,
7533 [NFT_MSG_DELCHAIN
] = {
7534 .call_batch
= nf_tables_delchain
,
7535 .attr_count
= NFTA_CHAIN_MAX
,
7536 .policy
= nft_chain_policy
,
7538 [NFT_MSG_NEWRULE
] = {
7539 .call_batch
= nf_tables_newrule
,
7540 .attr_count
= NFTA_RULE_MAX
,
7541 .policy
= nft_rule_policy
,
7543 [NFT_MSG_GETRULE
] = {
7544 .call_rcu
= nf_tables_getrule
,
7545 .attr_count
= NFTA_RULE_MAX
,
7546 .policy
= nft_rule_policy
,
7548 [NFT_MSG_DELRULE
] = {
7549 .call_batch
= nf_tables_delrule
,
7550 .attr_count
= NFTA_RULE_MAX
,
7551 .policy
= nft_rule_policy
,
7553 [NFT_MSG_NEWSET
] = {
7554 .call_batch
= nf_tables_newset
,
7555 .attr_count
= NFTA_SET_MAX
,
7556 .policy
= nft_set_policy
,
7558 [NFT_MSG_GETSET
] = {
7559 .call_rcu
= nf_tables_getset
,
7560 .attr_count
= NFTA_SET_MAX
,
7561 .policy
= nft_set_policy
,
7563 [NFT_MSG_DELSET
] = {
7564 .call_batch
= nf_tables_delset
,
7565 .attr_count
= NFTA_SET_MAX
,
7566 .policy
= nft_set_policy
,
7568 [NFT_MSG_NEWSETELEM
] = {
7569 .call_batch
= nf_tables_newsetelem
,
7570 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7571 .policy
= nft_set_elem_list_policy
,
7573 [NFT_MSG_GETSETELEM
] = {
7574 .call_rcu
= nf_tables_getsetelem
,
7575 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7576 .policy
= nft_set_elem_list_policy
,
7578 [NFT_MSG_DELSETELEM
] = {
7579 .call_batch
= nf_tables_delsetelem
,
7580 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7581 .policy
= nft_set_elem_list_policy
,
7583 [NFT_MSG_GETGEN
] = {
7584 .call_rcu
= nf_tables_getgen
,
7586 [NFT_MSG_NEWOBJ
] = {
7587 .call_batch
= nf_tables_newobj
,
7588 .attr_count
= NFTA_OBJ_MAX
,
7589 .policy
= nft_obj_policy
,
7591 [NFT_MSG_GETOBJ
] = {
7592 .call_rcu
= nf_tables_getobj
,
7593 .attr_count
= NFTA_OBJ_MAX
,
7594 .policy
= nft_obj_policy
,
7596 [NFT_MSG_DELOBJ
] = {
7597 .call_batch
= nf_tables_delobj
,
7598 .attr_count
= NFTA_OBJ_MAX
,
7599 .policy
= nft_obj_policy
,
7601 [NFT_MSG_GETOBJ_RESET
] = {
7602 .call_rcu
= nf_tables_getobj
,
7603 .attr_count
= NFTA_OBJ_MAX
,
7604 .policy
= nft_obj_policy
,
7606 [NFT_MSG_NEWFLOWTABLE
] = {
7607 .call_batch
= nf_tables_newflowtable
,
7608 .attr_count
= NFTA_FLOWTABLE_MAX
,
7609 .policy
= nft_flowtable_policy
,
7611 [NFT_MSG_GETFLOWTABLE
] = {
7612 .call_rcu
= nf_tables_getflowtable
,
7613 .attr_count
= NFTA_FLOWTABLE_MAX
,
7614 .policy
= nft_flowtable_policy
,
7616 [NFT_MSG_DELFLOWTABLE
] = {
7617 .call_batch
= nf_tables_delflowtable
,
7618 .attr_count
= NFTA_FLOWTABLE_MAX
,
7619 .policy
= nft_flowtable_policy
,
7623 static int nf_tables_validate(struct net
*net
)
7625 struct nft_table
*table
;
7627 switch (net
->nft
.validate_state
) {
7628 case NFT_VALIDATE_SKIP
:
7630 case NFT_VALIDATE_NEED
:
7631 nft_validate_state_update(net
, NFT_VALIDATE_DO
);
7633 case NFT_VALIDATE_DO
:
7634 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
7635 if (nft_table_validate(net
, table
) < 0)
7644 /* a drop policy has to be deferred until all rules have been activated,
7645 * otherwise a large ruleset that contains a drop-policy base chain will
7646 * cause all packets to get dropped until the full transaction has been
7649 * We defer the drop policy until the transaction has been finalized.
7651 static void nft_chain_commit_drop_policy(struct nft_trans
*trans
)
7653 struct nft_base_chain
*basechain
;
7655 if (nft_trans_chain_policy(trans
) != NF_DROP
)
7658 if (!nft_is_base_chain(trans
->ctx
.chain
))
7661 basechain
= nft_base_chain(trans
->ctx
.chain
);
7662 basechain
->policy
= NF_DROP
;
7665 static void nft_chain_commit_update(struct nft_trans
*trans
)
7667 struct nft_base_chain
*basechain
;
7669 if (nft_trans_chain_name(trans
)) {
7670 rhltable_remove(&trans
->ctx
.table
->chains_ht
,
7671 &trans
->ctx
.chain
->rhlhead
,
7672 nft_chain_ht_params
);
7673 swap(trans
->ctx
.chain
->name
, nft_trans_chain_name(trans
));
7674 rhltable_insert_key(&trans
->ctx
.table
->chains_ht
,
7675 trans
->ctx
.chain
->name
,
7676 &trans
->ctx
.chain
->rhlhead
,
7677 nft_chain_ht_params
);
7680 if (!nft_is_base_chain(trans
->ctx
.chain
))
7683 nft_chain_stats_replace(trans
);
7685 basechain
= nft_base_chain(trans
->ctx
.chain
);
7687 switch (nft_trans_chain_policy(trans
)) {
7690 basechain
->policy
= nft_trans_chain_policy(trans
);
7695 static void nft_obj_commit_update(struct nft_trans
*trans
)
7697 struct nft_object
*newobj
;
7698 struct nft_object
*obj
;
7700 obj
= nft_trans_obj(trans
);
7701 newobj
= nft_trans_obj_newobj(trans
);
7703 if (obj
->ops
->update
)
7704 obj
->ops
->update(obj
, newobj
);
7709 static void nft_commit_release(struct nft_trans
*trans
)
7711 switch (trans
->msg_type
) {
7712 case NFT_MSG_DELTABLE
:
7713 nf_tables_table_destroy(&trans
->ctx
);
7715 case NFT_MSG_NEWCHAIN
:
7716 free_percpu(nft_trans_chain_stats(trans
));
7717 kfree(nft_trans_chain_name(trans
));
7719 case NFT_MSG_DELCHAIN
:
7720 nf_tables_chain_destroy(&trans
->ctx
);
7722 case NFT_MSG_DELRULE
:
7723 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
7725 case NFT_MSG_DELSET
:
7726 nft_set_destroy(&trans
->ctx
, nft_trans_set(trans
));
7728 case NFT_MSG_DELSETELEM
:
7729 nf_tables_set_elem_destroy(&trans
->ctx
,
7730 nft_trans_elem_set(trans
),
7731 nft_trans_elem(trans
).priv
);
7733 case NFT_MSG_DELOBJ
:
7734 nft_obj_destroy(&trans
->ctx
, nft_trans_obj(trans
));
7736 case NFT_MSG_DELFLOWTABLE
:
7737 if (nft_trans_flowtable_update(trans
))
7738 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans
));
7740 nf_tables_flowtable_destroy(nft_trans_flowtable(trans
));
7745 put_net(trans
->ctx
.net
);
7750 static void nf_tables_trans_destroy_work(struct work_struct
*w
)
7752 struct nft_trans
*trans
, *next
;
7755 spin_lock(&nf_tables_destroy_list_lock
);
7756 list_splice_init(&nf_tables_destroy_list
, &head
);
7757 spin_unlock(&nf_tables_destroy_list_lock
);
7759 if (list_empty(&head
))
7764 list_for_each_entry_safe(trans
, next
, &head
, list
) {
7765 list_del(&trans
->list
);
7766 nft_commit_release(trans
);
7770 void nf_tables_trans_destroy_flush_work(void)
7772 flush_work(&trans_destroy_work
);
7774 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work
);
7776 static int nf_tables_commit_chain_prepare(struct net
*net
, struct nft_chain
*chain
)
7778 struct nft_rule
*rule
;
7779 unsigned int alloc
= 0;
7782 /* already handled or inactive chain? */
7783 if (chain
->rules_next
|| !nft_is_active_next(net
, chain
))
7786 rule
= list_entry(&chain
->rules
, struct nft_rule
, list
);
7789 list_for_each_entry_continue(rule
, &chain
->rules
, list
) {
7790 if (nft_is_active_next(net
, rule
))
7794 chain
->rules_next
= nf_tables_chain_alloc_rules(chain
, alloc
);
7795 if (!chain
->rules_next
)
7798 list_for_each_entry_continue(rule
, &chain
->rules
, list
) {
7799 if (nft_is_active_next(net
, rule
))
7800 chain
->rules_next
[i
++] = rule
;
7803 chain
->rules_next
[i
] = NULL
;
7807 static void nf_tables_commit_chain_prepare_cancel(struct net
*net
)
7809 struct nft_trans
*trans
, *next
;
7811 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
7812 struct nft_chain
*chain
= trans
->ctx
.chain
;
7814 if (trans
->msg_type
== NFT_MSG_NEWRULE
||
7815 trans
->msg_type
== NFT_MSG_DELRULE
) {
7816 kvfree(chain
->rules_next
);
7817 chain
->rules_next
= NULL
;
7822 static void __nf_tables_commit_chain_free_rules_old(struct rcu_head
*h
)
7824 struct nft_rules_old
*o
= container_of(h
, struct nft_rules_old
, h
);
7829 static void nf_tables_commit_chain_free_rules_old(struct nft_rule
**rules
)
7831 struct nft_rule
**r
= rules
;
7832 struct nft_rules_old
*old
;
7837 r
++; /* rcu_head is after end marker */
7841 call_rcu(&old
->h
, __nf_tables_commit_chain_free_rules_old
);
7844 static void nf_tables_commit_chain(struct net
*net
, struct nft_chain
*chain
)
7846 struct nft_rule
**g0
, **g1
;
7849 next_genbit
= nft_gencursor_next(net
);
7851 g0
= rcu_dereference_protected(chain
->rules_gen_0
,
7852 lockdep_commit_lock_is_held(net
));
7853 g1
= rcu_dereference_protected(chain
->rules_gen_1
,
7854 lockdep_commit_lock_is_held(net
));
7856 /* No changes to this chain? */
7857 if (chain
->rules_next
== NULL
) {
7858 /* chain had no change in last or next generation */
7862 * chain had no change in this generation; make sure next
7863 * one uses same rules as current generation.
7866 rcu_assign_pointer(chain
->rules_gen_1
, g0
);
7867 nf_tables_commit_chain_free_rules_old(g1
);
7869 rcu_assign_pointer(chain
->rules_gen_0
, g1
);
7870 nf_tables_commit_chain_free_rules_old(g0
);
7877 rcu_assign_pointer(chain
->rules_gen_1
, chain
->rules_next
);
7879 rcu_assign_pointer(chain
->rules_gen_0
, chain
->rules_next
);
7881 chain
->rules_next
= NULL
;
7887 nf_tables_commit_chain_free_rules_old(g1
);
7889 nf_tables_commit_chain_free_rules_old(g0
);
7892 static void nft_obj_del(struct nft_object
*obj
)
7894 rhltable_remove(&nft_objname_ht
, &obj
->rhlhead
, nft_objname_ht_params
);
7895 list_del_rcu(&obj
->list
);
7898 void nft_chain_del(struct nft_chain
*chain
)
7900 struct nft_table
*table
= chain
->table
;
7902 WARN_ON_ONCE(rhltable_remove(&table
->chains_ht
, &chain
->rhlhead
,
7903 nft_chain_ht_params
));
7904 list_del_rcu(&chain
->list
);
7907 static void nft_flowtable_hooks_del(struct nft_flowtable
*flowtable
,
7908 struct list_head
*hook_list
)
7910 struct nft_hook
*hook
, *next
;
7912 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7914 list_move(&hook
->list
, hook_list
);
7918 static void nf_tables_module_autoload_cleanup(struct net
*net
)
7920 struct nft_module_request
*req
, *next
;
7922 WARN_ON_ONCE(!list_empty(&net
->nft
.commit_list
));
7923 list_for_each_entry_safe(req
, next
, &net
->nft
.module_list
, list
) {
7924 WARN_ON_ONCE(!req
->done
);
7925 list_del(&req
->list
);
7930 static void nf_tables_commit_release(struct net
*net
)
7932 struct nft_trans
*trans
;
7934 /* all side effects have to be made visible.
7935 * For example, if a chain named 'foo' has been deleted, a
7936 * new transaction must not find it anymore.
7938 * Memory reclaim happens asynchronously from work queue
7939 * to prevent expensive synchronize_rcu() in commit phase.
7941 if (list_empty(&net
->nft
.commit_list
)) {
7942 nf_tables_module_autoload_cleanup(net
);
7943 mutex_unlock(&net
->nft
.commit_mutex
);
7947 trans
= list_last_entry(&net
->nft
.commit_list
,
7948 struct nft_trans
, list
);
7949 get_net(trans
->ctx
.net
);
7950 WARN_ON_ONCE(trans
->put_net
);
7952 trans
->put_net
= true;
7953 spin_lock(&nf_tables_destroy_list_lock
);
7954 list_splice_tail_init(&net
->nft
.commit_list
, &nf_tables_destroy_list
);
7955 spin_unlock(&nf_tables_destroy_list_lock
);
7957 nf_tables_module_autoload_cleanup(net
);
7958 schedule_work(&trans_destroy_work
);
7960 mutex_unlock(&net
->nft
.commit_mutex
);
7963 static void nft_commit_notify(struct net
*net
, u32 portid
)
7965 struct sk_buff
*batch_skb
= NULL
, *nskb
, *skb
;
7966 unsigned char *data
;
7969 list_for_each_entry_safe(skb
, nskb
, &net
->nft
.notify_list
, list
) {
7973 len
= NLMSG_GOODSIZE
- skb
->len
;
7974 list_del(&skb
->list
);
7978 if (len
> 0 && NFT_CB(skb
).report
== NFT_CB(batch_skb
).report
) {
7979 data
= skb_put(batch_skb
, skb
->len
);
7980 memcpy(data
, skb
->data
, skb
->len
);
7981 list_del(&skb
->list
);
7985 nfnetlink_send(batch_skb
, net
, portid
, NFNLGRP_NFTABLES
,
7986 NFT_CB(batch_skb
).report
, GFP_KERNEL
);
7991 nfnetlink_send(batch_skb
, net
, portid
, NFNLGRP_NFTABLES
,
7992 NFT_CB(batch_skb
).report
, GFP_KERNEL
);
7995 WARN_ON_ONCE(!list_empty(&net
->nft
.notify_list
));
7998 static int nf_tables_commit_audit_alloc(struct list_head
*adl
,
7999 struct nft_table
*table
)
8001 struct nft_audit_data
*adp
;
8003 list_for_each_entry(adp
, adl
, list
) {
8004 if (adp
->table
== table
)
8007 adp
= kzalloc(sizeof(*adp
), GFP_KERNEL
);
8011 list_add(&adp
->list
, adl
);
8015 static void nf_tables_commit_audit_collect(struct list_head
*adl
,
8016 struct nft_table
*table
, u32 op
)
8018 struct nft_audit_data
*adp
;
8020 list_for_each_entry(adp
, adl
, list
) {
8021 if (adp
->table
== table
)
8024 WARN_ONCE("table=%s not expected in commit list", table
->name
);
8028 if (!adp
->op
|| adp
->op
> op
)
8032 #define AUNFTABLENAMELEN (NFT_TABLE_MAXNAMELEN + 22)
8034 static void nf_tables_commit_audit_log(struct list_head
*adl
, u32 generation
)
8036 struct nft_audit_data
*adp
, *adn
;
8037 char aubuf
[AUNFTABLENAMELEN
];
8039 list_for_each_entry_safe(adp
, adn
, adl
, list
) {
8040 snprintf(aubuf
, AUNFTABLENAMELEN
, "%s:%u", adp
->table
->name
,
8042 audit_log_nfcfg(aubuf
, adp
->table
->family
, adp
->entries
,
8043 nft2audit_op
[adp
->op
], GFP_KERNEL
);
8044 list_del(&adp
->list
);
8049 static int nf_tables_commit(struct net
*net
, struct sk_buff
*skb
)
8051 struct nft_trans
*trans
, *next
;
8052 struct nft_trans_elem
*te
;
8053 struct nft_chain
*chain
;
8054 struct nft_table
*table
;
8058 if (list_empty(&net
->nft
.commit_list
)) {
8059 mutex_unlock(&net
->nft
.commit_mutex
);
8063 /* 0. Validate ruleset, otherwise roll back for error reporting. */
8064 if (nf_tables_validate(net
) < 0)
8067 err
= nft_flow_rule_offload_commit(net
);
8071 /* 1. Allocate space for next generation rules_gen_X[] */
8072 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
8075 ret
= nf_tables_commit_audit_alloc(&adl
, trans
->ctx
.table
);
8077 nf_tables_commit_chain_prepare_cancel(net
);
8080 if (trans
->msg_type
== NFT_MSG_NEWRULE
||
8081 trans
->msg_type
== NFT_MSG_DELRULE
) {
8082 chain
= trans
->ctx
.chain
;
8084 ret
= nf_tables_commit_chain_prepare(net
, chain
);
8086 nf_tables_commit_chain_prepare_cancel(net
);
8092 /* step 2. Make rules_gen_X visible to packet path */
8093 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
8094 list_for_each_entry(chain
, &table
->chains
, list
)
8095 nf_tables_commit_chain(net
, chain
);
8099 * Bump generation counter, invalidate any dump in progress.
8100 * Cannot fail after this point.
8102 while (++net
->nft
.base_seq
== 0);
8104 /* step 3. Start new generation, rules_gen_X now in use. */
8105 net
->nft
.gencursor
= nft_gencursor_next(net
);
8107 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
8108 nf_tables_commit_audit_collect(&adl
, trans
->ctx
.table
,
8110 switch (trans
->msg_type
) {
8111 case NFT_MSG_NEWTABLE
:
8112 if (nft_trans_table_update(trans
)) {
8113 if (nft_trans_table_state(trans
) == NFT_TABLE_STATE_DORMANT
)
8114 nf_tables_table_disable(net
, trans
->ctx
.table
);
8116 trans
->ctx
.table
->flags
= nft_trans_table_flags(trans
);
8118 nft_clear(net
, trans
->ctx
.table
);
8120 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_NEWTABLE
);
8121 nft_trans_destroy(trans
);
8123 case NFT_MSG_DELTABLE
:
8124 list_del_rcu(&trans
->ctx
.table
->list
);
8125 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_DELTABLE
);
8127 case NFT_MSG_NEWCHAIN
:
8128 if (nft_trans_chain_update(trans
)) {
8129 nft_chain_commit_update(trans
);
8130 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
8131 /* trans destroyed after rcu grace period */
8133 nft_chain_commit_drop_policy(trans
);
8134 nft_clear(net
, trans
->ctx
.chain
);
8135 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
8136 nft_trans_destroy(trans
);
8139 case NFT_MSG_DELCHAIN
:
8140 nft_chain_del(trans
->ctx
.chain
);
8141 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_DELCHAIN
);
8142 nf_tables_unregister_hook(trans
->ctx
.net
,
8146 case NFT_MSG_NEWRULE
:
8147 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
8148 nf_tables_rule_notify(&trans
->ctx
,
8149 nft_trans_rule(trans
),
8151 nft_trans_destroy(trans
);
8153 case NFT_MSG_DELRULE
:
8154 list_del_rcu(&nft_trans_rule(trans
)->list
);
8155 nf_tables_rule_notify(&trans
->ctx
,
8156 nft_trans_rule(trans
),
8158 nft_rule_expr_deactivate(&trans
->ctx
,
8159 nft_trans_rule(trans
),
8162 case NFT_MSG_NEWSET
:
8163 nft_clear(net
, nft_trans_set(trans
));
8164 /* This avoids hitting -EBUSY when deleting the table
8165 * from the transaction.
8167 if (nft_set_is_anonymous(nft_trans_set(trans
)) &&
8168 !list_empty(&nft_trans_set(trans
)->bindings
))
8169 trans
->ctx
.table
->use
--;
8171 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
8172 NFT_MSG_NEWSET
, GFP_KERNEL
);
8173 nft_trans_destroy(trans
);
8175 case NFT_MSG_DELSET
:
8176 list_del_rcu(&nft_trans_set(trans
)->list
);
8177 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
8178 NFT_MSG_DELSET
, GFP_KERNEL
);
8180 case NFT_MSG_NEWSETELEM
:
8181 te
= (struct nft_trans_elem
*)trans
->data
;
8183 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
8184 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
8186 NFT_MSG_NEWSETELEM
, 0);
8187 nft_trans_destroy(trans
);
8189 case NFT_MSG_DELSETELEM
:
8190 te
= (struct nft_trans_elem
*)trans
->data
;
8192 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
8194 NFT_MSG_DELSETELEM
, 0);
8195 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
8196 atomic_dec(&te
->set
->nelems
);
8199 case NFT_MSG_NEWOBJ
:
8200 if (nft_trans_obj_update(trans
)) {
8201 nft_obj_commit_update(trans
);
8202 nf_tables_obj_notify(&trans
->ctx
,
8203 nft_trans_obj(trans
),
8206 nft_clear(net
, nft_trans_obj(trans
));
8207 nf_tables_obj_notify(&trans
->ctx
,
8208 nft_trans_obj(trans
),
8210 nft_trans_destroy(trans
);
8213 case NFT_MSG_DELOBJ
:
8214 nft_obj_del(nft_trans_obj(trans
));
8215 nf_tables_obj_notify(&trans
->ctx
, nft_trans_obj(trans
),
8218 case NFT_MSG_NEWFLOWTABLE
:
8219 if (nft_trans_flowtable_update(trans
)) {
8220 nft_trans_flowtable(trans
)->data
.flags
=
8221 nft_trans_flowtable_flags(trans
);
8222 nf_tables_flowtable_notify(&trans
->ctx
,
8223 nft_trans_flowtable(trans
),
8224 &nft_trans_flowtable_hooks(trans
),
8225 NFT_MSG_NEWFLOWTABLE
);
8226 list_splice(&nft_trans_flowtable_hooks(trans
),
8227 &nft_trans_flowtable(trans
)->hook_list
);
8229 nft_clear(net
, nft_trans_flowtable(trans
));
8230 nf_tables_flowtable_notify(&trans
->ctx
,
8231 nft_trans_flowtable(trans
),
8232 &nft_trans_flowtable(trans
)->hook_list
,
8233 NFT_MSG_NEWFLOWTABLE
);
8235 nft_trans_destroy(trans
);
8237 case NFT_MSG_DELFLOWTABLE
:
8238 if (nft_trans_flowtable_update(trans
)) {
8239 nft_flowtable_hooks_del(nft_trans_flowtable(trans
),
8240 &nft_trans_flowtable_hooks(trans
));
8241 nf_tables_flowtable_notify(&trans
->ctx
,
8242 nft_trans_flowtable(trans
),
8243 &nft_trans_flowtable_hooks(trans
),
8244 NFT_MSG_DELFLOWTABLE
);
8245 nft_unregister_flowtable_net_hooks(net
,
8246 &nft_trans_flowtable_hooks(trans
));
8248 list_del_rcu(&nft_trans_flowtable(trans
)->list
);
8249 nf_tables_flowtable_notify(&trans
->ctx
,
8250 nft_trans_flowtable(trans
),
8251 &nft_trans_flowtable(trans
)->hook_list
,
8252 NFT_MSG_DELFLOWTABLE
);
8253 nft_unregister_flowtable_net_hooks(net
,
8254 &nft_trans_flowtable(trans
)->hook_list
);
8260 nft_commit_notify(net
, NETLINK_CB(skb
).portid
);
8261 nf_tables_gen_notify(net
, skb
, NFT_MSG_NEWGEN
);
8262 nf_tables_commit_audit_log(&adl
, net
->nft
.base_seq
);
8263 nf_tables_commit_release(net
);
8268 static void nf_tables_module_autoload(struct net
*net
)
8270 struct nft_module_request
*req
, *next
;
8271 LIST_HEAD(module_list
);
8273 list_splice_init(&net
->nft
.module_list
, &module_list
);
8274 mutex_unlock(&net
->nft
.commit_mutex
);
8275 list_for_each_entry_safe(req
, next
, &module_list
, list
) {
8276 request_module("%s", req
->module
);
8279 mutex_lock(&net
->nft
.commit_mutex
);
8280 list_splice(&module_list
, &net
->nft
.module_list
);
8283 static void nf_tables_abort_release(struct nft_trans
*trans
)
8285 switch (trans
->msg_type
) {
8286 case NFT_MSG_NEWTABLE
:
8287 nf_tables_table_destroy(&trans
->ctx
);
8289 case NFT_MSG_NEWCHAIN
:
8290 nf_tables_chain_destroy(&trans
->ctx
);
8292 case NFT_MSG_NEWRULE
:
8293 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
8295 case NFT_MSG_NEWSET
:
8296 nft_set_destroy(&trans
->ctx
, nft_trans_set(trans
));
8298 case NFT_MSG_NEWSETELEM
:
8299 nft_set_elem_destroy(nft_trans_elem_set(trans
),
8300 nft_trans_elem(trans
).priv
, true);
8302 case NFT_MSG_NEWOBJ
:
8303 nft_obj_destroy(&trans
->ctx
, nft_trans_obj(trans
));
8305 case NFT_MSG_NEWFLOWTABLE
:
8306 if (nft_trans_flowtable_update(trans
))
8307 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans
));
8309 nf_tables_flowtable_destroy(nft_trans_flowtable(trans
));
8315 static int __nf_tables_abort(struct net
*net
, enum nfnl_abort_action action
)
8317 struct nft_trans
*trans
, *next
;
8318 struct nft_trans_elem
*te
;
8319 struct nft_hook
*hook
;
8321 if (action
== NFNL_ABORT_VALIDATE
&&
8322 nf_tables_validate(net
) < 0)
8325 list_for_each_entry_safe_reverse(trans
, next
, &net
->nft
.commit_list
,
8327 switch (trans
->msg_type
) {
8328 case NFT_MSG_NEWTABLE
:
8329 if (nft_trans_table_update(trans
)) {
8330 if (nft_trans_table_state(trans
) == NFT_TABLE_STATE_WAKEUP
)
8331 nf_tables_table_disable(net
, trans
->ctx
.table
);
8333 nft_trans_destroy(trans
);
8335 list_del_rcu(&trans
->ctx
.table
->list
);
8338 case NFT_MSG_DELTABLE
:
8339 nft_clear(trans
->ctx
.net
, trans
->ctx
.table
);
8340 nft_trans_destroy(trans
);
8342 case NFT_MSG_NEWCHAIN
:
8343 if (nft_trans_chain_update(trans
)) {
8344 free_percpu(nft_trans_chain_stats(trans
));
8345 kfree(nft_trans_chain_name(trans
));
8346 nft_trans_destroy(trans
);
8348 if (nft_chain_is_bound(trans
->ctx
.chain
)) {
8349 nft_trans_destroy(trans
);
8352 trans
->ctx
.table
->use
--;
8353 nft_chain_del(trans
->ctx
.chain
);
8354 nf_tables_unregister_hook(trans
->ctx
.net
,
8359 case NFT_MSG_DELCHAIN
:
8360 trans
->ctx
.table
->use
++;
8361 nft_clear(trans
->ctx
.net
, trans
->ctx
.chain
);
8362 nft_trans_destroy(trans
);
8364 case NFT_MSG_NEWRULE
:
8365 trans
->ctx
.chain
->use
--;
8366 list_del_rcu(&nft_trans_rule(trans
)->list
);
8367 nft_rule_expr_deactivate(&trans
->ctx
,
8368 nft_trans_rule(trans
),
8371 case NFT_MSG_DELRULE
:
8372 trans
->ctx
.chain
->use
++;
8373 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
8374 nft_rule_expr_activate(&trans
->ctx
, nft_trans_rule(trans
));
8375 nft_trans_destroy(trans
);
8377 case NFT_MSG_NEWSET
:
8378 trans
->ctx
.table
->use
--;
8379 if (nft_trans_set_bound(trans
)) {
8380 nft_trans_destroy(trans
);
8383 list_del_rcu(&nft_trans_set(trans
)->list
);
8385 case NFT_MSG_DELSET
:
8386 trans
->ctx
.table
->use
++;
8387 nft_clear(trans
->ctx
.net
, nft_trans_set(trans
));
8388 nft_trans_destroy(trans
);
8390 case NFT_MSG_NEWSETELEM
:
8391 if (nft_trans_elem_set_bound(trans
)) {
8392 nft_trans_destroy(trans
);
8395 te
= (struct nft_trans_elem
*)trans
->data
;
8396 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
8397 atomic_dec(&te
->set
->nelems
);
8399 case NFT_MSG_DELSETELEM
:
8400 te
= (struct nft_trans_elem
*)trans
->data
;
8402 nft_set_elem_activate(net
, te
->set
, &te
->elem
);
8403 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
8406 nft_trans_destroy(trans
);
8408 case NFT_MSG_NEWOBJ
:
8409 if (nft_trans_obj_update(trans
)) {
8410 kfree(nft_trans_obj_newobj(trans
));
8411 nft_trans_destroy(trans
);
8413 trans
->ctx
.table
->use
--;
8414 nft_obj_del(nft_trans_obj(trans
));
8417 case NFT_MSG_DELOBJ
:
8418 trans
->ctx
.table
->use
++;
8419 nft_clear(trans
->ctx
.net
, nft_trans_obj(trans
));
8420 nft_trans_destroy(trans
);
8422 case NFT_MSG_NEWFLOWTABLE
:
8423 if (nft_trans_flowtable_update(trans
)) {
8424 nft_unregister_flowtable_net_hooks(net
,
8425 &nft_trans_flowtable_hooks(trans
));
8427 trans
->ctx
.table
->use
--;
8428 list_del_rcu(&nft_trans_flowtable(trans
)->list
);
8429 nft_unregister_flowtable_net_hooks(net
,
8430 &nft_trans_flowtable(trans
)->hook_list
);
8433 case NFT_MSG_DELFLOWTABLE
:
8434 if (nft_trans_flowtable_update(trans
)) {
8435 list_for_each_entry(hook
, &nft_trans_flowtable(trans
)->hook_list
, list
)
8436 hook
->inactive
= false;
8438 trans
->ctx
.table
->use
++;
8439 nft_clear(trans
->ctx
.net
, nft_trans_flowtable(trans
));
8441 nft_trans_destroy(trans
);
8448 list_for_each_entry_safe_reverse(trans
, next
,
8449 &net
->nft
.commit_list
, list
) {
8450 list_del(&trans
->list
);
8451 nf_tables_abort_release(trans
);
8454 if (action
== NFNL_ABORT_AUTOLOAD
)
8455 nf_tables_module_autoload(net
);
8457 nf_tables_module_autoload_cleanup(net
);
8462 static void nf_tables_cleanup(struct net
*net
)
8464 nft_validate_state_update(net
, NFT_VALIDATE_SKIP
);
8467 static int nf_tables_abort(struct net
*net
, struct sk_buff
*skb
,
8468 enum nfnl_abort_action action
)
8470 int ret
= __nf_tables_abort(net
, action
);
8472 mutex_unlock(&net
->nft
.commit_mutex
);
8477 static bool nf_tables_valid_genid(struct net
*net
, u32 genid
)
8481 mutex_lock(&net
->nft
.commit_mutex
);
8483 genid_ok
= genid
== 0 || net
->nft
.base_seq
== genid
;
8485 mutex_unlock(&net
->nft
.commit_mutex
);
8487 /* else, commit mutex has to be released by commit or abort function */
8491 static const struct nfnetlink_subsystem nf_tables_subsys
= {
8492 .name
= "nf_tables",
8493 .subsys_id
= NFNL_SUBSYS_NFTABLES
,
8494 .cb_count
= NFT_MSG_MAX
,
8496 .commit
= nf_tables_commit
,
8497 .abort
= nf_tables_abort
,
8498 .cleanup
= nf_tables_cleanup
,
8499 .valid_genid
= nf_tables_valid_genid
,
8500 .owner
= THIS_MODULE
,
8503 int nft_chain_validate_dependency(const struct nft_chain
*chain
,
8504 enum nft_chain_types type
)
8506 const struct nft_base_chain
*basechain
;
8508 if (nft_is_base_chain(chain
)) {
8509 basechain
= nft_base_chain(chain
);
8510 if (basechain
->type
->type
!= type
)
8515 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency
);
8517 int nft_chain_validate_hooks(const struct nft_chain
*chain
,
8518 unsigned int hook_flags
)
8520 struct nft_base_chain
*basechain
;
8522 if (nft_is_base_chain(chain
)) {
8523 basechain
= nft_base_chain(chain
);
8525 if ((1 << basechain
->ops
.hooknum
) & hook_flags
)
8533 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks
);
8536 * Loop detection - walk through the ruleset beginning at the destination chain
8537 * of a new jump until either the source chain is reached (loop) or all
8538 * reachable chains have been traversed.
8540 * The loop check is performed whenever a new jump verdict is added to an
8541 * expression or verdict map or a verdict map is bound to a new chain.
8544 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
8545 const struct nft_chain
*chain
);
8547 static int nf_tables_loop_check_setelem(const struct nft_ctx
*ctx
,
8548 struct nft_set
*set
,
8549 const struct nft_set_iter
*iter
,
8550 struct nft_set_elem
*elem
)
8552 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
8553 const struct nft_data
*data
;
8555 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
8556 *nft_set_ext_flags(ext
) & NFT_SET_ELEM_INTERVAL_END
)
8559 data
= nft_set_ext_data(ext
);
8560 switch (data
->verdict
.code
) {
8563 return nf_tables_check_loops(ctx
, data
->verdict
.chain
);
8569 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
8570 const struct nft_chain
*chain
)
8572 const struct nft_rule
*rule
;
8573 const struct nft_expr
*expr
, *last
;
8574 struct nft_set
*set
;
8575 struct nft_set_binding
*binding
;
8576 struct nft_set_iter iter
;
8578 if (ctx
->chain
== chain
)
8581 list_for_each_entry(rule
, &chain
->rules
, list
) {
8582 nft_rule_for_each_expr(expr
, last
, rule
) {
8583 struct nft_immediate_expr
*priv
;
8584 const struct nft_data
*data
;
8587 if (strcmp(expr
->ops
->type
->name
, "immediate"))
8590 priv
= nft_expr_priv(expr
);
8591 if (priv
->dreg
!= NFT_REG_VERDICT
)
8595 switch (data
->verdict
.code
) {
8598 err
= nf_tables_check_loops(ctx
,
8599 data
->verdict
.chain
);
8609 list_for_each_entry(set
, &ctx
->table
->sets
, list
) {
8610 if (!nft_is_active_next(ctx
->net
, set
))
8612 if (!(set
->flags
& NFT_SET_MAP
) ||
8613 set
->dtype
!= NFT_DATA_VERDICT
)
8616 list_for_each_entry(binding
, &set
->bindings
, list
) {
8617 if (!(binding
->flags
& NFT_SET_MAP
) ||
8618 binding
->chain
!= chain
)
8621 iter
.genmask
= nft_genmask_next(ctx
->net
);
8625 iter
.fn
= nf_tables_loop_check_setelem
;
8627 set
->ops
->walk(ctx
, set
, &iter
);
8637 * nft_parse_u32_check - fetch u32 attribute and check for maximum value
8639 * @attr: netlink attribute to fetch value from
8640 * @max: maximum value to be stored in dest
8641 * @dest: pointer to the variable
8643 * Parse, check and store a given u32 netlink attribute into variable.
8644 * This function returns -ERANGE if the value goes over maximum value.
8645 * Otherwise a 0 is returned and the attribute value is stored in the
8646 * destination variable.
8648 int nft_parse_u32_check(const struct nlattr
*attr
, int max
, u32
*dest
)
8652 val
= ntohl(nla_get_be32(attr
));
8659 EXPORT_SYMBOL_GPL(nft_parse_u32_check
);
8662 * nft_parse_register - parse a register value from a netlink attribute
8664 * @attr: netlink attribute
8666 * Parse and translate a register value from a netlink attribute.
8667 * Registers used to be 128 bit wide, these register numbers will be
8668 * mapped to the corresponding 32 bit register numbers.
8670 static unsigned int nft_parse_register(const struct nlattr
*attr
)
8674 reg
= ntohl(nla_get_be32(attr
));
8676 case NFT_REG_VERDICT
...NFT_REG_4
:
8677 return reg
* NFT_REG_SIZE
/ NFT_REG32_SIZE
;
8679 return reg
+ NFT_REG_SIZE
/ NFT_REG32_SIZE
- NFT_REG32_00
;
8684 * nft_dump_register - dump a register value to a netlink attribute
8686 * @skb: socket buffer
8687 * @attr: attribute number
8688 * @reg: register number
8690 * Construct a netlink attribute containing the register number. For
8691 * compatibility reasons, register numbers being a multiple of 4 are
8692 * translated to the corresponding 128 bit register numbers.
8694 int nft_dump_register(struct sk_buff
*skb
, unsigned int attr
, unsigned int reg
)
8696 if (reg
% (NFT_REG_SIZE
/ NFT_REG32_SIZE
) == 0)
8697 reg
= reg
/ (NFT_REG_SIZE
/ NFT_REG32_SIZE
);
8699 reg
= reg
- NFT_REG_SIZE
/ NFT_REG32_SIZE
+ NFT_REG32_00
;
8701 return nla_put_be32(skb
, attr
, htonl(reg
));
8703 EXPORT_SYMBOL_GPL(nft_dump_register
);
8706 * nft_validate_register_load - validate a load from a register
8708 * @reg: the register number
8709 * @len: the length of the data
8711 * Validate that the input register is one of the general purpose
8712 * registers and that the length of the load is within the bounds.
8714 static int nft_validate_register_load(enum nft_registers reg
, unsigned int len
)
8716 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
8720 if (reg
* NFT_REG32_SIZE
+ len
> sizeof_field(struct nft_regs
, data
))
8726 int nft_parse_register_load(const struct nlattr
*attr
, u8
*sreg
, u32 len
)
8731 reg
= nft_parse_register(attr
);
8732 err
= nft_validate_register_load(reg
, len
);
8739 EXPORT_SYMBOL_GPL(nft_parse_register_load
);
8742 * nft_validate_register_store - validate an expressions' register store
8744 * @ctx: context of the expression performing the load
8745 * @reg: the destination register number
8746 * @data: the data to load
8747 * @type: the data type
8748 * @len: the length of the data
8750 * Validate that a data load uses the appropriate data type for
8751 * the destination register and the length is within the bounds.
8752 * A value of NULL for the data means that its runtime gathered
8755 static int nft_validate_register_store(const struct nft_ctx
*ctx
,
8756 enum nft_registers reg
,
8757 const struct nft_data
*data
,
8758 enum nft_data_types type
,
8764 case NFT_REG_VERDICT
:
8765 if (type
!= NFT_DATA_VERDICT
)
8769 (data
->verdict
.code
== NFT_GOTO
||
8770 data
->verdict
.code
== NFT_JUMP
)) {
8771 err
= nf_tables_check_loops(ctx
, data
->verdict
.chain
);
8778 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
8782 if (reg
* NFT_REG32_SIZE
+ len
>
8783 sizeof_field(struct nft_regs
, data
))
8786 if (data
!= NULL
&& type
!= NFT_DATA_VALUE
)
8792 int nft_parse_register_store(const struct nft_ctx
*ctx
,
8793 const struct nlattr
*attr
, u8
*dreg
,
8794 const struct nft_data
*data
,
8795 enum nft_data_types type
, unsigned int len
)
8800 reg
= nft_parse_register(attr
);
8801 err
= nft_validate_register_store(ctx
, reg
, data
, type
, len
);
8808 EXPORT_SYMBOL_GPL(nft_parse_register_store
);
8810 static const struct nla_policy nft_verdict_policy
[NFTA_VERDICT_MAX
+ 1] = {
8811 [NFTA_VERDICT_CODE
] = { .type
= NLA_U32
},
8812 [NFTA_VERDICT_CHAIN
] = { .type
= NLA_STRING
,
8813 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
8814 [NFTA_VERDICT_CHAIN_ID
] = { .type
= NLA_U32
},
8817 static int nft_verdict_init(const struct nft_ctx
*ctx
, struct nft_data
*data
,
8818 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8820 u8 genmask
= nft_genmask_next(ctx
->net
);
8821 struct nlattr
*tb
[NFTA_VERDICT_MAX
+ 1];
8822 struct nft_chain
*chain
;
8825 err
= nla_parse_nested_deprecated(tb
, NFTA_VERDICT_MAX
, nla
,
8826 nft_verdict_policy
, NULL
);
8830 if (!tb
[NFTA_VERDICT_CODE
])
8832 data
->verdict
.code
= ntohl(nla_get_be32(tb
[NFTA_VERDICT_CODE
]));
8834 switch (data
->verdict
.code
) {
8836 switch (data
->verdict
.code
& NF_VERDICT_MASK
) {
8851 if (tb
[NFTA_VERDICT_CHAIN
]) {
8852 chain
= nft_chain_lookup(ctx
->net
, ctx
->table
,
8853 tb
[NFTA_VERDICT_CHAIN
],
8855 } else if (tb
[NFTA_VERDICT_CHAIN_ID
]) {
8856 chain
= nft_chain_lookup_byid(ctx
->net
,
8857 tb
[NFTA_VERDICT_CHAIN_ID
]);
8859 return PTR_ERR(chain
);
8865 return PTR_ERR(chain
);
8866 if (nft_is_base_chain(chain
))
8870 data
->verdict
.chain
= chain
;
8874 desc
->len
= sizeof(data
->verdict
);
8875 desc
->type
= NFT_DATA_VERDICT
;
8879 static void nft_verdict_uninit(const struct nft_data
*data
)
8881 struct nft_chain
*chain
;
8882 struct nft_rule
*rule
;
8884 switch (data
->verdict
.code
) {
8887 chain
= data
->verdict
.chain
;
8890 if (!nft_chain_is_bound(chain
))
8893 chain
->table
->use
--;
8894 list_for_each_entry(rule
, &chain
->rules
, list
)
8897 nft_chain_del(chain
);
8902 int nft_verdict_dump(struct sk_buff
*skb
, int type
, const struct nft_verdict
*v
)
8904 struct nlattr
*nest
;
8906 nest
= nla_nest_start_noflag(skb
, type
);
8908 goto nla_put_failure
;
8910 if (nla_put_be32(skb
, NFTA_VERDICT_CODE
, htonl(v
->code
)))
8911 goto nla_put_failure
;
8916 if (nla_put_string(skb
, NFTA_VERDICT_CHAIN
,
8918 goto nla_put_failure
;
8920 nla_nest_end(skb
, nest
);
8927 static int nft_value_init(const struct nft_ctx
*ctx
,
8928 struct nft_data
*data
, unsigned int size
,
8929 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8939 nla_memcpy(data
->data
, nla
, len
);
8940 desc
->type
= NFT_DATA_VALUE
;
8945 static int nft_value_dump(struct sk_buff
*skb
, const struct nft_data
*data
,
8948 return nla_put(skb
, NFTA_DATA_VALUE
, len
, data
->data
);
8951 static const struct nla_policy nft_data_policy
[NFTA_DATA_MAX
+ 1] = {
8952 [NFTA_DATA_VALUE
] = { .type
= NLA_BINARY
},
8953 [NFTA_DATA_VERDICT
] = { .type
= NLA_NESTED
},
8957 * nft_data_init - parse nf_tables data netlink attributes
8959 * @ctx: context of the expression using the data
8960 * @data: destination struct nft_data
8961 * @size: maximum data length
8962 * @desc: data description
8963 * @nla: netlink attribute containing data
8965 * Parse the netlink data attributes and initialize a struct nft_data.
8966 * The type and length of data are returned in the data description.
8968 * The caller can indicate that it only wants to accept data of type
8969 * NFT_DATA_VALUE by passing NULL for the ctx argument.
8971 int nft_data_init(const struct nft_ctx
*ctx
,
8972 struct nft_data
*data
, unsigned int size
,
8973 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8975 struct nlattr
*tb
[NFTA_DATA_MAX
+ 1];
8978 err
= nla_parse_nested_deprecated(tb
, NFTA_DATA_MAX
, nla
,
8979 nft_data_policy
, NULL
);
8983 if (tb
[NFTA_DATA_VALUE
])
8984 return nft_value_init(ctx
, data
, size
, desc
,
8985 tb
[NFTA_DATA_VALUE
]);
8986 if (tb
[NFTA_DATA_VERDICT
] && ctx
!= NULL
)
8987 return nft_verdict_init(ctx
, data
, desc
, tb
[NFTA_DATA_VERDICT
]);
8990 EXPORT_SYMBOL_GPL(nft_data_init
);
8993 * nft_data_release - release a nft_data item
8995 * @data: struct nft_data to release
8996 * @type: type of data
8998 * Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
8999 * all others need to be released by calling this function.
9001 void nft_data_release(const struct nft_data
*data
, enum nft_data_types type
)
9003 if (type
< NFT_DATA_VERDICT
)
9006 case NFT_DATA_VERDICT
:
9007 return nft_verdict_uninit(data
);
9012 EXPORT_SYMBOL_GPL(nft_data_release
);
9014 int nft_data_dump(struct sk_buff
*skb
, int attr
, const struct nft_data
*data
,
9015 enum nft_data_types type
, unsigned int len
)
9017 struct nlattr
*nest
;
9020 nest
= nla_nest_start_noflag(skb
, attr
);
9025 case NFT_DATA_VALUE
:
9026 err
= nft_value_dump(skb
, data
, len
);
9028 case NFT_DATA_VERDICT
:
9029 err
= nft_verdict_dump(skb
, NFTA_DATA_VERDICT
, &data
->verdict
);
9036 nla_nest_end(skb
, nest
);
9039 EXPORT_SYMBOL_GPL(nft_data_dump
);
9041 int __nft_release_basechain(struct nft_ctx
*ctx
)
9043 struct nft_rule
*rule
, *nr
;
9045 if (WARN_ON(!nft_is_base_chain(ctx
->chain
)))
9048 nf_tables_unregister_hook(ctx
->net
, ctx
->chain
->table
, ctx
->chain
);
9049 list_for_each_entry_safe(rule
, nr
, &ctx
->chain
->rules
, list
) {
9050 list_del(&rule
->list
);
9052 nf_tables_rule_release(ctx
, rule
);
9054 nft_chain_del(ctx
->chain
);
9056 nf_tables_chain_destroy(ctx
);
9060 EXPORT_SYMBOL_GPL(__nft_release_basechain
);
9062 static void __nft_release_hook(struct net
*net
, struct nft_table
*table
)
9064 struct nft_chain
*chain
;
9066 list_for_each_entry(chain
, &table
->chains
, list
)
9067 nf_tables_unregister_hook(net
, table
, chain
);
9070 static void __nft_release_hooks(struct net
*net
)
9072 struct nft_table
*table
;
9074 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
9075 if (nft_table_has_owner(table
))
9078 __nft_release_hook(net
, table
);
9082 static void __nft_release_table(struct net
*net
, struct nft_table
*table
)
9084 struct nft_flowtable
*flowtable
, *nf
;
9085 struct nft_chain
*chain
, *nc
;
9086 struct nft_object
*obj
, *ne
;
9087 struct nft_rule
*rule
, *nr
;
9088 struct nft_set
*set
, *ns
;
9089 struct nft_ctx ctx
= {
9091 .family
= NFPROTO_NETDEV
,
9094 ctx
.family
= table
->family
;
9096 list_for_each_entry(chain
, &table
->chains
, list
) {
9098 list_for_each_entry_safe(rule
, nr
, &chain
->rules
, list
) {
9099 list_del(&rule
->list
);
9101 nf_tables_rule_release(&ctx
, rule
);
9104 list_for_each_entry_safe(flowtable
, nf
, &table
->flowtables
, list
) {
9105 list_del(&flowtable
->list
);
9107 nf_tables_flowtable_destroy(flowtable
);
9109 list_for_each_entry_safe(set
, ns
, &table
->sets
, list
) {
9110 list_del(&set
->list
);
9112 nft_set_destroy(&ctx
, set
);
9114 list_for_each_entry_safe(obj
, ne
, &table
->objects
, list
) {
9117 nft_obj_destroy(&ctx
, obj
);
9119 list_for_each_entry_safe(chain
, nc
, &table
->chains
, list
) {
9121 nft_chain_del(chain
);
9123 nf_tables_chain_destroy(&ctx
);
9125 list_del(&table
->list
);
9126 nf_tables_table_destroy(&ctx
);
9129 static void __nft_release_tables(struct net
*net
)
9131 struct nft_table
*table
, *nt
;
9133 list_for_each_entry_safe(table
, nt
, &net
->nft
.tables
, list
) {
9134 if (nft_table_has_owner(table
))
9137 __nft_release_table(net
, table
);
9141 static int nft_rcv_nl_event(struct notifier_block
*this, unsigned long event
,
9144 struct netlink_notify
*n
= ptr
;
9145 struct nft_table
*table
, *nt
;
9146 struct net
*net
= n
->net
;
9147 bool release
= false;
9149 if (event
!= NETLINK_URELEASE
|| n
->protocol
!= NETLINK_NETFILTER
)
9152 mutex_lock(&net
->nft
.commit_mutex
);
9153 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
9154 if (nft_table_has_owner(table
) &&
9155 n
->portid
== table
->nlpid
) {
9156 __nft_release_hook(net
, table
);
9162 list_for_each_entry_safe(table
, nt
, &net
->nft
.tables
, list
) {
9163 if (nft_table_has_owner(table
) &&
9164 n
->portid
== table
->nlpid
)
9165 __nft_release_table(net
, table
);
9168 mutex_unlock(&net
->nft
.commit_mutex
);
9173 static struct notifier_block nft_nl_notifier
= {
9174 .notifier_call
= nft_rcv_nl_event
,
9177 static int __net_init
nf_tables_init_net(struct net
*net
)
9179 INIT_LIST_HEAD(&net
->nft
.tables
);
9180 INIT_LIST_HEAD(&net
->nft
.commit_list
);
9181 INIT_LIST_HEAD(&net
->nft
.module_list
);
9182 INIT_LIST_HEAD(&net
->nft
.notify_list
);
9183 mutex_init(&net
->nft
.commit_mutex
);
9184 net
->nft
.base_seq
= 1;
9185 net
->nft
.validate_state
= NFT_VALIDATE_SKIP
;
9190 static void __net_exit
nf_tables_pre_exit_net(struct net
*net
)
9192 __nft_release_hooks(net
);
9195 static void __net_exit
nf_tables_exit_net(struct net
*net
)
9197 mutex_lock(&net
->nft
.commit_mutex
);
9198 if (!list_empty(&net
->nft
.commit_list
))
9199 __nf_tables_abort(net
, NFNL_ABORT_NONE
);
9200 __nft_release_tables(net
);
9201 mutex_unlock(&net
->nft
.commit_mutex
);
9202 WARN_ON_ONCE(!list_empty(&net
->nft
.tables
));
9203 WARN_ON_ONCE(!list_empty(&net
->nft
.module_list
));
9204 WARN_ON_ONCE(!list_empty(&net
->nft
.notify_list
));
9207 static struct pernet_operations nf_tables_net_ops
= {
9208 .init
= nf_tables_init_net
,
9209 .pre_exit
= nf_tables_pre_exit_net
,
9210 .exit
= nf_tables_exit_net
,
9213 static int __init
nf_tables_module_init(void)
9217 spin_lock_init(&nf_tables_destroy_list_lock
);
9218 err
= register_pernet_subsys(&nf_tables_net_ops
);
9222 err
= nft_chain_filter_init();
9224 goto err_chain_filter
;
9226 err
= nf_tables_core_module_init();
9228 goto err_core_module
;
9230 err
= register_netdevice_notifier(&nf_tables_flowtable_notifier
);
9232 goto err_netdev_notifier
;
9234 err
= rhltable_init(&nft_objname_ht
, &nft_objname_ht_params
);
9236 goto err_rht_objname
;
9238 err
= nft_offload_init();
9242 err
= netlink_register_notifier(&nft_nl_notifier
);
9244 goto err_netlink_notifier
;
9247 err
= nfnetlink_subsys_register(&nf_tables_subsys
);
9249 goto err_nfnl_subsys
;
9251 nft_chain_route_init();
9256 netlink_unregister_notifier(&nft_nl_notifier
);
9257 err_netlink_notifier
:
9260 rhltable_destroy(&nft_objname_ht
);
9262 unregister_netdevice_notifier(&nf_tables_flowtable_notifier
);
9263 err_netdev_notifier
:
9264 nf_tables_core_module_exit();
9266 nft_chain_filter_fini();
9268 unregister_pernet_subsys(&nf_tables_net_ops
);
9272 static void __exit
nf_tables_module_exit(void)
9274 nfnetlink_subsys_unregister(&nf_tables_subsys
);
9275 netlink_unregister_notifier(&nft_nl_notifier
);
9277 unregister_netdevice_notifier(&nf_tables_flowtable_notifier
);
9278 nft_chain_filter_fini();
9279 nft_chain_route_fini();
9280 unregister_pernet_subsys(&nf_tables_net_ops
);
9281 cancel_work_sync(&trans_destroy_work
);
9283 rhltable_destroy(&nft_objname_ht
);
9284 nf_tables_core_module_exit();
9287 module_init(nf_tables_module_init
);
9288 module_exit(nf_tables_module_exit
);
9290 MODULE_LICENSE("GPL");
9291 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
9292 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES
);