X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Ffib_entry.h;h=cd954e3a15c261602d7f06230bb3f35376999ba4;hb=84517cfd1508f6da24937f310f7fffe752f22584;hp=5f6ff31297ed33cc13f9ebbd2705f83f2a46558f;hpb=8142499cd1cb3b8d0168d0e6cf5309c5b4813cc4;p=vpp.git diff --git a/src/vnet/fib/fib_entry.h b/src/vnet/fib/fib_entry.h index 5f6ff31297e..cd954e3a15c 100644 --- a/src/vnet/fib/fib_entry.h +++ b/src/vnet/fib/fib_entry.h @@ -28,6 +28,10 @@ * 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", \ @@ -205,14 +220,9 @@ typedef enum fib_entry_attribute_t_ { /** * Marker. add new entries before this one. */ - FIB_ENTRY_ATTRIBUTE_LAST = FIB_ENTRY_ATTRIBUTE_MULTICAST, + FIB_ENTRY_ATTRIBUTE_LAST = FIB_ENTRY_ATTRIBUTE_URPF_EXEMPT, } fib_entry_attribute_t; -/** - * The maximum number of sources - */ -#define FIB_ENTRY_ATTRIBUTE_MAX (FIB_ENTRY_ATTRIBUTE_LAST+1) - #define FIB_ENTRY_ATTRIBUTES { \ [FIB_ENTRY_ATTRIBUTE_CONNECTED] = "connected", \ [FIB_ENTRY_ATTRIBUTE_ATTACHED] = "attached", \ @@ -226,7 +236,7 @@ typedef enum fib_entry_attribute_t_ { #define FOR_EACH_FIB_ATTRIBUTE(_item) \ for (_item = FIB_ENTRY_ATTRIBUTE_FIRST; \ - _item < FIB_ENTRY_ATTRIBUTE_MAX; \ + _item <= FIB_ENTRY_ATTRIBUTE_LAST; \ _item++) typedef enum fib_entry_flag_t_ { @@ -371,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. * @@ -404,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. @@ -436,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,