FIB2.0: Adjacency complete pull model (VPP-487)
[vpp.git] / vnet / vnet / gre / gre.h
index 490360d..a0ee9ad 100644 (file)
@@ -25,8 +25,9 @@
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/pg/pg.h>
 #include <vnet/ip/format.h>
+#include <vnet/adj/adj_types.h>
 
-vnet_hw_interface_class_t gre_hw_interface_class;
+extern vnet_hw_interface_class_t gre_hw_interface_class;
 
 typedef enum {
 #define gre_error(n,s) GRE_ERROR_##n,
@@ -50,10 +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 {
@@ -67,11 +107,26 @@ typedef struct {
   /* Hash mapping src/dst addr pair to tunnel */
   uword * tunnel_by_key;
 
+  /* Free vlib 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;
+
   /* convenience */
   vlib_main_t * vlib_main;
   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)
 {
@@ -87,16 +142,22 @@ 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;
 format_function_t format_gre_header_with_length;
 
 extern vlib_node_registration_t gre_input_node;
-vnet_device_class_t gre_device_class;
+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. */
@@ -115,4 +176,15 @@ gre_register_input_protocol (vlib_main_t * vm,
 /* manually added to the interface output node in gre.c */
 #define GRE_OUTPUT_NEXT_LOOKUP 1
 
+typedef struct {
+  u8 is_add;
+
+  ip4_address_t src, dst;
+  u32 outer_fib_id;
+  u8 teb;
+} vnet_gre_add_del_tunnel_args_t;
+
+int vnet_gre_add_del_tunnel
+  (vnet_gre_add_del_tunnel_args_t *a, u32 * sw_if_indexp);
+
 #endif /* included_gre_h */