X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fgtpu%2Fgtpu.c;h=8a1610c97e77a3337541f92cfdfdf36872a94229;hb=55636cb62;hp=4f58f1176cf568e078ae2c96677c8b1f40099298;hpb=bdc0e6b7204ea0211d4f7881497e4306586fb9ef;p=vpp.git diff --git a/src/plugins/gtpu/gtpu.c b/src/plugins/gtpu/gtpu.c index 4f58f1176cf..8a1610c97e7 100644 --- a/src/plugins/gtpu/gtpu.c +++ b/src/plugins/gtpu/gtpu.c @@ -48,6 +48,18 @@ VNET_FEATURE_INIT (ip6_gtpu_bypass, static) = { }; /* *INDENT-on* */ +u8 * format_gtpu_encap_trace (u8 * s, va_list * args) +{ + CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); + CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); + gtpu_encap_trace_t * t + = va_arg (*args, gtpu_encap_trace_t *); + + s = format (s, "GTPU encap to gtpu_tunnel%d teid %d", + t->tunnel_index, t->teid); + return s; +} + static u8 * format_decap_next (u8 * s, va_list * args) { @@ -367,7 +379,7 @@ int vnet_gtpu_add_del_tunnel u32 sw_if_index = ~0; gtpu4_tunnel_key_t key4; gtpu6_tunnel_key_t key6; - u32 is_ip6 = a->is_ip6; + bool is_ip6 = !ip46_address_is_ip4 (&a->dst); if (!is_ip6) { @@ -397,7 +409,7 @@ int vnet_gtpu_add_del_tunnel return VNET_API_ERROR_INVALID_DECAP_NEXT; pool_get_aligned (gtm->tunnels, t, CLIB_CACHE_LINE_BYTES); - memset (t, 0, sizeof (*t)); + clib_memset (t, 0, sizeof (*t)); /* copy from arg structure */ #define _(x) t->x = a->x; @@ -508,8 +520,9 @@ int vnet_gtpu_add_del_tunnel .frp_addr = zero_addr, .frp_sw_if_index = 0xffffffff, .frp_fib_index = ~0, - .frp_weight = 0, + .frp_weight = 1, .frp_flags = FIB_ROUTE_PATH_LOCAL, + .frp_mitf_flags = MFIB_ITF_FLAG_FORWARD, }; const mfib_prefix_t mpfx = { .fp_proto = fp, @@ -523,17 +536,14 @@ int vnet_gtpu_add_del_tunnel * - the accepting interface is that from the API */ mfib_table_entry_path_update (t->encap_fib_index, - &mpfx, - MFIB_SOURCE_GTPU, - &path, MFIB_ITF_FLAG_FORWARD); + &mpfx, MFIB_SOURCE_GTPU, &path); path.frp_sw_if_index = a->mcast_sw_if_index; path.frp_flags = FIB_ROUTE_PATH_FLAG_NONE; + path.frp_mitf_flags = MFIB_ITF_FLAG_ACCEPT; mfei = mfib_table_entry_path_update (t->encap_fib_index, &mpfx, - MFIB_SOURCE_GTPU, - &path, - MFIB_ITF_FLAG_ACCEPT); + MFIB_SOURCE_GTPU, &path); /* * Create the mcast adjacency to send traffic to the group @@ -578,8 +588,8 @@ int vnet_gtpu_add_del_tunnel si->flags |= VNET_SW_INTERFACE_FLAG_HIDDEN; /* make sure tunnel is removed from l2 bd or xconnect */ - set_int_l2_mode (gtm->vlib_main, vnm, MODE_L3, t->sw_if_index, 0, 0, 0, - 0); + set_int_l2_mode (gtm->vlib_main, vnm, MODE_L3, t->sw_if_index, 0, + L2_BD_PORT_TYPE_NORMAL, 0, 0); vec_add1 (gtm->free_gtpu_tunnel_hw_if_indices, t->hw_if_index); gtm->tunnel_index_by_sw_if_index[t->sw_if_index] = ~0; @@ -608,6 +618,17 @@ int vnet_gtpu_add_del_tunnel if (sw_if_indexp) *sw_if_indexp = sw_if_index; + if (a->is_add) + { + /* register udp ports */ + if (!is_ip6 && !udp_is_valid_dst_port (UDP_DST_PORT_GTPU, 1)) + udp_register_dst_port (gtm->vlib_main, UDP_DST_PORT_GTPU, + gtpu4_input_node.index, /* is_ip4 */ 1); + if (is_ip6 && !udp_is_valid_dst_port (UDP_DST_PORT_GTPU6, 0)) + udp_register_dst_port (gtm->vlib_main, UDP_DST_PORT_GTPU6, + gtpu6_input_node.index, /* is_ip4 */ 0); + } + return 0; } @@ -672,8 +693,8 @@ gtpu_add_del_tunnel_command_fn (vlib_main_t * vm, clib_error_t *error = NULL; /* Cant "universally zero init" (={0}) due to GCC bug 53119 */ - memset (&src, 0, sizeof src); - memset (&dst, 0, sizeof dst); + clib_memset (&src, 0, sizeof src); + clib_memset (&dst, 0, sizeof dst); /* Get a line of input. */ if (!unformat_user (input, unformat_line_input, line_input)) @@ -796,10 +817,9 @@ gtpu_add_del_tunnel_command_fn (vlib_main_t * vm, goto done; } - memset (a, 0, sizeof (*a)); + clib_memset (a, 0, sizeof (*a)); a->is_add = is_add; - a->is_ip6 = ipv6_set; #define _(x) a->x = x; foreach_copy_field; @@ -1090,11 +1110,6 @@ gtpu_init (vlib_main_t * vm) sizeof (ip46_address_t), sizeof (mcast_shared_t)); - udp_register_dst_port (vm, UDP_DST_PORT_GTPU, - gtpu4_input_node.index, /* is_ip4 */ 1); - udp_register_dst_port (vm, UDP_DST_PORT_GTPU6, - gtpu6_input_node.index, /* is_ip4 */ 0); - gtm->fib_node_type = fib_node_register_new_type (>pu_vft); return 0; @@ -1105,7 +1120,7 @@ VLIB_INIT_FUNCTION (gtpu_init); /* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, - .description = "GTPv1-U", + .description = "GPRS Tunnelling Protocol, User Data (GTPv1-U)", }; /* *INDENT-ON* */