]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Add channel disconnection fix when node blacklisted
[meshlink] / src / meshlink.c
index d094452733712c2e1b02b3bbfaa09efce7e96cca..8f0f82d1a8ae1c3afe5f94f0db22c134c2783ecd 100644 (file)
@@ -1732,6 +1732,13 @@ bool meshlink_send(meshlink_handle_t *mesh, meshlink_node_t *destination, const
                return false;
        }
 
+       node_t *n = (node_t *)destination;
+
+       if(n->status.blacklisted) {
+               logger(mesh, MESHLINK_ERROR, "Node %s blacklisted, dropping packet\n", n->name);
+               return false;
+       }
+
        // Prepare the packet
        vpn_packet_t *packet = malloc(sizeof(*packet));
 
@@ -2773,6 +2780,20 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
 
        node_t *n;
        n = (node_t *)node;
+
+       if(n == mesh->self) {
+               logger(mesh, MESHLINK_ERROR, "%s blacklisting itself?\n", node->name);
+               meshlink_errno = MESHLINK_EINVAL;
+               pthread_mutex_unlock(&(mesh->mesh_mutex));
+               return;
+       }
+
+       if(n->status.blacklisted) {
+               logger(mesh, MESHLINK_DEBUG, "Node %s already blacklisted\n", node->name);
+               pthread_mutex_unlock(&(mesh->mesh_mutex));
+               return;
+       }
+
        n->status.blacklisted = true;
        logger(mesh, MESHLINK_DEBUG, "Blacklisted %s.\n", node->name);
 
@@ -2786,6 +2807,18 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
                }
        }
 
+       utcp_abort_all_connections(n->utcp);
+
+       n->mtu = 0;
+       n->minmtu = 0;
+       n->maxmtu = MTU;
+       n->mtuprobes = 0;
+       n->status.udp_confirmed = false;
+
+       if(n->status.reachable) {
+               update_node_status(mesh, n);
+       }
+
        pthread_mutex_unlock(&(mesh->mesh_mutex));
 }
 
@@ -2798,9 +2831,22 @@ void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node) {
        pthread_mutex_lock(&(mesh->mesh_mutex));
 
        node_t *n = (node_t *)node;
+
+       if(!n->status.blacklisted) {
+               logger(mesh, MESHLINK_DEBUG, "Node %s was already whitelisted\n", node->name);
+               meshlink_errno = MESHLINK_EINVAL;
+               pthread_mutex_unlock(&(mesh->mesh_mutex));
+               return;
+       }
+
        n->status.blacklisted = false;
 
-       //TODO: remove blacklisted = yes from the config file
+       if(n->status.reachable) {
+               update_node_status(mesh, n);
+       }
+
+       //Remove blacklisting from the config file
+       append_config_file(mesh, n->name, "blacklisted", NULL);
 
        pthread_mutex_unlock(&(mesh->mesh_mutex));
        return;
@@ -2989,6 +3035,11 @@ meshlink_channel_t *meshlink_channel_open_ex(meshlink_handle_t *mesh, meshlink_n
                }
        }
 
+       if(n->status.blacklisted) {
+               logger(mesh, MESHLINK_ERROR, "Cannot open a channel with blacklisted node\n");
+               return NULL;
+       }
+
        meshlink_channel_t *channel = xzalloc(sizeof(*channel));
        channel->node = n;
        channel->receive_cb = cb;
@@ -3072,7 +3123,7 @@ 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);
+               mesh->node_status_cb(mesh, (meshlink_node_t *)n, n->status.reachable && !n->status.blacklisted);
        }
 }