diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-09-13 16:25:48 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2016-09-13 16:25:48 -0700 |
commit | 8d0b2b781e30f4a953b2ea5810249c7266f02b30 (patch) | |
tree | f948708a9ebce91b7bb212c7806714479eedfa34 /osdep | |
parent | 83abc00aaedfa2eb9698af496bfa2f1891401726 (diff) | |
download | infinitytier-8d0b2b781e30f4a953b2ea5810249c7266f02b30.tar.gz infinitytier-8d0b2b781e30f4a953b2ea5810249c7266f02b30.zip |
Route management bug fixes.
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/ManagedRoute.cpp | 3 | ||||
-rw-r--r-- | osdep/ManagedRoute.hpp | 65 |
2 files changed, 17 insertions, 51 deletions
diff --git a/osdep/ManagedRoute.cpp b/osdep/ManagedRoute.cpp index ae20bb34..9763d271 100644 --- a/osdep/ManagedRoute.cpp +++ b/osdep/ManagedRoute.cpp @@ -240,6 +240,7 @@ static std::vector<_RTE> _getRTEs(const InetAddress &target,bool contains) static void _routeCmd(const char *op,const InetAddress &target,const InetAddress &via,const char *ifscope,const char *localInterface) { + //printf("route %s %s %s %s %s\n",op,target.toString().c_str(),(via) ? via.toString().c_str() : "(null)",(ifscope) ? ifscope : "(null)",(localInterface) ? localInterface : "(null)"); long p = (long)fork(); if (p > 0) { int exitcode = -1; @@ -436,7 +437,7 @@ bool ManagedRoute::sync() } if (!_applied.count(leftt)) { - _applied[rightt] = false; // not ifscoped + _applied[leftt] = false; // not ifscoped _routeCmd("add",leftt,_via,(const char *)0,(_via) ? (const char *)0 : _device); _routeCmd("change",leftt,_via,(const char *)0,(_via) ? (const char *)0 : _device); } diff --git a/osdep/ManagedRoute.hpp b/osdep/ManagedRoute.hpp index 4bf56503..fd77a79a 100644 --- a/osdep/ManagedRoute.hpp +++ b/osdep/ManagedRoute.hpp @@ -6,6 +6,9 @@ #include "../node/InetAddress.hpp" #include "../node/Utils.hpp" +#include "../node/SharedPtr.hpp" +#include "../node/AtomicCounter.hpp" +#include "../node/NonCopyable.hpp" #include <stdexcept> #include <vector> @@ -16,58 +19,13 @@ namespace ZeroTier { /** * A ZT-managed route that used C++ RAII semantics to automatically clean itself up on deallocate */ -class ManagedRoute +class ManagedRoute : NonCopyable { -public: - ManagedRoute() - { - _device[0] = (char)0; - _systemDevice[0] = (char)0; - } - - ~ManagedRoute() - { - this->remove(); - } - - ManagedRoute(const ManagedRoute &r) - { - *this = r; - } - - inline ManagedRoute &operator=(const ManagedRoute &r) - { - if (_applied.size() == 0) { - _target = r._target; - _via = r._via; - _systemVia = r._systemVia; - _applied = r._applied; - Utils::scopy(_device,sizeof(_device),r._device); - Utils::scopy(_systemDevice,sizeof(_systemDevice),r._systemDevice); - } else { - // Sanity check -- this is an 'assert' to detect a bug - fprintf(stderr,"Applied ManagedRoute isn't copyable!\n"); - abort(); - } - return *this; - } + friend class SharedPtr<ManagedRoute>; - /** - * Initialize object and set route - * - * Note: on Windows, use the interface NET_LUID in hexadecimal as the - * "device name." - * - * @param target Route target (e.g. 0.0.0.0/0 for default) - * @param via Route next L3 hop or NULL InetAddress if local in which case it will be routed via device - * @param device Name or hex LUID of ZeroTier device (e.g. zt#) - * @return True if route was successfully set - */ - inline bool set(const InetAddress &target,const InetAddress &via,const char *device) +public: + ManagedRoute(const InetAddress &target,const InetAddress &via,const char *device) { - if ((!via)&&(!device[0])) - return false; - this->remove(); _target = target; _via = via; if (via.ss_family == AF_INET) @@ -75,7 +33,12 @@ public: else if (via.ss_family == AF_INET6) _via.setPort(128); Utils::scopy(_device,sizeof(_device),device); - return this->sync(); + _systemDevice[0] = (char)0; + } + + ~ManagedRoute() + { + this->remove(); } /** @@ -108,6 +71,8 @@ private: std::map<InetAddress,bool> _applied; // routes currently applied char _device[128]; char _systemDevice[128]; // for route overrides + + AtomicCounter __refCount; }; } // namespace ZeroTier |