Added isPrefixEqual, fixed unit test bug, fixed ipv6 bind bug
This commit is contained in:
@@ -93,6 +93,7 @@ namespace ZeroTier {
|
|||||||
bool SocketTap::addIp(const InetAddress &ip)
|
bool SocketTap::addIp(const InetAddress &ip)
|
||||||
{
|
{
|
||||||
if(picostack) {
|
if(picostack) {
|
||||||
|
DEBUG_INFO("addr = %s", ip.toString().c_str());
|
||||||
picostack->pico_init_interface(this, ip);
|
picostack->pico_init_interface(this, ip);
|
||||||
_ips.push_back(ip);
|
_ips.push_back(ip);
|
||||||
std::sort(_ips.begin(),_ips.end());
|
std::sort(_ips.begin(),_ips.end());
|
||||||
|
|||||||
@@ -412,7 +412,7 @@ int zts_connect(ZT_CONNECT_SIG) {
|
|||||||
inet_ntop(AF_INET6,
|
inet_ntop(AF_INET6,
|
||||||
(const void *)&((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, ipstr, INET6_ADDRSTRLEN);
|
(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("ipstr= %s", ipstr);
|
||||||
//DEBUG_INFO("iaddr= %s", iaddr.toString().c_str());
|
//DEBUG_INFO("iaddr= %s", iaddr.toString().c_str());
|
||||||
tap = zt1Service->getTap(iaddr);
|
tap = zt1Service->getTap(iaddr);
|
||||||
@@ -524,20 +524,14 @@ int zts_bind(ZT_BIND_SIG) {
|
|||||||
ZeroTier::InetAddress iaddr;
|
ZeroTier::InetAddress iaddr;
|
||||||
|
|
||||||
if(conn->socket_family == AF_INET) {
|
if(conn->socket_family == AF_INET) {
|
||||||
printf("parsing ipv4 str\n");
|
|
||||||
inet_ntop(AF_INET,
|
inet_ntop(AF_INET,
|
||||||
(const void *)&((struct sockaddr_in *)addr)->sin_addr.s_addr, ipstr, INET_ADDRSTRLEN);
|
(const void *)&((struct sockaddr_in *)addr)->sin_addr.s_addr, ipstr, INET_ADDRSTRLEN);
|
||||||
}
|
}
|
||||||
if(conn->socket_family == AF_INET6) {
|
if(conn->socket_family == AF_INET6) {
|
||||||
printf("parsing ipv6 str\n");
|
|
||||||
inet_ntop(AF_INET6,
|
inet_ntop(AF_INET6,
|
||||||
(const void *)&((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, ipstr, INET6_ADDRSTRLEN);
|
(const void *)&((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr, ipstr, INET6_ADDRSTRLEN);
|
||||||
}
|
}
|
||||||
iaddr.fromString(ipstr);
|
iaddr.fromString(ipstr);
|
||||||
|
|
||||||
DEBUG_INFO("ipstr= %s", ipstr);
|
|
||||||
DEBUG_INFO("iaddr= %s", iaddr.toString().c_str());
|
|
||||||
|
|
||||||
tap = zt1Service->getTap(iaddr);
|
tap = zt1Service->getTap(iaddr);
|
||||||
|
|
||||||
if(!tap) {
|
if(!tap) {
|
||||||
|
|||||||
@@ -106,6 +106,8 @@ namespace ZeroTier {
|
|||||||
char ipv6_str[INET6_ADDRSTRLEN], nm_str[INET6_ADDRSTRLEN];
|
char ipv6_str[INET6_ADDRSTRLEN], nm_str[INET6_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET6, ip.rawIpData(), ipv6_str, INET6_ADDRSTRLEN);
|
inet_ntop(AF_INET6, ip.rawIpData(), ipv6_str, INET6_ADDRSTRLEN);
|
||||||
inet_ntop(AF_INET6, ip.netmask().rawIpData(), nm_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(ipv6_str, ipaddr.addr);
|
||||||
pico_string_to_ipv6(nm_str, netmask.addr);
|
pico_string_to_ipv6(nm_str, netmask.addr);
|
||||||
pico_ipv6_link_add(&(tap->picodev6), ipaddr, netmask);
|
pico_ipv6_link_add(&(tap->picodev6), ipaddr, netmask);
|
||||||
@@ -488,33 +490,22 @@ namespace ZeroTier {
|
|||||||
char ipv4_str[INET_ADDRSTRLEN];
|
char ipv4_str[INET_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET, (const void *)&in4->sin_addr.s_addr, 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));
|
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));
|
// 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));
|
err = pico_socket_bind(conn->picosock, &zaddr, (uint16_t *)&(in4->sin_port));
|
||||||
#endif
|
#endif
|
||||||
#if defined(SDK_IPV6)
|
#if defined(SDK_IPV6)
|
||||||
|
struct pico_ip6 pip6;
|
||||||
/*
|
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)addr;
|
||||||
|
|
||||||
struct pico_ip6 zaddr;
|
|
||||||
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)&bind_rpc->addr;
|
|
||||||
char ipv6_str[INET6_ADDRSTRLEN];
|
char ipv6_str[INET6_ADDRSTRLEN];
|
||||||
inet_ntop(AF_INET6, &(in6->sin6_addr), 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);
|
// TODO: This isn't proper
|
||||||
DEBUG_ATTN("addr=%s:%d, physock=%p, picosock=%p", ipv6_str, Utils::ntoh(addr->sin_port), sock, (conn->picosock));
|
pico_string_to_ipv6("::", pip6.addr);
|
||||||
ret = picotap->picostack->__pico_socket_bind(conn->picosock, &zaddr, (uint16_t*)&(addr->sin_port));
|
//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));
|
||||||
|
|
||||||
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);
|
|
||||||
#endif
|
#endif
|
||||||
if(err < 0) {
|
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);
|
DEBUG_ERROR("unable to bind pico_socket(%p), err=%d", (conn->picosock), err);
|
||||||
if(err == PICO_ERR_EINVAL) {
|
if(err == PICO_ERR_EINVAL) {
|
||||||
DEBUG_ERROR("PICO_ERR_EINVAL - invalid argument");
|
DEBUG_ERROR("PICO_ERR_EINVAL - invalid argument");
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ int ipv6_tcp_client_test(struct sockaddr_in6 *addr, int port)
|
|||||||
{
|
{
|
||||||
int r, w, sockfd, err, len = strlen(str);
|
int r, w, sockfd, err, len = strlen(str);
|
||||||
char rbuf[STR_SIZE];
|
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");
|
printf("error creating ZeroTier socket");
|
||||||
}
|
}
|
||||||
if((err = zts_connect(sockfd, (const struct sockaddr *)addr, sizeof(addr))) < 0) {
|
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;
|
addr6.sin6_family = AF_INET6;
|
||||||
memmove((char *) &addr6.sin6_addr.s6_addr, (char *) server->h_addr, server->h_length);
|
memmove((char *) &addr6.sin6_addr.s6_addr, (char *) server->h_addr, server->h_length);
|
||||||
addr6.sin6_port = htons(port);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -279,6 +279,30 @@ InetAddress InetAddress::network() const
|
|||||||
return r;
|
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<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr_mask)->sin6_addr.s6_addr);
|
||||||
|
const uint8_t *m = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&mask)->sin6_addr.s6_addr);
|
||||||
|
const uint8_t *a = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(&addr)->sin6_addr.s6_addr);
|
||||||
|
const uint8_t *b = reinterpret_cast<const uint8_t *>(reinterpret_cast<const struct sockaddr_in6 *>(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
|
bool InetAddress::containsAddress(const InetAddress &addr) const
|
||||||
{
|
{
|
||||||
if (addr.ss_family == ss_family) {
|
if (addr.ss_family == ss_family) {
|
||||||
|
|||||||
@@ -347,6 +347,16 @@ struct InetAddress : public sockaddr_storage
|
|||||||
*/
|
*/
|
||||||
InetAddress network() const;
|
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
|
* Test whether this IP/netmask contains this address
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1005,7 +1005,7 @@ public:
|
|||||||
for(it = _nets.begin(); it != _nets.end(); it++) {
|
for(it = _nets.begin(); it != _nets.end(); it++) {
|
||||||
if(it->second.tap) {
|
if(it->second.tap) {
|
||||||
for(int j=0; j<it->second.tap->_ips.size(); j++) {
|
for(int j=0; j<it->second.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)) {
|
|| it->second.tap->_ips[j].ipsEqual(addr)) {
|
||||||
return it->second.tap;
|
return it->second.tap;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user