#include <vnet/ip/lookup.h>
#include <vnet/dpo/dpo.h>
#include <vnet/fib/fib_types.h>
+#include <vnet/fib/fib_entry.h>
/**
* Load-balance main
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.
*/
*/
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.
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 void load_balance_multipath_update(
const dpo_id_t *dpo,
- load_balance_path_t * raw_next_hops,
+ const load_balance_path_t * raw_next_hops,
load_balance_flags_t flags);
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);
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);