FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
load_balance.c File Reference
+ Include dependency graph for load_balance.c:

Go to the source code of this file.

Data Structures

struct  load_balance_trace_t_
 

Macros

#define LB_DBG(_p, _fmt, _args...)
 

Typedefs

typedef struct load_balance_trace_t_ load_balance_trace_t
 

Functions

f64 load_balance_get_multipath_tolerance (void)
 
static index_t load_balance_get_index (const load_balance_t *lb)
 
static dpo_id_tload_balance_get_buckets (load_balance_t *lb)
 
static load_balance_tload_balance_alloc_i (void)
 
static u8load_balance_format (index_t lbi, load_balance_format_flags_t flags, u32 indent, u8 *s)
 
u8format_load_balance (u8 *s, va_list *args)
 
static u8format_load_balance_dpo (u8 *s, va_list *args)
 
static load_balance_tload_balance_create_i (u32 num_buckets, dpo_proto_t lb_proto, flow_hash_config_t fhc)
 
index_t load_balance_create (u32 n_buckets, dpo_proto_t lb_proto, flow_hash_config_t fhc)
 
u16 load_balance_n_buckets (index_t lbi)
 
static void load_balance_set_bucket_i (load_balance_t *lb, u32 bucket, dpo_id_t *buckets, const dpo_id_t *next)
 
void load_balance_set_bucket (index_t lbi, u32 bucket, const dpo_id_t *next)
 
int load_balance_is_drop (const dpo_id_t *dpo)
 
void load_balance_set_fib_entry_flags (index_t lbi, fib_entry_flag_t flags)
 
void load_balance_set_urpf (index_t lbi, index_t urpf)
 
index_t load_balance_get_urpf (index_t lbi)
 
const dpo_id_tload_balance_get_bucket (index_t lbi, u32 bucket)
 
static int next_hop_sort_by_weight (const load_balance_path_t *n1, const load_balance_path_t *n2)
 
u32 ip_multipath_normalize_next_hops (const load_balance_path_t *raw_next_hops, load_balance_path_t **normalized_next_hops, u32 *sum_weight_in, f64 multipath_next_hop_error_tolerance)
 
static load_balance_path_tload_balance_multipath_next_hop_fixup (const load_balance_path_t *nhs, dpo_proto_t drop_proto)
 
static void load_balance_fill_buckets (load_balance_t *lb, load_balance_path_t *nhs, dpo_id_t *buckets, u32 n_buckets)
 
static void load_balance_set_n_buckets (load_balance_t *lb, u32 n_buckets)
 
void load_balance_multipath_update (const dpo_id_t *dpo, const load_balance_path_t *raw_nhs, load_balance_flags_t flags)
 
static void load_balance_lock (dpo_id_t *dpo)
 
static void load_balance_destroy (load_balance_t *lb)
 
static void load_balance_unlock (dpo_id_t *dpo)
 
static void load_balance_mem_show (void)
 
void load_balance_module_init (void)
 
