forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfilter: nft_reject: split up reject module into IPv4 and IPv6 spec…
…ifc parts Currently the nft_reject module depends on symbols from ipv6. This is wrong since no generic module should force IPv6 support to be loaded. Split up the module into AF-specific and a generic part. Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
- Loading branch information
Showing
9 changed files
with
187 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
#ifndef _NFT_REJECT_H_ | ||
#define _NFT_REJECT_H_ | ||
|
||
struct nft_reject { | ||
enum nft_reject_types type:8; | ||
u8 icmp_code; | ||
}; | ||
|
||
extern const struct nla_policy nft_reject_policy[]; | ||
|
||
int nft_reject_init(const struct nft_ctx *ctx, | ||
const struct nft_expr *expr, | ||
const struct nlattr * const tb[]); | ||
|
||
int nft_reject_dump(struct sk_buff *skb, const struct nft_expr *expr); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
/* | ||
* Copyright (c) 2008-2009 Patrick McHardy <[email protected]> | ||
* Copyright (c) 2013 Eric Leblond <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* Development of this code funded by Astaro AG (http://www.astaro.com/) | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/netlink.h> | ||
#include <linux/netfilter.h> | ||
#include <linux/netfilter/nf_tables.h> | ||
#include <net/netfilter/nf_tables.h> | ||
#include <net/icmp.h> | ||
#include <net/netfilter/ipv4/nf_reject.h> | ||
#include <net/netfilter/nft_reject.h> | ||
|
||
static void nft_reject_ipv4_eval(const struct nft_expr *expr, | ||
struct nft_data data[NFT_REG_MAX + 1], | ||
const struct nft_pktinfo *pkt) | ||
{ | ||
struct nft_reject *priv = nft_expr_priv(expr); | ||
|
||
switch (priv->type) { | ||
case NFT_REJECT_ICMP_UNREACH: | ||
nf_send_unreach(pkt->skb, priv->icmp_code); | ||
break; | ||
case NFT_REJECT_TCP_RST: | ||
nf_send_reset(pkt->skb, pkt->ops->hooknum); | ||
break; | ||
} | ||
|
||
data[NFT_REG_VERDICT].verdict = NF_DROP; | ||
} | ||
|
||
static struct nft_expr_type nft_reject_ipv4_type; | ||
static const struct nft_expr_ops nft_reject_ipv4_ops = { | ||
.type = &nft_reject_ipv4_type, | ||
.size = NFT_EXPR_SIZE(sizeof(struct nft_reject)), | ||
.eval = nft_reject_ipv4_eval, | ||
.init = nft_reject_init, | ||
.dump = nft_reject_dump, | ||
}; | ||
|
||
static struct nft_expr_type nft_reject_ipv4_type __read_mostly = { | ||
.family = NFPROTO_IPV4, | ||
.name = "reject", | ||
.ops = &nft_reject_ipv4_ops, | ||
.policy = nft_reject_policy, | ||
.maxattr = NFTA_REJECT_MAX, | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
static int __init nft_reject_ipv4_module_init(void) | ||
{ | ||
return nft_register_expr(&nft_reject_ipv4_type); | ||
} | ||
|
||
static void __exit nft_reject_ipv4_module_exit(void) | ||
{ | ||
nft_unregister_expr(&nft_reject_ipv4_type); | ||
} | ||
|
||
module_init(nft_reject_ipv4_module_init); | ||
module_exit(nft_reject_ipv4_module_exit); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Patrick McHardy <[email protected]>"); | ||
MODULE_ALIAS_NFT_AF_EXPR(AF_INET, "reject"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* Copyright (c) 2008-2009 Patrick McHardy <[email protected]> | ||
* Copyright (c) 2013 Eric Leblond <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
* | ||
* Development of this code funded by Astaro AG (http://www.astaro.com/) | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/netlink.h> | ||
#include <linux/netfilter.h> | ||
#include <linux/netfilter/nf_tables.h> | ||
#include <net/netfilter/nf_tables.h> | ||
#include <net/netfilter/nft_reject.h> | ||
#include <net/netfilter/ipv6/nf_reject.h> | ||
|
||
static void nft_reject_ipv6_eval(const struct nft_expr *expr, | ||
struct nft_data data[NFT_REG_MAX + 1], | ||
const struct nft_pktinfo *pkt) | ||
{ | ||
struct nft_reject *priv = nft_expr_priv(expr); | ||
struct net *net = dev_net((pkt->in != NULL) ? pkt->in : pkt->out); | ||
|
||
switch (priv->type) { | ||
case NFT_REJECT_ICMP_UNREACH: | ||
nf_send_unreach6(net, pkt->skb, priv->icmp_code, | ||
pkt->ops->hooknum); | ||
break; | ||
case NFT_REJECT_TCP_RST: | ||
nf_send_reset6(net, pkt->skb, pkt->ops->hooknum); | ||
break; | ||
} | ||
|
||
data[NFT_REG_VERDICT].verdict = NF_DROP; | ||
} | ||
|
||
static struct nft_expr_type nft_reject_ipv6_type; | ||
static const struct nft_expr_ops nft_reject_ipv6_ops = { | ||
.type = &nft_reject_ipv6_type, | ||
.size = NFT_EXPR_SIZE(sizeof(struct nft_reject)), | ||
.eval = nft_reject_ipv6_eval, | ||
.init = nft_reject_init, | ||
.dump = nft_reject_dump, | ||
}; | ||
|
||
static struct nft_expr_type nft_reject_ipv6_type __read_mostly = { | ||
.family = NFPROTO_IPV6, | ||
.name = "reject", | ||
.ops = &nft_reject_ipv6_ops, | ||
.policy = nft_reject_policy, | ||
.maxattr = NFTA_REJECT_MAX, | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
static int __init nft_reject_ipv6_module_init(void) | ||
{ | ||
return nft_register_expr(&nft_reject_ipv6_type); | ||
} | ||
|
||
static void __exit nft_reject_ipv6_module_exit(void) | ||
{ | ||
nft_unregister_expr(&nft_reject_ipv6_type); | ||
} | ||
|
||
module_init(nft_reject_ipv6_module_init); | ||
module_exit(nft_reject_ipv6_module_exit); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Patrick McHardy <[email protected]>"); | ||
MODULE_ALIAS_NFT_AF_EXPR(AF_INET6, "reject"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,65 +16,23 @@ | |
#include <linux/netfilter.h> | ||
#include <linux/netfilter/nf_tables.h> | ||
#include <net/netfilter/nf_tables.h> | ||
#include <net/icmp.h> | ||
#include <net/netfilter/ipv4/nf_reject.h> | ||
#include <net/netfilter/nft_reject.h> | ||
|
||
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6) | ||
#include <net/netfilter/ipv6/nf_reject.h> | ||
#endif | ||
|
||
struct nft_reject { | ||
enum nft_reject_types type:8; | ||
u8 icmp_code; | ||
u8 family; | ||
}; | ||
|
||
static void nft_reject_eval(const struct nft_expr *expr, | ||
struct nft_data data[NFT_REG_MAX + 1], | ||
const struct nft_pktinfo *pkt) | ||
{ | ||
struct nft_reject *priv = nft_expr_priv(expr); | ||
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6) | ||
struct net *net = dev_net((pkt->in != NULL) ? pkt->in : pkt->out); | ||
#endif | ||
switch (priv->type) { | ||
case NFT_REJECT_ICMP_UNREACH: | ||
if (priv->family == NFPROTO_IPV4) | ||
nf_send_unreach(pkt->skb, priv->icmp_code); | ||
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6) | ||
else if (priv->family == NFPROTO_IPV6) | ||
nf_send_unreach6(net, pkt->skb, priv->icmp_code, | ||
pkt->ops->hooknum); | ||
#endif | ||
break; | ||
case NFT_REJECT_TCP_RST: | ||
if (priv->family == NFPROTO_IPV4) | ||
nf_send_reset(pkt->skb, pkt->ops->hooknum); | ||
#if IS_ENABLED(CONFIG_NF_TABLES_IPV6) | ||
else if (priv->family == NFPROTO_IPV6) | ||
nf_send_reset6(net, pkt->skb, pkt->ops->hooknum); | ||
#endif | ||
break; | ||
} | ||
|
||
data[NFT_REG_VERDICT].verdict = NF_DROP; | ||
} | ||
|
||
static const struct nla_policy nft_reject_policy[NFTA_REJECT_MAX + 1] = { | ||
const struct nla_policy nft_reject_policy[NFTA_REJECT_MAX + 1] = { | ||
[NFTA_REJECT_TYPE] = { .type = NLA_U32 }, | ||
[NFTA_REJECT_ICMP_CODE] = { .type = NLA_U8 }, | ||
}; | ||
EXPORT_SYMBOL_GPL(nft_reject_policy); | ||
|
||
static int nft_reject_init(const struct nft_ctx *ctx, | ||
const struct nft_expr *expr, | ||
const struct nlattr * const tb[]) | ||
int nft_reject_init(const struct nft_ctx *ctx, | ||
const struct nft_expr *expr, | ||
const struct nlattr * const tb[]) | ||
{ | ||
struct nft_reject *priv = nft_expr_priv(expr); | ||
|
||
if (tb[NFTA_REJECT_TYPE] == NULL) | ||
return -EINVAL; | ||
|
||
priv->family = ctx->afi->family; | ||
priv->type = ntohl(nla_get_be32(tb[NFTA_REJECT_TYPE])); | ||
switch (priv->type) { | ||
case NFT_REJECT_ICMP_UNREACH: | ||
|
@@ -89,8 +47,9 @@ static int nft_reject_init(const struct nft_ctx *ctx, | |
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL_GPL(nft_reject_init); | ||
|
||
static int nft_reject_dump(struct sk_buff *skb, const struct nft_expr *expr) | ||
int nft_reject_dump(struct sk_buff *skb, const struct nft_expr *expr) | ||
{ | ||
const struct nft_reject *priv = nft_expr_priv(expr); | ||
|
||
|
@@ -109,37 +68,7 @@ static int nft_reject_dump(struct sk_buff *skb, const struct nft_expr *expr) | |
nla_put_failure: | ||
return -1; | ||
} | ||
|
||
static struct nft_expr_type nft_reject_type; | ||
static const struct nft_expr_ops nft_reject_ops = { | ||
.type = &nft_reject_type, | ||
.size = NFT_EXPR_SIZE(sizeof(struct nft_reject)), | ||
.eval = nft_reject_eval, | ||
.init = nft_reject_init, | ||
.dump = nft_reject_dump, | ||
}; | ||
|
||
static struct nft_expr_type nft_reject_type __read_mostly = { | ||
.name = "reject", | ||
.ops = &nft_reject_ops, | ||
.policy = nft_reject_policy, | ||
.maxattr = NFTA_REJECT_MAX, | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
static int __init nft_reject_module_init(void) | ||
{ | ||
return nft_register_expr(&nft_reject_type); | ||
} | ||
|
||
static void __exit nft_reject_module_exit(void) | ||
{ | ||
nft_unregister_expr(&nft_reject_type); | ||
} | ||
|
||
module_init(nft_reject_module_init); | ||
module_exit(nft_reject_module_exit); | ||
EXPORT_SYMBOL_GPL(nft_reject_dump); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Patrick McHardy <[email protected]>"); | ||
MODULE_ALIAS_NFT_EXPR("reject"); |