mirror of https://gitee.com/openkylin/linux.git
netfilter: nf_tables: simplify the basic expressions' init routine
Some basic expressions are built into nf_tables.ko, such as nft_cmp, nft_lookup, nft_range and so on. But these basic expressions' init routine is a little ugly, too many goto errX labels, and we forget to call nft_range_module_exit in the exit routine, although it is harmless. Acctually, the init and exit routines of these basic expressions are same, i.e. do nft_register_expr in the init routine and do nft_unregister_expr in the exit routine. So it's better to arrange them into an array and deal with them together. Signed-off-by: Liping Zhang <zlpnobody@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
f86dab3aa6
commit
4e24877e61
|
@ -1,12 +1,18 @@
|
||||||
#ifndef _NET_NF_TABLES_CORE_H
|
#ifndef _NET_NF_TABLES_CORE_H
|
||||||
#define _NET_NF_TABLES_CORE_H
|
#define _NET_NF_TABLES_CORE_H
|
||||||
|
|
||||||
|
extern struct nft_expr_type nft_imm_type;
|
||||||
|
extern struct nft_expr_type nft_cmp_type;
|
||||||
|
extern struct nft_expr_type nft_lookup_type;
|
||||||
|
extern struct nft_expr_type nft_bitwise_type;
|
||||||
|
extern struct nft_expr_type nft_byteorder_type;
|
||||||
|
extern struct nft_expr_type nft_payload_type;
|
||||||
|
extern struct nft_expr_type nft_dynset_type;
|
||||||
|
extern struct nft_expr_type nft_range_type;
|
||||||
|
|
||||||
int nf_tables_core_module_init(void);
|
int nf_tables_core_module_init(void);
|
||||||
void nf_tables_core_module_exit(void);
|
void nf_tables_core_module_exit(void);
|
||||||
|
|
||||||
int nft_immediate_module_init(void);
|
|
||||||
void nft_immediate_module_exit(void);
|
|
||||||
|
|
||||||
struct nft_cmp_fast_expr {
|
struct nft_cmp_fast_expr {
|
||||||
u32 data;
|
u32 data;
|
||||||
enum nft_registers sreg:8;
|
enum nft_registers sreg:8;
|
||||||
|
@ -25,24 +31,6 @@ static inline u32 nft_cmp_fast_mask(unsigned int len)
|
||||||
|
|
||||||
extern const struct nft_expr_ops nft_cmp_fast_ops;
|
extern const struct nft_expr_ops nft_cmp_fast_ops;
|
||||||
|
|
||||||
int nft_cmp_module_init(void);
|
|
||||||
void nft_cmp_module_exit(void);
|
|
||||||
|
|
||||||
int nft_range_module_init(void);
|
|
||||||
void nft_range_module_exit(void);
|
|
||||||
|
|
||||||
int nft_lookup_module_init(void);
|
|
||||||
void nft_lookup_module_exit(void);
|
|
||||||
|
|
||||||
int nft_dynset_module_init(void);
|
|
||||||
void nft_dynset_module_exit(void);
|
|
||||||
|
|
||||||
int nft_bitwise_module_init(void);
|
|
||||||
void nft_bitwise_module_exit(void);
|
|
||||||
|
|
||||||
int nft_byteorder_module_init(void);
|
|
||||||
void nft_byteorder_module_exit(void);
|
|
||||||
|
|
||||||
struct nft_payload {
|
struct nft_payload {
|
||||||
enum nft_payload_bases base:8;
|
enum nft_payload_bases base:8;
|
||||||
u8 offset;
|
u8 offset;
|
||||||
|
@ -62,7 +50,4 @@ struct nft_payload_set {
|
||||||
extern const struct nft_expr_ops nft_payload_fast_ops;
|
extern const struct nft_expr_ops nft_payload_fast_ops;
|
||||||
extern struct static_key_false nft_trace_enabled;
|
extern struct static_key_false nft_trace_enabled;
|
||||||
|
|
||||||
int nft_payload_module_init(void);
|
|
||||||
void nft_payload_module_exit(void);
|
|
||||||
|
|
||||||
#endif /* _NET_NF_TABLES_CORE_H */
|
#endif /* _NET_NF_TABLES_CORE_H */
|
||||||
|
|
|
@ -232,68 +232,40 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(nft_do_chain);
|
EXPORT_SYMBOL_GPL(nft_do_chain);
|
||||||
|
|
||||||
|
static struct nft_expr_type *nft_basic_types[] = {
|
||||||
|
&nft_imm_type,
|
||||||
|
&nft_cmp_type,
|
||||||
|
&nft_lookup_type,
|
||||||
|
&nft_bitwise_type,
|
||||||
|
&nft_byteorder_type,
|
||||||
|
&nft_payload_type,
|
||||||
|
&nft_dynset_type,
|
||||||
|
&nft_range_type,
|
||||||
|
};
|
||||||
|
|
||||||
int __init nf_tables_core_module_init(void)
|
int __init nf_tables_core_module_init(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err, i;
|
||||||
|
|
||||||
err = nft_immediate_module_init();
|
for (i = 0; i < ARRAY_SIZE(nft_basic_types); i++) {
|
||||||
if (err < 0)
|
err = nft_register_expr(nft_basic_types[i]);
|
||||||
goto err1;
|
if (err)
|
||||||
|
goto err;
|
||||||
err = nft_cmp_module_init();
|
}
|
||||||
if (err < 0)
|
|
||||||
goto err2;
|
|
||||||
|
|
||||||
err = nft_lookup_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err3;
|
|
||||||
|
|
||||||
err = nft_bitwise_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err4;
|
|
||||||
|
|
||||||
err = nft_byteorder_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err5;
|
|
||||||
|
|
||||||
err = nft_payload_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err6;
|
|
||||||
|
|
||||||
err = nft_dynset_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err7;
|
|
||||||
|
|
||||||
err = nft_range_module_init();
|
|
||||||
if (err < 0)
|
|
||||||
goto err8;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err8:
|
|
||||||
nft_dynset_module_exit();
|
err:
|
||||||
err7:
|
while (i-- > 0)
|
||||||
nft_payload_module_exit();
|
nft_unregister_expr(nft_basic_types[i]);
|
||||||
err6:
|
|
||||||
nft_byteorder_module_exit();
|
|
||||||
err5:
|
|
||||||
nft_bitwise_module_exit();
|
|
||||||
err4:
|
|
||||||
nft_lookup_module_exit();
|
|
||||||
err3:
|
|
||||||
nft_cmp_module_exit();
|
|
||||||
err2:
|
|
||||||
nft_immediate_module_exit();
|
|
||||||
err1:
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nf_tables_core_module_exit(void)
|
void nf_tables_core_module_exit(void)
|
||||||
{
|
{
|
||||||
nft_dynset_module_exit();
|
int i;
|
||||||
nft_payload_module_exit();
|
|
||||||
nft_byteorder_module_exit();
|
i = ARRAY_SIZE(nft_basic_types);
|
||||||
nft_bitwise_module_exit();
|
while (i-- > 0)
|
||||||
nft_lookup_module_exit();
|
nft_unregister_expr(nft_basic_types[i]);
|
||||||
nft_cmp_module_exit();
|
|
||||||
nft_immediate_module_exit();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,6 @@ static int nft_bitwise_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_bitwise_type;
|
|
||||||
static const struct nft_expr_ops nft_bitwise_ops = {
|
static const struct nft_expr_ops nft_bitwise_ops = {
|
||||||
.type = &nft_bitwise_type,
|
.type = &nft_bitwise_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_bitwise)),
|
||||||
|
@ -130,20 +129,10 @@ static const struct nft_expr_ops nft_bitwise_ops = {
|
||||||
.dump = nft_bitwise_dump,
|
.dump = nft_bitwise_dump,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_bitwise_type __read_mostly = {
|
struct nft_expr_type nft_bitwise_type __read_mostly = {
|
||||||
.name = "bitwise",
|
.name = "bitwise",
|
||||||
.ops = &nft_bitwise_ops,
|
.ops = &nft_bitwise_ops,
|
||||||
.policy = nft_bitwise_policy,
|
.policy = nft_bitwise_policy,
|
||||||
.maxattr = NFTA_BITWISE_MAX,
|
.maxattr = NFTA_BITWISE_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_bitwise_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_bitwise_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_bitwise_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_bitwise_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -169,7 +169,6 @@ static int nft_byteorder_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_byteorder_type;
|
|
||||||
static const struct nft_expr_ops nft_byteorder_ops = {
|
static const struct nft_expr_ops nft_byteorder_ops = {
|
||||||
.type = &nft_byteorder_type,
|
.type = &nft_byteorder_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_byteorder)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_byteorder)),
|
||||||
|
@ -178,20 +177,10 @@ static const struct nft_expr_ops nft_byteorder_ops = {
|
||||||
.dump = nft_byteorder_dump,
|
.dump = nft_byteorder_dump,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_byteorder_type __read_mostly = {
|
struct nft_expr_type nft_byteorder_type __read_mostly = {
|
||||||
.name = "byteorder",
|
.name = "byteorder",
|
||||||
.ops = &nft_byteorder_ops,
|
.ops = &nft_byteorder_ops,
|
||||||
.policy = nft_byteorder_policy,
|
.policy = nft_byteorder_policy,
|
||||||
.maxattr = NFTA_BYTEORDER_MAX,
|
.maxattr = NFTA_BYTEORDER_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_byteorder_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_byteorder_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_byteorder_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_byteorder_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -107,7 +107,6 @@ static int nft_cmp_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_cmp_type;
|
|
||||||
static const struct nft_expr_ops nft_cmp_ops = {
|
static const struct nft_expr_ops nft_cmp_ops = {
|
||||||
.type = &nft_cmp_type,
|
.type = &nft_cmp_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_cmp_expr)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_cmp_expr)),
|
||||||
|
@ -208,20 +207,10 @@ nft_cmp_select_ops(const struct nft_ctx *ctx, const struct nlattr * const tb[])
|
||||||
return &nft_cmp_ops;
|
return &nft_cmp_ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_cmp_type __read_mostly = {
|
struct nft_expr_type nft_cmp_type __read_mostly = {
|
||||||
.name = "cmp",
|
.name = "cmp",
|
||||||
.select_ops = nft_cmp_select_ops,
|
.select_ops = nft_cmp_select_ops,
|
||||||
.policy = nft_cmp_policy,
|
.policy = nft_cmp_policy,
|
||||||
.maxattr = NFTA_CMP_MAX,
|
.maxattr = NFTA_CMP_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_cmp_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_cmp_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_cmp_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_cmp_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -261,7 +261,6 @@ static int nft_dynset_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_dynset_type;
|
|
||||||
static const struct nft_expr_ops nft_dynset_ops = {
|
static const struct nft_expr_ops nft_dynset_ops = {
|
||||||
.type = &nft_dynset_type,
|
.type = &nft_dynset_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_dynset)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_dynset)),
|
||||||
|
@ -271,20 +270,10 @@ static const struct nft_expr_ops nft_dynset_ops = {
|
||||||
.dump = nft_dynset_dump,
|
.dump = nft_dynset_dump,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_dynset_type __read_mostly = {
|
struct nft_expr_type nft_dynset_type __read_mostly = {
|
||||||
.name = "dynset",
|
.name = "dynset",
|
||||||
.ops = &nft_dynset_ops,
|
.ops = &nft_dynset_ops,
|
||||||
.policy = nft_dynset_policy,
|
.policy = nft_dynset_policy,
|
||||||
.maxattr = NFTA_DYNSET_MAX,
|
.maxattr = NFTA_DYNSET_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_dynset_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_dynset_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_dynset_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_dynset_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -102,7 +102,6 @@ static int nft_immediate_validate(const struct nft_ctx *ctx,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_imm_type;
|
|
||||||
static const struct nft_expr_ops nft_imm_ops = {
|
static const struct nft_expr_ops nft_imm_ops = {
|
||||||
.type = &nft_imm_type,
|
.type = &nft_imm_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_immediate_expr)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_immediate_expr)),
|
||||||
|
@ -113,20 +112,10 @@ static const struct nft_expr_ops nft_imm_ops = {
|
||||||
.validate = nft_immediate_validate,
|
.validate = nft_immediate_validate,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_imm_type __read_mostly = {
|
struct nft_expr_type nft_imm_type __read_mostly = {
|
||||||
.name = "immediate",
|
.name = "immediate",
|
||||||
.ops = &nft_imm_ops,
|
.ops = &nft_imm_ops,
|
||||||
.policy = nft_immediate_policy,
|
.policy = nft_immediate_policy,
|
||||||
.maxattr = NFTA_IMMEDIATE_MAX,
|
.maxattr = NFTA_IMMEDIATE_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_immediate_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_imm_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_immediate_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_imm_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -154,7 +154,6 @@ static int nft_lookup_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_lookup_type;
|
|
||||||
static const struct nft_expr_ops nft_lookup_ops = {
|
static const struct nft_expr_ops nft_lookup_ops = {
|
||||||
.type = &nft_lookup_type,
|
.type = &nft_lookup_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_lookup)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_lookup)),
|
||||||
|
@ -164,20 +163,10 @@ static const struct nft_expr_ops nft_lookup_ops = {
|
||||||
.dump = nft_lookup_dump,
|
.dump = nft_lookup_dump,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_lookup_type __read_mostly = {
|
struct nft_expr_type nft_lookup_type __read_mostly = {
|
||||||
.name = "lookup",
|
.name = "lookup",
|
||||||
.ops = &nft_lookup_ops,
|
.ops = &nft_lookup_ops,
|
||||||
.policy = nft_lookup_policy,
|
.policy = nft_lookup_policy,
|
||||||
.maxattr = NFTA_LOOKUP_MAX,
|
.maxattr = NFTA_LOOKUP_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_lookup_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_lookup_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_lookup_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_lookup_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -148,7 +148,6 @@ static int nft_payload_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_payload_type;
|
|
||||||
static const struct nft_expr_ops nft_payload_ops = {
|
static const struct nft_expr_ops nft_payload_ops = {
|
||||||
.type = &nft_payload_type,
|
.type = &nft_payload_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_payload)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_payload)),
|
||||||
|
@ -320,20 +319,10 @@ nft_payload_select_ops(const struct nft_ctx *ctx,
|
||||||
return &nft_payload_ops;
|
return &nft_payload_ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_payload_type __read_mostly = {
|
struct nft_expr_type nft_payload_type __read_mostly = {
|
||||||
.name = "payload",
|
.name = "payload",
|
||||||
.select_ops = nft_payload_select_ops,
|
.select_ops = nft_payload_select_ops,
|
||||||
.policy = nft_payload_policy,
|
.policy = nft_payload_policy,
|
||||||
.maxattr = NFTA_PAYLOAD_MAX,
|
.maxattr = NFTA_PAYLOAD_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_payload_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_payload_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_payload_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_payload_type);
|
|
||||||
}
|
|
||||||
|
|
|
@ -122,7 +122,6 @@ static int nft_range_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nft_expr_type nft_range_type;
|
|
||||||
static const struct nft_expr_ops nft_range_ops = {
|
static const struct nft_expr_ops nft_range_ops = {
|
||||||
.type = &nft_range_type,
|
.type = &nft_range_type,
|
||||||
.size = NFT_EXPR_SIZE(sizeof(struct nft_range_expr)),
|
.size = NFT_EXPR_SIZE(sizeof(struct nft_range_expr)),
|
||||||
|
@ -131,20 +130,10 @@ static const struct nft_expr_ops nft_range_ops = {
|
||||||
.dump = nft_range_dump,
|
.dump = nft_range_dump,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct nft_expr_type nft_range_type __read_mostly = {
|
struct nft_expr_type nft_range_type __read_mostly = {
|
||||||
.name = "range",
|
.name = "range",
|
||||||
.ops = &nft_range_ops,
|
.ops = &nft_range_ops,
|
||||||
.policy = nft_range_policy,
|
.policy = nft_range_policy,
|
||||||
.maxattr = NFTA_RANGE_MAX,
|
.maxattr = NFTA_RANGE_MAX,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init nft_range_module_init(void)
|
|
||||||
{
|
|
||||||
return nft_register_expr(&nft_range_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
void nft_range_module_exit(void)
|
|
||||||
{
|
|
||||||
nft_unregister_expr(&nft_range_type);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue