summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/lisp-cp/lisp_types.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/lisp-cp/lisp_types.c')
-rw-r--r--vnet/vnet/lisp-cp/lisp_types.c44
1 files changed, 40 insertions, 4 deletions
diff --git a/vnet/vnet/lisp-cp/lisp_types.c b/vnet/vnet/lisp-cp/lisp_types.c
index a2edb487..1f527d6e 100644
--- a/vnet/vnet/lisp-cp/lisp_types.c
+++ b/vnet/vnet/lisp-cp/lisp_types.c
@@ -213,7 +213,7 @@ format_fid_address (u8 * s, va_list * args)
return format (s, "%U", format_ip_prefix, &fid_addr_ippref (a));
case FID_ADDR_MAC:
- return format (s, "%U", format_ip_prefix, &fid_addr_mac (a));
+ return format (s, "%U", format_mac_address, &fid_addr_mac (a));
default:
clib_warning ("Can't format fid address type %d!", fid_addr_type (a));
@@ -1303,6 +1303,12 @@ vni_cmp (void *a1, void *a2)
}
static int
+mac_cmp (void *a1, void *a2)
+{
+ return memcmp (a1, a2, 6);
+}
+
+static int
fid_addr_cmp (fid_address_t * a1, fid_address_t * a2)
{
if (fid_addr_type (a1) != fid_addr_type (a2))
@@ -1314,7 +1320,7 @@ fid_addr_cmp (fid_address_t * a1, fid_address_t * a2)
return ip_prefix_cmp (&fid_addr_ippref (a1), &fid_addr_ippref (a2));
case FID_ADDR_MAC:
- return memcmp (&fid_addr_mac (a1), &fid_addr_mac (a2), 6);
+ return mac_cmp (fid_addr_mac (a1), fid_addr_mac (a2));
default:
return -1;
@@ -1375,8 +1381,7 @@ gid_address_cmp (gid_address_t * a1, gid_address_t * a2)
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)));
+ cmp = mac_cmp (gid_address_mac (a1), gid_address_mac (a2));
break;
case GID_ADDR_SRC_DST:
@@ -1448,6 +1453,37 @@ locator_free (locator_t * l)
gid_address_free (&l->address);
}
+void
+build_src_dst (gid_address_t * sd, gid_address_t * src, gid_address_t * dst)
+{
+ memset (sd, 0, sizeof (*sd));
+ gid_address_type (sd) = GID_ADDR_SRC_DST;
+ gid_address_vni (sd) = gid_address_vni (dst);
+ gid_address_vni_mask (sd) = gid_address_vni_mask (dst);
+
+ switch (gid_address_type (dst))
+ {
+ case GID_ADDR_IP_PREFIX:
+ gid_address_sd_src_type (sd) = FID_ADDR_IP_PREF;
+ gid_address_sd_dst_type (sd) = FID_ADDR_IP_PREF;
+ ip_prefix_copy (&gid_address_sd_src_ippref (sd),
+ &gid_address_ippref (src));
+ ip_prefix_copy (&gid_address_sd_dst_ippref (sd),
+ &gid_address_ippref (dst));
+ break;
+ case GID_ADDR_MAC:
+ gid_address_sd_src_type (sd) = FID_ADDR_MAC;
+ gid_address_sd_dst_type (sd) = FID_ADDR_MAC;
+ mac_copy (gid_address_sd_src_mac (sd), gid_address_mac (src));
+ mac_copy (gid_address_sd_dst_mac (sd), gid_address_mac (dst));
+ break;
+ default:
+ clib_warning ("Unsupported gid type %d while conversion!",
+ gid_address_type (dst));
+ break;
+ }
+}
+
/*
* fd.io coding-style-patch-verification: ON
*