vxlan: Fix L3 mode
[vpp.git] / src / vnet / vxlan / vxlan.h
index 21b7650..be819ab 100644 (file)
 
 #include <vppinfra/error.h>
 #include <vppinfra/hash.h>
+#include <vppinfra/bihash_16_8.h>
 #include <vppinfra/bihash_24_8.h>
 #include <vnet/vnet.h>
 #include <vnet/ip/ip.h>
+#include <vnet/ip/vtep.h>
 #include <vnet/l2/l2_input.h>
 #include <vnet/l2/l2_output.h>
 #include <vnet/l2/l2_bd.h>
@@ -27,7 +29,7 @@
 #include <vnet/vxlan/vxlan_packet.h>
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/ip/ip6_packet.h>
-#include <vnet/udp/udp.h>
+#include <vnet/udp/udp_packet.h>
 #include <vnet/dpo/dpo.h>
 #include <vnet/adj/adj_types.h>
 
@@ -43,27 +45,38 @@ typedef CLIB_PACKED (struct {
   udp_header_t udp;    /* 8 bytes */
   vxlan_header_t vxlan;        /* 8 bytes */
 }) ip6_vxlan_header_t;
+/* *INDENT-ON* */
 
-typedef CLIB_PACKED (union {
-  /*
-  * Key fields: remote ip, vni on incoming VXLAN packet
-  * all fields in NET byte order
-  */
-  struct
-    {
-      u32 src;
-      u32 vni; /* shifted left 8 bits */
-    };
-  u64 as_u64;
-}) vxlan4_tunnel_key_t;
+/*
+* Key fields: remote ip, vni on incoming VXLAN packet
+* all fields in NET byte order
+*/
+typedef clib_bihash_kv_16_8_t vxlan4_tunnel_key_t;
 
 /*
 * Key fields: remote ip, vni and fib index on incoming VXLAN packet
 * ip, vni fields in NET byte order
 * fib index field in host byte order
 */
-typedef BVT (clib_bihash_kv)  vxlan6_tunnel_key_t;
-/* *INDENT-ON* */
+typedef clib_bihash_kv_24_8_t vxlan6_tunnel_key_t;
+
+typedef union
+{
+  struct
+  {
+    u32 sw_if_index;           /* unicast - input interface / mcast - stats interface */
+    union
+    {
+      struct                   /* unicast action */
+      {
+       u16 next_index;
+       u8 error;
+      };
+      ip4_address_t local_ip;  /* used as dst ip for mcast pkts to assign them to unicast tunnel */
+    };
+  };
+  u64 as_u64;
+} vxlan_decap_info_t;
 
 typedef struct
 {
@@ -80,11 +93,15 @@ typedef struct
   ip46_address_t src;
   ip46_address_t dst;
 
+  /* udp-ports */
+  u16 src_port;
+  u16 dst_port;
+
   /* mcast packet output intfc index (used only if dst is mcast) */
   u32 mcast_sw_if_index;
 
   /* decap next index */
-  u32 decap_next_index;
+  u16 decap_next_index;
 
   /* The FIB index for src/dst addresses */
   u32 encap_fib_index;
@@ -106,7 +123,7 @@ typedef struct
   adj_index_t mcast_adj_index;
 
   /**
-   * The tunnel is a child of the FIB entry for its desintion. This is
+   * The tunnel is a child of the FIB entry for its destination. 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.
@@ -117,7 +134,7 @@ typedef struct
   u32 dev_instance;            /* Real device instance in tunnel vector */
   u32 user_instance;           /* Instance name being shown to user */
 
-    vnet_declare_rewrite (VLIB_BUFFER_PRE_DATA_SIZE);
+    VNET_DECLARE_REWRITE;
 } vxlan_tunnel_t;
 
 #define foreach_vxlan_input_next        \
@@ -146,13 +163,14 @@ typedef struct
   vxlan_tunnel_t *tunnels;
 
   /* lookup tunnel by key */
-  uword *vxlan4_tunnel_by_key; /* keyed on ipv4.dst + vni */
-    BVT (clib_bihash) vxlan6_tunnel_by_key;    /* keyed on ipv6.dst + fib +  vni */
+  clib_bihash_16_8_t
+    vxlan4_tunnel_by_key; /* keyed on ipv4.dst + src_port + fib + vni */
+  clib_bihash_24_8_t
+    vxlan6_tunnel_by_key; /* keyed on ipv6.dst + src_port + fib + vni */
 
   /* local VTEP IPs ref count used by vxlan-bypass node to check if
      received VXLAN packet DIP matches any local VTEP address */
-  uword *vtep4;                        /* local ip4 VTEPs keyed on their ip4 addr */
-  uword *vtep6;                        /* local ip6 VTEPs keyed on their ip6 addr */
+  vtep_table_t vtep_table;
 
   /* mcast shared info */
   uword *mcast_shared;         /* keyed on mcast ip46 addr */
@@ -160,6 +178,10 @@ typedef struct
   /* Mapping from sw_if_index to tunnel index */
   u32 *tunnel_index_by_sw_if_index;
 
+  /* graph node state */
+  uword *bm_ip4_bypass_enabled_by_sw_if;
+  uword *bm_ip6_bypass_enabled_by_sw_if;
+
   /* convenience */
   vlib_main_t *vlib_main;
   vnet_main_t *vnet_main;
@@ -167,6 +189,12 @@ typedef struct
   /* Record used instances */
   uword *instance_used;
   u32 flow_id_start;
+
+  /* cache for last 8 vxlan tunnel */
+#ifdef CLIB_HAVE_VEC512
+  vtep4_cache_t vtep4_u512;
+#endif
+
 } vxlan_main_t;
 
 extern vxlan_main_t vxlan_main;
@@ -184,14 +212,17 @@ typedef struct
   u8 is_add;
 
   /* we normally use is_ip4, but since this adds to the
-   * structure, this seems less of abreaking change */
+   * structure, this seems less of a breaking change */
   u8 is_ip6;
+  u8 is_l3;
   u32 instance;
   ip46_address_t src, dst;
   u32 mcast_sw_if_index;
   u32 encap_fib_index;
   u32 decap_next_index;
   u32 vni;
+  u16 src_port;
+  u16 dst_port;
 } vnet_vxlan_add_del_tunnel_args_t;
 
 int vnet_vxlan_add_del_tunnel