-void node_del(node_t *n)
-{
- avl_node_t *node, *next;
- edge_t *e;
- subnet_t *s;
-cp
- for(node = n->subnet_tree->head; node; node = next)
- {
- next = node->next;
- s = (subnet_t *)node->data;
- subnet_del(n, s);
- }
-
- for(node = n->subnet_tree->head; node; node = next)
- {
- next = node->next;
- e = (edge_t *)node->data;
- edge_del(e);
- }
-cp
- avl_delete(node_tree, n);
- avl_delete(node_udp_tree, n);
-cp
+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);