ipv6 sit: Fix 6rd relay address.
authorYOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org>
Sun, 11 Oct 2009 03:44:45 +0000 (03:44 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 12 Oct 2009 06:41:08 +0000 (23:41 -0700)
ipv6 sit: Fix 6rd relay address.

Relay's address should be extracted from real IPv6 address
instead of configured prefix.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/sit.c

index 8594451c747b68d07d64bdf4a908cac70cb01064..193d0c6c5ce2a1abbb04bd68a00808f24ae8790c 100644 (file)
@@ -569,12 +569,12 @@ __be32 try_6rd(struct in6_addr *v6dst, struct ip_tunnel *tunnel)
                pbw0 = tunnel->ip6rd.prefixlen >> 5;
                pbi0 = tunnel->ip6rd.prefixlen & 0x1f;
 
-               d = (ntohl(tunnel->ip6rd.prefix.s6_addr32[pbw0]) << pbi0) >>
+               d = (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
                    tunnel->ip6rd.relay_prefixlen;
 
                pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen;
                if (pbi1 > 0)
-                       d |= ntohl(tunnel->ip6rd.prefix.s6_addr32[pbw0 + 1]) >>
+                       d |= ntohl(v6dst->s6_addr32[pbw0 + 1]) >>
                             (32 - pbi1);
 
                dst = tunnel->ip6rd.relay_prefix | htonl(d);