Commit 305d4b3c authored by Ville Nuorvala's avatar Ville Nuorvala Committed by David S. Miller

[IPV6]: Allow link-local tunnel endpoints

Allow link-local tunnel endpoints if the underlying link is defined.
Signed-off-by: default avatarVille Nuorvala <vnuorval@tcs.hut.fi>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 09c6bbf0
...@@ -460,6 +460,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, ...@@ -460,6 +460,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
if (rel_msg && pskb_may_pull(skb, offset + sizeof (*ipv6h))) { if (rel_msg && pskb_may_pull(skb, offset + sizeof (*ipv6h))) {
struct rt6_info *rt; struct rt6_info *rt;
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC); struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
if (!skb2) if (!skb2)
goto out; goto out;
...@@ -824,7 +825,7 @@ static void ip6_tnl_set_cap(struct ip6_tnl *t) ...@@ -824,7 +825,7 @@ static void ip6_tnl_set_cap(struct ip6_tnl *t)
if (ltype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) && if (ltype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
rtype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) && rtype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
!((ltype|rtype) & IPV6_ADDR_LOOPBACK) && !((ltype|rtype) & IPV6_ADDR_LOOPBACK) &&
!((ltype|rtype) & IPV6_ADDR_LINKLOCAL)) { (!((ltype|rtype) & IPV6_ADDR_LINKLOCAL) || p->link)) {
if (ltype&IPV6_ADDR_UNICAST) if (ltype&IPV6_ADDR_UNICAST)
p->flags |= IP6_TNL_F_CAP_XMIT; p->flags |= IP6_TNL_F_CAP_XMIT;
if (rtype&IPV6_ADDR_UNICAST) if (rtype&IPV6_ADDR_UNICAST)
...@@ -862,8 +863,11 @@ static void ip6ip6_tnl_link_config(struct ip6_tnl *t) ...@@ -862,8 +863,11 @@ static void ip6ip6_tnl_link_config(struct ip6_tnl *t)
dev->iflink = p->link; dev->iflink = p->link;
if (p->flags & IP6_TNL_F_CAP_XMIT) { if (p->flags & IP6_TNL_F_CAP_XMIT) {
int strict = (ipv6_addr_type(&p->raddr) &
(IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL));
struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr, struct rt6_info *rt = rt6_lookup(&p->raddr, &p->laddr,
p->link, 0); p->link, strict);
if (rt == NULL) if (rt == NULL)
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment