]> git.meshlink.io Git - meshlink/blobdiff - src/protocol_auth.c
Detect duplicate outgoing connections.
[meshlink] / src / protocol_auth.c
index f7e925284ba7e1dac7318ca531cbfeb2e88b2e7e..18fbb64af0438eac8deb38fc16187272bec26083 100644 (file)
@@ -27,7 +27,7 @@
 #include <openssl/err.h>
 #include <openssl/evp.h>
 
-#include "avl_tree.h"
+#include "splay_tree.h"
 #include "conf.h"
 #include "connection.h"
 #include "edge.h"
@@ -483,7 +483,7 @@ bool send_ack(connection_t *c) {
 }
 
 static void send_everything(connection_t *c) {
-       avl_node_t *node, *node2;
+       splay_node_t *node, *node2;
        node_t *n;
        subnet_t *s;
        edge_t *e;
@@ -540,8 +540,17 @@ bool ack_h(connection_t *c) {
        } else {
                if(n->connection) {
                        /* Oh dear, we already have a connection to this node. */
-                       ifdebug(CONNECTIONS) logger(LOG_DEBUG, _("Established a second connection with %s (%s), closing old connection"),
-                                          n->name, n->hostname);
+                       ifdebug(CONNECTIONS) logger(LOG_DEBUG, _("Established a second connection with %s (%s), closing old connection"), n->connection->name, n->connection->hostname);
+
+                       if(n->connection->outgoing) {
+                               if(c->outgoing)
+                                       logger(LOG_WARNING, _("Two outgoing connections to the same node!"));
+                               else
+                                       c->outgoing = n->connection->outgoing;
+
+                               n->connection->outgoing = NULL;
+                       }
+
                        terminate_connection(n->connection, false);
                        /* Run graph algorithm to purge key and make sure up/down scripts are rerun with new IP addresses and stuff */
                        graph();