+void node_add(node_t *n) {
+ unsigned char buf[64];
+ sha512(n->name, strlen(n->name),buf);
+ memcpy(&n->id, buf, sizeof n->id);
+
+ splay_insert(node_tree, n);
+ splay_insert(node_id_tree, n);
+}
+
+void node_del(node_t *n) {
+ splay_delete(node_udp_tree, n);
+ hash_delete(node_id_cache, &n->id);
+
+ for splay_each(subnet_t, s, n->subnet_tree)
+ subnet_del(n, s);
+
+ for splay_each(edge_t, e, n->edge_tree)
+ edge_del(e);
+
+ splay_delete(node_id_tree, n);
+ splay_delete(node_tree, n);
+}
+
+node_t *lookup_node(char *name) {
+ node_t n = {NULL};
+
+ n.name = name;
+
+ return splay_search(node_tree, &n);
+}
+
+node_t *lookup_node_id(const node_id_t *id) {
+ node_t *n = hash_search(node_id_cache, id);
+ if(!n) {
+ node_t tmp = {.id = *id};
+ n = splay_search(node_id_tree, &tmp);
+ if(n)
+ hash_insert(node_id_cache, id, n);
+ }
+
+ return n;
+}
+
+node_t *lookup_node_udp(const sockaddr_t *sa) {
+ node_t tmp = {.address = *sa};
+ return splay_search(node_udp_tree, &tmp);