From d6e1b98511946782adf2899bd0a3adbec5106ae4 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 14 May 2015 12:48:51 +0000 Subject: [PATCH] rebased patch 0005-rsnet_ss-add-conversion-from-AF_INET6-ipv4-to-AF_INE.patch to new IPv6 branch git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6-2@8237 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 45cc9bcb7..d6ea0862c 100644 --- a/libretroshare/src/util/rsnet.h +++ b/libretroshare/src/util/rsnet.h @@ -98,6 +98,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 0956c7262..7610d8a4f 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)