A Protocol Independent Hierarchical FIB (VPP-352)
[vpp.git] / vnet / vnet / gre / gre.h
index 6cbe4aa..beb13d9 100644 (file)
@@ -25,6 +25,7 @@
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/pg/pg.h>
 #include <vnet/ip/format.h>
+#include <vnet/adj/adj_types.h>
 
 extern vnet_hw_interface_class_t gre_hw_interface_class;
 
@@ -50,11 +51,44 @@ typedef struct {
 } gre_protocol_info_t;
 
 typedef struct {
+  /**
+   * Linkage into the FIB object graph
+   */
+  fib_node_t node;
+
+  /**
+   * The tunnel's source/local address
+   */
   ip4_address_t tunnel_src;
+  /**
+   * The tunnel's destination/remote address
+   */
   ip4_address_t tunnel_dst;
+  /**
+   * The FIB in which the src.dst address are present
+   */
   u32 outer_fib_index;
   u32 hw_if_index;
   u32 sw_if_index;
+  u8 teb;
+
+  /**
+   * The FIB entry sourced by the tunnel for its destination prefix
+   */
+  fib_node_index_t fib_entry_index;
+
+  /**
+   * The tunnel is a child of the FIB entry for its desintion. This is
+   * so it receives updates when the forwarding information for that entry
+   * changes.
+   * The tunnels sibling index on the FIB entry's dependency list.
+   */
+  u32 sibling_index;
+
+  /**
+   * The index of the midchain adjacency created for this tunnel
+   */
+  adj_index_t adj_index[FIB_LINK_NUM];
 } gre_tunnel_t;
 
 typedef struct {
@@ -69,7 +103,7 @@ typedef struct {
   uword * tunnel_by_key;
 
   /* Free vlib hw_if_indices */
-  u32 * free_vxlan_tunnel_hw_if_indices;
+  u32 * free_gre_tunnel_hw_if_indices;
 
   /* Mapping from sw_if_index to tunnel index */
   u32 * tunnel_index_by_sw_if_index;
@@ -79,6 +113,15 @@ typedef struct {
   vnet_main_t * vnet_main;
 } gre_main_t;
 
+/**
+ * @brief IPv4 and GRE header.
+ *
+*/
+typedef CLIB_PACKED (struct {
+  ip4_header_t ip4;
+  gre_header_t gre;
+}) ip4_and_gre_header_t;
+
 always_inline gre_protocol_info_t *
 gre_get_protocol_info (gre_main_t * em, gre_protocol_t protocol)
 {
@@ -126,7 +169,8 @@ typedef struct {
   u8 is_add;
 
   ip4_address_t src, dst;
-  u32 outer_table_id;
+  u32 outer_fib_id;
+  u8 teb;
 } vnet_gre_add_del_tunnel_args_t;
 
 int vnet_gre_add_del_tunnel