]> git.meshlink.io Git - meshlink-tiny/blobdiff - src/protocol_auth.c
Ensure we exchange a session key for application data exchange.
[meshlink-tiny] / src / protocol_auth.c
index 943040e9fd528d4c6894ce135997564ff28cd18b..573da14817126e6876bed2d15397f747adc2d815 100644 (file)
@@ -23,8 +23,6 @@
 #include "connection.h"
 #include "devtools.h"
 #include "ecdsa.h"
-#include "edge.h"
-#include "graph.h"
 #include "logger.h"
 #include "meshlink_internal.h"
 #include "meta.h"
@@ -44,7 +42,7 @@
 extern bool node_write_devclass(meshlink_handle_t *mesh, node_t *n);
 
 bool send_id(meshlink_handle_t *mesh, connection_t *c) {
-       return send_request(mesh, c, NULL, "%d %s %d.%d %s", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname);
+       return send_request(mesh, c, "%d %s %d.%d %s", ID, mesh->self->name, PROT_MAJOR, PROT_MINOR, mesh->appname);
 }
 
 bool id_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
@@ -145,17 +143,7 @@ bool send_ack(meshlink_handle_t *mesh, connection_t *c) {
        }
 
        c->last_ping_time = mesh->loop.now.tv_sec;
-       return send_request(mesh, c, NULL, "%d %s %d %x", ACK, mesh->myport, mesh->devclass, OPTION_PMTU_DISCOVERY | (PROT_MINOR << 24));
-}
-
-static void send_everything(meshlink_handle_t *mesh, connection_t *c) {
-       /* Send all known subnets and edges */
-
-       for splay_each(node_t, n, mesh->nodes) {
-               for inner_splay_each(edge_t, e, n->edge_tree) {
-                       send_add_edge(mesh, c, e, 0);
-               }
-       }
+       return send_request(mesh, c, "%d %s %d %x", ACK, mesh->myport, mesh->devclass, OPTION_PMTU_DISCOVERY | (PROT_MINOR << 24));
 }
 
 bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
@@ -185,27 +173,6 @@ bool ack_h(meshlink_handle_t *mesh, connection_t *c, const char *request) {
                n = new_node();
                n->name = xstrdup(c->name);
                node_add(mesh, n);
-       } else {
-               if(n->connection) {
-                       /* Oh dear, we already have a connection to this node. */
-                       logger(mesh, MESHLINK_INFO, "Established a second connection with %s, closing old connection", n->connection->name);
-
-                       if(n->connection->outgoing) {
-                               if(c->outgoing) {
-                                       logger(mesh, MESHLINK_WARNING, "Two outgoing connections to the same node!");
-                               } else {
-                                       c->outgoing = n->connection->outgoing;
-                               }
-
-                               n->connection->outgoing = NULL;
-                       }
-
-                       /* Remove the edge before terminating the connection, to prevent a graph update. */
-                       edge_del(mesh, n->connection->edge);
-                       n->connection->edge = NULL;
-
-                       terminate_connection(mesh, n->connection, false);
-               }
        }
 
        n->devclass = devclass;
@@ -229,50 +196,9 @@ 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);
-
-       /* Create an edge_t for this connection */
-
-       assert(devclass >= 0 && devclass < DEV_CLASS_COUNT);
-
-       c->edge = new_edge();
-       c->edge->from = mesh->self;
-       c->edge->to = n;
-       sockaddrcpy_setport(&c->edge->address, &c->address, atoi(hisport));
-       c->edge->weight = mesh->dev_class_traits[devclass].edge_weight;
-       c->edge->connection = c;
-
-       node_add_recent_address(mesh, n, &c->address);
-       edge_add(mesh, c->edge);
-
-       /* Notify everyone of the new edge */
-
-       send_add_edge(mesh, mesh->everyone, c->edge, 0);
-
-       /* Run MST and SSSP algorithms */
-
-       graph(mesh);
+       send_add_edge(mesh, c, 0);
+       n->status.reachable = true;
+       update_node_status(mesh, c->node);
 
        /* Request a session key to jump start UDP traffic */