#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>
#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>
*/
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
{
/* Required for pool_get_aligned */
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;
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 \
vxlan_tunnel_t *tunnels;
/* lookup tunnel by key */
- clib_bihash_16_8_t vxlan4_tunnel_by_key; /* keyed on ipv4.dst + fib + vni */
- clib_bihash_24_8_t 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 */
/* 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;
/* 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;
/* we normally use is_ip4, but since this adds to the
* 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