FD.io VPP  v20.09-64-g4f7b92f0a
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(_lb, _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)
 
flow_hash_config_t load_balance_get_default_flow_hash (dpo_proto_t lb_proto)
 
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)
 
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)
 
u16 load_balance_n_buckets (index_t lbi)
 
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_norm (load_balance_t *lb, load_balance_path_t *nhs, dpo_id_t *buckets, u32 n_buckets)
 
static void load_balance_fill_buckets_sticky (load_balance_t *lb, load_balance_path_t *nhs, dpo_id_t *buckets, u32 n_buckets)
 
static void load_balance_fill_buckets (load_balance_t *lb, load_balance_path_t *nhs, dpo_id_t *buckets, u32 n_buckets, load_balance_flags_t flags)
 
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
 
static const char * load_balance_attr_names [] = LOAD_BALANCE_ATTR_NAMES
 
vlib_log_class_t load_balance_logger
 the logger More...
 
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

◆ LB_DBG

#define LB_DBG (   _lb,
  _fmt,
  _args... 
)
Value:
{ \
vlib_log_debug(load_balance_logger, \
"lb:[%U]:" _fmt, \
##_args); \
}
vlib_log_class_t load_balance_logger
the logger
Definition: load_balance.c:37
static index_t load_balance_get_index(const load_balance_t *lb)
Definition: load_balance.c:74
u8 * format_load_balance(u8 *s, va_list *args)
Definition: load_balance.c:199

Definition at line 39 of file load_balance.c.

Typedef Documentation

◆ load_balance_trace_t

Function Documentation

◆ bier_load_balance()

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

Definition at line 1307 of file load_balance.c.

+ Here is the call graph for this function:

◆ format_bier_load_balance_trace()

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

Definition at line 1296 of file load_balance.c.

+ Here is the call graph for this function:

◆ format_l2_load_balance_trace()

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

Definition at line 1180 of file load_balance.c.

+ Here is the call graph for this function:

◆ format_load_balance()

u8* format_load_balance ( u8 s,
va_list *  args 
)

Definition at line 199 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_load_balance_dpo()

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

Definition at line 208 of file load_balance.c.

+ Here is the call graph for this function:

◆ format_nsh_load_balance_trace()

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

Definition at line 1270 of file load_balance.c.

+ Here is the call graph for this function:

◆ ip_flow_hash()

static u32 ip_flow_hash ( void *  data)
inlinestatic

Definition at line 1050 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ip_multipath_normalize_next_hops()

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 384 of file load_balance.c.

+ Here is the caller graph for this function:

◆ l2_flow_hash()

static u32 l2_flow_hash ( vlib_buffer_t b0)
inlinestatic

Definition at line 1067 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ l2_load_balance()

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

Definition at line 1172 of file load_balance.c.

+ Here is the call graph for this function:

◆ load_balance_alloc_i()

static load_balance_t* load_balance_alloc_i ( void  )
static

Definition at line 93 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_create()

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

Definition at line 263 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_create_i()

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 238 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_destroy()

static void load_balance_destroy ( load_balance_t lb)
static

Definition at line 871 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_fill_buckets()

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

Definition at line 601 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_fill_buckets_norm()

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

Definition at line 530 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_fill_buckets_sticky()

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

Definition at line 554 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_format()

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

Definition at line 139 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_get_bucket()

const dpo_id_t* load_balance_get_bucket ( index_t  lbi,
u32  bucket 
)

Definition at line 363 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_get_buckets()

static dpo_id_t* load_balance_get_buckets ( load_balance_t lb)
inlinestatic

Definition at line 80 of file load_balance.c.

+ Here is the caller graph for this function:

◆ load_balance_get_default_flow_hash()

flow_hash_config_t load_balance_get_default_flow_hash ( dpo_proto_t  lb_proto)

Definition at line 217 of file load_balance.c.

+ Here is the caller graph for this function:

◆ load_balance_get_index()

static index_t load_balance_get_index ( const load_balance_t lb)
inlinestatic

Definition at line 74 of file load_balance.c.

+ Here is the caller graph for this function:

◆ load_balance_get_multipath_tolerance()

f64 load_balance_get_multipath_tolerance ( void  )

Definition at line 68 of file load_balance.c.

◆ load_balance_get_urpf()

index_t load_balance_get_urpf ( index_t  lbi)

Definition at line 353 of file load_balance.c.

+ Here is the call graph for this function:

◆ load_balance_inline()

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 1099 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_is_drop()

int load_balance_is_drop ( const dpo_id_t dpo)

Definition at line 296 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_lock()

static void load_balance_lock ( dpo_id_t dpo)
static

Definition at line 861 of file load_balance.c.

+ Here is the call graph for this function:

◆ load_balance_mem_show()

static void load_balance_mem_show ( void  )
static

Definition at line 911 of file load_balance.c.

+ Here is the call graph for this function:

◆ load_balance_module_init()

void load_balance_module_init ( void  )

Definition at line 979 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_multipath_next_hop_fixup()

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 504 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_multipath_update()

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 626 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_n_buckets()

u16 load_balance_n_buckets ( index_t  lbi)

Definition at line 313 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_set_bucket()

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

Definition at line 280 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_set_bucket_i()

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 271 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_set_fib_entry_flags()

void load_balance_set_fib_entry_flags ( index_t  lbi,
fib_entry_flag_t  flags 
)

Definition at line 323 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_set_n_buckets()

static void load_balance_set_n_buckets ( load_balance_t lb,
u32  n_buckets 
)
inlinestatic

Definition at line 618 of file load_balance.c.

+ Here is the caller graph for this function:

◆ load_balance_set_urpf()

void load_balance_set_urpf ( index_t  lbi,
index_t  urpf 
)

Definition at line 334 of file load_balance.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ load_balance_show()

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

Definition at line 1001 of file load_balance.c.

+ Here is the call graph for this function:

◆ load_balance_unlock()

static void load_balance_unlock ( dpo_id_t dpo)
static

Definition at line 896 of file load_balance.c.

+ Here is the call graph for this function:

◆ mac_to_u64()

static u64 mac_to_u64 ( u8 m)
inlinestatic

Definition at line 1061 of file load_balance.c.

+ Here is the caller graph for this function:

◆ next_hop_sort_by_weight()

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

Definition at line 374 of file load_balance.c.

◆ nsh_load_balance()

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

Definition at line 1206 of file load_balance.c.

+ Here is the call graph for this function:

Variable Documentation

◆ bier_load_balance_node

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",
}
unsigned int u32
Definition: types.h:88
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)

