X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Ffib_entry.h;h=b97c80fd8bf1bd1de3b9d50900e3f91d5501603d;hb=07063b8ea;hp=cd954e3a15c261602d7f06230bb3f35376999ba4;hpb=84517cfd1508f6da24937f310f7fffe752f22584;p=vpp.git diff --git a/src/vnet/fib/fib_entry.h b/src/vnet/fib/fib_entry.h index cd954e3a15c..b97c80fd8bf 100644 --- a/src/vnet/fib/fib_entry.h +++ b/src/vnet/fib/fib_entry.h @@ -17,163 +17,14 @@ #define __FIB_ENTRY_H__ #include -#include +#include #include #include #include /** * The different sources that can create a route. - * The sources are defined here the thier relative priority order. - * 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. - */ - FIB_SOURCE_FIRST, - /** - * Special sources. These are for entries that are added to all - * FIBs by default, and should never be over-ridden (hence they - * are the highest priority) - */ - FIB_SOURCE_SPECIAL = FIB_SOURCE_FIRST, - /** - * 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 - * that is from confiiguration on an interface, not a 'ip route' command - */ - FIB_SOURCE_INTERFACE, - /** - * SRv6 and SR-MPLS - */ - FIB_SOURCE_SR, - /** - * A high priority source a plugin can use - */ - FIB_SOURCE_PLUGIN_HI, - /** - * From the BIER subsystem - */ - FIB_SOURCE_BIER, - /** - * From the control plane API - */ - FIB_SOURCE_API, - /** - * From the CLI. - */ - FIB_SOURCE_CLI, - /** - * LISP - */ - FIB_SOURCE_LISP, - /** - * IPv[46] Mapping - */ - FIB_SOURCE_MAP, - /** - * SIXRD - */ - FIB_SOURCE_SIXRD, - /** - * DHCP - */ - FIB_SOURCE_DHCP, - /** - * IPv6 Proxy ND - */ - FIB_SOURCE_IP6_ND_PROXY, - /** - * Adjacency source. - * routes created as a result of ARP/ND entries. This is lower priority - * then the API/CLI. This is on purpose. trust me. - */ - FIB_SOURCE_ADJ, - /** - * MPLS label. The prefix has been assigned a local label. This source - * never provides forwarding information, instead it acts as a place-holder - * so the association of label to prefix can be maintained - */ - FIB_SOURCE_MPLS, - /** - * Attached Export source. - * routes created as a result of attahced export. routes thus sourced - * will be present in the export tables - */ - FIB_SOURCE_AE, - /** - * Recursive resolution source. - * Used to install an entry that is the resolution traget of another. - */ - FIB_SOURCE_RR, - /** - * uRPF bypass/exemption. - * Used to install an entry that is exempt from the loose uRPF check - */ - FIB_SOURCE_URPF_EXEMPT, - /** - * The default route source. - * The default route is always added to the FIB table (like the - * special sources) but we need to be able to over-ride it with - * 'ip route' sources when provided - */ - FIB_SOURCE_DEFAULT_ROUTE, - /** - * Marker. add new entries before this one. - */ - FIB_SOURCE_LAST = FIB_SOURCE_DEFAULT_ROUTE, -} __attribute__ ((packed)) fib_source_t; - -STATIC_ASSERT (sizeof(fib_source_t) == 1, - "FIB too many sources"); - -/** - * The maximum number of sources - */ -#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", \ - [FIB_SOURCE_MAP] = "MAP", \ - [FIB_SOURCE_SR] = "SR", \ - [FIB_SOURCE_SIXRD] = "SixRD", \ - [FIB_SOURCE_LISP] = "LISP", \ - [FIB_SOURCE_CLASSIFY] = "classify", \ - [FIB_SOURCE_DHCP] = "DHCP", \ - [FIB_SOURCE_IP6_ND_PROXY] = "IPv6-proxy-nd", \ - [FIB_SOURCE_RR] = "recursive-resolution", \ - [FIB_SOURCE_AE] = "attached_export", \ - [FIB_SOURCE_MPLS] = "mpls", \ - [FIB_SOURCE_URPF_EXEMPT] = "urpf-exempt", \ - [FIB_SOURCE_DEFAULT_ROUTE] = "default-route", \ -} - -#define FOR_EACH_FIB_SOURCE(_item) \ - for (_item = FIB_SOURCE_FIRST; _item < FIB_SOURCE_MAX; _item++) - -/** - * The different sources that can create a route. - * The sources are defined here the thier relative priority order. + * The sources are defined here with their relative priority order. * The lower the value the higher the priority */ typedef enum fib_entry_attribute_t_ { @@ -217,10 +68,25 @@ typedef enum fib_entry_attribute_t_ { * To be used with caution */ FIB_ENTRY_ATTRIBUTE_URPF_EXEMPT, + /** + * The prefix/address exempted from attached export + */ + FIB_ENTRY_ATTRIBUTE_NO_ATTACHED_EXPORT, + /** + * This FIB entry imposes its source information on all prefixes + * that is covers + */ + 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_URPF_EXEMPT, + FIB_ENTRY_ATTRIBUTE_LAST = FIB_ENTRY_ATTRIBUTE_INTERPOSE, } fib_entry_attribute_t; #define FIB_ENTRY_ATTRIBUTES { \ @@ -232,6 +98,9 @@ typedef enum fib_entry_attribute_t_ { [FIB_ENTRY_ATTRIBUTE_LOCAL] = "local", \ [FIB_ENTRY_ATTRIBUTE_URPF_EXEMPT] = "uRPF-exempt", \ [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) \ @@ -247,10 +116,15 @@ typedef enum fib_entry_flag_t_ { FIB_ENTRY_FLAG_EXCLUSIVE = (1 << FIB_ENTRY_ATTRIBUTE_EXCLUSIVE), FIB_ENTRY_FLAG_LOCAL = (1 << FIB_ENTRY_ATTRIBUTE_LOCAL), FIB_ENTRY_FLAG_IMPORT = (1 << FIB_ENTRY_ATTRIBUTE_IMPORT), + FIB_ENTRY_FLAG_NO_ATTACHED_EXPORT = (1 << FIB_ENTRY_ATTRIBUTE_NO_ATTACHED_EXPORT), 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; +extern u8 * format_fib_entry_flags(u8 *s, va_list *args); + /** * Flags for the source data */ @@ -263,29 +137,53 @@ typedef enum fib_entry_src_attribute_t_ { * the source has been added to the entry */ 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, + /** + * the source is stale + */ + FIB_ENTRY_SRC_ATTRIBUTE_STALE, + /** + * the source is inherited from its cover + */ + FIB_ENTRY_SRC_ATTRIBUTE_INHERITED, /** * Marker. add new entries before this one. */ - FIB_ENTRY_SRC_ATTRIBUTE_LAST = FIB_ENTRY_SRC_ATTRIBUTE_ACTIVE, + 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_STALE] = "stale", \ + [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_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_STALE = (1 << FIB_ENTRY_SRC_ATTRIBUTE_STALE), + FIB_ENTRY_SRC_FLAG_INHERITED = (1 << FIB_ENTRY_SRC_ATTRIBUTE_INHERITED), } __attribute__ ((packed)) fib_entry_src_flag_t; +extern u8 * format_fib_entry_src_flags(u8 *s, va_list *args); + /* * Keep the size of the flags field to 2 bytes, so it * can be placed next to the 2 bytes reference count @@ -306,10 +204,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 */ @@ -321,11 +226,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 @@ -341,6 +241,21 @@ typedef struct fib_entry_src_t_ { */ u32 fesr_sibling; } rr; + struct { + /** + * 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 @@ -378,32 +293,9 @@ typedef struct fib_entry_src_t_ { */ fib_node_index_t fesl_fib_index; } lisp; - }; + } u; } 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. * @@ -437,20 +329,12 @@ typedef struct fib_entry_t_ { * type to derive the EOS bit value. */ dpo_id_t fe_lb; - /** - * 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 + * 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. */ - union { - fib_entry_src_t *fe_srcs; - fib_entry_src_t fe_src; - } fe_u_src; - + fib_entry_src_t *fe_srcs; /** * the path-list for which this entry is a child. This is also the path-list * that is contributing forwarding for this entry. @@ -464,9 +348,9 @@ typedef struct fib_entry_t_ { u32 fe_sibling; /** - * A vector of delegates. + * A vector of delegate indices. */ - fib_entry_delegate_t *fe_delegates; + index_t *fe_delegates; } fib_entry_t; #define FOR_EACH_FIB_ENTRY_FLAG(_item) \ @@ -498,7 +382,7 @@ extern void fib_entry_update (fib_node_index_t fib_entry_index, extern void fib_entry_path_add(fib_node_index_t fib_entry_index, fib_source_t source, fib_entry_flag_t flags, - const fib_route_path_t *rpath); + const fib_route_path_t *rpaths); extern void fib_entry_special_add(fib_node_index_t fib_entry_index, fib_source_t source, fib_entry_flag_t flags, @@ -512,10 +396,16 @@ extern fib_entry_src_flag_t fib_entry_special_remove(fib_node_index_t fib_entry_ extern fib_entry_src_flag_t fib_entry_path_remove(fib_node_index_t fib_entry_index, fib_source_t source, - const fib_route_path_t *rpath); + const fib_route_path_t *rpaths); + +extern void fib_entry_inherit(fib_node_index_t cover, + fib_node_index_t covered); + 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( @@ -554,10 +444,8 @@ extern u32 fib_entry_get_resolving_interface_for_source( fib_node_index_t fib_entry_index, fib_source_t source); -extern void fib_entry_encode(fib_node_index_t fib_entry_index, - fib_route_path_encode_t **api_rpaths); -extern void fib_entry_get_prefix(fib_node_index_t fib_entry_index, - fib_prefix_t *pfx); +extern fib_route_path_t* fib_entry_encode(fib_node_index_t fib_entry_index); +extern const fib_prefix_t* fib_entry_get_prefix(fib_node_index_t fib_entry_index); extern u32 fib_entry_get_fib_index(fib_node_index_t fib_entry_index); extern void fib_entry_set_source_data(fib_node_index_t fib_entry_index, fib_source_t source, @@ -575,11 +463,16 @@ extern int fib_entry_is_sourced(fib_node_index_t fib_entry_index, extern fib_node_index_t fib_entry_get_path_list(fib_node_index_t fib_entry_index); extern int fib_entry_is_resolved(fib_node_index_t fib_entry_index); +extern int fib_entry_is_host(fib_node_index_t fib_entry_index); +extern int fib_entry_is_marked(fib_node_index_t fib_entry_index, fib_source_t source); +extern void fib_entry_mark(fib_node_index_t fib_entry_index, fib_source_t source); extern void fib_entry_set_flow_hash_config(fib_node_index_t fib_entry_index, flow_hash_config_t hash_config); extern void fib_entry_module_init(void); +extern u32 fib_entry_get_stats_index(fib_node_index_t fib_entry_index); + /* * unsafe... beware the raw pointer. */