]> git.meshlink.io Git - meshlink/blobdiff - src/graph.c
Restart UDP SPTPS when a node reconnects with a new session ID.
[meshlink] / src / graph.c
index d86ac4a81e3ea560e8a14f15b9180399570d3d0a..d40087d8dc1c65f680c9f55b403f52c3acfc110f 100644 (file)
 #include "xalloc.h"
 #include "graph.h"
 
-/* Implementation of Kruskal's algorithm.
-   Running time: O(EN)
-   Please note that sorting on weight is already done by add_edge().
-*/
-
-static void mst_kruskal(meshlink_handle_t *mesh) {
-       /* Clear MST status on connections */
-
-       for list_each(connection_t, c, mesh->connections) {
-               c->status.mst = false;
-       }
-
-       logger(mesh, MESHLINK_DEBUG, "Running Kruskal's algorithm:");
-
-       /* Clear visited status on nodes */
-
-       for splay_each(node_t, n, mesh->nodes) {
-               n->status.visited = false;
-       }
-
-       /* Starting point */
-
-       for splay_each(edge_t, e, mesh->edges) {
-               if(e->from->status.reachable) {
-                       e->from->status.visited = true;
-                       break;
-               }
-       }
-
-       /* Add safe edges */
-
-       bool skipped = false;
-
-       for splay_each(edge_t, e, mesh->edges) {
-               if(!e->reverse || (e->from->status.visited == e->to->status.visited)) {
-                       skipped = true;
-                       continue;
-               }
-
-               e->from->status.visited = true;
-               e->to->status.visited = true;
-
-               if(e->connection) {
-                       e->connection->status.mst = true;
-               }
-
-               if(e->reverse->connection) {
-                       e->reverse->connection->status.mst = true;
-               }
-
-               logger(mesh, MESHLINK_DEBUG, " Adding edge %s - %s weight %d", e->from->name, e->to->name, e->weight);
-
-               if(skipped) {
-                       skipped = false;
-                       next = mesh->edges->head;
-               }
-       }
-}
-
 /* Implementation of a simple breadth-first search algorithm.
    Running time: O(E)
 */
@@ -203,6 +144,23 @@ static void check_reachability(meshlink_handle_t *mesh) {
                        if(n->utcp) {
                                utcp_abort_all_connections(n->utcp);
                        }
+
+                       if(n->status.visited == n->status.reachable) {
+                               /* This session replaces the previous one without changing reachability status.
+                                * We still need to reset the UDP SPTPS state.
+                                */
+                               n->status.validkey = false;
+                               sptps_stop(&n->sptps);
+                               n->status.waitingforkey = false;
+                               n->last_req_key = 0;
+
+                               n->status.udp_confirmed = false;
+                               n->maxmtu = MTU;
+                               n->minmtu = 0;
+                               n->mtuprobes = 0;
+
+                               timeout_del(&mesh->loop, &n->mtutimeout);
+                       }
                }
 
                if(n->status.visited != n->status.reachable) {
@@ -252,5 +210,4 @@ static void check_reachability(meshlink_handle_t *mesh) {
 void graph(meshlink_handle_t *mesh) {
        sssp_bfs(mesh);
        check_reachability(mesh);
-       mst_kruskal(mesh);
 }