/*
graph.c -- graph algorithms
- Copyright (C) 2001-2013 Guus Sliepen <guus@tinc-vpn.org>,
- 2001-2005 Ivo Timmermans
+ Copyright (C) 2014 Guus Sliepen <guus@meshlink.io>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "graph.h"
#include "list.h"
#include "logger.h"
+#include "meshlink_internal.h"
#include "netutl.h"
#include "node.h"
#include "protocol.h"
static void mst_kruskal(void) {
/* Clear MST status on connections */
- for list_each(connection_t, c, connection_list)
+ for list_each(connection_t, c, mesh->connections)
c->status.mst = false;
logger(DEBUG_SCARY_THINGS, LOG_DEBUG, "Running Kruskal's algorithm:");
/* Clear visited status on nodes */
- for splay_each(node_t, n, node_tree)
+ for splay_each(node_t, n, mesh->nodes)
n->status.visited = false;
/* Starting point */
- for splay_each(edge_t, e, edge_weight_tree) {
+ for splay_each(edge_t, e, mesh->edges) {
if(e->from->status.reachable) {
e->from->status.visited = true;
break;
bool skipped = false;
- for splay_each(edge_t, e, edge_weight_tree) {
+ for splay_each(edge_t, e, mesh->edges) {
if(!e->reverse || (e->from->status.visited == e->to->status.visited)) {
skipped = true;
continue;
if(skipped) {
skipped = false;
- next = edge_weight_tree->head;
+ next = mesh->edges->head;
}
}
}
/* Clear visited status on nodes */
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, mesh->nodes) {
n->status.visited = false;
n->status.indirect = true;
n->distance = -1;
}
- /* Begin with myself */
+ /* Begin with mesh->self */
- myself->status.visited = true;
- myself->status.indirect = false;
- myself->nexthop = myself;
- myself->prevedge = NULL;
- myself->via = myself;
- myself->distance = 0;
- list_insert_head(todo_list, myself);
+ mesh->self->status.visited = true;
+ mesh->self->status.indirect = false;
+ mesh->self->nexthop = mesh->self;
+ mesh->self->prevedge = NULL;
+ mesh->self->via = mesh->self;
+ mesh->self->distance = 0;
+ list_insert_head(todo_list, mesh->self);
/* Loop while todo_list is filled */
e->to->status.visited = true;
e->to->status.indirect = indirect;
- e->to->nexthop = (n->nexthop == myself) ? e->to : n->nexthop;
+ e->to->nexthop = (n->nexthop == mesh->self) ? e->to : n->nexthop;
e->to->prevedge = e;
e->to->via = indirect ? n->via : e->to;
e->to->options = e->options;
static void check_reachability(void) {
/* Check reachability status. */
- for splay_each(node_t, n, node_tree) {
+ for splay_each(node_t, n, mesh->nodes) {
if(n->status.visited != n->status.reachable) {
n->status.reachable = !n->status.reachable;
n->last_state_change = now.tv_sec;
n->name, n->hostname);
}
- if(experimental && OPTION_VERSION(n->options) >= 2)
- n->status.sptps = true;
-
/* TODO: only clear status.validkey if node is unreachable? */
n->status.validkey = false;
- if(n->status.sptps) {
- sptps_stop(&n->sptps);
- n->status.waitingforkey = false;
- }
+ sptps_stop(&n->sptps);
+ n->status.waitingforkey = false;
n->last_req_key = 0;
n->status.udp_confirmed = false;
memset(&n->status, 0, sizeof n->status);
n->options = 0;
} else if(n->connection) {
- if(n->status.sptps) {
- if(n->connection->outgoing)
- send_req_key(n);
- } else {
- send_ans_key(n);
- }
+ if(n->connection->outgoing)
+ send_req_key(n);
}
}
}