From 4e5e974a128fd81b952f71d5f9a7ab7534f368c9 Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 1 May 2015 13:15:52 +0000 Subject: [PATCH] fixed endian in some IPv6 methods (Patch 1f33d608b55fb4b82db96eab5f34dcd7004c3a14 from G10H4ck) git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6@8199 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/util/rsnet_ss.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libretroshare/src/util/rsnet_ss.cc b/libretroshare/src/util/rsnet_ss.cc index 365d9e861..5b7d08bbf 100644 --- a/libretroshare/src/util/rsnet_ss.cc +++ b/libretroshare/src/util/rsnet_ss.cc @@ -24,6 +24,7 @@ */ #include +#include #include "util/rsnet.h" #include "util/rsstring.h" @@ -499,8 +500,9 @@ bool sockaddr_storage_isLinkLocal(const struct sockaddr_storage &addr) case AF_INET6: { const sockaddr_in6 * addr6 = (const sockaddr_in6 *) &addr; - u_int16_t mask = 0xc0ff; // Mask end prefix inverted because of IPv6 is big endian - return ((addr6->sin6_addr.s6_addr16[0] & mask ) == 0x80fe); + u_int16_t mask = htons(0xffc0); + u_int16_t llPrefix = htons(0xfe80); + return ((addr6->sin6_addr.s6_addr16[0] & mask ) == llPrefix); } default: @@ -1026,9 +1028,9 @@ bool sockaddr_storage_ipv6_isnull(const struct sockaddr_storage & addr) #endif const sockaddr_in6 & addr6 = (const sockaddr_in6 &) addr; - bool isNull = (addr6.sin6_addr.s6_addr32[3] == 0x0); + bool isNull = (addr6.sin6_addr.s6_addr32[3] == 0x00000000); for (int i=0; isNull && i<3; ++i) - isNull &= (addr6.sin6_addr.s6_addr32[i] == 0x0); + isNull &= (addr6.sin6_addr.s6_addr32[i] == 0x00000000); return isNull; } @@ -1045,7 +1047,7 @@ bool sockaddr_storage_ipv6_isValidNet(const struct sockaddr_storage & ) bool sockaddr_storage_ipv6_isLoopbackNet(const struct sockaddr_storage & addr ) { sockaddr_in6 & addr6 = (sockaddr_in6 &) addr; - bool isLp = (addr6.sin6_addr.s6_addr32[3] == 0x10000000); // IPv6 is big endian + bool isLp = (addr6.sin6_addr.s6_addr32[3] == htonl(0x00000001)); for (int i=0; isLp && i<3; ++i) isLp &= (addr6.sin6_addr.s6_addr32[i] == 0x00000000);