projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Replace node_udp_tree with a hash table.
[tinc]
/
src
/
node.c
diff --git
a/src/node.c
b/src/node.c
index
dbc5a7e
..
debc915
100644
(file)
--- a/
src/node.c
+++ b/
src/node.c
@@
-21,16
+21,17
@@
#include "system.h"
#include "control_common.h"
#include "system.h"
#include "control_common.h"
-#include "
splay_tree
.h"
+#include "
hash
.h"
#include "logger.h"
#include "net.h"
#include "netutl.h"
#include "node.h"
#include "logger.h"
#include "net.h"
#include "netutl.h"
#include "node.h"
+#include "splay_tree.h"
#include "utils.h"
#include "xalloc.h"
splay_tree_t *node_tree; /* Known nodes, sorted by name */
#include "utils.h"
#include "xalloc.h"
splay_tree_t *node_tree; /* Known nodes, sorted by name */
-s
play_tree_t *node_udp_tree; /* Known nodes, sorted by address and port */
+s
tatic hash_t *node_udp_cache;
node_t *myself;
node_t *myself;
@@
-38,24
+39,13
@@
static int node_compare(const node_t *a, const node_t *b) {
return strcmp(a->name, b->name);
}
return strcmp(a->name, b->name);
}
-static int node_udp_compare(const node_t *a, const node_t *b) {
- int result;
-
- result = sockaddrcmp(&a->address, &b->address);
-
- if(result)
- return result;
-
- return (a->name && b->name) ? strcmp(a->name, b->name) : 0;
-}
-
void init_nodes(void) {
node_tree = splay_alloc_tree((splay_compare_t) node_compare, (splay_action_t) free_node);
void init_nodes(void) {
node_tree = splay_alloc_tree((splay_compare_t) node_compare, (splay_action_t) free_node);
- node_udp_
tree = splay_alloc_tree((splay_compare_t) node_udp_compare, NULL
);
+ node_udp_
cache = hash_alloc(0x100, sizeof(sockaddr_t)
);
}
void exit_nodes(void) {
}
void exit_nodes(void) {
-
splay_delete_tree(node_udp_tre
e);
+
hash_free(node_udp_cach
e);
splay_delete_tree(node_tree);
}
splay_delete_tree(node_tree);
}
@@
-85,6
+75,9
@@
void free_node(node_t *n) {
cipher_close(&n->outcipher);
digest_close(&n->outdigest);
cipher_close(&n->outcipher);
digest_close(&n->outdigest);
+ ecdsa_free(&n->ecdsa);
+ sptps_stop(&n->sptps);
+
if(timeout_initialized(&n->mtuevent))
event_del(&n->mtuevent);
if(timeout_initialized(&n->mtuevent))
event_del(&n->mtuevent);
@@
-121,7
+114,6
@@
void node_del(node_t *n) {
edge_del(e);
}
edge_del(e);
}
- splay_delete(node_udp_tree, n);
splay_delete(node_tree, n);
}
splay_delete(node_tree, n);
}
@@
-134,34
+126,29
@@
node_t *lookup_node(char *name) {
}
node_t *lookup_node_udp(const sockaddr_t *sa) {
}
node_t *lookup_node_udp(const sockaddr_t *sa) {
- node_t n = {NULL};
-
- n.address = *sa;
- n.name = NULL;
-
- return splay_search(node_udp_tree, &n);
+ return hash_search(node_udp_cache, sa);
}
void update_node_udp(node_t *n, const sockaddr_t *sa) {
if(n == myself) {
}
void update_node_udp(node_t *n, const sockaddr_t *sa) {
if(n == myself) {
- logger(LOG_WARNING, "Trying to update UDP address of myself!");
+ logger(
DEBUG_ALWAYS,
LOG_WARNING, "Trying to update UDP address of myself!");
return;
}
return;
}
- splay_delete(node_udp_tree, n);
-
if(n->hostname)
free(n->hostname);
if(n->hostname)
free(n->hostname);
+ hash_insert(node_udp_cache, &n->address, NULL);
+
if(sa) {
n->address = *sa;
if(sa) {
n->address = *sa;
+ hash_insert(node_udp_cache, sa, n);
n->hostname = sockaddr2hostname(&n->address);
n->hostname = sockaddr2hostname(&n->address);
- splay_insert(node_udp_tree, n);
- logger(LOG_DEBUG, "UDP address of %s set to %s", n->name, n->hostname);
+ logger(DEBUG_PROTOCOL, LOG_DEBUG, "UDP address of %s set to %s", n->name, n->hostname);
} else {
memset(&n->address, 0, sizeof n->address);
n->hostname = NULL;
} else {
memset(&n->address, 0, sizeof n->address);
n->hostname = NULL;
-
ifdebug(PROTOCOL) logger(
LOG_DEBUG, "UDP address of %s cleared", n->name);
+
logger(DEBUG_PROTOCOL,
LOG_DEBUG, "UDP address of %s cleared", n->name);
}
}
}
}
@@
-171,11
+158,11
@@
bool dump_nodes(connection_t *c) {
for(node = node_tree->head; node; node = node->next) {
n = node->data;
for(node = node_tree->head; node; node = node->next) {
n = node->data;
- send_request(c, "%d %d %s at %s cipher %d digest %d maclength %
zd compression %d options %x status %04x nexthop %s via %s distance %d pmtu %d (min %d max %
d)", CONTROL, REQ_DUMP_NODES,
+ send_request(c, "%d %d %s at %s cipher %d digest %d maclength %
d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %hd (min %hd max %h
d)", CONTROL, REQ_DUMP_NODES,
n->name, n->hostname, cipher_get_nid(&n->outcipher),
n->name, n->hostname, cipher_get_nid(&n->outcipher),
- digest_get_nid(&n->outdigest), digest_length(&n->outdigest), n->outcompression,
+ digest_get_nid(&n->outdigest),
(int)
digest_length(&n->outdigest), n->outcompression,
n->options, bitfield_to_int(&n->status, sizeof n->status), n->nexthop ? n->nexthop->name : "-",
n->options, bitfield_to_int(&n->status, sizeof n->status), n->nexthop ? n->nexthop->name : "-",
- n->via ? n->via->name : "-", n->distance, n->mtu, n->minmtu, n->maxmtu);
+ n->via ? n->via->name
?: "-"
: "-", n->distance, n->mtu, n->minmtu, n->maxmtu);
}
return send_request(c, "%d %d", CONTROL, REQ_DUMP_NODES);
}
return send_request(c, "%d %d", CONTROL, REQ_DUMP_NODES);