diff --git a/src/SocketTap.cpp b/src/SocketTap.cpp index 9bc98ea..188e3aa 100644 --- a/src/SocketTap.cpp +++ b/src/SocketTap.cpp @@ -92,7 +92,8 @@ namespace ZeroTier { bool SocketTap::addIp(const InetAddress &ip) { - if(picostack) { + if(picostack) { + DEBUG_INFO("addr = %s", ip.toString().c_str()); picostack->pico_init_interface(this, ip); _ips.push_back(ip); std::sort(_ips.begin(),_ips.end()); diff --git a/src/ZeroTierSDK.cpp b/src/ZeroTierSDK.cpp index 7d6583e..3cf7ab5 100644 --- a/src/ZeroTierSDK.cpp +++ b/src/ZeroTierSDK.cpp @@ -412,7 +412,7 @@ int zts_connect(ZT_CONNECT_SIG) { inet_ntop(AF_INET6, (const void *)&((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, ipstr, INET6_ADDRSTRLEN); } - iaddr.fromString(ipstr); + iaddr.fromString(ipstr+std::string("/88")); //DEBUG_INFO("ipstr= %s", ipstr); //DEBUG_INFO("iaddr= %s", iaddr.toString().c_str()); tap = zt1Service->getTap(iaddr); @@ -524,20 +524,14 @@ int zts_bind(ZT_BIND_SIG) { ZeroTier::InetAddress iaddr; if(conn->socket_family == AF_INET) { - printf("parsing ipv4 str\n"); inet_ntop(AF_INET, (const void *)&((struct sockaddr_in *)addr)->sin_addr.s_addr, ipstr, INET_ADDRSTRLEN); } if(conn->socket_family == AF_INET6) { - printf("parsing ipv6 str\n"); inet_ntop(AF_INET6, (const void *)&((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, ipstr, INET6_ADDRSTRLEN); } iaddr.fromString(ipstr); - - DEBUG_INFO("ipstr= %s", ipstr); - DEBUG_INFO("iaddr= %s", iaddr.toString().c_str()); - tap = zt1Service->getTap(iaddr); if(!tap) { diff --git a/src/picoTCP.cpp b/src/picoTCP.cpp index 4f58ccd..6aabbfe 100644 --- a/src/picoTCP.cpp +++ b/src/picoTCP.cpp @@ -106,6 +106,8 @@ namespace ZeroTier { char ipv6_str[INET6_ADDRSTRLEN], nm_str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, ip.rawIpData(), ipv6_str, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, ip.netmask().rawIpData(), nm_str, INET6_ADDRSTRLEN); + DEBUG_ERROR("ipv6_str = %s", ipv6_str); + DEBUG_ERROR("nm_str = %s", nm_str); pico_string_to_ipv6(ipv6_str, ipaddr.addr); pico_string_to_ipv6(nm_str, netmask.addr); pico_ipv6_link_add(&(tap->picodev6), ipaddr, netmask); @@ -488,33 +490,22 @@ namespace ZeroTier { char ipv4_str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, (const void *)&in4->sin_addr.s_addr, ipv4_str, INET_ADDRSTRLEN); pico_string_to_ipv4(ipv4_str, &(zaddr.addr)); - // DEBUG_ATTN("addr=%s: %d ntoh()=%d", ipv4_str, in4->sin_port, Utils::ntoh(in4->sin_port)); err = pico_socket_bind(conn->picosock, &zaddr, (uint16_t *)&(in4->sin_port)); #endif #if defined(SDK_IPV6) - -/* - - struct pico_ip6 zaddr; - struct sockaddr_in6 *in6 = (struct sockaddr_in6*)&bind_rpc->addr; + struct pico_ip6 pip6; + struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr; char ipv6_str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &(in6->sin6_addr), ipv6_str, INET6_ADDRSTRLEN); - picotap->picostack->__pico_string_to_ipv6(ipv6_str, zaddr.addr); - DEBUG_ATTN("addr=%s:%d, physock=%p, picosock=%p", ipv6_str, Utils::ntoh(addr->sin_port), sock, (conn->picosock)); - ret = picotap->picostack->__pico_socket_bind(conn->picosock, &zaddr, (uint16_t*)&(addr->sin_port)); -*/ - - struct pico_ip6 zaddr; - struct sockaddr_in6 *in6 = (struct sockaddr_in6*)&addr; - char ipv6_str[INET6_ADDRSTRLEN]; - inet_ntop(AF_INET6, &(in6->sin6_addr), ipv6_str, INET6_ADDRSTRLEN); - pico_string_to_ipv6(ipv6_str, zaddr.addr); - DEBUG_ATTN("BIND addr=%s:%d", ipv6_str, Utils::ntoh(in6->sin6_port)); - err = pico_socket_bind(conn->picosock, &zaddr, (uint16_t *)(in6->sin6_port)); - DEBUG_ERROR("pico_err = %d", pico_err); + // TODO: This isn't proper + pico_string_to_ipv6("::", pip6.addr); + //DEBUG_ATTN("addr=%s:%d, picosock=%p", ipv6_str, Utils::ntoh(in6->sin6_port), (conn->picosock)); + err = pico_socket_bind(conn->picosock, &pip6, (uint16_t *)&(in6->sin6_port)); #endif if(err < 0) { + if(pico_err < 0) + DEBUG_ERROR("pico_err = %d", pico_err); DEBUG_ERROR("unable to bind pico_socket(%p), err=%d", (conn->picosock), err); if(err == PICO_ERR_EINVAL) { DEBUG_ERROR("PICO_ERR_EINVAL - invalid argument"); diff --git a/test/unit/unit.cpp b/test/unit/unit.cpp index 034b441..99cc300 100644 --- a/test/unit/unit.cpp +++ b/test/unit/unit.cpp @@ -91,7 +91,7 @@ int ipv6_tcp_client_test(struct sockaddr_in6 *addr, int port) { int r, w, sockfd, err, len = strlen(str); char rbuf[STR_SIZE]; - if((sockfd = zts_socket(AF_INET, SOCK_STREAM, 0)) < 0) { + if((sockfd = zts_socket(AF_INET6, SOCK_STREAM, 0)) < 0) { printf("error creating ZeroTier socket"); } if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) { @@ -547,7 +547,7 @@ int do_test(std::string path, std::string nwid, int type, int protocol, int mode addr6.sin6_family = AF_INET6; memmove((char *) &addr6.sin6_addr.s6_addr, (char *) server->h_addr, server->h_length); addr6.sin6_port = htons(port); - return ipv6_tcp_server_test(&addr6, port, operation, n_count, delay); + return ipv6_tcp_server_sustained_test(&addr6, port, operation, n_count, delay); } } diff --git a/zto/node/InetAddress.cpp b/zto/node/InetAddress.cpp index 7d22eea..3dc0122 100644 --- a/zto/node/InetAddress.cpp +++ b/zto/node/InetAddress.cpp @@ -279,6 +279,30 @@ InetAddress InetAddress::network() const return r; } +#ifdef ZT_SDK + bool InetAddress::isEqualPrefix(const InetAddress &addr) const + { + if (addr.ss_family == ss_family) { + switch(ss_family) { + case AF_INET6: { + const InetAddress mask(netmask()); + InetAddress addr_mask(addr.netmask()); + const uint8_t *n = reinterpret_cast(reinterpret_cast(&addr_mask)->sin6_addr.s6_addr); + const uint8_t *m = reinterpret_cast(reinterpret_cast(&mask)->sin6_addr.s6_addr); + const uint8_t *a = reinterpret_cast(reinterpret_cast(&addr)->sin6_addr.s6_addr); + const uint8_t *b = reinterpret_cast(reinterpret_cast(this)->sin6_addr.s6_addr); + for(unsigned int i=0;i<16;++i) { + if ((a[i] & m[i]) != (b[i] & n[i])) + return false; + } + return true; + } + } + } + return false; + } +#endif + bool InetAddress::containsAddress(const InetAddress &addr) const { if (addr.ss_family == ss_family) { diff --git a/zto/node/InetAddress.hpp b/zto/node/InetAddress.hpp index c37fa62..0533ea0 100644 --- a/zto/node/InetAddress.hpp +++ b/zto/node/InetAddress.hpp @@ -347,6 +347,16 @@ struct InetAddress : public sockaddr_storage */ InetAddress network() const; +#ifdef ZT_SDK + /** + * Test whether this IPv6 prefix matches the prefix of a given IPv6 address + * + * @param addr Address to check + * @return True if this IPv6 prefix matches the prefix of a given IPv6 address + */ + bool isEqualPrefix(const InetAddress &addr) const; +#endif + /** * Test whether this IP/netmask contains this address * diff --git a/zto/service/OneService.cpp b/zto/service/OneService.cpp index 86e188f..f92650b 100644 --- a/zto/service/OneService.cpp +++ b/zto/service/OneService.cpp @@ -1005,7 +1005,7 @@ public: for(it = _nets.begin(); it != _nets.end(); it++) { if(it->second.tap) { for(int j=0; jsecond.tap->_ips.size(); j++) { - if(it->second.tap->_ips[j].containsAddress(addr) + if(it->second.tap->_ips[j].isEqualPrefix(addr) || it->second.tap->_ips[j].ipsEqual(addr)) { return it->second.tap; }