fib: Source Address Selection
[vpp.git] / src / vnet / fib / fib_types.h
index be6a24e..b5a58e7 100644 (file)
@@ -16,8 +16,8 @@
 #ifndef __FIB_TYPES_H__
 #define __FIB_TYPES_H__
 
-#include <vlib/vlib.h>
-#include <vnet/ip/ip6_packet.h>
+#include <stdbool.h>
+#include <vnet/ip/ip46_address.h>
 #include <vnet/mpls/packet.h>
 #include <vnet/dpo/dpo.h>
 #include <vnet/bier/bier_types.h>
@@ -71,6 +71,26 @@ typedef enum fib_protocol_t_ {
         _item <= FIB_PROTOCOL_IP6;        \
         _item++)
 
+/**
+ * @brief Convert from boolean is_ip6 to FIB protocol.
+ * Drop MPLS on the floor in favor of IPv4.
+ */
+static inline fib_protocol_t
+fib_ip_proto(bool is_ip6)
+{
+  return (is_ip6) ? FIB_PROTOCOL_IP6 : FIB_PROTOCOL_IP4;
+}
+
+/**
+ * @brief Convert from fib_protocol to ip46_type
+ */
+extern ip46_type_t fib_proto_to_ip46(fib_protocol_t fproto);
+
+/**
+ * @brief Convert from ip46_type to fib_protocol
+ */
+extern fib_protocol_t fib_proto_from_ip46(ip46_type_t iproto);
+
 /**
  * @brief Convert from a protocol to a link type
  */
@@ -152,22 +172,32 @@ typedef enum fib_forward_chain_type_t_ {
         _item++)
 
 /**
- * @brief Convert from a chain type to the adjacencies link type
+ * @brief Convert from a chain type to the adjacency's link type
  */
 extern vnet_link_t fib_forw_chain_type_to_link_type(fib_forward_chain_type_t fct);
 
+/**
+ * @brief Convert from a adjacency's link type to chain type
+ */
+extern fib_forward_chain_type_t fib_forw_chain_type_from_link_type(vnet_link_t lt);
+
 /**
  * @brief Convert from a payload-protocol to a chain type.
  */
 extern fib_forward_chain_type_t fib_forw_chain_type_from_dpo_proto(dpo_proto_t proto);
 
+/**
+ * @brief Convert from a fib-protocol to a chain type.
+ */
+extern fib_forward_chain_type_t fib_forw_chain_type_from_fib_proto(fib_protocol_t proto);
+
 /**
  * @brief Convert from a chain type to the DPO proto it will install
  */
 extern dpo_proto_t fib_forw_chain_type_to_dpo_proto(fib_forward_chain_type_t fct);
 
 /**
- * Aggregrate type for a prefix
+ * Aggregate type for a prefix
  */
 typedef struct fib_prefix_t_ {
     /**
@@ -216,6 +246,12 @@ STATIC_ASSERT(STRUCT_OFFSET_OF(fib_prefix_t, fp_addr) == 4,
 extern int fib_prefix_cmp(const fib_prefix_t *p1,
                          const fib_prefix_t *p2);
 
+/**
+ * \brief Copy a prefix
+ */
+extern void fib_prefix_copy(fib_prefix_t *dst,
+                            const fib_prefix_t *src);
+
 /**
  * \brief Compare two prefixes for covering relationship
  *
@@ -228,7 +264,14 @@ extern int fib_prefix_is_cover(const fib_prefix_t *p1,
  * \brief Return true is the prefix is a host prefix
  */
 extern int fib_prefix_is_host(const fib_prefix_t *p);
+extern u8 fib_prefix_get_host_length (fib_protocol_t proto);
 
+/**
+ * normalise a prefix (i.e. mask the host bits according to the
+ * prefix length)
+ */
+extern void fib_prefix_normalize(const fib_prefix_t *p,
+                                 fib_prefix_t *out);
 
 /**
  * \brief Host prefix from ip
@@ -340,8 +383,34 @@ typedef enum fib_route_path_flags_t_
      * A path that resolves via a BIER impostion object
      */
     FIB_ROUTE_PATH_BIER_IMP = (1 << 12),
+    /**
+     * A path that resolves via another table
+     */
+    FIB_ROUTE_PATH_DEAG = (1 << 13),
+    /**
+     * A path that resolves via a DVR DPO
+     */
+    FIB_ROUTE_PATH_DVR = (1 << 14),
+
+    FIB_ROUTE_PATH_ICMP_UNREACH = (1 << 15),
+    FIB_ROUTE_PATH_ICMP_PROHIBIT = (1 << 16),
+    FIB_ROUTE_PATH_CLASSIFY = (1 << 17),
+
+    /**
+     * Pop a Psuedo Wire Control Word
+     */
+    FIB_ROUTE_PATH_POP_PW_CW = (1 << 18),
+    /**
+     * A path that resolves via a glean adjacency
+     */
+    FIB_ROUTE_PATH_GLEAN = (1 << 19),
 } fib_route_path_flags_t;
 
