X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmeshlink.c;h=f6b12bd89d0e26e87e796290b3e9305263db573c;hb=3be09bc77ac43f45d3fc933f90c93567562d9231;hp=d9bd0146e94cedaf4b6dc5967e28f6a4f00483c9;hpb=eba5b30f09f91d95c56efb8f1d8613152c176856;p=meshlink diff --git a/src/meshlink.c b/src/meshlink.c index d9bd0146..f6b12bd8 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -1,6 +1,6 @@ /* meshlink.c -- Implementation of the MeshLink API. - Copyright (C) 2014-2018 Guus Sliepen + Copyright (C) 2014-2021 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1515,7 +1515,7 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) { mesh->appname = xstrdup(params->appname); mesh->devclass = params->devclass; - mesh->discovery = true; + mesh->discovery.enabled = true; mesh->invitation_timeout = 604800; // 1 week mesh->netns = params->netns; mesh->submeshes = NULL; @@ -1556,9 +1556,6 @@ meshlink_handle_t *meshlink_open_ex(const meshlink_open_params_t *params) { pthread_mutex_init(&mesh->mutex, &attr); pthread_cond_init(&mesh->cond, NULL); - pthread_mutex_init(&mesh->discovery_mutex, NULL); - pthread_cond_init(&mesh->discovery_cond, NULL); - pthread_cond_init(&mesh->adns_cond, NULL); mesh->threadstarted = false; @@ -1693,7 +1690,7 @@ static void *meshlink_main_loop(void *arg) { #endif // HAVE_SETNS } - if(mesh->discovery) { + if(mesh->discovery.enabled) { discovery_start(mesh); } @@ -1709,7 +1706,7 @@ static void *meshlink_main_loop(void *arg) { pthread_mutex_unlock(&mesh->mutex); // Stop discovery - if(mesh->discovery) { + if(mesh->discovery.enabled) { discovery_stop(mesh); } @@ -4555,7 +4552,7 @@ void meshlink_enable_discovery(meshlink_handle_t *mesh, bool enable) { abort(); } - if(mesh->discovery == enable) { + if(mesh->discovery.enabled == enable) { goto end; } @@ -4567,12 +4564,34 @@ void meshlink_enable_discovery(meshlink_handle_t *mesh, bool enable) { } } - mesh->discovery = enable; + mesh->discovery.enabled = enable; end: pthread_mutex_unlock(&mesh->mutex); } +void meshlink_hint_network_change(struct meshlink_handle *mesh) { + if(!mesh) { + meshlink_errno = MESHLINK_EINVAL; + return; + } + + if(pthread_mutex_lock(&mesh->mutex) != 0) { + abort(); + } + + if(mesh->discovery.enabled) { + scan_ifaddrs(mesh); + } + + if(mesh->loop.now.tv_sec > mesh->discovery.last_update + 5) { + mesh->discovery.last_update = mesh->loop.now.tv_sec; + handle_network_change(mesh, 1); + } + + pthread_mutex_unlock(&mesh->mutex); +} + void meshlink_set_dev_class_timeouts(meshlink_handle_t *mesh, dev_class_t devclass, int pinginterval, int pingtimeout) { if(!mesh || devclass < 0 || devclass >= DEV_CLASS_COUNT) { meshlink_errno = EINVAL; @@ -4641,6 +4660,11 @@ void meshlink_reset_timers(struct meshlink_handle *mesh) { } handle_network_change(mesh, true); + + if(mesh->discovery.enabled) { + discovery_refresh(mesh); + } + pthread_mutex_unlock(&mesh->mutex); }