From: Guus Sliepen Date: Sun, 11 Oct 2020 14:16:31 +0000 (+0200) Subject: When a new connection is activated, terminate any pending connections to the same... X-Git-Url: https://git.meshlink.io/?a=commitdiff_plain;h=7ce3c30b3e5aa9505a103291455827eb4cda65a7;p=meshlink When a new connection is activated, terminate any pending connections to the same peer. This prevents issues mainly in the test suite where peers try to connect to each other simultaneously, and have to terminate one of the connections. Before both connections would succeed, and both would be terminated, leading to a loop of reconnections until enough randomness got in to break the tie. --- diff --git a/src/protocol_auth.c b/src/protocol_auth.c index 7db41d51..7bf12198 100644 --- a/src/protocol_auth.c +++ b/src/protocol_auth.c @@ -381,6 +381,25 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) { mesh->meta_status_cb(mesh, (meshlink_node_t *)n, true); } + /* Terminate any connections to this node that are not activated yet */ + + for list_each(connection_t, other, mesh->connections) { + if(!other->status.active && !strcmp(other->name, c->name)) { + if(other->outgoing) { + if(c->outgoing) { + logger(mesh, MESHLINK_WARNING, "Two outgoing connections to the same node!"); + } else { + c->outgoing = other->outgoing; + } + + other->outgoing = NULL; + } + + logger(mesh, MESHLINK_DEBUG, "Terminating pending second connection with %s", n->name); + terminate_connection(mesh, other, false); + } + } + /* Send him everything we know */ send_everything(mesh, c);