X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fudp%2Fudp_local.c;h=a6a4867a86e4194cae72204f00466870018eb69a;hb=c5df8c71c;hp=ce9bb029788d003287d25a54180796f8b31aa965;hpb=3cbc04bea02fc60471dfe0c671ede3ca42c118c3;p=vpp.git diff --git a/src/vnet/udp/udp_local.c b/src/vnet/udp/udp_local.c index ce9bb029788..a6a4867a86e 100644 --- a/src/vnet/udp/udp_local.c +++ b/src/vnet/udp/udp_local.c @@ -1,7 +1,7 @@ /* * node.c: udp packet processing * - * Copyright (c) 2013 Cisco and/or its affiliates. + * Copyright (c) 2013-2019 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -21,11 +21,11 @@ #include #include -udp_main_t udp_main; - #define foreach_udp_local_next \ - _ (PUNT, "error-punt") \ - _ (DROP, "error-drop") \ + _ (PUNT4, "ip4-punt") \ + _ (PUNT6, "ip6-punt") \ + _ (DROP4, "ip4-drop") \ + _ (DROP6, "ip6-drop") \ _ (ICMP4_ERROR, "ip4-icmp-error") \ _ (ICMP6_ERROR, "ip6-icmp-error") @@ -37,6 +37,9 @@ typedef enum UDP_LOCAL_N_NEXT, } udp_local_next_t; +#define udp_local_next_drop(is_ip4) ((is_ip4) ? UDP_LOCAL_NEXT_DROP4 : UDP_LOCAL_NEXT_DROP6) +#define udp_local_next_punt(is_ip4) ((is_ip4) ? UDP_LOCAL_NEXT_PUNT4 : UDP_LOCAL_NEXT_PUNT6) + typedef struct { u16 src_port; @@ -44,6 +47,7 @@ typedef struct u8 bound; } udp_local_rx_trace_t; +#ifndef CLIB_MARCH_VARIANT u8 * format_udp_rx_trace (u8 * s, va_list * args) { @@ -57,9 +61,7 @@ format_udp_rx_trace (u8 * s, va_list * args) t->bound ? "" : " (no listener)"); return s; } - -vlib_node_registration_t udp4_local_node; -vlib_node_registration_t udp6_local_node; +#endif /* CLIB_MARCH_VARIANT */ always_inline uword udp46_local_inline (vlib_main_t * vm, @@ -132,7 +134,7 @@ udp46_local_inline (vlib_main_t * vm, if (PREDICT_FALSE (b0->current_length < advance0 + sizeof (*h0))) { error0 = UDP_ERROR_LENGTH_ERROR; - next0 = UDP_LOCAL_NEXT_DROP; + next0 = udp_local_next_drop (is_ip4); } else { @@ -143,14 +145,14 @@ udp46_local_inline (vlib_main_t * vm, vlib_buffer_length_in_chain (vm, b0))) { error0 = UDP_ERROR_LENGTH_ERROR; - next0 = UDP_LOCAL_NEXT_DROP; + next0 = udp_local_next_drop (is_ip4); } } if (PREDICT_FALSE (b1->current_length < advance1 + sizeof (*h1))) { error1 = UDP_ERROR_LENGTH_ERROR; - next1 = UDP_LOCAL_NEXT_DROP; + next1 = udp_local_next_drop (is_ip4); } else { @@ -161,7 +163,7 @@ udp46_local_inline (vlib_main_t * vm, vlib_buffer_length_in_chain (vm, b1))) { error1 = UDP_ERROR_LENGTH_ERROR; - next1 = UDP_LOCAL_NEXT_DROP; + next1 = udp_local_next_drop (is_ip4); } } @@ -187,7 +189,7 @@ udp46_local_inline (vlib_main_t * vm, if (PREDICT_FALSE (punt_unknown)) { b0->error = node->errors[UDP_ERROR_PUNT]; - next0 = UDP_LOCAL_NEXT_PUNT; + next0 = udp_local_next_punt (is_ip4); } else if (is_ip4) { @@ -224,7 +226,7 @@ udp46_local_inline (vlib_main_t * vm, if (PREDICT_FALSE (punt_unknown)) { b1->error = node->errors[UDP_ERROR_PUNT]; - next1 = UDP_LOCAL_NEXT_PUNT; + next1 = udp_local_next_punt (is_ip4); } else if (is_ip4) { @@ -308,7 +310,7 @@ udp46_local_inline (vlib_main_t * vm, if (PREDICT_FALSE (b0->current_length < advance0 + sizeof (*h0))) { b0->error = node->errors[UDP_ERROR_LENGTH_ERROR]; - next0 = UDP_LOCAL_NEXT_DROP; + next0 = udp_local_next_drop (is_ip4); goto trace_x1; } @@ -333,7 +335,7 @@ udp46_local_inline (vlib_main_t * vm, if (PREDICT_FALSE (punt_unknown)) { b0->error = node->errors[UDP_ERROR_PUNT]; - next0 = UDP_LOCAL_NEXT_PUNT; + next0 = udp_local_next_punt (is_ip4); } else if (is_ip4) { @@ -364,7 +366,7 @@ udp46_local_inline (vlib_main_t * vm, else { b0->error = node->errors[UDP_ERROR_LENGTH_ERROR]; - next0 = UDP_LOCAL_NEXT_DROP; + next0 = udp_local_next_drop (is_ip4); } trace_x1: @@ -399,23 +401,22 @@ static char *udp_error_strings[] = { #undef udp_error }; -static uword -udp4_local (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * from_frame) +VLIB_NODE_FN (udp4_local_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * from_frame) { return udp46_local_inline (vm, node, from_frame, 1 /* is_ip4 */ ); } -static uword -udp6_local (vlib_main_t * vm, - vlib_node_runtime_t * node, vlib_frame_t * from_frame) +VLIB_NODE_FN (udp6_local_node) (vlib_main_t * vm, + vlib_node_runtime_t * node, + vlib_frame_t * from_frame) { return udp46_local_inline (vm, node, from_frame, 0 /* is_ip4 */ ); } /* *INDENT-OFF* */ VLIB_REGISTER_NODE (udp4_local_node) = { - .function = udp4_local, .name = "ip4-udp-lookup", /* Takes a vector of packets. */ .vector_size = sizeof (u32), @@ -436,11 +437,8 @@ VLIB_REGISTER_NODE (udp4_local_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (udp4_local_node, udp4_local); - /* *INDENT-OFF* */ VLIB_REGISTER_NODE (udp6_local_node) = { - .function = udp6_local, .name = "ip6-udp-lookup", /* Takes a vector of packets. */ .vector_size = sizeof (u32), @@ -461,8 +459,7 @@ VLIB_REGISTER_NODE (udp6_local_node) = { }; /* *INDENT-ON* */ -VLIB_NODE_FUNCTION_MULTIARCH (udp6_local_node, udp6_local); - +#ifndef CLIB_MARCH_VARIANT static void add_dst_port (udp_main_t * um, udp_dst_port_t dst_port, char *dst_port_name, u8 is_ip4) @@ -544,6 +541,22 @@ udp_unregister_dst_port (vlib_main_t * vm, udp_dst_port_t dst_port, u8 is_ip4) n[0] = SPARSE_VEC_INVALID_INDEX; } +bool +udp_is_valid_dst_port (udp_dst_port_t dst_port, u8 is_ip4) +{ + udp_main_t *um = &udp_main; + u16 *n; + + if (is_ip4) + n = sparse_vec_validate (um->next_by_dst_port4, + clib_host_to_net_u16 (dst_port)); + else + n = sparse_vec_validate (um->next_by_dst_port6, + clib_host_to_net_u16 (dst_port)); + + return (n[0] != SPARSE_VEC_INVALID_INDEX); +} + void udp_punt_unknown (vlib_main_t * vm, u8 is_ip4, u8 is_add) { @@ -578,7 +591,7 @@ unformat_udp_header (unformat_input_t * input, va_list * args) udp = p; } - memset (udp, 0, sizeof (udp[0])); + clib_memset (udp, 0, sizeof (udp[0])); if (unformat (input, "src-port %d dst-port %d", &src_port, &dst_port)) { udp->src_port = clib_host_to_net_u16 (src_port); @@ -645,6 +658,7 @@ udp_local_init (vlib_main_t * vm) } VLIB_INIT_FUNCTION (udp_local_init); +#endif /* CLIB_MARCH_VARIANT */ /* * fd.io coding-style-patch-verification: ON