X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fdpo%2Freplicate_dpo.h;h=908c20c1d56ea8996208c29d3d468914413087aa;hb=d0236f725d31e5e5d23e5f207b1a317fcd96a964;hp=a564739c9f29cd5c8e51085c1567385aa752b531;hpb=32e1c010b0c34fd0984f7fc45fae648a182025c5;p=vpp.git diff --git a/src/vnet/dpo/replicate_dpo.h b/src/vnet/dpo/replicate_dpo.h index a564739c9f2..908c20c1d56 100644 --- a/src/vnet/dpo/replicate_dpo.h +++ b/src/vnet/dpo/replicate_dpo.h @@ -25,6 +25,7 @@ #include #include #include +#include /** * replicate main @@ -32,6 +33,9 @@ typedef struct replicate_main_t_ { vlib_combined_counter_main_t repm_counters; + + /* per-cpu vector of cloned packets */ + u32 **clones; } replicate_main_t; extern replicate_main_t replicate_main; @@ -42,6 +46,15 @@ extern replicate_main_t replicate_main; */ #define REP_NUM_INLINE_BUCKETS 4 +/** + * Flags on the replicate DPO + */ +typedef enum replicate_flags_t_ +{ + REPLICATE_FLAGS_NONE, + REPLICATE_FLAGS_HAS_LOCAL, +} __clib_packed replicate_flags_t; + /** * The FIB DPO provieds; * - load-balancing over the next DPOs in the chain/graph @@ -49,7 +62,13 @@ extern replicate_main_t replicate_main; */ typedef struct replicate_t_ { /** - * number of buckets in the load-balance. always a power of 2. + * required for pool_get_aligned. + * memebers used in the switch path come first! + */ + CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); + + /** + * number of buckets in the replicate. */ u16 rep_n_buckets; @@ -60,6 +79,11 @@ typedef struct replicate_t_ { */ dpo_proto_t rep_proto; + /** + * Flags specifying the replicate properties/behaviour + */ + replicate_flags_t rep_flags; + /** * The number of locks, which is approximately the number of users, * of this load-balance. @@ -83,7 +107,7 @@ typedef struct replicate_t_ { } replicate_t; STATIC_ASSERT(sizeof(replicate_t) <= CLIB_CACHE_LINE_BYTES, - "A replicate object size exceeds one cachline"); + "A replicate object size exceeds one cacheline"); /** * Flags controlling load-balance formatting/display @@ -100,15 +124,20 @@ extern void replicate_multipath_update( load_balance_path_t *next_hops); extern void replicate_set_bucket(index_t repi, - u32 bucket, - const dpo_id_t *next); + u32 bucket, + const dpo_id_t *next); extern u8* format_replicate(u8 * s, va_list * args); extern const dpo_id_t *replicate_get_bucket(index_t repi, - u32 bucket); + u32 bucket); extern int replicate_is_drop(const dpo_id_t *dpo); +extern u16 replicate_n_buckets(index_t repi); + +extern index_t replicate_dup(replicate_flags_t flags, + index_t repi); + /** * The encapsulation breakages are for fast DP access */ @@ -116,6 +145,7 @@ extern replicate_t *replicate_pool; static inline replicate_t* replicate_get (index_t repi) { + repi &= ~MPLS_IS_REPLICATE; return (pool_elt_at_index(replicate_pool, repi)); }