gtpu: use explicit types in api
[vpp.git] / src / plugins / gtpu / gtpu.c
index 4f58f11..8a1610c 100644 (file)
@@ -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 (&gtpu_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* */