Fix vnet unit tests
[vpp.git] / src / vnet / lisp-cp / lisp_types.c
index 4a3d05b..31a8008 100644 (file)
@@ -31,16 +31,16 @@ typedef int (*cmp_fct) (void *, void *);
 
 size_to_write_fct size_to_write_fcts[GID_ADDR_TYPES] =
   { ip_prefix_size_to_write, lcaf_size_to_write, mac_size_to_write,
-  sd_size_to_write
+  sd_size_to_write, nsh_size_to_write
 };
 serdes_fct write_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_write, lcaf_write, mac_write, sd_write };
+  { ip_prefix_write, lcaf_write, mac_write, sd_write, nsh_write };
 cast_fct cast_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_cast, lcaf_cast, mac_cast, sd_cast };
+  { ip_prefix_cast, lcaf_cast, mac_cast, sd_cast, nsh_cast };
 addr_len_fct addr_len_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_length, lcaf_length, mac_length, sd_length };
+  { ip_prefix_length, lcaf_length, mac_length, sd_length, nsh_length };
 copy_fct copy_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_copy, lcaf_copy, mac_copy, sd_copy };
+  { ip_prefix_copy, lcaf_copy, mac_copy, sd_copy, nsh_copy };
 
 #define foreach_lcaf_type \
   _(1, no_addr)      \
@@ -573,6 +573,44 @@ ip_address_parse (void *offset, u16 iana_afi, ip_address_t * dst)
   return (sizeof (u16) + size);
 }
 
+void
+gid_to_dp_address (gid_address_t * g, dp_address_t * d)
+{
+  switch (gid_address_type (g))
+    {
+    case GID_ADDR_SRC_DST:
+      switch (gid_address_sd_dst_type (g))
+       {
+       case FID_ADDR_IP_PREF:
+         ip_prefix_copy (&d->ippref, &gid_address_sd_dst_ippref (g));
+         d->type = FID_ADDR_IP_PREF;
+         break;
+       case FID_ADDR_MAC:
+         mac_copy (&d->mac, &gid_address_sd_dst_mac (g));
+         d->type = FID_ADDR_MAC;
+         break;
+       default:
+         clib_warning ("Source/Dest address type %d not supported!",
+                       gid_address_sd_dst_type (g));
+         break;
+       }
+      break;
+    case GID_ADDR_IP_PREFIX:
+      ip_prefix_copy (&d->ippref, &gid_address_ippref (g));
+      d->type = FID_ADDR_IP_PREF;
+      break;
+    case GID_ADDR_MAC:
+      mac_copy (&d->mac, &gid_address_mac (g));
+      d->type = FID_ADDR_MAC;
+      break;
+    case GID_ADDR_NSH:
+    default:
+      d->nsh = gid_address_nsh (g).spi << 8 | gid_address_nsh (g).si;
+      d->type = FID_ADDR_NSH;
+      break;
+    }
+}
+
 u32
 lcaf_hdr_parse (void *offset, lcaf_t * lcaf)
 {
@@ -619,12 +657,19 @@ fid_addr_parse (u8 * p, fid_address_t * a)
       return ip_address_parse (p, afi, ip_addr);
 
     case FID_ADDR_NSH:
-      ASSERT (0);
       break;
     }
   return ~0;
 }
 
