X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fvxlan%2Fvxlan.h;h=be819ab10694d16982eef5a06ce8a14681ac8457;hb=3e38422ab;hp=21b7650f454e7c136f9829095548a286a8f36846;hpb=0fa56788f71d570ce585027e2acdf19e82e6d433;p=vpp.git diff --git a/src/vnet/vxlan/vxlan.h b/src/vnet/vxlan/vxlan.h index 21b7650f454..be819ab1069 100644 --- a/src/vnet/vxlan/vxlan.h +++ b/src/vnet/vxlan/vxlan.h @@ -17,9 +17,11 @@ #include #include +#include #include #include #include +#include #include #include #include @@ -27,7 +29,7 @@ #include #include #include -#include +#include #include #include @@ -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