- 论坛徽章:
- 0
|
int
rj_walktree(h, f, w)
struct radij_node_head *h;
register int (*f)(struct radij_node *,void *);
void *w;
{
int error;
struct radij_node *base, *next;
register struct radij_node *rn;
if(!h || !f /* || !w */) {
return -ENODATA;
}
rn = h->rnh_treetop;
/*
* This gets complicated because we may delete the node
* while applying the function f to it, so we need to calculate
* the successor node in advance.
*/
/* First time through node, go left */
while (rn->rj_b >= 0)
rn = rn->rj_l;
for (;;) {
#ifdef CONFIG_IPSEC_DEBUG
if(debug_radij) {
printk("klips_debug:rj_walktree: "
"for: rn=0p%p rj_b=%d rj_flags=%x",
rn,
rn->rj_b,
rn->rj_flags);
rn->rj_b >= 0 ?
printk(" node off=%xn",
rn->rj_off) :
printk(" leaf key = %08x->%08xn",
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
;
}
#endif /* CONFIG_IPSEC_DEBUG */
base = rn;
/* If at right child go back up, otherwise, go right */
while (rn->rj_p->rj_r == rn && (rn->rj_flags & RJF_ROOT) == 0)
rn = rn->rj_p;
/* Find the next *leaf* since next node might vanish, too */
for (rn = rn->rj_p->rj_r; rn->rj_b >= 0;)
rn = rn->rj_l; ============================>>>>>OOPS
next = rn;
#ifdef CONFIG_IPSEC_DEBUG
if(debug_radij) {
printk("klips_debug:rj_walktree: "
"processing leaves, rn=0p%p rj_b=%d rj_flags=%x",
rn,
rn->rj_b,
rn->rj_flags);
rn->rj_b >= 0 ?
printk(" node off=%xn",
rn->rj_off) :
printk(" leaf key = %08x->%08xn",
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
;
}
#endif /* CONFIG_IPSEC_DEBUG */
/* Process leaves */
while ((rn = base)) {
base = rn->rj_dupedkey;
#ifdef CONFIG_IPSEC_DEBUG
if(debug_radij) {
printk("klips_debug:rj_walktree: "
"while: base=0p%p rn=0p%p rj_b=%d rj_flags=%x",
base,
rn,
rn->rj_b,
rn->rj_flags);
rn->rj_b >= 0 ?
printk(" node off=%xn",
rn->rj_off) :
printk(" leaf key = %08x->%08xn",
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_src.s_addr),
(u_int)ntohl(((struct sockaddr_encap *)rn->rj_key)->sen_ip_dst.s_addr))
;
}
#endif /* CONFIG_IPSEC_DEBUG */
if (!(rn->rj_flags & RJF_ROOT) && (error = (*f)(rn, w)))
return (-error);
}
rn = next;
if (rn->rj_flags & RJF_ROOT)
return (0);
}
/* NOTREACHED */
}
|
|
|