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 | |||||