Add MAC address support for LISP
[vpp.git] / vnet / vnet / lisp-cp / lisp_types.c
index 7a41c86..9e1cb1f 100644 (file)
@@ -40,15 +40,15 @@ u16 no_addr_length (void * a);
 int no_addr_cmp (void * a1, void * a2);
 
 size_to_write_fct size_to_write_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_size_to_write, lcaf_size_to_write };
+  { ip_prefix_size_to_write, lcaf_size_to_write, mac_size_to_write };
 serdes_fct write_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_write, lcaf_write };
+  { ip_prefix_write, lcaf_write, mac_write };
 cast_fct cast_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_cast, lcaf_cast };
+  { ip_prefix_cast, lcaf_cast, mac_cast };
 addr_len_fct addr_len_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_length, lcaf_prefix_length };
+  { ip_prefix_length, lcaf_length, mac_length };
 copy_fct copy_fcts[GID_ADDR_TYPES] =
-  { ip_prefix_copy, lcaf_copy };
+  { ip_prefix_copy, lcaf_copy, mac_copy };
 
 cmp_fct lcaf_cmp_fcts[LCAF_TYPES] =
   {
@@ -475,6 +475,12 @@ ip_prefix_copy (void * dst , void * src)
   clib_memcpy (dst, src, sizeof (ip_prefix_t));
 }
 
+void
+mac_copy (void * dst , void * src)
+{
+  clib_memcpy (dst, src, 6);
+}
+
 int
 ip_prefix_cmp(ip_prefix_t * p1, ip_prefix_t * p2)
 {
@@ -523,7 +529,13 @@ lcaf_copy (void * dst , void * src)
 }
 
 u8
-lcaf_prefix_length (void *a)
+lcaf_length (void *a)
+{
+  return 0;
+}
+
+u8
+mac_length (void *a)
 {
   return 0;
 }
@@ -534,6 +546,12 @@ lcaf_cast (gid_address_t * a)
   return &gid_address_lcaf (a);
 }
 
+void *
+mac_cast (gid_address_t * a)
+{
+  return &gid_address_mac (a);
+}
+
 u16
 no_addr_length (void * a)
 {
@@ -576,6 +594,14 @@ lcaf_write (u8 * p, void * a)
   return size + len;
 }
 
+u16
+mac_write (u8 * p, void * a)
+{
+  *(u16 *)p = clib_host_to_net_u16 (LISP_AFI_MAC);
+  clib_memcpy(p + sizeof (u16), a, 6);
+  return mac_size_to_write (a);
+}
+
 u16
 vni_write (u8 * p, void * a)
 {
@@ -632,6 +658,12 @@ lcaf_size_to_write (void * a)
   return size + len;
 }
 
+u16
+mac_size_to_write (void * a)
+{
+  return sizeof (u16) + 6;
+}
+
 u8
 gid_address_len (gid_address_t *a)
 {
@@ -667,6 +699,16 @@ gid_address_copy(gid_address_t * dst, gid_address_t * src)
   gid_address_type(dst) = type;
 }
 
+u32
+mac_parse (u8 * offset, gid_address_t * a)
+{
+  /* skip AFI field */
+  offset += sizeof (u16);
+
+  memcpy (gid_address_mac (a), offset, sizeof (gid_address_mac (a)));
+  return (sizeof (u16) + sizeof (gid_address_mac (a)));
+}
+
 u32
 gid_address_parse (u8 * offset, gid_address_t *a)
 {
@@ -700,6 +742,10 @@ gid_address_parse (u8 * offset, gid_address_t *a)
       len = lcaf_parse (offset, a);
       gid_address_type(a) = GID_ADDR_LCAF;
       break;
+    case LISP_AFI_MAC:
+      len = mac_parse (offset, a);
+      gid_address_type(a) = GID_ADDR_MAC;
+      break;
     default:
       clib_warning("LISP AFI %d not supported!", afi);
       return ~0;
@@ -760,6 +806,10 @@ gid_address_cmp (gid_address_t * a1, gid_address_t * a2)
       if (lcaf_type (lcaf1) == lcaf_type (lcaf2))
         cmp = (*lcaf_cmp_fcts[lcaf_type (lcaf1)])(lcaf1, lcaf2);
       break;
+    case GID_ADDR_MAC:
+      cmp = memcmp (gid_address_mac (a1), gid_address_mac (a2),
+                    sizeof (gid_address_mac (a1)));
+      break;
     default:
       break;
     }