Add an option to dump details about specific LISP EID in API/CLI
[vpp.git] / vnet / vnet / lisp-cp / lisp_types.c
index f0debc6..62900ec 100644 (file)
@@ -150,6 +150,22 @@ unformat_ip_prefix (unformat_input_t * input, va_list * args)
                    &ip_prefix_len(a));
 }
 
+uword
+unformat_mac_address (unformat_input_t * input, va_list * args)
+{
+  u8 * a = va_arg(*args, u8 *);
+  return unformat (input, "%x:%x:%x:%x:%x:%x", &a[0], &a[1], &a[2], &a[3],
+                   &a[4], &a[5]);
+}
+
+u8 *
+format_mac_address (u8 * s, va_list * args)
+{
+  u8 * a = va_arg (*args, u8 *);
+  return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
+                 a[0], a[1], a[2], a[3], a[4], a[5]);
+}
+
 u8 *
 format_gid_address (u8 * s, va_list * args)
 {
@@ -160,6 +176,13 @@ format_gid_address (u8 * s, va_list * args)
     case GID_ADDR_IP_PREFIX:
       return format (s, "[%d] %U", gid_address_vni(a), format_ip_prefix,
                      &gid_address_ippref(a));
+    case GID_ADDR_SRC_DST:
+      return format (s, "[%d] %U|%U", gid_address_vni(a),
+                     format_ip_prefix, &gid_address_sd_source_pref(a),
+                     format_ip_prefix, &gid_address_sd_dest_pref(a));
+    case GID_ADDR_MAC:
+      return format (s, "[%d] %U", gid_address_vni(a), format_mac_address,
+                     &gid_address_mac(a));
     default:
       clib_warning("Can't format gid type %d", type);
       return 0;
@@ -169,11 +192,31 @@ format_gid_address (u8 * s, va_list * args)
 uword
 unformat_gid_address (unformat_input_t * input, va_list * args)
 {
+  u32 vni;
   gid_address_t * a = va_arg(*args, gid_address_t *);
-  if (unformat (input, "%U", unformat_ip_prefix, &gid_address_ippref(a)))
-    gid_address_type(a) = GID_ADDR_IP_PREFIX;
-  else
-    return 0;
+  u8 mac[6] = {0};
+  ip_prefix_t ippref;
+
+  memset (&ippref, 0, sizeof (ippref));
+  memset (a, 0, sizeof (a[0]));
+
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (input, "%U", unformat_ip_prefix, &ippref))
+        {
+          clib_memcpy (&gid_address_ippref(a), &ippref, sizeof (ippref));
+          gid_address_type(a) = GID_ADDR_IP_PREFIX;
+        }
+      else if (unformat (input, "%U", unformat_mac_address, mac))
+        {
+          clib_memcpy (gid_address_mac(a), mac, sizeof (mac));
+          gid_address_type(a) = GID_ADDR_MAC;
+        }
+      else if (unformat (input, "[%d]", &vni))
+        gid_address_vni(a) = vni;
+      else
+        return 0;
+    }
   return 1;
 }
 
@@ -759,6 +802,8 @@ gid_address_parse (u8 * offset, gid_address_t *a)
   if (!a)
     return 0;
 
+  /* NOTE: since gid_adress_parse may be called by vni_parse, we can't 0
+   * the gid address here */
   afi = clib_net_to_host_u16 (*((u16 *) offset));
 
   switch (afi)