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.
mesh->meta_status_cb(mesh, (meshlink_node_t *)n, true);
}
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);
/* Send him everything we know */
send_everything(mesh, c);