diff options
author | Neale Ranns <nranns@cisco.com> | 2018-02-21 04:57:17 -0800 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2018-03-20 23:59:06 +0000 |
commit | 2303cb181b51f63c909cd506125c1f832432865a (patch) | |
tree | ea2389593abc50790e06b6ac2e80f2a38c536942 /src/vnet/fib/fib_entry.h | |
parent | f55957e71c58e38770b12af0720e9d19a8f6a8d6 (diff) |
FIB Interpose Source
The interpose source allows the source/provider to insert/interpose
a DPO in the forwarding chain of the FIB entry ahead of the forwarding
provided by the next best source. For example if the API source (i.e
the 'control plane') has provided an adjacency for forwarding, then
an interpose source (e.g. a monitoring service) couold interpose a
replicatte DPO to copy the traffic to another location AND forward
using the API's adjacency.
To use the interose feature an existing source (i.e FIB_SOURCE_PLUGIN_HI)
cn specifiy as a flag FIB_ENTRY_FLAG_INTERPOSE and provide a DPO to
interpose. One might also consider using interpose in conjunction with
FIB_ENTRY_FLAG_COVER_INHERIT to ensure the interpose object affects
all prefixes in the sub-tree.
Change-Id: I8b2737b985f8f7c08123406d0491881def347b52
Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'src/vnet/fib/fib_entry.h')
-rw-r--r-- | src/vnet/fib/fib_entry.h | 60 |
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( |