|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
39 #define UDP_NO_NODE_SET ((u16) ~0)
41 #ifndef CLIB_MARCH_VARIANT
49 s =
format (s,
"UDP: src-port %d dst-port %d%s",
52 t->
bound ?
"" :
" (no listener)");
65 u16 *next_by_dst_port = (is_ip4 ?
83 u32 i0, i1, dst_port0, dst_port1;
84 u32 advance0, advance1;
85 u32 error0, next0, error1, next1;
127 error0 = UDP_ERROR_LENGTH_ERROR;
134 error0 = UDP_ERROR_NONE;
139 error0 = UDP_ERROR_LENGTH_ERROR;
146 error1 = UDP_ERROR_LENGTH_ERROR;
153 error1 = UDP_ERROR_NONE;
158 error1 = UDP_ERROR_LENGTH_ERROR;
164 dst_port0 = (error0 == 0) ? h0->
dst_port : 0;
165 dst_port1 = (error1 == 0) ? h1->dst_port : 0;
168 next0 = (error0 == 0) ?
vec_elt (next_by_dst_port, i0) : next0;
169 next1 = (error1 == 0) ?
vec_elt (next_by_dst_port, i1) : next1;
180 b0->
error =
node->errors[UDP_ERROR_PUNT];
186 ICMP4_destination_unreachable,
187 ICMP4_destination_unreachable_port_unreachable,
189 b0->
error =
node->errors[UDP_ERROR_NO_LISTENER];
195 ICMP6_destination_unreachable,
196 ICMP6_destination_unreachable_port_unreachable,
198 b0->
error =
node->errors[UDP_ERROR_NO_LISTENER];
204 b0->
error =
node->errors[UDP_ERROR_NONE];
218 b1->
error =
node->errors[UDP_ERROR_PUNT];
224 ICMP4_destination_unreachable,
225 ICMP4_destination_unreachable_port_unreachable,
227 b1->
error =
node->errors[UDP_ERROR_NO_LISTENER];
233 ICMP6_destination_unreachable,
234 ICMP6_destination_unreachable_port_unreachable,
236 b1->
error =
node->errors[UDP_ERROR_NO_LISTENER];
242 b1->
error =
node->errors[UDP_ERROR_NONE];
251 if (b0->
error !=
node->errors[UDP_ERROR_LENGTH_ERROR])
262 if (b1->
error !=
node->errors[UDP_ERROR_LENGTH_ERROR])
264 tr->
src_port = h1 ? h1->src_port : 0;
265 tr->
dst_port = h1 ? h1->dst_port : 0;
271 to_next, n_left_to_next,
272 bi0, bi1, next0, next1);
300 b0->
error =
node->errors[UDP_ERROR_LENGTH_ERROR];
313 next0 =
vec_elt (next_by_dst_port, i0);
324 b0->
error =
node->errors[UDP_ERROR_PUNT];
330 ICMP4_destination_unreachable,
331 ICMP4_destination_unreachable_port_unreachable,
333 b0->
error =
node->errors[UDP_ERROR_NO_LISTENER];
339 ICMP6_destination_unreachable,
340 ICMP6_destination_unreachable_port_unreachable,
342 b0->
error =
node->errors[UDP_ERROR_NO_LISTENER];
348 b0->
error =
node->errors[UDP_ERROR_NONE];
355 b0->
error =
node->errors[UDP_ERROR_LENGTH_ERROR];
364 if (b0->
error !=
node->errors[UDP_ERROR_LENGTH_ERROR])
373 to_next, n_left_to_next,
383 #define udp_error(n,s) s,
404 .name =
"ip4-udp-lookup",
406 .vector_size =
sizeof (
u32),
426 .name =
"ip6-udp-lookup",
428 .vector_size =
sizeof (
u32),
446 #ifndef CLIB_MARCH_VARIANT
449 char *dst_port_name,
u8 is_ip4)
457 pi->
name = dst_port_name;
564 u8 **result = va_arg (*args,
u8 **);
566 __attribute__ ((unused))
int old_length;
573 old_length =
vec_len (*result);
613 for (
i = 0;
i < 2;
i++)
633 #define _(n,s) udp_add_dst_port (um, UDP_DST_PORT_##s, #s, 1 );
636 #define _(n,s) udp_add_dst_port (um, UDP_DST_PORT_##s, #s, 0 );
vl_api_ip_port_and_mask_t dst_port
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
void icmp6_error_set_vnet_buffer(vlib_buffer_t *b, u8 type, u8 code, u32 data)
static uword vlib_node_add_next(vlib_main_t *vm, uword node, uword next_node)
nat44_ei_hairpin_src_next_t next_index
uword unformat_udp_header(unformat_input_t *input, va_list *args)
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
vlib_main_t vlib_node_runtime_t * node
#define foreach_udp4_dst_port
static clib_error_t * udp_init(vlib_main_t *vm)
#define vlib_call_init_function(vm, x)
static uword udp46_local_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_ip4)
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
#define hash_create_string(elts, value_bytes)
static void udp_setup_node(vlib_main_t *vm, u32 node_index)
vlib_main_t vlib_node_runtime_t vlib_frame_t * from_frame
void ip4_register_protocol(u32 protocol, u32 node_index)
u8 * format_udp_rx_trace(u8 *s, va_list *args)
#define clib_error_report(e)
unformat_function_t * unformat_buffer
#define SPARSE_VEC_INVALID_INDEX
#define hash_create(elts, value_bytes)
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
void udp_punt_unknown(vlib_main_t *vm, u8 is_ip4, u8 is_add)
uword * dst_port_info_by_name[N_UDP_AF]
#define vec_elt(v, i)
Get vector value at index i.
#define hash_set(h, key, value)
udp_dst_port_info_t * dst_port_infos[N_UDP_AF]
#define CLIB_PREFETCH(addr, size, type)
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
format_function_t * format_buffer
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
vlib_error_t error
Error code for buffers to be enqueued to error handler.
#define sparse_vec_validate(v, i)
#define VLIB_NODE_FN(node)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
unformat_function_t * unformat_edit
clib_error_t * udp_local_init(vlib_main_t *vm)
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
vlib_node_registration_t udp4_local_node
(constructor) VLIB_REGISTER_NODE (udp4_local_node)
static pg_node_t * pg_get_node(uword node_index)
static char * udp_error_strings[]
static uword sparse_vec_index(void *v, uword sparse_index)
#define hash_set_mem(h, key, value)
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
void udp_register_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u32 node_index, u8 is_ip4)
vl_api_ip_port_and_mask_t src_port
sll srl srl sll sra u16x4 i
void udp_unregister_dst_port(vlib_main_t *vm, udp_dst_port_t dst_port, u8 is_ip4)
u8 udp_is_valid_dst_port(udp_dst_port_t dst_port, u8 is_ip4)
struct _vlib_node_registration vlib_node_registration_t
u16 current_length
Nbytes between current data and the end of this buffer.
static_always_inline void icmp4_error_set_vnet_buffer(vlib_buffer_t *b, u8 type, u8 code, u32 data)
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
static void sparse_vec_index2(void *v, u32 si0, u32 si1, u32 *i0_return, u32 *i1_return)
description fragment has unexpected format
vlib_put_next_frame(vm, node, next_index, 0)
#define VLIB_INIT_FUNCTION(x)
uword * dst_port_info_by_dst_port[N_UDP_AF]
static udp_dst_port_info_t * udp_get_dst_port_info(udp_main_t *um, udp_dst_port_t dst_port, u8 is_ip4)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
static int ip4_header_bytes(const ip4_header_t *i)
#define vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next, n_left_to_next, bi0, bi1, next0, next1)
Finish enqueueing two buffers forward in the graph.
void udp_add_dst_port(udp_main_t *um, udp_dst_port_t dst_port, char *dst_port_name, u8 is_ip4)
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
vlib_node_registration_t udp6_local_node
(constructor) VLIB_REGISTER_NODE (udp6_local_node)
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,...
static void * sparse_vec_new(uword elt_bytes, uword sparse_index_bits)
VLIB buffer representation.
#define VLIB_REGISTER_NODE(x,...)