(constructor) VLIB_REGISTER_NODE (bier_load_balance_node)

Definition at line 1317 of file load_balance.c.

◆ l2_load_balance_node

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 1193 of file load_balance.c.

◆ lb_vft

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:208
static void load_balance_mem_show(void)
Definition: load_balance.c:911
static void load_balance_lock(dpo_id_t *dpo)
Definition: load_balance.c:861
static void load_balance_unlock(dpo_id_t *dpo)
Definition: load_balance.c:896

Definition at line 920 of file load_balance.c.

◆ load_balance_attr_names

const char* load_balance_attr_names[] = LOAD_BALANCE_ATTR_NAMES
static

Definition at line 32 of file load_balance.c.

◆ load_balance_bier_nodes

const char* const load_balance_bier_nodes[]
static
Initial value:
=
{
"bier-load-balance",
NULL,
}

Definition at line 963 of file load_balance.c.

◆ load_balance_ip4_nodes

const char* const load_balance_ip4_nodes[]
static
Initial value:
=
{
"ip4-load-balance",
NULL,
}

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 938 of file load_balance.c.

◆ load_balance_ip6_nodes

const char* const load_balance_ip6_nodes[]
static
Initial value:
=
{
"ip6-load-balance",
NULL,
}

Definition at line 943 of file load_balance.c.

◆ load_balance_l2_nodes

const char* const load_balance_l2_nodes[]
static
Initial value:
=
{
"l2-load-balance",
NULL,
}

Definition at line 953 of file load_balance.c.

◆ load_balance_logger

vlib_log_class_t load_balance_logger

the logger

Definition at line 37 of file load_balance.c.

◆ load_balance_main

load_balance_main_t load_balance_main
Initial value:
= {
.lbm_to_counters = {
.name = "route-to",
.stat_segment_name = "/net/route/to",
},
.lbm_via_counters = {
.name = "route-via",
.stat_segment_name = "/net/route/via",
}
}

The one instance of load-balance main.

Definition at line 56 of file load_balance.c.

◆ load_balance_mpls_nodes

const char* const load_balance_mpls_nodes[]
static
Initial value:
=
{
"mpls-load-balance",
NULL,
}

Definition at line 948 of file load_balance.c.

◆ load_balance_nodes

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:943
static const char *const load_balance_mpls_nodes[]
Definition: load_balance.c:948
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:938
static const char *const load_balance_l2_nodes[]
Definition: load_balance.c:953
static const char *const load_balance_bier_nodes[]
Definition: load_balance.c:963
static const char *const load_balance_nsh_nodes[]
Definition: load_balance.c:958

Definition at line 968 of file load_balance.c.

◆ load_balance_nsh_nodes

const char* const load_balance_nsh_nodes[]
static
Initial value:
=
{
"nsh-load-balance",
NULL
}

Definition at line 958 of file load_balance.c.

◆ load_balance_pool

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.

◆ load_balance_show_command

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)

(constructor) VLIB_CLI_COMMAND (load_balance_show_command)

Definition at line 1042 of file load_balance.c.

◆ multipath_next_hop_error_tolerance

const f64 multipath_next_hop_error_tolerance = 0.1

Definition at line 30 of file load_balance.c.

◆ nsh_load_balance_node

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",
},
}
unsigned int u32
Definition: types.h:88
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)

(constructor) VLIB_REGISTER_NODE (nsh_load_balance_node)

Definition at line 1283 of file load_balance.c.