FIB2.0: Adjacency complete pull model (VPP-487)
[vpp.git] / vnet / vnet / gre / gre.h
index d875be9..a0ee9ad 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,49 @@ 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;
+
+  /**
+   * on a L2 tunnel this is the VLIB arc from the L2-tx to the l2-midchain
+   */
+  u32 l2_tx_arc;
+
+  /**
+   * an L2 tunnel always rquires an L2 midchain. cache here for DP.
+   */
+  adj_index_t l2_adj_index;
 } gre_tunnel_t;
 
 typedef struct {
@@ -79,6 +118,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)
 {
@@ -94,9 +142,14 @@ gre_register_input_type (vlib_main_t * vm,
                         gre_protocol_t protocol,
                         u32 node_index);
 
-void gre_set_adjacency (vnet_rewrite_header_t * rw,
-                       uword max_data_bytes,
-                       gre_protocol_t protocol);
+extern  clib_error_t * gre_interface_admin_up_down (vnet_main_t * vnm,
+                                                   u32 hw_if_index,
+                                                   u32 flags);
+
+extern void gre_tunnel_stack (adj_index_t ai);
+extern void gre_update_adj (vnet_main_t * vnm,
+                           u32 sw_if_index,
+                           adj_index_t ai);
 
 format_function_t format_gre_protocol;
 format_function_t format_gre_header;
@@ -104,6 +157,7 @@ format_function_t format_gre_header_with_length;
 
 extern vlib_node_registration_t gre_input_node;
 extern vnet_device_class_t gre_device_class;
+extern vnet_device_class_t gre_l2_device_class;
 
 /* Parse gre protocol as 0xXXXX or protocol name.
    In either host or network byte order. */
@@ -127,6 +181,7 @@ typedef struct {
 
   ip4_address_t src, dst;
   u32 outer_fib_id;
+  u8 teb;
 } vnet_gre_add_del_tunnel_args_t;
 
 int vnet_gre_add_del_tunnel