gtpu: encap-vrf-id in show gtpu tunnels command
[vpp.git] / src / plugins / gtpu / gtpu.c
index 905ca5e..7aa374f 100644 (file)
@@ -87,12 +87,19 @@ format_gtpu_tunnel (u8 * s, va_list * args)
 {
   gtpu_tunnel_t *t = va_arg (*args, gtpu_tunnel_t *);
   gtpu_main_t *ngm = &gtpu_main;
+  ip4_main_t *im4 = &ip4_main;
+  ip6_main_t *im6 = &ip6_main;
+  u8 is_ipv6 = !ip46_address_is_ip4 (&t->dst);
 
-  s = format (s, "[%d] src %U dst %U teid %d fib-idx %d sw-if-idx %d ",
+  u32 encap_vrf_id =
+    is_ipv6 ? im6->fibs[t->encap_fib_index].ft_table_id :
+    im4->fibs[t->encap_fib_index].ft_table_id;
+
+  s = format (s, "[%d] src %U dst %U teid %d encap-vrf-id %d sw-if-idx %d ",
              t - ngm->tunnels,
              format_ip46_address, &t->src, IP46_TYPE_ANY,
              format_ip46_address, &t->dst, IP46_TYPE_ANY,
-             t->teid,  t->encap_fib_index, t->sw_if_index);
+             t->teid,  encap_vrf_id, t->sw_if_index);
 
   s = format (s, "encap-dpo-idx %d ", t->next_dpo.dpoi_index);
   s = format (s, "decap-next-%U ", format_decap_next, t->decap_next_index);
@@ -298,35 +305,6 @@ gtpu_decap_next_is_valid (gtpu_main_t * gtm, u32 is_ip6, u32 decap_next_index)
   return decap_next_index < r->n_next_nodes;
 }
 
-static uword
-vtep_addr_ref (ip46_address_t * ip)
-{
-  uword *vtep = ip46_address_is_ip4 (ip) ?
-    hash_get (gtpu_main.vtep4, ip->ip4.as_u32) :
-    hash_get_mem (gtpu_main.vtep6, &ip->ip6);
-  if (vtep)
-    return ++(*vtep);
-  ip46_address_is_ip4 (ip) ?
-    hash_set (gtpu_main.vtep4, ip->ip4.as_u32, 1) :
-    hash_set_mem_alloc (&gtpu_main.vtep6, &ip->ip6, 1);
-  return 1;
-}
-
-static uword
-vtep_addr_unref (ip46_address_t * ip)
-{
-  uword *vtep = ip46_address_is_ip4 (ip) ?
-    hash_get (gtpu_main.vtep4, ip->ip4.as_u32) :
-    hash_get_mem (gtpu_main.vtep6, &ip->ip6);
-  ASSERT (vtep);
-  if (--(*vtep) != 0)
-    return *vtep;
-  ip46_address_is_ip4 (ip) ?
-    hash_unset (gtpu_main.vtep4, ip->ip4.as_u32) :
-    hash_unset_mem_free (&gtpu_main.vtep6, &ip->ip6);
-  return 0;
-}
-
 typedef CLIB_PACKED (union
                     {
                     struct
@@ -341,7 +319,7 @@ mcast_shared_get (ip46_address_t * ip)
 {
   ASSERT (ip46_address_is_multicast (ip));
   uword *p = hash_get_mem (gtpu_main.mcast_shared, ip);
-  ASSERT (p);
+  ALWAYS_ASSERT (p);
   return (mcast_shared_t)
   {
   .as_u64 = *p};
@@ -498,7 +476,7 @@ int vnet_gtpu_add_del_tunnel
           * when the forwarding for the entry updates, and the tunnel can
           * re-stack accordingly
           */
-         vtep_addr_ref (&t->src);
+         vtep_addr_ref (&gtm->vtep_table, t->encap_fib_index, &t->src);
          t->fib_entry_index = fib_entry_track (t->encap_fib_index,
                                                &tun_dst_pfx,
                                                gtm->fib_node_type,
@@ -515,7 +493,8 @@ int vnet_gtpu_add_del_tunnel
           */
          fib_protocol_t fp = fib_ip_proto (is_ip6);
 
-         if (vtep_addr_ref (&t->dst) == 1)
+         if (vtep_addr_ref (&gtm->vtep_table,
+                            t->encap_fib_index, &t->dst) == 1)
            {
              fib_node_index_t mfei;
              adj_index_t ai;
@@ -608,10 +587,11 @@ int vnet_gtpu_add_del_tunnel
          if (t->flow_index != ~0)
            vnet_flow_del (vnm, t->flow_index);
 
-         vtep_addr_unref (&t->src);
+         vtep_addr_unref (&gtm->vtep_table, t->encap_fib_index, &t->src);
          fib_entry_untrack (t->fib_entry_index, t->sibling_index);
        }
-      else if (vtep_addr_unref (&t->dst) == 0)
+      else if (vtep_addr_unref (&gtm->vtep_table,
+                               t->encap_fib_index, &t->dst) == 0)
        {
          mcast_shared_remove (&t->dst);
        }
@@ -1243,7 +1223,7 @@ gtpu_init (vlib_main_t * vm)
   gtm->gtpu6_tunnel_by_key = hash_create_mem (0,
                                              sizeof (gtpu6_tunnel_key_t),
                                              sizeof (uword));
-  gtm->vtep6 = hash_create_mem (0, sizeof (ip6_address_t), sizeof (uword));
+  gtm->vtep_table = vtep_table_create ();
   gtm->mcast_shared = hash_create_mem (0,
                                       sizeof (ip46_address_t),
                                       sizeof (mcast_shared_t));