X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fmeshlink.c;h=8f0f82d1a8ae1c3afe5f94f0db22c134c2783ecd;hp=d094452733712c2e1b02b3bbfaa09efce7e96cca;hb=de126fa104aaeabbc66b5dd59da9d07da2f0fd97;hpb=7b36d61024ee05caa638f7cd45044b98b31b8aa8 diff --git a/src/meshlink.c b/src/meshlink.c index d0944527..8f0f82d1 100644 --- a/src/meshlink.c +++ b/src/meshlink.c @@ -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); } }