static clib_error_tload_balance_show (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
 
static u32 ip_flow_hash (void *data)
 
static u64 mac_to_u64 (u8 *m)
 
static u32 l2_flow_hash (vlib_buffer_t *b0)
 
static uword load_balance_inline (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, int is_l2)
 
static uword l2_load_balance (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
 
static u8format_l2_load_balance_trace (u8 *s, va_list *args)
 
static uword nsh_load_balance (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
 
static u8format_nsh_load_balance_trace (u8 *s, va_list *args)
 
static u8format_bier_load_balance_trace (u8 *s, va_list *args)
 
static uword bier_load_balance (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
 

Variables

const f64 multipath_next_hop_error_tolerance = 0.1
 
load_balance_tload_balance_pool
 Pool of all DPOs. More...
 
load_balance_main_t load_balance_main
 The one instance of load-balance main. More...
 
static const dpo_vft_t lb_vft
 
static const char *const load_balance_ip4_nodes []
 The per-protocol VLIB graph nodes that are assigned to a load-balance object. More...
 
static const char *const load_balance_ip6_nodes []
 
static const char *const load_balance_mpls_nodes []
 
static const char *const load_balance_l2_nodes []
 
static const char *const load_balance_nsh_nodes []
 
static const char *const load_balance_bier_nodes []
 
static const char *const *const load_balance_nodes [DPO_PROTO_NUM]
 
static vlib_cli_command_t load_balance_show_command
 (constructor) VLIB_CLI_COMMAND (load_balance_show_command) More...
 
vlib_node_registration_t l2_load_balance_node
 (constructor) VLIB_REGISTER_NODE (l2_load_balance_node) More...
 
vlib_node_registration_t nsh_load_balance_node
 (constructor) VLIB_REGISTER_NODE (nsh_load_balance_node) More...
 
vlib_node_registration_t bier_load_balance_node
 (constructor) VLIB_REGISTER_NODE (bier_load_balance_node) More...
 

Macro Definition Documentation

#define LB_DBG (   _p,
  _fmt,
  _args... 
)

Definition at line 44 of file load_balance.c.

Typedef Documentation

Function Documentation

static uword bier_load_balance ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame 
)
static

Definition at line 1164 of file load_balance.c.

+ Here is the call graph for this function:

static u8* format_bier_load_balance_trace ( u8 s,
va_list *  args 
)
static

Definition at line 1153 of file load_balance.c.

+ Here is the call graph for this function:

static u8* format_l2_load_balance_trace ( u8 s,
va_list *  args 
)
static

Definition at line 1037 of file load_balance.c.

+ Here is the call graph for this function:

u8* format_load_balance ( u8 s,
va_list *  args 
)

Definition at line 151 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8* format_load_balance_dpo ( u8 s,
va_list *  args 
)
static

Definition at line 159 of file load_balance.c.

+ Here is the call graph for this function:

static u8* format_nsh_load_balance_trace ( u8 s,
va_list *  args 
)
static

Definition at line 1127 of file load_balance.c.

+ Here is the call graph for this function:

static u32 ip_flow_hash ( void *  data)
inlinestatic

Definition at line 907 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u32 ip_multipath_normalize_next_hops ( const load_balance_path_t raw_next_hops,
load_balance_path_t **  normalized_next_hops,
u32 sum_weight_in,
f64  multipath_next_hop_error_tolerance 
)

Definition at line 315 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u32 l2_flow_hash ( vlib_buffer_t b0)
inlinestatic

Definition at line 924 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uword l2_load_balance ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame 
)
static

Definition at line 1029 of file load_balance.c.

+ Here is the call graph for this function:

static load_balance_t* load_balance_alloc_i ( void  )
static

Definition at line 84 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

index_t load_balance_create ( u32  n_buckets,
dpo_proto_t  lb_proto,
flow_hash_config_t  fhc 
)

Definition at line 194 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static load_balance_t* load_balance_create_i ( u32  num_buckets,
dpo_proto_t  lb_proto,
flow_hash_config_t  fhc 
)
static

Definition at line 169 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void load_balance_destroy ( load_balance_t lb)
static

Definition at line 738 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void load_balance_fill_buckets ( load_balance_t lb,
load_balance_path_t nhs,
dpo_id_t buckets,
u32  n_buckets 
)
static

Definition at line 461 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static u8* load_balance_format ( index_t  lbi,
load_balance_format_flags_t  flags,
u32  indent,
u8 s 
)
static

Definition at line 106 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

const dpo_id_t* load_balance_get_bucket ( index_t  lbi,
u32  bucket 
)

Definition at line 294 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static dpo_id_t* load_balance_get_buckets ( load_balance_t lb)
inlinestatic

Definition at line 71 of file load_balance.c.

+ Here is the caller graph for this function:

static index_t load_balance_get_index ( const load_balance_t lb)
inlinestatic

Definition at line 65 of file load_balance.c.

+ Here is the caller graph for this function:

f64 load_balance_get_multipath_tolerance ( void  )

Definition at line 59 of file load_balance.c.

index_t load_balance_get_urpf ( index_t  lbi)

Definition at line 284 of file load_balance.c.

+ Here is the call graph for this function:

static uword load_balance_inline ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame,
int  is_l2 
)
inlinestatic

