/* lists type of subnet */
-splay_tree_t *subnet_tree;
+splay_tree_t subnet_tree = {
+ .compare = (splay_compare_t) subnet_compare,
+ .delete = (splay_action_t) free_subnet,
+};
/* Subnet lookup cache */
/* Initialising trees */
void init_subnets(void) {
- subnet_tree = splay_alloc_tree((splay_compare_t) subnet_compare, (splay_action_t) free_subnet);
-
ipv4_cache = hash_alloc(0x100, sizeof(ipv4_t));
ipv6_cache = hash_alloc(0x100, sizeof(ipv6_t));
mac_cache = hash_alloc(0x100, sizeof(mac_t));
}
void exit_subnets(void) {
- splay_delete_tree(subnet_tree);
+ splay_empty_tree(&subnet_tree);
hash_free(ipv4_cache);
hash_free(ipv6_cache);
hash_free(mac_cache);
}
-splay_tree_t *new_subnet_tree(void) {
- return splay_alloc_tree((splay_compare_t) subnet_compare, NULL);
-}
-
-void free_subnet_tree(splay_tree_t *subnet_tree) {
- splay_delete_tree(subnet_tree);
+void init_subnet_tree(splay_tree_t *tree) {
+ memset(tree, 0, sizeof(*tree));
+ tree->compare = (splay_compare_t) subnet_compare;
}
/* Allocating and freeing space for subnets */
void subnet_add(node_t *n, subnet_t *subnet) {
subnet->owner = n;
- splay_insert(subnet_tree, subnet);
+ splay_insert(&subnet_tree, subnet);
if(n) {
- splay_insert(n->subnet_tree, subnet);
+ splay_insert(&n->subnet_tree, subnet);
}
subnet_cache_flush();
void subnet_del(node_t *n, subnet_t *subnet) {
if(n) {
- splay_delete(n->subnet_tree, subnet);
+ splay_delete(&n->subnet_tree, subnet);
}
- splay_delete(subnet_tree, subnet);
+ splay_delete(&subnet_tree, subnet);
subnet_cache_flush();
}
/* Subnet lookup routines */
-subnet_t *lookup_subnet(const node_t *owner, const subnet_t *subnet) {
- return splay_search(owner->subnet_tree, subnet);
+subnet_t *lookup_subnet(node_t *owner, const subnet_t *subnet) {
+ return splay_search(&owner->subnet_tree, subnet);
}
subnet_t *lookup_subnet_mac(const node_t *owner, const mac_t *address) {
// Search all subnets for a matching one
- for splay_each(subnet_t, p, owner ? owner->subnet_tree : subnet_tree) {
+ for splay_each(subnet_t, p, owner ? &owner->subnet_tree : &subnet_tree) {
if(!p || p->type != SUBNET_MAC) {
continue;
}
// Search all subnets for a matching one
- for splay_each(subnet_t, p, subnet_tree) {
+ for splay_each(subnet_t, p, &subnet_tree) {
if(!p || p->type != SUBNET_IPV4) {
continue;
}
// Search all subnets for a matching one
- for splay_each(subnet_t, p, subnet_tree) {
+ for splay_each(subnet_t, p, &subnet_tree) {
if(!p || p->type != SUBNET_IPV6) {
continue;
}
name = up ? "subnet-up" : "subnet-down";
if(!subnet) {
- for splay_each(subnet_t, subnet, owner->subnet_tree) {
+ for splay_each(subnet_t, subnet, &owner->subnet_tree) {
if(!net2str(netstr, sizeof(netstr), subnet)) {
continue;
}
}
bool dump_subnets(connection_t *c) {
- for splay_each(subnet_t, subnet, subnet_tree) {
+ for splay_each(subnet_t, subnet, &subnet_tree) {
char netstr[MAXNETSTR];
if(!net2str(netstr, sizeof(netstr), subnet)) {