diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-07-12 15:00:30 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-07-12 15:00:30 -0700 |
commit | 89125150112fecca2372e5531bfefe6becd91129 (patch) | |
tree | 417c57c2b962aa7c5053a7422ecc510965ac7681 | |
parent | 6ec3464ee94dc9059477c6ef8f7c4d7e4045b914 (diff) | |
download | infinitytier-89125150112fecca2372e5531bfefe6becd91129.tar.gz infinitytier-89125150112fecca2372e5531bfefe6becd91129.zip |
Fix to fix to GitHub issue #352
-rw-r--r-- | service/OneService.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/service/OneService.cpp b/service/OneService.cpp index 71bf8e68..13820f5c 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -1092,6 +1092,16 @@ public: } } + // Match only an IP from a vector of IPs -- used in syncManagedStuff() + bool matchIpOnly(const std::vector<InetAddress> &ips,const InetAddress &ip) const + { + for(std::vector<InetAddress>::const_iterator i(ips.begin());i!=ips.end();++i) { + if (i->ipsEqual(ip)) + return true; + } + return false; + } + // Apply or update managed IPs for a configured network (be sure n.tap exists) void syncManagedStuff(NetworkState &n,bool syncIps,bool syncRoutes) { @@ -1136,7 +1146,7 @@ public: // Nuke applied routes that are no longer in n.config.routes[] and/or are not allowed for(std::list<ManagedRoute>::iterator mr(n.managedRoutes.begin());mr!=n.managedRoutes.end();) { bool haveRoute = false; - if ( (checkIfManagedIsAllowed(n,mr->target())) && ((!mr->via())||(std::find(myIps.begin(),myIps.end(),mr->via()) == myIps.end())) ) { + if ( (checkIfManagedIsAllowed(n,mr->target())) && ((mr->via().ss_family != mr->target().ss_family)||(!matchIpOnly(myIps,mr->via()))) ) { for(unsigned int i=0;i<n.config.routeCount;++i) { const InetAddress *const target = reinterpret_cast<const InetAddress *>(&(n.config.routes[i].target)); const InetAddress *const via = reinterpret_cast<const InetAddress *>(&(n.config.routes[i].via)); @@ -1158,7 +1168,7 @@ public: const InetAddress *const target = reinterpret_cast<const InetAddress *>(&(n.config.routes[i].target)); const InetAddress *const via = reinterpret_cast<const InetAddress *>(&(n.config.routes[i].via)); - if ( (!checkIfManagedIsAllowed(n,*target)) || ((via->ss_family == target->ss_family)&&(std::find(myIps.begin(),myIps.end(),*via) != myIps.end())) ) + if ( (!checkIfManagedIsAllowed(n,*target)) || ((via->ss_family == target->ss_family)&&(matchIpOnly(myIps,*via))) ) continue; bool haveRoute = false; |