Definition at line 956 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int load_balance_is_drop ( const dpo_id_t dpo)

Definition at line 237 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void load_balance_lock ( dpo_id_t dpo)
static

Definition at line 728 of file load_balance.c.

+ Here is the call graph for this function:

static void load_balance_mem_show ( void  )
static

Definition at line 778 of file load_balance.c.

+ Here is the call graph for this function:

void load_balance_module_init ( void  )

Definition at line 846 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static load_balance_path_t* load_balance_multipath_next_hop_fixup ( const load_balance_path_t nhs,
dpo_proto_t  drop_proto 
)
static

Definition at line 435 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void load_balance_multipath_update ( const dpo_id_t dpo,
const load_balance_path_t raw_nhs,
load_balance_flags_t  flags 
)

Definition at line 494 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

u16 load_balance_n_buckets ( index_t  lbi)

Definition at line 202 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void load_balance_set_bucket ( index_t  lbi,
u32  bucket,
const dpo_id_t next 
)

Definition at line 221 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void load_balance_set_bucket_i ( load_balance_t lb,
u32  bucket,
dpo_id_t buckets,
const dpo_id_t next 
)
inlinestatic

Definition at line 212 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void load_balance_set_fib_entry_flags ( index_t  lbi,
fib_entry_flag_t  flags 
)

Definition at line 254 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void load_balance_set_n_buckets ( load_balance_t lb,
u32  n_buckets 
)
inlinestatic

Definition at line 486 of file load_balance.c.

+ Here is the caller graph for this function:

void load_balance_set_urpf ( index_t  lbi,
index_t  urpf 
)

Definition at line 265 of file load_balance.c.

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static clib_error_t* load_balance_show ( vlib_main_t vm,
unformat_input_t input,
vlib_cli_command_t cmd 
)
static

Definition at line 865 of file load_balance.c.

+ Here is the call graph for this function:

static void load_balance_unlock ( dpo_id_t dpo)
static

Definition at line 763 of file load_balance.c.

+ Here is the call graph for this function:

static u64 mac_to_u64 ( u8 m)
inlinestatic

Definition at line 918 of file load_balance.c.

+ Here is the caller graph for this function:

static int next_hop_sort_by_weight ( const load_balance_path_t n1,
const load_balance_path_t n2 
)
static

Definition at line 305 of file load_balance.c.

+ Here is the caller graph for this function:

static uword nsh_load_balance ( vlib_main_t vm,
vlib_node_runtime_t node,
vlib_frame_t frame 
)
static

Definition at line 1063 of file load_balance.c.

+ Here is the call graph for this function:

Variable Documentation

