$Revision: 1.18 $
Radix tree (rx). rx_node.c - functions to operate on nodes of the tree
(creation/deletion).
Status: NOT REVUED, TESTED, INCOMPLETE
Design and implementation by: Marek Bukowy
Included Files
- #include <include/erroutines.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <assert.h>
- #include <time.h>
- #include <stdarg.h>
- #include <strings.h>
- #include <include/bitmask.h>
- #include <include/er_aspects.h>
- #include <include/stubs.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "include/er_facilities.h"
- #include <include/rxroutines.h>
- #include </space/dbdev/marek/include/glib.h>
- #include </space/dbdev/marek/lib/glib/include/glibconfig.h>
- #include <limits.h>
- #include <float.h>
- #include <stdarg.h>
- #include <pthread.h>
- #include <stubs.h>
- #include <include/memwrap.h>
- #include <include/erroutines.h>
- #include <stdio.h>
- #include <include/iproutines.h>
- #include <glib.h>
- #include <include/erroutines.h>
- #include <include/rx_globals.h>
- #include <stddef.h>
- #include <glib.h>
- #include "include/socket.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <netdb.h>
- #include <signal.h>
- #include <stdio.h>
- #include <iproutines.h>
- #include "include/thread.h"
- #include <include/comparisons.h>
translates ranges/prefixes into binary prefixes.
finds tree, locks it.
initiates memory rollback structure (???)
builds a dataleaf and puts into the node(s),
calling rx_bin_node for every prefix.
checks rollback condition and (possibly) rolls back ???
MT-note: locks/unlocks the tree.
Possible errors
- all errors from:
ip_asc_2_bin,
rx_get_tree,
rx_bin_node,
wr_free
er_ret_t RX_asc_node ( rx_oper_mt mode, char* rangstr, rx_regid_t reg_id, ip_space_t spc_id, rx_fam_t fam_id, void* data )
- rx_oper_mt mode
- MODE={cre|mod|del}
- char* rangstr
- string prefix/range/IP
- rx_regid_t reg_id
- id of the registry
- ip_space_t spc_id
- type of space (ipv4/ipv6)
- rx_fam_t fam_id
- family of objects (route/inetnum)
- void* data
- pointer to the payload
General function to operate on dataleaves attached to a single node
(create / modify / delete).
searches tree, finds and creates (modifies/deletes) a node,
copies modified nodes to disk using rx_sql_node_set (not yet implemented).
Updates memory rollback info.
Add a dataleaf at the node defined by prefix.
Create a new node if it doesn't exist yet.
MT notes: requires the tree to be locked.
Returns: RX_OK or error code.
Errors from:
rx_bin_search,
memory alloc routines.
- no such node (if not in create mode)
- too many nodes found (strange).
er_ret_t RX_bin_node ( rx_oper_mt mode, ip_prefix_t* newpref, rx_tree_t* tree, rx_dataleaf_t* dataleaf )
- rx_oper_mt mode
- MODE={cre|mod|del}
- ip_prefix_t* newpref
- prefix of the node
- rx_tree_t* tree
- pointer to the tree structure
- rx_dataleaf_t* dataleaf
- dataleaf to attach at the node
performs the actual update for inetnums (possibly composed of many prefixes).
Decomposes the ranges into prefixes and then falls back to rx_bin_node
to perform changes at the nodes.
Requires/returns - practically the same as rx_bin_node.
er_ret_t RX_inum_node ( rx_oper_mt mode, ip_range_t* rang, rx_tree_t* tree, rx_dataleaf_t* leafptr )
- rx_oper_mt mode
- MODE={cre|mod|del}
- ip_range_t* rang
- range of IP addresses
- rx_tree_t* tree
- pointer to the tree structure
- rx_dataleaf_t* leafptr
- dataleaf to attach at the node
er_ret_t RX_route_node ( rx_oper_mt mode, ip_prefix_t* newpref, rx_tree_t* tree, rx_dataleaf_t* dataleaf )
- rx_oper_mt mode
- MODE={cre|mod|del}
- ip_prefix_t* newpref
- prefix of the node
- rx_tree_t* tree
- pointer to the tree structure
- rx_dataleaf_t* dataleaf
- dataleaf to attach at the node
an auxiliary function to delete data from a node
(and delete the node or turn it into a glue afterwards)
takes
tree tree
curnode pointer to the node
dataleaf pointer to a dataleaf with ObjectID (dataleaf->data_key)
set; which is used to choose the right dataleaf
when browsing data leaves.
suceeds always or dies when dataleaf with such data cannot be found
in the node
void rx_delete_node ( rx_tree_t* tree, rx_node_t* curnode, rx_dataleaf_t* dataleaf )
hook for g_list_foreach to free a list element
void rx_free_list_element ( void* cpy, void* trash )
rx_creat_node = create a new data node
(empty{glue} nodes get created automatically).
Takes a pointer to the (already allocated) data leaf to be included
in the list of data nodes (presumably empty as the node is only now being
created).
Requires a stack of nodes created in CREAT mode (with glue nodes,
until deep enough and the last node being non-glue).
MT notes: requires the tree to be locked.
Returns: RX_OK or error code.
static er_ret_t rx_creat_node ( ip_prefix_t* newpref, rx_tree_t* tree, rx_dataleaf_t* dataleaf, rx_nodcpy_t stack[], int stackdepth )
- ip_prefix_t* newpref
- prefix of the node to be added
- rx_tree_t* tree
- tree the new node goes to
- rx_dataleaf_t* dataleaf
- dataleaf to attach at this node
- rx_nodcpy_t stack[]
- stack==array of node_copies
- int stackdepth
- length of the stack