58 "[%d] instance %d src %U dst %U vni %d fib-idx %d" 59 " sw-if-idx %d mode %U ",
77 u32 dev_instance = va_arg (*args,
u32);
81 if (dev_instance == ~0)
82 return format (s,
"<cached-unused>");
85 return format (s,
"<improperly-referenced>");
115 u32 dev_instance = va_arg (*args,
u32);
116 s =
format (s,
"unimplemented dev %u", dev_instance);
150 u32 encap_index = is_ip4 ?
214 #define foreach_copy_field \ 217 _(mcast_sw_if_index) \ 227 ip4_vxlan_gbp_header_t h4;
228 ip6_vxlan_gbp_header_t h6;
230 int len = is_ip6 ?
sizeof h.h6 :
sizeof h.h4;
240 udp = &
h.h4.udp, vxlan_gbp = &
h.h4.vxlan_gbp;
254 udp = &
h.h6.udp, vxlan_gbp = &
h.h6.vxlan_gbp;
256 clib_host_to_net_u32 (6 << 28);
265 udp->
src_port = clib_host_to_net_u16 (47789);
266 udp->
dst_port = clib_host_to_net_u16 (UDP_DST_PORT_vxlan_gbp);
314 static inline mcast_shared_t
315 mcast_shared_get (ip46_address_t * ip)
320 mcast_shared_t ret = {.as_u64 = *p };
327 mcast_shared_t new_ep = {
328 .mcast_adj_index = ai,
329 .mfib_entry_index = mfei,
338 mcast_shared_t ep = mcast_shared_get (dst);
399 a->
dst.ip4.as_u32 | (((
u64) a->
src.ip4.as_u32) << 32);
401 | clib_host_to_net_u32 (a->
vni << 8);
409 key6.
key[0] = a->
dst.ip6.as_u64[0];
410 key6.
key[1] = a->
dst.ip6.as_u64[1];
412 | clib_host_to_net_u32 (a->
vni << 8);
433 return VNET_API_ERROR_TUNNEL_EXIST;
437 dev_instance = t - vxm->
tunnels;
440 #define _(x) t->x = a->x; 449 if (user_instance == ~0)
450 user_instance = dev_instance;
454 return VNET_API_ERROR_INSTANCE_IN_USE;
481 return VNET_API_ERROR_INVALID_REGISTRATION;
487 (vnm, vxlan_gbp_device_class.index, dev_instance,
488 vxlan_gbp_hw_class.index, dev_instance);
492 u32 encap_index = !is_ip6 ?
556 .frp_sw_if_index = 0xffffffff,
563 .fp_len = (is_ip6 ? 128 : 32),
564 .fp_grp_addr = tun_dst_pfx.
fp_addr,
599 mcast_shared_t ep = mcast_shared_get (&t->
dst);
617 return VNET_API_ERROR_NO_SUCH_ENTRY;
673 return VNET_API_ERROR_NO_SUCH_ENTRY;
692 return VNET_API_ERROR_NO_SUCH_ENTRY;
709 u32 *result = va_arg (*args,
u32 *);
710 u32 ipv4_set = va_arg (*args,
int);
717 *result = VXLAN_GBP_INPUT_NEXT_L2_INPUT;
720 else if (
unformat (input,
"%d", &tmp))
743 u32 encap_fib_index = 0;
745 u32 decap_next_index = VXLAN_GBP_INPUT_NEXT_L2_INPUT;
760 else if (
unformat (line_input,
"instance %d", &instance))
762 else if (
unformat (line_input,
"src %U",
768 else if (
unformat (line_input,
"dst %U",
774 else if (
unformat (line_input,
"group %U %U",
779 grp_set = dst_set = 1;
782 else if (
unformat (line_input,
"encap-vrf-id %d", &table_id))
788 &decap_next_index, ipv4_set))
790 else if (
unformat (line_input,
"vni %d", &vni))
805 if (encap_fib_index == ~0)
820 if (grp_set && mcast_sw_if_index == ~0)
823 if (ipv4_set && ipv6_set)
829 if (decap_next_index == ~0)
841 .instance = instance,
847 u32 tunnel_sw_if_index;
858 case VNET_API_ERROR_TUNNEL_EXIST:
861 case VNET_API_ERROR_NO_SUCH_ENTRY:
864 case VNET_API_ERROR_INSTANCE_IN_USE:
869 (0,
"vnet_vxlan_gbp_tunnel_add_del returned %d", rv);
901 .path =
"create vxlan-gbp tunnel",
903 "create vxlan-gbp tunnel src <local-vtep-addr>" 904 " {dst <remote-vtep-addr>|group <mcast-vtep-addr> <intf-name>} vni <nn>" 906 " [encap-vrf-id <nn>] [decap-next [l2|node <name>]] [del]",
935 vlib_cli_output (vm,
"%U", format_vxlan_gbp_tunnel, t);
963 .path =
"show vxlan-gbp tunnel",
964 .short_help =
"show vxlan-gbp tunnel [raw]",
975 sw_if_index, is_enable, 0, 0);
978 sw_if_index, is_enable, 0, 0);
1002 else if (
unformat (line_input,
"del"))
1011 if (~0 == sw_if_index)
1077 .path =
"set interface ip vxlan-gbp-bypass",
1079 .short_help =
"set interface ip vxlan-gbp-bypass <interface> [del]",
1134 .path =
"set interface ip6 vxlan-gbp-bypass",
1136 .short_help =
"set interface ip vxlan-gbp-bypass <interface> [del]",
1140 #define VXLAN_GBP_HASH_NUM_BUCKETS (2 * 1024) 1141 #define VXLAN_GBP_HASH_MEMORY_SIZE (1 << 20) 1164 sizeof (ip46_address_t),
1165 sizeof (mcast_shared_t));
1172 "VXLAN-GBP-no-such-v4-tunnel",
1175 "VXLAN-GBP-no-such-v6-tunnel",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void vnet_set_interface_output_node(vnet_main_t *vnm, u32 hw_if_index, u32 node_index)
Set interface output node - for interface registered without its output/tx nodes created because its ...
u16 lb_n_buckets
number of buckets in the load-balance.
void dpo_stack_from_node(u32 child_node_index, dpo_id_t *dpo, const dpo_id_t *parent)
Stack one DPO object on another, and thus establish a child parent relationship.
static void mcast_shared_add(ip46_address_t *dst, fib_node_index_t mfei, adj_index_t ai)
Recursive resolution source.
#define VXLAN_GBP_HASH_MEMORY_SIZE
Contribute an object that is to be used to forward IP6 packets.
#define hash_set(h, key, value)
l2_input_config_t * configs
static clib_error_t * show_vxlan_gbp_tunnel_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static void vxlan_gbp_set_header(vxlan_gbp_header_t *h, u32 vni)
clib_bihash_24_8_t vxlan6_gbp_tunnel_by_key
#define hash_unset(h, key)
VNET_HW_INTERFACE_CLASS(vxlan_gbp_hw_class)
VNET_DEVICE_CLASS(vxlan_gbp_device_class, static)
A representation of a path as described by a route producer.
vnet_main_t * vnet_get_main(void)
void fib_node_init(fib_node_t *node, fib_node_type_t type)
u32 fib_entry_child_add(fib_node_index_t fib_entry_index, fib_node_type_t child_type, fib_node_index_t child_index)
clib_error_t * vxlan_gbp_init(vlib_main_t *vm)
static vlib_punt_hdl_t punt_hdl
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
enum fib_node_back_walk_rc_t_ fib_node_back_walk_rc_t
Return code from a back walk function.
void fib_entry_contribute_forwarding(fib_node_index_t fib_entry_index, fib_forward_chain_type_t fct, dpo_id_t *dpo)
int vnet_vxlan_gbp_tunnel_add_del(vnet_vxlan_gbp_tunnel_add_del_args_t *a, u32 *sw_if_indexp)
static void mcast_shared_remove(ip46_address_t *dst)
#define vnet_rewrite_set_data(rw, data, data_bytes)
vlib_node_registration_t vxlan4_gbp_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan4_gbp_encap_node)
void vxlan_gbp_unregister_udp_ports(void)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
static uword unformat_decap_next(unformat_input_t *input, va_list *args)
void fib_entry_child_remove(fib_node_index_t fib_entry_index, u32 sibling_index)
void dpo_copy(dpo_id_t *dst, const dpo_id_t *src)
atomic copy a data-plane object.
enum vxlan_gbp_tunnel_mode_t_ vxlan_gbp_tunnel_mode_t
int vlib_punt_hdl_t
Typedef for a client handle.
static void vxlan_gbp_tunnel_last_lock_gone(fib_node_t *node)
Function definition to inform the FIB node that its last lock has gone.
Contribute an object that is to be used to forward IP4 packets.
vxlan_gbp_main_t vxlan_gbp_main
#define STRUCT_OFFSET_OF(t, f)
void fib_node_deinit(fib_node_t *node)
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
dpo_proto_t frp_proto
The protocol of the address below.
unformat_function_t unformat_vnet_sw_interface
static u8 * format_vxlan_gbp_name(u8 *s, va_list *args)
int vlib_punt_reason_alloc(vlib_punt_hdl_t client, const char *reason_name, vlib_punt_reason_t *reason)
Allocate a new punt reason.
vlib_node_registration_t vxlan6_gbp_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan6_gbp_encap_node)
#define ip46_address_cmp(ip46_1, ip46_2)
format_function_t format_vnet_sw_if_index_name
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
static uword ip46_address_is_multicast(const ip46_address_t *a)
static uword vtep_addr_ref(ip46_address_t *ip)
void fib_node_register_type(fib_node_type_t type, const fib_node_vft_t *vft)
fib_node_register_type
static u8 * format_vxlan_gbp_header_with_length(u8 *s, va_list *args)
vnet_flood_class_t flood_class
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
u32 frp_sw_if_index
The interface.
#define VLIB_INIT_FUNCTION(x)
void mfib_table_entry_delete_index(fib_node_index_t mfib_entry_index, mfib_source_t source)
Delete a FIB entry.
static void vxlan_gbp_tunnel_restack_dpo(vxlan_gbp_tunnel_t *t)
Aggregrate type for a prefix.
#define clib_error_return(e, args...)
fib_node_index_t mfib_table_entry_path_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, const fib_route_path_t *rpath, mfib_itf_flags_t itf_flags)
Add n paths to an entry (aka route) in the FIB.
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
static void vxlan_gbp_rewrite(vxlan_gbp_tunnel_t *t, bool is_ip6)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
#define vlib_call_init_function(vm, x)
u32 vnet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, u32 hw_class_index, u32 hw_instance)
vlib_punt_hdl_t vlib_punt_client_register(const char *who)
Register a new clinet.
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
#define hash_create_mem(elts, key_bytes, value_bytes)
static vxlan_gbp_tunnel_t * vxlan_gbp_tunnel_from_fib_node(fib_node_t *node)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
vlib_punt_reason_t punt_no_such_tunnel[FIB_PROTOCOL_IP_MAX]
Punt reasons for no such tunnel.
void ip4_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
dpo_type_t dpoi_type
the type
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
clib_bihash_16_8_t vxlan4_gbp_tunnel_by_key
static clib_error_t * set_ip6_vxlan_gbp_bypass(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
load-balancing over a choice of [un]equal cost paths
static uword get_decap_next_for_node(u32 node_index, u32 ipv4_set)
#define pool_put(P, E)
Free an object E in pool P.
u32 sibling_index
The tunnel is a child of the FIB entry for its destination.
vnet_sw_interface_flags_t flags
fib_node_type_t fn_type
The node's type.
static clib_error_t * punt_init(vlib_main_t *vm)
An node in the FIB graph.
fib_node_index_t fib_entry_index
u8 * format_vxlan_gbp_tunnel(u8 *s, va_list *args)
#define ip46_address_initializer
#define ip46_address_is_ip4(ip46)
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
fib_node_index_t fib_table_entry_special_add(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags)
Add a 'special' entry to the FIB.
vlib_node_registration_t vxlan4_gbp_input_node
(constructor) VLIB_REGISTER_NODE (vxlan4_gbp_input_node)
void fib_table_entry_delete_index(fib_node_index_t fib_entry_index, fib_source_t source)
Delete a FIB entry.
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
vlib_node_registration_t vxlan6_gbp_input_node
(constructor) VLIB_REGISTER_NODE (vxlan6_gbp_input_node)
u32 fib_node_index_t
A typedef of a node index.
static fib_node_back_walk_rc_t vxlan_gbp_tunnel_back_walk(fib_node_t *node, fib_node_back_walk_ctx_t *ctx)
Function definition to backwalk a FIB node - Here we will restack the new dpo of VXLAN DIP to encap n...
u32 adj_index_t
An index for adjacencies.
static fib_node_t * vxlan_gbp_tunnel_fib_node_get(fib_node_index_t index)
Function definition to get a FIB node from its index.
void fib_prefix_from_ip46_addr(const ip46_address_t *addr, fib_prefix_t *pfx)
Host prefix from ip.
static uword vtep_addr_unref(ip46_address_t *ip)
void dpo_set(dpo_id_t *dpo, dpo_type_t type, dpo_proto_t proto, index_t index)
Set/create a DPO ID The DPO will be locked.
vl_api_vxlan_gbp_api_tunnel_mode_t mode
Aggregrate type for a prefix.
u8 * default_build_rewrite(vnet_main_t *vnm, u32 sw_if_index, vnet_link_t link_type, const void *dst_address)
Return a complete, zero-length (aka dummy) rewrite.
void vxlan_gbp_register_udp_ports(void)
Context passed between object during a back walk.
#define VLIB_CLI_COMMAND(x,...)
static load_balance_t * load_balance_get(index_t lbi)
static clib_error_t * set_ip_vxlan_gbp_bypass(u32 is_ip6, unformat_input_t *input, vlib_cli_command_t *cmd)
enum fib_forward_chain_type_t_ fib_forward_chain_type_t
FIB output chain type.
fib_route_path_flags_t frp_flags
flags on the path
int vnet_vxlan_gbp_tunnel_del(u32 sw_if_index)
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
#define foreach_copy_field
fib_node_t node
Linkage into the FIB object graph.
static clib_error_t * vxlan_gbp_interface_admin_up_down(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
void vnet_delete_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
fib_protocol_t fp_proto
protocol type
u8 * format_vxlan_gbp_tunnel_mode(u8 *s, va_list *args)
index_t dpoi_index
the index of objects of that type
static clib_error_t * vxlan_gbp_tunnel_add_del_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static clib_error_t * set_ip4_vxlan_gbp_bypass(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static fib_protocol_t fib_ip_proto(bool is_ip6)
Convert from boolean is_ip6 to FIB protocol.
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, vnet_hw_interface_flags_t flags)
static void hash_set_mem_alloc(uword **h, void *key, uword v)
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
vxlan_gbp_tunnel_t * tunnels
unformat_function_t unformat_vlib_node
#define hash_get_mem(h, key)
static void hash_unset_mem_free(uword **h, void *key)
A FIB graph nodes virtual function table.
typedef CLIB_PACKED(union { struct { fib_node_index_t mfib_entry_index;adj_index_t mcast_adj_index;};u64 as_u64;})
clib_error_t * vnet_sw_interface_set_flags(vnet_main_t *vnm, u32 sw_if_index, vnet_sw_interface_flags_t flags)
adj_index_t adj_mcast_add_or_lock(fib_protocol_t proto, vnet_link_t link_type, u32 sw_if_index)
Mcast Adjacency.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
vnet_link_t fib_proto_to_link(fib_protocol_t proto)
Convert from a protocol to a link type.
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
vxlan_gbp_tunnel_mode_t mode
Tunnel mode.
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header, unspecified alignment)
#define CLIB_CACHE_LINE_BYTES
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static u16 ip4_header_checksum(ip4_header_t *i)
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
void vnet_int_vxlan_gbp_bypass_mode(u32 sw_if_index, u8 is_ip6, u8 is_enable)
const ip46_address_t zero_addr
#define VXLAN_GBP_HASH_NUM_BUCKETS
u32 * tunnel_index_by_sw_if_index
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
u8 * format_vxlan_gbp_encap_trace(u8 *s, va_list *args)
static uword pool_elts(void *v)
Number of active elements in a pool.