+/**
+ * Format route path flags
+ */
+extern u8 * format_fib_route_path_flags(u8 *s, va_list *ap);
+
 /**
  * An RPF-ID is numerical value that is used RPF validate. An entry
  * has-a RPF-ID, when a packet egress from (e.g. an LSP) it gains an
@@ -353,6 +422,64 @@ typedef u32 fib_rpf_id_t;
 
 #define MFIB_RPF_ID_NONE (0)
 
+/**
+ * MPLS LSP mode - only valid at the head and tail
+ */
+typedef enum fib_mpls_lsp_mode_t_
+{
+    /**
+     * Pipe Mode - the default.
+     *  TTL and DSCP markings are not carried between the layers
+     */
+    FIB_MPLS_LSP_MODE_PIPE,
+    /**
+     * Uniform mode.
+     *  TTL and DSCP are copied between the layers
+     */
+    FIB_MPLS_LSP_MODE_UNIFORM,
+} __attribute__((packed)) fib_mpls_lsp_mode_t;
+
+#define FIB_MPLS_LSP_MODES {                   \
+    [FIB_MPLS_LSP_MODE_PIPE]     = "pipe",             \
+    [FIB_MPLS_LSP_MODE_UNIFORM]  = "uniform",   \
+}
+
+/**
+ * Format an LSP mode type
+ */
+extern u8 * format_fib_mpls_lsp_mode(u8 *s, va_list *ap);
+
+/**
+ * Configuration for each label value in the output-stack
+ */
+typedef struct fib_mpls_label_t_
+{
+    /**
+     * The label value
+     */
+    mpls_label_t fml_value;
+
+    /**
+     * The LSP mode
+     */
+    fib_mpls_lsp_mode_t fml_mode;
+
+    /**
+     * TTL. valid only at imposition.
+     */
+    u8 fml_ttl;
+
+    /**
+     * EXP bits; valid only at imposition.
+     */
+    u8 fml_exp;
+} fib_mpls_label_t;
+
+/**
+ * Format an MPLS label
+ */
+extern u8 * format_fib_mpls_label(u8 *s, va_list *ap);
+
 /**
  * @brief 
  * A representation of a path as described by a route producer.
@@ -399,18 +526,29 @@ typedef struct fib_route_path_t_ {
                      */
                     mpls_eos_bit_t frp_eos;
                 };
-            };
-            union {
                 /**
-                 * The interface.
-                 * Will be invalid for recursive paths.
+                 * A path via a BIER imposition object.
+                 * Present in an mfib path list
                  */
-                u32 frp_sw_if_index;
+                index_t frp_bier_imp;
+
                 /**
-                 * The RPF-ID
+                 * Glean prefix on a glean path
                  */
-                fib_rpf_id_t frp_rpf_id;
+                fib_prefix_t frp_connected;
             };
+
+            /**
+             * The interface.
+             * Will be invalid for recursive paths.
+             */
+            u32 frp_sw_if_index;
+
+            /**
+             * The RPF-ID
+             */
+            fib_rpf_id_t frp_rpf_id;
+
             union {
                 /**
                  * The FIB index to lookup the nexthop
@@ -425,7 +563,15 @@ typedef struct fib_route_path_t_ {
             /**
              * The outgoing MPLS label Stack. NULL implies no label.
              */
-            mpls_label_t *frp_label_stack;
+            fib_mpls_label_t *frp_label_stack;
+            /**
+            * Exclusive DPO
+            */
+           dpo_id_t dpo;
+            /**
+             * MFIB interface flags
+             */
+            u32 frp_mitf_flags;
         };
         /**
          * A path that resolves via a BIER Table.
@@ -434,15 +580,24 @@ typedef struct fib_route_path_t_ {
         bier_table_id_t frp_bier_tbl;
 
         /**
-         * A path via a BIER imposition object.
-         * Present in an mfib path list
+         * UDP encap ID
          */
-        index_t frp_bier_imp;
+        u32 frp_udp_encap_id;
 
         /**
-         * UDP encap ID
+         * Classify table ID
          */
-        u32 frp_udp_encap_id;
+        u32 frp_classify_table_id;
+
+        /**
+         * Resolving via a BIER Fmask
+         */
+        index_t frp_bier_fmask;
+
+        /**
+         * The DPO for use with exclusive paths
+         */
+        dpo_id_t frp_dpo;
     };
     /**
      * [un]equal cost path weight
@@ -466,18 +621,14 @@ typedef struct fib_route_path_t_ {
 extern uword unformat_fib_route_path(unformat_input_t * input, va_list * args);
 
 /**
- * A help string to list the FIB path options
+ * Format route path flags
  */
-#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>]"
+extern u8 * format_fib_route_path(u8 *s, va_list *ap);
 
 /**
- * @brief 
- * A representation of a fib path for fib_path_encode to convey the information to the caller
+ * A help string to list the FIB path options
  */
-typedef struct fib_route_path_encode_t_ {
-    fib_route_path_t rpath;
-    dpo_id_t dpo;
-} fib_route_path_encode_t;
+#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>]"
 
 /**
  * return code to control pat-hlist walk