From b77f7cc361dc44d6a5f554fc6b20e320f34feb66 Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 15 Mar 2015 15:34:18 +0000 Subject: [PATCH] 0006 Removed abort if IPv6 (Patch from G10H4ck) git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IPv6@8030 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- libbitdht/src/udp/udplayer.cc | 7 ++- libretroshare/src/dht/p3bitdht_peers.cc | 8 +-- libretroshare/src/pqi/pqinetwork.cc | 6 +-- libretroshare/src/pqi/pqissludp.cc | 12 ++--- libretroshare/src/tcponudp/rsudpstack.h | 25 +++++---- libretroshare/src/util/rsnet.cc | 6 +-- libretroshare/src/util/rsnet_ss.cc | 72 +++++++++++++++---------- 7 files changed, 75 insertions(+), 61 deletions(-) diff --git a/libbitdht/src/udp/udplayer.cc b/libbitdht/src/udp/udplayer.cc index ddf0258de..20e0253e0 100644 --- a/libbitdht/src/udp/udplayer.cc +++ b/libbitdht/src/udp/udplayer.cc @@ -181,7 +181,7 @@ int UdpLayer::reset(struct sockaddr_in &local) /* stop the old thread */ { - bdStackMutex stack(sockMtx); /********** LOCK MUTEX *********/ + bdStackMutex stack(sockMtx); (void)stack; /********** LOCK MUTEX *********/ #ifdef DEBUG_UDP_LAYER std::cerr << "UdpLayer::reset() setting stopThread flag" << std::endl; #endif @@ -322,7 +322,7 @@ int UdpLayer::sendPkt(const void *data, int size, const sockaddr_in &to, int ttl } /* setup connections */ -int UdpLayer::openSocket() +int UdpLayer::openSocket() { sockMtx.lock(); /********** LOCK MUTEX *********/ @@ -391,13 +391,12 @@ int UdpLayer::openSocket() // start up our thread. { - bdStackMutex stack(sockMtx); /********** LOCK MUTEX *********/ + bdStackMutex stack(sockMtx); (void)stack; /********** LOCK MUTEX *********/ stopThread = false; } start(); return 1; - } int UdpLayer::setTTL(int t) diff --git a/libretroshare/src/dht/p3bitdht_peers.cc b/libretroshare/src/dht/p3bitdht_peers.cc index 58877bae6..ad5126e28 100644 --- a/libretroshare/src/dht/p3bitdht_peers.cc +++ b/libretroshare/src/dht/p3bitdht_peers.cc @@ -193,7 +193,7 @@ int p3BitDht::addBadPeer(const struct sockaddr_storage &addr, uint32_t /*reason* { std::cerr << "p3BitDht::addBadPeer() cannot handle IPV6 Yet, aborting"; std::cerr << std::endl; - abort(); + return 0; // TODO:IPV6 } struct sockaddr_in *ap = (struct sockaddr_in *) &addr; @@ -226,14 +226,14 @@ int p3BitDht::addKnownPeer(const RsPeerId &pid, const struct sockaddr_storage &a std::cerr << std::endl; sockaddr_clear(&addrv4); -#if 0 + if (flags & NETASSIST_KNOWN_PEER_ONLINE) { std::cerr << "p3BitDht::addKnownPeer() Non IPv4 Address & ONLINE. Abort()ing."; std::cerr << std::endl; - abort(); + return 0; // TODO:IPV6 } -#endif + } else diff --git a/libretroshare/src/pqi/pqinetwork.cc b/libretroshare/src/pqi/pqinetwork.cc index 777fbd4b0..7637cd268 100644 --- a/libretroshare/src/pqi/pqinetwork.cc +++ b/libretroshare/src/pqi/pqinetwork.cc @@ -701,8 +701,7 @@ bool getPreferredInterface(const struct sockaddr_storage & existAddr, struct soc if (eaddr->sin_family != AF_INET) { std::cerr << "getPreferredInterface() ERROR only valid for IPv4 for now"; - abort(); - return false; + return false; // TODO:IPV6 } existing_addr = eaddr->sin_addr; } @@ -732,8 +731,7 @@ bool getLocalInterfaces(struct sockaddr_storage &existAddr, std::listsin_family != AF_INET) { std::cerr << "getLocalInterfaces() ERROR only valid for IPv4 for now"; - abort(); - return false; + return false; // TODO:IPV6 } existing_addr = eaddr->sin_addr; } diff --git a/libretroshare/src/pqi/pqissludp.cc b/libretroshare/src/pqi/pqissludp.cc index fdc502293..45468796b 100644 --- a/libretroshare/src/pqi/pqissludp.cc +++ b/libretroshare/src/pqi/pqissludp.cc @@ -151,7 +151,7 @@ int pqissludp::attach() // The Address determination is done centrally -int pqissludp::Initiate_Connection() +int pqissludp::Initiate_Connection() { int err; @@ -256,13 +256,13 @@ int pqissludp::Initiate_Connection() struct sockaddr_in proxyaddr; struct sockaddr_in remoteaddr; - if ((mConnectSrcAddr.ss_family != AF_INET) || - (mConnectProxyAddr.ss_family != AF_INET) || - (remote_addr.ss_family != AF_INET)) + if ( !( sockaddr_storage_ipv6_to_ipv4(mConnectSrcAddr) && + sockaddr_storage_ipv6_to_ipv4(mConnectProxyAddr) && + sockaddr_storage_ipv6_to_ipv4(remote_addr))) { - std::cerr << "Error One Address is not IPv4. aborting"; + std::cerr << "pqissludp::Initiate_Connection() Error One Address is not IPv4. aborting"; std::cerr << std::endl; - abort(); + return 0; // TODO:IPV6 } struct sockaddr_in *rap = (struct sockaddr_in *) &remote_addr; diff --git a/libretroshare/src/tcponudp/rsudpstack.h b/libretroshare/src/tcponudp/rsudpstack.h index 007a2e845..5cf7f89ef 100644 --- a/libretroshare/src/tcponudp/rsudpstack.h +++ b/libretroshare/src/tcponudp/rsudpstack.h @@ -54,30 +54,33 @@ virtual bool resetAddress(struct sockaddr_in &local) { return false; } class rsUdpStack: public UdpStack, public pqiNetListener { - public: - rsUdpStack(struct sockaddr_in &local) - :UdpStack(local) { return; } +public: + rsUdpStack(struct sockaddr_in &local) :UdpStack(local) {} - rsUdpStack(int testmode, struct sockaddr_in &local) - :UdpStack(testmode, local) { return; } + rsUdpStack(int testmode, struct sockaddr_in &local) :UdpStack(testmode, local) {} /* from pqiNetListener */ -virtual bool resetListener(const struct sockaddr_storage &local) + virtual bool resetListener(const struct sockaddr_storage &local) { std::cerr << "rsUdpStack::resetListener(" << sockaddr_storage_tostring(local) << ")"; std::cerr << std::endl; - if (local.ss_family != AF_INET) + if ( local.ss_family != AF_INET ) { - std::cerr << "rsUdpStack::resetListener() NOT IPv4 ERROR"; - std::cerr << std::endl; - abort(); + std::cerr << "rsUdpStack::resetListener() got non AF_INET sockaddr_storage, attempt to convert" << std::endl; + + // FORCING NON CONST CHANGE THIS AS SOON AS POSSIBLE // TODO:IPV6 + if(!sockaddr_storage_ipv6_to_ipv4((sockaddr_storage &)local)) + { + std::cerr << "rsUdpStack::resetListener() NOT IPv4 ERROR"; + std::cerr << std::endl; + return false; // TODO:IPV6 + } } struct sockaddr_in *addr = (struct sockaddr_in *) &local; return resetAddress(*addr); } - }; class rsFixedUdpStack: public UdpStack, public pqiNetListener diff --git a/libretroshare/src/util/rsnet.cc b/libretroshare/src/util/rsnet.cc index 7ec34c625..4062c2b0c 100644 --- a/libretroshare/src/util/rsnet.cc +++ b/libretroshare/src/util/rsnet.cc @@ -73,7 +73,7 @@ void sockaddr_clear(struct sockaddr_in *addr) } -bool isValidNet(const struct in_addr *addr) +bool isValidNet(const struct in_addr *addr) { // invalid address. if((*addr).s_addr == INADDR_NONE) @@ -85,13 +85,13 @@ bool isValidNet(const struct in_addr *addr) } -bool isLoopbackNet(const struct in_addr *addr) +bool isLoopbackNet(const struct in_addr *addr) { in_addr_t taddr = ntohl(addr->s_addr); return (taddr == (127 << 24 | 1)); } -bool isPrivateNet(const struct in_addr *addr) +bool isPrivateNet(const struct in_addr *addr) { in_addr_t taddr = ntohl(addr->s_addr); diff --git a/libretroshare/src/util/rsnet_ss.cc b/libretroshare/src/util/rsnet_ss.cc index 6510f5505..543eb6f72 100644 --- a/libretroshare/src/util/rsnet_ss.cc +++ b/libretroshare/src/util/rsnet_ss.cc @@ -29,6 +29,8 @@ #include "util/rsstring.h" #include "pqi/pqinetwork.h" +#include "util/stacktrace.h" + /***************************** Internal Helper Fns ******************************/ /******************************** Casting **************************************/ @@ -814,22 +816,20 @@ bool sockaddr_storage_ipv6_same(const struct sockaddr_storage &addr, const struc bool sockaddr_storage_ipv6_sameip(const struct sockaddr_storage &addr, const struct sockaddr_storage &addr2) { - std::cerr << "sockaddr_storage_ipv6_sameip()"; - std::cerr << std::endl; +#ifdef SS_DEBUG + std::cerr << "sockaddr_storage_ipv6_sameip(addr,addr2)" << std::endl; +#endif const struct sockaddr_in6 *ptr1 = to_const_ipv6_ptr(addr); const struct sockaddr_in6 *ptr2 = to_const_ipv6_ptr(addr2); - uint32_t *ip6addr1 = (uint32_t *) ptr1->sin6_addr.s6_addr; - uint32_t *ip6addr2 = (uint32_t *) ptr2->sin6_addr.s6_addr; + uint32_t *ip6addr1 = (uint32_t *) ptr1->sin6_addr.s6_addr; + uint32_t *ip6addr2 = (uint32_t *) ptr2->sin6_addr.s6_addr; - for(int i = 0; i < 4; i++) - { + for(int i = 0; i < 4; i++) if (ip6addr1[i] != ip6addr2[i]) - { return false; - } - } + return true; } @@ -910,7 +910,7 @@ void sockaddr_storage_dump(const sockaddr_storage & addr) output << addr.__ss_padding; }} - std::cout << output.str() << std::endl; + std::cerr << output.str() << std::endl; } @@ -925,14 +925,10 @@ bool sockaddr_storage_ipv4_isnull(const struct sockaddr_storage &addr) #endif const struct sockaddr_in *ptr1 = to_const_ipv4_ptr(addr); - if (ptr1->sin_family != AF_INET) - { + + if (ptr1->sin_addr.s_addr == 0) return true; - } - if ((ptr1->sin_addr.s_addr == 0) || (ptr1->sin_addr.s_addr == 1)) - { - return true; - } + return false; } @@ -945,9 +941,8 @@ bool sockaddr_storage_ipv4_isValidNet(const struct sockaddr_storage &addr) const struct sockaddr_in *ptr1 = to_const_ipv4_ptr(addr); if (ptr1->sin_family != AF_INET) - { return false; - } + return isValidNet(&(ptr1->sin_addr)); } @@ -987,8 +982,7 @@ bool sockaddr_storage_ipv4_isPrivateNet(const struct sockaddr_storage &addr) bool sockaddr_storage_ipv4_isExternalNet(const struct sockaddr_storage &addr) { #ifdef SS_DEBUG - std::cerr << "sockaddr_storage_ipv4_isExternalNet()"; - std::cerr << std::endl; + std::cerr << "sockaddr_storage_ipv4_isExternalNet()" << std::endl; #endif const struct sockaddr_in *ptr1 = to_const_ipv4_ptr(addr); @@ -1000,38 +994,58 @@ bool sockaddr_storage_ipv4_isExternalNet(const struct sockaddr_storage &addr) } -bool sockaddr_storage_ipv6_isnull(const struct sockaddr_storage & ) +bool sockaddr_storage_ipv6_isnull(const struct sockaddr_storage & addr) { - std::cerr << "sockaddr_storage_ipv6_isnull() TODO" << std::endl; +#ifdef SS_DEBUG + std::cerr << "sockaddr_storage_ipv6_isnull()" << std::endl; +#endif - return false; + const sockaddr_in6 & addr6 = (const sockaddr_in6 &) addr; + bool isNull = (addr6.sin6_addr.s6_addr32[3] == 0x0); + for (int i=0; isNull && i<3; ++i) + isNull &= (addr6.sin6_addr.s6_addr32[i] == 0x0); + + return isNull; } bool sockaddr_storage_ipv6_isValidNet(const struct sockaddr_storage & ) { - std::cerr << "sockaddr_storage_ipv6_isValidNet() TODO" << std::endl; +#ifdef SS_DEBUG + std::cerr << "sockaddr_storage_ipv6_isValidNet()" << std::endl; +#endif return true; } -bool sockaddr_storage_ipv6_isLoopbackNet(const struct sockaddr_storage & ) +bool sockaddr_storage_ipv6_isLoopbackNet(const struct sockaddr_storage & addr ) { - std::cerr << "sockaddr_storage_ipv6_isLoopbackNet() TODO"; - std::cerr << std::endl; + sockaddr_in6 & addr6 = (sockaddr_in6 &) addr; + bool isLp = (addr6.sin6_addr.s6_addr32[3] == 0x1); + for (int i=0; isLp && i<3; ++i) + isLp &= (addr6.sin6_addr.s6_addr32[i] == 0x0); - return false; +#ifdef SS_DEBUG + sockaddr_storage_dump(addr); + std::cerr << "sockaddr_storage_ipv6_isLoopbackNet() " << isLp << std::endl; +#endif + + return isLp; } bool sockaddr_storage_ipv6_isPrivateNet(const struct sockaddr_storage &) { +#ifdef SS_DEBUG std::cerr << "sockaddr_storage_ipv6_isPrivateNet() TODO" << std::endl; +#endif return false; } bool sockaddr_storage_ipv6_isExternalNet(const struct sockaddr_storage &) { +#ifdef SS_DEBUG std::cerr << "sockaddr_storage_ipv6_isExternalNet() TODO" << std::endl; +#endif return true; }