|
|
|
@ -51,6 +51,10 @@ namespace ZeroTier { |
|
|
|
extern OneService *zt1Service; |
|
|
|
extern OneService *zt1Service; |
|
|
|
extern void (*_userCallbackFunc)(uint64_t, int); |
|
|
|
extern void (*_userCallbackFunc)(uint64_t, int); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* A virtual tap device. The ZeroTier core service creates one of these for each |
|
|
|
|
|
|
|
* virtual network joined. It will be destroyed upon leave(). |
|
|
|
|
|
|
|
*/ |
|
|
|
VirtualTap::VirtualTap( |
|
|
|
VirtualTap::VirtualTap( |
|
|
|
const char *homePath, |
|
|
|
const char *homePath, |
|
|
|
const MAC &mac, |
|
|
|
const MAC &mac, |
|
|
|
@ -247,72 +251,68 @@ void VirtualTap::threadMain() |
|
|
|
|
|
|
|
|
|
|
|
void VirtualTap::Housekeeping() |
|
|
|
void VirtualTap::Housekeeping() |
|
|
|
{ |
|
|
|
{ |
|
|
|
Mutex::Lock _l(_tcpconns_m); |
|
|
|
/*
|
|
|
|
|
|
|
|
Mutex::Lock _l(_tap_m); |
|
|
|
OneService *service = ((OneService *)zt1Service); |
|
|
|
OneService *service = ((OneService *)zt1Service); |
|
|
|
if (!service) { |
|
|
|
if (!service) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
nd.num_routes = ZTS_MAX_NETWORK_ROUTES; |
|
|
|
nd.num_routes = ZTS_MAX_NETWORK_ROUTES; |
|
|
|
service->getRoutes(this->_nwid, (ZT_VirtualNetworkRoute*)&(nd.routes)[0], &(nd.num_routes)); |
|
|
|
service->getRoutes(this->_nwid, (ZT_VirtualNetworkRoute*)&(nd.routes)[0], &(nd.num_routes)); |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InetAddress target_addr; |
|
|
|
|
|
|
|
InetAddress via_addr; |
|
|
|
|
|
|
|
InetAddress null_addr; |
|
|
|
|
|
|
|
InetAddress nm; |
|
|
|
|
|
|
|
null_addr.fromString(""); |
|
|
|
|
|
|
|
bool found; |
|
|
|
|
|
|
|
char ipbuf[INET6_ADDRSTRLEN], ipbuf2[INET6_ADDRSTRLEN], ipbuf3[INET6_ADDRSTRLEN]; |
|
|
|
|
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
// TODO: Rework this when we have time
|
|
|
|
InetAddress target_addr; |
|
|
|
// check if pushed route exists in tap (add)
|
|
|
|
InetAddress via_addr; |
|
|
|
/*
|
|
|
|
InetAddress null_addr; |
|
|
|
for (int i=0; i<ZT_MAX_NETWORK_ROUTES; i++) { |
|
|
|
InetAddress nm; |
|
|
|
found = false; |
|
|
|
null_addr.fromString(""); |
|
|
|
target_addr = managed_routes->at(i).target; |
|
|
|
bool found; |
|
|
|
via_addr = managed_routes->at(i).via; |
|
|
|
char ipbuf[INET6_ADDRSTRLEN], ipbuf2[INET6_ADDRSTRLEN], ipbuf3[INET6_ADDRSTRLEN]; |
|
|
|
nm = target_addr.netmask(); |
|
|
|
|
|
|
|
for (size_t j=0; j<routes.size(); j++) { |
|
|
|
// TODO: Rework this when we have time
|
|
|
|
if (via_addr.ipsEqual(null_addr) || target_addr.ipsEqual(null_addr)) { |
|
|
|
// check if pushed route exists in tap (add)
|
|
|
|
found=true; |
|
|
|
/*
|
|
|
|
continue; |
|
|
|
for (int i=0; i<ZT_MAX_NETWORK_ROUTES; i++) { |
|
|
|
} |
|
|
|
found = false; |
|
|
|
if (routes[j].first.ipsEqual(target_addr) && routes[j].second.ipsEqual(nm)) { |
|
|
|
target_addr = managed_routes->at(i).target; |
|
|
|
found=true; |
|
|
|
via_addr = managed_routes->at(i).via; |
|
|
|
} |
|
|
|
nm = target_addr.netmask(); |
|
|
|
} |
|
|
|
for (size_t j=0; j<routes.size(); j++) { |
|
|
|
if (found == false) { |
|
|
|
if (via_addr.ipsEqual(null_addr) || target_addr.ipsEqual(null_addr)) { |
|
|
|
if (via_addr.ipsEqual(null_addr) == false) { |
|
|
|
found=true; |
|
|
|
DEBUG_INFO("adding route <target=%s, nm=%s, via=%s>", target_addr.toString(ipbuf), nm.toString(ipbuf2), via_addr.toString(ipbuf3)); |
|
|
|
continue; |
|
|
|
routes.push_back(std::pair<InetAddress,InetAddress>(target_addr, nm)); |
|
|
|
} |
|
|
|
routeAdd(target_addr, nm, via_addr); |
|
|
|
if (routes[j].first.ipsEqual(target_addr) && routes[j].second.ipsEqual(nm)) { |
|
|
|
} |
|
|
|
found=true; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
// check if route exists in tap but not in pushed routes (remove)
|
|
|
|
} |
|
|
|
for (size_t i=0; i<routes.size(); i++) { |
|
|
|
if (found == false) { |
|
|
|
found = false; |
|
|
|
if (via_addr.ipsEqual(null_addr) == false) { |
|
|
|
for (int j=0; j<ZT_MAX_NETWORK_ROUTES; j++) { |
|
|
|
DEBUG_INFO("adding route <target=%s, nm=%s, via=%s>", target_addr.toString(ipbuf), nm.toString(ipbuf2), via_addr.toString(ipbuf3)); |
|
|
|
target_addr = managed_routes->at(j).target; |
|
|
|
routes.push_back(std::pair<InetAddress,InetAddress>(target_addr, nm)); |
|
|
|
via_addr = managed_routes->at(j).via; |
|
|
|
routeAdd(target_addr, nm, via_addr); |
|
|
|
nm = target_addr.netmask(); |
|
|
|
} |
|
|
|
if (routes[i].first.ipsEqual(target_addr) && routes[i].second.ipsEqual(nm)) { |
|
|
|
} |
|
|
|
found=true; |
|
|
|
} |
|
|
|
} |
|
|
|
// check if route exists in tap but not in pushed routes (remove)
|
|
|
|
} |
|
|
|
for (size_t i=0; i<routes.size(); i++) { |
|
|
|
if (found == false) { |
|
|
|
found = false; |
|
|
|
DEBUG_INFO("removing route to <%s,%s>", routes[i].first.toString(ipbuf), routes[i].second.toString(ipbuf2)); |
|
|
|
for (int j=0; j<ZT_MAX_NETWORK_ROUTES; j++) { |
|
|
|
routes.erase(routes.begin() + i); |
|
|
|
target_addr = managed_routes->at(j).target; |
|
|
|
routeDelete(routes[i].first, routes[i].second); |
|
|
|
via_addr = managed_routes->at(j).via; |
|
|
|
} |
|
|
|
nm = target_addr.netmask(); |
|
|
|
|
|
|
|
if (routes[i].first.ipsEqual(target_addr) && routes[i].second.ipsEqual(nm)) { |
|
|
|
|
|
|
|
found=true; |
|
|
|
} |
|
|
|
} |
|
|
|
*/ |
|
|
|
} |
|
|
|
//}
|
|
|
|
if (found == false) { |
|
|
|
// TODO: Clean up VirtualSocket objects
|
|
|
|
DEBUG_INFO("removing route to <%s,%s>", routes[i].first.toString(ipbuf), routes[i].second.toString(ipbuf2)); |
|
|
|
|
|
|
|
routes.erase(routes.begin() + i); |
|
|
|
|
|
|
|
routeDelete(routes[i].first, routes[i].second); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
*/ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|