ok, freebsd version looks finished, doing cross-system checks..

This commit is contained in:
snar
2008-05-20 15:17:14 +00:00
parent 71e339c35c
commit 3d828d8f08
7 changed files with 184 additions and 26 deletions

View File

@@ -621,7 +621,47 @@ sx_radix_tree_aggregate(struct sx_radix_tree* tree)
if(tree && tree->head) return sx_radix_node_aggregate(tree->head);
return 0;
};
static void
setGlue(struct sx_radix_node* node, void* udata)
{
if(node) node->isGlue=1;
};
int
sx_radix_node_refine(struct sx_radix_node* node, unsigned refine)
{
if(!node->isGlue && node->prefix.masklen<refine) {
node->isAggregate=1;
node->aggregateLow=node->prefix.masklen;
node->aggregateHi=refine;
if(node->l) sx_radix_node_foreach(node->l, setGlue, NULL);
if(node->r) sx_radix_node_foreach(node->r, setGlue, NULL);
} else if(!node->isGlue && node->prefix.masklen==refine) {
/* not setting aggregate in this case */
if(node->l) sx_radix_node_foreach(node->l, setGlue, NULL);
if(node->r) sx_radix_node_foreach(node->r, setGlue, NULL);
} else if(node->isGlue) {
if(node->r) sx_radix_node_refine(node->r, refine);
if(node->l) sx_radix_node_refine(node->l, refine);
} else {
/* node->prefix.masklen > refine */
/* do nothing, should pass specifics 'as is'. Also, do not
process any embedded routes, their masklen is bigger, too...
node->isGlue=1;
if(node->l) sx_radix_node_foreach(node->l, setGlue, NULL);
if(node->r) sx_radix_node_foreach(node->r, setGlue, NULL);
*/
};
return 0;
};
int
sx_radix_tree_refine(struct sx_radix_tree* tree, unsigned refine)
{
if(tree && tree->head) return sx_radix_node_refine(tree->head, refine);
return 0;
};