X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fgraph.c;h=7079f93efc5e98513541b47de14d823211874b30;hb=cc3c69c892b0dad9a6ece0a0f4ccd429a22fcbff;hp=86b62a51189af649eef68e1b4d631925c6e17976;hpb=0b8b23e0dd7219344543f135ca0aeba8a4a42d48;p=tinc diff --git a/src/graph.c b/src/graph.c index 86b62a51..7079f93e 100644 --- a/src/graph.c +++ b/src/graph.c @@ -1,6 +1,6 @@ /* graph.c -- graph algorithms - Copyright (C) 2001-2012 Guus Sliepen , + Copyright (C) 2001-2013 Guus Sliepen , 2001-2005 Ivo Timmermans This program is free software; you can redistribute it and/or modify @@ -51,6 +51,7 @@ #include "graph.h" #include "list.h" #include "logger.h" +#include "names.h" #include "netutl.h" #include "node.h" #include "process.h" @@ -61,7 +62,7 @@ #include "graph.h" /* Implementation of Kruskal's algorithm. - Running time: O(E) + Running time: O(EN) Please note that sorting on weight is already done by add_edge(). */ @@ -78,11 +79,24 @@ static void mst_kruskal(void) { for splay_each(node_t, n, node_tree) n->status.visited = false; + /* Starting point */ + + for splay_each(edge_t, e, edge_weight_tree) { + if(e->from->status.reachable) { + e->from->status.visited = true; + break; + } + } + /* Add safe edges */ + bool skipped = false; + for splay_each(edge_t, e, edge_weight_tree) { - if(!e->reverse || (e->from->status.visited && e->to->status.visited)) + if(!e->reverse || (e->from->status.visited == e->to->status.visited)) { + skipped = true; continue; + } e->from->status.visited = true; e->to->status.visited = true; @@ -93,8 +107,12 @@ static void mst_kruskal(void) { if(e->reverse->connection) e->reverse->connection->status.mst = true; - logger(DEBUG_SCARY_THINGS, LOG_DEBUG, " Adding edge %s - %s weight %d", e->from->name, - e->to->name, e->weight); + logger(DEBUG_SCARY_THINGS, LOG_DEBUG, " Adding edge %s - %s weight %d", e->from->name, e->to->name, e->weight); + + if(skipped) { + skipped = false; + next = edge_weight_tree->head; + } } } @@ -125,13 +143,13 @@ static void sssp_bfs(void) { /* Loop while todo_list is filled */ - for list_each(node_t, n, todo_list) { /* "n" is the node from which we start */ + for list_each(node_t, n, todo_list) { /* "n" is the node from which we start */ logger(DEBUG_SCARY_THINGS, LOG_DEBUG, " Examining edges from %s", n->name); if(n->distance < 0) abort(); - for splay_each(edge_t, e, n->edge_tree) { /* "e" is the edge connected to "from" */ + for splay_each(edge_t, e, n->edge_tree) { /* "e" is the edge connected to "from" */ if(!e->reverse) continue; @@ -208,12 +226,12 @@ static void check_reachability(void) { } n->last_req_key = 0; + n->status.udp_confirmed = false; n->maxmtu = MTU; n->minmtu = 0; n->mtuprobes = 0; - if(timeout_initialized(&n->mtuevent)) - event_del(&n->mtuevent); + timeout_del(&n->mtutimeout); char *name; char *address; @@ -245,6 +263,8 @@ static void check_reachability(void) { if(!n->status.reachable) { update_node_udp(n, NULL); + memset(&n->status, 0, sizeof n->status); + n->options = 0; } else if(n->connection) { if(n->status.sptps) { if(n->connection->outgoing)