Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/in_fib.c
Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | |||||
#include <netinet/in_fib.h> | #include <netinet/in_fib.h> | ||||
#ifdef INET | #ifdef INET | ||||
static void fib4_rte_to_nh_basic(struct rtentry *rte, struct in_addr dst, | static void fib4_rte_to_nh_basic(struct rtentry *rte, struct in_addr dst, | ||||
uint32_t flags, struct nhop4_basic *pnh4); | uint32_t flags, struct nhop4_basic *pnh4); | ||||
static void fib4_rte_to_nh_extended(struct rtentry *rte, struct in_addr dst, | static void fib4_rte_to_nh_extended(struct rtentry *rte, struct in_addr dst, | ||||
uint32_t flags, struct nhop4_extended *pnh4); | uint32_t flags, struct nhop4_extended *pnh4); | ||||
#define RNTORT(p) ((struct rtentry *)(p)) | #define FIB4_LOOKUP_KEY(a) (void *)(__containerof(a, struct sockaddr_in, sin_addr)) | ||||
static void | static void | ||||
fib4_rte_to_nh_basic(struct rtentry *rte, struct in_addr dst, | fib4_rte_to_nh_basic(struct rtentry *rte, struct in_addr dst, | ||||
uint32_t flags, struct nhop4_basic *pnh4) | uint32_t flags, struct nhop4_basic *pnh4) | ||||
{ | { | ||||
struct sockaddr_in *gw; | struct sockaddr_in *gw; | ||||
if ((flags & NHR_IFAIF) != 0) | if ((flags & NHR_IFAIF) != 0) | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
int | int | ||||
fib4_lookup_nh_basic(uint32_t fibnum, struct in_addr dst, uint32_t flags, | fib4_lookup_nh_basic(uint32_t fibnum, struct in_addr dst, uint32_t flags, | ||||
uint32_t flowid, struct nhop4_basic *pnh4) | uint32_t flowid, struct nhop4_basic *pnh4) | ||||
{ | { | ||||
RIB_RLOCK_TRACKER; | RIB_RLOCK_TRACKER; | ||||
struct rib_head *rh; | struct rib_head *rh; | ||||
struct radix_node *rn; | struct radix_node *rn; | ||||
struct sockaddr_in sin; | |||||
struct rtentry *rte; | struct rtentry *rte; | ||||
KASSERT((fibnum < rt_numfibs), ("fib4_lookup_nh_basic: bad fibnum")); | KASSERT((fibnum < rt_numfibs), ("fib4_lookup_nh_basic: bad fibnum")); | ||||
rh = rt_tables_get_rnh(fibnum, AF_INET); | rh = rt_tables_get_rnh(fibnum, AF_INET); | ||||
if (rh == NULL) | if (rh == NULL) | ||||
return (ENOENT); | return (ENOENT); | ||||
/* Prepare lookup key */ | |||||
memset(&sin, 0, sizeof(sin)); | |||||
sin.sin_len = sizeof(struct sockaddr_in); | |||||
sin.sin_addr = dst; | |||||
RIB_RLOCK(rh); | RIB_RLOCK(rh); | ||||
rn = rh->rnh_matchaddr((void *)&sin, &rh->head); | rn = rh->rnh_matchaddr(FIB4_LOOKUP_KEY(&dst), &rh->head); | ||||
if (rn != NULL && ((rn->rn_flags & RNF_ROOT) == 0)) { | if (rn != NULL && ((rn->rn_flags & RNF_ROOT) == 0)) { | ||||
rte = RNTORT(rn); | rte = RNTORT(rn); | ||||
/* Ensure route & ifp is UP */ | /* Ensure route & ifp is UP */ | ||||
if (RT_LINK_IS_UP(rte->rt_ifp)) { | if (RT_LINK_IS_UP(rte->rt_ifp)) { | ||||
fib4_rte_to_nh_basic(rte, dst, flags, pnh4); | fib4_rte_to_nh_basic(rte, dst, flags, pnh4); | ||||
RIB_RUNLOCK(rh); | RIB_RUNLOCK(rh); | ||||
return (0); | return (0); | ||||
Show All 18 Lines | |||||
*/ | */ | ||||
int | int | ||||
fib4_lookup_nh_ext(uint32_t fibnum, struct in_addr dst, uint32_t flags, | fib4_lookup_nh_ext(uint32_t fibnum, struct in_addr dst, uint32_t flags, | ||||
uint32_t flowid, struct nhop4_extended *pnh4) | uint32_t flowid, struct nhop4_extended *pnh4) | ||||
{ | { | ||||
RIB_RLOCK_TRACKER; | RIB_RLOCK_TRACKER; | ||||
struct rib_head *rh; | struct rib_head *rh; | ||||
struct radix_node *rn; | struct radix_node *rn; | ||||
struct sockaddr_in sin; | |||||
struct rtentry *rte; | struct rtentry *rte; | ||||
KASSERT((fibnum < rt_numfibs), ("fib4_lookup_nh_ext: bad fibnum")); | KASSERT((fibnum < rt_numfibs), ("fib4_lookup_nh_ext: bad fibnum")); | ||||
rh = rt_tables_get_rnh(fibnum, AF_INET); | rh = rt_tables_get_rnh(fibnum, AF_INET); | ||||
if (rh == NULL) | if (rh == NULL) | ||||
return (ENOENT); | return (ENOENT); | ||||
/* Prepare lookup key */ | |||||
memset(&sin, 0, sizeof(sin)); | |||||
sin.sin_len = sizeof(struct sockaddr_in); | |||||
sin.sin_addr = dst; | |||||
RIB_RLOCK(rh); | RIB_RLOCK(rh); | ||||
rn = rh->rnh_matchaddr((void *)&sin, &rh->head); | rn = rh->rnh_matchaddr(FIB4_LOOKUP_KEY(&dst), &rh->head); | ||||
if (rn != NULL && ((rn->rn_flags & RNF_ROOT) == 0)) { | if (rn != NULL && ((rn->rn_flags & RNF_ROOT) == 0)) { | ||||
rte = RNTORT(rn); | rte = RNTORT(rn); | ||||
#ifdef RADIX_MPATH | #ifdef RADIX_MPATH | ||||
rte = rt_mpath_select(rte, flowid); | rte = rt_mpath_select(rte, flowid); | ||||
if (rte == NULL) { | if (rte == NULL) { | ||||
RIB_RUNLOCK(rh); | RIB_RUNLOCK(rh); | ||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
Show All 24 Lines |