mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 00:54:09 +08:00
netfilter: ipvs: merge ipv4 + ipv6 icmp reply handlers
Similar to earlier patches: allow ipv4 and ipv6 to use the same handler. ipv4 and ipv6 specific actions can be done by checking state->pf. v2: split the pf == NFPROTO_IPV4 check (Julian Anastasov) Signed-off-by: Florian Westphal <fw@strlen.de> Acked-by: Julian Anastasov <ja@ssi.bg> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
540ff44b28
commit
c650c35a25
@ -2106,41 +2106,32 @@ static unsigned int
|
|||||||
ip_vs_forward_icmp(void *priv, struct sk_buff *skb,
|
ip_vs_forward_icmp(void *priv, struct sk_buff *skb,
|
||||||
const struct nf_hook_state *state)
|
const struct nf_hook_state *state)
|
||||||
{
|
{
|
||||||
int r;
|
|
||||||
struct netns_ipvs *ipvs = net_ipvs(state->net);
|
struct netns_ipvs *ipvs = net_ipvs(state->net);
|
||||||
|
int r;
|
||||||
if (ip_hdr(skb)->protocol != IPPROTO_ICMP)
|
|
||||||
return NF_ACCEPT;
|
|
||||||
|
|
||||||
/* ipvs enabled in this netns ? */
|
/* ipvs enabled in this netns ? */
|
||||||
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
||||||
return NF_ACCEPT;
|
return NF_ACCEPT;
|
||||||
|
|
||||||
|
if (state->pf == NFPROTO_IPV4) {
|
||||||
|
if (ip_hdr(skb)->protocol != IPPROTO_ICMP)
|
||||||
|
return NF_ACCEPT;
|
||||||
|
#ifdef CONFIG_IP_VS_IPV6
|
||||||
|
} else {
|
||||||
|
struct ip_vs_iphdr iphdr;
|
||||||
|
|
||||||
|
ip_vs_fill_iph_skb(AF_INET6, skb, false, &iphdr);
|
||||||
|
|
||||||
|
if (iphdr.protocol != IPPROTO_ICMPV6)
|
||||||
|
return NF_ACCEPT;
|
||||||
|
|
||||||
|
return ip_vs_in_icmp_v6(ipvs, skb, &r, state->hook, &iphdr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return ip_vs_in_icmp(ipvs, skb, &r, state->hook);
|
return ip_vs_in_icmp(ipvs, skb, &r, state->hook);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_IP_VS_IPV6
|
|
||||||
static unsigned int
|
|
||||||
ip_vs_forward_icmp_v6(void *priv, struct sk_buff *skb,
|
|
||||||
const struct nf_hook_state *state)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
struct netns_ipvs *ipvs = net_ipvs(state->net);
|
|
||||||
struct ip_vs_iphdr iphdr;
|
|
||||||
|
|
||||||
ip_vs_fill_iph_skb(AF_INET6, skb, false, &iphdr);
|
|
||||||
if (iphdr.protocol != IPPROTO_ICMPV6)
|
|
||||||
return NF_ACCEPT;
|
|
||||||
|
|
||||||
/* ipvs enabled in this netns ? */
|
|
||||||
if (unlikely(sysctl_backup_only(ipvs) || !ipvs->enable))
|
|
||||||
return NF_ACCEPT;
|
|
||||||
|
|
||||||
return ip_vs_in_icmp_v6(ipvs, skb, &r, state->hook, &iphdr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static const struct nf_hook_ops ip_vs_ops4[] = {
|
static const struct nf_hook_ops ip_vs_ops4[] = {
|
||||||
/* After packet filtering, change source only for VS/NAT */
|
/* After packet filtering, change source only for VS/NAT */
|
||||||
{
|
{
|
||||||
@ -2224,7 +2215,7 @@ static const struct nf_hook_ops ip_vs_ops6[] = {
|
|||||||
/* After packet filtering (but before ip_vs_out_icmp), catch icmp
|
/* After packet filtering (but before ip_vs_out_icmp), catch icmp
|
||||||
* destined for 0.0.0.0/0, which is for incoming IPVS connections */
|
* destined for 0.0.0.0/0, which is for incoming IPVS connections */
|
||||||
{
|
{
|
||||||
.hook = ip_vs_forward_icmp_v6,
|
.hook = ip_vs_forward_icmp,
|
||||||
.pf = NFPROTO_IPV6,
|
.pf = NFPROTO_IPV6,
|
||||||
.hooknum = NF_INET_FORWARD,
|
.hooknum = NF_INET_FORWARD,
|
||||||
.priority = 99,
|
.priority = 99,
|
||||||
|
Loading…
Reference in New Issue
Block a user