Changeset View
Changeset View
Standalone View
Standalone View
sys/net/radix.c
Show All 38 Lines | |||||
#ifdef _KERNEL | #ifdef _KERNEL | ||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
#include <sys/mutex.h> | #include <sys/mutex.h> | ||||
#include <sys/rmlock.h> | #include <sys/rmlock.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <sys/malloc.h> | #include <sys/malloc.h> | ||||
#include <sys/syslog.h> | #include <sys/syslog.h> | ||||
#include <net/radix.h> | #include <net/radix.h> | ||||
#include "opt_mpath.h" | |||||
#ifdef RADIX_MPATH | |||||
#include <net/radix_mpath.h> | |||||
#endif | |||||
#else /* !_KERNEL */ | #else /* !_KERNEL */ | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <strings.h> | #include <strings.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#define log(x, arg...) fprintf(stderr, ## arg) | #define log(x, arg...) fprintf(stderr, ## arg) | ||||
#define panic(x) fprintf(stderr, "PANIC: %s", x), exit(1) | #define panic(x) fprintf(stderr, "PANIC: %s", x), exit(1) | ||||
#define min(a, b) ((a) < (b) ? (a) : (b) ) | #define min(a, b) ((a) < (b) ? (a) : (b) ) | ||||
#include <net/radix.h> | #include <net/radix.h> | ||||
▲ Show 20 Lines • Show All 564 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 |