Changeset View
Changeset View
Standalone View
Standalone View
sys/net/route_var.h
Show All 26 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _NET_ROUTE_VAR_H_ | #ifndef _NET_ROUTE_VAR_H_ | ||||
#define _NET_ROUTE_VAR_H_ | #define _NET_ROUTE_VAR_H_ | ||||
struct nh_control; | |||||
struct nhop_request; | |||||
typedef int rnh_preadd_entry_f_t(u_int fibnum, const struct sockaddr *addr, | |||||
const struct sockaddr *mask, struct nhop_request *req); | |||||
struct rib_head { | struct rib_head { | ||||
struct radix_head head; | struct radix_head head; | ||||
rn_matchaddr_f_t *rnh_matchaddr; /* longest match for sockaddr */ | rn_matchaddr_f_t *rnh_matchaddr; /* longest match for sockaddr */ | ||||
rn_addaddr_f_t *rnh_addaddr; /* add based on sockaddr*/ | rn_addaddr_f_t *rnh_addaddr; /* add based on sockaddr*/ | ||||
rn_deladdr_f_t *rnh_deladdr; /* remove based on sockaddr */ | rn_deladdr_f_t *rnh_deladdr; /* remove based on sockaddr */ | ||||
rn_lookup_f_t *rnh_lookup; /* exact match for sockaddr */ | rn_lookup_f_t *rnh_lookup; /* exact match for sockaddr */ | ||||
rn_walktree_t *rnh_walktree; /* traverse tree */ | rn_walktree_t *rnh_walktree; /* traverse tree */ | ||||
rn_walktree_from_t *rnh_walktree_from; /* traverse tree below a */ | rn_walktree_from_t *rnh_walktree_from; /* traverse tree below a */ | ||||
rn_close_t *rnh_close; /*do something when the last ref drops*/ | rn_close_t *rnh_close; /*do something when the last ref drops*/ | ||||
rnh_preadd_entry_f_t *rnh_preadd; /* hook to alter record prior to insertion */ | |||||
rt_gen_t rnh_gen; /* generation counter */ | rt_gen_t rnh_gen; /* generation counter */ | ||||
int rnh_multipath; /* multipath capable ? */ | int rnh_multipath; /* multipath capable ? */ | ||||
struct radix_node rnh_nodes[3]; /* empty tree for common case */ | struct radix_node rnh_nodes[3]; /* empty tree for common case */ | ||||
struct rmlock rib_lock; /* config/data path lock */ | struct rmlock rib_lock; /* config/data path lock */ | ||||
struct radix_mask_head rmhead; /* masks radix head */ | struct radix_mask_head rmhead; /* masks radix head */ | ||||
struct vnet *rib_vnet; /* vnet pointer */ | struct vnet *rib_vnet; /* vnet pointer */ | ||||
int rib_family; /* AF of the rtable */ | int rib_family; /* AF of the rtable */ | ||||
u_int rib_fibnum; /* fib number */ | u_int rib_fibnum; /* fib number */ | ||||
struct callout expire_callout; /* Callout for expiring dynamic routes */ | struct callout expire_callout; /* Callout for expiring dynamic routes */ | ||||
time_t next_expire; /* Next expire run ts */ | time_t next_expire; /* Next expire run ts */ | ||||
struct nh_control *nh_control; /* nexthop subsystem data */ | |||||
}; | }; | ||||
#define RIB_RLOCK_TRACKER struct rm_priotracker _rib_tracker | #define RIB_RLOCK_TRACKER struct rm_priotracker _rib_tracker | ||||
#define RIB_LOCK_INIT(rh) rm_init(&(rh)->rib_lock, "rib head lock") | #define RIB_LOCK_INIT(rh) rm_init(&(rh)->rib_lock, "rib head lock") | ||||
#define RIB_LOCK_DESTROY(rh) rm_destroy(&(rh)->rib_lock) | #define RIB_LOCK_DESTROY(rh) rm_destroy(&(rh)->rib_lock) | ||||
#define RIB_RLOCK(rh) rm_rlock(&(rh)->rib_lock, &_rib_tracker) | #define RIB_RLOCK(rh) rm_rlock(&(rh)->rib_lock, &_rib_tracker) | ||||
#define RIB_RUNLOCK(rh) rm_runlock(&(rh)->rib_lock, &_rib_tracker) | #define RIB_RUNLOCK(rh) rm_runlock(&(rh)->rib_lock, &_rib_tracker) | ||||
#define RIB_WLOCK(rh) rm_wlock(&(rh)->rib_lock) | #define RIB_WLOCK(rh) rm_wlock(&(rh)->rib_lock) | ||||
Show All 21 Lines | #define CHK_STRUCT_ROUTE_FIELDS(_route_new) \ | ||||
_CHK_ROUTE_FIELD(_route_new, spare) | _CHK_ROUTE_FIELD(_route_new, spare) | ||||
#define CHK_STRUCT_ROUTE_COMPAT(_ro_new, _dst_new) \ | #define CHK_STRUCT_ROUTE_COMPAT(_ro_new, _dst_new) \ | ||||
CHK_STRUCT_ROUTE_FIELDS(_ro_new); \ | CHK_STRUCT_ROUTE_FIELDS(_ro_new); \ | ||||
_Static_assert(__offsetof(struct route, ro_dst) == __offsetof(_ro_new, _dst_new),\ | _Static_assert(__offsetof(struct route, ro_dst) == __offsetof(_ro_new, _dst_new),\ | ||||
"ro_dst and " #_dst_new " are at different offset") | "ro_dst and " #_dst_new " are at different offset") | ||||
struct rib_head *rt_tables_get_rnh(int fib, int family); | struct rib_head *rt_tables_get_rnh(int fib, int family); | ||||
VNET_PCPUSTAT_DECLARE(struct rtstat, rtstat); | |||||
#define RTSTAT_ADD(name, val) \ | |||||
VNET_PCPUSTAT_ADD(struct rtstat, rtstat, name, (val)) | |||||
#define RTSTAT_INC(name) RTSTAT_ADD(name, 1) | |||||
/* | |||||
* With the split between the routing entry and the nexthop, | |||||
* rt_flags has to be split between these 2 entries. As rtentry | |||||
* mostly contains prefix data and is thought to be generic enough | |||||
* so one can transparently change the nexthop pointer w/o requiring | |||||
* any other rtentry changes, most of rt_flags shifts to the particular nexthop. | |||||
* / | |||||
* | |||||
* RTF_UP: rtentry, as an indication that it is linked. | |||||
* RTF_HOST: rtentry, nhop. The latter indication is needed for the datapath | |||||
* RTF_DYNAMIC: nhop, to make rtentry generic. | |||||
* RTF_MODIFIED: nhop, to make rtentry generic. (legacy) | |||||
* -- "native" path (nhop) properties: | |||||
* RTF_GATEWAY, RTF_STATIC, RTF_PROTO1, RTF_PROTO2, RTF_PROTO3, RTF_FIXEDMTU, | |||||
* RTF_PINNED, RTF_REJECT, RTF_BLACKHOLE, RTF_BROADCAST | |||||
*/ | |||||
/* Nexthop rt flags mask */ | |||||
#define NHOP_RT_FLAG_MASK (RTF_GATEWAY | RTF_HOST | RTF_REJECT | RTF_DYNAMIC | \ | |||||
RTF_MODIFIED | RTF_STATIC | RTF_BLACKHOLE | RTF_PROTO1 | RTF_PROTO2 | \ | |||||
RTF_PROTO3 | RTF_FIXEDMTU | RTF_PINNED | RTF_BROADCAST) | |||||
/* rtentry rt flag mask */ | |||||
#define RTE_RT_FLAG_MASK (RTF_UP | RTF_HOST) | |||||
/* Nexthop selection */ | |||||
#define _NH2MP(_nh) ((struct nhgrp_object *)(_nh)) | |||||
#define _SELECT_NHOP(_nh, _flowid) \ | |||||
(_NH2MP(_nh))->nhops[(_flowid) % (_NH2MP(_nh))->mp_size] | |||||
#define _RT_SELECT_NHOP(_nh, _flowid) \ | |||||
((!NH_IS_MULTIPATH(_nh)) ? (_nh) : _SELECT_NHOP(_nh, _flowid)) | |||||
#define RT_SELECT_NHOP(_rt, _flowid) _RT_SELECT_NHOP((_rt)->rt_nhop, _flowid) | |||||
/* rte<>nhop translation */ | /* rte<>nhop translation */ | ||||
static inline uint16_t | static inline uint16_t | ||||
fib_rte_to_nh_flags(int rt_flags) | fib_rte_to_nh_flags(int rt_flags) | ||||
{ | { | ||||
uint16_t res; | uint16_t res; | ||||
res = (rt_flags & RTF_REJECT) ? NHF_REJECT : 0; | res = (rt_flags & RTF_REJECT) ? NHF_REJECT : 0; | ||||
Show All 14 Lines |