$Revision: 1.32 $
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 <include/rxroutines.h>
- #include <include/comparisons.h>
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_in_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_rt_node ( rx_oper_mt mode, ip_prefix_t* newpref, rx_tree_t* tree, rx_dataleaf_t* leafptr )
- 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* leafptr
- dataleaf to attach at the node
General function to operate on dataleaves attached to a single node
(create / modify / delete).
searches tree, finds and creates/deletes a node,
copies modified nodes to disk using rx_sql_node_set (not yet implemented).
Updates memory rollback info.
creation:
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
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. It is never assumed to be
allocated via malloc, can be a local variable as well.
If the composed flag of the dataleaf in the tree
(being the reference count at the same time)
is non zero, decrements the count.
Deletes the dataleaf when it reaches zero.
suceeds always or dies when dataleaf with such data cannot be found
in the node
RX_FAM_IP implies there's no dataleaf!!!
The structure in place of a dataleaf is payload
void rx_delete_node ( rx_tree_t* tree, rx_node_t* curnode, rx_dataleaf_t* dataleaf )
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