summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-06-16 18:23:33 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-06-16 18:23:33 -0700
commit1bf1c38b30a12472d9cb2f36718ba69c9d43abe0 (patch)
tree9735dc6867b8964438794d6990d0bcf4f1f9b272
parenteb4a78bcc36de37a24a8f9de22f37a104895ff84 (diff)
downloadinfinitytier-1bf1c38b30a12472d9cb2f36718ba69c9d43abe0.tar.gz
infinitytier-1bf1c38b30a12472d9cb2f36718ba69c9d43abe0.zip
Default route population works on Mac!
-rw-r--r--node/InetAddress.cpp2
-rw-r--r--osdep/ManagedRoute.cpp4
-rw-r--r--osdep/ManagedRoute.hpp2
-rw-r--r--service/OneService.cpp14
4 files changed, 18 insertions, 4 deletions
diff --git a/node/InetAddress.cpp b/node/InetAddress.cpp
index dca772e8..30b1ff2e 100644
--- a/node/InetAddress.cpp
+++ b/node/InetAddress.cpp
@@ -279,6 +279,8 @@ bool InetAddress::containsAddress(const InetAddress &addr) const
switch(ss_family) {
case AF_INET: {
const unsigned int bits = netmaskBits();
+ if (bits == 0)
+ return true;
return ( (Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(&addr)->sin_addr.s_addr) >> (32 - bits)) == (Utils::ntoh((uint32_t)reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr) >> (32 - bits)) );
}
case AF_INET6: {
diff --git a/osdep/ManagedRoute.cpp b/osdep/ManagedRoute.cpp
index 118fc7d5..62597a00 100644
--- a/osdep/ManagedRoute.cpp
+++ b/osdep/ManagedRoute.cpp
@@ -234,8 +234,8 @@ static void _routeCmd(const char *op,const InetAddress &target,const InetAddress
int exitcode = -1;
::waitpid(p,&exitcode,0);
} else if (p == 0) {
- //::close(STDOUT_FILENO);
- //::close(STDERR_FILENO);
+ ::close(STDOUT_FILENO);
+ ::close(STDERR_FILENO);
if (via) {
if ((ifscope)&&(ifscope[0])) {
::execl(ZT_BSD_ROUTE_CMD,ZT_BSD_ROUTE_CMD,op,"-ifscope",ifscope,((target.ss_family == AF_INET6) ? "-inet6" : "-inet"),target.toString().c_str(),via.toIpString().c_str(),(const char *)0);
diff --git a/osdep/ManagedRoute.hpp b/osdep/ManagedRoute.hpp
index ca71b18b..7000e3a4 100644
--- a/osdep/ManagedRoute.hpp
+++ b/osdep/ManagedRoute.hpp
@@ -57,7 +57,7 @@ public:
*/
inline bool set(const InetAddress &target,const InetAddress &via,const char *device)
{
- if ((!_via)&&(!_device[0]))
+ if ((!via)&&(!device[0]))
return false;
this->remove();
_target = target;
diff --git a/service/OneService.cpp b/service/OneService.cpp
index 29916896..45f4234e 100644
--- a/service/OneService.cpp
+++ b/service/OneService.cpp
@@ -1327,6 +1327,18 @@ public:
const InetAddress *const via = reinterpret_cast<const InetAddress *>(&(nwc->routes[i].via));
bool haveRoute = false;
+
+ // We don't need to bother applying local routes to local managed IPs since these are implied by setting the IP
+ for(std::vector<InetAddress>::iterator ip(n.managedIps.begin());ip!=n.managedIps.end();++ip) {
+ if ((target->netmaskBits() == ip->netmaskBits())&&(target->containsAddress(*ip))) {
+ haveRoute = true;
+ break;
+ }
+ }
+
+ if (haveRoute)
+ continue;
+
for(std::list<ManagedRoute>::iterator mr(n.managedRoutes.begin());mr!=n.managedRoutes.end();++mr) {
if (mr->target() == *target) {
if ((via->ss_family == target->ss_family)&&(mr->via() == *via)) {
@@ -1338,11 +1350,11 @@ public:
}
}
}
+
if (haveRoute)
continue;
n.managedRoutes.push_back(ManagedRoute());
-
if ((target->isDefaultRoute())&&(n.allowDefault)) {
if (!n.managedRoutes.back().set(*target,*via,tapdev.c_str()))
n.managedRoutes.pop_back();