Fix - sh ip fib mtrie sum
[vpp.git] / src / vnet / fib / fib_entry.h
index 93b8016..cd954e3 100644 (file)
  * The lower the value the higher the priority
  */
 typedef enum fib_source_t_ {
+    /**
+     * An invalid source of value 0
+     */
+    FIB_SOURCE_INVALID,
     /**
      * Marker. Add new values after this one.
      */
@@ -42,6 +46,10 @@ typedef enum fib_source_t_ {
      * Classify. A route that links directly to a classify adj
      */
     FIB_SOURCE_CLASSIFY,
+    /**
+     * A route the is being 'proxied' on behalf of another device
+     */
+    FIB_SOURCE_PROXY,
     /**
      * Route added as a result of interface configuration.
      * this will also come from the API/CLI, but the distinction is
@@ -56,6 +64,10 @@ typedef enum fib_source_t_ {
      * A high priority source a plugin can use
      */
     FIB_SOURCE_PLUGIN_HI,
+    /**
+     * From the BIER subsystem
+     */
+    FIB_SOURCE_BIER,
     /**
      * From the control plane API
      */
@@ -134,8 +146,11 @@ STATIC_ASSERT (sizeof(fib_source_t) == 1,
 #define FIB_SOURCE_MAX (FIB_SOURCE_LAST+1)
 
 #define FIB_SOURCES {                                  \
+    [FIB_SOURCE_INVALID] = "invalid",                  \
     [FIB_SOURCE_SPECIAL] = "special",                  \
     [FIB_SOURCE_INTERFACE] = "interface",              \
+    [FIB_SOURCE_PROXY] = "proxy",                       \
+    [FIB_SOURCE_BIER] = "BIER",                                \
     [FIB_SOURCE_API] = "API",                          \
     [FIB_SOURCE_CLI] = "CLI",                          \
     [FIB_SOURCE_ADJ] = "adjacency",                    \
@@ -366,6 +381,29 @@ typedef struct fib_entry_src_t_ {
     };
 } fib_entry_src_t;
 
+/**
+ * FIB entry flags.
+ *  these are stored in the pad space within the fib_node_t
+ */
+typedef enum fib_entry_node_attribute_t_
+{
+    /**
+     * FIB entry has multiple sources, so the fe_srcs union
+     * uses the vector
+     */
+    FIB_ENTRY_NODE_ATTR_MULTIPLE_SRCS,
+} fib_entry_node_attribute_t;
+
+#define FIB_ENTRY_NODE_FLAG_NAMES {                            \
+    [FIB_ENTRY_NODE_ATTR_MULTIPLE_SRCS] = "multiple-srcs",     \
+}
+
+typedef enum fib_entry_node_flags_t_
+{
+    FIB_ENTRY_NODE_FLAG_MULTIPLE_SRCS = (1 << FIB_ENTRY_NODE_ATTR_MULTIPLE_SRCS),
+} fib_entry_node_flags_t;
+
+
 /**
  * An entry in a FIB table.
  *
@@ -399,12 +437,20 @@ typedef struct fib_entry_t_ {
      *     type to derive the EOS bit value.
      */
     dpo_id_t fe_lb;
+
     /**
-     * Vector of source infos.
-     * Most entries will only have 1 source. So we optimise for memory usage,
-     * which is preferable since we have many entries.
+     * Source info.
+     * in the majority of cases a FIB entry will have only one source.
+     * so to save the extra memory allocation of the source's vector, we
+     * store space for one source inline. When two sources are present, 
+     * we burn extra memory.
+     * The union is switched based on the FIB_ENTRY_NODE_FLAG_MULTIPLE_SRCS
      */
-    fib_entry_src_t *fe_srcs;
+    union {
+        fib_entry_src_t *fe_srcs;
+        fib_entry_src_t fe_src;
+    } fe_u_src;
+
     /**
      * the path-list for which this entry is a child. This is also the path-list
      * that is contributing forwarding for this entry.
@@ -431,6 +477,7 @@ typedef struct fib_entry_t_ {
 #define FIB_ENTRY_FORMAT_DETAIL2 (0x2)
 
 extern u8 *format_fib_entry (u8 * s, va_list * args);
+extern u8 *format_fib_source (u8 * s, va_list * args);
 
 extern fib_node_index_t fib_entry_create_special(u32 fib_index,
                                                 const fib_prefix_t *prefix,