+#define INC(dst, exp)   \
+do {                    \
+  u16 _sum = (exp);     \
+  if ((u16)~0 == _sum)  \
+    return ~0;          \
+  dst += _sum;          \
+} while (0);
+
 u16
 sd_parse (u8 * p, void *a)
 {
@@ -639,8 +684,8 @@ sd_parse (u8 * p, void *a)
   sd_hdr = (lcaf_src_dst_hdr_t *) (p + size);
   size += sizeof (sd_hdr[0]);
 
-  size += fid_addr_parse (p + size, src);
-  size += fid_addr_parse (p + size, dst);
+  INC (size, fid_addr_parse (p + size, src));
+  INC (size, fid_addr_parse (p + size, dst));
 
   if (fid_addr_type (src) == FID_ADDR_IP_PREF)
     {
@@ -666,7 +711,7 @@ try_parse_src_dst_lcaf (u8 * p, gid_address_t * a)
   if (LCAF_SOURCE_DEST != lcaf_type (&lcaf))
     return ~0;
 
-  size += sd_parse (p + size, a);
+  INC (size, sd_parse (p + size, a));
   return size;
 }
 
@@ -686,13 +731,10 @@ vni_parse (u8 * p, void *a)
   u16 afi = clib_net_to_host_u16 (*((u16 *) (p + size)));
   if (LISP_AFI_LCAF == afi)
     {
-      u16 len = try_parse_src_dst_lcaf (p + size, g);
-      if ((u16) ~ 0 == len)
-       return ~0;
-      size += len;
+      INC (size, try_parse_src_dst_lcaf (p + size, g));
     }
   else
-    size += gid_address_parse (p + size, g);
+    INC (size, gid_address_parse (p + size, g));
 
   return size;
 }
@@ -719,7 +761,7 @@ lcaf_parse (void *offset, gid_address_t * addr)
       clib_warning ("Unsupported LCAF type: %u", type);
       return ~0;
     }
-  size += (*lcaf_parse_fcts[type]) (offset + size, lcaf);
+  INC (size, (*lcaf_parse_fcts[type]) (offset + size, lcaf));
   return sizeof (u16) + size;
 }
 
@@ -951,15 +993,15 @@ mac_copy (void *dst, void *src)
 }
 
 void
-nsh_copy (void *dst, void *src)
+sd_copy (void *dst, void *src)
 {
-  clib_memcpy (dst, src, sizeof (nsh_t));
+  clib_memcpy (dst, src, sizeof (source_dest_t));
 }
 
 void
-sd_copy (void *dst, void *src)
+nsh_copy (void *dst, void *src)
 {
-  clib_memcpy (dst, src, sizeof (source_dest_t));
+  clib_memcpy (dst, src, sizeof (nsh_t));
 }
 
 int
@@ -1031,6 +1073,12 @@ sd_length (void *a)
   return 0;
 }
 
+u8
+nsh_length (void *a)
+{
+  return 0;
+}
+
 void *
 lcaf_cast (gid_address_t * a)
 {
@@ -1049,6 +1097,12 @@ sd_cast (gid_address_t * a)
   return &gid_address_sd (a);
 }
 
+void *
+nsh_cast (gid_address_t * a)
+{
+  return &gid_address_nsh (a);
+}
+
 u8
 no_addr_length (void *a)
 {
@@ -1167,6 +1221,13 @@ sd_write (u8 * p, void *a)
   return size;
 }
 
+u16
+nsh_write (u8 * p, void *a)
+{
+  clib_warning ("not done");
+  return 0;
+}
+
 u16
 vni_write (u8 * p, void *a)
 {
@@ -1287,6 +1348,12 @@ mac_size_to_write (void *a)
   return sizeof (u16) + 6;
 }
 
+u16
+nsh_size_to_write (void *a)
+{
+  return sizeof (u16) + 4;
+}
+
 u8
 gid_address_len (gid_address_t * a)
 {
@@ -1356,10 +1423,9 @@ u32
 gid_address_parse (u8 * offset, gid_address_t * a)
 {
   lisp_afi_e afi;
-  int len = 0;
+  u16 len = 0;
 
-  if (!a)
-    return 0;
+  ASSERT (a);
 
   /* NOTE: since gid_address_parse may be called by vni_parse, we can't 0
    * the gid address here */
@@ -1395,7 +1461,7 @@ gid_address_parse (u8 * offset, gid_address_t * a)
       clib_warning ("LISP AFI %d not supported!", afi);
       return ~0;
     }
-  return len;
+  return (len == (u16) ~ 0) ? ~0 : len;
 }
 
 void