diff options
author | YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org> | 2013-01-14 07:10:06 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-01-14 13:17:00 -0500 |
commit | e287656b365f8db4486371c76ea54cbdbed7129c (patch) | |
tree | 9a324f88d4a1dc84843052a3f6c14800a533a5b8 /include | |
parent | 9f2e73345ad9466618edfec35d98c074f2e0570d (diff) | |
download | linux-3.10-e287656b365f8db4486371c76ea54cbdbed7129c.tar.gz linux-3.10-e287656b365f8db4486371c76ea54cbdbed7129c.tar.bz2 linux-3.10-e287656b365f8db4486371c76ea54cbdbed7129c.zip |
ipv6: 64bit version of ipv6_addr_loopback().
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/ipv6.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index ace1113bef8..c5049b01933 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -475,8 +475,14 @@ static inline u32 ipv6_addr_hash(const struct in6_addr *a) static inline bool ipv6_addr_loopback(const struct in6_addr *a) { +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 + const unsigned long *ul = (const unsigned long *)a; + + return (ul[0] | (ul[1] ^ cpu_to_be64(1))) == 0UL; +#else return (a->s6_addr32[0] | a->s6_addr32[1] | a->s6_addr32[2] | (a->s6_addr32[3] ^ htonl(1))) == 0; +#endif } static inline bool ipv6_addr_v4mapped(const struct in6_addr *a) |