aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/lisp-cp/lisp_types.c
diff options
context:
space:
mode:
authorFilip Tehlar <ftehlar@cisco.com>2016-06-22 16:00:52 +0200
committerFilip Tehlar <ftehlar@cisco.com>2016-06-22 17:18:43 +0200
commit5b7a563ff0a39b74a0f037572b7709e3c9aa5cf2 (patch)
treec96ba70f5ac3a303bb11b2204e8e7ae434878be8 /vnet/vnet/lisp-cp/lisp_types.c
parent7511ae85b6f59455ea362adff8b0bcc591fd3240 (diff)
Add MAC address support for LISP
Change-Id: I79e3915fa61b497e6b586babcdf093937af07b2b Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Diffstat (limited to 'vnet/vnet/lisp-cp/lisp_types.c')
-rw-r--r--vnet/vnet/lisp-cp/lisp_types.c62
1 files changed, 56 insertions, 6 deletions
diff --git a/vnet/vnet/lisp-cp/lisp_types.c b/vnet/vnet/lisp-cp/lisp_types.c
index 7a41c866b9c..9e1cb1f69e0 100644
--- a/vnet/vnet/lisp-cp/lisp_types.c
+++ b/vnet/vnet/lisp-cp/lisp_types.c
@@ -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)
{
@@ -577,6 +595,14 @@ lcaf_write (u8 * p, void * a)
}
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)
{
vni_t * v = 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)
{
@@ -668,6 +700,16 @@ gid_address_copy(gid_address_t * dst, gid_address_t * src)
}
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)
{
lisp_afi_e afi;
@@ -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;
}