vlib_node_registration_t bier_load_balance_node
Initial value:
= {
.function = bier_load_balance,
.name = "bier-load-balance",
.vector_size = sizeof (u32),
.sibling_of = "mpls-load-balance",
}
static uword bier_load_balance(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static u8 * format_bier_load_balance_trace(u8 *s, va_list *args)
unsigned int u32
Definition: types.h:88

(constructor) VLIB_REGISTER_NODE (bier_load_balance_node)

Definition at line 1174 of file load_balance.c.

vlib_node_registration_t l2_load_balance_node
Initial value:
= {
.function = l2_load_balance,
.name = "l2-load-balance",
.vector_size = sizeof (u32),
.n_next_nodes = 1,
.next_nodes = {
[0] = "error-drop",
},
}
static u8 * format_l2_load_balance_trace(u8 *s, va_list *args)
unsigned int u32
Definition: types.h:88
static uword l2_load_balance(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)

(constructor) VLIB_REGISTER_NODE (l2_load_balance_node)

Definition at line 1050 of file load_balance.c.

const dpo_vft_t lb_vft
static
Initial value:
= {
.dv_lock = load_balance_lock,
.dv_unlock = load_balance_unlock,
.dv_mem_show = load_balance_mem_show,
}
static u8 * format_load_balance_dpo(u8 *s, va_list *args)
Definition: load_balance.c:159
static void load_balance_mem_show(void)
Definition: load_balance.c:778
static void load_balance_lock(dpo_id_t *dpo)
Definition: load_balance.c:728
static void load_balance_unlock(dpo_id_t *dpo)
Definition: load_balance.c:763

Definition at line 787 of file load_balance.c.

const char* const load_balance_bier_nodes[]
static
Initial value:
=
{
"bier-load-balance",
}
#define NULL
Definition: clib.h:55

Definition at line 830 of file load_balance.c.

const char* const load_balance_ip4_nodes[]
static
Initial value:
=
{
"ip4-load-balance",
}
#define NULL
Definition: clib.h:55

The per-protocol VLIB graph nodes that are assigned to a load-balance object.

this means that these graph nodes are ones from which a load-balance is the parent object in the DPO-graph.

We do not list all the load-balance nodes, such as the *-lookup. instead we are relying on the correct use of the .sibling_of field when setting up these sibling nodes.

Definition at line 805 of file load_balance.c.

const char* const load_balance_ip6_nodes[]
static
Initial value:
=
{
"ip6-load-balance",
}
#define NULL
Definition: clib.h:55

Definition at line 810 of file load_balance.c.

const char* const load_balance_l2_nodes[]
static
Initial value:
=
{
"l2-load-balance",
}
#define NULL
Definition: clib.h:55

Definition at line 820 of file load_balance.c.

load_balance_main_t load_balance_main

The one instance of load-balance main.

Definition at line 56 of file load_balance.c.

const char* const load_balance_mpls_nodes[]
static
Initial value:
=
{
"mpls-load-balance",
}
#define NULL
Definition: clib.h:55

Definition at line 815 of file load_balance.c.

const char* const* const load_balance_nodes[DPO_PROTO_NUM]
static
Initial value:
=
{
}
static const char *const load_balance_ip6_nodes[]
Definition: load_balance.c:810
static const char *const load_balance_mpls_nodes[]
Definition: load_balance.c:815
static const char *const load_balance_ip4_nodes[]
The per-protocol VLIB graph nodes that are assigned to a load-balance object.
Definition: load_balance.c:805
static const char *const load_balance_l2_nodes[]
Definition: load_balance.c:820
static const char *const load_balance_bier_nodes[]
Definition: load_balance.c:830
static const char *const load_balance_nsh_nodes[]
Definition: load_balance.c:825

Definition at line 835 of file load_balance.c.

const char* const load_balance_nsh_nodes[]
static
Initial value:
=
{
"nsh-load-balance",
}
#define NULL
Definition: clib.h:55

Definition at line 825 of file load_balance.c.

load_balance_t* load_balance_pool

Pool of all DPOs.

The encapsulation breakages are for fast DP access.

It's not static so the DP can have fast access

Definition at line 51 of file load_balance.c.

vlib_cli_command_t load_balance_show_command
static
Initial value:
= {
.path = "show load-balance",
.short_help = "show load-balance [<index>]",
.function = load_balance_show,
}
static clib_error_t * load_balance_show(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: load_balance.c:865

(constructor) VLIB_CLI_COMMAND (load_balance_show_command)

Definition at line 899 of file load_balance.c.

const f64 multipath_next_hop_error_tolerance = 0.1

Definition at line 29 of file load_balance.c.

vlib_node_registration_t nsh_load_balance_node
Initial value:
= {
.function = nsh_load_balance,
.name = "nsh-load-balance",
.vector_size = sizeof (u32),
.n_next_nodes = 1,
.next_nodes = {
[0] = "error-drop",
},
}
static u8 * format_nsh_load_balance_trace(u8 *s, va_list *args)
static uword nsh_load_balance(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
unsigned int u32
Definition: types.h:88

(constructor) VLIB_REGISTER_NODE (nsh_load_balance_node)

Definition at line 1140 of file load_balance.c.