X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet.c;h=3c1ad3e625ee7b237fb590243719693f41a73297;hb=4c57e6902219ecca1872e18e34365d8e54a0f407;hp=95790ac1d287c84ed4f11e8cd19019288b2549b3;hpb=9f8ed2802da6b48cb71377da84a83db04d3530b8;p=meshlink diff --git a/src/net.c b/src/net.c index 95790ac1..3c1ad3e6 100644 --- a/src/net.c +++ b/src/net.c @@ -151,7 +151,7 @@ static void timeout_handler(event_loop_t *loop, void *data) { } } - timeout_set(&mesh->loop, data, &(struct timeval) { + timeout_set(&mesh->loop, data, &(struct timespec) { 1, prng(mesh, TIMER_FUDGE) }); } @@ -346,7 +346,8 @@ static void periodic_handler(event_loop_t *loop, void *data) { if(mesh->contradicting_del_edge > 100 && mesh->contradicting_add_edge > 100) { logger(mesh, MESHLINK_WARNING, "Possible node with same Name as us! Sleeping %d seconds.", mesh->sleeptime); - usleep(mesh->sleeptime * 1000000LL); + struct timespec ts = {mesh->sleeptime, 0}; + clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL); mesh->sleeptime *= 2; if(mesh->sleeptime < 0) { @@ -616,7 +617,7 @@ static void periodic_handler(event_loop_t *loop, void *data) { } } - timeout_set(&mesh->loop, data, &(struct timeval) { + timeout_set(&mesh->loop, data, &(struct timespec) { timeout, prng(mesh, TIMER_FUDGE) }); } @@ -633,17 +634,13 @@ void retry(meshlink_handle_t *mesh) { for list_each(outgoing_t, outgoing, mesh->outgoings) { outgoing->timeout = 0; - if(outgoing->ev.cb) - timeout_set(&mesh->loop, &outgoing->ev, &(struct timeval) { - 0, 0 - }); + if(outgoing->ev.cb) { + timeout_set(&mesh->loop, &outgoing->ev, &(struct timespec) { + 0, 0 + }); + } } -#if defined(HAVE_IFADDRS_H) && defined(HAVE_GETIFADDRS) && defined(HAVE_FREEIFADDRS) - struct ifaddrs *ifa = NULL; - getifaddrs(&ifa); -#endif - /* For active connections, check if their addresses are still valid. * If yes, reset their ping timers, otherwise terminate them. */ for list_each(connection_t, c, mesh->connections) { @@ -655,12 +652,6 @@ void retry(meshlink_handle_t *mesh) { c->last_ping_time = 0; } -#if defined(HAVE_IFADDRS_H) && defined(HAVE_GETIFADDRS) && defined(HAVE_FREEIFADDRS) - - if(!ifa) { - continue; - } - sockaddr_t sa; socklen_t salen = sizeof(sa); @@ -668,34 +659,35 @@ void retry(meshlink_handle_t *mesh) { continue; } - bool found = false; + switch(sa.sa.sa_family) { + case AF_INET: + sa.in.sin_port = 0; + break; - for(struct ifaddrs *ifap = ifa; ifap; ifap = ifap->ifa_next) { - if(ifap->ifa_addr && !sockaddrcmp_noport(&sa, (sockaddr_t *)ifap->ifa_addr)) { - found = true; - break; - } + case AF_INET6: + sa.in6.sin6_port = 0; + break; + default: + continue; } - if(!found) { + int sock = socket(sa.sa.sa_family, SOCK_STREAM, IPPROTO_TCP); + + if(sock != -1) { + continue; + } + + if(bind(sock, &sa.sa, salen) && errno == EADDRNOTAVAIL) { logger(mesh, MESHLINK_DEBUG, "Local address for connection to %s no longer valid, terminating", c->name); terminate_connection(mesh, c, c->status.active); } -#endif + closesocket(sock); } -#if defined(HAVE_IFADDRS_H) && defined(HAVE_GETIFADDRS) && defined(HAVE_FREEIFADDRS) - - if(ifa) { - freeifaddrs(ifa); - } - -#endif - /* Kick the ping timeout handler */ - timeout_set(&mesh->loop, &mesh->pingtimer, &(struct timeval) { + timeout_set(&mesh->loop, &mesh->pingtimer, &(struct timespec) { 0, 0 }); } @@ -704,10 +696,10 @@ void retry(meshlink_handle_t *mesh) { this is where it all happens... */ void main_loop(meshlink_handle_t *mesh) { - timeout_add(&mesh->loop, &mesh->pingtimer, timeout_handler, &mesh->pingtimer, &(struct timeval) { + timeout_add(&mesh->loop, &mesh->pingtimer, timeout_handler, &mesh->pingtimer, &(struct timespec) { 1, prng(mesh, TIMER_FUDGE) }); - timeout_add(&mesh->loop, &mesh->periodictimer, periodic_handler, &mesh->periodictimer, &(struct timeval) { + timeout_add(&mesh->loop, &mesh->periodictimer, periodic_handler, &mesh->periodictimer, &(struct timespec) { 0, 0 });