#include "ldp_struct.h" #include "ldp_mm_impl.h" #include "ldp_tree_impl.h" #include "radix.h" #include #include #define MAX_BITS 32 struct route_entry { uint32_t next_hop; }; struct tree_node { void *data; RADIX_ENTRY(tree_node,1) next; }; struct radix_node { uint32_t key; int key_length; struct ldp_session_list session_root; struct route_entry* route; RADIX_ENTRY(radix_node,1) next; }; RADIX_HEAD(tree,tree_node); RADIX_HEAD(radix,radix_node); ldp_bool ldp_tree_handle_verify(ldp_tree_handle handle) { return LDP_TRUE; } ldp_tree_handle ldp_tree_create(int depth) { struct tree *t = NULL; if(depth > MAX_BITS) return 0; t = (struct tree*)malloc(sizeof(struct tree)); if(t != NULL) { RADIX_INIT(t); } return (uint32_t)t; } ldp_return_enum ldp_tree_insert(ldp_tree_handle tree,uint32_t key,int length,void *node) { int32_t result = 0; struct tree* t = (struct tree*)tree; RADIX_INSERT(t,tree_node,next,1,uint32_t,key,length,result); if(result < 0) return LDP_FAILURE; RADIX_SET(t,tree_node,next,1,uint32_t,key,length,data,(void*)node,result); if(result < 0) return LDP_FAILURE; return LDP_SUCCESS; } ldp_return_enum ldp_tree_remove(ldp_tree_handle tree,uint32_t key,int length,void **node) { int32_t result = 0; struct tree* t = (struct tree*)tree; void *dumb = NULL; RADIX_GET(t,tree_node,next,1,uint32_t,key,length,data,*node,result); RADIX_SET(t,tree_node,next,1,uint32_t,key,length,data,dumb,result); return LDP_SUCCESS; } ldp_return_enum ldp_tree_replace(ldp_tree_handle tree,uint32_t key,int length,void *new,void **old) { int32_t result = 0; struct tree* t = (struct tree*)tree; RADIX_GET(t,tree_node,next,1,uint32_t,key,length,data,*old,result); RADIX_SET(t,tree_node,next,1,uint32_t,key,length,data,(void*)new,result); return LDP_SUCCESS; } ldp_return_enum ldp_tree_get(ldp_tree_handle tree,uint32_t key,int length,void **node) { int32_t result = 0; struct tree* t = (struct tree*)tree; RADIX_GET(t,tree_node,next,1,uint32_t,key,length,data,*node,result); if(result < 0) return LDP_FAILURE; return LDP_SUCCESS; } ldp_return_enum ldp_tree_get_longest(ldp_tree_handle tree,uint32_t key, void **node) { int32_t result = 0; struct tree* t = (struct tree*)tree; RADIX_GET_LONG(t,tree_node,next,1,uint32_t,key,data,*node,result); if(result < 0) { return LDP_FAILURE; } return LDP_SUCCESS; } int _ldp_tree_destroy(struct tree_node* node,void *extra) { free(node); return 0; } void ldp_tree_delete(ldp_tree_handle tree) { struct tree* t = (struct tree*)tree; RADIX_VISIT_ALL(t,tree_node,next,1,32,_ldp_tree_destroy,NULL); }