|
@@ -778,8 +778,9 @@ static bool check_6rd(struct ip_tunnel *tunnel, const struct in6_addr *v6dst,
|
|
|
pbw0 = tunnel->ip6rd.prefixlen >> 5;
|
|
pbw0 = tunnel->ip6rd.prefixlen >> 5;
|
|
|
pbi0 = tunnel->ip6rd.prefixlen & 0x1f;
|
|
pbi0 = tunnel->ip6rd.prefixlen & 0x1f;
|
|
|
|
|
|
|
|
- d = (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
|
|
|
|
|
- tunnel->ip6rd.relay_prefixlen;
|
|
|
|
|
|
|
+ d = tunnel->ip6rd.relay_prefixlen < 32 ?
|
|
|
|
|
+ (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
|
|
|
|
|
+ tunnel->ip6rd.relay_prefixlen : 0;
|
|
|
|
|
|
|
|
pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen;
|
|
pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen;
|
|
|
if (pbi1 > 0)
|
|
if (pbi1 > 0)
|