[IPV6]: Allow link-local tunnel endpoints

Allow link-local tunnel endpoints if the underlying link is defined.

Signed-off-by: Ville Nuorvala <vnuorval@tcs.hut.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 22debbf..3944ea2 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -460,6 +460,7 @@
 	if (rel_msg &&  pskb_may_pull(skb, offset + sizeof (*ipv6h))) {
 		struct rt6_info *rt;
 		struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
+
 		if (!skb2)
 			goto out;
 
@@ -824,7 +825,7 @@
 	if (ltype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
 	    rtype & (IPV6_ADDR_UNICAST|IPV6_ADDR_MULTICAST) &&
 	    !((ltype|rtype) & IPV6_ADDR_LOOPBACK) &&
-	    !((ltype|rtype) & IPV6_ADDR_LINKLOCAL)) {
+	    (!((ltype|rtype) & IPV6_ADDR_LINKLOCAL) || p->link)) {
 		if (ltype&IPV6_ADDR_UNICAST)
 			p->flags |= IP6_TNL_F_CAP_XMIT;
 		if (rtype&IPV6_ADDR_UNICAST)
@@ -862,8 +863,11 @@
 	dev->iflink = p->link;
 
 	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,
-						 p->link, 0);
+						 p->link, strict);
 
 		if (rt == NULL)
 			return;