From e52d6a07b70e9e154f45914c1df6df088b92c49a Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 15 Mar 2015 15:30:55 +0000 Subject: [PATCH] 0005 conversions from IPv4/IPv6 (Patch from G10H4ck) git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6@8029 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libretroshare/src/util/rsnet.h | 1 + libretroshare/src/util/rsnet_ss.cc | 37 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/libretroshare/src/util/rsnet.h b/libretroshare/src/util/rsnet.h index 74f4877ae..e258961e7 100644 --- a/libretroshare/src/util/rsnet.h +++ b/libretroshare/src/util/rsnet.h @@ -96,6 +96,7 @@ bool sockaddr_storage_inet_pton(struct sockaddr_storage &addr, const char * ip_s bool sockaddr_storage_ipv4_setport(struct sockaddr_storage &addr, const uint16_t port); bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr); +bool sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr); // comparisons. bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b); diff --git a/libretroshare/src/util/rsnet_ss.cc b/libretroshare/src/util/rsnet_ss.cc index 608922294..6510f5505 100644 --- a/libretroshare/src/util/rsnet_ss.cc +++ b/libretroshare/src/util/rsnet_ss.cc @@ -280,7 +280,9 @@ bool sockaddr_storage_inet_pton(struct sockaddr_storage &addr, const char * ip_s bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr) { +#ifdef SS_DEBUG std::cerr << "sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr)" << std::endl; +#endif if ( addr.ss_family == AF_INET6 ) return true; @@ -304,6 +306,41 @@ bool sockaddr_storage_ipv4_to_ipv6(sockaddr_storage &addr) return false; } +bool sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr) +{ +//#ifdef SS_DEBUG + std::cerr << "sockaddr_storage_ipv6_to_ipv4(sockaddr_storage &addr)" << std::endl; +//#endif + + if ( addr.ss_family == AF_INET ) return true; + + if ( addr.ss_family == AF_INET6 ) + { + sockaddr_in6 & addr_ipv6 = (sockaddr_in6 &) addr; + bool ipv4m = addr_ipv6.sin6_addr.s6_addr16[5] == (u_int16_t) 0xffff; + for ( int i = 0; ipv4m && i < 5 ; ++i ) + ipv4m &= addr_ipv6.sin6_addr.s6_addr16[i] == (u_int16_t) 0x0000; + + if(ipv4m) + { + u_int32_t ip = addr_ipv6.sin6_addr.s6_addr32[3]; + u_int16_t port = addr_ipv6.sin6_port; + + sockaddr_in & addr_ipv4 = (sockaddr_in &) addr; + + sockaddr_storage_clear(addr); + addr_ipv4.sin_family = AF_INET; + addr_ipv4.sin_port = port; + addr_ipv4.sin_addr.s_addr = ip; + + return true; + } + } + + return false; +} + + /******************************** Comparisions **********************************/ bool operator<(const struct sockaddr_storage &a, const struct sockaddr_storage &b)