From de126fa104aaeabbc66b5dd59da9d07da2f0fd97 Mon Sep 17 00:00:00 2001 From: SS Roop Date: Tue, 12 Feb 2019 23:02:59 +0530 Subject: [PATCH] Add channel disconnection fix when node blacklisted --- src/graph.c | 4 +++- src/meshlink.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++-- src/net_setup.c | 21 +++++++++++++++++++ src/utcp | 2 +- 4 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/graph.c b/src/graph.c index 9b0184b0..19a33e2e 100644 --- a/src/graph.c +++ b/src/graph.c @@ -229,7 +229,9 @@ static void check_reachability(meshlink_handle_t *mesh) { timeout_del(&mesh->loop, &n->mtutimeout); - update_node_status(mesh, n); + if(!n->status.blacklisted) { + update_node_status(mesh, n); + } if(!n->status.reachable) { update_node_udp(mesh, n, NULL); 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); } } diff --git a/src/net_setup.c b/src/net_setup.c index 47ed32e0..70ed294e 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -190,6 +190,26 @@ exit: return n->submesh != NULL; } +bool node_read_blacklist_status(meshlink_handle_t *mesh, node_t *n) { + + splay_tree_t *config_tree; + bool blacklist_status; + + init_configuration(&config_tree); + + if(!read_host_config(mesh, config_tree, n->name)) { + goto exit; + } + + if(get_config_bool(lookup_config(config_tree, "blacklisted"), &blacklist_status)) { + n->status.blacklisted = blacklist_status; + } + +exit: + exit_configuration(&config_tree); + return n->status.blacklisted; +} + bool node_write_devclass(meshlink_handle_t *mesh, node_t *n) { if((int)n->devclass < 0 || n->devclass > _DEV_CLASS_MAX) { @@ -292,6 +312,7 @@ void load_all_nodes(meshlink_handle_t *mesh) { n->name = xstrdup(ent->d_name); node_read_devclass(mesh, n); node_read_submesh(mesh, n); + node_read_blacklist_status(mesh, n); node_add(mesh, n); } diff --git a/src/utcp b/src/utcp index fad2787f..f1035e97 160000 --- a/src/utcp +++ b/src/utcp @@ -1 +1 @@ -Subproject commit fad2787f2394bad3cf105ca5b4cf411db6d34aa6 +Subproject commit f1035e971bb894203bdfba6cafbaf0bb30f197eb -- 2.39.2