diff --git a/include/libzt.h b/include/libzt.h index c471b86..1bbc73c 100644 --- a/include/libzt.h +++ b/include/libzt.h @@ -105,9 +105,19 @@ struct zts_ifreq { // For LWIP configuration see: include/lwipopts.h #if defined(STACK_LWIP) +/* + Specifies the polling interval and the callback function that should + be called to poll the application. The interval is specified in + number of TCP coarse grained timer shots, which typically occurs + twice a second. An interval of 10 means that the application would + be polled every 5 seconds. */ #define LWIP_APPLICATION_POLL_FREQ 2 -#define LWIP_TCP_TIMER_INTERVAL 50 -#define LWIP_STATUS_TMR_INTERVAL 500 // How often we check VirtualSocket statuses (in ms) + +#define LWIP_TCP_TIMER_INTERVAL 25 + +// How often we check VirtualSocket statuses (in ms) +#define LWIP_STATUS_TMR_INTERVAL 500 + // #define LWIP_CHKSUM , See: RFC1071 for inspiration #endif @@ -591,26 +601,26 @@ ZeroTier::VirtualSocket *get_virtual_socket(int fd); /* * Removes a VirtualSocket */ -void del_virtual_socket(int fd); +int del_virtual_socket(int fd); /* * Adds a virtualSocket */ -void add_unassigned_virtual_socket(int fd, ZeroTier::VirtualSocket *vs); +int add_unassigned_virtual_socket(int fd, ZeroTier::VirtualSocket *vs); /* * Removes unassigned VirtualSocket */ -void del_unassigned_virtual_socket(int fd); +int del_unassigned_virtual_socket(int fd); /* * Adds an assigned VirtualSocket */ -void add_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd); +int add_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd); /* * Removes an assigned VirtualSocket */ -void del_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd); +int del_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd); /* * Gets a pair of associated virtual objects (VirtualSocket bound to a VirtualTap) diff --git a/src/libzt.cpp b/src/libzt.cpp index 91b5a75..a6b2236 100644 --- a/src/libzt.cpp +++ b/src/libzt.cpp @@ -140,7 +140,16 @@ void zts_simple_start(const char *path, const char *nwid) while(!zts_running()) { nanosleep((const struct timespec[]){{0, (ZT_API_CHECK_INTERVAL * 1000000)}}, NULL); } - zts_join(nwid); + while(1) { + try { + zts_join(nwid); + break; + } + catch( ... ) { + DEBUG_ERROR("there was a problem joining the virtual network"); + handle_general_failure(); + } + } while(!zts_has_address(nwid)) { nanosleep((const struct timespec[]){{0, (ZT_API_CHECK_INTERVAL * 1000000)}}, NULL); } @@ -2153,66 +2162,111 @@ ZeroTier::VirtualSocket *get_virtual_socket(int fd) return vs; } -void del_virtual_socket(int fd) +int del_virtual_socket(int fd) { + int err = 0; ZeroTier::_multiplexer_lock.lock(); - std::map::iterator un_iter = ZeroTier::unmap.find(fd); - if(un_iter != ZeroTier::unmap.end()) { - ZeroTier::unmap.erase(un_iter); + try { + std::map::iterator un_iter = ZeroTier::unmap.find(fd); + if(un_iter != ZeroTier::unmap.end()) { + ZeroTier::unmap.erase(un_iter); + } + std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); + if(fd_iter != ZeroTier::fdmap.end()) { + ZeroTier::fdmap.erase(fd_iter); + } } - std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); - if(fd_iter != ZeroTier::fdmap.end()) { - ZeroTier::fdmap.erase(fd_iter); - } - ZeroTier::_multiplexer_lock.unlock(); -} - -void add_unassigned_virtual_socket(int fd, ZeroTier::VirtualSocket *vs) -{ - ZeroTier::_multiplexer_lock.lock(); - std::map::iterator un_iter = ZeroTier::unmap.find(fd); - if(un_iter == ZeroTier::unmap.end()) { - ZeroTier::unmap[fd] = vs; - } - else { - DEBUG_ERROR("fd=%d already contained in map", fd); + catch( ... ) { + DEBUG_ERROR("unable to remove virtual socket"); handle_general_failure(); + err = -1; } ZeroTier::_multiplexer_lock.unlock(); + return err; } -void del_unassigned_virtual_socket(int fd) +int add_unassigned_virtual_socket(int fd, ZeroTier::VirtualSocket *vs) { + int err = 0; ZeroTier::_multiplexer_lock.lock(); - std::map::iterator un_iter = ZeroTier::unmap.find(fd); - if(un_iter != ZeroTier::unmap.end()) { - ZeroTier::unmap.erase(un_iter); + try { + std::map::iterator un_iter = ZeroTier::unmap.find(fd); + if(un_iter == ZeroTier::unmap.end()) { + ZeroTier::unmap[fd] = vs; + } + else { + DEBUG_ERROR("fd=%d already contained in map", fd); + handle_general_failure(); + } } - ZeroTier::_multiplexer_lock.unlock(); -} - -void add_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd) -{ - ZeroTier::_multiplexer_lock.lock(); - std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); - if(fd_iter == ZeroTier::fdmap.end()) { - ZeroTier::fdmap[fd] = new std::pair(vs, tap); - } - else { - DEBUG_ERROR("fd=%d already contained in > map", fd); + catch( ... ) { + DEBUG_ERROR("unable to add virtual socket"); handle_general_failure(); + err = -1; } ZeroTier::_multiplexer_lock.unlock(); + return err; } -void del_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd) +int del_unassigned_virtual_socket(int fd) { + int err = 0; ZeroTier::_multiplexer_lock.lock(); - std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); - if(fd_iter != ZeroTier::fdmap.end()) { - ZeroTier::fdmap.erase(fd_iter); + try { + std::map::iterator un_iter = ZeroTier::unmap.find(fd); + if(un_iter != ZeroTier::unmap.end()) { + ZeroTier::unmap.erase(un_iter); + } + } + catch( ... ) { + DEBUG_ERROR("unable to remove virtual socket"); + handle_general_failure(); + err = -1; } ZeroTier::_multiplexer_lock.unlock(); + return err; +} + +int add_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd) +{ + int err = 0; + ZeroTier::_multiplexer_lock.lock(); + try { + std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); + if(fd_iter == ZeroTier::fdmap.end()) { + ZeroTier::fdmap[fd] = new std::pair(vs, tap); + } + else { + DEBUG_ERROR("fd=%d already contained in > map", fd); + handle_general_failure(); + } + } + catch( ... ) { + DEBUG_ERROR("unable to add virtual socket"); + handle_general_failure(); + err = -1; + } + ZeroTier::_multiplexer_lock.unlock(); + return err; +} + +int del_assigned_virtual_socket(ZeroTier::VirtualTap *tap, ZeroTier::VirtualSocket *vs, int fd) +{ + int err = 0; + ZeroTier::_multiplexer_lock.lock(); + try { + std::map*>::iterator fd_iter = ZeroTier::fdmap.find(fd); + if(fd_iter != ZeroTier::fdmap.end()) { + ZeroTier::fdmap.erase(fd_iter); + } + } + catch( ... ) { + DEBUG_ERROR("unable to remove virtual socket"); + handle_general_failure(); + err = -1; + } + ZeroTier::_multiplexer_lock.unlock(); + return err; } std::pair *get_assigned_virtual_pair(int fd)