]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Add missing mutex locks.
[meshlink] / src / meshlink.c
index 1b33e88d47d3e3a9801c907f44be42d1a617f306..958c23e4d83c14cc748fcf3cbb162195395234f0 100644 (file)
@@ -1672,6 +1672,17 @@ void meshlink_set_node_status_cb(meshlink_handle_t *mesh, meshlink_node_status_c
        pthread_mutex_unlock(&(mesh->mesh_mutex));
 }
 
+void meshlink_set_node_pmtu_cb(meshlink_handle_t *mesh, meshlink_node_pmtu_cb_t cb) {
+       if(!mesh) {
+               meshlink_errno = MESHLINK_EINVAL;
+               return;
+       }
+
+       pthread_mutex_lock(&(mesh->mesh_mutex));
+       mesh->node_pmtu_cb = cb;
+       pthread_mutex_unlock(&(mesh->mesh_mutex));
+}
+
 void meshlink_set_node_duplicate_cb(meshlink_handle_t *mesh, meshlink_node_duplicate_cb_t cb) {
        if(!mesh) {
                meshlink_errno = MESHLINK_EINVAL;
@@ -2812,6 +2823,10 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) {
        node_write_config(mesh, n);
        config_sync(mesh, "current");
 
+       if(n->status.reachable) {
+               update_node_status(mesh, n);
+       }
+
        pthread_mutex_unlock(&(mesh->mesh_mutex));
        return;
 }
@@ -3137,7 +3152,9 @@ void meshlink_channel_shutdown(meshlink_handle_t *mesh, meshlink_channel_t *chan
                return;
        }
 
+       pthread_mutex_lock(&mesh->mesh_mutex);
        utcp_shutdown(channel->c, direction);
+       pthread_mutex_unlock(&mesh->mesh_mutex);
 }
 
 void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel) {
@@ -3146,6 +3163,8 @@ void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel
                return;
        }
 
+       pthread_mutex_lock(&mesh->mesh_mutex);
+
        utcp_close(channel->c);
 
        /* Clean up any outstanding AIO buffers. */
@@ -3161,6 +3180,8 @@ void meshlink_channel_close(meshlink_handle_t *mesh, meshlink_channel_t *channel
                free(aio);
        }
 
+       pthread_mutex_unlock(&mesh->mesh_mutex);
+
        free(channel);
 }
 
@@ -3379,6 +3400,16 @@ void update_node_status(meshlink_handle_t *mesh, node_t *n) {
        if(mesh->node_status_cb) {
                mesh->node_status_cb(mesh, (meshlink_node_t *)n, n->status.reachable && !n->status.blacklisted);
        }
+
+       if(mesh->node_pmtu_cb) {
+               mesh->node_pmtu_cb(mesh, (meshlink_node_t *)n, n->minmtu);
+       }
+}
+
+void update_node_pmtu(meshlink_handle_t *mesh, node_t *n) {
+       if(mesh->node_pmtu_cb && !n->status.blacklisted) {
+               mesh->node_pmtu_cb(mesh, (meshlink_node_t *)n, n->minmtu);
+       }
 }
 
 void handle_duplicate_node(meshlink_handle_t *mesh, node_t *n) {