summaryrefslogtreecommitdiffstats
path: root/src/vnet/fib/fib_entry.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/fib/fib_entry.h')
-rw-r--r--src/vnet/fib/fib_entry.h60
1 files changed, 50 insertions, 10 deletions
diff --git a/src/vnet/fib/fib_entry.h b/src/vnet/fib/fib_entry.h
index 4e88314005e..92333e9cc03 100644
--- a/src/vnet/fib/fib_entry.h
+++ b/src/vnet/fib/fib_entry.h
@@ -128,9 +128,16 @@ typedef enum fib_source_t_ {
*/
FIB_SOURCE_DEFAULT_ROUTE,
/**
+ * The interpose source.
+ * This is not a real source, so don't use it to source a prefix.
+ * It exists here to provide a value against which to register to the
+ * VFT for providing the interpose actions to a real source.
+ */
+ FIB_SOURCE_INTERPOSE,
+ /**
* Marker. add new entries before this one.
*/
- FIB_SOURCE_LAST = FIB_SOURCE_DEFAULT_ROUTE,
+ FIB_SOURCE_LAST = FIB_SOURCE_INTERPOSE,
} __attribute__ ((packed)) fib_source_t;
STATIC_ASSERT (sizeof(fib_source_t) == 1,
@@ -162,6 +169,7 @@ STATIC_ASSERT (sizeof(fib_source_t) == 1,
[FIB_SOURCE_URPF_EXEMPT] = "urpf-exempt", \
[FIB_SOURCE_DEFAULT_ROUTE] = "default-route", \
[FIB_SOURCE_PLUGIN_HI] = "plugin-hi", \
+ [FIB_SOURCE_INTERPOSE] = "interpose", \
}
#define FOR_EACH_FIB_SOURCE(_item) \
@@ -223,9 +231,15 @@ typedef enum fib_entry_attribute_t_ {
*/
FIB_ENTRY_ATTRIBUTE_COVERED_INHERIT,
/**
+ * The interpose attribute.
+ * place the forwarding provided by the source infront of the forwarding
+ * provided by the best source, or failing that, by the cover.
+ */
+ FIB_ENTRY_ATTRIBUTE_INTERPOSE,
+ /**
* Marker. add new entries before this one.
*/
- FIB_ENTRY_ATTRIBUTE_LAST = FIB_ENTRY_ATTRIBUTE_COVERED_INHERIT,
+ FIB_ENTRY_ATTRIBUTE_LAST = FIB_ENTRY_ATTRIBUTE_INTERPOSE,
} fib_entry_attribute_t;
#define FIB_ENTRY_ATTRIBUTES { \
@@ -239,6 +253,7 @@ typedef enum fib_entry_attribute_t_ {
[FIB_ENTRY_ATTRIBUTE_MULTICAST] = "multicast", \
[FIB_ENTRY_ATTRIBUTE_NO_ATTACHED_EXPORT] = "no-attached-export", \
[FIB_ENTRY_ATTRIBUTE_COVERED_INHERIT] = "covered-inherit", \
+ [FIB_ENTRY_ATTRIBUTE_INTERPOSE] = "interpose", \
}
#define FOR_EACH_FIB_ATTRIBUTE(_item) \
@@ -258,6 +273,7 @@ typedef enum fib_entry_flag_t_ {
FIB_ENTRY_FLAG_LOOSE_URPF_EXEMPT = (1 << FIB_ENTRY_ATTRIBUTE_URPF_EXEMPT),
FIB_ENTRY_FLAG_MULTICAST = (1 << FIB_ENTRY_ATTRIBUTE_MULTICAST),
FIB_ENTRY_FLAG_COVERED_INHERIT = (1 << FIB_ENTRY_ATTRIBUTE_COVERED_INHERIT),
+ FIB_ENTRY_FLAG_INTERPOSE = (1 << FIB_ENTRY_ATTRIBUTE_INTERPOSE),
} __attribute__((packed)) fib_entry_flag_t;
/**
@@ -273,6 +289,10 @@ typedef enum fib_entry_src_attribute_t_ {
*/
FIB_ENTRY_SRC_ATTRIBUTE_ADDED = FIB_ENTRY_SRC_ATTRIBUTE_FIRST,
/**
+ * the source is contributing forwarding
+ */
+ FIB_ENTRY_SRC_ATTRIBUTE_CONTRIBUTING,
+ /**
* the source is active/best
*/
FIB_ENTRY_SRC_ATTRIBUTE_ACTIVE,
@@ -286,22 +306,23 @@ typedef enum fib_entry_src_attribute_t_ {
FIB_ENTRY_SRC_ATTRIBUTE_LAST = FIB_ENTRY_SRC_ATTRIBUTE_INHERITED,
} fib_entry_src_attribute_t;
-#define FIB_ENTRY_SRC_ATTRIBUTE_MAX (FIB_ENTRY_SRC_ATTRIBUTE_LAST+1)
#define FIB_ENTRY_SRC_ATTRIBUTES { \
[FIB_ENTRY_SRC_ATTRIBUTE_ADDED] = "added", \
+ [FIB_ENTRY_SRC_ATTRIBUTE_CONTRIBUTING] = "contributing", \
[FIB_ENTRY_SRC_ATTRIBUTE_ACTIVE] = "active", \
[FIB_ENTRY_SRC_ATTRIBUTE_INHERITED] = "inherited", \
}
#define FOR_EACH_FIB_SRC_ATTRIBUTE(_item) \
for (_item = FIB_ENTRY_SRC_ATTRIBUTE_FIRST; \
- _item < FIB_ENTRY_SRC_ATTRIBUTE_MAX; \
+ _item <= FIB_ENTRY_SRC_ATTRIBUTE_LAST; \
_item++)
typedef enum fib_entry_src_flag_t_ {
FIB_ENTRY_SRC_FLAG_NONE = 0,
FIB_ENTRY_SRC_FLAG_ADDED = (1 << FIB_ENTRY_SRC_ATTRIBUTE_ADDED),
+ FIB_ENTRY_SRC_FLAG_CONTRIBUTING = (1 << FIB_ENTRY_SRC_ATTRIBUTE_CONTRIBUTING),
FIB_ENTRY_SRC_FLAG_ACTIVE = (1 << FIB_ENTRY_SRC_ATTRIBUTE_ACTIVE),
FIB_ENTRY_SRC_FLAG_INHERITED = (1 << FIB_ENTRY_SRC_ATTRIBUTE_INHERITED),
} __attribute__ ((packed)) fib_entry_src_flag_t;
@@ -326,10 +347,17 @@ typedef struct fib_entry_src_t_ {
* The path-list created by the source
*/
fib_node_index_t fes_pl;
+
+ /**
+ * Flags the source contributes to the entry
+ */
+ fib_entry_flag_t fes_entry_flags;
+
/**
* Which source this info block is for
*/
fib_source_t fes_src;
+
/**
* Flags on the source
*/
@@ -341,11 +369,6 @@ typedef struct fib_entry_src_t_ {
* of times a given source has been added. Which is even fewer
*/
u8 fes_ref_count;
-
- /**
- * Flags the source contributes to the entry
- */
- fib_entry_flag_t fes_entry_flags;
/**
* Source specific info
@@ -365,6 +388,21 @@ typedef struct fib_entry_src_t_ {
/**
* the index of the FIB entry that is the covering entry
*/
+ fib_node_index_t fesi_cover;
+ /**
+ * This source's index in the cover's list
+ */
+ u32 fesi_sibling;
+ /**
+ * DPO type to interpose. The dpo type needs to have registered
+ * it's 'contribute interpose' callback function.
+ */
+ dpo_id_t fesi_dpo;
+ } interpose;
+ struct {
+ /**
+ * the index of the FIB entry that is the covering entry
+ */
fib_node_index_t fesa_cover;
/**
* This source's index in the cover's list
@@ -398,7 +436,7 @@ typedef struct fib_entry_src_t_ {
*/
fib_node_index_t fesl_fib_index;
} lisp;
- };
+ } u;
} fib_entry_src_t;
/**
@@ -509,6 +547,8 @@ extern void fib_entry_inherit(fib_node_index_t cover,
extern fib_entry_src_flag_t fib_entry_delete(fib_node_index_t fib_entry_index,
fib_source_t source);
+extern void fib_entry_recalculate_forwarding(
+ fib_node_index_t fib_entry_index);
extern void fib_entry_contribute_urpf(fib_node_index_t path_index,
index_t urpf);
extern void fib_entry_contribute_forwarding(