Changeset View
Changeset View
Standalone View
Standalone View
sys/net/radix.c
Show First 20 Lines • Show All 618 Lines • ▼ Show 20 Lines | if (netmask) { | ||||
netmask = x->rn_key; | netmask = x->rn_key; | ||||
} | } | ||||
/* | /* | ||||
* Deal with duplicated keys: attach node to previous instance | * Deal with duplicated keys: attach node to previous instance | ||||
*/ | */ | ||||
saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); | saved_tt = tt = rn_insert(v, head, &keyduplicated, treenodes); | ||||
if (keyduplicated) { | if (keyduplicated) { | ||||
for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { | for (t = tt; tt; t = tt, tt = tt->rn_dupedkey) { | ||||
#ifdef RADIX_MPATH | |||||
/* permit multipath, if enabled for the family */ | |||||
if (rn_mpath_capable(head) && netmask == tt->rn_mask) { | |||||
/* | |||||
* go down to the end of multipaths, so that | |||||
* new entry goes into the end of rn_dupedkey | |||||
* chain. | |||||
*/ | |||||
do { | |||||
t = tt; | |||||
tt = tt->rn_dupedkey; | |||||
} while (tt && t->rn_mask == tt->rn_mask); | |||||
break; | |||||
} | |||||
#endif | |||||
if (tt->rn_mask == netmask) | if (tt->rn_mask == netmask) | ||||
return (0); | return (0); | ||||
if (netmask == 0 || | if (netmask == 0 || | ||||
(tt->rn_mask && | (tt->rn_mask && | ||||
((b_leaf < tt->rn_bit) /* index(netmask) > node */ | ((b_leaf < tt->rn_bit) /* index(netmask) > node */ | ||||
|| rn_refines(netmask, tt->rn_mask) | || rn_refines(netmask, tt->rn_mask) | ||||
|| rn_lexobetter(netmask, tt->rn_mask)))) | || rn_lexobetter(netmask, tt->rn_mask)))) | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | on2: | ||||
for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { | for (mp = &x->rn_mklist; (m = *mp); mp = &m->rm_mklist) { | ||||
if (m->rm_bit < b_leaf) | if (m->rm_bit < b_leaf) | ||||
continue; | continue; | ||||
if (m->rm_bit > b_leaf) | if (m->rm_bit > b_leaf) | ||||
break; | break; | ||||
if (m->rm_flags & RNF_NORMAL) { | if (m->rm_flags & RNF_NORMAL) { | ||||
mmask = m->rm_leaf->rn_mask; | mmask = m->rm_leaf->rn_mask; | ||||
if (tt->rn_flags & RNF_NORMAL) { | if (tt->rn_flags & RNF_NORMAL) { | ||||
#if !defined(RADIX_MPATH) | |||||
log(LOG_ERR, | log(LOG_ERR, | ||||
"Non-unique normal route, mask not entered\n"); | "Non-unique normal route, mask not entered\n"); | ||||
#endif | |||||
return (tt); | return (tt); | ||||
} | } | ||||
} else | } else | ||||
mmask = m->rm_mask; | mmask = m->rm_mask; | ||||
if (mmask == netmask) { | if (mmask == netmask) { | ||||
m->rm_refs++; | m->rm_refs++; | ||||
tt->rn_mklist = m; | tt->rn_mklist = m; | ||||
return (tt); | return (tt); | ||||
▲ Show 20 Lines • Show All 448 Lines • Show Last 20 Lines |