X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Fload_balance.h;h=5428e20e98173dc4e8ee051ef9a56cf5afd2b9d9;hb=ea7178631;hp=1799653628d0f91cce94bbdeefdbc1d348c5423f;hpb=c0790cfef0bd1c56f4c75dc4f959584148386258;p=vpp.git diff --git a/src/vnet/dpo/load_balance.h b/src/vnet/dpo/load_balance.h index 1799653628d..5428e20e981 100644 --- a/src/vnet/dpo/load_balance.h +++ b/src/vnet/dpo/load_balance.h @@ -36,6 +36,7 @@ #include #include #include +#include /** * Load-balance main @@ -75,12 +76,40 @@ typedef struct load_balance_path_t_ { u32 path_weight; } load_balance_path_t; +/** + * Flags controlling load-balance creation and modification + */ +typedef enum load_balance_attr_t_ { + LOAD_BALANCE_ATTR_USES_MAP = 0, + LOAD_BALANCE_ATTR_STICKY = 1, +} load_balance_attr_t; + +#define LOAD_BALANCE_ATTR_NAMES { \ + [LOAD_BALANCE_ATTR_USES_MAP] = "uses-map", \ + [LOAD_BALANCE_ATTR_STICKY] = "sticky", \ +} + +#define FOR_EACH_LOAD_BALANCE_ATTR(_attr) \ + for (_attr = 0; _attr <= LOAD_BALANCE_ATTR_STICKY; _attr++) + +typedef enum load_balance_flags_t_ { + LOAD_BALANCE_FLAG_NONE = 0, + LOAD_BALANCE_FLAG_USES_MAP = (1 << 0), + LOAD_BALANCE_FLAG_STICKY = (1 << 1), +} __attribute__((packed)) load_balance_flags_t; + /** * The FIB DPO provieds; * - load-balancing over the next DPOs in the chain/graph * - per-route counters */ typedef struct load_balance_t_ { + /** + * required for pool_get_aligned. + * memebers used in the switch path come first! + */ + CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); + /** * number of buckets in the load-balance. always a power of 2. */ @@ -98,6 +127,16 @@ typedef struct load_balance_t_ { */ dpo_proto_t lb_proto; + /** + * Flags concenring the LB's creation and modification + */ + load_balance_flags_t lb_flags; + + /** + * Flags from the load-balance's associated fib_entry_t + */ + fib_entry_flag_t lb_fib_entry_flags; + /** * The number of locks, which is approximately the number of users, * of this load-balance. @@ -136,7 +175,7 @@ typedef struct load_balance_t_ { } load_balance_t; STATIC_ASSERT(sizeof(load_balance_t) <= CLIB_CACHE_LINE_BYTES, - "A load_balance object size exceeds one cachline"); + "A load_balance object size exceeds one cacheline"); /** * Flags controlling load-balance formatting/display @@ -146,17 +185,10 @@ typedef enum load_balance_format_flags_t_ { LOAD_BALANCE_FORMAT_DETAIL = (1 << 0), } load_balance_format_flags_t; -/** - * Flags controlling load-balance creation and modification - */ -typedef enum load_balance_flags_t_ { - LOAD_BALANCE_FLAG_NONE = 0, - LOAD_BALANCE_FLAG_USES_MAP = (1 << 0), -} load_balance_flags_t; - extern index_t load_balance_create(u32 num_buckets, dpo_proto_t lb_proto, flow_hash_config_t fhc); +extern flow_hash_config_t load_balance_get_default_flow_hash(dpo_proto_t lb_proto); extern void load_balance_multipath_update( const dpo_id_t *dpo, const load_balance_path_t * raw_next_hops, @@ -167,6 +199,8 @@ extern void load_balance_set_bucket(index_t lbi, const dpo_id_t *next); extern void load_balance_set_urpf(index_t lbi, index_t urpf); +extern void load_balance_set_fib_entry_flags(index_t lbi, + fib_entry_flag_t flags); extern index_t load_balance_get_urpf(index_t lbi); extern u8* format_load_balance(u8 * s, va_list * args); @@ -174,6 +208,7 @@ extern u8* format_load_balance(u8 * s, va_list * args); extern const dpo_id_t *load_balance_get_bucket(index_t lbi, u32 bucket); extern int load_balance_is_drop(const dpo_id_t *dpo); +extern u16 load_balance_n_buckets(index_t lbi); extern f64 load_balance_get_multipath_tolerance(void);