+void exit_nodes(void) {
+ cp();
+
+ splay_delete_tree(node_udp_tree);
+ splay_delete_tree(node_tree);
+}
+
+node_t *new_node(void) {
+ node_t *n = xmalloc_and_zero(sizeof *n);
+
+ cp();
+
+ n->subnet_tree = new_subnet_tree();
+ n->edge_tree = new_edge_tree();
+ n->queue = list_alloc((list_action_t) free);
+ n->mtu = MTU;
+ n->maxmtu = MTU;
+
+ return n;
+}
+
+void free_node(node_t *n) {
+ cp();
+
+ if(n->queue)
+ list_delete_list(n->queue);
+
+ if(n->subnet_tree)
+ free_subnet_tree(n->subnet_tree);
+
+ if(n->edge_tree)
+ free_edge_tree(n->edge_tree);
+
+ sockaddrfree(&n->address);
+
+ cipher_close(&n->cipher);
+ digest_close(&n->digest);
+
+ event_del(&n->mtuevent);
+
+ if(n->hostname)
+ free(n->hostname);
+
+ if(n->name)
+ free(n->name);
+
+ free(n);