MFIB: recurse resolution through an MFIB entry
[vpp.git] / src / vnet / dpo / replicate_dpo.h
index 7727301..70faef3 100644 (file)
@@ -25,6 +25,7 @@
 #include <vnet/dpo/dpo.h>
 #include <vnet/dpo/load_balance.h>
 #include <vnet/fib/fib_types.h>
+#include <vnet/mpls/mpls_types.h>
 
 /**
  * replicate main
@@ -45,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
@@ -52,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;
 
@@ -63,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.
@@ -103,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
  */
@@ -119,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));
 }