ip6_tunnel: add the process for redirect in ip6_tnl_err

The same process for redirect in "ip6_gre: add the process for redirect
in ip6gre_err" is needed by ip4ip6 and ip6ip6 as well.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Xin Long 2017-11-11 19:06:51 +08:00 committed by David S. Miller
parent fe1a4ca0a2
commit 383c1f8875
1 changed files with 10 additions and 5 deletions

View File

@ -471,15 +471,16 @@ static int
ip6_tnl_err(struct sk_buff *skb, __u8 ipproto, struct inet6_skb_parm *opt, ip6_tnl_err(struct sk_buff *skb, __u8 ipproto, struct inet6_skb_parm *opt,
u8 *type, u8 *code, int *msg, __u32 *info, int offset) u8 *type, u8 *code, int *msg, __u32 *info, int offset)
{ {
const struct ipv6hdr *ipv6h = (const struct ipv6hdr *) skb->data; const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)skb->data;
struct ip6_tnl *t; struct net *net = dev_net(skb->dev);
int rel_msg = 0;
u8 rel_type = ICMPV6_DEST_UNREACH; u8 rel_type = ICMPV6_DEST_UNREACH;
u8 rel_code = ICMPV6_ADDR_UNREACH; u8 rel_code = ICMPV6_ADDR_UNREACH;
u8 tproto;
__u32 rel_info = 0; __u32 rel_info = 0;
__u16 len; struct ip6_tnl *t;
int err = -ENOENT; int err = -ENOENT;
int rel_msg = 0;
u8 tproto;
__u16 len;
/* If the packet doesn't contain the original IPv6 header we are /* If the packet doesn't contain the original IPv6 header we are
in trouble since we might need the source address for further in trouble since we might need the source address for further
@ -543,6 +544,10 @@ ip6_tnl_err(struct sk_buff *skb, __u8 ipproto, struct inet6_skb_parm *opt,
rel_msg = 1; rel_msg = 1;
} }
break; break;
case NDISC_REDIRECT:
ip6_redirect(skb, net, skb->dev->ifindex, 0,
sock_net_uid(net, NULL));
break;
} }
*type = rel_type; *type = rel_type;