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 __be16
nft_base_seq(const struct net
*net
)
693 return htons(net
->nft
.base_seq
& 0xffff);
696 static const struct nla_policy nft_table_policy
[NFTA_TABLE_MAX
+ 1] = {
697 [NFTA_TABLE_NAME
] = { .type
= NLA_STRING
,
698 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
699 [NFTA_TABLE_FLAGS
] = { .type
= NLA_U32
},
700 [NFTA_TABLE_HANDLE
] = { .type
= NLA_U64
},
701 [NFTA_TABLE_USERDATA
] = { .type
= NLA_BINARY
,
702 .len
= NFT_USERDATA_MAXLEN
}
705 static int nf_tables_fill_table_info(struct sk_buff
*skb
, struct net
*net
,
706 u32 portid
, u32 seq
, int event
, u32 flags
,
707 int family
, const struct nft_table
*table
)
709 struct nlmsghdr
*nlh
;
710 struct nfgenmsg
*nfmsg
;
712 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
713 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
715 goto nla_put_failure
;
717 nfmsg
= nlmsg_data(nlh
);
718 nfmsg
->nfgen_family
= family
;
719 nfmsg
->version
= NFNETLINK_V0
;
720 nfmsg
->res_id
= nft_base_seq(net
);
722 if (nla_put_string(skb
, NFTA_TABLE_NAME
, table
->name
) ||
723 nla_put_be32(skb
, NFTA_TABLE_FLAGS
, htonl(table
->flags
)) ||
724 nla_put_be32(skb
, NFTA_TABLE_USE
, htonl(table
->use
)) ||
725 nla_put_be64(skb
, NFTA_TABLE_HANDLE
, cpu_to_be64(table
->handle
),
727 goto nla_put_failure
;
728 if (nft_table_has_owner(table
) &&
729 nla_put_be32(skb
, NFTA_TABLE_OWNER
, htonl(table
->nlpid
)))
730 goto nla_put_failure
;
733 if (nla_put(skb
, NFTA_TABLE_USERDATA
, table
->udlen
, table
->udata
))
734 goto nla_put_failure
;
741 nlmsg_trim(skb
, nlh
);
745 struct nftnl_skb_parms
{
748 #define NFT_CB(skb) (*(struct nftnl_skb_parms*)&((skb)->cb))
750 static void nft_notify_enqueue(struct sk_buff
*skb
, bool report
,
751 struct list_head
*notify_list
)
753 NFT_CB(skb
).report
= report
;
754 list_add_tail(&skb
->list
, notify_list
);
757 static void nf_tables_table_notify(const struct nft_ctx
*ctx
, int event
)
763 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
766 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
770 err
= nf_tables_fill_table_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
771 event
, 0, ctx
->family
, ctx
->table
);
777 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
780 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
783 static int nf_tables_dump_tables(struct sk_buff
*skb
,
784 struct netlink_callback
*cb
)
786 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
787 const struct nft_table
*table
;
788 unsigned int idx
= 0, s_idx
= cb
->args
[0];
789 struct net
*net
= sock_net(skb
->sk
);
790 int family
= nfmsg
->nfgen_family
;
793 cb
->seq
= net
->nft
.base_seq
;
795 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
796 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
802 memset(&cb
->args
[1], 0,
803 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
804 if (!nft_is_active(net
, table
))
806 if (nf_tables_fill_table_info(skb
, net
,
807 NETLINK_CB(cb
->skb
).portid
,
809 NFT_MSG_NEWTABLE
, NLM_F_MULTI
,
810 table
->family
, table
) < 0)
813 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
823 static int nft_netlink_dump_start_rcu(struct sock
*nlsk
, struct sk_buff
*skb
,
824 const struct nlmsghdr
*nlh
,
825 struct netlink_dump_control
*c
)
829 if (!try_module_get(THIS_MODULE
))
833 err
= netlink_dump_start(nlsk
, skb
, nlh
, c
);
835 module_put(THIS_MODULE
);
840 /* called with rcu_read_lock held */
841 static int nf_tables_gettable(struct net
*net
, struct sock
*nlsk
,
842 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
843 const struct nlattr
* const nla
[],
844 struct netlink_ext_ack
*extack
)
846 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
847 u8 genmask
= nft_genmask_cur(net
);
848 const struct nft_table
*table
;
849 struct sk_buff
*skb2
;
850 int family
= nfmsg
->nfgen_family
;
853 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
854 struct netlink_dump_control c
= {
855 .dump
= nf_tables_dump_tables
,
856 .module
= THIS_MODULE
,
859 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
862 table
= nft_table_lookup(net
, nla
[NFTA_TABLE_NAME
], family
, genmask
, 0);
864 NL_SET_BAD_ATTR(extack
, nla
[NFTA_TABLE_NAME
]);
865 return PTR_ERR(table
);
868 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
872 err
= nf_tables_fill_table_info(skb2
, net
, NETLINK_CB(skb
).portid
,
873 nlh
->nlmsg_seq
, NFT_MSG_NEWTABLE
, 0,
876 goto err_fill_table_info
;
878 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
885 static void nft_table_disable(struct net
*net
, struct nft_table
*table
, u32 cnt
)
887 struct nft_chain
*chain
;
890 list_for_each_entry(chain
, &table
->chains
, list
) {
891 if (!nft_is_active_next(net
, chain
))
893 if (!nft_is_base_chain(chain
))
896 if (cnt
&& i
++ == cnt
)
899 nf_tables_unregister_hook(net
, table
, chain
);
903 static int nf_tables_table_enable(struct net
*net
, struct nft_table
*table
)
905 struct nft_chain
*chain
;
908 list_for_each_entry(chain
, &table
->chains
, list
) {
909 if (!nft_is_active_next(net
, chain
))
911 if (!nft_is_base_chain(chain
))
914 err
= nf_tables_register_hook(net
, table
, chain
);
916 goto err_register_hooks
;
924 nft_table_disable(net
, table
, i
);
928 static void nf_tables_table_disable(struct net
*net
, struct nft_table
*table
)
930 nft_table_disable(net
, table
, 0);
934 NFT_TABLE_STATE_UNCHANGED
= 0,
935 NFT_TABLE_STATE_DORMANT
,
936 NFT_TABLE_STATE_WAKEUP
939 static int nf_tables_updtable(struct nft_ctx
*ctx
)
941 struct nft_trans
*trans
;
945 if (!ctx
->nla
[NFTA_TABLE_FLAGS
])
948 flags
= ntohl(nla_get_be32(ctx
->nla
[NFTA_TABLE_FLAGS
]));
949 if (flags
& ~NFT_TABLE_F_MASK
)
952 if (flags
== ctx
->table
->flags
)
955 if ((nft_table_has_owner(ctx
->table
) &&
956 !(flags
& NFT_TABLE_F_OWNER
)) ||
957 (!nft_table_has_owner(ctx
->table
) &&
958 flags
& NFT_TABLE_F_OWNER
))
961 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWTABLE
,
962 sizeof(struct nft_trans_table
));
966 if ((flags
& NFT_TABLE_F_DORMANT
) &&
967 !(ctx
->table
->flags
& NFT_TABLE_F_DORMANT
)) {
968 nft_trans_table_state(trans
) = NFT_TABLE_STATE_DORMANT
;
969 } else if (!(flags
& NFT_TABLE_F_DORMANT
) &&
970 ctx
->table
->flags
& NFT_TABLE_F_DORMANT
) {
971 ret
= nf_tables_table_enable(ctx
->net
, ctx
->table
);
973 nft_trans_table_state(trans
) = NFT_TABLE_STATE_WAKEUP
;
978 nft_trans_table_flags(trans
) = flags
;
979 nft_trans_table_update(trans
) = true;
980 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
983 nft_trans_destroy(trans
);
987 static u32
nft_chain_hash(const void *data
, u32 len
, u32 seed
)
989 const char *name
= data
;
991 return jhash(name
, strlen(name
), seed
);
994 static u32
nft_chain_hash_obj(const void *data
, u32 len
, u32 seed
)
996 const struct nft_chain
*chain
= data
;
998 return nft_chain_hash(chain
->name
, 0, seed
);
1001 static int nft_chain_hash_cmp(struct rhashtable_compare_arg
*arg
,
1004 const struct nft_chain
*chain
= ptr
;
1005 const char *name
= arg
->key
;
1007 return strcmp(chain
->name
, name
);
1010 static u32
nft_objname_hash(const void *data
, u32 len
, u32 seed
)
1012 const struct nft_object_hash_key
*k
= data
;
1014 seed
^= hash_ptr(k
->table
, 32);
1016 return jhash(k
->name
, strlen(k
->name
), seed
);
1019 static u32
nft_objname_hash_obj(const void *data
, u32 len
, u32 seed
)
1021 const struct nft_object
*obj
= data
;
1023 return nft_objname_hash(&obj
->key
, 0, seed
);
1026 static int nft_objname_hash_cmp(struct rhashtable_compare_arg
*arg
,
1029 const struct nft_object_hash_key
*k
= arg
->key
;
1030 const struct nft_object
*obj
= ptr
;
1032 if (obj
->key
.table
!= k
->table
)
1035 return strcmp(obj
->key
.name
, k
->name
);
1038 static int nf_tables_newtable(struct net
*net
, struct sock
*nlsk
,
1039 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1040 const struct nlattr
* const nla
[],
1041 struct netlink_ext_ack
*extack
)
1043 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1044 u8 genmask
= nft_genmask_next(net
);
1045 int family
= nfmsg
->nfgen_family
;
1046 const struct nlattr
*attr
;
1047 struct nft_table
*table
;
1052 lockdep_assert_held(&net
->nft
.commit_mutex
);
1053 attr
= nla
[NFTA_TABLE_NAME
];
1054 table
= nft_table_lookup(net
, attr
, family
, genmask
,
1055 NETLINK_CB(skb
).portid
);
1056 if (IS_ERR(table
)) {
1057 if (PTR_ERR(table
) != -ENOENT
)
1058 return PTR_ERR(table
);
1060 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
1061 NL_SET_BAD_ATTR(extack
, attr
);
1064 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
1067 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
1068 return nf_tables_updtable(&ctx
);
1071 if (nla
[NFTA_TABLE_FLAGS
]) {
1072 flags
= ntohl(nla_get_be32(nla
[NFTA_TABLE_FLAGS
]));
1073 if (flags
& ~NFT_TABLE_F_MASK
)
1078 table
= kzalloc(sizeof(*table
), GFP_KERNEL
);
1082 table
->name
= nla_strdup(attr
, GFP_KERNEL
);
1083 if (table
->name
== NULL
)
1086 if (nla
[NFTA_TABLE_USERDATA
]) {
1087 table
->udata
= nla_memdup(nla
[NFTA_TABLE_USERDATA
], GFP_KERNEL
);
1088 if (table
->udata
== NULL
)
1089 goto err_table_udata
;
1091 table
->udlen
= nla_len(nla
[NFTA_TABLE_USERDATA
]);
1094 err
= rhltable_init(&table
->chains_ht
, &nft_chain_ht_params
);
1098 INIT_LIST_HEAD(&table
->chains
);
1099 INIT_LIST_HEAD(&table
->sets
);
1100 INIT_LIST_HEAD(&table
->objects
);
1101 INIT_LIST_HEAD(&table
->flowtables
);
1102 table
->family
= family
;
1103 table
->flags
= flags
;
1104 table
->handle
= ++table_handle
;
1105 if (table
->flags
& NFT_TABLE_F_OWNER
)
1106 table
->nlpid
= NETLINK_CB(skb
).portid
;
1108 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
1109 err
= nft_trans_table_add(&ctx
, NFT_MSG_NEWTABLE
);
1113 list_add_tail_rcu(&table
->list
, &net
->nft
.tables
);
1116 rhltable_destroy(&table
->chains_ht
);
1118 kfree(table
->udata
);
1127 static int nft_flush_table(struct nft_ctx
*ctx
)
1129 struct nft_flowtable
*flowtable
, *nft
;
1130 struct nft_chain
*chain
, *nc
;
1131 struct nft_object
*obj
, *ne
;
1132 struct nft_set
*set
, *ns
;
1135 list_for_each_entry(chain
, &ctx
->table
->chains
, list
) {
1136 if (!nft_is_active_next(ctx
->net
, chain
))
1139 if (nft_chain_is_bound(chain
))
1144 err
= nft_delrule_by_chain(ctx
);
1149 list_for_each_entry_safe(set
, ns
, &ctx
->table
->sets
, list
) {
1150 if (!nft_is_active_next(ctx
->net
, set
))
1153 if (nft_set_is_anonymous(set
) &&
1154 !list_empty(&set
->bindings
))
1157 err
= nft_delset(ctx
, set
);
1162 list_for_each_entry_safe(flowtable
, nft
, &ctx
->table
->flowtables
, list
) {
1163 if (!nft_is_active_next(ctx
->net
, flowtable
))
1166 err
= nft_delflowtable(ctx
, flowtable
);
1171 list_for_each_entry_safe(obj
, ne
, &ctx
->table
->objects
, list
) {
1172 if (!nft_is_active_next(ctx
->net
, obj
))
1175 err
= nft_delobj(ctx
, obj
);
1180 list_for_each_entry_safe(chain
, nc
, &ctx
->table
->chains
, list
) {
1181 if (!nft_is_active_next(ctx
->net
, chain
))
1184 if (nft_chain_is_bound(chain
))
1189 err
= nft_delchain(ctx
);
1194 err
= nft_deltable(ctx
);
1199 static int nft_flush(struct nft_ctx
*ctx
, int family
)
1201 struct nft_table
*table
, *nt
;
1202 const struct nlattr
* const *nla
= ctx
->nla
;
1205 list_for_each_entry_safe(table
, nt
, &ctx
->net
->nft
.tables
, list
) {
1206 if (family
!= AF_UNSPEC
&& table
->family
!= family
)
1209 ctx
->family
= table
->family
;
1211 if (!nft_is_active_next(ctx
->net
, table
))
1214 if (nft_table_has_owner(table
) && table
->nlpid
!= ctx
->portid
)
1217 if (nla
[NFTA_TABLE_NAME
] &&
1218 nla_strcmp(nla
[NFTA_TABLE_NAME
], table
->name
) != 0)
1223 err
= nft_flush_table(ctx
);
1231 static int nf_tables_deltable(struct net
*net
, struct sock
*nlsk
,
1232 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1233 const struct nlattr
* const nla
[],
1234 struct netlink_ext_ack
*extack
)
1236 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1237 u8 genmask
= nft_genmask_next(net
);
1238 int family
= nfmsg
->nfgen_family
;
1239 const struct nlattr
*attr
;
1240 struct nft_table
*table
;
1243 nft_ctx_init(&ctx
, net
, skb
, nlh
, 0, NULL
, NULL
, nla
);
1244 if (family
== AF_UNSPEC
||
1245 (!nla
[NFTA_TABLE_NAME
] && !nla
[NFTA_TABLE_HANDLE
]))
1246 return nft_flush(&ctx
, family
);
1248 if (nla
[NFTA_TABLE_HANDLE
]) {
1249 attr
= nla
[NFTA_TABLE_HANDLE
];
1250 table
= nft_table_lookup_byhandle(net
, attr
, genmask
);
1252 attr
= nla
[NFTA_TABLE_NAME
];
1253 table
= nft_table_lookup(net
, attr
, family
, genmask
,
1254 NETLINK_CB(skb
).portid
);
1257 if (IS_ERR(table
)) {
1258 NL_SET_BAD_ATTR(extack
, attr
);
1259 return PTR_ERR(table
);
1262 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
1266 ctx
.family
= family
;
1269 return nft_flush_table(&ctx
);
1272 static void nf_tables_table_destroy(struct nft_ctx
*ctx
)
1274 if (WARN_ON(ctx
->table
->use
> 0))
1277 rhltable_destroy(&ctx
->table
->chains_ht
);
1278 kfree(ctx
->table
->name
);
1279 kfree(ctx
->table
->udata
);
1283 void nft_register_chain_type(const struct nft_chain_type
*ctype
)
1285 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1286 if (WARN_ON(__nft_chain_type_get(ctype
->family
, ctype
->type
))) {
1287 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1290 chain_type
[ctype
->family
][ctype
->type
] = ctype
;
1291 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1293 EXPORT_SYMBOL_GPL(nft_register_chain_type
);
1295 void nft_unregister_chain_type(const struct nft_chain_type
*ctype
)
1297 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
1298 chain_type
[ctype
->family
][ctype
->type
] = NULL
;
1299 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
1301 EXPORT_SYMBOL_GPL(nft_unregister_chain_type
);
1307 static struct nft_chain
*
1308 nft_chain_lookup_byhandle(const struct nft_table
*table
, u64 handle
, u8 genmask
)
1310 struct nft_chain
*chain
;
1312 list_for_each_entry(chain
, &table
->chains
, list
) {
1313 if (chain
->handle
== handle
&&
1314 nft_active_genmask(chain
, genmask
))
1318 return ERR_PTR(-ENOENT
);
1321 static bool lockdep_commit_lock_is_held(const struct net
*net
)
1323 #ifdef CONFIG_PROVE_LOCKING
1324 return lockdep_is_held(&net
->nft
.commit_mutex
);
1330 static struct nft_chain
*nft_chain_lookup(struct net
*net
,
1331 struct nft_table
*table
,
1332 const struct nlattr
*nla
, u8 genmask
)
1334 char search
[NFT_CHAIN_MAXNAMELEN
+ 1];
1335 struct rhlist_head
*tmp
, *list
;
1336 struct nft_chain
*chain
;
1339 return ERR_PTR(-EINVAL
);
1341 nla_strscpy(search
, nla
, sizeof(search
));
1343 WARN_ON(!rcu_read_lock_held() &&
1344 !lockdep_commit_lock_is_held(net
));
1346 chain
= ERR_PTR(-ENOENT
);
1348 list
= rhltable_lookup(&table
->chains_ht
, search
, nft_chain_ht_params
);
1352 rhl_for_each_entry_rcu(chain
, tmp
, list
, rhlhead
) {
1353 if (nft_active_genmask(chain
, genmask
))
1356 chain
= ERR_PTR(-ENOENT
);
1362 static const struct nla_policy nft_chain_policy
[NFTA_CHAIN_MAX
+ 1] = {
1363 [NFTA_CHAIN_TABLE
] = { .type
= NLA_STRING
,
1364 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
1365 [NFTA_CHAIN_HANDLE
] = { .type
= NLA_U64
},
1366 [NFTA_CHAIN_NAME
] = { .type
= NLA_STRING
,
1367 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
1368 [NFTA_CHAIN_HOOK
] = { .type
= NLA_NESTED
},
1369 [NFTA_CHAIN_POLICY
] = { .type
= NLA_U32
},
1370 [NFTA_CHAIN_TYPE
] = { .type
= NLA_STRING
,
1371 .len
= NFT_MODULE_AUTOLOAD_LIMIT
},
1372 [NFTA_CHAIN_COUNTERS
] = { .type
= NLA_NESTED
},
1373 [NFTA_CHAIN_FLAGS
] = { .type
= NLA_U32
},
1374 [NFTA_CHAIN_ID
] = { .type
= NLA_U32
},
1375 [NFTA_CHAIN_USERDATA
] = { .type
= NLA_BINARY
,
1376 .len
= NFT_USERDATA_MAXLEN
},
1379 static const struct nla_policy nft_hook_policy
[NFTA_HOOK_MAX
+ 1] = {
1380 [NFTA_HOOK_HOOKNUM
] = { .type
= NLA_U32
},
1381 [NFTA_HOOK_PRIORITY
] = { .type
= NLA_U32
},
1382 [NFTA_HOOK_DEV
] = { .type
= NLA_STRING
,
1383 .len
= IFNAMSIZ
- 1 },
1386 static int nft_dump_stats(struct sk_buff
*skb
, struct nft_stats __percpu
*stats
)
1388 struct nft_stats
*cpu_stats
, total
;
1389 struct nlattr
*nest
;
1397 memset(&total
, 0, sizeof(total
));
1398 for_each_possible_cpu(cpu
) {
1399 cpu_stats
= per_cpu_ptr(stats
, cpu
);
1401 seq
= u64_stats_fetch_begin_irq(&cpu_stats
->syncp
);
1402 pkts
= cpu_stats
->pkts
;
1403 bytes
= cpu_stats
->bytes
;
1404 } while (u64_stats_fetch_retry_irq(&cpu_stats
->syncp
, seq
));
1406 total
.bytes
+= bytes
;
1408 nest
= nla_nest_start_noflag(skb
, NFTA_CHAIN_COUNTERS
);
1410 goto nla_put_failure
;
1412 if (nla_put_be64(skb
, NFTA_COUNTER_PACKETS
, cpu_to_be64(total
.pkts
),
1413 NFTA_COUNTER_PAD
) ||
1414 nla_put_be64(skb
, NFTA_COUNTER_BYTES
, cpu_to_be64(total
.bytes
),
1416 goto nla_put_failure
;
1418 nla_nest_end(skb
, nest
);
1425 static int nft_dump_basechain_hook(struct sk_buff
*skb
, int family
,
1426 const struct nft_base_chain
*basechain
)
1428 const struct nf_hook_ops
*ops
= &basechain
->ops
;
1429 struct nft_hook
*hook
, *first
= NULL
;
1430 struct nlattr
*nest
, *nest_devs
;
1433 nest
= nla_nest_start_noflag(skb
, NFTA_CHAIN_HOOK
);
1435 goto nla_put_failure
;
1436 if (nla_put_be32(skb
, NFTA_HOOK_HOOKNUM
, htonl(ops
->hooknum
)))
1437 goto nla_put_failure
;
1438 if (nla_put_be32(skb
, NFTA_HOOK_PRIORITY
, htonl(ops
->priority
)))
1439 goto nla_put_failure
;
1441 if (nft_base_chain_netdev(family
, ops
->hooknum
)) {
1442 nest_devs
= nla_nest_start_noflag(skb
, NFTA_HOOK_DEVS
);
1443 list_for_each_entry(hook
, &basechain
->hook_list
, list
) {
1447 if (nla_put_string(skb
, NFTA_DEVICE_NAME
,
1448 hook
->ops
.dev
->name
))
1449 goto nla_put_failure
;
1452 nla_nest_end(skb
, nest_devs
);
1455 nla_put_string(skb
, NFTA_HOOK_DEV
, first
->ops
.dev
->name
))
1456 goto nla_put_failure
;
1458 nla_nest_end(skb
, nest
);
1465 static int nf_tables_fill_chain_info(struct sk_buff
*skb
, struct net
*net
,
1466 u32 portid
, u32 seq
, int event
, u32 flags
,
1467 int family
, const struct nft_table
*table
,
1468 const struct nft_chain
*chain
)
1470 struct nlmsghdr
*nlh
;
1471 struct nfgenmsg
*nfmsg
;
1473 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
1474 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
1476 goto nla_put_failure
;
1478 nfmsg
= nlmsg_data(nlh
);
1479 nfmsg
->nfgen_family
= family
;
1480 nfmsg
->version
= NFNETLINK_V0
;
1481 nfmsg
->res_id
= nft_base_seq(net
);
1483 if (nla_put_string(skb
, NFTA_CHAIN_TABLE
, table
->name
))
1484 goto nla_put_failure
;
1485 if (nla_put_be64(skb
, NFTA_CHAIN_HANDLE
, cpu_to_be64(chain
->handle
),
1487 goto nla_put_failure
;
1488 if (nla_put_string(skb
, NFTA_CHAIN_NAME
, chain
->name
))
1489 goto nla_put_failure
;
1491 if (nft_is_base_chain(chain
)) {
1492 const struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1493 struct nft_stats __percpu
*stats
;
1495 if (nft_dump_basechain_hook(skb
, family
, basechain
))
1496 goto nla_put_failure
;
1498 if (nla_put_be32(skb
, NFTA_CHAIN_POLICY
,
1499 htonl(basechain
->policy
)))
1500 goto nla_put_failure
;
1502 if (nla_put_string(skb
, NFTA_CHAIN_TYPE
, basechain
->type
->name
))
1503 goto nla_put_failure
;
1505 stats
= rcu_dereference_check(basechain
->stats
,
1506 lockdep_commit_lock_is_held(net
));
1507 if (nft_dump_stats(skb
, stats
))
1508 goto nla_put_failure
;
1512 nla_put_be32(skb
, NFTA_CHAIN_FLAGS
, htonl(chain
->flags
)))
1513 goto nla_put_failure
;
1515 if (nla_put_be32(skb
, NFTA_CHAIN_USE
, htonl(chain
->use
)))
1516 goto nla_put_failure
;
1519 nla_put(skb
, NFTA_CHAIN_USERDATA
, chain
->udlen
, chain
->udata
))
1520 goto nla_put_failure
;
1522 nlmsg_end(skb
, nlh
);
1526 nlmsg_trim(skb
, nlh
);
1530 static void nf_tables_chain_notify(const struct nft_ctx
*ctx
, int event
)
1532 struct sk_buff
*skb
;
1536 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
1539 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
1543 err
= nf_tables_fill_chain_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
1544 event
, 0, ctx
->family
, ctx
->table
,
1551 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
1554 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
1557 static int nf_tables_dump_chains(struct sk_buff
*skb
,
1558 struct netlink_callback
*cb
)
1560 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
1561 const struct nft_table
*table
;
1562 const struct nft_chain
*chain
;
1563 unsigned int idx
= 0, s_idx
= cb
->args
[0];
1564 struct net
*net
= sock_net(skb
->sk
);
1565 int family
= nfmsg
->nfgen_family
;
1568 cb
->seq
= net
->nft
.base_seq
;
1570 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
1571 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
1574 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
1578 memset(&cb
->args
[1], 0,
1579 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
1580 if (!nft_is_active(net
, chain
))
1582 if (nf_tables_fill_chain_info(skb
, net
,
1583 NETLINK_CB(cb
->skb
).portid
,
1587 table
->family
, table
,
1591 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
1602 /* called with rcu_read_lock held */
1603 static int nf_tables_getchain(struct net
*net
, struct sock
*nlsk
,
1604 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
1605 const struct nlattr
* const nla
[],
1606 struct netlink_ext_ack
*extack
)
1608 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
1609 u8 genmask
= nft_genmask_cur(net
);
1610 const struct nft_chain
*chain
;
1611 struct nft_table
*table
;
1612 struct sk_buff
*skb2
;
1613 int family
= nfmsg
->nfgen_family
;
1616 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
1617 struct netlink_dump_control c
= {
1618 .dump
= nf_tables_dump_chains
,
1619 .module
= THIS_MODULE
,
1622 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
1625 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
, 0);
1626 if (IS_ERR(table
)) {
1627 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
1628 return PTR_ERR(table
);
1631 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_CHAIN_NAME
], genmask
);
1632 if (IS_ERR(chain
)) {
1633 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
1634 return PTR_ERR(chain
);
1637 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
1641 err
= nf_tables_fill_chain_info(skb2
, net
, NETLINK_CB(skb
).portid
,
1642 nlh
->nlmsg_seq
, NFT_MSG_NEWCHAIN
, 0,
1643 family
, table
, chain
);
1645 goto err_fill_chain_info
;
1647 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
1649 err_fill_chain_info
:
1654 static const struct nla_policy nft_counter_policy
[NFTA_COUNTER_MAX
+ 1] = {
1655 [NFTA_COUNTER_PACKETS
] = { .type
= NLA_U64
},
1656 [NFTA_COUNTER_BYTES
] = { .type
= NLA_U64
},
1659 static struct nft_stats __percpu
*nft_stats_alloc(const struct nlattr
*attr
)
1661 struct nlattr
*tb
[NFTA_COUNTER_MAX
+1];
1662 struct nft_stats __percpu
*newstats
;
1663 struct nft_stats
*stats
;
1666 err
= nla_parse_nested_deprecated(tb
, NFTA_COUNTER_MAX
, attr
,
1667 nft_counter_policy
, NULL
);
1669 return ERR_PTR(err
);
1671 if (!tb
[NFTA_COUNTER_BYTES
] || !tb
[NFTA_COUNTER_PACKETS
])
1672 return ERR_PTR(-EINVAL
);
1674 newstats
= netdev_alloc_pcpu_stats(struct nft_stats
);
1675 if (newstats
== NULL
)
1676 return ERR_PTR(-ENOMEM
);
1678 /* Restore old counters on this cpu, no problem. Per-cpu statistics
1679 * are not exposed to userspace.
1682 stats
= this_cpu_ptr(newstats
);
1683 stats
->bytes
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_BYTES
]));
1684 stats
->pkts
= be64_to_cpu(nla_get_be64(tb
[NFTA_COUNTER_PACKETS
]));
1690 static void nft_chain_stats_replace(struct nft_trans
*trans
)
1692 struct nft_base_chain
*chain
= nft_base_chain(trans
->ctx
.chain
);
1694 if (!nft_trans_chain_stats(trans
))
1697 nft_trans_chain_stats(trans
) =
1698 rcu_replace_pointer(chain
->stats
, nft_trans_chain_stats(trans
),
1699 lockdep_commit_lock_is_held(trans
->ctx
.net
));
1701 if (!nft_trans_chain_stats(trans
))
1702 static_branch_inc(&nft_counters_enabled
);
1705 static void nf_tables_chain_free_chain_rules(struct nft_chain
*chain
)
1707 struct nft_rule
**g0
= rcu_dereference_raw(chain
->rules_gen_0
);
1708 struct nft_rule
**g1
= rcu_dereference_raw(chain
->rules_gen_1
);
1714 /* should be NULL either via abort or via successful commit */
1715 WARN_ON_ONCE(chain
->rules_next
);
1716 kvfree(chain
->rules_next
);
1719 void nf_tables_chain_destroy(struct nft_ctx
*ctx
)
1721 struct nft_chain
*chain
= ctx
->chain
;
1722 struct nft_hook
*hook
, *next
;
1724 if (WARN_ON(chain
->use
> 0))
1727 /* no concurrent access possible anymore */
1728 nf_tables_chain_free_chain_rules(chain
);
1730 if (nft_is_base_chain(chain
)) {
1731 struct nft_base_chain
*basechain
= nft_base_chain(chain
);
1733 if (nft_base_chain_netdev(ctx
->family
, basechain
->ops
.hooknum
)) {
1734 list_for_each_entry_safe(hook
, next
,
1735 &basechain
->hook_list
, list
) {
1736 list_del_rcu(&hook
->list
);
1737 kfree_rcu(hook
, rcu
);
1740 module_put(basechain
->type
->owner
);
1741 if (rcu_access_pointer(basechain
->stats
)) {
1742 static_branch_dec(&nft_counters_enabled
);
1743 free_percpu(rcu_dereference_raw(basechain
->stats
));
1746 kfree(chain
->udata
);
1750 kfree(chain
->udata
);
1755 static struct nft_hook
*nft_netdev_hook_alloc(struct net
*net
,
1756 const struct nlattr
*attr
)
1758 struct net_device
*dev
;
1759 char ifname
[IFNAMSIZ
];
1760 struct nft_hook
*hook
;
1763 hook
= kmalloc(sizeof(struct nft_hook
), GFP_KERNEL
);
1766 goto err_hook_alloc
;
1769 nla_strscpy(ifname
, attr
, IFNAMSIZ
);
1770 /* nf_tables_netdev_event() is called under rtnl_mutex, this is
1771 * indirectly serializing all the other holders of the commit_mutex with
1774 dev
= __dev_get_by_name(net
, ifname
);
1779 hook
->ops
.dev
= dev
;
1780 hook
->inactive
= false;
1787 return ERR_PTR(err
);
1790 static struct nft_hook
*nft_hook_list_find(struct list_head
*hook_list
,
1791 const struct nft_hook
*this)
1793 struct nft_hook
*hook
;
1795 list_for_each_entry(hook
, hook_list
, list
) {
1796 if (this->ops
.dev
== hook
->ops
.dev
)
1803 static int nf_tables_parse_netdev_hooks(struct net
*net
,
1804 const struct nlattr
*attr
,
1805 struct list_head
*hook_list
)
1807 struct nft_hook
*hook
, *next
;
1808 const struct nlattr
*tmp
;
1809 int rem
, n
= 0, err
;
1811 nla_for_each_nested(tmp
, attr
, rem
) {
1812 if (nla_type(tmp
) != NFTA_DEVICE_NAME
) {
1817 hook
= nft_netdev_hook_alloc(net
, tmp
);
1819 err
= PTR_ERR(hook
);
1822 if (nft_hook_list_find(hook_list
, hook
)) {
1827 list_add_tail(&hook
->list
, hook_list
);
1830 if (n
== NFT_NETDEVICE_MAX
) {
1839 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
1840 list_del(&hook
->list
);
1846 struct nft_chain_hook
{
1849 const struct nft_chain_type
*type
;
1850 struct list_head list
;
1853 static int nft_chain_parse_netdev(struct net
*net
,
1854 struct nlattr
*tb
[],
1855 struct list_head
*hook_list
)
1857 struct nft_hook
*hook
;
1860 if (tb
[NFTA_HOOK_DEV
]) {
1861 hook
= nft_netdev_hook_alloc(net
, tb
[NFTA_HOOK_DEV
]);
1863 return PTR_ERR(hook
);
1865 list_add_tail(&hook
->list
, hook_list
);
1866 } else if (tb
[NFTA_HOOK_DEVS
]) {
1867 err
= nf_tables_parse_netdev_hooks(net
, tb
[NFTA_HOOK_DEVS
],
1872 if (list_empty(hook_list
))
1881 static int nft_chain_parse_hook(struct net
*net
,
1882 const struct nlattr
* const nla
[],
1883 struct nft_chain_hook
*hook
, u8 family
,
1886 struct nlattr
*ha
[NFTA_HOOK_MAX
+ 1];
1887 const struct nft_chain_type
*type
;
1890 lockdep_assert_held(&net
->nft
.commit_mutex
);
1891 lockdep_nfnl_nft_mutex_not_held();
1893 err
= nla_parse_nested_deprecated(ha
, NFTA_HOOK_MAX
,
1894 nla
[NFTA_CHAIN_HOOK
],
1895 nft_hook_policy
, NULL
);
1899 if (ha
[NFTA_HOOK_HOOKNUM
] == NULL
||
1900 ha
[NFTA_HOOK_PRIORITY
] == NULL
)
1903 hook
->num
= ntohl(nla_get_be32(ha
[NFTA_HOOK_HOOKNUM
]));
1904 hook
->priority
= ntohl(nla_get_be32(ha
[NFTA_HOOK_PRIORITY
]));
1906 type
= __nft_chain_type_get(family
, NFT_CHAIN_T_DEFAULT
);
1910 if (nla
[NFTA_CHAIN_TYPE
]) {
1911 type
= nf_tables_chain_type_lookup(net
, nla
[NFTA_CHAIN_TYPE
],
1914 return PTR_ERR(type
);
1916 if (hook
->num
>= NFT_MAX_HOOKS
|| !(type
->hook_mask
& (1 << hook
->num
)))
1919 if (type
->type
== NFT_CHAIN_T_NAT
&&
1920 hook
->priority
<= NF_IP_PRI_CONNTRACK
)
1923 if (!try_module_get(type
->owner
))
1928 INIT_LIST_HEAD(&hook
->list
);
1929 if (nft_base_chain_netdev(family
, hook
->num
)) {
1930 err
= nft_chain_parse_netdev(net
, ha
, &hook
->list
);
1932 module_put(type
->owner
);
1935 } else if (ha
[NFTA_HOOK_DEV
] || ha
[NFTA_HOOK_DEVS
]) {
1936 module_put(type
->owner
);
1943 static void nft_chain_release_hook(struct nft_chain_hook
*hook
)
1945 struct nft_hook
*h
, *next
;
1947 list_for_each_entry_safe(h
, next
, &hook
->list
, list
) {
1951 module_put(hook
->type
->owner
);
1954 struct nft_rules_old
{
1956 struct nft_rule
**start
;
1959 static struct nft_rule
**nf_tables_chain_alloc_rules(const struct nft_chain
*chain
,
1962 if (alloc
> INT_MAX
)
1965 alloc
+= 1; /* NULL, ends rules */
1966 if (sizeof(struct nft_rule
*) > INT_MAX
/ alloc
)
1969 alloc
*= sizeof(struct nft_rule
*);
1970 alloc
+= sizeof(struct nft_rules_old
);
1972 return kvmalloc(alloc
, GFP_KERNEL
);
1975 static void nft_basechain_hook_init(struct nf_hook_ops
*ops
, u8 family
,
1976 const struct nft_chain_hook
*hook
,
1977 struct nft_chain
*chain
)
1980 ops
->hooknum
= hook
->num
;
1981 ops
->priority
= hook
->priority
;
1983 ops
->hook
= hook
->type
->hooks
[ops
->hooknum
];
1986 static int nft_basechain_init(struct nft_base_chain
*basechain
, u8 family
,
1987 struct nft_chain_hook
*hook
, u32 flags
)
1989 struct nft_chain
*chain
;
1992 basechain
->type
= hook
->type
;
1993 INIT_LIST_HEAD(&basechain
->hook_list
);
1994 chain
= &basechain
->chain
;
1996 if (nft_base_chain_netdev(family
, hook
->num
)) {
1997 list_splice_init(&hook
->list
, &basechain
->hook_list
);
1998 list_for_each_entry(h
, &basechain
->hook_list
, list
)
1999 nft_basechain_hook_init(&h
->ops
, family
, hook
, chain
);
2001 basechain
->ops
.hooknum
= hook
->num
;
2002 basechain
->ops
.priority
= hook
->priority
;
2004 nft_basechain_hook_init(&basechain
->ops
, family
, hook
, chain
);
2007 chain
->flags
|= NFT_CHAIN_BASE
| flags
;
2008 basechain
->policy
= NF_ACCEPT
;
2009 if (chain
->flags
& NFT_CHAIN_HW_OFFLOAD
&&
2010 nft_chain_offload_priority(basechain
) < 0)
2013 flow_block_init(&basechain
->flow_block
);
2018 static int nft_chain_add(struct nft_table
*table
, struct nft_chain
*chain
)
2022 err
= rhltable_insert_key(&table
->chains_ht
, chain
->name
,
2023 &chain
->rhlhead
, nft_chain_ht_params
);
2027 list_add_tail_rcu(&chain
->list
, &table
->chains
);
2032 static u64 chain_id
;
2034 static int nf_tables_addchain(struct nft_ctx
*ctx
, u8 family
, u8 genmask
,
2035 u8 policy
, u32 flags
)
2037 const struct nlattr
* const *nla
= ctx
->nla
;
2038 struct nft_table
*table
= ctx
->table
;
2039 struct nft_base_chain
*basechain
;
2040 struct nft_stats __percpu
*stats
;
2041 struct net
*net
= ctx
->net
;
2042 char name
[NFT_NAME_MAXLEN
];
2043 struct nft_trans
*trans
;
2044 struct nft_chain
*chain
;
2045 struct nft_rule
**rules
;
2048 if (table
->use
== UINT_MAX
)
2051 if (nla
[NFTA_CHAIN_HOOK
]) {
2052 struct nft_chain_hook hook
;
2054 if (flags
& NFT_CHAIN_BINDING
)
2057 err
= nft_chain_parse_hook(net
, nla
, &hook
, family
, true);
2061 basechain
= kzalloc(sizeof(*basechain
), GFP_KERNEL
);
2062 if (basechain
== NULL
) {
2063 nft_chain_release_hook(&hook
);
2066 chain
= &basechain
->chain
;
2068 if (nla
[NFTA_CHAIN_COUNTERS
]) {
2069 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
2070 if (IS_ERR(stats
)) {
2071 nft_chain_release_hook(&hook
);
2073 return PTR_ERR(stats
);
2075 rcu_assign_pointer(basechain
->stats
, stats
);
2076 static_branch_inc(&nft_counters_enabled
);
2079 err
= nft_basechain_init(basechain
, family
, &hook
, flags
);
2081 nft_chain_release_hook(&hook
);
2086 if (flags
& NFT_CHAIN_BASE
)
2088 if (flags
& NFT_CHAIN_HW_OFFLOAD
)
2091 chain
= kzalloc(sizeof(*chain
), GFP_KERNEL
);
2095 chain
->flags
= flags
;
2099 INIT_LIST_HEAD(&chain
->rules
);
2100 chain
->handle
= nf_tables_alloc_handle(table
);
2101 chain
->table
= table
;
2103 if (nla
[NFTA_CHAIN_NAME
]) {
2104 chain
->name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
2106 if (!(flags
& NFT_CHAIN_BINDING
)) {
2108 goto err_destroy_chain
;
2111 snprintf(name
, sizeof(name
), "__chain%llu", ++chain_id
);
2112 chain
->name
= kstrdup(name
, GFP_KERNEL
);
2117 goto err_destroy_chain
;
2120 if (nla
[NFTA_CHAIN_USERDATA
]) {
2121 chain
->udata
= nla_memdup(nla
[NFTA_CHAIN_USERDATA
], GFP_KERNEL
);
2122 if (chain
->udata
== NULL
) {
2124 goto err_destroy_chain
;
2126 chain
->udlen
= nla_len(nla
[NFTA_CHAIN_USERDATA
]);
2129 rules
= nf_tables_chain_alloc_rules(chain
, 0);
2132 goto err_destroy_chain
;
2136 rcu_assign_pointer(chain
->rules_gen_0
, rules
);
2137 rcu_assign_pointer(chain
->rules_gen_1
, rules
);
2139 err
= nf_tables_register_hook(net
, table
, chain
);
2141 goto err_destroy_chain
;
2143 trans
= nft_trans_chain_add(ctx
, NFT_MSG_NEWCHAIN
);
2144 if (IS_ERR(trans
)) {
2145 err
= PTR_ERR(trans
);
2146 goto err_unregister_hook
;
2149 nft_trans_chain_policy(trans
) = NFT_CHAIN_POLICY_UNSET
;
2150 if (nft_is_base_chain(chain
))
2151 nft_trans_chain_policy(trans
) = policy
;
2153 err
= nft_chain_add(table
, chain
);
2155 nft_trans_destroy(trans
);
2156 goto err_unregister_hook
;
2162 err_unregister_hook
:
2163 nf_tables_unregister_hook(net
, table
, chain
);
2165 nf_tables_chain_destroy(ctx
);
2170 static bool nft_hook_list_equal(struct list_head
*hook_list1
,
2171 struct list_head
*hook_list2
)
2173 struct nft_hook
*hook
;
2177 list_for_each_entry(hook
, hook_list2
, list
) {
2178 if (!nft_hook_list_find(hook_list1
, hook
))
2183 list_for_each_entry(hook
, hook_list1
, list
)
2189 static int nf_tables_updchain(struct nft_ctx
*ctx
, u8 genmask
, u8 policy
,
2190 u32 flags
, const struct nlattr
*attr
,
2191 struct netlink_ext_ack
*extack
)
2193 const struct nlattr
* const *nla
= ctx
->nla
;
2194 struct nft_table
*table
= ctx
->table
;
2195 struct nft_chain
*chain
= ctx
->chain
;
2196 struct nft_base_chain
*basechain
;
2197 struct nft_stats
*stats
= NULL
;
2198 struct nft_chain_hook hook
;
2199 struct nf_hook_ops
*ops
;
2200 struct nft_trans
*trans
;
2203 if (chain
->flags
^ flags
)
2206 if (nla
[NFTA_CHAIN_HOOK
]) {
2207 if (!nft_is_base_chain(chain
)) {
2208 NL_SET_BAD_ATTR(extack
, attr
);
2211 err
= nft_chain_parse_hook(ctx
->net
, nla
, &hook
, ctx
->family
,
2216 basechain
= nft_base_chain(chain
);
2217 if (basechain
->type
!= hook
.type
) {
2218 nft_chain_release_hook(&hook
);
2219 NL_SET_BAD_ATTR(extack
, attr
);
2223 if (nft_base_chain_netdev(ctx
->family
, hook
.num
)) {
2224 if (!nft_hook_list_equal(&basechain
->hook_list
,
2226 nft_chain_release_hook(&hook
);
2227 NL_SET_BAD_ATTR(extack
, attr
);
2231 ops
= &basechain
->ops
;
2232 if (ops
->hooknum
!= hook
.num
||
2233 ops
->priority
!= hook
.priority
) {
2234 nft_chain_release_hook(&hook
);
2235 NL_SET_BAD_ATTR(extack
, attr
);
2239 nft_chain_release_hook(&hook
);
2242 if (nla
[NFTA_CHAIN_HANDLE
] &&
2243 nla
[NFTA_CHAIN_NAME
]) {
2244 struct nft_chain
*chain2
;
2246 chain2
= nft_chain_lookup(ctx
->net
, table
,
2247 nla
[NFTA_CHAIN_NAME
], genmask
);
2248 if (!IS_ERR(chain2
)) {
2249 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
2254 if (nla
[NFTA_CHAIN_COUNTERS
]) {
2255 if (!nft_is_base_chain(chain
))
2258 stats
= nft_stats_alloc(nla
[NFTA_CHAIN_COUNTERS
]);
2260 return PTR_ERR(stats
);
2264 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWCHAIN
,
2265 sizeof(struct nft_trans_chain
));
2269 nft_trans_chain_stats(trans
) = stats
;
2270 nft_trans_chain_update(trans
) = true;
2272 if (nla
[NFTA_CHAIN_POLICY
])
2273 nft_trans_chain_policy(trans
) = policy
;
2275 nft_trans_chain_policy(trans
) = -1;
2277 if (nla
[NFTA_CHAIN_HANDLE
] &&
2278 nla
[NFTA_CHAIN_NAME
]) {
2279 struct nft_trans
*tmp
;
2283 name
= nla_strdup(nla
[NFTA_CHAIN_NAME
], GFP_KERNEL
);
2288 list_for_each_entry(tmp
, &ctx
->net
->nft
.commit_list
, list
) {
2289 if (tmp
->msg_type
== NFT_MSG_NEWCHAIN
&&
2290 tmp
->ctx
.table
== table
&&
2291 nft_trans_chain_update(tmp
) &&
2292 nft_trans_chain_name(tmp
) &&
2293 strcmp(name
, nft_trans_chain_name(tmp
)) == 0) {
2294 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_NAME
]);
2300 nft_trans_chain_name(trans
) = name
;
2302 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
2311 static struct nft_chain
*nft_chain_lookup_byid(const struct net
*net
,
2312 const struct nlattr
*nla
)
2314 u32 id
= ntohl(nla_get_be32(nla
));
2315 struct nft_trans
*trans
;
2317 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
2318 struct nft_chain
*chain
= trans
->ctx
.chain
;
2320 if (trans
->msg_type
== NFT_MSG_NEWCHAIN
&&
2321 id
== nft_trans_chain_id(trans
))
2324 return ERR_PTR(-ENOENT
);
2327 static int nf_tables_newchain(struct net
*net
, struct sock
*nlsk
,
2328 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2329 const struct nlattr
* const nla
[],
2330 struct netlink_ext_ack
*extack
)
2332 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2333 u8 genmask
= nft_genmask_next(net
);
2334 int family
= nfmsg
->nfgen_family
;
2335 struct nft_chain
*chain
= NULL
;
2336 const struct nlattr
*attr
;
2337 struct nft_table
*table
;
2338 u8 policy
= NF_ACCEPT
;
2343 lockdep_assert_held(&net
->nft
.commit_mutex
);
2345 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
,
2346 NETLINK_CB(skb
).portid
);
2347 if (IS_ERR(table
)) {
2348 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
2349 return PTR_ERR(table
);
2353 attr
= nla
[NFTA_CHAIN_NAME
];
2355 if (nla
[NFTA_CHAIN_HANDLE
]) {
2356 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_CHAIN_HANDLE
]));
2357 chain
= nft_chain_lookup_byhandle(table
, handle
, genmask
);
2358 if (IS_ERR(chain
)) {
2359 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_HANDLE
]);
2360 return PTR_ERR(chain
);
2362 attr
= nla
[NFTA_CHAIN_HANDLE
];
2363 } else if (nla
[NFTA_CHAIN_NAME
]) {
2364 chain
= nft_chain_lookup(net
, table
, attr
, genmask
);
2365 if (IS_ERR(chain
)) {
2366 if (PTR_ERR(chain
) != -ENOENT
) {
2367 NL_SET_BAD_ATTR(extack
, attr
);
2368 return PTR_ERR(chain
);
2372 } else if (!nla
[NFTA_CHAIN_ID
]) {
2376 if (nla
[NFTA_CHAIN_POLICY
]) {
2377 if (chain
!= NULL
&&
2378 !nft_is_base_chain(chain
)) {
2379 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_POLICY
]);
2383 if (chain
== NULL
&&
2384 nla
[NFTA_CHAIN_HOOK
] == NULL
) {
2385 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_POLICY
]);
2389 policy
= ntohl(nla_get_be32(nla
[NFTA_CHAIN_POLICY
]));
2399 if (nla
[NFTA_CHAIN_FLAGS
])
2400 flags
= ntohl(nla_get_be32(nla
[NFTA_CHAIN_FLAGS
]));
2402 flags
= chain
->flags
;
2404 if (flags
& ~NFT_CHAIN_FLAGS
)
2407 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
2409 if (chain
!= NULL
) {
2410 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
2411 NL_SET_BAD_ATTR(extack
, attr
);
2414 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
2417 flags
|= chain
->flags
& NFT_CHAIN_BASE
;
2418 return nf_tables_updchain(&ctx
, genmask
, policy
, flags
, attr
,
2422 return nf_tables_addchain(&ctx
, family
, genmask
, policy
, flags
);
2425 static int nf_tables_delchain(struct net
*net
, struct sock
*nlsk
,
2426 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
2427 const struct nlattr
* const nla
[],
2428 struct netlink_ext_ack
*extack
)
2430 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
2431 u8 genmask
= nft_genmask_next(net
);
2432 int family
= nfmsg
->nfgen_family
;
2433 const struct nlattr
*attr
;
2434 struct nft_table
*table
;
2435 struct nft_chain
*chain
;
2436 struct nft_rule
*rule
;
2442 table
= nft_table_lookup(net
, nla
[NFTA_CHAIN_TABLE
], family
, genmask
,
2443 NETLINK_CB(skb
).portid
);
2444 if (IS_ERR(table
)) {
2445 NL_SET_BAD_ATTR(extack
, nla
[NFTA_CHAIN_TABLE
]);
2446 return PTR_ERR(table
);
2449 if (nla
[NFTA_CHAIN_HANDLE
]) {
2450 attr
= nla
[NFTA_CHAIN_HANDLE
];
2451 handle
= be64_to_cpu(nla_get_be64(attr
));
2452 chain
= nft_chain_lookup_byhandle(table
, handle
, genmask
);
2454 attr
= nla
[NFTA_CHAIN_NAME
];
2455 chain
= nft_chain_lookup(net
, table
, attr
, genmask
);
2457 if (IS_ERR(chain
)) {
2458 NL_SET_BAD_ATTR(extack
, attr
);
2459 return PTR_ERR(chain
);
2462 if (nlh
->nlmsg_flags
& NLM_F_NONREC
&&
2466 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
2469 list_for_each_entry(rule
, &chain
->rules
, list
) {
2470 if (!nft_is_active_next(net
, rule
))
2474 err
= nft_delrule(&ctx
, rule
);
2479 /* There are rules and elements that are still holding references to us,
2480 * we cannot do a recursive removal in this case.
2483 NL_SET_BAD_ATTR(extack
, attr
);
2487 return nft_delchain(&ctx
);
2495 * nft_register_expr - register nf_tables expr type
2498 * Registers the expr type for use with nf_tables. Returns zero on
2499 * success or a negative errno code otherwise.
2501 int nft_register_expr(struct nft_expr_type
*type
)
2503 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2504 if (type
->family
== NFPROTO_UNSPEC
)
2505 list_add_tail_rcu(&type
->list
, &nf_tables_expressions
);
2507 list_add_rcu(&type
->list
, &nf_tables_expressions
);
2508 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2511 EXPORT_SYMBOL_GPL(nft_register_expr
);
2514 * nft_unregister_expr - unregister nf_tables expr type
2517 * Unregisters the expr typefor use with nf_tables.
2519 void nft_unregister_expr(struct nft_expr_type
*type
)
2521 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
2522 list_del_rcu(&type
->list
);
2523 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
2525 EXPORT_SYMBOL_GPL(nft_unregister_expr
);
2527 static const struct nft_expr_type
*__nft_expr_type_get(u8 family
,
2530 const struct nft_expr_type
*type
, *candidate
= NULL
;
2532 list_for_each_entry(type
, &nf_tables_expressions
, list
) {
2533 if (!nla_strcmp(nla
, type
->name
)) {
2534 if (!type
->family
&& !candidate
)
2536 else if (type
->family
== family
)
2543 #ifdef CONFIG_MODULES
2544 static int nft_expr_type_request_module(struct net
*net
, u8 family
,
2547 if (nft_request_module(net
, "nft-expr-%u-%.*s", family
,
2548 nla_len(nla
), (char *)nla_data(nla
)) == -EAGAIN
)
2555 static const struct nft_expr_type
*nft_expr_type_get(struct net
*net
,
2559 const struct nft_expr_type
*type
;
2562 return ERR_PTR(-EINVAL
);
2564 type
= __nft_expr_type_get(family
, nla
);
2565 if (type
!= NULL
&& try_module_get(type
->owner
))
2568 lockdep_nfnl_nft_mutex_not_held();
2569 #ifdef CONFIG_MODULES
2571 if (nft_expr_type_request_module(net
, family
, nla
) == -EAGAIN
)
2572 return ERR_PTR(-EAGAIN
);
2574 if (nft_request_module(net
, "nft-expr-%.*s",
2576 (char *)nla_data(nla
)) == -EAGAIN
)
2577 return ERR_PTR(-EAGAIN
);
2580 return ERR_PTR(-ENOENT
);
2583 static const struct nla_policy nft_expr_policy
[NFTA_EXPR_MAX
+ 1] = {
2584 [NFTA_EXPR_NAME
] = { .type
= NLA_STRING
,
2585 .len
= NFT_MODULE_AUTOLOAD_LIMIT
},
2586 [NFTA_EXPR_DATA
] = { .type
= NLA_NESTED
},
2589 static int nf_tables_fill_expr_info(struct sk_buff
*skb
,
2590 const struct nft_expr
*expr
)
2592 if (nla_put_string(skb
, NFTA_EXPR_NAME
, expr
->ops
->type
->name
))
2593 goto nla_put_failure
;
2595 if (expr
->ops
->dump
) {
2596 struct nlattr
*data
= nla_nest_start_noflag(skb
,
2599 goto nla_put_failure
;
2600 if (expr
->ops
->dump(skb
, expr
) < 0)
2601 goto nla_put_failure
;
2602 nla_nest_end(skb
, data
);
2611 int nft_expr_dump(struct sk_buff
*skb
, unsigned int attr
,
2612 const struct nft_expr
*expr
)
2614 struct nlattr
*nest
;
2616 nest
= nla_nest_start_noflag(skb
, attr
);
2618 goto nla_put_failure
;
2619 if (nf_tables_fill_expr_info(skb
, expr
) < 0)
2620 goto nla_put_failure
;
2621 nla_nest_end(skb
, nest
);
2628 struct nft_expr_info
{
2629 const struct nft_expr_ops
*ops
;
2630 const struct nlattr
*attr
;
2631 struct nlattr
*tb
[NFT_EXPR_MAXATTR
+ 1];
2634 static int nf_tables_expr_parse(const struct nft_ctx
*ctx
,
2635 const struct nlattr
*nla
,
2636 struct nft_expr_info
*info
)
2638 const struct nft_expr_type
*type
;
2639 const struct nft_expr_ops
*ops
;
2640 struct nlattr
*tb
[NFTA_EXPR_MAX
+ 1];
2643 err
= nla_parse_nested_deprecated(tb
, NFTA_EXPR_MAX
, nla
,
2644 nft_expr_policy
, NULL
);
2648 type
= nft_expr_type_get(ctx
->net
, ctx
->family
, tb
[NFTA_EXPR_NAME
]);
2650 return PTR_ERR(type
);
2652 if (tb
[NFTA_EXPR_DATA
]) {
2653 err
= nla_parse_nested_deprecated(info
->tb
, type
->maxattr
,
2655 type
->policy
, NULL
);
2659 memset(info
->tb
, 0, sizeof(info
->tb
[0]) * (type
->maxattr
+ 1));
2661 if (type
->select_ops
!= NULL
) {
2662 ops
= type
->select_ops(ctx
,
2663 (const struct nlattr
* const *)info
->tb
);
2666 #ifdef CONFIG_MODULES
2668 if (nft_expr_type_request_module(ctx
->net
,
2670 tb
[NFTA_EXPR_NAME
]) != -EAGAIN
)
2684 module_put(type
->owner
);
2688 static int nf_tables_newexpr(const struct nft_ctx
*ctx
,
2689 const struct nft_expr_info
*info
,
2690 struct nft_expr
*expr
)
2692 const struct nft_expr_ops
*ops
= info
->ops
;
2697 err
= ops
->init(ctx
, expr
, (const struct nlattr
**)info
->tb
);
2708 static void nf_tables_expr_destroy(const struct nft_ctx
*ctx
,
2709 struct nft_expr
*expr
)
2711 const struct nft_expr_type
*type
= expr
->ops
->type
;
2713 if (expr
->ops
->destroy
)
2714 expr
->ops
->destroy(ctx
, expr
);
2715 module_put(type
->owner
);
2718 static struct nft_expr
*nft_expr_init(const struct nft_ctx
*ctx
,
2719 const struct nlattr
*nla
)
2721 struct nft_expr_info info
;
2722 struct nft_expr
*expr
;
2723 struct module
*owner
;
2726 err
= nf_tables_expr_parse(ctx
, nla
, &info
);
2731 expr
= kzalloc(info
.ops
->size
, GFP_KERNEL
);
2735 err
= nf_tables_newexpr(ctx
, &info
, expr
);
2743 owner
= info
.ops
->type
->owner
;
2744 if (info
.ops
->type
->release_ops
)
2745 info
.ops
->type
->release_ops(info
.ops
);
2749 return ERR_PTR(err
);
2752 int nft_expr_clone(struct nft_expr
*dst
, struct nft_expr
*src
)
2756 if (src
->ops
->clone
) {
2757 dst
->ops
= src
->ops
;
2758 err
= src
->ops
->clone(dst
, src
);
2762 memcpy(dst
, src
, src
->ops
->size
);
2765 __module_get(src
->ops
->type
->owner
);
2770 void nft_expr_destroy(const struct nft_ctx
*ctx
, struct nft_expr
*expr
)
2772 nf_tables_expr_destroy(ctx
, expr
);
2780 static struct nft_rule
*__nft_rule_lookup(const struct nft_chain
*chain
,
2783 struct nft_rule
*rule
;
2785 // FIXME: this sucks
2786 list_for_each_entry_rcu(rule
, &chain
->rules
, list
) {
2787 if (handle
== rule
->handle
)
2791 return ERR_PTR(-ENOENT
);
2794 static struct nft_rule
*nft_rule_lookup(const struct nft_chain
*chain
,
2795 const struct nlattr
*nla
)
2798 return ERR_PTR(-EINVAL
);
2800 return __nft_rule_lookup(chain
, be64_to_cpu(nla_get_be64(nla
)));
2803 static const struct nla_policy nft_rule_policy
[NFTA_RULE_MAX
+ 1] = {
2804 [NFTA_RULE_TABLE
] = { .type
= NLA_STRING
,
2805 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
2806 [NFTA_RULE_CHAIN
] = { .type
= NLA_STRING
,
2807 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
2808 [NFTA_RULE_HANDLE
] = { .type
= NLA_U64
},
2809 [NFTA_RULE_EXPRESSIONS
] = { .type
= NLA_NESTED
},
2810 [NFTA_RULE_COMPAT
] = { .type
= NLA_NESTED
},
2811 [NFTA_RULE_POSITION
] = { .type
= NLA_U64
},
2812 [NFTA_RULE_USERDATA
] = { .type
= NLA_BINARY
,
2813 .len
= NFT_USERDATA_MAXLEN
},
2814 [NFTA_RULE_ID
] = { .type
= NLA_U32
},
2815 [NFTA_RULE_POSITION_ID
] = { .type
= NLA_U32
},
2816 [NFTA_RULE_CHAIN_ID
] = { .type
= NLA_U32
},
2819 static int nf_tables_fill_rule_info(struct sk_buff
*skb
, struct net
*net
,
2820 u32 portid
, u32 seq
, int event
,
2821 u32 flags
, int family
,
2822 const struct nft_table
*table
,
2823 const struct nft_chain
*chain
,
2824 const struct nft_rule
*rule
,
2825 const struct nft_rule
*prule
)
2827 struct nlmsghdr
*nlh
;
2828 struct nfgenmsg
*nfmsg
;
2829 const struct nft_expr
*expr
, *next
;
2830 struct nlattr
*list
;
2831 u16 type
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
2833 nlh
= nlmsg_put(skb
, portid
, seq
, type
, sizeof(struct nfgenmsg
), flags
);
2835 goto nla_put_failure
;
2837 nfmsg
= nlmsg_data(nlh
);
2838 nfmsg
->nfgen_family
= family
;
2839 nfmsg
->version
= NFNETLINK_V0
;
2840 nfmsg
->res_id
= nft_base_seq(net
);
2842 if (nla_put_string(skb
, NFTA_RULE_TABLE
, table
->name
))
2843 goto nla_put_failure
;
2844 if (nla_put_string(skb
, NFTA_RULE_CHAIN
, chain
->name
))
2845 goto nla_put_failure
;
2846 if (nla_put_be64(skb
, NFTA_RULE_HANDLE
, cpu_to_be64(rule
->handle
),
2848 goto nla_put_failure
;
2850 if (event
!= NFT_MSG_DELRULE
&& prule
) {
2851 if (nla_put_be64(skb
, NFTA_RULE_POSITION
,
2852 cpu_to_be64(prule
->handle
),
2854 goto nla_put_failure
;
2857 list
= nla_nest_start_noflag(skb
, NFTA_RULE_EXPRESSIONS
);
2859 goto nla_put_failure
;
2860 nft_rule_for_each_expr(expr
, next
, rule
) {
2861 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
, expr
) < 0)
2862 goto nla_put_failure
;
2864 nla_nest_end(skb
, list
);
2867 struct nft_userdata
*udata
= nft_userdata(rule
);
2868 if (nla_put(skb
, NFTA_RULE_USERDATA
, udata
->len
+ 1,
2870 goto nla_put_failure
;
2873 nlmsg_end(skb
, nlh
);
2877 nlmsg_trim(skb
, nlh
);
2881 static void nf_tables_rule_notify(const struct nft_ctx
*ctx
,
2882 const struct nft_rule
*rule
, int event
)
2884 struct sk_buff
*skb
;
2888 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
2891 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
2895 err
= nf_tables_fill_rule_info(skb
, ctx
->net
, ctx
->portid
, ctx
->seq
,
2896 event
, 0, ctx
->family
, ctx
->table
,
2897 ctx
->chain
, rule
, NULL
);
2903 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
2906 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
2909 struct nft_rule_dump_ctx
{
2914 static int __nf_tables_dump_rules(struct sk_buff
*skb
,
2916 struct netlink_callback
*cb
,
2917 const struct nft_table
*table
,
2918 const struct nft_chain
*chain
)
2920 struct net
*net
= sock_net(skb
->sk
);
2921 const struct nft_rule
*rule
, *prule
;
2922 unsigned int s_idx
= cb
->args
[0];
2925 list_for_each_entry_rcu(rule
, &chain
->rules
, list
) {
2926 if (!nft_is_active(net
, rule
))
2931 memset(&cb
->args
[1], 0,
2932 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
2934 if (nf_tables_fill_rule_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
2937 NLM_F_MULTI
| NLM_F_APPEND
,
2939 table
, chain
, rule
, prule
) < 0)
2942 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
2951 static int nf_tables_dump_rules(struct sk_buff
*skb
,
2952 struct netlink_callback
*cb
)
2954 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
2955 const struct nft_rule_dump_ctx
*ctx
= cb
->data
;
2956 struct nft_table
*table
;
2957 const struct nft_chain
*chain
;
2958 unsigned int idx
= 0;
2959 struct net
*net
= sock_net(skb
->sk
);
2960 int family
= nfmsg
->nfgen_family
;
2963 cb
->seq
= net
->nft
.base_seq
;
2965 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
2966 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
2969 if (ctx
&& ctx
->table
&& strcmp(ctx
->table
, table
->name
) != 0)
2972 if (ctx
&& ctx
->table
&& ctx
->chain
) {
2973 struct rhlist_head
*list
, *tmp
;
2975 list
= rhltable_lookup(&table
->chains_ht
, ctx
->chain
,
2976 nft_chain_ht_params
);
2980 rhl_for_each_entry_rcu(chain
, tmp
, list
, rhlhead
) {
2981 if (!nft_is_active(net
, chain
))
2983 __nf_tables_dump_rules(skb
, &idx
,
2990 list_for_each_entry_rcu(chain
, &table
->chains
, list
) {
2991 if (__nf_tables_dump_rules(skb
, &idx
, cb
, table
, chain
))
2995 if (ctx
&& ctx
->table
)
3005 static int nf_tables_dump_rules_start(struct netlink_callback
*cb
)
3007 const struct nlattr
* const *nla
= cb
->data
;
3008 struct nft_rule_dump_ctx
*ctx
= NULL
;
3010 if (nla
[NFTA_RULE_TABLE
] || nla
[NFTA_RULE_CHAIN
]) {
3011 ctx
= kzalloc(sizeof(*ctx
), GFP_ATOMIC
);
3015 if (nla
[NFTA_RULE_TABLE
]) {
3016 ctx
->table
= nla_strdup(nla
[NFTA_RULE_TABLE
],
3023 if (nla
[NFTA_RULE_CHAIN
]) {
3024 ctx
->chain
= nla_strdup(nla
[NFTA_RULE_CHAIN
],
3038 static int nf_tables_dump_rules_done(struct netlink_callback
*cb
)
3040 struct nft_rule_dump_ctx
*ctx
= cb
->data
;
3050 /* called with rcu_read_lock held */
3051 static int nf_tables_getrule(struct net
*net
, struct sock
*nlsk
,
3052 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3053 const struct nlattr
* const nla
[],
3054 struct netlink_ext_ack
*extack
)
3056 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3057 u8 genmask
= nft_genmask_cur(net
);
3058 const struct nft_chain
*chain
;
3059 const struct nft_rule
*rule
;
3060 struct nft_table
*table
;
3061 struct sk_buff
*skb2
;
3062 int family
= nfmsg
->nfgen_family
;
3065 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
3066 struct netlink_dump_control c
= {
3067 .start
= nf_tables_dump_rules_start
,
3068 .dump
= nf_tables_dump_rules
,
3069 .done
= nf_tables_dump_rules_done
,
3070 .module
= THIS_MODULE
,
3071 .data
= (void *)nla
,
3074 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
3077 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
, 0);
3078 if (IS_ERR(table
)) {
3079 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3080 return PTR_ERR(table
);
3083 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
], genmask
);
3084 if (IS_ERR(chain
)) {
3085 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3086 return PTR_ERR(chain
);
3089 rule
= nft_rule_lookup(chain
, nla
[NFTA_RULE_HANDLE
]);
3091 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3092 return PTR_ERR(rule
);
3095 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
3099 err
= nf_tables_fill_rule_info(skb2
, net
, NETLINK_CB(skb
).portid
,
3100 nlh
->nlmsg_seq
, NFT_MSG_NEWRULE
, 0,
3101 family
, table
, chain
, rule
, NULL
);
3103 goto err_fill_rule_info
;
3105 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
3112 static void nf_tables_rule_destroy(const struct nft_ctx
*ctx
,
3113 struct nft_rule
*rule
)
3115 struct nft_expr
*expr
, *next
;
3118 * Careful: some expressions might not be initialized in case this
3119 * is called on error from nf_tables_newrule().
3121 expr
= nft_expr_first(rule
);
3122 while (nft_expr_more(rule
, expr
)) {
3123 next
= nft_expr_next(expr
);
3124 nf_tables_expr_destroy(ctx
, expr
);
3130 void nf_tables_rule_release(const struct nft_ctx
*ctx
, struct nft_rule
*rule
)
3132 nft_rule_expr_deactivate(ctx
, rule
, NFT_TRANS_RELEASE
);
3133 nf_tables_rule_destroy(ctx
, rule
);
3136 int nft_chain_validate(const struct nft_ctx
*ctx
, const struct nft_chain
*chain
)
3138 struct nft_expr
*expr
, *last
;
3139 const struct nft_data
*data
;
3140 struct nft_rule
*rule
;
3143 if (ctx
->level
== NFT_JUMP_STACK_SIZE
)
3146 list_for_each_entry(rule
, &chain
->rules
, list
) {
3147 if (!nft_is_active_next(ctx
->net
, rule
))
3150 nft_rule_for_each_expr(expr
, last
, rule
) {
3151 if (!expr
->ops
->validate
)
3154 err
= expr
->ops
->validate(ctx
, expr
, &data
);
3162 EXPORT_SYMBOL_GPL(nft_chain_validate
);
3164 static int nft_table_validate(struct net
*net
, const struct nft_table
*table
)
3166 struct nft_chain
*chain
;
3167 struct nft_ctx ctx
= {
3169 .family
= table
->family
,
3173 list_for_each_entry(chain
, &table
->chains
, list
) {
3174 if (!nft_is_base_chain(chain
))
3178 err
= nft_chain_validate(&ctx
, chain
);
3186 static struct nft_rule
*nft_rule_lookup_byid(const struct net
*net
,
3187 const struct nlattr
*nla
);
3189 #define NFT_RULE_MAXEXPRS 128
3191 static int nf_tables_newrule(struct net
*net
, struct sock
*nlsk
,
3192 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3193 const struct nlattr
* const nla
[],
3194 struct netlink_ext_ack
*extack
)
3196 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3197 u8 genmask
= nft_genmask_next(net
);
3198 struct nft_expr_info
*info
= NULL
;
3199 int family
= nfmsg
->nfgen_family
;
3200 struct nft_flow_rule
*flow
;
3201 struct nft_table
*table
;
3202 struct nft_chain
*chain
;
3203 struct nft_rule
*rule
, *old_rule
= NULL
;
3204 struct nft_userdata
*udata
;
3205 struct nft_trans
*trans
= NULL
;
3206 struct nft_expr
*expr
;
3209 unsigned int size
, i
, n
, ulen
= 0, usize
= 0;
3211 u64 handle
, pos_handle
;
3213 lockdep_assert_held(&net
->nft
.commit_mutex
);
3215 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
,
3216 NETLINK_CB(skb
).portid
);
3217 if (IS_ERR(table
)) {
3218 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3219 return PTR_ERR(table
);
3222 if (nla
[NFTA_RULE_CHAIN
]) {
3223 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
],
3225 if (IS_ERR(chain
)) {
3226 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3227 return PTR_ERR(chain
);
3229 if (nft_chain_is_bound(chain
))
3232 } else if (nla
[NFTA_RULE_CHAIN_ID
]) {
3233 chain
= nft_chain_lookup_byid(net
, nla
[NFTA_RULE_CHAIN_ID
]);
3234 if (IS_ERR(chain
)) {
3235 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN_ID
]);
3236 return PTR_ERR(chain
);
3242 if (nla
[NFTA_RULE_HANDLE
]) {
3243 handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_HANDLE
]));
3244 rule
= __nft_rule_lookup(chain
, handle
);
3246 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3247 return PTR_ERR(rule
);
3250 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
3251 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3254 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
3259 if (!(nlh
->nlmsg_flags
& NLM_F_CREATE
) ||
3260 nlh
->nlmsg_flags
& NLM_F_REPLACE
)
3262 handle
= nf_tables_alloc_handle(table
);
3264 if (chain
->use
== UINT_MAX
)
3267 if (nla
[NFTA_RULE_POSITION
]) {
3268 pos_handle
= be64_to_cpu(nla_get_be64(nla
[NFTA_RULE_POSITION
]));
3269 old_rule
= __nft_rule_lookup(chain
, pos_handle
);
3270 if (IS_ERR(old_rule
)) {
3271 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_POSITION
]);
3272 return PTR_ERR(old_rule
);
3274 } else if (nla
[NFTA_RULE_POSITION_ID
]) {
3275 old_rule
= nft_rule_lookup_byid(net
, nla
[NFTA_RULE_POSITION_ID
]);
3276 if (IS_ERR(old_rule
)) {
3277 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_POSITION_ID
]);
3278 return PTR_ERR(old_rule
);
3283 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
3287 if (nla
[NFTA_RULE_EXPRESSIONS
]) {
3288 info
= kvmalloc_array(NFT_RULE_MAXEXPRS
,
3289 sizeof(struct nft_expr_info
),
3294 nla_for_each_nested(tmp
, nla
[NFTA_RULE_EXPRESSIONS
], rem
) {
3296 if (nla_type(tmp
) != NFTA_LIST_ELEM
)
3298 if (n
== NFT_RULE_MAXEXPRS
)
3300 err
= nf_tables_expr_parse(&ctx
, tmp
, &info
[n
]);
3303 size
+= info
[n
].ops
->size
;
3307 /* Check for overflow of dlen field */
3309 if (size
>= 1 << 12)
3312 if (nla
[NFTA_RULE_USERDATA
]) {
3313 ulen
= nla_len(nla
[NFTA_RULE_USERDATA
]);
3315 usize
= sizeof(struct nft_userdata
) + ulen
;
3319 rule
= kzalloc(sizeof(*rule
) + size
+ usize
, GFP_KERNEL
);
3323 nft_activate_next(net
, rule
);
3325 rule
->handle
= handle
;
3327 rule
->udata
= ulen
? 1 : 0;
3330 udata
= nft_userdata(rule
);
3331 udata
->len
= ulen
- 1;
3332 nla_memcpy(udata
->data
, nla
[NFTA_RULE_USERDATA
], ulen
);
3335 expr
= nft_expr_first(rule
);
3336 for (i
= 0; i
< n
; i
++) {
3337 err
= nf_tables_newexpr(&ctx
, &info
[i
], expr
);
3339 NL_SET_BAD_ATTR(extack
, info
[i
].attr
);
3343 if (info
[i
].ops
->validate
)
3344 nft_validate_state_update(net
, NFT_VALIDATE_NEED
);
3347 expr
= nft_expr_next(expr
);
3350 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
) {
3351 trans
= nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
);
3352 if (trans
== NULL
) {
3356 err
= nft_delrule(&ctx
, old_rule
);
3358 nft_trans_destroy(trans
);
3362 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
3364 trans
= nft_trans_rule_add(&ctx
, NFT_MSG_NEWRULE
, rule
);
3370 if (nlh
->nlmsg_flags
& NLM_F_APPEND
) {
3372 list_add_rcu(&rule
->list
, &old_rule
->list
);
3374 list_add_tail_rcu(&rule
->list
, &chain
->rules
);
3377 list_add_tail_rcu(&rule
->list
, &old_rule
->list
);
3379 list_add_rcu(&rule
->list
, &chain
->rules
);
3385 if (net
->nft
.validate_state
== NFT_VALIDATE_DO
)
3386 return nft_table_validate(net
, table
);
3388 if (chain
->flags
& NFT_CHAIN_HW_OFFLOAD
) {
3389 flow
= nft_flow_rule_create(net
, rule
);
3391 return PTR_ERR(flow
);
3393 nft_trans_flow_rule(trans
) = flow
;
3398 nf_tables_rule_release(&ctx
, rule
);
3400 for (i
= 0; i
< n
; i
++) {
3402 module_put(info
[i
].ops
->type
->owner
);
3403 if (info
[i
].ops
->type
->release_ops
)
3404 info
[i
].ops
->type
->release_ops(info
[i
].ops
);
3411 static struct nft_rule
*nft_rule_lookup_byid(const struct net
*net
,
3412 const struct nlattr
*nla
)
3414 u32 id
= ntohl(nla_get_be32(nla
));
3415 struct nft_trans
*trans
;
3417 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
3418 struct nft_rule
*rule
= nft_trans_rule(trans
);
3420 if (trans
->msg_type
== NFT_MSG_NEWRULE
&&
3421 id
== nft_trans_rule_id(trans
))
3424 return ERR_PTR(-ENOENT
);
3427 static int nf_tables_delrule(struct net
*net
, struct sock
*nlsk
,
3428 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
3429 const struct nlattr
* const nla
[],
3430 struct netlink_ext_ack
*extack
)
3432 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3433 u8 genmask
= nft_genmask_next(net
);
3434 struct nft_table
*table
;
3435 struct nft_chain
*chain
= NULL
;
3436 struct nft_rule
*rule
;
3437 int family
= nfmsg
->nfgen_family
, err
= 0;
3440 table
= nft_table_lookup(net
, nla
[NFTA_RULE_TABLE
], family
, genmask
,
3441 NETLINK_CB(skb
).portid
);
3442 if (IS_ERR(table
)) {
3443 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_TABLE
]);
3444 return PTR_ERR(table
);
3447 if (nla
[NFTA_RULE_CHAIN
]) {
3448 chain
= nft_chain_lookup(net
, table
, nla
[NFTA_RULE_CHAIN
],
3450 if (IS_ERR(chain
)) {
3451 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_CHAIN
]);
3452 return PTR_ERR(chain
);
3454 if (nft_chain_is_bound(chain
))
3458 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, chain
, nla
);
3461 if (nla
[NFTA_RULE_HANDLE
]) {
3462 rule
= nft_rule_lookup(chain
, nla
[NFTA_RULE_HANDLE
]);
3464 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_HANDLE
]);
3465 return PTR_ERR(rule
);
3468 err
= nft_delrule(&ctx
, rule
);
3469 } else if (nla
[NFTA_RULE_ID
]) {
3470 rule
= nft_rule_lookup_byid(net
, nla
[NFTA_RULE_ID
]);
3472 NL_SET_BAD_ATTR(extack
, nla
[NFTA_RULE_ID
]);
3473 return PTR_ERR(rule
);
3476 err
= nft_delrule(&ctx
, rule
);
3478 err
= nft_delrule_by_chain(&ctx
);
3481 list_for_each_entry(chain
, &table
->chains
, list
) {
3482 if (!nft_is_active_next(net
, chain
))
3486 err
= nft_delrule_by_chain(&ctx
);
3498 static const struct nft_set_type
*nft_set_types
[] = {
3499 &nft_set_hash_fast_type
,
3501 &nft_set_rhash_type
,
3502 &nft_set_bitmap_type
,
3503 &nft_set_rbtree_type
,
3504 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
3505 &nft_set_pipapo_avx2_type
,
3507 &nft_set_pipapo_type
,
3510 #define NFT_SET_FEATURES (NFT_SET_INTERVAL | NFT_SET_MAP | \
3511 NFT_SET_TIMEOUT | NFT_SET_OBJECT | \
3514 static bool nft_set_ops_candidate(const struct nft_set_type
*type
, u32 flags
)
3516 return (flags
& type
->features
) == (flags
& NFT_SET_FEATURES
);
3520 * Select a set implementation based on the data characteristics and the
3521 * given policy. The total memory use might not be known if no size is
3522 * given, in that case the amount of memory per element is used.
3524 static const struct nft_set_ops
*
3525 nft_select_set_ops(const struct nft_ctx
*ctx
,
3526 const struct nlattr
* const nla
[],
3527 const struct nft_set_desc
*desc
,
3528 enum nft_set_policies policy
)
3530 const struct nft_set_ops
*ops
, *bops
;
3531 struct nft_set_estimate est
, best
;
3532 const struct nft_set_type
*type
;
3536 lockdep_assert_held(&ctx
->net
->nft
.commit_mutex
);
3537 lockdep_nfnl_nft_mutex_not_held();
3539 if (nla
[NFTA_SET_FLAGS
] != NULL
)
3540 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
3547 for (i
= 0; i
< ARRAY_SIZE(nft_set_types
); i
++) {
3548 type
= nft_set_types
[i
];
3551 if (!nft_set_ops_candidate(type
, flags
))
3553 if (!ops
->estimate(desc
, flags
, &est
))
3557 case NFT_SET_POL_PERFORMANCE
:
3558 if (est
.lookup
< best
.lookup
)
3560 if (est
.lookup
== best
.lookup
&&
3561 est
.space
< best
.space
)
3564 case NFT_SET_POL_MEMORY
:
3566 if (est
.space
< best
.space
)
3568 if (est
.space
== best
.space
&&
3569 est
.lookup
< best
.lookup
)
3571 } else if (est
.size
< best
.size
|| !bops
) {
3586 return ERR_PTR(-EOPNOTSUPP
);
3589 static const struct nla_policy nft_set_policy
[NFTA_SET_MAX
+ 1] = {
3590 [NFTA_SET_TABLE
] = { .type
= NLA_STRING
,
3591 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
3592 [NFTA_SET_NAME
] = { .type
= NLA_STRING
,
3593 .len
= NFT_SET_MAXNAMELEN
- 1 },
3594 [NFTA_SET_FLAGS
] = { .type
= NLA_U32
},
3595 [NFTA_SET_KEY_TYPE
] = { .type
= NLA_U32
},
3596 [NFTA_SET_KEY_LEN
] = { .type
= NLA_U32
},
3597 [NFTA_SET_DATA_TYPE
] = { .type
= NLA_U32
},
3598 [NFTA_SET_DATA_LEN
] = { .type
= NLA_U32
},
3599 [NFTA_SET_POLICY
] = { .type
= NLA_U32
},
3600 [NFTA_SET_DESC
] = { .type
= NLA_NESTED
},
3601 [NFTA_SET_ID
] = { .type
= NLA_U32
},
3602 [NFTA_SET_TIMEOUT
] = { .type
= NLA_U64
},
3603 [NFTA_SET_GC_INTERVAL
] = { .type
= NLA_U32
},
3604 [NFTA_SET_USERDATA
] = { .type
= NLA_BINARY
,
3605 .len
= NFT_USERDATA_MAXLEN
},
3606 [NFTA_SET_OBJ_TYPE
] = { .type
= NLA_U32
},
3607 [NFTA_SET_HANDLE
] = { .type
= NLA_U64
},
3608 [NFTA_SET_EXPR
] = { .type
= NLA_NESTED
},
3609 [NFTA_SET_EXPRESSIONS
] = { .type
= NLA_NESTED
},
3612 static const struct nla_policy nft_set_desc_policy
[NFTA_SET_DESC_MAX
+ 1] = {
3613 [NFTA_SET_DESC_SIZE
] = { .type
= NLA_U32
},
3614 [NFTA_SET_DESC_CONCAT
] = { .type
= NLA_NESTED
},
3617 static int nft_ctx_init_from_setattr(struct nft_ctx
*ctx
, struct net
*net
,
3618 const struct sk_buff
*skb
,
3619 const struct nlmsghdr
*nlh
,
3620 const struct nlattr
* const nla
[],
3621 struct netlink_ext_ack
*extack
,
3622 u8 genmask
, u32 nlpid
)
3624 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
3625 int family
= nfmsg
->nfgen_family
;
3626 struct nft_table
*table
= NULL
;
3628 if (nla
[NFTA_SET_TABLE
] != NULL
) {
3629 table
= nft_table_lookup(net
, nla
[NFTA_SET_TABLE
], family
,
3631 if (IS_ERR(table
)) {
3632 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_TABLE
]);
3633 return PTR_ERR(table
);
3637 nft_ctx_init(ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
3641 static struct nft_set
*nft_set_lookup(const struct nft_table
*table
,
3642 const struct nlattr
*nla
, u8 genmask
)
3644 struct nft_set
*set
;
3647 return ERR_PTR(-EINVAL
);
3649 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
3650 if (!nla_strcmp(nla
, set
->name
) &&
3651 nft_active_genmask(set
, genmask
))
3654 return ERR_PTR(-ENOENT
);
3657 static struct nft_set
*nft_set_lookup_byhandle(const struct nft_table
*table
,
3658 const struct nlattr
*nla
,
3661 struct nft_set
*set
;
3663 list_for_each_entry(set
, &table
->sets
, list
) {
3664 if (be64_to_cpu(nla_get_be64(nla
)) == set
->handle
&&
3665 nft_active_genmask(set
, genmask
))
3668 return ERR_PTR(-ENOENT
);
3671 static struct nft_set
*nft_set_lookup_byid(const struct net
*net
,
3672 const struct nlattr
*nla
, u8 genmask
)
3674 struct nft_trans
*trans
;
3675 u32 id
= ntohl(nla_get_be32(nla
));
3677 list_for_each_entry(trans
, &net
->nft
.commit_list
, list
) {
3678 if (trans
->msg_type
== NFT_MSG_NEWSET
) {
3679 struct nft_set
*set
= nft_trans_set(trans
);
3681 if (id
== nft_trans_set_id(trans
) &&
3682 nft_active_genmask(set
, genmask
))
3686 return ERR_PTR(-ENOENT
);
3689 struct nft_set
*nft_set_lookup_global(const struct net
*net
,
3690 const struct nft_table
*table
,
3691 const struct nlattr
*nla_set_name
,
3692 const struct nlattr
*nla_set_id
,
3695 struct nft_set
*set
;
3697 set
= nft_set_lookup(table
, nla_set_name
, genmask
);
3702 set
= nft_set_lookup_byid(net
, nla_set_id
, genmask
);
3706 EXPORT_SYMBOL_GPL(nft_set_lookup_global
);
3708 static int nf_tables_set_alloc_name(struct nft_ctx
*ctx
, struct nft_set
*set
,
3711 const struct nft_set
*i
;
3713 unsigned long *inuse
;
3714 unsigned int n
= 0, min
= 0;
3716 p
= strchr(name
, '%');
3718 if (p
[1] != 'd' || strchr(p
+ 2, '%'))
3721 inuse
= (unsigned long *)get_zeroed_page(GFP_KERNEL
);
3725 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
3728 if (!nft_is_active_next(ctx
->net
, set
))
3730 if (!sscanf(i
->name
, name
, &tmp
))
3732 if (tmp
< min
|| tmp
>= min
+ BITS_PER_BYTE
* PAGE_SIZE
)
3735 set_bit(tmp
- min
, inuse
);
3738 n
= find_first_zero_bit(inuse
, BITS_PER_BYTE
* PAGE_SIZE
);
3739 if (n
>= BITS_PER_BYTE
* PAGE_SIZE
) {
3740 min
+= BITS_PER_BYTE
* PAGE_SIZE
;
3741 memset(inuse
, 0, PAGE_SIZE
);
3744 free_page((unsigned long)inuse
);
3747 set
->name
= kasprintf(GFP_KERNEL
, name
, min
+ n
);
3751 list_for_each_entry(i
, &ctx
->table
->sets
, list
) {
3752 if (!nft_is_active_next(ctx
->net
, i
))
3754 if (!strcmp(set
->name
, i
->name
)) {
3763 int nf_msecs_to_jiffies64(const struct nlattr
*nla
, u64
*result
)
3765 u64 ms
= be64_to_cpu(nla_get_be64(nla
));
3766 u64 max
= (u64
)(~((u64
)0));
3768 max
= div_u64(max
, NSEC_PER_MSEC
);
3772 ms
*= NSEC_PER_MSEC
;
3773 *result
= nsecs_to_jiffies64(ms
);
3777 __be64
nf_jiffies64_to_msecs(u64 input
)
3779 return cpu_to_be64(jiffies64_to_msecs(input
));
3782 static int nf_tables_fill_set_concat(struct sk_buff
*skb
,
3783 const struct nft_set
*set
)
3785 struct nlattr
*concat
, *field
;
3788 concat
= nla_nest_start_noflag(skb
, NFTA_SET_DESC_CONCAT
);
3792 for (i
= 0; i
< set
->field_count
; i
++) {
3793 field
= nla_nest_start_noflag(skb
, NFTA_LIST_ELEM
);
3797 if (nla_put_be32(skb
, NFTA_SET_FIELD_LEN
,
3798 htonl(set
->field_len
[i
])))
3801 nla_nest_end(skb
, field
);
3804 nla_nest_end(skb
, concat
);
3809 static int nf_tables_fill_set(struct sk_buff
*skb
, const struct nft_ctx
*ctx
,
3810 const struct nft_set
*set
, u16 event
, u16 flags
)
3812 struct nfgenmsg
*nfmsg
;
3813 struct nlmsghdr
*nlh
;
3814 u32 portid
= ctx
->portid
;
3815 struct nlattr
*nest
;
3819 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
3820 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
3823 goto nla_put_failure
;
3825 nfmsg
= nlmsg_data(nlh
);
3826 nfmsg
->nfgen_family
= ctx
->family
;
3827 nfmsg
->version
= NFNETLINK_V0
;
3828 nfmsg
->res_id
= nft_base_seq(ctx
->net
);
3830 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
3831 goto nla_put_failure
;
3832 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
3833 goto nla_put_failure
;
3834 if (nla_put_be64(skb
, NFTA_SET_HANDLE
, cpu_to_be64(set
->handle
),
3836 goto nla_put_failure
;
3837 if (set
->flags
!= 0)
3838 if (nla_put_be32(skb
, NFTA_SET_FLAGS
, htonl(set
->flags
)))
3839 goto nla_put_failure
;
3841 if (nla_put_be32(skb
, NFTA_SET_KEY_TYPE
, htonl(set
->ktype
)))
3842 goto nla_put_failure
;
3843 if (nla_put_be32(skb
, NFTA_SET_KEY_LEN
, htonl(set
->klen
)))
3844 goto nla_put_failure
;
3845 if (set
->flags
& NFT_SET_MAP
) {
3846 if (nla_put_be32(skb
, NFTA_SET_DATA_TYPE
, htonl(set
->dtype
)))
3847 goto nla_put_failure
;
3848 if (nla_put_be32(skb
, NFTA_SET_DATA_LEN
, htonl(set
->dlen
)))
3849 goto nla_put_failure
;
3851 if (set
->flags
& NFT_SET_OBJECT
&&
3852 nla_put_be32(skb
, NFTA_SET_OBJ_TYPE
, htonl(set
->objtype
)))
3853 goto nla_put_failure
;
3856 nla_put_be64(skb
, NFTA_SET_TIMEOUT
,
3857 nf_jiffies64_to_msecs(set
->timeout
),
3859 goto nla_put_failure
;
3861 nla_put_be32(skb
, NFTA_SET_GC_INTERVAL
, htonl(set
->gc_int
)))
3862 goto nla_put_failure
;
3864 if (set
->policy
!= NFT_SET_POL_PERFORMANCE
) {
3865 if (nla_put_be32(skb
, NFTA_SET_POLICY
, htonl(set
->policy
)))
3866 goto nla_put_failure
;
3870 nla_put(skb
, NFTA_SET_USERDATA
, set
->udlen
, set
->udata
))
3871 goto nla_put_failure
;
3873 nest
= nla_nest_start_noflag(skb
, NFTA_SET_DESC
);
3875 goto nla_put_failure
;
3877 nla_put_be32(skb
, NFTA_SET_DESC_SIZE
, htonl(set
->size
)))
3878 goto nla_put_failure
;
3880 if (set
->field_count
> 1 &&
3881 nf_tables_fill_set_concat(skb
, set
))
3882 goto nla_put_failure
;
3884 nla_nest_end(skb
, nest
);
3886 if (set
->num_exprs
== 1) {
3887 nest
= nla_nest_start_noflag(skb
, NFTA_SET_EXPR
);
3888 if (nf_tables_fill_expr_info(skb
, set
->exprs
[0]) < 0)
3889 goto nla_put_failure
;
3891 nla_nest_end(skb
, nest
);
3892 } else if (set
->num_exprs
> 1) {
3893 nest
= nla_nest_start_noflag(skb
, NFTA_SET_EXPRESSIONS
);
3895 goto nla_put_failure
;
3897 for (i
= 0; i
< set
->num_exprs
; i
++) {
3898 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
,
3900 goto nla_put_failure
;
3902 nla_nest_end(skb
, nest
);
3905 nlmsg_end(skb
, nlh
);
3909 nlmsg_trim(skb
, nlh
);
3913 static void nf_tables_set_notify(const struct nft_ctx
*ctx
,
3914 const struct nft_set
*set
, int event
,
3917 struct sk_buff
*skb
;
3918 u32 portid
= ctx
->portid
;
3922 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
3925 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp_flags
);
3929 err
= nf_tables_fill_set(skb
, ctx
, set
, event
, 0);
3935 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
3938 nfnetlink_set_err(ctx
->net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
3941 static int nf_tables_dump_sets(struct sk_buff
*skb
, struct netlink_callback
*cb
)
3943 const struct nft_set
*set
;
3944 unsigned int idx
, s_idx
= cb
->args
[0];
3945 struct nft_table
*table
, *cur_table
= (struct nft_table
*)cb
->args
[2];
3946 struct net
*net
= sock_net(skb
->sk
);
3947 struct nft_ctx
*ctx
= cb
->data
, ctx_set
;
3953 cb
->seq
= net
->nft
.base_seq
;
3955 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
3956 if (ctx
->family
!= NFPROTO_UNSPEC
&&
3957 ctx
->family
!= table
->family
)
3960 if (ctx
->table
&& ctx
->table
!= table
)
3964 if (cur_table
!= table
)
3970 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
3973 if (!nft_is_active(net
, set
))
3977 ctx_set
.table
= table
;
3978 ctx_set
.family
= table
->family
;
3980 if (nf_tables_fill_set(skb
, &ctx_set
, set
,
3984 cb
->args
[2] = (unsigned long) table
;
3987 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
4000 static int nf_tables_dump_sets_start(struct netlink_callback
*cb
)
4002 struct nft_ctx
*ctx_dump
= NULL
;
4004 ctx_dump
= kmemdup(cb
->data
, sizeof(*ctx_dump
), GFP_ATOMIC
);
4005 if (ctx_dump
== NULL
)
4008 cb
->data
= ctx_dump
;
4012 static int nf_tables_dump_sets_done(struct netlink_callback
*cb
)
4018 /* called with rcu_read_lock held */
4019 static int nf_tables_getset(struct net
*net
, struct sock
*nlsk
,
4020 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4021 const struct nlattr
* const nla
[],
4022 struct netlink_ext_ack
*extack
)
4024 u8 genmask
= nft_genmask_cur(net
);
4025 const struct nft_set
*set
;
4027 struct sk_buff
*skb2
;
4028 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4031 /* Verify existence before starting dump */
4032 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
4037 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
4038 struct netlink_dump_control c
= {
4039 .start
= nf_tables_dump_sets_start
,
4040 .dump
= nf_tables_dump_sets
,
4041 .done
= nf_tables_dump_sets_done
,
4043 .module
= THIS_MODULE
,
4046 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
4049 /* Only accept unspec with dump */
4050 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
4051 return -EAFNOSUPPORT
;
4052 if (!nla
[NFTA_SET_TABLE
])
4055 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_NAME
], genmask
);
4057 return PTR_ERR(set
);
4059 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
4063 err
= nf_tables_fill_set(skb2
, &ctx
, set
, NFT_MSG_NEWSET
, 0);
4065 goto err_fill_set_info
;
4067 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
4074 static const struct nla_policy nft_concat_policy
[NFTA_SET_FIELD_MAX
+ 1] = {
4075 [NFTA_SET_FIELD_LEN
] = { .type
= NLA_U32
},
4078 static int nft_set_desc_concat_parse(const struct nlattr
*attr
,
4079 struct nft_set_desc
*desc
)
4081 struct nlattr
*tb
[NFTA_SET_FIELD_MAX
+ 1];
4085 err
= nla_parse_nested_deprecated(tb
, NFTA_SET_FIELD_MAX
, attr
,
4086 nft_concat_policy
, NULL
);
4090 if (!tb
[NFTA_SET_FIELD_LEN
])
4093 len
= ntohl(nla_get_be32(tb
[NFTA_SET_FIELD_LEN
]));
4095 if (len
* BITS_PER_BYTE
/ 32 > NFT_REG32_COUNT
)
4098 desc
->field_len
[desc
->field_count
++] = len
;
4103 static int nft_set_desc_concat(struct nft_set_desc
*desc
,
4104 const struct nlattr
*nla
)
4106 struct nlattr
*attr
;
4109 nla_for_each_nested(attr
, nla
, rem
) {
4110 if (nla_type(attr
) != NFTA_LIST_ELEM
)
4113 err
= nft_set_desc_concat_parse(attr
, desc
);
4121 static int nf_tables_set_desc_parse(struct nft_set_desc
*desc
,
4122 const struct nlattr
*nla
)
4124 struct nlattr
*da
[NFTA_SET_DESC_MAX
+ 1];
4127 err
= nla_parse_nested_deprecated(da
, NFTA_SET_DESC_MAX
, nla
,
4128 nft_set_desc_policy
, NULL
);
4132 if (da
[NFTA_SET_DESC_SIZE
] != NULL
)
4133 desc
->size
= ntohl(nla_get_be32(da
[NFTA_SET_DESC_SIZE
]));
4134 if (da
[NFTA_SET_DESC_CONCAT
])
4135 err
= nft_set_desc_concat(desc
, da
[NFTA_SET_DESC_CONCAT
]);
4140 static int nf_tables_newset(struct net
*net
, struct sock
*nlsk
,
4141 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4142 const struct nlattr
* const nla
[],
4143 struct netlink_ext_ack
*extack
)
4145 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4146 u8 genmask
= nft_genmask_next(net
);
4147 int family
= nfmsg
->nfgen_family
;
4148 const struct nft_set_ops
*ops
;
4149 struct nft_expr
*expr
= NULL
;
4150 struct nft_table
*table
;
4151 struct nft_set
*set
;
4156 u32 ktype
, dtype
, flags
, policy
, gc_int
, objtype
;
4157 struct nft_set_desc desc
;
4158 unsigned char *udata
;
4163 if (nla
[NFTA_SET_TABLE
] == NULL
||
4164 nla
[NFTA_SET_NAME
] == NULL
||
4165 nla
[NFTA_SET_KEY_LEN
] == NULL
||
4166 nla
[NFTA_SET_ID
] == NULL
)
4169 memset(&desc
, 0, sizeof(desc
));
4171 ktype
= NFT_DATA_VALUE
;
4172 if (nla
[NFTA_SET_KEY_TYPE
] != NULL
) {
4173 ktype
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_TYPE
]));
4174 if ((ktype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
)
4178 desc
.klen
= ntohl(nla_get_be32(nla
[NFTA_SET_KEY_LEN
]));
4179 if (desc
.klen
== 0 || desc
.klen
> NFT_DATA_VALUE_MAXLEN
)
4183 if (nla
[NFTA_SET_FLAGS
] != NULL
) {
4184 flags
= ntohl(nla_get_be32(nla
[NFTA_SET_FLAGS
]));
4185 if (flags
& ~(NFT_SET_ANONYMOUS
| NFT_SET_CONSTANT
|
4186 NFT_SET_INTERVAL
| NFT_SET_TIMEOUT
|
4187 NFT_SET_MAP
| NFT_SET_EVAL
|
4188 NFT_SET_OBJECT
| NFT_SET_CONCAT
| NFT_SET_EXPR
))
4190 /* Only one of these operations is supported */
4191 if ((flags
& (NFT_SET_MAP
| NFT_SET_OBJECT
)) ==
4192 (NFT_SET_MAP
| NFT_SET_OBJECT
))
4194 if ((flags
& (NFT_SET_EVAL
| NFT_SET_OBJECT
)) ==
4195 (NFT_SET_EVAL
| NFT_SET_OBJECT
))
4200 if (nla
[NFTA_SET_DATA_TYPE
] != NULL
) {
4201 if (!(flags
& NFT_SET_MAP
))
4204 dtype
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_TYPE
]));
4205 if ((dtype
& NFT_DATA_RESERVED_MASK
) == NFT_DATA_RESERVED_MASK
&&
4206 dtype
!= NFT_DATA_VERDICT
)
4209 if (dtype
!= NFT_DATA_VERDICT
) {
4210 if (nla
[NFTA_SET_DATA_LEN
] == NULL
)
4212 desc
.dlen
= ntohl(nla_get_be32(nla
[NFTA_SET_DATA_LEN
]));
4213 if (desc
.dlen
== 0 || desc
.dlen
> NFT_DATA_VALUE_MAXLEN
)
4216 desc
.dlen
= sizeof(struct nft_verdict
);
4217 } else if (flags
& NFT_SET_MAP
)
4220 if (nla
[NFTA_SET_OBJ_TYPE
] != NULL
) {
4221 if (!(flags
& NFT_SET_OBJECT
))
4224 objtype
= ntohl(nla_get_be32(nla
[NFTA_SET_OBJ_TYPE
]));
4225 if (objtype
== NFT_OBJECT_UNSPEC
||
4226 objtype
> NFT_OBJECT_MAX
)
4228 } else if (flags
& NFT_SET_OBJECT
)
4231 objtype
= NFT_OBJECT_UNSPEC
;
4234 if (nla
[NFTA_SET_TIMEOUT
] != NULL
) {
4235 if (!(flags
& NFT_SET_TIMEOUT
))
4238 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_TIMEOUT
], &timeout
);
4243 if (nla
[NFTA_SET_GC_INTERVAL
] != NULL
) {
4244 if (!(flags
& NFT_SET_TIMEOUT
))
4246 gc_int
= ntohl(nla_get_be32(nla
[NFTA_SET_GC_INTERVAL
]));
4249 policy
= NFT_SET_POL_PERFORMANCE
;
4250 if (nla
[NFTA_SET_POLICY
] != NULL
)
4251 policy
= ntohl(nla_get_be32(nla
[NFTA_SET_POLICY
]));
4253 if (nla
[NFTA_SET_DESC
] != NULL
) {
4254 err
= nf_tables_set_desc_parse(&desc
, nla
[NFTA_SET_DESC
]);
4259 if (nla
[NFTA_SET_EXPR
] || nla
[NFTA_SET_EXPRESSIONS
])
4262 table
= nft_table_lookup(net
, nla
[NFTA_SET_TABLE
], family
, genmask
,
4263 NETLINK_CB(skb
).portid
);
4264 if (IS_ERR(table
)) {
4265 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_TABLE
]);
4266 return PTR_ERR(table
);
4269 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
4271 set
= nft_set_lookup(table
, nla
[NFTA_SET_NAME
], genmask
);
4273 if (PTR_ERR(set
) != -ENOENT
) {
4274 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_NAME
]);
4275 return PTR_ERR(set
);
4278 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
4279 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_NAME
]);
4282 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
4288 if (!(nlh
->nlmsg_flags
& NLM_F_CREATE
))
4291 ops
= nft_select_set_ops(&ctx
, nla
, &desc
, policy
);
4293 return PTR_ERR(ops
);
4296 if (nla
[NFTA_SET_USERDATA
])
4297 udlen
= nla_len(nla
[NFTA_SET_USERDATA
]);
4300 if (ops
->privsize
!= NULL
)
4301 size
= ops
->privsize(nla
, &desc
);
4303 set
= kvzalloc(sizeof(*set
) + size
+ udlen
, GFP_KERNEL
);
4307 name
= nla_strdup(nla
[NFTA_SET_NAME
], GFP_KERNEL
);
4313 err
= nf_tables_set_alloc_name(&ctx
, set
, name
);
4316 goto err_set_alloc_name
;
4318 if (nla
[NFTA_SET_EXPR
]) {
4319 expr
= nft_set_elem_expr_alloc(&ctx
, set
, nla
[NFTA_SET_EXPR
]);
4321 err
= PTR_ERR(expr
);
4322 goto err_set_alloc_name
;
4324 set
->exprs
[0] = expr
;
4326 } else if (nla
[NFTA_SET_EXPRESSIONS
]) {
4327 struct nft_expr
*expr
;
4331 if (!(flags
& NFT_SET_EXPR
)) {
4333 goto err_set_alloc_name
;
4336 nla_for_each_nested(tmp
, nla
[NFTA_SET_EXPRESSIONS
], left
) {
4337 if (i
== NFT_SET_EXPR_MAX
) {
4341 if (nla_type(tmp
) != NFTA_LIST_ELEM
) {
4345 expr
= nft_set_elem_expr_alloc(&ctx
, set
, tmp
);
4347 err
= PTR_ERR(expr
);
4350 set
->exprs
[i
++] = expr
;
4357 udata
= set
->data
+ size
;
4358 nla_memcpy(udata
, nla
[NFTA_SET_USERDATA
], udlen
);
4361 INIT_LIST_HEAD(&set
->bindings
);
4363 write_pnet(&set
->net
, net
);
4366 set
->klen
= desc
.klen
;
4368 set
->objtype
= objtype
;
4369 set
->dlen
= desc
.dlen
;
4371 set
->size
= desc
.size
;
4372 set
->policy
= policy
;
4375 set
->timeout
= timeout
;
4376 set
->gc_int
= gc_int
;
4377 set
->handle
= nf_tables_alloc_handle(table
);
4379 set
->field_count
= desc
.field_count
;
4380 for (i
= 0; i
< desc
.field_count
; i
++)
4381 set
->field_len
[i
] = desc
.field_len
[i
];
4383 err
= ops
->init(set
, &desc
, nla
);
4387 err
= nft_trans_set_add(&ctx
, NFT_MSG_NEWSET
, set
);
4391 list_add_tail_rcu(&set
->list
, &table
->sets
);
4398 for (i
= 0; i
< set
->num_exprs
; i
++)
4399 nft_expr_destroy(&ctx
, set
->exprs
[i
]);
4407 static void nft_set_destroy(const struct nft_ctx
*ctx
, struct nft_set
*set
)
4411 if (WARN_ON(set
->use
> 0))
4414 for (i
= 0; i
< set
->num_exprs
; i
++)
4415 nft_expr_destroy(ctx
, set
->exprs
[i
]);
4417 set
->ops
->destroy(set
);
4422 static int nf_tables_delset(struct net
*net
, struct sock
*nlsk
,
4423 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
4424 const struct nlattr
* const nla
[],
4425 struct netlink_ext_ack
*extack
)
4427 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4428 u8 genmask
= nft_genmask_next(net
);
4429 const struct nlattr
*attr
;
4430 struct nft_set
*set
;
4434 if (nfmsg
->nfgen_family
== NFPROTO_UNSPEC
)
4435 return -EAFNOSUPPORT
;
4436 if (nla
[NFTA_SET_TABLE
] == NULL
)
4439 err
= nft_ctx_init_from_setattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
4440 genmask
, NETLINK_CB(skb
).portid
);
4444 if (nla
[NFTA_SET_HANDLE
]) {
4445 attr
= nla
[NFTA_SET_HANDLE
];
4446 set
= nft_set_lookup_byhandle(ctx
.table
, attr
, genmask
);
4448 attr
= nla
[NFTA_SET_NAME
];
4449 set
= nft_set_lookup(ctx
.table
, attr
, genmask
);
4453 NL_SET_BAD_ATTR(extack
, attr
);
4454 return PTR_ERR(set
);
4457 (nlh
->nlmsg_flags
& NLM_F_NONREC
&& atomic_read(&set
->nelems
) > 0)) {
4458 NL_SET_BAD_ATTR(extack
, attr
);
4462 return nft_delset(&ctx
, set
);
4465 static int nft_validate_register_store(const struct nft_ctx
*ctx
,
4466 enum nft_registers reg
,
4467 const struct nft_data
*data
,
4468 enum nft_data_types type
,
4471 static int nf_tables_bind_check_setelem(const struct nft_ctx
*ctx
,
4472 struct nft_set
*set
,
4473 const struct nft_set_iter
*iter
,
4474 struct nft_set_elem
*elem
)
4476 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4477 enum nft_registers dreg
;
4479 dreg
= nft_type_to_reg(set
->dtype
);
4480 return nft_validate_register_store(ctx
, dreg
, nft_set_ext_data(ext
),
4481 set
->dtype
== NFT_DATA_VERDICT
?
4482 NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
4486 int nf_tables_bind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4487 struct nft_set_binding
*binding
)
4489 struct nft_set_binding
*i
;
4490 struct nft_set_iter iter
;
4492 if (set
->use
== UINT_MAX
)
4495 if (!list_empty(&set
->bindings
) && nft_set_is_anonymous(set
))
4498 if (binding
->flags
& NFT_SET_MAP
) {
4499 /* If the set is already bound to the same chain all
4500 * jumps are already validated for that chain.
4502 list_for_each_entry(i
, &set
->bindings
, list
) {
4503 if (i
->flags
& NFT_SET_MAP
&&
4504 i
->chain
== binding
->chain
)
4508 iter
.genmask
= nft_genmask_next(ctx
->net
);
4512 iter
.fn
= nf_tables_bind_check_setelem
;
4514 set
->ops
->walk(ctx
, set
, &iter
);
4519 binding
->chain
= ctx
->chain
;
4520 list_add_tail_rcu(&binding
->list
, &set
->bindings
);
4521 nft_set_trans_bind(ctx
, set
);
4526 EXPORT_SYMBOL_GPL(nf_tables_bind_set
);
4528 static void nf_tables_unbind_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4529 struct nft_set_binding
*binding
, bool event
)
4531 list_del_rcu(&binding
->list
);
4533 if (list_empty(&set
->bindings
) && nft_set_is_anonymous(set
)) {
4534 list_del_rcu(&set
->list
);
4536 nf_tables_set_notify(ctx
, set
, NFT_MSG_DELSET
,
4541 void nf_tables_deactivate_set(const struct nft_ctx
*ctx
, struct nft_set
*set
,
4542 struct nft_set_binding
*binding
,
4543 enum nft_trans_phase phase
)
4546 case NFT_TRANS_PREPARE
:
4549 case NFT_TRANS_ABORT
:
4550 case NFT_TRANS_RELEASE
:
4554 nf_tables_unbind_set(ctx
, set
, binding
,
4555 phase
== NFT_TRANS_COMMIT
);
4558 EXPORT_SYMBOL_GPL(nf_tables_deactivate_set
);
4560 void nf_tables_destroy_set(const struct nft_ctx
*ctx
, struct nft_set
*set
)
4562 if (list_empty(&set
->bindings
) && nft_set_is_anonymous(set
))
4563 nft_set_destroy(ctx
, set
);
4565 EXPORT_SYMBOL_GPL(nf_tables_destroy_set
);
4567 const struct nft_set_ext_type nft_set_ext_types
[] = {
4568 [NFT_SET_EXT_KEY
] = {
4569 .align
= __alignof__(u32
),
4571 [NFT_SET_EXT_DATA
] = {
4572 .align
= __alignof__(u32
),
4574 [NFT_SET_EXT_EXPRESSIONS
] = {
4575 .align
= __alignof__(struct nft_set_elem_expr
),
4577 [NFT_SET_EXT_OBJREF
] = {
4578 .len
= sizeof(struct nft_object
*),
4579 .align
= __alignof__(struct nft_object
*),
4581 [NFT_SET_EXT_FLAGS
] = {
4583 .align
= __alignof__(u8
),
4585 [NFT_SET_EXT_TIMEOUT
] = {
4587 .align
= __alignof__(u64
),
4589 [NFT_SET_EXT_EXPIRATION
] = {
4591 .align
= __alignof__(u64
),
4593 [NFT_SET_EXT_USERDATA
] = {
4594 .len
= sizeof(struct nft_userdata
),
4595 .align
= __alignof__(struct nft_userdata
),
4597 [NFT_SET_EXT_KEY_END
] = {
4598 .align
= __alignof__(u32
),
4606 static const struct nla_policy nft_set_elem_policy
[NFTA_SET_ELEM_MAX
+ 1] = {
4607 [NFTA_SET_ELEM_KEY
] = { .type
= NLA_NESTED
},
4608 [NFTA_SET_ELEM_DATA
] = { .type
= NLA_NESTED
},
4609 [NFTA_SET_ELEM_FLAGS
] = { .type
= NLA_U32
},
4610 [NFTA_SET_ELEM_TIMEOUT
] = { .type
= NLA_U64
},
4611 [NFTA_SET_ELEM_EXPIRATION
] = { .type
= NLA_U64
},
4612 [NFTA_SET_ELEM_USERDATA
] = { .type
= NLA_BINARY
,
4613 .len
= NFT_USERDATA_MAXLEN
},
4614 [NFTA_SET_ELEM_EXPR
] = { .type
= NLA_NESTED
},
4615 [NFTA_SET_ELEM_OBJREF
] = { .type
= NLA_STRING
,
4616 .len
= NFT_OBJ_MAXNAMELEN
- 1 },
4617 [NFTA_SET_ELEM_KEY_END
] = { .type
= NLA_NESTED
},
4618 [NFTA_SET_ELEM_EXPRESSIONS
] = { .type
= NLA_NESTED
},
4621 static const struct nla_policy nft_set_elem_list_policy
[NFTA_SET_ELEM_LIST_MAX
+ 1] = {
4622 [NFTA_SET_ELEM_LIST_TABLE
] = { .type
= NLA_STRING
,
4623 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
4624 [NFTA_SET_ELEM_LIST_SET
] = { .type
= NLA_STRING
,
4625 .len
= NFT_SET_MAXNAMELEN
- 1 },
4626 [NFTA_SET_ELEM_LIST_ELEMENTS
] = { .type
= NLA_NESTED
},
4627 [NFTA_SET_ELEM_LIST_SET_ID
] = { .type
= NLA_U32
},
4630 static int nft_ctx_init_from_elemattr(struct nft_ctx
*ctx
, struct net
*net
,
4631 const struct sk_buff
*skb
,
4632 const struct nlmsghdr
*nlh
,
4633 const struct nlattr
* const nla
[],
4634 struct netlink_ext_ack
*extack
,
4635 u8 genmask
, u32 nlpid
)
4637 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
4638 int family
= nfmsg
->nfgen_family
;
4639 struct nft_table
*table
;
4641 table
= nft_table_lookup(net
, nla
[NFTA_SET_ELEM_LIST_TABLE
], family
,
4643 if (IS_ERR(table
)) {
4644 NL_SET_BAD_ATTR(extack
, nla
[NFTA_SET_ELEM_LIST_TABLE
]);
4645 return PTR_ERR(table
);
4648 nft_ctx_init(ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
4652 static int nft_set_elem_expr_dump(struct sk_buff
*skb
,
4653 const struct nft_set
*set
,
4654 const struct nft_set_ext
*ext
)
4656 struct nft_set_elem_expr
*elem_expr
;
4657 u32 size
, num_exprs
= 0;
4658 struct nft_expr
*expr
;
4659 struct nlattr
*nest
;
4661 elem_expr
= nft_set_ext_expr(ext
);
4662 nft_setelem_expr_foreach(expr
, elem_expr
, size
)
4665 if (num_exprs
== 1) {
4666 expr
= nft_setelem_expr_at(elem_expr
, 0);
4667 if (nft_expr_dump(skb
, NFTA_SET_ELEM_EXPR
, expr
) < 0)
4671 } else if (num_exprs
> 1) {
4672 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_EXPRESSIONS
);
4674 goto nla_put_failure
;
4676 nft_setelem_expr_foreach(expr
, elem_expr
, size
) {
4677 expr
= nft_setelem_expr_at(elem_expr
, size
);
4678 if (nft_expr_dump(skb
, NFTA_LIST_ELEM
, expr
) < 0)
4679 goto nla_put_failure
;
4681 nla_nest_end(skb
, nest
);
4689 static int nf_tables_fill_setelem(struct sk_buff
*skb
,
4690 const struct nft_set
*set
,
4691 const struct nft_set_elem
*elem
)
4693 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
4694 unsigned char *b
= skb_tail_pointer(skb
);
4695 struct nlattr
*nest
;
4697 nest
= nla_nest_start_noflag(skb
, NFTA_LIST_ELEM
);
4699 goto nla_put_failure
;
4701 if (nft_data_dump(skb
, NFTA_SET_ELEM_KEY
, nft_set_ext_key(ext
),
4702 NFT_DATA_VALUE
, set
->klen
) < 0)
4703 goto nla_put_failure
;
4705 if (nft_set_ext_exists(ext
, NFT_SET_EXT_KEY_END
) &&
4706 nft_data_dump(skb
, NFTA_SET_ELEM_KEY_END
, nft_set_ext_key_end(ext
),
4707 NFT_DATA_VALUE
, set
->klen
) < 0)
4708 goto nla_put_failure
;
4710 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
4711 nft_data_dump(skb
, NFTA_SET_ELEM_DATA
, nft_set_ext_data(ext
),
4712 set
->dtype
== NFT_DATA_VERDICT
? NFT_DATA_VERDICT
: NFT_DATA_VALUE
,
4714 goto nla_put_failure
;
4716 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
) &&
4717 nft_set_elem_expr_dump(skb
, set
, ext
))
4718 goto nla_put_failure
;
4720 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
4721 nla_put_string(skb
, NFTA_SET_ELEM_OBJREF
,
4722 (*nft_set_ext_obj(ext
))->key
.name
) < 0)
4723 goto nla_put_failure
;
4725 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
4726 nla_put_be32(skb
, NFTA_SET_ELEM_FLAGS
,
4727 htonl(*nft_set_ext_flags(ext
))))
4728 goto nla_put_failure
;
4730 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
) &&
4731 nla_put_be64(skb
, NFTA_SET_ELEM_TIMEOUT
,
4732 nf_jiffies64_to_msecs(*nft_set_ext_timeout(ext
)),
4734 goto nla_put_failure
;
4736 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
)) {
4737 u64 expires
, now
= get_jiffies_64();
4739 expires
= *nft_set_ext_expiration(ext
);
4740 if (time_before64(now
, expires
))
4745 if (nla_put_be64(skb
, NFTA_SET_ELEM_EXPIRATION
,
4746 nf_jiffies64_to_msecs(expires
),
4748 goto nla_put_failure
;
4751 if (nft_set_ext_exists(ext
, NFT_SET_EXT_USERDATA
)) {
4752 struct nft_userdata
*udata
;
4754 udata
= nft_set_ext_userdata(ext
);
4755 if (nla_put(skb
, NFTA_SET_ELEM_USERDATA
,
4756 udata
->len
+ 1, udata
->data
))
4757 goto nla_put_failure
;
4760 nla_nest_end(skb
, nest
);
4768 struct nft_set_dump_args
{
4769 const struct netlink_callback
*cb
;
4770 struct nft_set_iter iter
;
4771 struct sk_buff
*skb
;
4774 static int nf_tables_dump_setelem(const struct nft_ctx
*ctx
,
4775 struct nft_set
*set
,
4776 const struct nft_set_iter
*iter
,
4777 struct nft_set_elem
*elem
)
4779 struct nft_set_dump_args
*args
;
4781 args
= container_of(iter
, struct nft_set_dump_args
, iter
);
4782 return nf_tables_fill_setelem(args
->skb
, set
, elem
);
4785 struct nft_set_dump_ctx
{
4786 const struct nft_set
*set
;
4790 static int nf_tables_dump_set(struct sk_buff
*skb
, struct netlink_callback
*cb
)
4792 struct nft_set_dump_ctx
*dump_ctx
= cb
->data
;
4793 struct net
*net
= sock_net(skb
->sk
);
4794 struct nft_table
*table
;
4795 struct nft_set
*set
;
4796 struct nft_set_dump_args args
;
4797 bool set_found
= false;
4798 struct nfgenmsg
*nfmsg
;
4799 struct nlmsghdr
*nlh
;
4800 struct nlattr
*nest
;
4805 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
4806 if (dump_ctx
->ctx
.family
!= NFPROTO_UNSPEC
&&
4807 dump_ctx
->ctx
.family
!= table
->family
)
4810 if (table
!= dump_ctx
->ctx
.table
)
4813 list_for_each_entry_rcu(set
, &table
->sets
, list
) {
4814 if (set
== dump_ctx
->set
) {
4827 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWSETELEM
);
4828 portid
= NETLINK_CB(cb
->skb
).portid
;
4829 seq
= cb
->nlh
->nlmsg_seq
;
4831 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
4834 goto nla_put_failure
;
4836 nfmsg
= nlmsg_data(nlh
);
4837 nfmsg
->nfgen_family
= table
->family
;
4838 nfmsg
->version
= NFNETLINK_V0
;
4839 nfmsg
->res_id
= nft_base_seq(net
);
4841 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_TABLE
, table
->name
))
4842 goto nla_put_failure
;
4843 if (nla_put_string(skb
, NFTA_SET_ELEM_LIST_SET
, set
->name
))
4844 goto nla_put_failure
;
4846 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
4848 goto nla_put_failure
;
4852 args
.iter
.genmask
= nft_genmask_cur(net
);
4853 args
.iter
.skip
= cb
->args
[0];
4854 args
.iter
.count
= 0;
4856 args
.iter
.fn
= nf_tables_dump_setelem
;
4857 set
->ops
->walk(&dump_ctx
->ctx
, set
, &args
.iter
);
4860 nla_nest_end(skb
, nest
);
4861 nlmsg_end(skb
, nlh
);
4863 if (args
.iter
.err
&& args
.iter
.err
!= -EMSGSIZE
)
4864 return args
.iter
.err
;
4865 if (args
.iter
.count
== cb
->args
[0])
4868 cb
->args
[0] = args
.iter
.count
;
4876 static int nf_tables_dump_set_start(struct netlink_callback
*cb
)
4878 struct nft_set_dump_ctx
*dump_ctx
= cb
->data
;
4880 cb
->data
= kmemdup(dump_ctx
, sizeof(*dump_ctx
), GFP_ATOMIC
);
4882 return cb
->data
? 0 : -ENOMEM
;
4885 static int nf_tables_dump_set_done(struct netlink_callback
*cb
)
4891 static int nf_tables_fill_setelem_info(struct sk_buff
*skb
,
4892 const struct nft_ctx
*ctx
, u32 seq
,
4893 u32 portid
, int event
, u16 flags
,
4894 const struct nft_set
*set
,
4895 const struct nft_set_elem
*elem
)
4897 struct nfgenmsg
*nfmsg
;
4898 struct nlmsghdr
*nlh
;
4899 struct nlattr
*nest
;
4902 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
4903 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
),
4906 goto nla_put_failure
;
4908 nfmsg
= nlmsg_data(nlh
);
4909 nfmsg
->nfgen_family
= ctx
->family
;
4910 nfmsg
->version
= NFNETLINK_V0
;
4911 nfmsg
->res_id
= nft_base_seq(ctx
->net
);
4913 if (nla_put_string(skb
, NFTA_SET_TABLE
, ctx
->table
->name
))
4914 goto nla_put_failure
;
4915 if (nla_put_string(skb
, NFTA_SET_NAME
, set
->name
))
4916 goto nla_put_failure
;
4918 nest
= nla_nest_start_noflag(skb
, NFTA_SET_ELEM_LIST_ELEMENTS
);
4920 goto nla_put_failure
;
4922 err
= nf_tables_fill_setelem(skb
, set
, elem
);
4924 goto nla_put_failure
;
4926 nla_nest_end(skb
, nest
);
4928 nlmsg_end(skb
, nlh
);
4932 nlmsg_trim(skb
, nlh
);
4936 static int nft_setelem_parse_flags(const struct nft_set
*set
,
4937 const struct nlattr
*attr
, u32
*flags
)
4942 *flags
= ntohl(nla_get_be32(attr
));
4943 if (*flags
& ~NFT_SET_ELEM_INTERVAL_END
)
4945 if (!(set
->flags
& NFT_SET_INTERVAL
) &&
4946 *flags
& NFT_SET_ELEM_INTERVAL_END
)
4952 static int nft_setelem_parse_key(struct nft_ctx
*ctx
, struct nft_set
*set
,
4953 struct nft_data
*key
, struct nlattr
*attr
)
4955 struct nft_data_desc desc
;
4958 err
= nft_data_init(ctx
, key
, NFT_DATA_VALUE_MAXLEN
, &desc
, attr
);
4962 if (desc
.type
!= NFT_DATA_VALUE
|| desc
.len
!= set
->klen
) {
4963 nft_data_release(key
, desc
.type
);
4970 static int nft_setelem_parse_data(struct nft_ctx
*ctx
, struct nft_set
*set
,
4971 struct nft_data_desc
*desc
,
4972 struct nft_data
*data
,
4973 struct nlattr
*attr
)
4977 err
= nft_data_init(ctx
, data
, NFT_DATA_VALUE_MAXLEN
, desc
, attr
);
4981 if (desc
->type
!= NFT_DATA_VERDICT
&& desc
->len
!= set
->dlen
) {
4982 nft_data_release(data
, desc
->type
);
4989 static int nft_get_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
4990 const struct nlattr
*attr
)
4992 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
4993 struct nft_set_elem elem
;
4994 struct sk_buff
*skb
;
4999 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
5000 nft_set_elem_policy
, NULL
);
5004 if (!nla
[NFTA_SET_ELEM_KEY
])
5007 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5011 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5012 nla
[NFTA_SET_ELEM_KEY
]);
5016 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5017 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5018 nla
[NFTA_SET_ELEM_KEY_END
]);
5023 priv
= set
->ops
->get(ctx
->net
, set
, &elem
, flags
);
5025 return PTR_ERR(priv
);
5030 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_ATOMIC
);
5034 err
= nf_tables_fill_setelem_info(skb
, ctx
, ctx
->seq
, ctx
->portid
,
5035 NFT_MSG_NEWSETELEM
, 0, set
, &elem
);
5037 goto err_fill_setelem
;
5039 return nfnetlink_unicast(skb
, ctx
->net
, ctx
->portid
);
5046 /* called with rcu_read_lock held */
5047 static int nf_tables_getsetelem(struct net
*net
, struct sock
*nlsk
,
5048 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5049 const struct nlattr
* const nla
[],
5050 struct netlink_ext_ack
*extack
)
5052 u8 genmask
= nft_genmask_cur(net
);
5053 struct nft_set
*set
;
5054 struct nlattr
*attr
;
5058 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5059 genmask
, NETLINK_CB(skb
).portid
);
5063 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
], genmask
);
5065 return PTR_ERR(set
);
5067 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
5068 struct netlink_dump_control c
= {
5069 .start
= nf_tables_dump_set_start
,
5070 .dump
= nf_tables_dump_set
,
5071 .done
= nf_tables_dump_set_done
,
5072 .module
= THIS_MODULE
,
5074 struct nft_set_dump_ctx dump_ctx
= {
5080 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
5083 if (!nla
[NFTA_SET_ELEM_LIST_ELEMENTS
])
5086 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5087 err
= nft_get_set_elem(&ctx
, set
, attr
);
5095 static void nf_tables_setelem_notify(const struct nft_ctx
*ctx
,
5096 const struct nft_set
*set
,
5097 const struct nft_set_elem
*elem
,
5098 int event
, u16 flags
)
5100 struct net
*net
= ctx
->net
;
5101 u32 portid
= ctx
->portid
;
5102 struct sk_buff
*skb
;
5105 if (!ctx
->report
&& !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
5108 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
5112 err
= nf_tables_fill_setelem_info(skb
, ctx
, 0, portid
, event
, flags
,
5119 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
5122 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
5125 static struct nft_trans
*nft_trans_elem_alloc(struct nft_ctx
*ctx
,
5127 struct nft_set
*set
)
5129 struct nft_trans
*trans
;
5131 trans
= nft_trans_alloc(ctx
, msg_type
, sizeof(struct nft_trans_elem
));
5135 nft_trans_elem_set(trans
) = set
;
5139 struct nft_expr
*nft_set_elem_expr_alloc(const struct nft_ctx
*ctx
,
5140 const struct nft_set
*set
,
5141 const struct nlattr
*attr
)
5143 struct nft_expr
*expr
;
5146 expr
= nft_expr_init(ctx
, attr
);
5151 if (!(expr
->ops
->type
->flags
& NFT_EXPR_STATEFUL
))
5152 goto err_set_elem_expr
;
5154 if (expr
->ops
->type
->flags
& NFT_EXPR_GC
) {
5155 if (set
->flags
& NFT_SET_TIMEOUT
)
5156 goto err_set_elem_expr
;
5157 if (!set
->ops
->gc_init
)
5158 goto err_set_elem_expr
;
5159 set
->ops
->gc_init(set
);
5165 nft_expr_destroy(ctx
, expr
);
5166 return ERR_PTR(err
);
5169 void *nft_set_elem_init(const struct nft_set
*set
,
5170 const struct nft_set_ext_tmpl
*tmpl
,
5171 const u32
*key
, const u32
*key_end
,
5172 const u32
*data
, u64 timeout
, u64 expiration
, gfp_t gfp
)
5174 struct nft_set_ext
*ext
;
5177 elem
= kzalloc(set
->ops
->elemsize
+ tmpl
->len
, gfp
);
5181 ext
= nft_set_elem_ext(set
, elem
);
5182 nft_set_ext_init(ext
, tmpl
);
5184 memcpy(nft_set_ext_key(ext
), key
, set
->klen
);
5185 if (nft_set_ext_exists(ext
, NFT_SET_EXT_KEY_END
))
5186 memcpy(nft_set_ext_key_end(ext
), key_end
, set
->klen
);
5187 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5188 memcpy(nft_set_ext_data(ext
), data
, set
->dlen
);
5189 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPIRATION
)) {
5190 *nft_set_ext_expiration(ext
) = get_jiffies_64() + expiration
;
5191 if (expiration
== 0)
5192 *nft_set_ext_expiration(ext
) += timeout
;
5194 if (nft_set_ext_exists(ext
, NFT_SET_EXT_TIMEOUT
))
5195 *nft_set_ext_timeout(ext
) = timeout
;
5200 static void __nft_set_elem_expr_destroy(const struct nft_ctx
*ctx
,
5201 struct nft_expr
*expr
)
5203 if (expr
->ops
->destroy_clone
) {
5204 expr
->ops
->destroy_clone(ctx
, expr
);
5205 module_put(expr
->ops
->type
->owner
);
5207 nf_tables_expr_destroy(ctx
, expr
);
5211 static void nft_set_elem_expr_destroy(const struct nft_ctx
*ctx
,
5212 struct nft_set_elem_expr
*elem_expr
)
5214 struct nft_expr
*expr
;
5217 nft_setelem_expr_foreach(expr
, elem_expr
, size
)
5218 __nft_set_elem_expr_destroy(ctx
, expr
);
5221 void nft_set_elem_destroy(const struct nft_set
*set
, void *elem
,
5224 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
5225 struct nft_ctx ctx
= {
5226 .net
= read_pnet(&set
->net
),
5227 .family
= set
->table
->family
,
5230 nft_data_release(nft_set_ext_key(ext
), NFT_DATA_VALUE
);
5231 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5232 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
5233 if (destroy_expr
&& nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
))
5234 nft_set_elem_expr_destroy(&ctx
, nft_set_ext_expr(ext
));
5236 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5237 (*nft_set_ext_obj(ext
))->use
--;
5240 EXPORT_SYMBOL_GPL(nft_set_elem_destroy
);
5242 /* Only called from commit path, nft_set_elem_deactivate() already deals with
5243 * the refcounting from the preparation phase.
5245 static void nf_tables_set_elem_destroy(const struct nft_ctx
*ctx
,
5246 const struct nft_set
*set
, void *elem
)
5248 struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
);
5250 if (nft_set_ext_exists(ext
, NFT_SET_EXT_EXPRESSIONS
))
5251 nft_set_elem_expr_destroy(ctx
, nft_set_ext_expr(ext
));
5256 int nft_set_elem_expr_clone(const struct nft_ctx
*ctx
, struct nft_set
*set
,
5257 struct nft_expr
*expr_array
[])
5259 struct nft_expr
*expr
;
5262 for (i
= 0; i
< set
->num_exprs
; i
++) {
5263 expr
= kzalloc(set
->exprs
[i
]->ops
->size
, GFP_KERNEL
);
5267 err
= nft_expr_clone(expr
, set
->exprs
[i
]);
5269 nft_expr_destroy(ctx
, expr
);
5272 expr_array
[i
] = expr
;
5278 for (k
= i
- 1; k
>= 0; k
--)
5279 nft_expr_destroy(ctx
, expr_array
[k
]);
5284 static void nft_set_elem_expr_setup(const struct nft_set_ext
*ext
, int i
,
5285 struct nft_expr
*expr_array
[])
5287 struct nft_set_elem_expr
*elem_expr
= nft_set_ext_expr(ext
);
5288 struct nft_expr
*expr
= nft_setelem_expr_at(elem_expr
, elem_expr
->size
);
5290 memcpy(expr
, expr_array
[i
], expr_array
[i
]->ops
->size
);
5291 elem_expr
->size
+= expr_array
[i
]->ops
->size
;
5292 kfree(expr_array
[i
]);
5293 expr_array
[i
] = NULL
;
5296 static int nft_add_set_elem(struct nft_ctx
*ctx
, struct nft_set
*set
,
5297 const struct nlattr
*attr
, u32 nlmsg_flags
)
5299 struct nft_expr
*expr_array
[NFT_SET_EXPR_MAX
] = {};
5300 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
5301 u8 genmask
= nft_genmask_next(ctx
->net
);
5302 u32 flags
= 0, size
= 0, num_exprs
= 0;
5303 struct nft_set_ext_tmpl tmpl
;
5304 struct nft_set_ext
*ext
, *ext2
;
5305 struct nft_set_elem elem
;
5306 struct nft_set_binding
*binding
;
5307 struct nft_object
*obj
= NULL
;
5308 struct nft_userdata
*udata
;
5309 struct nft_data_desc desc
;
5310 enum nft_registers dreg
;
5311 struct nft_trans
*trans
;
5317 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
5318 nft_set_elem_policy
, NULL
);
5322 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
5325 nft_set_ext_prepare(&tmpl
);
5327 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5331 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
5333 if (set
->flags
& NFT_SET_MAP
) {
5334 if (nla
[NFTA_SET_ELEM_DATA
] == NULL
&&
5335 !(flags
& NFT_SET_ELEM_INTERVAL_END
))
5338 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
5342 if ((flags
& NFT_SET_ELEM_INTERVAL_END
) &&
5343 (nla
[NFTA_SET_ELEM_DATA
] ||
5344 nla
[NFTA_SET_ELEM_OBJREF
] ||
5345 nla
[NFTA_SET_ELEM_TIMEOUT
] ||
5346 nla
[NFTA_SET_ELEM_EXPIRATION
] ||
5347 nla
[NFTA_SET_ELEM_USERDATA
] ||
5348 nla
[NFTA_SET_ELEM_EXPR
] ||
5349 nla
[NFTA_SET_ELEM_EXPRESSIONS
]))
5353 if (nla
[NFTA_SET_ELEM_TIMEOUT
] != NULL
) {
5354 if (!(set
->flags
& NFT_SET_TIMEOUT
))
5356 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_ELEM_TIMEOUT
],
5360 } else if (set
->flags
& NFT_SET_TIMEOUT
) {
5361 timeout
= set
->timeout
;
5365 if (nla
[NFTA_SET_ELEM_EXPIRATION
] != NULL
) {
5366 if (!(set
->flags
& NFT_SET_TIMEOUT
))
5368 err
= nf_msecs_to_jiffies64(nla
[NFTA_SET_ELEM_EXPIRATION
],
5374 if (nla
[NFTA_SET_ELEM_EXPR
]) {
5375 struct nft_expr
*expr
;
5377 if (set
->num_exprs
&& set
->num_exprs
!= 1)
5380 expr
= nft_set_elem_expr_alloc(ctx
, set
,
5381 nla
[NFTA_SET_ELEM_EXPR
]);
5383 return PTR_ERR(expr
);
5385 expr_array
[0] = expr
;
5388 if (set
->num_exprs
&& set
->exprs
[0]->ops
!= expr
->ops
) {
5390 goto err_set_elem_expr
;
5392 } else if (nla
[NFTA_SET_ELEM_EXPRESSIONS
]) {
5393 struct nft_expr
*expr
;
5398 nla_for_each_nested(tmp
, nla
[NFTA_SET_ELEM_EXPRESSIONS
], left
) {
5399 if (i
== NFT_SET_EXPR_MAX
||
5400 (set
->num_exprs
&& set
->num_exprs
== i
)) {
5402 goto err_set_elem_expr
;
5404 if (nla_type(tmp
) != NFTA_LIST_ELEM
) {
5406 goto err_set_elem_expr
;
5408 expr
= nft_set_elem_expr_alloc(ctx
, set
, tmp
);
5410 err
= PTR_ERR(expr
);
5411 goto err_set_elem_expr
;
5413 expr_array
[i
] = expr
;
5416 if (set
->num_exprs
&& expr
->ops
!= set
->exprs
[i
]->ops
) {
5418 goto err_set_elem_expr
;
5422 if (set
->num_exprs
&& set
->num_exprs
!= i
) {
5424 goto err_set_elem_expr
;
5426 } else if (set
->num_exprs
> 0) {
5427 err
= nft_set_elem_expr_clone(ctx
, set
, expr_array
);
5429 goto err_set_elem_expr_clone
;
5431 num_exprs
= set
->num_exprs
;
5434 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5435 nla
[NFTA_SET_ELEM_KEY
]);
5437 goto err_set_elem_expr
;
5439 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, set
->klen
);
5441 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5442 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5443 nla
[NFTA_SET_ELEM_KEY_END
]);
5447 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY_END
, set
->klen
);
5451 nft_set_ext_add(&tmpl
, NFT_SET_EXT_EXPIRATION
);
5452 if (timeout
!= set
->timeout
)
5453 nft_set_ext_add(&tmpl
, NFT_SET_EXT_TIMEOUT
);
5457 for (i
= 0; i
< num_exprs
; i
++)
5458 size
+= expr_array
[i
]->ops
->size
;
5460 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_EXPRESSIONS
,
5461 sizeof(struct nft_set_elem_expr
) +
5465 if (nla
[NFTA_SET_ELEM_OBJREF
] != NULL
) {
5466 if (!(set
->flags
& NFT_SET_OBJECT
)) {
5468 goto err_parse_key_end
;
5470 obj
= nft_obj_lookup(ctx
->net
, ctx
->table
,
5471 nla
[NFTA_SET_ELEM_OBJREF
],
5472 set
->objtype
, genmask
);
5475 goto err_parse_key_end
;
5477 nft_set_ext_add(&tmpl
, NFT_SET_EXT_OBJREF
);
5480 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
) {
5481 err
= nft_setelem_parse_data(ctx
, set
, &desc
, &elem
.data
.val
,
5482 nla
[NFTA_SET_ELEM_DATA
]);
5484 goto err_parse_key_end
;
5486 dreg
= nft_type_to_reg(set
->dtype
);
5487 list_for_each_entry(binding
, &set
->bindings
, list
) {
5488 struct nft_ctx bind_ctx
= {
5490 .family
= ctx
->family
,
5491 .table
= ctx
->table
,
5492 .chain
= (struct nft_chain
*)binding
->chain
,
5495 if (!(binding
->flags
& NFT_SET_MAP
))
5498 err
= nft_validate_register_store(&bind_ctx
, dreg
,
5500 desc
.type
, desc
.len
);
5502 goto err_parse_data
;
5504 if (desc
.type
== NFT_DATA_VERDICT
&&
5505 (elem
.data
.val
.verdict
.code
== NFT_GOTO
||
5506 elem
.data
.val
.verdict
.code
== NFT_JUMP
))
5507 nft_validate_state_update(ctx
->net
,
5511 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_DATA
, desc
.len
);
5514 /* The full maximum length of userdata can exceed the maximum
5515 * offset value (U8_MAX) for following extensions, therefor it
5516 * must be the last extension added.
5519 if (nla
[NFTA_SET_ELEM_USERDATA
] != NULL
) {
5520 ulen
= nla_len(nla
[NFTA_SET_ELEM_USERDATA
]);
5522 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_USERDATA
,
5527 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
,
5528 elem
.key_end
.val
.data
, elem
.data
.val
.data
,
5529 timeout
, expiration
, GFP_KERNEL
);
5530 if (elem
.priv
== NULL
)
5531 goto err_parse_data
;
5533 ext
= nft_set_elem_ext(set
, elem
.priv
);
5535 *nft_set_ext_flags(ext
) = flags
;
5537 udata
= nft_set_ext_userdata(ext
);
5538 udata
->len
= ulen
- 1;
5539 nla_memcpy(&udata
->data
, nla
[NFTA_SET_ELEM_USERDATA
], ulen
);
5542 *nft_set_ext_obj(ext
) = obj
;
5545 for (i
= 0; i
< num_exprs
; i
++)
5546 nft_set_elem_expr_setup(ext
, i
, expr_array
);
5548 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_NEWSETELEM
, set
);
5552 ext
->genmask
= nft_genmask_cur(ctx
->net
) | NFT_SET_ELEM_BUSY_MASK
;
5553 err
= set
->ops
->insert(ctx
->net
, set
, &elem
, &ext2
);
5555 if (err
== -EEXIST
) {
5556 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) ^
5557 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) ||
5558 nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) ^
5559 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
))
5560 goto err_element_clash
;
5561 if ((nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
) &&
5562 nft_set_ext_exists(ext2
, NFT_SET_EXT_DATA
) &&
5563 memcmp(nft_set_ext_data(ext
),
5564 nft_set_ext_data(ext2
), set
->dlen
) != 0) ||
5565 (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
) &&
5566 nft_set_ext_exists(ext2
, NFT_SET_EXT_OBJREF
) &&
5567 *nft_set_ext_obj(ext
) != *nft_set_ext_obj(ext2
)))
5568 goto err_element_clash
;
5569 else if (!(nlmsg_flags
& NLM_F_EXCL
))
5571 } else if (err
== -ENOTEMPTY
) {
5572 /* ENOTEMPTY reports overlapping between this element
5573 * and an existing one.
5577 goto err_element_clash
;
5581 !atomic_add_unless(&set
->nelems
, 1, set
->size
+ set
->ndeact
)) {
5586 nft_trans_elem(trans
) = elem
;
5587 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5591 set
->ops
->remove(ctx
->net
, set
, &elem
);
5598 nf_tables_set_elem_destroy(ctx
, set
, elem
.priv
);
5600 if (nla
[NFTA_SET_ELEM_DATA
] != NULL
)
5601 nft_data_release(&elem
.data
.val
, desc
.type
);
5603 nft_data_release(&elem
.key_end
.val
, NFT_DATA_VALUE
);
5605 nft_data_release(&elem
.key
.val
, NFT_DATA_VALUE
);
5607 for (i
= 0; i
< num_exprs
&& expr_array
[i
]; i
++)
5608 nft_expr_destroy(ctx
, expr_array
[i
]);
5609 err_set_elem_expr_clone
:
5613 static int nf_tables_newsetelem(struct net
*net
, struct sock
*nlsk
,
5614 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5615 const struct nlattr
* const nla
[],
5616 struct netlink_ext_ack
*extack
)
5618 u8 genmask
= nft_genmask_next(net
);
5619 const struct nlattr
*attr
;
5620 struct nft_set
*set
;
5624 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
)
5627 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5628 genmask
, NETLINK_CB(skb
).portid
);
5632 set
= nft_set_lookup_global(net
, ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
],
5633 nla
[NFTA_SET_ELEM_LIST_SET_ID
], genmask
);
5635 return PTR_ERR(set
);
5637 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
5640 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5641 err
= nft_add_set_elem(&ctx
, set
, attr
, nlh
->nlmsg_flags
);
5646 if (net
->nft
.validate_state
== NFT_VALIDATE_DO
)
5647 return nft_table_validate(net
, ctx
.table
);
5653 * nft_data_hold - hold a nft_data item
5655 * @data: struct nft_data to release
5656 * @type: type of data
5658 * Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
5659 * NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
5660 * NFT_GOTO verdicts. This function must be called on active data objects
5661 * from the second phase of the commit protocol.
5663 void nft_data_hold(const struct nft_data
*data
, enum nft_data_types type
)
5665 struct nft_chain
*chain
;
5666 struct nft_rule
*rule
;
5668 if (type
== NFT_DATA_VERDICT
) {
5669 switch (data
->verdict
.code
) {
5672 chain
= data
->verdict
.chain
;
5675 if (!nft_chain_is_bound(chain
))
5678 chain
->table
->use
++;
5679 list_for_each_entry(rule
, &chain
->rules
, list
)
5682 nft_chain_add(chain
->table
, chain
);
5688 static void nft_set_elem_activate(const struct net
*net
,
5689 const struct nft_set
*set
,
5690 struct nft_set_elem
*elem
)
5692 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
5694 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5695 nft_data_hold(nft_set_ext_data(ext
), set
->dtype
);
5696 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5697 (*nft_set_ext_obj(ext
))->use
++;
5700 static void nft_set_elem_deactivate(const struct net
*net
,
5701 const struct nft_set
*set
,
5702 struct nft_set_elem
*elem
)
5704 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
5706 if (nft_set_ext_exists(ext
, NFT_SET_EXT_DATA
))
5707 nft_data_release(nft_set_ext_data(ext
), set
->dtype
);
5708 if (nft_set_ext_exists(ext
, NFT_SET_EXT_OBJREF
))
5709 (*nft_set_ext_obj(ext
))->use
--;
5712 static int nft_del_setelem(struct nft_ctx
*ctx
, struct nft_set
*set
,
5713 const struct nlattr
*attr
)
5715 struct nlattr
*nla
[NFTA_SET_ELEM_MAX
+ 1];
5716 struct nft_set_ext_tmpl tmpl
;
5717 struct nft_set_elem elem
;
5718 struct nft_set_ext
*ext
;
5719 struct nft_trans
*trans
;
5724 err
= nla_parse_nested_deprecated(nla
, NFTA_SET_ELEM_MAX
, attr
,
5725 nft_set_elem_policy
, NULL
);
5729 if (nla
[NFTA_SET_ELEM_KEY
] == NULL
)
5732 nft_set_ext_prepare(&tmpl
);
5734 err
= nft_setelem_parse_flags(set
, nla
[NFTA_SET_ELEM_FLAGS
], &flags
);
5738 nft_set_ext_add(&tmpl
, NFT_SET_EXT_FLAGS
);
5740 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key
.val
,
5741 nla
[NFTA_SET_ELEM_KEY
]);
5745 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY
, set
->klen
);
5747 if (nla
[NFTA_SET_ELEM_KEY_END
]) {
5748 err
= nft_setelem_parse_key(ctx
, set
, &elem
.key_end
.val
,
5749 nla
[NFTA_SET_ELEM_KEY_END
]);
5753 nft_set_ext_add_length(&tmpl
, NFT_SET_EXT_KEY_END
, set
->klen
);
5757 elem
.priv
= nft_set_elem_init(set
, &tmpl
, elem
.key
.val
.data
,
5758 elem
.key_end
.val
.data
, NULL
, 0, 0,
5760 if (elem
.priv
== NULL
)
5763 ext
= nft_set_elem_ext(set
, elem
.priv
);
5765 *nft_set_ext_flags(ext
) = flags
;
5767 trans
= nft_trans_elem_alloc(ctx
, NFT_MSG_DELSETELEM
, set
);
5771 priv
= set
->ops
->deactivate(ctx
->net
, set
, &elem
);
5779 nft_set_elem_deactivate(ctx
->net
, set
, &elem
);
5781 nft_trans_elem(trans
) = elem
;
5782 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5790 nft_data_release(&elem
.key
.val
, NFT_DATA_VALUE
);
5794 static int nft_flush_set(const struct nft_ctx
*ctx
,
5795 struct nft_set
*set
,
5796 const struct nft_set_iter
*iter
,
5797 struct nft_set_elem
*elem
)
5799 struct nft_trans
*trans
;
5802 trans
= nft_trans_alloc_gfp(ctx
, NFT_MSG_DELSETELEM
,
5803 sizeof(struct nft_trans_elem
), GFP_ATOMIC
);
5807 if (!set
->ops
->flush(ctx
->net
, set
, elem
->priv
)) {
5813 nft_set_elem_deactivate(ctx
->net
, set
, elem
);
5814 nft_trans_elem_set(trans
) = set
;
5815 nft_trans_elem(trans
) = *elem
;
5816 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
5824 static int nf_tables_delsetelem(struct net
*net
, struct sock
*nlsk
,
5825 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
5826 const struct nlattr
* const nla
[],
5827 struct netlink_ext_ack
*extack
)
5829 u8 genmask
= nft_genmask_next(net
);
5830 const struct nlattr
*attr
;
5831 struct nft_set
*set
;
5835 err
= nft_ctx_init_from_elemattr(&ctx
, net
, skb
, nlh
, nla
, extack
,
5836 genmask
, NETLINK_CB(skb
).portid
);
5840 set
= nft_set_lookup(ctx
.table
, nla
[NFTA_SET_ELEM_LIST_SET
], genmask
);
5842 return PTR_ERR(set
);
5843 if (!list_empty(&set
->bindings
) && set
->flags
& NFT_SET_CONSTANT
)
5846 if (nla
[NFTA_SET_ELEM_LIST_ELEMENTS
] == NULL
) {
5847 struct nft_set_iter iter
= {
5849 .fn
= nft_flush_set
,
5851 set
->ops
->walk(&ctx
, set
, &iter
);
5856 nla_for_each_nested(attr
, nla
[NFTA_SET_ELEM_LIST_ELEMENTS
], rem
) {
5857 err
= nft_del_setelem(&ctx
, set
, attr
);
5866 void nft_set_gc_batch_release(struct rcu_head
*rcu
)
5868 struct nft_set_gc_batch
*gcb
;
5871 gcb
= container_of(rcu
, struct nft_set_gc_batch
, head
.rcu
);
5872 for (i
= 0; i
< gcb
->head
.cnt
; i
++)
5873 nft_set_elem_destroy(gcb
->head
.set
, gcb
->elems
[i
], true);
5877 struct nft_set_gc_batch
*nft_set_gc_batch_alloc(const struct nft_set
*set
,
5880 struct nft_set_gc_batch
*gcb
;
5882 gcb
= kzalloc(sizeof(*gcb
), gfp
);
5885 gcb
->head
.set
= set
;
5894 * nft_register_obj- register nf_tables stateful object type
5895 * @obj_type: object type
5897 * Registers the object type for use with nf_tables. Returns zero on
5898 * success or a negative errno code otherwise.
5900 int nft_register_obj(struct nft_object_type
*obj_type
)
5902 if (obj_type
->type
== NFT_OBJECT_UNSPEC
)
5905 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
5906 list_add_rcu(&obj_type
->list
, &nf_tables_objects
);
5907 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
5910 EXPORT_SYMBOL_GPL(nft_register_obj
);
5913 * nft_unregister_obj - unregister nf_tables object type
5914 * @obj_type: object type
5916 * Unregisters the object type for use with nf_tables.
5918 void nft_unregister_obj(struct nft_object_type
*obj_type
)
5920 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
5921 list_del_rcu(&obj_type
->list
);
5922 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
5924 EXPORT_SYMBOL_GPL(nft_unregister_obj
);
5926 struct nft_object
*nft_obj_lookup(const struct net
*net
,
5927 const struct nft_table
*table
,
5928 const struct nlattr
*nla
, u32 objtype
,
5931 struct nft_object_hash_key k
= { .table
= table
};
5932 char search
[NFT_OBJ_MAXNAMELEN
];
5933 struct rhlist_head
*tmp
, *list
;
5934 struct nft_object
*obj
;
5936 nla_strscpy(search
, nla
, sizeof(search
));
5939 WARN_ON_ONCE(!rcu_read_lock_held() &&
5940 !lockdep_commit_lock_is_held(net
));
5943 list
= rhltable_lookup(&nft_objname_ht
, &k
, nft_objname_ht_params
);
5947 rhl_for_each_entry_rcu(obj
, tmp
, list
, rhlhead
) {
5948 if (objtype
== obj
->ops
->type
->type
&&
5949 nft_active_genmask(obj
, genmask
)) {
5956 return ERR_PTR(-ENOENT
);
5958 EXPORT_SYMBOL_GPL(nft_obj_lookup
);
5960 static struct nft_object
*nft_obj_lookup_byhandle(const struct nft_table
*table
,
5961 const struct nlattr
*nla
,
5962 u32 objtype
, u8 genmask
)
5964 struct nft_object
*obj
;
5966 list_for_each_entry(obj
, &table
->objects
, list
) {
5967 if (be64_to_cpu(nla_get_be64(nla
)) == obj
->handle
&&
5968 objtype
== obj
->ops
->type
->type
&&
5969 nft_active_genmask(obj
, genmask
))
5972 return ERR_PTR(-ENOENT
);
5975 static const struct nla_policy nft_obj_policy
[NFTA_OBJ_MAX
+ 1] = {
5976 [NFTA_OBJ_TABLE
] = { .type
= NLA_STRING
,
5977 .len
= NFT_TABLE_MAXNAMELEN
- 1 },
5978 [NFTA_OBJ_NAME
] = { .type
= NLA_STRING
,
5979 .len
= NFT_OBJ_MAXNAMELEN
- 1 },
5980 [NFTA_OBJ_TYPE
] = { .type
= NLA_U32
},
5981 [NFTA_OBJ_DATA
] = { .type
= NLA_NESTED
},
5982 [NFTA_OBJ_HANDLE
] = { .type
= NLA_U64
},
5983 [NFTA_OBJ_USERDATA
] = { .type
= NLA_BINARY
,
5984 .len
= NFT_USERDATA_MAXLEN
},
5987 static struct nft_object
*nft_obj_init(const struct nft_ctx
*ctx
,
5988 const struct nft_object_type
*type
,
5989 const struct nlattr
*attr
)
5992 const struct nft_object_ops
*ops
;
5993 struct nft_object
*obj
;
5996 tb
= kmalloc_array(type
->maxattr
+ 1, sizeof(*tb
), GFP_KERNEL
);
6001 err
= nla_parse_nested_deprecated(tb
, type
->maxattr
, attr
,
6002 type
->policy
, NULL
);
6006 memset(tb
, 0, sizeof(tb
[0]) * (type
->maxattr
+ 1));
6009 if (type
->select_ops
) {
6010 ops
= type
->select_ops(ctx
, (const struct nlattr
* const *)tb
);
6020 obj
= kzalloc(sizeof(*obj
) + ops
->size
, GFP_KERNEL
);
6024 err
= ops
->init(ctx
, (const struct nlattr
* const *)tb
, obj
);
6037 return ERR_PTR(err
);
6040 static int nft_object_dump(struct sk_buff
*skb
, unsigned int attr
,
6041 struct nft_object
*obj
, bool reset
)
6043 struct nlattr
*nest
;
6045 nest
= nla_nest_start_noflag(skb
, attr
);
6047 goto nla_put_failure
;
6048 if (obj
->ops
->dump(skb
, obj
, reset
) < 0)
6049 goto nla_put_failure
;
6050 nla_nest_end(skb
, nest
);
6057 static const struct nft_object_type
*__nft_obj_type_get(u32 objtype
)
6059 const struct nft_object_type
*type
;
6061 list_for_each_entry(type
, &nf_tables_objects
, list
) {
6062 if (objtype
== type
->type
)
6068 static const struct nft_object_type
*
6069 nft_obj_type_get(struct net
*net
, u32 objtype
)
6071 const struct nft_object_type
*type
;
6073 type
= __nft_obj_type_get(objtype
);
6074 if (type
!= NULL
&& try_module_get(type
->owner
))
6077 lockdep_nfnl_nft_mutex_not_held();
6078 #ifdef CONFIG_MODULES
6080 if (nft_request_module(net
, "nft-obj-%u", objtype
) == -EAGAIN
)
6081 return ERR_PTR(-EAGAIN
);
6084 return ERR_PTR(-ENOENT
);
6087 static int nf_tables_updobj(const struct nft_ctx
*ctx
,
6088 const struct nft_object_type
*type
,
6089 const struct nlattr
*attr
,
6090 struct nft_object
*obj
)
6092 struct nft_object
*newobj
;
6093 struct nft_trans
*trans
;
6096 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWOBJ
,
6097 sizeof(struct nft_trans_obj
));
6101 newobj
= nft_obj_init(ctx
, type
, attr
);
6102 if (IS_ERR(newobj
)) {
6103 err
= PTR_ERR(newobj
);
6104 goto err_free_trans
;
6107 nft_trans_obj(trans
) = obj
;
6108 nft_trans_obj_update(trans
) = true;
6109 nft_trans_obj_newobj(trans
) = newobj
;
6110 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
6119 static int nf_tables_newobj(struct net
*net
, struct sock
*nlsk
,
6120 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6121 const struct nlattr
* const nla
[],
6122 struct netlink_ext_ack
*extack
)
6124 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6125 const struct nft_object_type
*type
;
6126 u8 genmask
= nft_genmask_next(net
);
6127 int family
= nfmsg
->nfgen_family
;
6128 struct nft_table
*table
;
6129 struct nft_object
*obj
;
6134 if (!nla
[NFTA_OBJ_TYPE
] ||
6135 !nla
[NFTA_OBJ_NAME
] ||
6136 !nla
[NFTA_OBJ_DATA
])
6139 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
,
6140 NETLINK_CB(skb
).portid
);
6141 if (IS_ERR(table
)) {
6142 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6143 return PTR_ERR(table
);
6146 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6147 obj
= nft_obj_lookup(net
, table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
6150 if (err
!= -ENOENT
) {
6151 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6155 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
6156 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6159 if (nlh
->nlmsg_flags
& NLM_F_REPLACE
)
6162 type
= __nft_obj_type_get(objtype
);
6163 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6165 return nf_tables_updobj(&ctx
, type
, nla
[NFTA_OBJ_DATA
], obj
);
6168 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6170 type
= nft_obj_type_get(net
, objtype
);
6172 return PTR_ERR(type
);
6174 obj
= nft_obj_init(&ctx
, type
, nla
[NFTA_OBJ_DATA
]);
6179 obj
->key
.table
= table
;
6180 obj
->handle
= nf_tables_alloc_handle(table
);
6182 obj
->key
.name
= nla_strdup(nla
[NFTA_OBJ_NAME
], GFP_KERNEL
);
6183 if (!obj
->key
.name
) {
6188 if (nla
[NFTA_OBJ_USERDATA
]) {
6189 obj
->udata
= nla_memdup(nla
[NFTA_OBJ_USERDATA
], GFP_KERNEL
);
6190 if (obj
->udata
== NULL
)
6193 obj
->udlen
= nla_len(nla
[NFTA_OBJ_USERDATA
]);
6196 err
= nft_trans_obj_add(&ctx
, NFT_MSG_NEWOBJ
, obj
);
6200 err
= rhltable_insert(&nft_objname_ht
, &obj
->rhlhead
,
6201 nft_objname_ht_params
);
6205 list_add_tail_rcu(&obj
->list
, &table
->objects
);
6209 /* queued in transaction log */
6210 INIT_LIST_HEAD(&obj
->list
);
6213 kfree(obj
->key
.name
);
6217 if (obj
->ops
->destroy
)
6218 obj
->ops
->destroy(&ctx
, obj
);
6221 module_put(type
->owner
);
6225 static int nf_tables_fill_obj_info(struct sk_buff
*skb
, struct net
*net
,
6226 u32 portid
, u32 seq
, int event
, u32 flags
,
6227 int family
, const struct nft_table
*table
,
6228 struct nft_object
*obj
, bool reset
)
6230 struct nfgenmsg
*nfmsg
;
6231 struct nlmsghdr
*nlh
;
6233 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
6234 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
6236 goto nla_put_failure
;
6238 nfmsg
= nlmsg_data(nlh
);
6239 nfmsg
->nfgen_family
= family
;
6240 nfmsg
->version
= NFNETLINK_V0
;
6241 nfmsg
->res_id
= nft_base_seq(net
);
6243 if (nla_put_string(skb
, NFTA_OBJ_TABLE
, table
->name
) ||
6244 nla_put_string(skb
, NFTA_OBJ_NAME
, obj
->key
.name
) ||
6245 nla_put_be32(skb
, NFTA_OBJ_TYPE
, htonl(obj
->ops
->type
->type
)) ||
6246 nla_put_be32(skb
, NFTA_OBJ_USE
, htonl(obj
->use
)) ||
6247 nft_object_dump(skb
, NFTA_OBJ_DATA
, obj
, reset
) ||
6248 nla_put_be64(skb
, NFTA_OBJ_HANDLE
, cpu_to_be64(obj
->handle
),
6250 goto nla_put_failure
;
6253 nla_put(skb
, NFTA_OBJ_USERDATA
, obj
->udlen
, obj
->udata
))
6254 goto nla_put_failure
;
6256 nlmsg_end(skb
, nlh
);
6260 nlmsg_trim(skb
, nlh
);
6264 struct nft_obj_filter
{
6269 static int nf_tables_dump_obj(struct sk_buff
*skb
, struct netlink_callback
*cb
)
6271 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
6272 const struct nft_table
*table
;
6273 unsigned int idx
= 0, s_idx
= cb
->args
[0];
6274 struct nft_obj_filter
*filter
= cb
->data
;
6275 struct net
*net
= sock_net(skb
->sk
);
6276 int family
= nfmsg
->nfgen_family
;
6277 struct nft_object
*obj
;
6280 if (NFNL_MSG_TYPE(cb
->nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
6284 cb
->seq
= net
->nft
.base_seq
;
6286 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
6287 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
6290 list_for_each_entry_rcu(obj
, &table
->objects
, list
) {
6291 if (!nft_is_active(net
, obj
))
6296 memset(&cb
->args
[1], 0,
6297 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
6298 if (filter
&& filter
->table
&&
6299 strcmp(filter
->table
, table
->name
))
6302 filter
->type
!= NFT_OBJECT_UNSPEC
&&
6303 obj
->ops
->type
->type
!= filter
->type
)
6306 char *buf
= kasprintf(GFP_ATOMIC
,
6311 audit_log_nfcfg(buf
,
6314 AUDIT_NFT_OP_OBJ_RESET
,
6319 if (nf_tables_fill_obj_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
6322 NLM_F_MULTI
| NLM_F_APPEND
,
6323 table
->family
, table
,
6327 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
6339 static int nf_tables_dump_obj_start(struct netlink_callback
*cb
)
6341 const struct nlattr
* const *nla
= cb
->data
;
6342 struct nft_obj_filter
*filter
= NULL
;
6344 if (nla
[NFTA_OBJ_TABLE
] || nla
[NFTA_OBJ_TYPE
]) {
6345 filter
= kzalloc(sizeof(*filter
), GFP_ATOMIC
);
6349 if (nla
[NFTA_OBJ_TABLE
]) {
6350 filter
->table
= nla_strdup(nla
[NFTA_OBJ_TABLE
], GFP_ATOMIC
);
6351 if (!filter
->table
) {
6357 if (nla
[NFTA_OBJ_TYPE
])
6358 filter
->type
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6365 static int nf_tables_dump_obj_done(struct netlink_callback
*cb
)
6367 struct nft_obj_filter
*filter
= cb
->data
;
6370 kfree(filter
->table
);
6377 /* called with rcu_read_lock held */
6378 static int nf_tables_getobj(struct net
*net
, struct sock
*nlsk
,
6379 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6380 const struct nlattr
* const nla
[],
6381 struct netlink_ext_ack
*extack
)
6383 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6384 u8 genmask
= nft_genmask_cur(net
);
6385 int family
= nfmsg
->nfgen_family
;
6386 const struct nft_table
*table
;
6387 struct nft_object
*obj
;
6388 struct sk_buff
*skb2
;
6393 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
6394 struct netlink_dump_control c
= {
6395 .start
= nf_tables_dump_obj_start
,
6396 .dump
= nf_tables_dump_obj
,
6397 .done
= nf_tables_dump_obj_done
,
6398 .module
= THIS_MODULE
,
6399 .data
= (void *)nla
,
6402 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
6405 if (!nla
[NFTA_OBJ_NAME
] ||
6406 !nla
[NFTA_OBJ_TYPE
])
6409 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
, 0);
6410 if (IS_ERR(table
)) {
6411 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6412 return PTR_ERR(table
);
6415 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6416 obj
= nft_obj_lookup(net
, table
, nla
[NFTA_OBJ_NAME
], objtype
, genmask
);
6418 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_NAME
]);
6419 return PTR_ERR(obj
);
6422 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
6426 if (NFNL_MSG_TYPE(nlh
->nlmsg_type
) == NFT_MSG_GETOBJ_RESET
)
6430 char *buf
= kasprintf(GFP_ATOMIC
, "%s:%u",
6431 table
->name
, net
->nft
.base_seq
);
6433 audit_log_nfcfg(buf
,
6436 AUDIT_NFT_OP_OBJ_RESET
,
6441 err
= nf_tables_fill_obj_info(skb2
, net
, NETLINK_CB(skb
).portid
,
6442 nlh
->nlmsg_seq
, NFT_MSG_NEWOBJ
, 0,
6443 family
, table
, obj
, reset
);
6445 goto err_fill_obj_info
;
6447 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
6454 static void nft_obj_destroy(const struct nft_ctx
*ctx
, struct nft_object
*obj
)
6456 if (obj
->ops
->destroy
)
6457 obj
->ops
->destroy(ctx
, obj
);
6459 module_put(obj
->ops
->type
->owner
);
6460 kfree(obj
->key
.name
);
6465 static int nf_tables_delobj(struct net
*net
, struct sock
*nlsk
,
6466 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
6467 const struct nlattr
* const nla
[],
6468 struct netlink_ext_ack
*extack
)
6470 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6471 u8 genmask
= nft_genmask_next(net
);
6472 int family
= nfmsg
->nfgen_family
;
6473 const struct nlattr
*attr
;
6474 struct nft_table
*table
;
6475 struct nft_object
*obj
;
6479 if (!nla
[NFTA_OBJ_TYPE
] ||
6480 (!nla
[NFTA_OBJ_NAME
] && !nla
[NFTA_OBJ_HANDLE
]))
6483 table
= nft_table_lookup(net
, nla
[NFTA_OBJ_TABLE
], family
, genmask
,
6484 NETLINK_CB(skb
).portid
);
6485 if (IS_ERR(table
)) {
6486 NL_SET_BAD_ATTR(extack
, nla
[NFTA_OBJ_TABLE
]);
6487 return PTR_ERR(table
);
6490 objtype
= ntohl(nla_get_be32(nla
[NFTA_OBJ_TYPE
]));
6491 if (nla
[NFTA_OBJ_HANDLE
]) {
6492 attr
= nla
[NFTA_OBJ_HANDLE
];
6493 obj
= nft_obj_lookup_byhandle(table
, attr
, objtype
, genmask
);
6495 attr
= nla
[NFTA_OBJ_NAME
];
6496 obj
= nft_obj_lookup(net
, table
, attr
, objtype
, genmask
);
6500 NL_SET_BAD_ATTR(extack
, attr
);
6501 return PTR_ERR(obj
);
6504 NL_SET_BAD_ATTR(extack
, attr
);
6508 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6510 return nft_delobj(&ctx
, obj
);
6513 void nft_obj_notify(struct net
*net
, const struct nft_table
*table
,
6514 struct nft_object
*obj
, u32 portid
, u32 seq
, int event
,
6515 int family
, int report
, gfp_t gfp
)
6517 struct sk_buff
*skb
;
6519 char *buf
= kasprintf(gfp
, "%s:%u",
6520 table
->name
, net
->nft
.base_seq
);
6522 audit_log_nfcfg(buf
,
6525 event
== NFT_MSG_NEWOBJ
?
6526 AUDIT_NFT_OP_OBJ_REGISTER
:
6527 AUDIT_NFT_OP_OBJ_UNREGISTER
,
6532 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
6535 skb
= nlmsg_new(NLMSG_GOODSIZE
, gfp
);
6539 err
= nf_tables_fill_obj_info(skb
, net
, portid
, seq
, event
, 0, family
,
6546 nft_notify_enqueue(skb
, report
, &net
->nft
.notify_list
);
6549 nfnetlink_set_err(net
, portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
6551 EXPORT_SYMBOL_GPL(nft_obj_notify
);
6553 static void nf_tables_obj_notify(const struct nft_ctx
*ctx
,
6554 struct nft_object
*obj
, int event
)
6556 nft_obj_notify(ctx
->net
, ctx
->table
, obj
, ctx
->portid
, ctx
->seq
, event
,
6557 ctx
->family
, ctx
->report
, GFP_KERNEL
);
6563 void nft_register_flowtable_type(struct nf_flowtable_type
*type
)
6565 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
6566 list_add_tail_rcu(&type
->list
, &nf_tables_flowtables
);
6567 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
6569 EXPORT_SYMBOL_GPL(nft_register_flowtable_type
);
6571 void nft_unregister_flowtable_type(struct nf_flowtable_type
*type
)
6573 nfnl_lock(NFNL_SUBSYS_NFTABLES
);
6574 list_del_rcu(&type
->list
);
6575 nfnl_unlock(NFNL_SUBSYS_NFTABLES
);
6577 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type
);
6579 static const struct nla_policy nft_flowtable_policy
[NFTA_FLOWTABLE_MAX
+ 1] = {
6580 [NFTA_FLOWTABLE_TABLE
] = { .type
= NLA_STRING
,
6581 .len
= NFT_NAME_MAXLEN
- 1 },
6582 [NFTA_FLOWTABLE_NAME
] = { .type
= NLA_STRING
,
6583 .len
= NFT_NAME_MAXLEN
- 1 },
6584 [NFTA_FLOWTABLE_HOOK
] = { .type
= NLA_NESTED
},
6585 [NFTA_FLOWTABLE_HANDLE
] = { .type
= NLA_U64
},
6586 [NFTA_FLOWTABLE_FLAGS
] = { .type
= NLA_U32
},
6589 struct nft_flowtable
*nft_flowtable_lookup(const struct nft_table
*table
,
6590 const struct nlattr
*nla
, u8 genmask
)
6592 struct nft_flowtable
*flowtable
;
6594 list_for_each_entry_rcu(flowtable
, &table
->flowtables
, list
) {
6595 if (!nla_strcmp(nla
, flowtable
->name
) &&
6596 nft_active_genmask(flowtable
, genmask
))
6599 return ERR_PTR(-ENOENT
);
6601 EXPORT_SYMBOL_GPL(nft_flowtable_lookup
);
6603 void nf_tables_deactivate_flowtable(const struct nft_ctx
*ctx
,
6604 struct nft_flowtable
*flowtable
,
6605 enum nft_trans_phase phase
)
6608 case NFT_TRANS_PREPARE
:
6609 case NFT_TRANS_ABORT
:
6610 case NFT_TRANS_RELEASE
:
6617 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable
);
6619 static struct nft_flowtable
*
6620 nft_flowtable_lookup_byhandle(const struct nft_table
*table
,
6621 const struct nlattr
*nla
, u8 genmask
)
6623 struct nft_flowtable
*flowtable
;
6625 list_for_each_entry(flowtable
, &table
->flowtables
, list
) {
6626 if (be64_to_cpu(nla_get_be64(nla
)) == flowtable
->handle
&&
6627 nft_active_genmask(flowtable
, genmask
))
6630 return ERR_PTR(-ENOENT
);
6633 struct nft_flowtable_hook
{
6636 struct list_head list
;
6639 static const struct nla_policy nft_flowtable_hook_policy
[NFTA_FLOWTABLE_HOOK_MAX
+ 1] = {
6640 [NFTA_FLOWTABLE_HOOK_NUM
] = { .type
= NLA_U32
},
6641 [NFTA_FLOWTABLE_HOOK_PRIORITY
] = { .type
= NLA_U32
},
6642 [NFTA_FLOWTABLE_HOOK_DEVS
] = { .type
= NLA_NESTED
},
6645 static int nft_flowtable_parse_hook(const struct nft_ctx
*ctx
,
6646 const struct nlattr
*attr
,
6647 struct nft_flowtable_hook
*flowtable_hook
,
6648 struct nft_flowtable
*flowtable
, bool add
)
6650 struct nlattr
*tb
[NFTA_FLOWTABLE_HOOK_MAX
+ 1];
6651 struct nft_hook
*hook
;
6652 int hooknum
, priority
;
6655 INIT_LIST_HEAD(&flowtable_hook
->list
);
6657 err
= nla_parse_nested_deprecated(tb
, NFTA_FLOWTABLE_HOOK_MAX
, attr
,
6658 nft_flowtable_hook_policy
, NULL
);
6663 if (!tb
[NFTA_FLOWTABLE_HOOK_NUM
] ||
6664 !tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
])
6667 hooknum
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_NUM
]));
6668 if (hooknum
!= NF_NETDEV_INGRESS
)
6671 priority
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]));
6673 flowtable_hook
->priority
= priority
;
6674 flowtable_hook
->num
= hooknum
;
6676 if (tb
[NFTA_FLOWTABLE_HOOK_NUM
]) {
6677 hooknum
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_NUM
]));
6678 if (hooknum
!= flowtable
->hooknum
)
6682 if (tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]) {
6683 priority
= ntohl(nla_get_be32(tb
[NFTA_FLOWTABLE_HOOK_PRIORITY
]));
6684 if (priority
!= flowtable
->data
.priority
)
6688 flowtable_hook
->priority
= flowtable
->data
.priority
;
6689 flowtable_hook
->num
= flowtable
->hooknum
;
6692 if (tb
[NFTA_FLOWTABLE_HOOK_DEVS
]) {
6693 err
= nf_tables_parse_netdev_hooks(ctx
->net
,
6694 tb
[NFTA_FLOWTABLE_HOOK_DEVS
],
6695 &flowtable_hook
->list
);
6700 list_for_each_entry(hook
, &flowtable_hook
->list
, list
) {
6701 hook
->ops
.pf
= NFPROTO_NETDEV
;
6702 hook
->ops
.hooknum
= flowtable_hook
->num
;
6703 hook
->ops
.priority
= flowtable_hook
->priority
;
6704 hook
->ops
.priv
= &flowtable
->data
;
6705 hook
->ops
.hook
= flowtable
->data
.type
->hook
;
6711 static const struct nf_flowtable_type
*__nft_flowtable_type_get(u8 family
)
6713 const struct nf_flowtable_type
*type
;
6715 list_for_each_entry(type
, &nf_tables_flowtables
, list
) {
6716 if (family
== type
->family
)
6722 static const struct nf_flowtable_type
*
6723 nft_flowtable_type_get(struct net
*net
, u8 family
)
6725 const struct nf_flowtable_type
*type
;
6727 type
= __nft_flowtable_type_get(family
);
6728 if (type
!= NULL
&& try_module_get(type
->owner
))
6731 lockdep_nfnl_nft_mutex_not_held();
6732 #ifdef CONFIG_MODULES
6734 if (nft_request_module(net
, "nf-flowtable-%u", family
) == -EAGAIN
)
6735 return ERR_PTR(-EAGAIN
);
6738 return ERR_PTR(-ENOENT
);
6741 /* Only called from error and netdev event paths. */
6742 static void nft_unregister_flowtable_hook(struct net
*net
,
6743 struct nft_flowtable
*flowtable
,
6744 struct nft_hook
*hook
)
6746 nf_unregister_net_hook(net
, &hook
->ops
);
6747 flowtable
->data
.type
->setup(&flowtable
->data
, hook
->ops
.dev
,
6751 static void nft_unregister_flowtable_net_hooks(struct net
*net
,
6752 struct list_head
*hook_list
)
6754 struct nft_hook
*hook
;
6756 list_for_each_entry(hook
, hook_list
, list
)
6757 nf_unregister_net_hook(net
, &hook
->ops
);
6760 static int nft_register_flowtable_net_hooks(struct net
*net
,
6761 struct nft_table
*table
,
6762 struct list_head
*hook_list
,
6763 struct nft_flowtable
*flowtable
)
6765 struct nft_hook
*hook
, *hook2
, *next
;
6766 struct nft_flowtable
*ft
;
6769 list_for_each_entry(hook
, hook_list
, list
) {
6770 list_for_each_entry(ft
, &table
->flowtables
, list
) {
6771 if (!nft_is_active_next(net
, ft
))
6774 list_for_each_entry(hook2
, &ft
->hook_list
, list
) {
6775 if (hook
->ops
.dev
== hook2
->ops
.dev
&&
6776 hook
->ops
.pf
== hook2
->ops
.pf
) {
6778 goto err_unregister_net_hooks
;
6783 err
= flowtable
->data
.type
->setup(&flowtable
->data
,
6787 goto err_unregister_net_hooks
;
6789 err
= nf_register_net_hook(net
, &hook
->ops
);
6791 flowtable
->data
.type
->setup(&flowtable
->data
,
6794 goto err_unregister_net_hooks
;
6802 err_unregister_net_hooks
:
6803 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
6807 nft_unregister_flowtable_hook(net
, flowtable
, hook
);
6808 list_del_rcu(&hook
->list
);
6809 kfree_rcu(hook
, rcu
);
6815 static void nft_flowtable_hooks_destroy(struct list_head
*hook_list
)
6817 struct nft_hook
*hook
, *next
;
6819 list_for_each_entry_safe(hook
, next
, hook_list
, list
) {
6820 list_del_rcu(&hook
->list
);
6821 kfree_rcu(hook
, rcu
);
6825 static int nft_flowtable_update(struct nft_ctx
*ctx
, const struct nlmsghdr
*nlh
,
6826 struct nft_flowtable
*flowtable
)
6828 const struct nlattr
* const *nla
= ctx
->nla
;
6829 struct nft_flowtable_hook flowtable_hook
;
6830 struct nft_hook
*hook
, *next
;
6831 struct nft_trans
*trans
;
6832 bool unregister
= false;
6836 err
= nft_flowtable_parse_hook(ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
6837 &flowtable_hook
, flowtable
, false);
6841 list_for_each_entry_safe(hook
, next
, &flowtable_hook
.list
, list
) {
6842 if (nft_hook_list_find(&flowtable
->hook_list
, hook
)) {
6843 list_del(&hook
->list
);
6848 if (nla
[NFTA_FLOWTABLE_FLAGS
]) {
6849 flags
= ntohl(nla_get_be32(nla
[NFTA_FLOWTABLE_FLAGS
]));
6850 if (flags
& ~NFT_FLOWTABLE_MASK
)
6852 if ((flowtable
->data
.flags
& NFT_FLOWTABLE_HW_OFFLOAD
) ^
6853 (flags
& NFT_FLOWTABLE_HW_OFFLOAD
))
6856 flags
= flowtable
->data
.flags
;
6859 err
= nft_register_flowtable_net_hooks(ctx
->net
, ctx
->table
,
6860 &flowtable_hook
.list
, flowtable
);
6862 goto err_flowtable_update_hook
;
6864 trans
= nft_trans_alloc(ctx
, NFT_MSG_NEWFLOWTABLE
,
6865 sizeof(struct nft_trans_flowtable
));
6869 goto err_flowtable_update_hook
;
6872 nft_trans_flowtable_flags(trans
) = flags
;
6873 nft_trans_flowtable(trans
) = flowtable
;
6874 nft_trans_flowtable_update(trans
) = true;
6875 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans
));
6876 list_splice(&flowtable_hook
.list
, &nft_trans_flowtable_hooks(trans
));
6878 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
6882 err_flowtable_update_hook
:
6883 list_for_each_entry_safe(hook
, next
, &flowtable_hook
.list
, list
) {
6885 nft_unregister_flowtable_hook(ctx
->net
, flowtable
, hook
);
6886 list_del_rcu(&hook
->list
);
6887 kfree_rcu(hook
, rcu
);
6894 static int nf_tables_newflowtable(struct net
*net
, struct sock
*nlsk
,
6895 struct sk_buff
*skb
,
6896 const struct nlmsghdr
*nlh
,
6897 const struct nlattr
* const nla
[],
6898 struct netlink_ext_ack
*extack
)
6900 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
6901 struct nft_flowtable_hook flowtable_hook
;
6902 const struct nf_flowtable_type
*type
;
6903 u8 genmask
= nft_genmask_next(net
);
6904 int family
= nfmsg
->nfgen_family
;
6905 struct nft_flowtable
*flowtable
;
6906 struct nft_hook
*hook
, *next
;
6907 struct nft_table
*table
;
6911 if (!nla
[NFTA_FLOWTABLE_TABLE
] ||
6912 !nla
[NFTA_FLOWTABLE_NAME
] ||
6913 !nla
[NFTA_FLOWTABLE_HOOK
])
6916 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
6917 genmask
, NETLINK_CB(skb
).portid
);
6918 if (IS_ERR(table
)) {
6919 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_TABLE
]);
6920 return PTR_ERR(table
);
6923 flowtable
= nft_flowtable_lookup(table
, nla
[NFTA_FLOWTABLE_NAME
],
6925 if (IS_ERR(flowtable
)) {
6926 err
= PTR_ERR(flowtable
);
6927 if (err
!= -ENOENT
) {
6928 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_NAME
]);
6932 if (nlh
->nlmsg_flags
& NLM_F_EXCL
) {
6933 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_NAME
]);
6937 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6939 return nft_flowtable_update(&ctx
, nlh
, flowtable
);
6942 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
6944 flowtable
= kzalloc(sizeof(*flowtable
), GFP_KERNEL
);
6948 flowtable
->table
= table
;
6949 flowtable
->handle
= nf_tables_alloc_handle(table
);
6950 INIT_LIST_HEAD(&flowtable
->hook_list
);
6952 flowtable
->name
= nla_strdup(nla
[NFTA_FLOWTABLE_NAME
], GFP_KERNEL
);
6953 if (!flowtable
->name
) {
6958 type
= nft_flowtable_type_get(net
, family
);
6960 err
= PTR_ERR(type
);
6964 if (nla
[NFTA_FLOWTABLE_FLAGS
]) {
6965 flowtable
->data
.flags
=
6966 ntohl(nla_get_be32(nla
[NFTA_FLOWTABLE_FLAGS
]));
6967 if (flowtable
->data
.flags
& ~NFT_FLOWTABLE_MASK
) {
6973 write_pnet(&flowtable
->data
.net
, net
);
6974 flowtable
->data
.type
= type
;
6975 err
= type
->init(&flowtable
->data
);
6979 err
= nft_flowtable_parse_hook(&ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
6980 &flowtable_hook
, flowtable
, true);
6984 list_splice(&flowtable_hook
.list
, &flowtable
->hook_list
);
6985 flowtable
->data
.priority
= flowtable_hook
.priority
;
6986 flowtable
->hooknum
= flowtable_hook
.num
;
6988 err
= nft_register_flowtable_net_hooks(ctx
.net
, table
,
6989 &flowtable
->hook_list
,
6992 nft_flowtable_hooks_destroy(&flowtable
->hook_list
);
6996 err
= nft_trans_flowtable_add(&ctx
, NFT_MSG_NEWFLOWTABLE
, flowtable
);
7000 list_add_tail_rcu(&flowtable
->list
, &table
->flowtables
);
7005 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7006 nft_unregister_flowtable_hook(net
, flowtable
, hook
);
7007 list_del_rcu(&hook
->list
);
7008 kfree_rcu(hook
, rcu
);
7011 flowtable
->data
.type
->free(&flowtable
->data
);
7013 module_put(type
->owner
);
7015 kfree(flowtable
->name
);
7021 static void nft_flowtable_hook_release(struct nft_flowtable_hook
*flowtable_hook
)
7023 struct nft_hook
*this, *next
;
7025 list_for_each_entry_safe(this, next
, &flowtable_hook
->list
, list
) {
7026 list_del(&this->list
);
7031 static int nft_delflowtable_hook(struct nft_ctx
*ctx
,
7032 struct nft_flowtable
*flowtable
)
7034 const struct nlattr
* const *nla
= ctx
->nla
;
7035 struct nft_flowtable_hook flowtable_hook
;
7036 struct nft_hook
*this, *hook
;
7037 struct nft_trans
*trans
;
7040 err
= nft_flowtable_parse_hook(ctx
, nla
[NFTA_FLOWTABLE_HOOK
],
7041 &flowtable_hook
, flowtable
, false);
7045 list_for_each_entry(this, &flowtable_hook
.list
, list
) {
7046 hook
= nft_hook_list_find(&flowtable
->hook_list
, this);
7049 goto err_flowtable_del_hook
;
7051 hook
->inactive
= true;
7054 trans
= nft_trans_alloc(ctx
, NFT_MSG_DELFLOWTABLE
,
7055 sizeof(struct nft_trans_flowtable
));
7058 goto err_flowtable_del_hook
;
7061 nft_trans_flowtable(trans
) = flowtable
;
7062 nft_trans_flowtable_update(trans
) = true;
7063 INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans
));
7064 nft_flowtable_hook_release(&flowtable_hook
);
7066 list_add_tail(&trans
->list
, &ctx
->net
->nft
.commit_list
);
7070 err_flowtable_del_hook
:
7071 list_for_each_entry(this, &flowtable_hook
.list
, list
) {
7072 hook
= nft_hook_list_find(&flowtable
->hook_list
, this);
7076 hook
->inactive
= false;
7078 nft_flowtable_hook_release(&flowtable_hook
);
7083 static int nf_tables_delflowtable(struct net
*net
, struct sock
*nlsk
,
7084 struct sk_buff
*skb
,
7085 const struct nlmsghdr
*nlh
,
7086 const struct nlattr
* const nla
[],
7087 struct netlink_ext_ack
*extack
)
7089 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
7090 u8 genmask
= nft_genmask_next(net
);
7091 int family
= nfmsg
->nfgen_family
;
7092 struct nft_flowtable
*flowtable
;
7093 const struct nlattr
*attr
;
7094 struct nft_table
*table
;
7097 if (!nla
[NFTA_FLOWTABLE_TABLE
] ||
7098 (!nla
[NFTA_FLOWTABLE_NAME
] &&
7099 !nla
[NFTA_FLOWTABLE_HANDLE
]))
7102 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
7103 genmask
, NETLINK_CB(skb
).portid
);
7104 if (IS_ERR(table
)) {
7105 NL_SET_BAD_ATTR(extack
, nla
[NFTA_FLOWTABLE_TABLE
]);
7106 return PTR_ERR(table
);
7109 if (nla
[NFTA_FLOWTABLE_HANDLE
]) {
7110 attr
= nla
[NFTA_FLOWTABLE_HANDLE
];
7111 flowtable
= nft_flowtable_lookup_byhandle(table
, attr
, genmask
);
7113 attr
= nla
[NFTA_FLOWTABLE_NAME
];
7114 flowtable
= nft_flowtable_lookup(table
, attr
, genmask
);
7117 if (IS_ERR(flowtable
)) {
7118 NL_SET_BAD_ATTR(extack
, attr
);
7119 return PTR_ERR(flowtable
);
7122 nft_ctx_init(&ctx
, net
, skb
, nlh
, family
, table
, NULL
, nla
);
7124 if (nla
[NFTA_FLOWTABLE_HOOK
])
7125 return nft_delflowtable_hook(&ctx
, flowtable
);
7127 if (flowtable
->use
> 0) {
7128 NL_SET_BAD_ATTR(extack
, attr
);
7132 return nft_delflowtable(&ctx
, flowtable
);
7135 static int nf_tables_fill_flowtable_info(struct sk_buff
*skb
, struct net
*net
,
7136 u32 portid
, u32 seq
, int event
,
7137 u32 flags
, int family
,
7138 struct nft_flowtable
*flowtable
,
7139 struct list_head
*hook_list
)
7141 struct nlattr
*nest
, *nest_devs
;
7142 struct nfgenmsg
*nfmsg
;
7143 struct nft_hook
*hook
;
7144 struct nlmsghdr
*nlh
;
7146 event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, event
);
7147 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), flags
);
7149 goto nla_put_failure
;
7151 nfmsg
= nlmsg_data(nlh
);
7152 nfmsg
->nfgen_family
= family
;
7153 nfmsg
->version
= NFNETLINK_V0
;
7154 nfmsg
->res_id
= nft_base_seq(net
);
7156 if (nla_put_string(skb
, NFTA_FLOWTABLE_TABLE
, flowtable
->table
->name
) ||
7157 nla_put_string(skb
, NFTA_FLOWTABLE_NAME
, flowtable
->name
) ||
7158 nla_put_be32(skb
, NFTA_FLOWTABLE_USE
, htonl(flowtable
->use
)) ||
7159 nla_put_be64(skb
, NFTA_FLOWTABLE_HANDLE
, cpu_to_be64(flowtable
->handle
),
7160 NFTA_FLOWTABLE_PAD
) ||
7161 nla_put_be32(skb
, NFTA_FLOWTABLE_FLAGS
, htonl(flowtable
->data
.flags
)))
7162 goto nla_put_failure
;
7164 nest
= nla_nest_start_noflag(skb
, NFTA_FLOWTABLE_HOOK
);
7166 goto nla_put_failure
;
7167 if (nla_put_be32(skb
, NFTA_FLOWTABLE_HOOK_NUM
, htonl(flowtable
->hooknum
)) ||
7168 nla_put_be32(skb
, NFTA_FLOWTABLE_HOOK_PRIORITY
, htonl(flowtable
->data
.priority
)))
7169 goto nla_put_failure
;
7171 nest_devs
= nla_nest_start_noflag(skb
, NFTA_FLOWTABLE_HOOK_DEVS
);
7173 goto nla_put_failure
;
7175 list_for_each_entry_rcu(hook
, hook_list
, list
) {
7176 if (nla_put_string(skb
, NFTA_DEVICE_NAME
, hook
->ops
.dev
->name
))
7177 goto nla_put_failure
;
7179 nla_nest_end(skb
, nest_devs
);
7180 nla_nest_end(skb
, nest
);
7182 nlmsg_end(skb
, nlh
);
7186 nlmsg_trim(skb
, nlh
);
7190 struct nft_flowtable_filter
{
7194 static int nf_tables_dump_flowtable(struct sk_buff
*skb
,
7195 struct netlink_callback
*cb
)
7197 const struct nfgenmsg
*nfmsg
= nlmsg_data(cb
->nlh
);
7198 struct nft_flowtable_filter
*filter
= cb
->data
;
7199 unsigned int idx
= 0, s_idx
= cb
->args
[0];
7200 struct net
*net
= sock_net(skb
->sk
);
7201 int family
= nfmsg
->nfgen_family
;
7202 struct nft_flowtable
*flowtable
;
7203 const struct nft_table
*table
;
7206 cb
->seq
= net
->nft
.base_seq
;
7208 list_for_each_entry_rcu(table
, &net
->nft
.tables
, list
) {
7209 if (family
!= NFPROTO_UNSPEC
&& family
!= table
->family
)
7212 list_for_each_entry_rcu(flowtable
, &table
->flowtables
, list
) {
7213 if (!nft_is_active(net
, flowtable
))
7218 memset(&cb
->args
[1], 0,
7219 sizeof(cb
->args
) - sizeof(cb
->args
[0]));
7220 if (filter
&& filter
->table
&&
7221 strcmp(filter
->table
, table
->name
))
7224 if (nf_tables_fill_flowtable_info(skb
, net
, NETLINK_CB(cb
->skb
).portid
,
7226 NFT_MSG_NEWFLOWTABLE
,
7227 NLM_F_MULTI
| NLM_F_APPEND
,
7230 &flowtable
->hook_list
) < 0)
7233 nl_dump_check_consistent(cb
, nlmsg_hdr(skb
));
7245 static int nf_tables_dump_flowtable_start(struct netlink_callback
*cb
)
7247 const struct nlattr
* const *nla
= cb
->data
;
7248 struct nft_flowtable_filter
*filter
= NULL
;
7250 if (nla
[NFTA_FLOWTABLE_TABLE
]) {
7251 filter
= kzalloc(sizeof(*filter
), GFP_ATOMIC
);
7255 filter
->table
= nla_strdup(nla
[NFTA_FLOWTABLE_TABLE
],
7257 if (!filter
->table
) {
7267 static int nf_tables_dump_flowtable_done(struct netlink_callback
*cb
)
7269 struct nft_flowtable_filter
*filter
= cb
->data
;
7274 kfree(filter
->table
);
7280 /* called with rcu_read_lock held */
7281 static int nf_tables_getflowtable(struct net
*net
, struct sock
*nlsk
,
7282 struct sk_buff
*skb
,
7283 const struct nlmsghdr
*nlh
,
7284 const struct nlattr
* const nla
[],
7285 struct netlink_ext_ack
*extack
)
7287 const struct nfgenmsg
*nfmsg
= nlmsg_data(nlh
);
7288 u8 genmask
= nft_genmask_cur(net
);
7289 int family
= nfmsg
->nfgen_family
;
7290 struct nft_flowtable
*flowtable
;
7291 const struct nft_table
*table
;
7292 struct sk_buff
*skb2
;
7295 if (nlh
->nlmsg_flags
& NLM_F_DUMP
) {
7296 struct netlink_dump_control c
= {
7297 .start
= nf_tables_dump_flowtable_start
,
7298 .dump
= nf_tables_dump_flowtable
,
7299 .done
= nf_tables_dump_flowtable_done
,
7300 .module
= THIS_MODULE
,
7301 .data
= (void *)nla
,
7304 return nft_netlink_dump_start_rcu(nlsk
, skb
, nlh
, &c
);
7307 if (!nla
[NFTA_FLOWTABLE_NAME
])
7310 table
= nft_table_lookup(net
, nla
[NFTA_FLOWTABLE_TABLE
], family
,
7313 return PTR_ERR(table
);
7315 flowtable
= nft_flowtable_lookup(table
, nla
[NFTA_FLOWTABLE_NAME
],
7317 if (IS_ERR(flowtable
))
7318 return PTR_ERR(flowtable
);
7320 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
7324 err
= nf_tables_fill_flowtable_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7326 NFT_MSG_NEWFLOWTABLE
, 0, family
,
7327 flowtable
, &flowtable
->hook_list
);
7329 goto err_fill_flowtable_info
;
7331 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
7333 err_fill_flowtable_info
:
7338 static void nf_tables_flowtable_notify(struct nft_ctx
*ctx
,
7339 struct nft_flowtable
*flowtable
,
7340 struct list_head
*hook_list
,
7343 struct sk_buff
*skb
;
7347 !nfnetlink_has_listeners(ctx
->net
, NFNLGRP_NFTABLES
))
7350 skb
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
7354 err
= nf_tables_fill_flowtable_info(skb
, ctx
->net
, ctx
->portid
,
7356 ctx
->family
, flowtable
, hook_list
);
7362 nft_notify_enqueue(skb
, ctx
->report
, &ctx
->net
->nft
.notify_list
);
7365 nfnetlink_set_err(ctx
->net
, ctx
->portid
, NFNLGRP_NFTABLES
, -ENOBUFS
);
7368 static void nf_tables_flowtable_destroy(struct nft_flowtable
*flowtable
)
7370 struct nft_hook
*hook
, *next
;
7372 flowtable
->data
.type
->free(&flowtable
->data
);
7373 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7374 flowtable
->data
.type
->setup(&flowtable
->data
, hook
->ops
.dev
,
7376 list_del_rcu(&hook
->list
);
7379 kfree(flowtable
->name
);
7380 module_put(flowtable
->data
.type
->owner
);
7384 static int nf_tables_fill_gen_info(struct sk_buff
*skb
, struct net
*net
,
7385 u32 portid
, u32 seq
)
7387 struct nlmsghdr
*nlh
;
7388 struct nfgenmsg
*nfmsg
;
7389 char buf
[TASK_COMM_LEN
];
7390 int event
= nfnl_msg_type(NFNL_SUBSYS_NFTABLES
, NFT_MSG_NEWGEN
);
7392 nlh
= nlmsg_put(skb
, portid
, seq
, event
, sizeof(struct nfgenmsg
), 0);
7394 goto nla_put_failure
;
7396 nfmsg
= nlmsg_data(nlh
);
7397 nfmsg
->nfgen_family
= AF_UNSPEC
;
7398 nfmsg
->version
= NFNETLINK_V0
;
7399 nfmsg
->res_id
= nft_base_seq(net
);
7401 if (nla_put_be32(skb
, NFTA_GEN_ID
, htonl(net
->nft
.base_seq
)) ||
7402 nla_put_be32(skb
, NFTA_GEN_PROC_PID
, htonl(task_pid_nr(current
))) ||
7403 nla_put_string(skb
, NFTA_GEN_PROC_NAME
, get_task_comm(buf
, current
)))
7404 goto nla_put_failure
;
7406 nlmsg_end(skb
, nlh
);
7410 nlmsg_trim(skb
, nlh
);
7414 static void nft_flowtable_event(unsigned long event
, struct net_device
*dev
,
7415 struct nft_flowtable
*flowtable
)
7417 struct nft_hook
*hook
;
7419 list_for_each_entry(hook
, &flowtable
->hook_list
, list
) {
7420 if (hook
->ops
.dev
!= dev
)
7423 /* flow_offload_netdev_event() cleans up entries for us. */
7424 nft_unregister_flowtable_hook(dev_net(dev
), flowtable
, hook
);
7425 list_del_rcu(&hook
->list
);
7426 kfree_rcu(hook
, rcu
);
7431 static int nf_tables_flowtable_event(struct notifier_block
*this,
7432 unsigned long event
, void *ptr
)
7434 struct net_device
*dev
= netdev_notifier_info_to_dev(ptr
);
7435 struct nft_flowtable
*flowtable
;
7436 struct nft_table
*table
;
7439 if (event
!= NETDEV_UNREGISTER
)
7443 mutex_lock(&net
->nft
.commit_mutex
);
7444 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
7445 list_for_each_entry(flowtable
, &table
->flowtables
, list
) {
7446 nft_flowtable_event(event
, dev
, flowtable
);
7449 mutex_unlock(&net
->nft
.commit_mutex
);
7454 static struct notifier_block nf_tables_flowtable_notifier
= {
7455 .notifier_call
= nf_tables_flowtable_event
,
7458 static void nf_tables_gen_notify(struct net
*net
, struct sk_buff
*skb
,
7461 struct nlmsghdr
*nlh
= nlmsg_hdr(skb
);
7462 struct sk_buff
*skb2
;
7465 if (!nlmsg_report(nlh
) &&
7466 !nfnetlink_has_listeners(net
, NFNLGRP_NFTABLES
))
7469 skb2
= nlmsg_new(NLMSG_GOODSIZE
, GFP_KERNEL
);
7473 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7480 nfnetlink_send(skb2
, net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
7481 nlmsg_report(nlh
), GFP_KERNEL
);
7484 nfnetlink_set_err(net
, NETLINK_CB(skb
).portid
, NFNLGRP_NFTABLES
,
7488 static int nf_tables_getgen(struct net
*net
, struct sock
*nlsk
,
7489 struct sk_buff
*skb
, const struct nlmsghdr
*nlh
,
7490 const struct nlattr
* const nla
[],
7491 struct netlink_ext_ack
*extack
)
7493 struct sk_buff
*skb2
;
7496 skb2
= alloc_skb(NLMSG_GOODSIZE
, GFP_ATOMIC
);
7500 err
= nf_tables_fill_gen_info(skb2
, net
, NETLINK_CB(skb
).portid
,
7503 goto err_fill_gen_info
;
7505 return nfnetlink_unicast(skb2
, net
, NETLINK_CB(skb
).portid
);
7512 static const struct nfnl_callback nf_tables_cb
[NFT_MSG_MAX
] = {
7513 [NFT_MSG_NEWTABLE
] = {
7514 .call_batch
= nf_tables_newtable
,
7515 .attr_count
= NFTA_TABLE_MAX
,
7516 .policy
= nft_table_policy
,
7518 [NFT_MSG_GETTABLE
] = {
7519 .call_rcu
= nf_tables_gettable
,
7520 .attr_count
= NFTA_TABLE_MAX
,
7521 .policy
= nft_table_policy
,
7523 [NFT_MSG_DELTABLE
] = {
7524 .call_batch
= nf_tables_deltable
,
7525 .attr_count
= NFTA_TABLE_MAX
,
7526 .policy
= nft_table_policy
,
7528 [NFT_MSG_NEWCHAIN
] = {
7529 .call_batch
= nf_tables_newchain
,
7530 .attr_count
= NFTA_CHAIN_MAX
,
7531 .policy
= nft_chain_policy
,
7533 [NFT_MSG_GETCHAIN
] = {
7534 .call_rcu
= nf_tables_getchain
,
7535 .attr_count
= NFTA_CHAIN_MAX
,
7536 .policy
= nft_chain_policy
,
7538 [NFT_MSG_DELCHAIN
] = {
7539 .call_batch
= nf_tables_delchain
,
7540 .attr_count
= NFTA_CHAIN_MAX
,
7541 .policy
= nft_chain_policy
,
7543 [NFT_MSG_NEWRULE
] = {
7544 .call_batch
= nf_tables_newrule
,
7545 .attr_count
= NFTA_RULE_MAX
,
7546 .policy
= nft_rule_policy
,
7548 [NFT_MSG_GETRULE
] = {
7549 .call_rcu
= nf_tables_getrule
,
7550 .attr_count
= NFTA_RULE_MAX
,
7551 .policy
= nft_rule_policy
,
7553 [NFT_MSG_DELRULE
] = {
7554 .call_batch
= nf_tables_delrule
,
7555 .attr_count
= NFTA_RULE_MAX
,
7556 .policy
= nft_rule_policy
,
7558 [NFT_MSG_NEWSET
] = {
7559 .call_batch
= nf_tables_newset
,
7560 .attr_count
= NFTA_SET_MAX
,
7561 .policy
= nft_set_policy
,
7563 [NFT_MSG_GETSET
] = {
7564 .call_rcu
= nf_tables_getset
,
7565 .attr_count
= NFTA_SET_MAX
,
7566 .policy
= nft_set_policy
,
7568 [NFT_MSG_DELSET
] = {
7569 .call_batch
= nf_tables_delset
,
7570 .attr_count
= NFTA_SET_MAX
,
7571 .policy
= nft_set_policy
,
7573 [NFT_MSG_NEWSETELEM
] = {
7574 .call_batch
= nf_tables_newsetelem
,
7575 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7576 .policy
= nft_set_elem_list_policy
,
7578 [NFT_MSG_GETSETELEM
] = {
7579 .call_rcu
= nf_tables_getsetelem
,
7580 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7581 .policy
= nft_set_elem_list_policy
,
7583 [NFT_MSG_DELSETELEM
] = {
7584 .call_batch
= nf_tables_delsetelem
,
7585 .attr_count
= NFTA_SET_ELEM_LIST_MAX
,
7586 .policy
= nft_set_elem_list_policy
,
7588 [NFT_MSG_GETGEN
] = {
7589 .call_rcu
= nf_tables_getgen
,
7591 [NFT_MSG_NEWOBJ
] = {
7592 .call_batch
= nf_tables_newobj
,
7593 .attr_count
= NFTA_OBJ_MAX
,
7594 .policy
= nft_obj_policy
,
7596 [NFT_MSG_GETOBJ
] = {
7597 .call_rcu
= nf_tables_getobj
,
7598 .attr_count
= NFTA_OBJ_MAX
,
7599 .policy
= nft_obj_policy
,
7601 [NFT_MSG_DELOBJ
] = {
7602 .call_batch
= nf_tables_delobj
,
7603 .attr_count
= NFTA_OBJ_MAX
,
7604 .policy
= nft_obj_policy
,
7606 [NFT_MSG_GETOBJ_RESET
] = {
7607 .call_rcu
= nf_tables_getobj
,
7608 .attr_count
= NFTA_OBJ_MAX
,
7609 .policy
= nft_obj_policy
,
7611 [NFT_MSG_NEWFLOWTABLE
] = {
7612 .call_batch
= nf_tables_newflowtable
,
7613 .attr_count
= NFTA_FLOWTABLE_MAX
,
7614 .policy
= nft_flowtable_policy
,
7616 [NFT_MSG_GETFLOWTABLE
] = {
7617 .call_rcu
= nf_tables_getflowtable
,
7618 .attr_count
= NFTA_FLOWTABLE_MAX
,
7619 .policy
= nft_flowtable_policy
,
7621 [NFT_MSG_DELFLOWTABLE
] = {
7622 .call_batch
= nf_tables_delflowtable
,
7623 .attr_count
= NFTA_FLOWTABLE_MAX
,
7624 .policy
= nft_flowtable_policy
,
7628 static int nf_tables_validate(struct net
*net
)
7630 struct nft_table
*table
;
7632 switch (net
->nft
.validate_state
) {
7633 case NFT_VALIDATE_SKIP
:
7635 case NFT_VALIDATE_NEED
:
7636 nft_validate_state_update(net
, NFT_VALIDATE_DO
);
7638 case NFT_VALIDATE_DO
:
7639 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
7640 if (nft_table_validate(net
, table
) < 0)
7649 /* a drop policy has to be deferred until all rules have been activated,
7650 * otherwise a large ruleset that contains a drop-policy base chain will
7651 * cause all packets to get dropped until the full transaction has been
7654 * We defer the drop policy until the transaction has been finalized.
7656 static void nft_chain_commit_drop_policy(struct nft_trans
*trans
)
7658 struct nft_base_chain
*basechain
;
7660 if (nft_trans_chain_policy(trans
) != NF_DROP
)
7663 if (!nft_is_base_chain(trans
->ctx
.chain
))
7666 basechain
= nft_base_chain(trans
->ctx
.chain
);
7667 basechain
->policy
= NF_DROP
;
7670 static void nft_chain_commit_update(struct nft_trans
*trans
)
7672 struct nft_base_chain
*basechain
;
7674 if (nft_trans_chain_name(trans
)) {
7675 rhltable_remove(&trans
->ctx
.table
->chains_ht
,
7676 &trans
->ctx
.chain
->rhlhead
,
7677 nft_chain_ht_params
);
7678 swap(trans
->ctx
.chain
->name
, nft_trans_chain_name(trans
));
7679 rhltable_insert_key(&trans
->ctx
.table
->chains_ht
,
7680 trans
->ctx
.chain
->name
,
7681 &trans
->ctx
.chain
->rhlhead
,
7682 nft_chain_ht_params
);
7685 if (!nft_is_base_chain(trans
->ctx
.chain
))
7688 nft_chain_stats_replace(trans
);
7690 basechain
= nft_base_chain(trans
->ctx
.chain
);
7692 switch (nft_trans_chain_policy(trans
)) {
7695 basechain
->policy
= nft_trans_chain_policy(trans
);
7700 static void nft_obj_commit_update(struct nft_trans
*trans
)
7702 struct nft_object
*newobj
;
7703 struct nft_object
*obj
;
7705 obj
= nft_trans_obj(trans
);
7706 newobj
= nft_trans_obj_newobj(trans
);
7708 if (obj
->ops
->update
)
7709 obj
->ops
->update(obj
, newobj
);
7714 static void nft_commit_release(struct nft_trans
*trans
)
7716 switch (trans
->msg_type
) {
7717 case NFT_MSG_DELTABLE
:
7718 nf_tables_table_destroy(&trans
->ctx
);
7720 case NFT_MSG_NEWCHAIN
:
7721 free_percpu(nft_trans_chain_stats(trans
));
7722 kfree(nft_trans_chain_name(trans
));
7724 case NFT_MSG_DELCHAIN
:
7725 nf_tables_chain_destroy(&trans
->ctx
);
7727 case NFT_MSG_DELRULE
:
7728 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
7730 case NFT_MSG_DELSET
:
7731 nft_set_destroy(&trans
->ctx
, nft_trans_set(trans
));
7733 case NFT_MSG_DELSETELEM
:
7734 nf_tables_set_elem_destroy(&trans
->ctx
,
7735 nft_trans_elem_set(trans
),
7736 nft_trans_elem(trans
).priv
);
7738 case NFT_MSG_DELOBJ
:
7739 nft_obj_destroy(&trans
->ctx
, nft_trans_obj(trans
));
7741 case NFT_MSG_DELFLOWTABLE
:
7742 if (nft_trans_flowtable_update(trans
))
7743 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans
));
7745 nf_tables_flowtable_destroy(nft_trans_flowtable(trans
));
7750 put_net(trans
->ctx
.net
);
7755 static void nf_tables_trans_destroy_work(struct work_struct
*w
)
7757 struct nft_trans
*trans
, *next
;
7760 spin_lock(&nf_tables_destroy_list_lock
);
7761 list_splice_init(&nf_tables_destroy_list
, &head
);
7762 spin_unlock(&nf_tables_destroy_list_lock
);
7764 if (list_empty(&head
))
7769 list_for_each_entry_safe(trans
, next
, &head
, list
) {
7770 list_del(&trans
->list
);
7771 nft_commit_release(trans
);
7775 void nf_tables_trans_destroy_flush_work(void)
7777 flush_work(&trans_destroy_work
);
7779 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work
);
7781 static int nf_tables_commit_chain_prepare(struct net
*net
, struct nft_chain
*chain
)
7783 struct nft_rule
*rule
;
7784 unsigned int alloc
= 0;
7787 /* already handled or inactive chain? */
7788 if (chain
->rules_next
|| !nft_is_active_next(net
, chain
))
7791 rule
= list_entry(&chain
->rules
, struct nft_rule
, list
);
7794 list_for_each_entry_continue(rule
, &chain
->rules
, list
) {
7795 if (nft_is_active_next(net
, rule
))
7799 chain
->rules_next
= nf_tables_chain_alloc_rules(chain
, alloc
);
7800 if (!chain
->rules_next
)
7803 list_for_each_entry_continue(rule
, &chain
->rules
, list
) {
7804 if (nft_is_active_next(net
, rule
))
7805 chain
->rules_next
[i
++] = rule
;
7808 chain
->rules_next
[i
] = NULL
;
7812 static void nf_tables_commit_chain_prepare_cancel(struct net
*net
)
7814 struct nft_trans
*trans
, *next
;
7816 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
7817 struct nft_chain
*chain
= trans
->ctx
.chain
;
7819 if (trans
->msg_type
== NFT_MSG_NEWRULE
||
7820 trans
->msg_type
== NFT_MSG_DELRULE
) {
7821 kvfree(chain
->rules_next
);
7822 chain
->rules_next
= NULL
;
7827 static void __nf_tables_commit_chain_free_rules_old(struct rcu_head
*h
)
7829 struct nft_rules_old
*o
= container_of(h
, struct nft_rules_old
, h
);
7834 static void nf_tables_commit_chain_free_rules_old(struct nft_rule
**rules
)
7836 struct nft_rule
**r
= rules
;
7837 struct nft_rules_old
*old
;
7842 r
++; /* rcu_head is after end marker */
7846 call_rcu(&old
->h
, __nf_tables_commit_chain_free_rules_old
);
7849 static void nf_tables_commit_chain(struct net
*net
, struct nft_chain
*chain
)
7851 struct nft_rule
**g0
, **g1
;
7854 next_genbit
= nft_gencursor_next(net
);
7856 g0
= rcu_dereference_protected(chain
->rules_gen_0
,
7857 lockdep_commit_lock_is_held(net
));
7858 g1
= rcu_dereference_protected(chain
->rules_gen_1
,
7859 lockdep_commit_lock_is_held(net
));
7861 /* No changes to this chain? */
7862 if (chain
->rules_next
== NULL
) {
7863 /* chain had no change in last or next generation */
7867 * chain had no change in this generation; make sure next
7868 * one uses same rules as current generation.
7871 rcu_assign_pointer(chain
->rules_gen_1
, g0
);
7872 nf_tables_commit_chain_free_rules_old(g1
);
7874 rcu_assign_pointer(chain
->rules_gen_0
, g1
);
7875 nf_tables_commit_chain_free_rules_old(g0
);
7882 rcu_assign_pointer(chain
->rules_gen_1
, chain
->rules_next
);
7884 rcu_assign_pointer(chain
->rules_gen_0
, chain
->rules_next
);
7886 chain
->rules_next
= NULL
;
7892 nf_tables_commit_chain_free_rules_old(g1
);
7894 nf_tables_commit_chain_free_rules_old(g0
);
7897 static void nft_obj_del(struct nft_object
*obj
)
7899 rhltable_remove(&nft_objname_ht
, &obj
->rhlhead
, nft_objname_ht_params
);
7900 list_del_rcu(&obj
->list
);
7903 void nft_chain_del(struct nft_chain
*chain
)
7905 struct nft_table
*table
= chain
->table
;
7907 WARN_ON_ONCE(rhltable_remove(&table
->chains_ht
, &chain
->rhlhead
,
7908 nft_chain_ht_params
));
7909 list_del_rcu(&chain
->list
);
7912 static void nft_flowtable_hooks_del(struct nft_flowtable
*flowtable
,
7913 struct list_head
*hook_list
)
7915 struct nft_hook
*hook
, *next
;
7917 list_for_each_entry_safe(hook
, next
, &flowtable
->hook_list
, list
) {
7919 list_move(&hook
->list
, hook_list
);
7923 static void nf_tables_module_autoload_cleanup(struct net
*net
)
7925 struct nft_module_request
*req
, *next
;
7927 WARN_ON_ONCE(!list_empty(&net
->nft
.commit_list
));
7928 list_for_each_entry_safe(req
, next
, &net
->nft
.module_list
, list
) {
7929 WARN_ON_ONCE(!req
->done
);
7930 list_del(&req
->list
);
7935 static void nf_tables_commit_release(struct net
*net
)
7937 struct nft_trans
*trans
;
7939 /* all side effects have to be made visible.
7940 * For example, if a chain named 'foo' has been deleted, a
7941 * new transaction must not find it anymore.
7943 * Memory reclaim happens asynchronously from work queue
7944 * to prevent expensive synchronize_rcu() in commit phase.
7946 if (list_empty(&net
->nft
.commit_list
)) {
7947 nf_tables_module_autoload_cleanup(net
);
7948 mutex_unlock(&net
->nft
.commit_mutex
);
7952 trans
= list_last_entry(&net
->nft
.commit_list
,
7953 struct nft_trans
, list
);
7954 get_net(trans
->ctx
.net
);
7955 WARN_ON_ONCE(trans
->put_net
);
7957 trans
->put_net
= true;
7958 spin_lock(&nf_tables_destroy_list_lock
);
7959 list_splice_tail_init(&net
->nft
.commit_list
, &nf_tables_destroy_list
);
7960 spin_unlock(&nf_tables_destroy_list_lock
);
7962 nf_tables_module_autoload_cleanup(net
);
7963 schedule_work(&trans_destroy_work
);
7965 mutex_unlock(&net
->nft
.commit_mutex
);
7968 static void nft_commit_notify(struct net
*net
, u32 portid
)
7970 struct sk_buff
*batch_skb
= NULL
, *nskb
, *skb
;
7971 unsigned char *data
;
7974 list_for_each_entry_safe(skb
, nskb
, &net
->nft
.notify_list
, list
) {
7978 len
= NLMSG_GOODSIZE
- skb
->len
;
7979 list_del(&skb
->list
);
7983 if (len
> 0 && NFT_CB(skb
).report
== NFT_CB(batch_skb
).report
) {
7984 data
= skb_put(batch_skb
, skb
->len
);
7985 memcpy(data
, skb
->data
, skb
->len
);
7986 list_del(&skb
->list
);
7990 nfnetlink_send(batch_skb
, net
, portid
, NFNLGRP_NFTABLES
,
7991 NFT_CB(batch_skb
).report
, GFP_KERNEL
);
7996 nfnetlink_send(batch_skb
, net
, portid
, NFNLGRP_NFTABLES
,
7997 NFT_CB(batch_skb
).report
, GFP_KERNEL
);
8000 WARN_ON_ONCE(!list_empty(&net
->nft
.notify_list
));
8003 static int nf_tables_commit_audit_alloc(struct list_head
*adl
,
8004 struct nft_table
*table
)
8006 struct nft_audit_data
*adp
;
8008 list_for_each_entry(adp
, adl
, list
) {
8009 if (adp
->table
== table
)
8012 adp
= kzalloc(sizeof(*adp
), GFP_KERNEL
);
8016 list_add(&adp
->list
, adl
);
8020 static void nf_tables_commit_audit_collect(struct list_head
*adl
,
8021 struct nft_table
*table
, u32 op
)
8023 struct nft_audit_data
*adp
;
8025 list_for_each_entry(adp
, adl
, list
) {
8026 if (adp
->table
== table
)
8029 WARN_ONCE("table=%s not expected in commit list", table
->name
);
8033 if (!adp
->op
|| adp
->op
> op
)
8037 #define AUNFTABLENAMELEN (NFT_TABLE_MAXNAMELEN + 22)
8039 static void nf_tables_commit_audit_log(struct list_head
*adl
, u32 generation
)
8041 struct nft_audit_data
*adp
, *adn
;
8042 char aubuf
[AUNFTABLENAMELEN
];
8044 list_for_each_entry_safe(adp
, adn
, adl
, list
) {
8045 snprintf(aubuf
, AUNFTABLENAMELEN
, "%s:%u", adp
->table
->name
,
8047 audit_log_nfcfg(aubuf
, adp
->table
->family
, adp
->entries
,
8048 nft2audit_op
[adp
->op
], GFP_KERNEL
);
8049 list_del(&adp
->list
);
8054 static int nf_tables_commit(struct net
*net
, struct sk_buff
*skb
)
8056 struct nft_trans
*trans
, *next
;
8057 struct nft_trans_elem
*te
;
8058 struct nft_chain
*chain
;
8059 struct nft_table
*table
;
8063 if (list_empty(&net
->nft
.commit_list
)) {
8064 mutex_unlock(&net
->nft
.commit_mutex
);
8068 /* 0. Validate ruleset, otherwise roll back for error reporting. */
8069 if (nf_tables_validate(net
) < 0)
8072 err
= nft_flow_rule_offload_commit(net
);
8076 /* 1. Allocate space for next generation rules_gen_X[] */
8077 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
8080 ret
= nf_tables_commit_audit_alloc(&adl
, trans
->ctx
.table
);
8082 nf_tables_commit_chain_prepare_cancel(net
);
8085 if (trans
->msg_type
== NFT_MSG_NEWRULE
||
8086 trans
->msg_type
== NFT_MSG_DELRULE
) {
8087 chain
= trans
->ctx
.chain
;
8089 ret
= nf_tables_commit_chain_prepare(net
, chain
);
8091 nf_tables_commit_chain_prepare_cancel(net
);
8097 /* step 2. Make rules_gen_X visible to packet path */
8098 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
8099 list_for_each_entry(chain
, &table
->chains
, list
)
8100 nf_tables_commit_chain(net
, chain
);
8104 * Bump generation counter, invalidate any dump in progress.
8105 * Cannot fail after this point.
8107 while (++net
->nft
.base_seq
== 0);
8109 /* step 3. Start new generation, rules_gen_X now in use. */
8110 net
->nft
.gencursor
= nft_gencursor_next(net
);
8112 list_for_each_entry_safe(trans
, next
, &net
->nft
.commit_list
, list
) {
8113 nf_tables_commit_audit_collect(&adl
, trans
->ctx
.table
,
8115 switch (trans
->msg_type
) {
8116 case NFT_MSG_NEWTABLE
:
8117 if (nft_trans_table_update(trans
)) {
8118 if (nft_trans_table_state(trans
) == NFT_TABLE_STATE_DORMANT
)
8119 nf_tables_table_disable(net
, trans
->ctx
.table
);
8121 trans
->ctx
.table
->flags
= nft_trans_table_flags(trans
);
8123 nft_clear(net
, trans
->ctx
.table
);
8125 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_NEWTABLE
);
8126 nft_trans_destroy(trans
);
8128 case NFT_MSG_DELTABLE
:
8129 list_del_rcu(&trans
->ctx
.table
->list
);
8130 nf_tables_table_notify(&trans
->ctx
, NFT_MSG_DELTABLE
);
8132 case NFT_MSG_NEWCHAIN
:
8133 if (nft_trans_chain_update(trans
)) {
8134 nft_chain_commit_update(trans
);
8135 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
8136 /* trans destroyed after rcu grace period */
8138 nft_chain_commit_drop_policy(trans
);
8139 nft_clear(net
, trans
->ctx
.chain
);
8140 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_NEWCHAIN
);
8141 nft_trans_destroy(trans
);
8144 case NFT_MSG_DELCHAIN
:
8145 nft_chain_del(trans
->ctx
.chain
);
8146 nf_tables_chain_notify(&trans
->ctx
, NFT_MSG_DELCHAIN
);
8147 nf_tables_unregister_hook(trans
->ctx
.net
,
8151 case NFT_MSG_NEWRULE
:
8152 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
8153 nf_tables_rule_notify(&trans
->ctx
,
8154 nft_trans_rule(trans
),
8156 nft_trans_destroy(trans
);
8158 case NFT_MSG_DELRULE
:
8159 list_del_rcu(&nft_trans_rule(trans
)->list
);
8160 nf_tables_rule_notify(&trans
->ctx
,
8161 nft_trans_rule(trans
),
8163 nft_rule_expr_deactivate(&trans
->ctx
,
8164 nft_trans_rule(trans
),
8167 case NFT_MSG_NEWSET
:
8168 nft_clear(net
, nft_trans_set(trans
));
8169 /* This avoids hitting -EBUSY when deleting the table
8170 * from the transaction.
8172 if (nft_set_is_anonymous(nft_trans_set(trans
)) &&
8173 !list_empty(&nft_trans_set(trans
)->bindings
))
8174 trans
->ctx
.table
->use
--;
8176 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
8177 NFT_MSG_NEWSET
, GFP_KERNEL
);
8178 nft_trans_destroy(trans
);
8180 case NFT_MSG_DELSET
:
8181 list_del_rcu(&nft_trans_set(trans
)->list
);
8182 nf_tables_set_notify(&trans
->ctx
, nft_trans_set(trans
),
8183 NFT_MSG_DELSET
, GFP_KERNEL
);
8185 case NFT_MSG_NEWSETELEM
:
8186 te
= (struct nft_trans_elem
*)trans
->data
;
8188 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
8189 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
8191 NFT_MSG_NEWSETELEM
, 0);
8192 nft_trans_destroy(trans
);
8194 case NFT_MSG_DELSETELEM
:
8195 te
= (struct nft_trans_elem
*)trans
->data
;
8197 nf_tables_setelem_notify(&trans
->ctx
, te
->set
,
8199 NFT_MSG_DELSETELEM
, 0);
8200 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
8201 atomic_dec(&te
->set
->nelems
);
8204 case NFT_MSG_NEWOBJ
:
8205 if (nft_trans_obj_update(trans
)) {
8206 nft_obj_commit_update(trans
);
8207 nf_tables_obj_notify(&trans
->ctx
,
8208 nft_trans_obj(trans
),
8211 nft_clear(net
, nft_trans_obj(trans
));
8212 nf_tables_obj_notify(&trans
->ctx
,
8213 nft_trans_obj(trans
),
8215 nft_trans_destroy(trans
);
8218 case NFT_MSG_DELOBJ
:
8219 nft_obj_del(nft_trans_obj(trans
));
8220 nf_tables_obj_notify(&trans
->ctx
, nft_trans_obj(trans
),
8223 case NFT_MSG_NEWFLOWTABLE
:
8224 if (nft_trans_flowtable_update(trans
)) {
8225 nft_trans_flowtable(trans
)->data
.flags
=
8226 nft_trans_flowtable_flags(trans
);
8227 nf_tables_flowtable_notify(&trans
->ctx
,
8228 nft_trans_flowtable(trans
),
8229 &nft_trans_flowtable_hooks(trans
),
8230 NFT_MSG_NEWFLOWTABLE
);
8231 list_splice(&nft_trans_flowtable_hooks(trans
),
8232 &nft_trans_flowtable(trans
)->hook_list
);
8234 nft_clear(net
, nft_trans_flowtable(trans
));
8235 nf_tables_flowtable_notify(&trans
->ctx
,
8236 nft_trans_flowtable(trans
),
8237 &nft_trans_flowtable(trans
)->hook_list
,
8238 NFT_MSG_NEWFLOWTABLE
);
8240 nft_trans_destroy(trans
);
8242 case NFT_MSG_DELFLOWTABLE
:
8243 if (nft_trans_flowtable_update(trans
)) {
8244 nft_flowtable_hooks_del(nft_trans_flowtable(trans
),
8245 &nft_trans_flowtable_hooks(trans
));
8246 nf_tables_flowtable_notify(&trans
->ctx
,
8247 nft_trans_flowtable(trans
),
8248 &nft_trans_flowtable_hooks(trans
),
8249 NFT_MSG_DELFLOWTABLE
);
8250 nft_unregister_flowtable_net_hooks(net
,
8251 &nft_trans_flowtable_hooks(trans
));
8253 list_del_rcu(&nft_trans_flowtable(trans
)->list
);
8254 nf_tables_flowtable_notify(&trans
->ctx
,
8255 nft_trans_flowtable(trans
),
8256 &nft_trans_flowtable(trans
)->hook_list
,
8257 NFT_MSG_DELFLOWTABLE
);
8258 nft_unregister_flowtable_net_hooks(net
,
8259 &nft_trans_flowtable(trans
)->hook_list
);
8265 nft_commit_notify(net
, NETLINK_CB(skb
).portid
);
8266 nf_tables_gen_notify(net
, skb
, NFT_MSG_NEWGEN
);
8267 nf_tables_commit_audit_log(&adl
, net
->nft
.base_seq
);
8268 nf_tables_commit_release(net
);
8273 static void nf_tables_module_autoload(struct net
*net
)
8275 struct nft_module_request
*req
, *next
;
8276 LIST_HEAD(module_list
);
8278 list_splice_init(&net
->nft
.module_list
, &module_list
);
8279 mutex_unlock(&net
->nft
.commit_mutex
);
8280 list_for_each_entry_safe(req
, next
, &module_list
, list
) {
8281 request_module("%s", req
->module
);
8284 mutex_lock(&net
->nft
.commit_mutex
);
8285 list_splice(&module_list
, &net
->nft
.module_list
);
8288 static void nf_tables_abort_release(struct nft_trans
*trans
)
8290 switch (trans
->msg_type
) {
8291 case NFT_MSG_NEWTABLE
:
8292 nf_tables_table_destroy(&trans
->ctx
);
8294 case NFT_MSG_NEWCHAIN
:
8295 nf_tables_chain_destroy(&trans
->ctx
);
8297 case NFT_MSG_NEWRULE
:
8298 nf_tables_rule_destroy(&trans
->ctx
, nft_trans_rule(trans
));
8300 case NFT_MSG_NEWSET
:
8301 nft_set_destroy(&trans
->ctx
, nft_trans_set(trans
));
8303 case NFT_MSG_NEWSETELEM
:
8304 nft_set_elem_destroy(nft_trans_elem_set(trans
),
8305 nft_trans_elem(trans
).priv
, true);
8307 case NFT_MSG_NEWOBJ
:
8308 nft_obj_destroy(&trans
->ctx
, nft_trans_obj(trans
));
8310 case NFT_MSG_NEWFLOWTABLE
:
8311 if (nft_trans_flowtable_update(trans
))
8312 nft_flowtable_hooks_destroy(&nft_trans_flowtable_hooks(trans
));
8314 nf_tables_flowtable_destroy(nft_trans_flowtable(trans
));
8320 static int __nf_tables_abort(struct net
*net
, enum nfnl_abort_action action
)
8322 struct nft_trans
*trans
, *next
;
8323 struct nft_trans_elem
*te
;
8324 struct nft_hook
*hook
;
8326 if (action
== NFNL_ABORT_VALIDATE
&&
8327 nf_tables_validate(net
) < 0)
8330 list_for_each_entry_safe_reverse(trans
, next
, &net
->nft
.commit_list
,
8332 switch (trans
->msg_type
) {
8333 case NFT_MSG_NEWTABLE
:
8334 if (nft_trans_table_update(trans
)) {
8335 if (nft_trans_table_state(trans
) == NFT_TABLE_STATE_WAKEUP
)
8336 nf_tables_table_disable(net
, trans
->ctx
.table
);
8338 nft_trans_destroy(trans
);
8340 list_del_rcu(&trans
->ctx
.table
->list
);
8343 case NFT_MSG_DELTABLE
:
8344 nft_clear(trans
->ctx
.net
, trans
->ctx
.table
);
8345 nft_trans_destroy(trans
);
8347 case NFT_MSG_NEWCHAIN
:
8348 if (nft_trans_chain_update(trans
)) {
8349 free_percpu(nft_trans_chain_stats(trans
));
8350 kfree(nft_trans_chain_name(trans
));
8351 nft_trans_destroy(trans
);
8353 if (nft_chain_is_bound(trans
->ctx
.chain
)) {
8354 nft_trans_destroy(trans
);
8357 trans
->ctx
.table
->use
--;
8358 nft_chain_del(trans
->ctx
.chain
);
8359 nf_tables_unregister_hook(trans
->ctx
.net
,
8364 case NFT_MSG_DELCHAIN
:
8365 trans
->ctx
.table
->use
++;
8366 nft_clear(trans
->ctx
.net
, trans
->ctx
.chain
);
8367 nft_trans_destroy(trans
);
8369 case NFT_MSG_NEWRULE
:
8370 trans
->ctx
.chain
->use
--;
8371 list_del_rcu(&nft_trans_rule(trans
)->list
);
8372 nft_rule_expr_deactivate(&trans
->ctx
,
8373 nft_trans_rule(trans
),
8376 case NFT_MSG_DELRULE
:
8377 trans
->ctx
.chain
->use
++;
8378 nft_clear(trans
->ctx
.net
, nft_trans_rule(trans
));
8379 nft_rule_expr_activate(&trans
->ctx
, nft_trans_rule(trans
));
8380 nft_trans_destroy(trans
);
8382 case NFT_MSG_NEWSET
:
8383 trans
->ctx
.table
->use
--;
8384 if (nft_trans_set_bound(trans
)) {
8385 nft_trans_destroy(trans
);
8388 list_del_rcu(&nft_trans_set(trans
)->list
);
8390 case NFT_MSG_DELSET
:
8391 trans
->ctx
.table
->use
++;
8392 nft_clear(trans
->ctx
.net
, nft_trans_set(trans
));
8393 nft_trans_destroy(trans
);
8395 case NFT_MSG_NEWSETELEM
:
8396 if (nft_trans_elem_set_bound(trans
)) {
8397 nft_trans_destroy(trans
);
8400 te
= (struct nft_trans_elem
*)trans
->data
;
8401 te
->set
->ops
->remove(net
, te
->set
, &te
->elem
);
8402 atomic_dec(&te
->set
->nelems
);
8404 case NFT_MSG_DELSETELEM
:
8405 te
= (struct nft_trans_elem
*)trans
->data
;
8407 nft_set_elem_activate(net
, te
->set
, &te
->elem
);
8408 te
->set
->ops
->activate(net
, te
->set
, &te
->elem
);
8411 nft_trans_destroy(trans
);
8413 case NFT_MSG_NEWOBJ
:
8414 if (nft_trans_obj_update(trans
)) {
8415 kfree(nft_trans_obj_newobj(trans
));
8416 nft_trans_destroy(trans
);
8418 trans
->ctx
.table
->use
--;
8419 nft_obj_del(nft_trans_obj(trans
));
8422 case NFT_MSG_DELOBJ
:
8423 trans
->ctx
.table
->use
++;
8424 nft_clear(trans
->ctx
.net
, nft_trans_obj(trans
));
8425 nft_trans_destroy(trans
);
8427 case NFT_MSG_NEWFLOWTABLE
:
8428 if (nft_trans_flowtable_update(trans
)) {
8429 nft_unregister_flowtable_net_hooks(net
,
8430 &nft_trans_flowtable_hooks(trans
));
8432 trans
->ctx
.table
->use
--;
8433 list_del_rcu(&nft_trans_flowtable(trans
)->list
);
8434 nft_unregister_flowtable_net_hooks(net
,
8435 &nft_trans_flowtable(trans
)->hook_list
);
8438 case NFT_MSG_DELFLOWTABLE
:
8439 if (nft_trans_flowtable_update(trans
)) {
8440 list_for_each_entry(hook
, &nft_trans_flowtable(trans
)->hook_list
, list
)
8441 hook
->inactive
= false;
8443 trans
->ctx
.table
->use
++;
8444 nft_clear(trans
->ctx
.net
, nft_trans_flowtable(trans
));
8446 nft_trans_destroy(trans
);
8453 list_for_each_entry_safe_reverse(trans
, next
,
8454 &net
->nft
.commit_list
, list
) {
8455 list_del(&trans
->list
);
8456 nf_tables_abort_release(trans
);
8459 if (action
== NFNL_ABORT_AUTOLOAD
)
8460 nf_tables_module_autoload(net
);
8462 nf_tables_module_autoload_cleanup(net
);
8467 static void nf_tables_cleanup(struct net
*net
)
8469 nft_validate_state_update(net
, NFT_VALIDATE_SKIP
);
8472 static int nf_tables_abort(struct net
*net
, struct sk_buff
*skb
,
8473 enum nfnl_abort_action action
)
8475 int ret
= __nf_tables_abort(net
, action
);
8477 mutex_unlock(&net
->nft
.commit_mutex
);
8482 static bool nf_tables_valid_genid(struct net
*net
, u32 genid
)
8486 mutex_lock(&net
->nft
.commit_mutex
);
8488 genid_ok
= genid
== 0 || net
->nft
.base_seq
== genid
;
8490 mutex_unlock(&net
->nft
.commit_mutex
);
8492 /* else, commit mutex has to be released by commit or abort function */
8496 static const struct nfnetlink_subsystem nf_tables_subsys
= {
8497 .name
= "nf_tables",
8498 .subsys_id
= NFNL_SUBSYS_NFTABLES
,
8499 .cb_count
= NFT_MSG_MAX
,
8501 .commit
= nf_tables_commit
,
8502 .abort
= nf_tables_abort
,
8503 .cleanup
= nf_tables_cleanup
,
8504 .valid_genid
= nf_tables_valid_genid
,
8505 .owner
= THIS_MODULE
,
8508 int nft_chain_validate_dependency(const struct nft_chain
*chain
,
8509 enum nft_chain_types type
)
8511 const struct nft_base_chain
*basechain
;
8513 if (nft_is_base_chain(chain
)) {
8514 basechain
= nft_base_chain(chain
);
8515 if (basechain
->type
->type
!= type
)
8520 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency
);
8522 int nft_chain_validate_hooks(const struct nft_chain
*chain
,
8523 unsigned int hook_flags
)
8525 struct nft_base_chain
*basechain
;
8527 if (nft_is_base_chain(chain
)) {
8528 basechain
= nft_base_chain(chain
);
8530 if ((1 << basechain
->ops
.hooknum
) & hook_flags
)
8538 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks
);
8541 * Loop detection - walk through the ruleset beginning at the destination chain
8542 * of a new jump until either the source chain is reached (loop) or all
8543 * reachable chains have been traversed.
8545 * The loop check is performed whenever a new jump verdict is added to an
8546 * expression or verdict map or a verdict map is bound to a new chain.
8549 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
8550 const struct nft_chain
*chain
);
8552 static int nf_tables_loop_check_setelem(const struct nft_ctx
*ctx
,
8553 struct nft_set
*set
,
8554 const struct nft_set_iter
*iter
,
8555 struct nft_set_elem
*elem
)
8557 const struct nft_set_ext
*ext
= nft_set_elem_ext(set
, elem
->priv
);
8558 const struct nft_data
*data
;
8560 if (nft_set_ext_exists(ext
, NFT_SET_EXT_FLAGS
) &&
8561 *nft_set_ext_flags(ext
) & NFT_SET_ELEM_INTERVAL_END
)
8564 data
= nft_set_ext_data(ext
);
8565 switch (data
->verdict
.code
) {
8568 return nf_tables_check_loops(ctx
, data
->verdict
.chain
);
8574 static int nf_tables_check_loops(const struct nft_ctx
*ctx
,
8575 const struct nft_chain
*chain
)
8577 const struct nft_rule
*rule
;
8578 const struct nft_expr
*expr
, *last
;
8579 struct nft_set
*set
;
8580 struct nft_set_binding
*binding
;
8581 struct nft_set_iter iter
;
8583 if (ctx
->chain
== chain
)
8586 list_for_each_entry(rule
, &chain
->rules
, list
) {
8587 nft_rule_for_each_expr(expr
, last
, rule
) {
8588 struct nft_immediate_expr
*priv
;
8589 const struct nft_data
*data
;
8592 if (strcmp(expr
->ops
->type
->name
, "immediate"))
8595 priv
= nft_expr_priv(expr
);
8596 if (priv
->dreg
!= NFT_REG_VERDICT
)
8600 switch (data
->verdict
.code
) {
8603 err
= nf_tables_check_loops(ctx
,
8604 data
->verdict
.chain
);
8614 list_for_each_entry(set
, &ctx
->table
->sets
, list
) {
8615 if (!nft_is_active_next(ctx
->net
, set
))
8617 if (!(set
->flags
& NFT_SET_MAP
) ||
8618 set
->dtype
!= NFT_DATA_VERDICT
)
8621 list_for_each_entry(binding
, &set
->bindings
, list
) {
8622 if (!(binding
->flags
& NFT_SET_MAP
) ||
8623 binding
->chain
!= chain
)
8626 iter
.genmask
= nft_genmask_next(ctx
->net
);
8630 iter
.fn
= nf_tables_loop_check_setelem
;
8632 set
->ops
->walk(ctx
, set
, &iter
);
8642 * nft_parse_u32_check - fetch u32 attribute and check for maximum value
8644 * @attr: netlink attribute to fetch value from
8645 * @max: maximum value to be stored in dest
8646 * @dest: pointer to the variable
8648 * Parse, check and store a given u32 netlink attribute into variable.
8649 * This function returns -ERANGE if the value goes over maximum value.
8650 * Otherwise a 0 is returned and the attribute value is stored in the
8651 * destination variable.
8653 int nft_parse_u32_check(const struct nlattr
*attr
, int max
, u32
*dest
)
8657 val
= ntohl(nla_get_be32(attr
));
8664 EXPORT_SYMBOL_GPL(nft_parse_u32_check
);
8667 * nft_parse_register - parse a register value from a netlink attribute
8669 * @attr: netlink attribute
8671 * Parse and translate a register value from a netlink attribute.
8672 * Registers used to be 128 bit wide, these register numbers will be
8673 * mapped to the corresponding 32 bit register numbers.
8675 static unsigned int nft_parse_register(const struct nlattr
*attr
)
8679 reg
= ntohl(nla_get_be32(attr
));
8681 case NFT_REG_VERDICT
...NFT_REG_4
:
8682 return reg
* NFT_REG_SIZE
/ NFT_REG32_SIZE
;
8684 return reg
+ NFT_REG_SIZE
/ NFT_REG32_SIZE
- NFT_REG32_00
;
8689 * nft_dump_register - dump a register value to a netlink attribute
8691 * @skb: socket buffer
8692 * @attr: attribute number
8693 * @reg: register number
8695 * Construct a netlink attribute containing the register number. For
8696 * compatibility reasons, register numbers being a multiple of 4 are
8697 * translated to the corresponding 128 bit register numbers.
8699 int nft_dump_register(struct sk_buff
*skb
, unsigned int attr
, unsigned int reg
)
8701 if (reg
% (NFT_REG_SIZE
/ NFT_REG32_SIZE
) == 0)
8702 reg
= reg
/ (NFT_REG_SIZE
/ NFT_REG32_SIZE
);
8704 reg
= reg
- NFT_REG_SIZE
/ NFT_REG32_SIZE
+ NFT_REG32_00
;
8706 return nla_put_be32(skb
, attr
, htonl(reg
));
8708 EXPORT_SYMBOL_GPL(nft_dump_register
);
8711 * nft_validate_register_load - validate a load from a register
8713 * @reg: the register number
8714 * @len: the length of the data
8716 * Validate that the input register is one of the general purpose
8717 * registers and that the length of the load is within the bounds.
8719 static int nft_validate_register_load(enum nft_registers reg
, unsigned int len
)
8721 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
8725 if (reg
* NFT_REG32_SIZE
+ len
> sizeof_field(struct nft_regs
, data
))
8731 int nft_parse_register_load(const struct nlattr
*attr
, u8
*sreg
, u32 len
)
8736 reg
= nft_parse_register(attr
);
8737 err
= nft_validate_register_load(reg
, len
);
8744 EXPORT_SYMBOL_GPL(nft_parse_register_load
);
8747 * nft_validate_register_store - validate an expressions' register store
8749 * @ctx: context of the expression performing the load
8750 * @reg: the destination register number
8751 * @data: the data to load
8752 * @type: the data type
8753 * @len: the length of the data
8755 * Validate that a data load uses the appropriate data type for
8756 * the destination register and the length is within the bounds.
8757 * A value of NULL for the data means that its runtime gathered
8760 static int nft_validate_register_store(const struct nft_ctx
*ctx
,
8761 enum nft_registers reg
,
8762 const struct nft_data
*data
,
8763 enum nft_data_types type
,
8769 case NFT_REG_VERDICT
:
8770 if (type
!= NFT_DATA_VERDICT
)
8774 (data
->verdict
.code
== NFT_GOTO
||
8775 data
->verdict
.code
== NFT_JUMP
)) {
8776 err
= nf_tables_check_loops(ctx
, data
->verdict
.chain
);
8783 if (reg
< NFT_REG_1
* NFT_REG_SIZE
/ NFT_REG32_SIZE
)
8787 if (reg
* NFT_REG32_SIZE
+ len
>
8788 sizeof_field(struct nft_regs
, data
))
8791 if (data
!= NULL
&& type
!= NFT_DATA_VALUE
)
8797 int nft_parse_register_store(const struct nft_ctx
*ctx
,
8798 const struct nlattr
*attr
, u8
*dreg
,
8799 const struct nft_data
*data
,
8800 enum nft_data_types type
, unsigned int len
)
8805 reg
= nft_parse_register(attr
);
8806 err
= nft_validate_register_store(ctx
, reg
, data
, type
, len
);
8813 EXPORT_SYMBOL_GPL(nft_parse_register_store
);
8815 static const struct nla_policy nft_verdict_policy
[NFTA_VERDICT_MAX
+ 1] = {
8816 [NFTA_VERDICT_CODE
] = { .type
= NLA_U32
},
8817 [NFTA_VERDICT_CHAIN
] = { .type
= NLA_STRING
,
8818 .len
= NFT_CHAIN_MAXNAMELEN
- 1 },
8819 [NFTA_VERDICT_CHAIN_ID
] = { .type
= NLA_U32
},
8822 static int nft_verdict_init(const struct nft_ctx
*ctx
, struct nft_data
*data
,
8823 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8825 u8 genmask
= nft_genmask_next(ctx
->net
);
8826 struct nlattr
*tb
[NFTA_VERDICT_MAX
+ 1];
8827 struct nft_chain
*chain
;
8830 err
= nla_parse_nested_deprecated(tb
, NFTA_VERDICT_MAX
, nla
,
8831 nft_verdict_policy
, NULL
);
8835 if (!tb
[NFTA_VERDICT_CODE
])
8837 data
->verdict
.code
= ntohl(nla_get_be32(tb
[NFTA_VERDICT_CODE
]));
8839 switch (data
->verdict
.code
) {
8841 switch (data
->verdict
.code
& NF_VERDICT_MASK
) {
8856 if (tb
[NFTA_VERDICT_CHAIN
]) {
8857 chain
= nft_chain_lookup(ctx
->net
, ctx
->table
,
8858 tb
[NFTA_VERDICT_CHAIN
],
8860 } else if (tb
[NFTA_VERDICT_CHAIN_ID
]) {
8861 chain
= nft_chain_lookup_byid(ctx
->net
,
8862 tb
[NFTA_VERDICT_CHAIN_ID
]);
8864 return PTR_ERR(chain
);
8870 return PTR_ERR(chain
);
8871 if (nft_is_base_chain(chain
))
8875 data
->verdict
.chain
= chain
;
8879 desc
->len
= sizeof(data
->verdict
);
8880 desc
->type
= NFT_DATA_VERDICT
;
8884 static void nft_verdict_uninit(const struct nft_data
*data
)
8886 struct nft_chain
*chain
;
8887 struct nft_rule
*rule
;
8889 switch (data
->verdict
.code
) {
8892 chain
= data
->verdict
.chain
;
8895 if (!nft_chain_is_bound(chain
))
8898 chain
->table
->use
--;
8899 list_for_each_entry(rule
, &chain
->rules
, list
)
8902 nft_chain_del(chain
);
8907 int nft_verdict_dump(struct sk_buff
*skb
, int type
, const struct nft_verdict
*v
)
8909 struct nlattr
*nest
;
8911 nest
= nla_nest_start_noflag(skb
, type
);
8913 goto nla_put_failure
;
8915 if (nla_put_be32(skb
, NFTA_VERDICT_CODE
, htonl(v
->code
)))
8916 goto nla_put_failure
;
8921 if (nla_put_string(skb
, NFTA_VERDICT_CHAIN
,
8923 goto nla_put_failure
;
8925 nla_nest_end(skb
, nest
);
8932 static int nft_value_init(const struct nft_ctx
*ctx
,
8933 struct nft_data
*data
, unsigned int size
,
8934 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8944 nla_memcpy(data
->data
, nla
, len
);
8945 desc
->type
= NFT_DATA_VALUE
;
8950 static int nft_value_dump(struct sk_buff
*skb
, const struct nft_data
*data
,
8953 return nla_put(skb
, NFTA_DATA_VALUE
, len
, data
->data
);
8956 static const struct nla_policy nft_data_policy
[NFTA_DATA_MAX
+ 1] = {
8957 [NFTA_DATA_VALUE
] = { .type
= NLA_BINARY
},
8958 [NFTA_DATA_VERDICT
] = { .type
= NLA_NESTED
},
8962 * nft_data_init - parse nf_tables data netlink attributes
8964 * @ctx: context of the expression using the data
8965 * @data: destination struct nft_data
8966 * @size: maximum data length
8967 * @desc: data description
8968 * @nla: netlink attribute containing data
8970 * Parse the netlink data attributes and initialize a struct nft_data.
8971 * The type and length of data are returned in the data description.
8973 * The caller can indicate that it only wants to accept data of type
8974 * NFT_DATA_VALUE by passing NULL for the ctx argument.
8976 int nft_data_init(const struct nft_ctx
*ctx
,
8977 struct nft_data
*data
, unsigned int size
,
8978 struct nft_data_desc
*desc
, const struct nlattr
*nla
)
8980 struct nlattr
*tb
[NFTA_DATA_MAX
+ 1];
8983 err
= nla_parse_nested_deprecated(tb
, NFTA_DATA_MAX
, nla
,
8984 nft_data_policy
, NULL
);
8988 if (tb
[NFTA_DATA_VALUE
])
8989 return nft_value_init(ctx
, data
, size
, desc
,
8990 tb
[NFTA_DATA_VALUE
]);
8991 if (tb
[NFTA_DATA_VERDICT
] && ctx
!= NULL
)
8992 return nft_verdict_init(ctx
, data
, desc
, tb
[NFTA_DATA_VERDICT
]);
8995 EXPORT_SYMBOL_GPL(nft_data_init
);
8998 * nft_data_release - release a nft_data item
9000 * @data: struct nft_data to release
9001 * @type: type of data
9003 * Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
9004 * all others need to be released by calling this function.
9006 void nft_data_release(const struct nft_data
*data
, enum nft_data_types type
)
9008 if (type
< NFT_DATA_VERDICT
)
9011 case NFT_DATA_VERDICT
:
9012 return nft_verdict_uninit(data
);
9017 EXPORT_SYMBOL_GPL(nft_data_release
);
9019 int nft_data_dump(struct sk_buff
*skb
, int attr
, const struct nft_data
*data
,
9020 enum nft_data_types type
, unsigned int len
)
9022 struct nlattr
*nest
;
9025 nest
= nla_nest_start_noflag(skb
, attr
);
9030 case NFT_DATA_VALUE
:
9031 err
= nft_value_dump(skb
, data
, len
);
9033 case NFT_DATA_VERDICT
:
9034 err
= nft_verdict_dump(skb
, NFTA_DATA_VERDICT
, &data
->verdict
);
9041 nla_nest_end(skb
, nest
);
9044 EXPORT_SYMBOL_GPL(nft_data_dump
);
9046 int __nft_release_basechain(struct nft_ctx
*ctx
)
9048 struct nft_rule
*rule
, *nr
;
9050 if (WARN_ON(!nft_is_base_chain(ctx
->chain
)))
9053 nf_tables_unregister_hook(ctx
->net
, ctx
->chain
->table
, ctx
->chain
);
9054 list_for_each_entry_safe(rule
, nr
, &ctx
->chain
->rules
, list
) {
9055 list_del(&rule
->list
);
9057 nf_tables_rule_release(ctx
, rule
);
9059 nft_chain_del(ctx
->chain
);
9061 nf_tables_chain_destroy(ctx
);
9065 EXPORT_SYMBOL_GPL(__nft_release_basechain
);
9067 static void __nft_release_hook(struct net
*net
, struct nft_table
*table
)
9069 struct nft_chain
*chain
;
9071 list_for_each_entry(chain
, &table
->chains
, list
)
9072 nf_tables_unregister_hook(net
, table
, chain
);
9075 static void __nft_release_hooks(struct net
*net
)
9077 struct nft_table
*table
;
9079 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
9080 if (nft_table_has_owner(table
))
9083 __nft_release_hook(net
, table
);
9087 static void __nft_release_table(struct net
*net
, struct nft_table
*table
)
9089 struct nft_flowtable
*flowtable
, *nf
;
9090 struct nft_chain
*chain
, *nc
;
9091 struct nft_object
*obj
, *ne
;
9092 struct nft_rule
*rule
, *nr
;
9093 struct nft_set
*set
, *ns
;
9094 struct nft_ctx ctx
= {
9096 .family
= NFPROTO_NETDEV
,
9099 ctx
.family
= table
->family
;
9101 list_for_each_entry(chain
, &table
->chains
, list
) {
9103 list_for_each_entry_safe(rule
, nr
, &chain
->rules
, list
) {
9104 list_del(&rule
->list
);
9106 nf_tables_rule_release(&ctx
, rule
);
9109 list_for_each_entry_safe(flowtable
, nf
, &table
->flowtables
, list
) {
9110 list_del(&flowtable
->list
);
9112 nf_tables_flowtable_destroy(flowtable
);
9114 list_for_each_entry_safe(set
, ns
, &table
->sets
, list
) {
9115 list_del(&set
->list
);
9117 nft_set_destroy(&ctx
, set
);
9119 list_for_each_entry_safe(obj
, ne
, &table
->objects
, list
) {
9122 nft_obj_destroy(&ctx
, obj
);
9124 list_for_each_entry_safe(chain
, nc
, &table
->chains
, list
) {
9126 nft_chain_del(chain
);
9128 nf_tables_chain_destroy(&ctx
);
9130 list_del(&table
->list
);
9131 nf_tables_table_destroy(&ctx
);
9134 static void __nft_release_tables(struct net
*net
)
9136 struct nft_table
*table
, *nt
;
9138 list_for_each_entry_safe(table
, nt
, &net
->nft
.tables
, list
) {
9139 if (nft_table_has_owner(table
))
9142 __nft_release_table(net
, table
);
9146 static int nft_rcv_nl_event(struct notifier_block
*this, unsigned long event
,
9149 struct netlink_notify
*n
= ptr
;
9150 struct nft_table
*table
, *nt
;
9151 struct net
*net
= n
->net
;
9152 bool release
= false;
9154 if (event
!= NETLINK_URELEASE
|| n
->protocol
!= NETLINK_NETFILTER
)
9157 mutex_lock(&net
->nft
.commit_mutex
);
9158 list_for_each_entry(table
, &net
->nft
.tables
, list
) {
9159 if (nft_table_has_owner(table
) &&
9160 n
->portid
== table
->nlpid
) {
9161 __nft_release_hook(net
, table
);
9167 list_for_each_entry_safe(table
, nt
, &net
->nft
.tables
, list
) {
9168 if (nft_table_has_owner(table
) &&
9169 n
->portid
== table
->nlpid
)
9170 __nft_release_table(net
, table
);
9173 mutex_unlock(&net
->nft
.commit_mutex
);
9178 static struct notifier_block nft_nl_notifier
= {
9179 .notifier_call
= nft_rcv_nl_event
,
9182 static int __net_init
nf_tables_init_net(struct net
*net
)
9184 INIT_LIST_HEAD(&net
->nft
.tables
);
9185 INIT_LIST_HEAD(&net
->nft
.commit_list
);
9186 INIT_LIST_HEAD(&net
->nft
.module_list
);
9187 INIT_LIST_HEAD(&net
->nft
.notify_list
);
9188 mutex_init(&net
->nft
.commit_mutex
);
9189 net
->nft
.base_seq
= 1;
9190 net
->nft
.validate_state
= NFT_VALIDATE_SKIP
;
9195 static void __net_exit
nf_tables_pre_exit_net(struct net
*net
)
9197 __nft_release_hooks(net
);
9200 static void __net_exit
nf_tables_exit_net(struct net
*net
)
9202 mutex_lock(&net
->nft
.commit_mutex
);
9203 if (!list_empty(&net
->nft
.commit_list
))
9204 __nf_tables_abort(net
, NFNL_ABORT_NONE
);
9205 __nft_release_tables(net
);
9206 mutex_unlock(&net
->nft
.commit_mutex
);
9207 WARN_ON_ONCE(!list_empty(&net
->nft
.tables
));
9208 WARN_ON_ONCE(!list_empty(&net
->nft
.module_list
));
9209 WARN_ON_ONCE(!list_empty(&net
->nft
.notify_list
));
9212 static struct pernet_operations nf_tables_net_ops
= {
9213 .init
= nf_tables_init_net
,
9214 .pre_exit
= nf_tables_pre_exit_net
,
9215 .exit
= nf_tables_exit_net
,
9218 static int __init
nf_tables_module_init(void)
9222 err
= register_pernet_subsys(&nf_tables_net_ops
);
9226 err
= nft_chain_filter_init();
9228 goto err_chain_filter
;
9230 err
= nf_tables_core_module_init();
9232 goto err_core_module
;
9234 err
= register_netdevice_notifier(&nf_tables_flowtable_notifier
);
9236 goto err_netdev_notifier
;
9238 err
= rhltable_init(&nft_objname_ht
, &nft_objname_ht_params
);
9240 goto err_rht_objname
;
9242 err
= nft_offload_init();
9246 err
= netlink_register_notifier(&nft_nl_notifier
);
9248 goto err_netlink_notifier
;
9251 err
= nfnetlink_subsys_register(&nf_tables_subsys
);
9253 goto err_nfnl_subsys
;
9255 nft_chain_route_init();
9260 netlink_unregister_notifier(&nft_nl_notifier
);
9261 err_netlink_notifier
:
9264 rhltable_destroy(&nft_objname_ht
);
9266 unregister_netdevice_notifier(&nf_tables_flowtable_notifier
);
9267 err_netdev_notifier
:
9268 nf_tables_core_module_exit();
9270 nft_chain_filter_fini();
9272 unregister_pernet_subsys(&nf_tables_net_ops
);
9276 static void __exit
nf_tables_module_exit(void)
9278 nfnetlink_subsys_unregister(&nf_tables_subsys
);
9279 netlink_unregister_notifier(&nft_nl_notifier
);
9281 unregister_netdevice_notifier(&nf_tables_flowtable_notifier
);
9282 nft_chain_filter_fini();
9283 nft_chain_route_fini();
9284 unregister_pernet_subsys(&nf_tables_net_ops
);
9285 cancel_work_sync(&trans_destroy_work
);
9287 rhltable_destroy(&nft_objname_ht
);
9288 nf_tables_core_module_exit();
9291 module_init(nf_tables_module_init
);
9292 module_exit(nf_tables_module_exit
);
9294 MODULE_LICENSE("GPL");
9295 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
9296 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES
);