|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
73 "[%d] instance %d src %U dst %U src_port %d dst_port %d vni %d "
74 "fib-idx %d sw-if-idx %d ",
98 u32 dev_instance = va_arg (*args,
u32);
102 if (dev_instance == ~0)
103 return format (s,
"<cached-unused>");
106 return format (s,
"<improperly-referenced>");
135 u32 dev_instance = va_arg (*args,
u32);
136 s =
format (s,
"unimplemented dev %u", dev_instance);
178 u32 encap_index = is_ip4 ?
240 #define foreach_copy_field \
242 _ (mcast_sw_if_index) \
243 _ (encap_fib_index) \
244 _ (decap_next_index) \
255 ip4_vxlan_header_t h4;
256 ip6_vxlan_header_t h6;
268 udp = &
h.h4.udp, vxlan = &
h.h4.vxlan;
269 ip->ip_version_and_header_length = 0x45;
271 ip->protocol = IP_PROTOCOL_UDP;
273 ip->src_address = t->
src.ip4;
274 ip->dst_address = t->
dst.ip4;
282 udp = &
h.h6.udp, vxlan = &
h.h6.vxlan;
283 ip->ip_version_traffic_class_and_flow_label =
284 clib_host_to_net_u32 (6 << 28);
286 ip->protocol = IP_PROTOCOL_UDP;
288 ip->src_address = t->
src.ip6;
289 ip->dst_address = t->
dst.ip6;
303 u32 decap_next_index)
310 return decap_next_index <
r->n_next_nodes;
325 static inline mcast_shared_t
331 mcast_shared_t ret = {.as_u64 = *p };
338 mcast_shared_t new_ep = {
339 .mcast_adj_index = ai,
340 .mfib_entry_index = mfei,
371 if (
a->src_port == 0)
372 a->src_port =
is_ip6 ? UDP_DST_PORT_vxlan6 : UDP_DST_PORT_vxlan;
374 if (
a->dst_port == 0)
375 a->dst_port =
is_ip6 ? UDP_DST_PORT_vxlan6 : UDP_DST_PORT_vxlan;
383 a->dst.ip4.as_u32 | (((
u64)
a->src.ip4.as_u32) << 32);
384 key4.
key[1] = ((
u64) clib_host_to_net_u16 (
a->src_port) << 48) |
385 (((
u64)
a->encap_fib_index) << 32) |
386 clib_host_to_net_u32 (
a->vni << 8);
389 p = (
void *) &key4.
value;
393 key6.
key[0] =
a->dst.ip6.as_u64[0];
394 key6.
key[1] =
a->dst.ip6.as_u64[1];
395 key6.
key[2] = (((
u64) clib_host_to_net_u16 (
a->src_port) << 48) |
396 ((
u64)
a->encap_fib_index) << 32) |
397 clib_host_to_net_u32 (
a->vni << 8);
400 p = (
void *) &key6.
value;
414 return VNET_API_ERROR_TUNNEL_EXIST;
417 if (
a->decap_next_index == ~0)
418 a->decap_next_index = VXLAN_INPUT_NEXT_L2_INPUT;
420 return VNET_API_ERROR_INVALID_DECAP_NEXT;
425 dev_instance = t - vxm->
tunnels;
428 #define _(x) t->x = a->x;
436 user_instance =
a->instance;
437 if (user_instance == ~0)
438 user_instance = dev_instance;
442 return VNET_API_ERROR_INSTANCE_IN_USE;
454 vxlan_hw_class.index, dev_instance);
461 memcpy (hw_addr + 2, &rnd,
sizeof (rnd));
465 vnm, vxlan_device_class.index, dev_instance, hw_addr,
471 return VNET_API_ERROR_SYSCALL_ERROR_2;
496 di.local_ip = t->
src.ip4;
512 return VNET_API_ERROR_INVALID_REGISTRATION;
567 .frp_sw_if_index = 0xffffffff,
575 .fp_len = (
is_ip6 ? 128 : 32),
576 .fp_grp_addr = tun_dst_pfx.
fp_addr,
587 path.frp_sw_if_index =
a->mcast_sw_if_index;
599 a->mcast_sw_if_index);
626 return VNET_API_ERROR_NO_SUCH_ENTRY;
700 u32 *result = va_arg (*args,
u32 *);
701 u32 ipv4_set = va_arg (*args,
int);
708 *result = VXLAN_INPUT_NEXT_L2_INPUT;
734 u32 encap_fib_index = 0;
736 u32 decap_next_index = VXLAN_INPUT_NEXT_L2_INPUT;
755 else if (
unformat (line_input,
"src %U",
761 else if (
unformat (line_input,
"dst %U",
767 else if (
unformat (line_input,
"group %U %U",
772 grp_set = dst_set = 1;
780 else if (
unformat (line_input,
"l3"))
783 &decap_next_index, ipv4_set))
804 if (is_l3 && decap_next_index == VXLAN_INPUT_NEXT_L2_INPUT)
807 vm, (
u8 *) (ipv4_set ?
"ip4-input" :
"ip6-input"));
811 if (encap_fib_index == ~0)
829 if (ipv4_set && ipv6_set)
835 if (decap_next_index == ~0)
853 u32 tunnel_sw_if_index;
864 case VNET_API_ERROR_TUNNEL_EXIST:
867 case VNET_API_ERROR_NO_SUCH_ENTRY:
870 case VNET_API_ERROR_INSTANCE_IN_USE:
875 (0,
"vnet_vxlan_add_del_tunnel returned %d",
rv);
913 .path =
"create vxlan tunnel",
915 "create vxlan tunnel src <local-vtep-addr>"
916 " {dst <remote-vtep-addr>|group <mcast-vtep-addr> <intf-name>} vni <nn>"
918 " [encap-vrf-id <nn>] [decap-next [l2|node <name>]] [del] [l3]"
919 " [src_port <local-vtep-udp-port>] [dst_port <remote-vtep-udp-port>]",
977 .path =
"show vxlan tunnel",
978 .short_help =
"show vxlan tunnel [raw]",
993 is_enable = ! !is_enable;
1042 else if (
unformat (line_input,
"del"))
1117 .path =
"set interface ip vxlan-bypass",
1119 .short_help =
"set interface ip vxlan-bypass <interface> [del]",
1174 .path =
"set interface ip6 vxlan-bypass",
1176 .short_help =
"set interface ip6 vxlan-bypass <interface> [del]",
1193 VNET_FLOW_ACTION_REDIRECT_TO_NODE | VNET_FLOW_ACTION_MARK |
1194 VNET_FLOW_ACTION_BUFFER_ADVANCE,
1198 .
type = VNET_FLOW_TYPE_IP4_VXLAN,
1200 .protocol.prot = IP_PROTOCOL_UDP,
1201 .src_addr.addr = t->
dst.ip4,
1202 .dst_addr.addr = t->
src.ip4,
1203 .src_addr.mask.as_u32 = ~0,
1204 .dst_addr.mask.as_u32 = ~0,
1206 .dst_port.mask = 0xFF,
1240 u32 rx_sw_if_index = ~0;
1241 u32 hw_if_index = ~0;
1261 if (rx_sw_if_index == ~0)
1263 if (hw_if_index == ~0)
1288 is_add ?
"enabling" :
"disabling");
1295 .path =
"set flow-offload vxlan",
1297 "set flow-offload vxlan hw <interface-name> rx <tunnel-name> [del]",
1302 #define VXLAN_HASH_NUM_BUCKETS (2 * 1024)
1303 #define VXLAN_HASH_MEMORY_SIZE (1 << 20)
1326 sizeof (ip46_address_t),
1327 sizeof (mcast_shared_t));
int vnet_flow_enable(vnet_main_t *vnm, u32 flow_index, u32 hw_if_index)
int vnet_flow_del(vnet_main_t *vnm, u32 flow_index)
#define vnet_rewrite_set_data(rw, data, data_bytes)
vnet_interface_main_t * im
static vlib_cli_command_t set_interface_ip6_vxlan_bypass_command
(constructor) VLIB_CLI_COMMAND (set_interface_ip6_vxlan_bypass_command)
u16 lb_n_buckets
number of buckets in the load-balance.
clib_error_t * vnet_sw_interface_set_flags(vnet_main_t *vnm, u32 sw_if_index, vnet_sw_interface_flags_t flags)
typedef CLIB_PACKED(union { struct { fib_node_index_t mfib_entry_index;adj_index_t mcast_adj_index;};u64 as_u64;})
index_t dpoi_index
the index of objects of that type
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
static vtep_table_t vtep_table_create()
const char *const const char *const raw
vl_api_ip_port_and_mask_t dst_port
static fib_protocol_t fib_ip_proto(bool is_ip6)
Convert from boolean is_ip6 to FIB protocol.
enum fib_node_back_walk_rc_t_ fib_node_back_walk_rc_t
Return code from a back walk function.
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
void vnet_int_vxlan_bypass_mode(u32 sw_if_index, u8 is_ip6, u8 is_enable)
const ip46_address_t zero_addr
#include <vnet/feature/feature.h>
static clib_error_t * set_ip_vxlan_bypass(u32 is_ip6, unformat_input_t *input, vlib_cli_command_t *cmd)
nat44_ei_hairpin_src_next_t next_index
ip4_main_t ip4_main
Global ip4 main structure.
static vlib_cli_command_t vxlan_offload_command
(constructor) VLIB_CLI_COMMAND (vxlan_offload_command)
fib_node_index_t fib_entry_index
static uword ip46_address_is_multicast(const ip46_address_t *a)
dpo_type_t dpoi_type
the type
#define ip46_address_initializer
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
void fib_entry_untrack(fib_node_index_t fei, u32 sibling)
Stop tracking a FIB entry.
vlib_node_registration_t vxlan6_input_node
(constructor) VLIB_REGISTER_NODE (vxlan6_input_node)
static clib_error_t * show_vxlan_tunnel_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
Aggregate type for a prefix.
u32 * tunnel_index_by_sw_if_index
adj_index_t adj_mcast_add_or_lock(fib_protocol_t proto, vnet_link_t link_type, u32 sw_if_index)
Mcast Adjacency.
vlib_main_t vlib_node_runtime_t * node
static int ip46_address_cmp(const ip46_address_t *ip46_1, const ip46_address_t *ip46_2)
A FIB graph nodes virtual function table.
void mfib_table_entry_delete_index(fib_node_index_t mfib_entry_index, mfib_source_t source)
Delete a FIB entry.
static u8 ip46_address_is_ip4(const ip46_address_t *ip46)
#define clib_error_return(e, args...)
clib_bihash_16_8_t vxlan4_tunnel_by_key
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
u8 * format_vxlan_encap_trace(u8 *s, va_list *args)
@ VNET_SW_INTERFACE_FLAG_ADMIN_UP
#define pool_put(P, E)
Free an object E in pool P.
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
static bool vxlan_decap_next_is_valid(vxlan_main_t *vxm, u32 is_ip6, u32 decap_next_index)
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
@ VNET_HW_INTERFACE_FLAG_LINK_UP
static void mcast_shared_add(ip46_address_t *dst, fib_node_index_t mfei, adj_index_t ai)
void fib_prefix_from_ip46_addr(const ip46_address_t *addr, fib_prefix_t *pfx)
Host prefix from ip.
static u8 * format_vxlan_name(u8 *s, va_list *args)
vnet_hw_if_output_node_runtime_t * r
static u32 vxlan_eth_flag_change(vnet_main_t *vnm, vnet_hw_interface_t *hi, u32 flags)
int vnet_vxlan_add_del_tunnel(vnet_vxlan_add_del_tunnel_args_t *a, u32 *sw_if_indexp)
void fib_entry_contribute_forwarding(fib_node_index_t fib_entry_index, fib_forward_chain_type_t fct, dpo_id_t *dpo)
uword vtep_addr_ref(vtep_table_t *t, u32 fib_index, ip46_address_t *ip)
vnet_sw_interface_flags_t flags
#define foreach_copy_field
static u32 random_u32(u32 *seed)
32-bit random number generator
@ VNET_FLOOD_CLASS_TUNNEL_NORMAL
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
#define vec_elt(v, i)
Get vector value at index i.
#define hash_set(h, key, value)
@ FIB_FORW_CHAIN_TYPE_UNICAST_IP4
Contribute an object that is to be used to forward IP4 packets.
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 ...
fib_node_index_t fib_entry_track(u32 fib_index, const fib_prefix_t *prefix, fib_node_type_t child_type, index_t child_index, u32 *sibling)
Trackers are used on FIB entries by objects that which to track the changing state of the entry.
#define STRUCT_OFFSET_OF(t, f)
#define pool_foreach(VAR, POOL)
Iterate through pool.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static mcast_shared_t mcast_shared_get(ip46_address_t *ip)
static uword clib_bitmap_get(uword *ai, uword i)
Gets the ith bit value from a bitmap.
static clib_error_t * vxlan_add_del_tunnel_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
enum fib_forward_chain_type_t_ fib_forward_chain_type_t
FIB output chain type.
static vlib_cli_command_t create_vxlan_tunnel_command
(constructor) VLIB_CLI_COMMAND (create_vxlan_tunnel_command)
static vnet_hw_interface_t * vnet_get_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
vnet_main_t * vnet_get_main(void)
format_function_t format_flow_enabled_hw
#define VXLAN_HASH_MEMORY_SIZE
unformat_function_t unformat_vlib_node
static uword get_decap_next_for_node(u32 node_index, u32 ipv4_set)
u8 * format_vxlan_tunnel(u8 *s, va_list *args)
VNET_HW_INTERFACE_CLASS(vxlan_hw_class)
u32 sibling_index
The tunnel is a child of the FIB entry for its destination.
vnet_flood_class_t flood_class
u32 fib_node_index_t
A typedef of a node index.
void vnet_delete_hw_interface(vnet_main_t *vnm, u32 hw_if_index)
static void hash_unset_mem_free(uword **h, const void *key)
#define hash_create_mem(elts, key_bytes, value_bytes)
u32 vnet_vxlan_get_tunnel_index(u32 sw_if_index)
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
vl_api_ip_port_and_mask_t src_port
vlib_node_registration_t vxlan4_input_node
(constructor) VLIB_REGISTER_NODE (vxlan4_input_node)
uword * bm_ip6_bypass_enabled_by_sw_if
vnet_link_t fib_proto_to_link(fib_protocol_t proto)
Convert from a protocol to a link type.
static void hash_set_mem_alloc(uword **h, const void *key, uword v)
int vnet_flow_disable(vnet_main_t *vnm, u32 flow_index, u32 hw_if_index)
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
#define VLIB_CLI_COMMAND(x,...)
fib_node_t node
Linkage into the FIB object graph.
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.
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
u8 udp_is_valid_dst_port(udp_dst_port_t dst_port, u8 is_ip4)
VNET_DEVICE_CLASS(vxlan_device_class, static)
unformat_function_t unformat_vnet_hw_interface
#define ALWAYS_ASSERT(truth)
static uword * clib_bitmap_set(uword *ai, uword i, uword value)
Sets the ith bit of a bitmap to new_value Removes trailing zeros from the bitmap.
void fib_node_register_type(fib_node_type_t type, const fib_node_vft_t *vft)
fib_node_register_type
#define CLIB_CACHE_LINE_BYTES
fib_protocol_t fp_proto
protocol type
@ FIB_NODE_BACK_WALK_CONTINUE
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
clib_bihash_24_8_t vxlan6_tunnel_by_key
vnet_sw_interface_t * sw_interfaces
dpo_proto_t dpoi_proto
the data-path protocol of the type.
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
static void vnet_set_vni_and_flags(vxlan_header_t *h, u32 vni)
uword vtep_addr_unref(vtep_table_t *t, u32 fib_index, ip46_address_t *ip)
vl_api_interface_index_t mcast_sw_if_index
@ DPO_LOAD_BALANCE
load-balancing over a choice of [un]equal cost paths
vlib_node_registration_t vxlan6_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan6_encap_node)
static vlib_cli_command_t set_interface_ip_vxlan_bypass_command
(constructor) VLIB_CLI_COMMAND (set_interface_ip_vxlan_bypass_command)
vlib_node_t * vlib_get_node_by_name(vlib_main_t *vm, u8 *name)
void dpo_copy(dpo_id_t *dst, const dpo_id_t *src)
atomic copy a data-plane object.
static vlib_cli_command_t show_vxlan_tunnel_command
(constructor) VLIB_CLI_COMMAND (show_vxlan_tunnel_command)
vlib_node_registration_t vxlan4_flow_input_node
(constructor) VLIB_REGISTER_NODE (vxlan4_flow_input_node)
#define hash_get_mem(h, key)
static clib_error_t * set_ip6_vxlan_bypass(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
format_function_t format_vnet_sw_if_index_name
unformat_function_t unformat_vnet_sw_interface
description fragment has unexpected format
int vnet_flow_get_range(vnet_main_t *vnm, char *owner, u32 count, u32 *start)
static void mcast_shared_remove(ip46_address_t *dst)
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header,...
format_function_t format_ip46_address
@ FIB_ROUTE_PATH_FLAG_NONE
#define VLIB_INIT_FUNCTION(x)
void ethernet_delete_interface(vnet_main_t *vnm, u32 hw_if_index)
int vnet_vxlan_add_del_rx_flow(u32 hw_if_index, u32 t_index, int is_add)
A representation of a path as described by a route producer.
static clib_error_t * set_ip4_vxlan_bypass(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static load_balance_t * load_balance_get(index_t lbi)
@ FIB_NODE_TYPE_VXLAN_TUNNEL
static uword pool_elts(void *v)
Number of active elements in a pool.
#define VXLAN_HASH_NUM_BUCKETS
static vlib_node_runtime_t * vlib_node_get_runtime(vlib_main_t *vm, u32 node_index)
Get node runtime by node 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)
An node in the FIB graph.
#define hash_unset(h, key)
static fib_node_back_walk_rc_t vxlan_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.
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
@ VNET_SW_INTERFACE_FLAG_HIDDEN
const dpo_id_t * drop_dpo_get(dpo_proto_t proto)
void fib_node_init(fib_node_t *node, fib_node_type_t type)
static vlib_main_t * vlib_get_main(void)
clib_error_t * vnet_hw_interface_set_flags(vnet_main_t *vnm, u32 hw_if_index, vnet_hw_interface_flags_t flags)
static u16 ip4_header_checksum(ip4_header_t *i)
const static fib_node_vft_t vxlan_vft
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
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)
Add n paths to an entry (aka route) in the FIB.
clib_error_t * vxlan_init(vlib_main_t *vm)
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 placeholder) rewrite.
Context passed between object during a back walk.
@ VNET_FLOOD_CLASS_TUNNEL_MASTER
static u8 * format_decap_next(u8 *s, va_list *args)
static void vxlan_rewrite(vxlan_tunnel_t *t, bool is_ip6)
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
static void vxlan_tunnel_last_lock_gone(fib_node_t *node)
Function definition to inform the FIB node that its last lock has gone.
void fib_node_deinit(fib_node_t *node)
static f64 vlib_time_now(vlib_main_t *vm)
@ FIB_FORW_CHAIN_TYPE_UNICAST_IP6
Contribute an object that is to be used to forward IP6 packets.
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.
vlib_node_registration_t vxlan4_encap_node
(constructor) VLIB_REGISTER_NODE (vxlan4_encap_node)
static clib_error_t * vxlan_interface_admin_up_down(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
l2_input_config_t * configs
int vnet_flow_add(vnet_main_t *vnm, vnet_flow_t *flow, u32 *flow_index)
static u8 * format_vxlan_header_with_length(u8 *s, va_list *args)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
static uword unformat_decap_next(unformat_input_t *input, va_list *args)
vl_api_interface_index_t sw_if_index
static void vxlan_tunnel_restack_dpo(vxlan_tunnel_t *t)
uword * bm_ip4_bypass_enabled_by_sw_if
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
static fib_node_t * vxlan_tunnel_fib_node_get(fib_node_index_t index)
Function definition to get a FIB node from its index.
Aggregate type for a prefix.
static clib_error_t * vxlan_offload_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
@ FIB_ROUTE_PATH_LOCAL
A for-us/local path.
vl_api_fib_path_type_t type
u32 vnet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, u32 hw_class_index, u32 hw_instance)
clib_error_t * ethernet_register_interface(vnet_main_t *vnm, u32 dev_class_index, u32 dev_instance, const u8 *address, u32 *hw_if_index_return, ethernet_flag_change_function_t flag_change)
vnet_interface_main_t interface_main
static vxlan_tunnel_t * vxlan_tunnel_from_fib_node(fib_node_t *node)
vl_api_wireguard_peer_flags_t flags