LCOV - code coverage report
Current view: top level - vnet/fib - fib_types.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 2 2 100.0 %
Date: 2023-07-05 22:20:52 Functions: 1 1 100.0 %

          Line data    Source code
       1             :  /*
       2             :  * Copyright (c) 2016 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #ifndef __FIB_TYPES_H__
      17             : #define __FIB_TYPES_H__
      18             : 
      19             : #include <stdbool.h>
      20             : #include <vnet/ip/ip46_address.h>
      21             : #include <vnet/mpls/packet.h>
      22             : #include <vnet/dpo/dpo.h>
      23             : #include <vnet/bier/bier_types.h>
      24             : 
      25             : /**
      26             :  * A typedef of a node index.
      27             :  * we make this typedef so the code becomes easier for a human to parse.
      28             :  */
      29             : typedef u32 fib_node_index_t;
      30             : #define FIB_NODE_INDEX_INVALID ((fib_node_index_t)(~0))
      31             : 
      32             : /**
      33             :  * Protocol Type. packed so it consumes a u8 only
      34             :  */
      35             : typedef enum fib_protocol_t_ {
      36             :     FIB_PROTOCOL_IP4 = DPO_PROTO_IP4,
      37             :     FIB_PROTOCOL_IP6 = DPO_PROTO_IP6,
      38             :     FIB_PROTOCOL_MPLS = DPO_PROTO_MPLS,
      39             : }  __attribute__ ((packed)) fib_protocol_t;
      40             : 
      41             : #define FIB_PROTOCOLS {                 \
      42             :     [FIB_PROTOCOL_IP4] = "ipv4",      \
      43             :     [FIB_PROTOCOL_IP6] = "ipv6",        \
      44             :     [FIB_PROTOCOL_MPLS] = "MPLS",       \
      45             : }
      46             : 
      47             : /**
      48             :  * Definition outside of enum so it does not need to be included in non-defaulted
      49             :  * switch statements
      50             :  */
      51             : #define FIB_PROTOCOL_MAX (FIB_PROTOCOL_MPLS + 1)
      52             : 
      53             : /**
      54             :  * Definition outside of enum so it does not need to be included in non-defaulted
      55             :  * switch statements
      56             :  */
      57             : #define FIB_PROTOCOL_IP_MAX (FIB_PROTOCOL_IP6 + 1)
      58             : 
      59             : /**
      60             :  * Not part of the enum so it does not have to be handled in switch statements
      61             :  */
      62             : #define FIB_PROTOCOL_NONE (FIB_PROTOCOL_MAX+1)
      63             : 
      64             : #define FOR_EACH_FIB_PROTOCOL(_item)    \
      65             :     for (_item = FIB_PROTOCOL_IP4;      \
      66             :          _item <= FIB_PROTOCOL_MPLS;    \
      67             :          _item++)
      68             : 
      69             : #define FOR_EACH_FIB_IP_PROTOCOL(_item)    \
      70             :     for (_item = FIB_PROTOCOL_IP4;         \
      71             :          _item <= FIB_PROTOCOL_IP6;        \
      72             :          _item++)
      73             : 
      74             : /**
      75             :  * @brief Convert from boolean is_ip6 to FIB protocol.
      76             :  * Drop MPLS on the floor in favor of IPv4.
      77             :  */
      78             : static inline fib_protocol_t
      79        9283 : fib_ip_proto(bool is_ip6)
      80             : {
      81        9283 :   return (is_ip6) ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4;
      82             : }
      83             : 
      84             : /**
      85             :  * @brief Convert from fib_protocol to ip46_type
      86             :  */
      87             : extern ip46_type_t fib_proto_to_ip46(fib_protocol_t fproto);
      88             : 
      89             : /**
      90             :  * @brief Convert from ip46_type to fib_protocol
      91             :  */
      92             : extern fib_protocol_t fib_proto_from_ip46(ip46_type_t iproto);
      93             : 
      94             : /**
      95             :  * @brief Convert from a protocol to a link type
      96             :  */
      97             : vnet_link_t fib_proto_to_link (fib_protocol_t proto);
      98             : 
      99             : /**
     100             :  * FIB output chain type. When a child object requests a forwarding contribution
     101             :  * from a parent, it does so for a particular scenario. This enumererates those
     102             :  * sceanrios
     103             :  */
     104             : typedef enum fib_forward_chain_type_t_ {
     105             :     /**
     106             :      * Contribute an object that is to be used to forward IP4 packets
     107             :      */
     108             :     FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
     109             :     /**
     110             :      * Contribute an object that is to be used to forward IP6 packets
     111             :      */
     112             :     FIB_FORW_CHAIN_TYPE_UNICAST_IP6,
     113             :     /**
     114             :      * Contribute an object that is to be used to forward non-end-of-stack
     115             :      * MPLS packets
     116             :      */
     117             :     FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS,
     118             :     /**
     119             :      * Contribute an object that is to be used to forward BIER packets.
     120             :      */
     121             :     FIB_FORW_CHAIN_TYPE_BIER,
     122             :     /**
     123             :      * Contribute an object that is to be used to forward end-of-stack
     124             :      * MPLS packets. This is a convenient ID for clients. A real EOS chain
     125             :      * must be pay-load protocol specific. This
     126             :      * option is converted into one of the other three internally.
     127             :      */
     128             :     FIB_FORW_CHAIN_TYPE_MPLS_EOS,
     129             :     /**
     130             :      * Contribute an object that is to be used to forward IP4 packets
     131             :      */
     132             :     FIB_FORW_CHAIN_TYPE_MCAST_IP4,
     133             :     /**
     134             :      * Contribute an object that is to be used to forward IP6 packets
     135             :      */
     136             :     FIB_FORW_CHAIN_TYPE_MCAST_IP6,
     137             :     /**
     138             :      * Contribute an object that is to be used to forward Ethernet packets.
     139             :      */
     140             :     FIB_FORW_CHAIN_TYPE_ETHERNET,
     141             :     /**
     142             :      * Contribute an object that is to be used to forward NSH packets.
     143             :      * This is last in the list since it is not valid for many FIB objects,
     144             :      * and thus their array of per-chain-type DPOs can be sized smaller.
     145             :      */
     146             :     FIB_FORW_CHAIN_TYPE_NSH,
     147             : }  __attribute__ ((packed)) fib_forward_chain_type_t;
     148             : 
     149             : #define FIB_FORW_CHAINS {                                       \
     150             :     [FIB_FORW_CHAIN_TYPE_ETHERNET]      = "ethernet",         \
     151             :     [FIB_FORW_CHAIN_TYPE_BIER]          = "bier",                     \
     152             :     [FIB_FORW_CHAIN_TYPE_UNICAST_IP4]   = "unicast-ip4",      \
     153             :     [FIB_FORW_CHAIN_TYPE_UNICAST_IP6]   = "unicast-ip6",      \
     154             :     [FIB_FORW_CHAIN_TYPE_MCAST_IP4]     = "multicast-ip4",    \
     155             :     [FIB_FORW_CHAIN_TYPE_MCAST_IP6]     = "multicast-ip6",    \
     156             :     [FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS]  = "mpls-neos",                \
     157             :     [FIB_FORW_CHAIN_TYPE_MPLS_EOS]      = "mpls-eos",         \
     158             :     [FIB_FORW_CHAIN_TYPE_NSH]           = "nsh",                \
     159             : }
     160             : 
     161             : #define FIB_FORW_CHAIN_NUM (FIB_FORW_CHAIN_TYPE_NSH+1)
     162             : #define FIB_FORW_CHAIN_MPLS_NUM (FIB_FORW_CHAIN_TYPE_MPLS_EOS+1)
     163             : 
     164             : #define FOR_EACH_FIB_FORW_CHAIN(_item)                    \
     165             :     for (_item = FIB_FORW_CHAIN_TYPE_UNICAST_IP4;         \
     166             :          _item <= FIB_FORW_CHAIN_TYPE_NSH;             \
     167             :          _item++)
     168             : 
     169             : #define FOR_EACH_FIB_FORW_MPLS_CHAIN(_item)               \
     170             :     for (_item = FIB_FORW_CHAIN_TYPE_UNICAST_IP4;         \
     171             :          _item <= FIB_FORW_CHAIN_TYPE_MPLS_EOS;                \
     172             :          _item++)
     173             : 
     174             : /**
     175             :  * @brief Convert from a chain type to the adjacency's link type
     176             :  */
     177             : extern vnet_link_t fib_forw_chain_type_to_link_type(fib_forward_chain_type_t fct);
     178             : 
     179             : /**
     180             :  * @brief Convert from a adjacency's link type to chain type
     181             :  */
     182             : extern fib_forward_chain_type_t fib_forw_chain_type_from_link_type(vnet_link_t lt);
     183             : 
     184             : /**
     185             :  * @brief Convert from a payload-protocol to a chain type.
     186             :  */
     187             : extern fib_forward_chain_type_t fib_forw_chain_type_from_dpo_proto(dpo_proto_t proto);
     188             : 
     189             : /**
     190             :  * @brief Convert from a fib-protocol to a chain type.
     191             :  */
     192             : extern fib_forward_chain_type_t fib_forw_chain_type_from_fib_proto(fib_protocol_t proto);
     193             : 
     194             : /**
     195             :  * @brief Convert from a chain type to the DPO proto it will install
     196             :  */
     197             : extern dpo_proto_t fib_forw_chain_type_to_dpo_proto(fib_forward_chain_type_t fct);
     198             : 
     199             : /**
     200             :  * Aggregate type for a prefix
     201             :  */
     202             : typedef struct fib_prefix_t_ {
     203             :     /**
     204             :      * The mask length
     205             :      */
     206             :     u16 fp_len;
     207             : 
     208             :     /**
     209             :      * protocol type
     210             :      */
     211             :     fib_protocol_t fp_proto;
     212             : 
     213             :     /**
     214             :      * Pad to keep the address 4 byte aligned
     215             :      */
     216             :     u8 ___fp___pad;
     217             : 
     218             :     union {
     219             :         /**
     220             :          * The address type is not deriveable from the fp_addr member.
     221             :          * If it's v4, then the first 3 u32s of the address will be 0.
     222             :          * v6 addresses (even v4 mapped ones) have at least 2 u32s assigned
     223             :          * to non-zero values. true. but when it's all zero, one cannot decide.
     224             :          */
     225             :         ip46_address_t fp_addr;
     226             : 
     227             :         struct {
     228             :             mpls_label_t fp_label;
     229             :             mpls_eos_bit_t fp_eos;
     230             :             /**
     231             :              * This protocol determines the payload protocol of packets
     232             :              * that will be forwarded by this entry once the label is popped.
     233             :              * For a non-eos entry it will be MPLS.
     234             :              */
     235             :             dpo_proto_t fp_payload_proto;
     236             :         };
     237             :     };
     238             : } fib_prefix_t;
     239             : 
     240             : STATIC_ASSERT(STRUCT_OFFSET_OF(fib_prefix_t, fp_addr) == 4,
     241             :               "FIB Prefix's address is 4 byte aligned.");
     242             : 
     243             : /**
     244             :  * \brief Compare two prefixes for equality
     245             :  */
     246             : extern int fib_prefix_cmp(const fib_prefix_t *p1,
     247             :                           const fib_prefix_t *p2);
     248             : 
     249             : /**
     250             :  * \brief Copy a prefix
     251             :  */
     252             : extern void fib_prefix_copy(fib_prefix_t *dst,
     253             :                             const fib_prefix_t *src);
     254             : 
     255             : /**
     256             :  * \brief Compare two prefixes for covering relationship
     257             :  *
     258             :  * \return non-zero if the first prefix is a cover for the second
     259             :  */
     260             : extern int fib_prefix_is_cover(const fib_prefix_t *p1,
     261             :                                const fib_prefix_t *p2);
     262             : 
     263             : /**
     264             :  * \brief Return true is the prefix is a host prefix
     265             :  */
     266             : extern int fib_prefix_is_host(const fib_prefix_t *p);
     267             : extern u8 fib_prefix_get_host_length (fib_protocol_t proto);
     268             : 
     269             : /**
     270             :  * normalise a prefix (i.e. mask the host bits according to the
     271             :  * prefix length)
     272             :  */
     273             : extern void fib_prefix_normalize(const fib_prefix_t *p,
     274             :                                  fib_prefix_t *out);
     275             : 
     276             : /**
     277             :  * \brief Host prefix from ip
     278             :  */
     279             : extern void fib_prefix_from_ip46_addr (fib_protocol_t fproto,
     280             :                                        const ip46_address_t *addr,
     281             :                                        fib_prefix_t *pfx);
     282             : 
     283             : extern u8 * format_fib_prefix(u8 * s, va_list * args);
     284             : extern u8 * format_fib_forw_chain_type(u8 * s, va_list * args);
     285             : 
     286             : extern dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto);
     287             : extern fib_protocol_t dpo_proto_to_fib(dpo_proto_t dpo_proto);
     288             : 
     289             : /**
     290             :  * \brief Increase IPv4/IPv6 address according to the prefix length
     291             :  */
     292             : extern void fib_prefix_increment (fib_prefix_t *pfx);
     293             : 
     294             : /**
     295             :  * Convert from BIER next-hop proto to FIB proto
     296             :  */
     297             : extern fib_protocol_t bier_hdr_proto_to_fib(bier_hdr_proto_id_t bproto);
     298             : 
     299             : /**
     300             :  * Enurmeration of special path/entry types
     301             :  */
     302             : typedef enum fib_special_type_t_ {
     303             :     /**
     304             :      * Marker. Add new types after this one.
     305             :      */
     306             :     FIB_SPECIAL_TYPE_FIRST = 0,
     307             :     /**
     308             :      * Local/for-us paths
     309             :      */
     310             :     FIB_SPECIAL_TYPE_LOCAL = FIB_SPECIAL_TYPE_FIRST,
     311             :     /**
     312             :      * drop paths
     313             :      */
     314             :     FIB_SPECIAL_TYPE_DROP,
     315             :     /**
     316             :      * Marker. Add new types before this one, then update it.
     317             :      */
     318             :     FIB_SPECIAL_TYPE_LAST = FIB_SPECIAL_TYPE_DROP,
     319             : } __attribute__ ((packed)) fib_special_type_t;
     320             : 
     321             : /**
     322             :  * The maximum number of types
     323             :  */
     324             : #define FIB_SPEICAL_TYPE_MAX (FIB_SPEICAL_TYPE_LAST + 1)
     325             : 
     326             : #define FOR_EACH_FIB_SPEICAL_TYPE(_item)                \
     327             :     for (_item = FIB_TYPE_SPEICAL_FIRST;                \
     328             :          _item <= FIB_SPEICAL_TYPE_LAST; _item++)
     329             : 
     330             : extern u8 * format_fib_protocol(u8 * s, va_list *ap);
     331             : extern u8 * format_vnet_link(u8 *s, va_list *ap);
     332             : 
     333             : /**
     334             :  * Path flags from the control plane
     335             :  */
     336             : typedef enum fib_route_path_flags_t_
     337             : {
     338             :     FIB_ROUTE_PATH_FLAG_NONE = 0,
     339             :     /**
     340             :      * Recursion constraint of via a host prefix
     341             :      */
     342             :     FIB_ROUTE_PATH_RESOLVE_VIA_HOST = (1 << 0),
     343             :     /**
     344             :      * Recursion constraint of via an attahced prefix
     345             :      */
     346             :     FIB_ROUTE_PATH_RESOLVE_VIA_ATTACHED = (1 << 1),
     347             :     /**
     348             :      * A for-us/local path
     349             :      */
     350             :     FIB_ROUTE_PATH_LOCAL = (1 << 2),
     351             :     /**
     352             :      * Attached path
     353             :      */
     354             :     FIB_ROUTE_PATH_ATTACHED = (1 << 3),
     355             :     /**
     356             :      * A Drop path - resolve the path on the drop DPO
     357             :      */
     358             :     FIB_ROUTE_PATH_DROP = (1 << 4),
     359             :     /**
     360             :      * Don't resolve the path, use the DPO the client provides
     361             :      */
     362             :     FIB_ROUTE_PATH_EXCLUSIVE = (1 << 5),
     363             :     /**
     364             :      * A path that result in received traffic being recieved/recirculated
     365             :      * so that it appears to have arrived on the new interface
     366             :      */
     367             :     FIB_ROUTE_PATH_INTF_RX = (1 << 6),
     368             :     /**
     369             :      * A local path with a RPF-ID => multicast traffic
     370             :      */
     371             :     FIB_ROUTE_PATH_RPF_ID = (1 << 7),
     372             :     /**
     373             :      * A deag path using the packet's source not destination address.
     374             :      */
     375             :     FIB_ROUTE_PATH_SOURCE_LOOKUP = (1 << 8),
     376             :     /**
     377             :      * A path via a UDP encap object.
     378             :      */
     379             :     FIB_ROUTE_PATH_UDP_ENCAP = (1 << 9),
     380             :     /**
     381             :      * A path that resolves via a BIER F-Mask
     382             :      */
     383             :     FIB_ROUTE_PATH_BIER_FMASK = (1 << 10),
     384             :     /**
     385             :      * A path that resolves via a BIER [ECMP] Table
     386             :      */
     387             :     FIB_ROUTE_PATH_BIER_TABLE = (1 << 11),
     388             :     /**
     389             :      * A path that resolves via a BIER impostion object
     390             :      */
     391             :     FIB_ROUTE_PATH_BIER_IMP = (1 << 12),
     392             :     /**
     393             :      * A path that resolves via another table
     394             :      */
     395             :     FIB_ROUTE_PATH_DEAG = (1 << 13),
     396             :     /**
     397             :      * A path that resolves via a DVR DPO
     398             :      */
     399             :     FIB_ROUTE_PATH_DVR = (1 << 14),
     400             : 
     401             :     FIB_ROUTE_PATH_ICMP_UNREACH = (1 << 15),
     402             :     FIB_ROUTE_PATH_ICMP_PROHIBIT = (1 << 16),
     403             :     FIB_ROUTE_PATH_CLASSIFY = (1 << 17),
     404             : 
     405             :     /**
     406             :      * Pop a Psuedo Wire Control Word
     407             :      */
     408             :     FIB_ROUTE_PATH_POP_PW_CW = (1 << 18),
     409             :     /**
     410             :      * A path that resolves via a glean adjacency
     411             :      */
     412             :     FIB_ROUTE_PATH_GLEAN = (1 << 19),
     413             : } fib_route_path_flags_t;
     414             : 
     415             : /**
     416             :  * Format route path flags
     417             :  */
     418             : extern u8 * format_fib_route_path_flags(u8 *s, va_list *ap);
     419             : 
     420             : /**
     421             :  * An RPF-ID is numerical value that is used RPF validate. An entry
     422             :  * has-a RPF-ID, when a packet egress from (e.g. an LSP) it gains an
     423             :  * RPF-ID, these two are compared for the RPF check.
     424             :  * This replaces the interfce based chack (since the LSP has no associated
     425             :  * interface.
     426             :  */
     427             : typedef u32 fib_rpf_id_t;
     428             : 
     429             : #define MFIB_RPF_ID_NONE (0)
     430             : 
     431             : /**
     432             :  * MPLS LSP mode - only valid at the head and tail
     433             :  */
     434             : typedef enum fib_mpls_lsp_mode_t_
     435             : {
     436             :     /**
     437             :      * Pipe Mode - the default.
     438             :      *  TTL and DSCP markings are not carried between the layers
     439             :      */
     440             :     FIB_MPLS_LSP_MODE_PIPE,
     441             :     /**
     442             :      * Uniform mode.
     443             :      *  TTL and DSCP are copied between the layers
     444             :      */
     445             :     FIB_MPLS_LSP_MODE_UNIFORM,
     446             : } __attribute__((packed)) fib_mpls_lsp_mode_t;
     447             : 
     448             : #define FIB_MPLS_LSP_MODES {                    \
     449             :     [FIB_MPLS_LSP_MODE_PIPE]     = "pipe",            \
     450             :     [FIB_MPLS_LSP_MODE_UNIFORM]  = "uniform",   \
     451             : }
     452             : 
     453             : /**
     454             :  * Format an LSP mode type
     455             :  */
     456             : extern u8 * format_fib_mpls_lsp_mode(u8 *s, va_list *ap);
     457             : 
     458             : /**
     459             :  * Configuration for each label value in the output-stack
     460             :  */
     461             : typedef struct fib_mpls_label_t_
     462             : {
     463             :     /**
     464             :      * The label value
     465             :      */
     466             :     mpls_label_t fml_value;
     467             : 
     468             :     /**
     469             :      * The LSP mode
     470             :      */
     471             :     fib_mpls_lsp_mode_t fml_mode;
     472             : 
     473             :     /**
     474             :      * TTL. valid only at imposition.
     475             :      */
     476             :     u8 fml_ttl;
     477             : 
     478             :     /**
     479             :      * EXP bits; valid only at imposition.
     480             :      */
     481             :     u8 fml_exp;
     482             : } fib_mpls_label_t;
     483             : 
     484             : /**
     485             :  * Format an MPLS label
     486             :  */
     487             : extern u8 * format_fib_mpls_label(u8 *s, va_list *ap);
     488             : 
     489             : /**
     490             :  * @brief 
     491             :  * A representation of a path as described by a route producer.
     492             :  * These paramenters will determine the path 'type', of which there are:
     493             :  * 1) Attached-next-hop:
     494             :  *   a single peer on a link.
     495             :  *   It is 'attached' because it is in the same sub-net as the router, on a link
     496             :  *   directly connected to the route.
     497             :  *   It is 'next=hop' since the next-hop address of the peer is known.
     498             :  * 2) Attached:
     499             :  *  the next-hop is not known. but we can ARP for it.
     500             :  * 3) Recursive.
     501             :  *  The next-hop is known but the interface is not. So to find the adj to use
     502             :  *  we must recursively resolve the next-hop.
     503             :  * 3) deaggregate (deag)
     504             :  *  A further lookup is required.
     505             :  */
     506             : typedef struct fib_route_path_t_ {
     507             :     /**
     508             :      * The protocol of the address below. We need this since the all
     509             :      * zeros address is ambiguous.
     510             :      */
     511             :     dpo_proto_t frp_proto;
     512             : 
     513             :     union {
     514             :         struct {
     515             :             union {
     516             :                 /**
     517             :                  * The next-hop address.
     518             :                  * Will be NULL for attached paths.
     519             :                  * Will be all zeros for attached-next-hop paths on a p2p interface
     520             :                  * Will be all zeros for a deag path.
     521             :                  */
     522             :                 ip46_address_t frp_addr;
     523             : 
     524             :                 struct {
     525             :                     /**
     526             :                      * The MPLS local Label to reursively resolve through.
     527             :                      * This is valid when the path type is MPLS.
     528             :                      */
     529             :                     mpls_label_t frp_local_label;
     530             :                     /**
     531             :                      * EOS bit for the resolving label
     532             :                      */
     533             :                     mpls_eos_bit_t frp_eos;
     534             :                 };
     535             :                 /**
     536             :                  * A path via a BIER imposition object.
     537             :                  * Present in an mfib path list
     538             :                  */
     539             :                 index_t frp_bier_imp;
     540             : 
     541             :                 /**
     542             :                  * Glean prefix on a glean path
     543             :                  */
     544             :                 fib_prefix_t frp_connected;
     545             :             };
     546             : 
     547             :             /**
     548             :              * The interface.
     549             :              * Will be invalid for recursive paths.
     550             :              */
     551             :             u32 frp_sw_if_index;
     552             : 
     553             :             /**
     554             :              * The RPF-ID
     555             :              */
     556             :             fib_rpf_id_t frp_rpf_id;
     557             : 
     558             :             /**
     559             :              * The FIB index to lookup the nexthop
     560             :              * Only valid for recursive paths.
     561             :              */
     562             :             u32 frp_fib_index;
     563             :             /**
     564             :              * The outgoing MPLS label Stack. NULL implies no label.
     565             :              */
     566             :             fib_mpls_label_t *frp_label_stack;
     567             :             /**
     568             :              * Exclusive DPO
     569             :              */
     570             :             dpo_id_t dpo;
     571             :             /**
     572             :              * MFIB interface flags
     573             :              */
     574             :             u32 frp_mitf_flags;
     575             :         };
     576             :         /**
     577             :          * A path that resolves via a BIER Table.
     578             :          * This would be for a MPLS label at a BIER midpoint or tail
     579             :          */
     580             :         bier_table_id_t frp_bier_tbl;
     581             : 
     582             :         /**
     583             :          * UDP encap ID
     584             :          */
     585             :         u32 frp_udp_encap_id;
     586             : 
     587             :         /**
     588             :          * Classify table ID
     589             :          */
     590             :         u32 frp_classify_table_id;
     591             : 
     592             :         /**
     593             :          * Resolving via a BIER Fmask
     594             :          */
     595             :         index_t frp_bier_fmask;
     596             : 
     597             :         /**
     598             :          * The DPO for use with exclusive paths
     599             :          */
     600             :         dpo_id_t frp_dpo;
     601             :     };
     602             :     /**
     603             :      * [un]equal cost path weight
     604             :      */
     605             :     u8 frp_weight;
     606             :     /**
     607             :      * A path preference. 0 is the best.
     608             :      * Only paths of the best preference, that are 'up', are considered
     609             :      * for forwarding.
     610             :      */
     611             :     u8 frp_preference;
     612             :     /**
     613             :      * flags on the path
     614             :      */
     615             :     fib_route_path_flags_t frp_flags;
     616             : } fib_route_path_t;
     617             : 
     618             : /**
     619             :  * Unformat a fib_route_path_t from CLI input
     620             :  */
     621             : extern uword unformat_fib_route_path(unformat_input_t * input, va_list * args);
     622             : 
     623             : /**
     624             :  * Format route path flags
     625             :  */
     626             : extern u8 * format_fib_route_path(u8 *s, va_list *ap);
     627             : 
     628             : /*
     629             :  * Return true if the path is attached
     630             :  */
     631             : extern int fib_route_path_is_attached (const fib_route_path_t *rpath);
     632             : 
     633             : /**
     634             :  * A help string to list the FIB path options
     635             :  */
     636             : #define FIB_ROUTE_PATH_HELP "[next-hop-address] [next-hop-interface] [next-hop-table <value>] [weight <value>] [preference <value>] [udp-encap-id <value>] [ip4-lookup-in-table <value>] [ip6-lookup-in-table <value>] [mpls-lookup-in-table <value>] [resolve-via-host] [resolve-via-connected] [rx-ip4 <interface>] [out-labels <value value value>]"
     637             : 
     638             : /**
     639             :  * return code to control pat-hlist walk
     640             :  */
     641             : typedef enum fib_path_list_walk_rc_t_
     642             : {
     643             :     FIB_PATH_LIST_WALK_STOP,
     644             :     FIB_PATH_LIST_WALK_CONTINUE,
     645             : } fib_path_list_walk_rc_t;
     646             : 
     647             : /**
     648             :  * A list of path-extensions
     649             :  */
     650             : typedef struct fib_path_ext_list_t_
     651             : {
     652             :     struct fib_path_ext_t_ *fpel_exts;
     653             : } fib_path_ext_list_t;
     654             : 
     655             : #endif

Generated by: LCOV version 1.14