net: Allow connectionless convs to auto bind
[akaros.git] / kern / src / radix.c
index 7543943..e109cfa 100644 (file)
@@ -19,8 +19,10 @@ static void __radix_remove_slot(struct radix_node *r_node, struct radix_node **s
 /* Initializes the radix tree system, mostly just builds the kcache */
 void radix_init(void)
 {
-       radix_kcache = kmem_cache_create("radix_nodes", sizeof(struct radix_node),
-                                        __alignof__(struct radix_node), 0, 0, 0);
+       radix_kcache = kmem_cache_create("radix_nodes",
+                                        sizeof(struct radix_node),
+                                        __alignof__(struct radix_node), 0,
+                                        NULL, 0, 0, NULL);
 }
 
 /* Initializes a tree dynamically */
@@ -43,8 +45,10 @@ void radix_tree_destroy(struct radix_tree *tree)
 }
 
 /* Attempts to insert an item in the tree at the given key.  ENOMEM if we ran
- * out of memory, EEXIST if an item is already in the tree. */
-int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
+ * out of memory, EEXIST if an item is already in the tree.  On success, will
+ * also return the slot pointer, if requested. */
+int radix_insert(struct radix_tree *tree, unsigned long key, void *item,
+                 void ***slot_p)
 {
        printd("RADIX: insert %p at %d\n", item, key);
        struct radix_node *r_node;
@@ -70,7 +74,7 @@ int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
                tree->root = r_node;
                r_node->my_slot = &tree->root;
                tree->depth++;
-               tree->upper_bound = 1 << (LOG_RNODE_SLOTS * tree->depth);
+               tree->upper_bound = 1ULL << (LOG_RNODE_SLOTS * tree->depth);
        }
        assert(tree->root);
        /* the tree now thinks it is tall enough, so find the last node, insert in
@@ -82,6 +86,8 @@ int radix_insert(struct radix_tree *tree, unsigned long key, void *item)
                return -EEXIST;
        *slot = item;
        r_node->num_items++;
+       if (slot_p)
+               *slot_p = slot;
        return 0;
 }
 
@@ -119,7 +125,7 @@ void *radix_delete(struct radix_tree *tree, unsigned long key)
        slot = &r_node->items[key & (NR_RNODE_SLOTS - 1)];
        retval = *slot;
        if (retval) {
-               __radix_remove_slot(r_node, (struct radix_node**)slot); 
+               __radix_remove_slot(r_node, (struct radix_node**)slot);
        } else {
                /* it's okay to delete an empty, but i want to know about it for now */
                warn("Tried to remove a non-existant item from a radix tree!");