rebased patch 0013-Properly-convert-from-host-to-network-order-in-ipv6-.patch to new IPv6 branch

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6-2@8245 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
csoler 2015-05-14 13:08:52 +00:00
parent 5c78134904
commit e7252e670e

View file

@ -24,6 +24,7 @@
*/ */
#include <sstream> #include <sstream>
#include <netinet/in.h>
#include "util/rsnet.h" #include "util/rsnet.h"
#include "util/rsstring.h" #include "util/rsstring.h"
@ -499,8 +500,9 @@ bool sockaddr_storage_isLinkLocal(const struct sockaddr_storage &addr)
case AF_INET6: case AF_INET6:
{ {
const sockaddr_in6 * addr6 = (const sockaddr_in6 *) &addr; const sockaddr_in6 * addr6 = (const sockaddr_in6 *) &addr;
u_int16_t mask = 0xc0ff; // Mask end prefix inverted because of IPv6 is big endian u_int16_t mask = htons(0xffc0);
return ((addr6->sin6_addr.s6_addr16[0] & mask ) == 0x80fe); u_int16_t llPrefix = htons(0xfe80);
return ((addr6->sin6_addr.s6_addr16[0] & mask ) == llPrefix);
} }
default: default:
@ -1031,9 +1033,9 @@ bool sockaddr_storage_ipv6_isnull(const struct sockaddr_storage & addr)
#endif #endif
const sockaddr_in6 & addr6 = (const sockaddr_in6 &) addr; 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) 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; return isNull;
} }
@ -1050,7 +1052,7 @@ bool sockaddr_storage_ipv6_isValidNet(const struct sockaddr_storage & )
bool sockaddr_storage_ipv6_isLoopbackNet(const struct sockaddr_storage & addr ) bool sockaddr_storage_ipv6_isLoopbackNet(const struct sockaddr_storage & addr )
{ {
sockaddr_in6 & addr6 = (sockaddr_in6 &) 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) for (int i=0; isLp && i<3; ++i)
isLp &= (addr6.sin6_addr.s6_addr32[i] == 0x00000000); isLp &= (addr6.sin6_addr.s6_addr32[i] == 0x00000000);