lisp: API cleanup 63/24663/8
authorJakub Grajciar <jgrajcia@cisco.com>
Thu, 30 Jan 2020 12:26:43 +0000 (13:26 +0100)
committerJakub Grajciar <jgrajcia@cisco.com>
Tue, 28 Apr 2020 11:54:00 +0000 (11:54 +0000)
Use consistent API types.

Type: fix

Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
Change-Id: Ib7f73a0b6de188982a09040f7739dc46be3cb1de
Signed-off-by: Jakub Grajciar <jgrajcia@cisco.com>
17 files changed:
src/vat/api_format.c
src/vnet/CMakeLists.txt
src/vnet/lisp-cp/lisp.api
src/vnet/lisp-cp/lisp_api.c
src/vnet/lisp-cp/lisp_types.api [new file with mode: 0644]
src/vnet/lisp-cp/lisp_types_api.c [new file with mode: 0644]
src/vnet/lisp-cp/lisp_types_api.h [new file with mode: 0644]
src/vnet/lisp-cp/one.api
src/vnet/lisp-cp/one_api.c
src/vnet/lisp-gpe/lisp_gpe.api
src/vnet/lisp-gpe/lisp_gpe_api.c
src/vnet/lisp-gpe/lisp_types_api.c [new symlink]
src/vnet/lisp-gpe/lisp_types_api.h [new symlink]
src/vpp/api/custom_dump.c
test/lisp.py
test/test_lisp.py
test/vpp_papi_provider.py

index 96bb78f..c3441eb 100644 (file)
@@ -2803,8 +2803,7 @@ vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
   else
     {
       s = format (s, "%=16U%=16d%=16d",
-                 mp->is_ipv6 ? format_ip6_address :
-                 format_ip4_address,
+                 format_ip46_address,
                  mp->ip_address, mp->priority, mp->weight);
     }
 
@@ -2837,14 +2836,14 @@ vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
                              clib_net_to_host_u32 (mp->sw_if_index));
   else
     {
-      if (mp->is_ipv6)
+      if (mp->ip_address.af)
        {
-         clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
+         clib_memcpy (&ip6, mp->ip_address.un.ip6, sizeof (ip6));
          vat_json_object_add_ip6 (node, "address", ip6);
        }
       else
        {
-         clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
+         clib_memcpy (&ip4, mp->ip_address.un.ip4, sizeof (ip4));
          vat_json_object_add_ip4 (node, "address", ip4);
        }
     }
@@ -2912,20 +2911,22 @@ format_nsh_address_vat (u8 * s, va_list * args)
 static u8 *
 format_lisp_flat_eid (u8 * s, va_list * args)
 {
-  u32 type = va_arg (*args, u32);
-  u8 *eid = va_arg (*args, u8 *);
-  u32 eid_len = va_arg (*args, u32);
+  vl_api_eid_t *eid = va_arg (*args, vl_api_eid_t *);
 
-  switch (type)
+  switch (eid->type)
     {
-    case 0:
-      return format (s, "%U/%d", format_ip4_address, eid, eid_len);
-    case 1:
-      return format (s, "%U/%d", format_ip6_address, eid, eid_len);
-    case 2:
-      return format (s, "%U", format_ethernet_address, eid);
-    case 3:
-      return format (s, "%U", format_nsh_address_vat, eid);
+    case EID_TYPE_API_PREFIX:
+      if (eid->address.prefix.address.af)
+       return format (s, "%U/%d", format_ip6_address,
+                      eid->address.prefix.address.un.ip6,
+                      eid->address.prefix.len);
+      return format (s, "%U/%d", format_ip4_address,
+                    eid->address.prefix.address.un.ip4,
+                    eid->address.prefix.len);
+    case EID_TYPE_API_MAC:
+      return format (s, "%U", format_ethernet_address, eid->address.mac);
+    case EID_TYPE_API_NSH:
+      return format (s, "%U", format_nsh_address_vat, eid->address.nsh);
     }
   return 0;
 }
@@ -2933,17 +2934,14 @@ format_lisp_flat_eid (u8 * s, va_list * args)
 static u8 *
 format_lisp_eid_vat (u8 * s, va_list * args)
 {
-  u32 type = va_arg (*args, u32);
-  u8 *eid = va_arg (*args, u8 *);
-  u32 eid_len = va_arg (*args, u32);
-  u8 *seid = va_arg (*args, u8 *);
-  u32 seid_len = va_arg (*args, u32);
-  u32 is_src_dst = va_arg (*args, u32);
+  vl_api_eid_t *deid = va_arg (*args, vl_api_eid_t *);
+  vl_api_eid_t *seid = va_arg (*args, vl_api_eid_t *);
+  u8 is_src_dst = (u8) va_arg (*args, int);
 
   if (is_src_dst)
-    s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
+    s = format (s, "%U|", format_lisp_flat_eid, seid);
 
-  s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
+  s = format (s, "%U", format_lisp_flat_eid, deid);
 
   return s;
 }
@@ -2960,10 +2958,7 @@ vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
     s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
 
   eid = format (0, "%U", format_lisp_eid_vat,
-               mp->eid_type,
-               mp->eid,
-               mp->eid_prefix_len,
-               mp->seid, mp->seid_prefix_len, mp->is_src_dst);
+               mp->deid, mp->seid, mp->is_src_dst);
   vec_add1 (eid, 0);
 
   print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
@@ -2971,7 +2966,7 @@ vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
         eid,
         mp->is_local ? "local" : "remote",
         s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
-        clib_net_to_host_u16 (mp->key_id), mp->key);
+        clib_net_to_host_u16 (mp->key.id), mp->key.key);
 
   vec_free (s);
   vec_free (eid);
@@ -3000,11 +2995,11 @@ vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
                              clib_net_to_host_u32 (mp->locator_set_index));
 
   vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
-  if (mp->eid_type == 3)
+  if (mp->deid.type == 3)
     {
       vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
       vat_json_init_object (nsh_json);
-      lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
+      lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) & mp->deid.address.nsh;
       vat_json_object_add_uint (nsh_json, "spi",
                                clib_net_to_host_u32 (nsh->spi));
       vat_json_object_add_uint (nsh_json, "si", nsh->si);
@@ -3012,10 +3007,7 @@ vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
   else
     {
       eid = format (0, "%U", format_lisp_eid_vat,
-                   mp->eid_type,
-                   mp->eid,
-                   mp->eid_prefix_len,
-                   mp->seid, mp->seid_prefix_len, mp->is_src_dst);
+                   mp->deid, mp->seid, mp->is_src_dst);
       vec_add1 (eid, 0);
       vat_json_object_add_string_copy (node, "eid", eid);
       vec_free (eid);
@@ -3024,11 +3016,11 @@ vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
   vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
   vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
 
-  if (mp->key_id)
+  if (mp->key.id)
     {
       vat_json_object_add_uint (node, "key_id",
-                               clib_net_to_host_u16 (mp->key_id));
-      vat_json_object_add_string_copy (node, "key", mp->key);
+                               clib_net_to_host_u16 (mp->key.id));
+      vat_json_object_add_string_copy (node, "key", mp->key.key);
     }
 }
 
@@ -3037,28 +3029,32 @@ vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
 {
   vat_main_t *vam = &vat_main;
   u8 *seid = 0, *deid = 0;
-  u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
+  ip46_address_t lloc, rloc;
 
-  deid = format (0, "%U", format_lisp_eid_vat,
-                mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
+  deid = format (0, "%U", format_lisp_eid_vat, mp->deid, 0);
 
-  seid = format (0, "%U", format_lisp_eid_vat,
-                mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
+  seid = format (0, "%U", format_lisp_eid_vat, mp->seid, 0);
 
   vec_add1 (deid, 0);
   vec_add1 (seid, 0);
 
-  if (mp->is_ip4)
-    format_ip_address_fcn = format_ip4_address;
+  if (mp->lloc.af)
+    {
+      clib_memcpy (&lloc.ip6, mp->lloc.un.ip6, 16);
+      clib_memcpy (&rloc.ip6, mp->rloc.un.ip6, 16);
+    }
   else
-    format_ip_address_fcn = format_ip6_address;
+    {
+      clib_memcpy (&lloc.ip4, mp->lloc.un.ip4, 4);
+      clib_memcpy (&rloc.ip4, mp->rloc.un.ip4, 4);
+    }
 
 
   print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
         clib_net_to_host_u32 (mp->vni),
         seid, deid,
-        format_ip_address_fcn, mp->lloc,
-        format_ip_address_fcn, mp->rloc,
+        format_ip46_address, lloc,
+        format_ip46_address, rloc,
         clib_net_to_host_u32 (mp->pkt_count),
         clib_net_to_host_u32 (mp->bytes));
 
@@ -3083,11 +3079,9 @@ vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
   node = vat_json_array_add (&vam->json_tree);
 
   vat_json_init_object (node);
-  deid = format (0, "%U", format_lisp_eid_vat,
-                mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
+  deid = format (0, "%U", format_lisp_eid_vat, mp->deid, 0);
 
-  seid = format (0, "%U", format_lisp_eid_vat,
-                mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
+  seid = format (0, "%U", format_lisp_eid_vat, mp->seid, 0);
 
   vec_add1 (deid, 0);
   vec_add1 (seid, 0);
@@ -3096,19 +3090,20 @@ vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
   vat_json_object_add_string_copy (node, "deid", deid);
   vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
 
-  if (mp->is_ip4)
+  if (mp->lloc.af)
     {
-      clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
-      vat_json_object_add_ip4 (node, "lloc", ip4);
-      clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
-      vat_json_object_add_ip4 (node, "rloc", ip4);
+      clib_memcpy (&ip6, mp->lloc.un.ip6, sizeof (ip6));
+      vat_json_object_add_ip6 (node, "lloc", ip6);
+      clib_memcpy (&ip6, mp->rloc.un.ip6, sizeof (ip6));
+      vat_json_object_add_ip6 (node, "rloc", ip6);
+
     }
   else
     {
-      clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
-      vat_json_object_add_ip6 (node, "lloc", ip6);
-      clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
-      vat_json_object_add_ip6 (node, "rloc", ip6);
+      clib_memcpy (&ip4, mp->lloc.un.ip4, sizeof (ip4));
+      vat_json_object_add_ip4 (node, "lloc", ip4);
+      clib_memcpy (&ip4, mp->rloc.un.ip4, sizeof (ip4));
+      vat_json_object_add_ip4 (node, "rloc", ip4);
     }
   vat_json_object_add_uint (node, "pkt_count",
                            clib_net_to_host_u32 (mp->pkt_count));
@@ -3218,7 +3213,7 @@ static void
   vat_main_t *vam = &vat_main;
   int retval = clib_net_to_host_u32 (mp->retval);
 
-  print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
+  print (vam->ofp, "%s", mp->is_enable ? "enabled" : "disabled");
 
   vam->retval = retval;
   vam->result_ready = 1;
@@ -3232,7 +3227,7 @@ static void
   vat_json_node_t _node, *node = &_node;
   int retval = clib_net_to_host_u32 (mp->retval);
 
-  u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
+  u8 *s = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
 
   vat_json_init_object (node);
   vat_json_object_add_string_copy (node, "state", s);
@@ -3255,7 +3250,7 @@ static void
   if (retval)
     goto end;
 
-  print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
+  print (vam->ofp, "%s", mp->is_enable ? "enabled" : "disabled");
 end:
   vam->retval = retval;
   vam->result_ready = 1;
@@ -3269,7 +3264,7 @@ static void
   vat_json_node_t _node, *node = &_node;
   int retval = clib_net_to_host_u32 (mp->retval);
 
-  u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
+  u8 *s = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
   vat_json_init_object (node);
   vat_json_object_add_string_copy (node, "state", s);
 
@@ -3291,7 +3286,7 @@ static void
   if (retval)
     goto end;
 
-  print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
+  print (vam->ofp, "%s", mp->is_enable ? "enabled" : "disabled");
 end:
   vam->retval = retval;
   vam->result_ready = 1;
@@ -3305,7 +3300,7 @@ static void
   vat_json_node_t _node, *node = &_node;
   int retval = clib_net_to_host_u32 (mp->retval);
 
-  u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
+  u8 *s = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
   vat_json_init_object (node);
   vat_json_object_add_string_copy (node, "state", s);
 
@@ -3392,14 +3387,14 @@ static void
   vat_main_t *vam = &vat_main;
   u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
 
-  if (mp->lcl_loc.is_ip4)
-    format_ip_address_fcn = format_ip4_address;
-  else
+  if (mp->lcl_loc.addr.af)
     format_ip_address_fcn = format_ip6_address;
+  else
+    format_ip_address_fcn = format_ip4_address;
 
   print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
-        format_ip_address_fcn, &mp->lcl_loc,
-        format_ip_address_fcn, &mp->rmt_loc);
+        format_ip_address_fcn, &mp->lcl_loc.addr.un,
+        format_ip_address_fcn, &mp->rmt_loc.addr.un);
 }
 
 static void
@@ -3408,15 +3403,15 @@ lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
   struct in6_addr ip6;
   struct in_addr ip4;
 
-  if (loc->is_ip4)
+  if (loc->addr.af)
     {
-      clib_memcpy (&ip4, loc->addr, sizeof (ip4));
-      vat_json_object_add_ip4 (n, "address", ip4);
+      clib_memcpy (&ip6, loc->addr.un.ip6, sizeof (ip6));
+      vat_json_object_add_ip6 (n, "address", ip6);
     }
   else
     {
-      clib_memcpy (&ip6, loc->addr, sizeof (ip6));
-      vat_json_object_add_ip6 (n, "address", ip6);
+      clib_memcpy (&ip4, loc->addr.un.ip4, sizeof (ip4));
+      vat_json_object_add_ip4 (n, "address", ip4);
     }
   vat_json_object_add_uint (n, "weight", loc->weight);
 }
@@ -3464,8 +3459,7 @@ static void
     {
       e = &mp->entries[i];
       print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
-            format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
-            format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
+            format_lisp_flat_eid, e->leid, format_lisp_flat_eid, e->reid);
     }
 
 end:
@@ -3501,14 +3495,12 @@ static void
       vat_json_object_add_int (e, "vni", fwd->vni);
       vat_json_object_add_int (e, "action", fwd->action);
 
-      s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
-                 fwd->leid_prefix_len);
+      s = format (0, "%U", format_lisp_flat_eid, fwd->leid);
       vec_add1 (s, 0);
       vat_json_object_add_string_copy (e, "leid", s);
       vec_free (s);
 
-      s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
-                 fwd->reid_prefix_len);
+      s = format (0, "%U", format_lisp_flat_eid, fwd->reid);
       vec_add1 (s, 0);
       vat_json_object_add_string_copy (e, "reid", s);
       vec_free (s);
@@ -3542,7 +3534,8 @@ static void
       print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
             clib_net_to_host_u32 (r->fib_index),
             clib_net_to_host_u32 (r->nh_sw_if_index),
-            r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
+            r->nh_addr.af ? format_ip6_address : format_ip4_address,
+            r->nh_addr.un);
     }
 
 end:
@@ -3573,8 +3566,9 @@ static void
       vat_json_init_object (e);
       r = &mp->entries[i];
       s =
-       format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
-               r->nh_addr);
+       format (0, "%U",
+               r->nh_addr.af ? format_ip6_address : format_ip4_address,
+               r->nh_addr.un);
       vec_add1 (s, 0);
       vat_json_object_add_string_copy (e, "ip4", s);
       vec_free (s);
@@ -3891,8 +3885,7 @@ static void
     {
       a = &mp->adjacencies[i];
       print (vam->ofp, "%U %40U",
-            format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
-            format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
+            format_lisp_flat_eid, a->leid, format_lisp_flat_eid, a->reid);
     }
 
 end:
@@ -3923,14 +3916,12 @@ static void
       a = &mp->adjacencies[i];
 
       vat_json_init_object (e);
-      s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
-                 a->leid_prefix_len);
+      s = format (0, "%U", format_lisp_flat_eid, a->leid);
       vec_add1 (s, 0);
       vat_json_object_add_string_copy (e, "leid", s);
       vec_free (s);
 
-      s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
-                 a->reid_prefix_len);
+      s = format (0, "%U", format_lisp_flat_eid, a->reid);
       vec_add1 (s, 0);
       vat_json_object_add_string_copy (e, "reid", s);
       vec_free (s);
@@ -3950,8 +3941,8 @@ vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
   vat_main_t *vam = &vat_main;
 
   print (vam->ofp, "%=20U",
-        mp->is_ipv6 ? format_ip6_address : format_ip4_address,
-        mp->ip_address);
+        mp->ip_address.af ? format_ip6_address : format_ip4_address,
+        mp->ip_address.un);
 }
 
 static void
@@ -3971,14 +3962,14 @@ static void
   node = vat_json_array_add (&vam->json_tree);
 
   vat_json_init_object (node);
-  if (mp->is_ipv6)
+  if (mp->ip_address.af)
     {
-      clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
+      clib_memcpy (&ip6, mp->ip_address.un.ip6, sizeof (ip6));
       vat_json_object_add_ip6 (node, "map-server", ip6);
     }
   else
     {
-      clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
+      clib_memcpy (&ip4, mp->ip_address.un.ip4, sizeof (ip4));
       vat_json_object_add_ip4 (node, "map-server", ip4);
     }
 }
@@ -3990,8 +3981,8 @@ vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
   vat_main_t *vam = &vat_main;
 
   print (vam->ofp, "%=20U",
-        mp->is_ipv6 ? format_ip6_address : format_ip4_address,
-        mp->ip_address);
+        mp->ip_address.af ? format_ip6_address : format_ip4_address,
+        mp->ip_address.un);
 }
 
 static void
@@ -4011,14 +4002,14 @@ static void
   node = vat_json_array_add (&vam->json_tree);
 
   vat_json_init_object (node);
-  if (mp->is_ipv6)
+  if (mp->ip_address.af)
     {
-      clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
+      clib_memcpy (&ip6, mp->ip_address.un.ip6, sizeof (ip6));
       vat_json_object_add_ip6 (node, "map resolver", ip6);
     }
   else
     {
-      clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
+      clib_memcpy (&ip4, mp->ip_address.un.ip4, sizeof (ip4));
       vat_json_object_add_ip4 (node, "map resolver", ip4);
     }
 }
@@ -4174,7 +4165,7 @@ static void
 
   if (0 <= retval)
     {
-      print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
+      print (vam->ofp, "%s\n", mp->is_enable ? "enabled" : "disabled");
     }
 
   vam->retval = retval;
@@ -4189,7 +4180,7 @@ static void
   vat_json_node_t node;
   u8 *status = 0;
 
-  status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
+  status = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
   vec_add1 (status, 0);
 
   vat_json_init_object (&node);
@@ -4213,7 +4204,7 @@ static void
 
   if (0 <= retval)
     {
-      print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
+      print (vam->ofp, "%s\n", mp->is_enable ? "enabled" : "disabled");
     }
 
   vam->retval = retval;
@@ -4228,7 +4219,7 @@ static void
   vat_json_node_t node;
   u8 *status = 0;
 
-  status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
+  status = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
   vec_add1 (status, 0);
 
   vat_json_init_object (&node);
@@ -4252,7 +4243,7 @@ static void
 
   if (0 <= retval)
     {
-      print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
+      print (vam->ofp, "%s\n", mp->is_enable ? "enabled" : "disabled");
     }
 
   vam->retval = retval;
@@ -4267,7 +4258,7 @@ static void
   vat_json_node_t node;
   u8 *status = 0;
 
-  status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
+  status = format (0, "%s", mp->is_enable ? "enabled" : "disabled");
   vec_add1 (status, 0);
 
   vat_json_init_object (&node);
@@ -4295,8 +4286,8 @@ static void
       if (mp->status)
        {
          print (vam->ofp, "Proxy-ETR address; %U",
-                mp->is_ip4 ? format_ip4_address : format_ip6_address,
-                mp->address);
+                mp->ip_address.af ? format_ip6_address : format_ip4_address,
+                mp->ip_address.un);
        }
     }
 
@@ -4321,14 +4312,14 @@ static void
   vat_json_object_add_string_copy (&node, "status", status);
   if (mp->status)
     {
-      if (mp->is_ip4)
+      if (mp->ip_address.af)
        {
-         clib_memcpy (&ip6, mp->address, sizeof (ip6));
+         clib_memcpy (&ip6, mp->ip_address.un.ip6, sizeof (ip6));
          vat_json_object_add_ip6 (&node, "address", ip6);
        }
       else
        {
-         clib_memcpy (&ip4, mp->address, sizeof (ip4));
+         clib_memcpy (&ip4, mp->ip_address.un.ip4, sizeof (ip4));
          vat_json_object_add_ip4 (&node, "address", ip4);
        }
     }
@@ -14112,7 +14103,11 @@ api_get_node_graph (vat_main_t * vam)
 /* *INDENT-OFF* */
 /** Used for parsing LISP eids */
 typedef CLIB_PACKED(struct{
-  u8 addr[16];   /**< eid address */
+  union {
+          ip46_address_t ip;
+          mac_address_t mac;
+          lisp_nsh_api_t nsh;
+  } addr;
   u32 len;       /**< prefix length if IP */
   u8 type;      /**< type of eid */
 }) lisp_eid_vat_t;
@@ -14125,58 +14120,69 @@ unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
 
   clib_memset (a, 0, sizeof (a[0]));
 
-  if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
-    {
-      a->type = 0;             /* ipv4 type */
-    }
-  else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
+  if (unformat (input, "%U/%d", unformat_ip46_address, a->addr.ip, &a->len))
     {
-      a->type = 1;             /* ipv6 type */
+      a->type = 0;             /* ip prefix type */
     }
-  else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
+  else if (unformat (input, "%U", unformat_ethernet_address, a->addr.mac))
     {
-      a->type = 2;             /* mac type */
+      a->type = 1;             /* mac type */
     }
-  else if (unformat (input, "%U", unformat_nsh_address, a->addr))
+  else if (unformat (input, "%U", unformat_nsh_address, a->addr.nsh))
     {
-      a->type = 3;             /* NSH type */
-      lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
-      nsh->spi = clib_host_to_net_u32 (nsh->spi);
+      a->type = 2;             /* NSH type */
+      a->addr.nsh.spi = clib_host_to_net_u32 (a->addr.nsh.spi);
     }
   else
     {
       return 0;
     }
 
-  if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
+  if (a->type == 0)
     {
-      return 0;
+      if (ip46_address_is_ip4 (&a->addr.ip))
+       return a->len > 32 ? 1 : 0;
+      else
+       return a->len > 128 ? 1 : 0;
     }
 
   return 1;
 }
 
-static int
-lisp_eid_size_vat (u8 type)
+static void
+lisp_eid_put_vat (vl_api_eid_t * eid, const lisp_eid_vat_t * vat_eid)
 {
-  switch (type)
+  eid->type = vat_eid->type;
+  switch (eid->type)
     {
-    case 0:
-      return 4;
-    case 1:
-      return 16;
-    case 2:
-      return 6;
-    case 3:
-      return 5;
+    case EID_TYPE_API_PREFIX:
+      if (ip46_address_is_ip4 (&vat_eid->addr.ip))
+       {
+         clib_memcpy (&eid->address.prefix.address.un.ip4,
+                      &vat_eid->addr.ip.ip4, 4);
+         eid->address.prefix.address.af = ADDRESS_IP4;
+         eid->address.prefix.len = vat_eid->len;
+       }
+      else
+       {
+         clib_memcpy (&eid->address.prefix.address.un.ip6,
+                      &vat_eid->addr.ip.ip6, 16);
+         eid->address.prefix.address.af = ADDRESS_IP6;
+         eid->address.prefix.len = vat_eid->len;
+       }
+      return;
+    case EID_TYPE_API_MAC:
+      clib_memcpy (&eid->address.mac, &vat_eid->addr.mac,
+                  sizeof (eid->address.mac));
+      return;
+    case EID_TYPE_API_NSH:
+      clib_memcpy (&eid->address.nsh, &vat_eid->addr.nsh,
+                  sizeof (eid->address.nsh));
+      return;
+    default:
+      ASSERT (0);
+      return;
     }
-  return 0;
-}
-
-static void
-lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
-{
-  clib_memcpy (dst, eid, lisp_eid_size_vat (type));
 }
 
 static int
@@ -14486,14 +14492,12 @@ api_one_add_del_local_eid (vat_main_t * vam)
   M (ONE_ADD_DEL_LOCAL_EID, mp);
 
   mp->is_add = is_add;
-  lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
-  mp->eid_type = eid->type;
-  mp->prefix_len = eid->len;
+  lisp_eid_put_vat (&mp->eid, eid);
   mp->vni = clib_host_to_net_u32 (vni);
-  mp->key_id = clib_host_to_net_u16 (key_id);
+  mp->key.id = key_id;
   clib_memcpy (mp->locator_set_name, locator_set_name,
               vec_len (locator_set_name));
-  clib_memcpy (mp->key, key, vec_len (key));
+  clib_memcpy (mp->key.key, key, vec_len (key));
 
   vec_free (locator_set_name);
   vec_free (key);
@@ -14559,13 +14563,12 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
       else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
                         &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
        {
-         rloc.is_ip4 = 1;
-
-         clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
+         rloc.addr.af = 0;
+         clib_memcpy (&rloc.addr.un.ip4, &lcl_rloc4, sizeof (lcl_rloc4));
          rloc.weight = 0;
          vec_add1 (lcl_locs, rloc);
 
-         clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
+         clib_memcpy (&rloc.addr.un.ip4, &rmt_rloc4, sizeof (rmt_rloc4));
          vec_add1 (rmt_locs, rloc);
          /* weight saved in rmt loc */
          curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
@@ -14573,12 +14576,12 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
       else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
                         &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
        {
-         rloc.is_ip4 = 0;
-         clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
+         rloc.addr.af = 1;
+         clib_memcpy (&rloc.addr.un.ip6, &lcl_rloc6, sizeof (lcl_rloc6));
          rloc.weight = 0;
          vec_add1 (lcl_locs, rloc);
 
-         clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
+         clib_memcpy (&rloc.addr.un.ip6, &rmt_rloc6, sizeof (rmt_rloc6));
          vec_add1 (rmt_locs, rloc);
          /* weight saved in rmt loc */
          curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
@@ -14617,13 +14620,10 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
       sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
 
   mp->is_add = is_add;
-  lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
-  lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
-  mp->eid_type = rmt_eid->type;
+  lisp_eid_put_vat (&mp->rmt_eid, rmt_eid);
+  lisp_eid_put_vat (&mp->lcl_eid, lcl_eid);
   mp->dp_table = clib_host_to_net_u32 (dp_table);
   mp->vni = clib_host_to_net_u32 (vni);
-  mp->rmt_len = rmt_eid->len;
-  mp->lcl_len = lcl_eid->len;
   mp->action = action;
 
   if (0 != rmt_locs && 0 != lcl_locs)
@@ -14696,13 +14696,13 @@ api_one_add_del_map_server (vat_main_t * vam)
   mp->is_add = is_add;
   if (ipv6_set)
     {
-      mp->is_ipv6 = 1;
-      clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
+      mp->ip_address.af = 1;
+      clib_memcpy (mp->ip_address.un.ip6, &ipv6, sizeof (ipv6));
     }
   else
     {
-      mp->is_ipv6 = 0;
-      clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
+      mp->ip_address.af = 0;
+      clib_memcpy (mp->ip_address.un.ip4, &ipv4, sizeof (ipv4));
     }
 
   /* send it... */
@@ -14764,13 +14764,13 @@ api_one_add_del_map_resolver (vat_main_t * vam)
   mp->is_add = is_add;
   if (ipv6_set)
     {
-      mp->is_ipv6 = 1;
-      clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
+      mp->ip_address.af = 1;
+      clib_memcpy (mp->ip_address.un.ip6, &ipv6, sizeof (ipv6));
     }
   else
     {
-      mp->is_ipv6 = 0;
-      clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
+      mp->ip_address.af = 0;
+      clib_memcpy (mp->ip_address.un.ip6, &ipv4, sizeof (ipv4));
     }
 
   /* send it... */
@@ -14789,7 +14789,7 @@ api_lisp_gpe_enable_disable (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_gpe_enable_disable_t *mp;
   u8 is_set = 0;
-  u8 is_en = 1;
+  u8 is_enable = 1;
   int ret;
 
   /* Parse args required to build the message */
@@ -14798,12 +14798,12 @@ api_lisp_gpe_enable_disable (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
          is_set = 1;
-         is_en = 0;
+         is_enable = 0;
        }
       else
        break;
@@ -14818,7 +14818,7 @@ api_lisp_gpe_enable_disable (vat_main_t * vam)
   /* Construct the API message */
   M (GPE_ENABLE_DISABLE, mp);
 
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -14834,7 +14834,7 @@ api_one_rloc_probe_enable_disable (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_rloc_probe_enable_disable_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -14843,7 +14843,7 @@ api_one_rloc_probe_enable_disable (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        is_set = 1;
@@ -14860,7 +14860,7 @@ api_one_rloc_probe_enable_disable (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
 
-  mp->is_enabled = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -14878,7 +14878,7 @@ api_one_map_register_enable_disable (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_map_register_enable_disable_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -14887,7 +14887,7 @@ api_one_map_register_enable_disable (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        is_set = 1;
@@ -14904,7 +14904,7 @@ api_one_map_register_enable_disable (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
 
-  mp->is_enabled = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -14922,7 +14922,7 @@ api_one_enable_disable (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_enable_disable_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -14931,7 +14931,7 @@ api_one_enable_disable (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
@@ -14950,7 +14950,7 @@ api_one_enable_disable (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_ENABLE_DISABLE, mp);
 
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -14968,7 +14968,7 @@ api_one_enable_disable_xtr_mode (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_enable_disable_xtr_mode_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -14977,7 +14977,7 @@ api_one_enable_disable_xtr_mode (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
@@ -14996,7 +14996,7 @@ api_one_enable_disable_xtr_mode (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
 
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -15029,7 +15029,7 @@ api_one_enable_disable_pitr_mode (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_enable_disable_pitr_mode_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -15038,7 +15038,7 @@ api_one_enable_disable_pitr_mode (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
@@ -15057,7 +15057,7 @@ api_one_enable_disable_pitr_mode (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
 
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -15090,7 +15090,7 @@ api_one_enable_disable_petr_mode (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_enable_disable_petr_mode_t *mp;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -15099,7 +15099,7 @@ api_one_enable_disable_petr_mode (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
@@ -15118,7 +15118,7 @@ api_one_enable_disable_petr_mode (vat_main_t * vam)
   /* Construct the API message */
   M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
 
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send it... */
   S (mp);
@@ -15221,9 +15221,9 @@ api_one_add_del_ndp_entry (vat_main_t * vam)
 
   M (ONE_ADD_DEL_NDP_ENTRY, mp);
   mp->is_add = is_add;
-  clib_memcpy (mp->mac, mac, 6);
+  clib_memcpy (&mp->entry.mac, mac, 6);
   mp->bd = clib_host_to_net_u32 (bd);
-  clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
+  clib_memcpy (&mp->entry.ip6, ip6, sizeof (mp->entry.ip6));
 
   /* send */
   S (mp);
@@ -15272,9 +15272,9 @@ api_one_add_del_l2_arp_entry (vat_main_t * vam)
 
   M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
   mp->is_add = is_add;
-  clib_memcpy (mp->mac, mac, 6);
+  clib_memcpy (&mp->entry.mac, mac, 6);
   mp->bd = clib_host_to_net_u32 (bd);
-  mp->ip4 = ip4;
+  clib_memcpy (mp->entry.ip4, &ip4, sizeof (mp->entry.ip4));
 
   /* send */
   S (mp);
@@ -15398,7 +15398,7 @@ api_one_stats_enable_disable (vat_main_t * vam)
   vl_api_one_stats_enable_disable_t *mp;
   unformat_input_t *input = vam->input;
   u8 is_set = 0;
-  u8 is_en = 0;
+  u8 is_enable = 0;
   int ret;
 
   /* Parse args required to build the message */
@@ -15407,7 +15407,7 @@ api_one_stats_enable_disable (vat_main_t * vam)
       if (unformat (input, "enable"))
        {
          is_set = 1;
-         is_en = 1;
+         is_enable = 1;
        }
       else if (unformat (input, "disable"))
        {
@@ -15424,7 +15424,7 @@ api_one_stats_enable_disable (vat_main_t * vam)
     }
 
   M (ONE_STATS_ENABLE_DISABLE, mp);
-  mp->is_en = is_en;
+  mp->is_enable = is_enable;
 
   /* send */
   S (mp);
@@ -15662,11 +15662,11 @@ api_one_use_petr (vat_main_t * vam)
   mp->is_add = is_add;
   if (is_add)
     {
-      mp->is_ip4 = ip_addr_version (&ip) == AF_IP4 ? 1 : 0;
-      if (mp->is_ip4)
-       clib_memcpy (mp->address, &ip, 4);
+      mp->ip_address.af = ip_addr_version (&ip) == AF_IP4 ? 0 : 1;
+      if (mp->ip_address.af)
+       clib_memcpy (mp->ip_address.un.ip6, &ip, 16);
       else
-       clib_memcpy (mp->address, &ip, 16);
+       clib_memcpy (mp->ip_address.un.ip4, &ip, 4);
     }
 
   /* send */
@@ -15868,15 +15868,15 @@ api_one_add_del_remote_mapping (vat_main_t * vam)
        }
       else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
        {
-         rloc.is_ip4 = 1;
-         clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
+         rloc.ip_address.af = 0;
+         clib_memcpy (&rloc.ip_address.un.ip6, &rloc6, sizeof (rloc6));
          vec_add1 (rlocs, rloc);
          curr_rloc = &rlocs[vec_len (rlocs) - 1];
        }
       else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
        {
-         rloc.is_ip4 = 0;
-         clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
+         rloc.ip_address.af = 1;
+         clib_memcpy (&rloc.ip_address.un.ip4, &rloc4, sizeof (rloc4));
          vec_add1 (rlocs, rloc);
          curr_rloc = &rlocs[vec_len (rlocs) - 1];
        }
@@ -15911,12 +15911,9 @@ api_one_add_del_remote_mapping (vat_main_t * vam)
   mp->vni = htonl (vni);
   mp->action = (u8) action;
   mp->is_src_dst = seid_set;
-  mp->eid_len = eid->len;
-  mp->seid_len = seid->len;
   mp->del_all = del_all;
-  mp->eid_type = eid->type;
-  lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
-  lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
+  lisp_eid_put_vat (&mp->deid, eid);
+  lisp_eid_put_vat (&mp->seid, seid);
 
   mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
   clib_memcpy (mp->rlocs, rlocs, data_len);
@@ -15945,16 +15942,11 @@ api_one_add_del_adjacency (vat_main_t * vam)
   unformat_input_t *input = vam->input;
   vl_api_one_add_del_adjacency_t *mp;
   u32 vni = 0;
-  ip4_address_t leid4, reid4;
-  ip6_address_t leid6, reid6;
-  u8 reid_mac[6] = { 0 };
-  u8 leid_mac[6] = { 0 };
-  u8 reid_type, leid_type;
-  u32 leid_len = 0, reid_len = 0, len;
   u8 is_add = 1;
   int ret;
+  lisp_eid_vat_t leid, reid;
 
-  leid_type = reid_type = (u8) ~ 0;
+  leid.type = reid.type = (u8) ~ 0;
 
   /* Parse args required to build the message */
   while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
@@ -15967,39 +15959,25 @@ api_one_add_del_adjacency (vat_main_t * vam)
        {
          is_add = 1;
        }
-      else if (unformat (input, "reid %U/%d", unformat_ip4_address,
-                        &reid4, &len))
+      else if (unformat (input, "reid %U/%d", unformat_ip46_address,
+                        &reid.addr.ip, &reid.len))
        {
-         reid_type = 0;        /* ipv4 */
-         reid_len = len;
-       }
-      else if (unformat (input, "reid %U/%d", unformat_ip6_address,
-                        &reid6, &len))
-       {
-         reid_type = 1;        /* ipv6 */
-         reid_len = len;
+         reid.type = 0;        /* ipv4 */
        }
       else if (unformat (input, "reid %U", unformat_ethernet_address,
-                        reid_mac))
-       {
-         reid_type = 2;        /* mac */
-       }
-      else if (unformat (input, "leid %U/%d", unformat_ip4_address,
-                        &leid4, &len))
+                        &reid.addr.mac))
        {
-         leid_type = 0;        /* ipv4 */
-         leid_len = len;
+         reid.type = 1;        /* mac */
        }
-      else if (unformat (input, "leid %U/%d", unformat_ip6_address,
-                        &leid6, &len))
+      else if (unformat (input, "leid %U/%d", unformat_ip46_address,
+                        &leid.addr.ip, &leid.len))
        {
-         leid_type = 1;        /* ipv6 */
-         leid_len = len;
+         leid.type = 0;        /* ipv4 */
        }
       else if (unformat (input, "leid %U", unformat_ethernet_address,
-                        leid_mac))
+                        &leid.addr.mac))
        {
-         leid_type = 2;        /* mac */
+         leid.type = 1;        /* mac */
        }
       else if (unformat (input, "vni %d", &vni))
        {
@@ -16012,13 +15990,13 @@ api_one_add_del_adjacency (vat_main_t * vam)
        }
     }
 
-  if ((u8) ~ 0 == reid_type)
+  if ((u8) ~ 0 == reid.type)
     {
       errmsg ("missing params!");
       return -99;
     }
 
-  if (leid_type != reid_type)
+  if (leid.type != reid.type)
     {
       errmsg ("remote and local EIDs are of different types!");
       return -99;
@@ -16027,28 +16005,8 @@ api_one_add_del_adjacency (vat_main_t * vam)
   M (ONE_ADD_DEL_ADJACENCY, mp);
   mp->is_add = is_add;
   mp->vni = htonl (vni);
-  mp->leid_len = leid_len;
-  mp->reid_len = reid_len;
-  mp->eid_type = reid_type;
-
-  switch (mp->eid_type)
-    {
-    case 0:
-      clib_memcpy (mp->leid, &leid4, sizeof (leid4));
-      clib_memcpy (mp->reid, &reid4, sizeof (reid4));
-      break;
-    case 1:
-      clib_memcpy (mp->leid, &leid6, sizeof (leid6));
-      clib_memcpy (mp->reid, &reid6, sizeof (reid6));
-      break;
-    case 2:
-      clib_memcpy (mp->leid, leid_mac, 6);
-      clib_memcpy (mp->reid, reid_mac, 6);
-      break;
-    default:
-      errmsg ("unknown EID type %d!", mp->eid_type);
-      return 0;
-    }
+  lisp_eid_put_vat (&mp->leid, &leid);
+  lisp_eid_put_vat (&mp->reid, &reid);
 
   /* send it... */
   S (mp);
@@ -16112,7 +16070,7 @@ api_gpe_set_encap_mode (vat_main_t * vam)
   /* Construct the API message */
   M (GPE_SET_ENCAP_MODE, mp);
 
-  mp->mode = mode;
+  mp->is_vxlan = mode;
 
   /* send it... */
   S (mp);
@@ -16655,38 +16613,30 @@ api_one_eid_table_dump (vat_main_t * vam)
   unformat_input_t *i = vam->input;
   vl_api_one_eid_table_dump_t *mp;
   vl_api_control_ping_t *mp_ping;
-  struct in_addr ip4;
-  struct in6_addr ip6;
-  u8 mac[6];
-  u8 eid_type = ~0, eid_set = 0;
-  u32 prefix_length = ~0, t, vni = 0;
   u8 filter = 0;
   int ret;
-  lisp_nsh_api_t nsh;
+  u32 vni, t = 0;
+  lisp_eid_vat_t eid;
+  u8 eid_set = 0;
 
   while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
     {
-      if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
-       {
-         eid_set = 1;
-         eid_type = 0;
-         prefix_length = t;
-       }
-      else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
+      if (unformat
+         (i, "eid %U/%d", unformat_ip46_address, &eid.addr.ip, &eid.len))
        {
          eid_set = 1;
-         eid_type = 1;
-         prefix_length = t;
+         eid.type = 0;
        }
-      else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
+      else
+       if (unformat (i, "eid %U", unformat_ethernet_address, &eid.addr.mac))
        {
          eid_set = 1;
-         eid_type = 2;
+         eid.type = 1;
        }
-      else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
+      else if (unformat (i, "eid %U", unformat_nsh_address, &eid.addr.nsh))
        {
          eid_set = 1;
-         eid_type = 3;
+         eid.type = 2;
        }
       else if (unformat (i, "vni %d", &t))
        {
@@ -16720,27 +16670,7 @@ api_one_eid_table_dump (vat_main_t * vam)
     {
       mp->eid_set = 1;
       mp->vni = htonl (vni);
-      mp->eid_type = eid_type;
-      switch (eid_type)
-       {
-       case 0:
-         mp->prefix_length = prefix_length;
-         clib_memcpy (mp->eid, &ip4, sizeof (ip4));
-         break;
-       case 1:
-         mp->prefix_length = prefix_length;
-         clib_memcpy (mp->eid, &ip6, sizeof (ip6));
-         break;
-       case 2:
-         clib_memcpy (mp->eid, mac, sizeof (mac));
-         break;
-       case 3:
-         clib_memcpy (mp->eid, &nsh, sizeof (nsh));
-         break;
-       default:
-         errmsg ("unknown EID type %d!", eid_type);
-         return -99;
-       }
+      lisp_eid_put_vat (&mp->eid, &eid);
     }
 
   /* send it... */
@@ -16983,11 +16913,11 @@ api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
   mp->is_add = is_add;
   mp->table_id = clib_host_to_net_u32 (table_id);
   mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
-  mp->is_ip4 = is_ip4;
+  mp->nh_addr.af = is_ip4 ? 0 : 1;
   if (is_ip4)
-    clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
+    clib_memcpy (mp->nh_addr.un.ip4, &ip4, sizeof (ip4));
   else
-    clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
+    clib_memcpy (mp->nh_addr.un.ip6, &ip6, sizeof (ip6));
 
   /* send it... */
   S (mp);
index 39774ba..d14d5ab 100644 (file)
@@ -898,6 +898,7 @@ list(APPEND VNET_SOURCES
   lisp-cp/lisp_cli.c
   lisp-cp/one_api.c
   lisp-cp/lisp_api.c
+  lisp-cp/lisp_types_api.c
 )
 
 list(APPEND VNET_HEADERS
@@ -907,8 +908,10 @@ list(APPEND VNET_HEADERS
   lisp-cp/lisp_cp_messages.h
   lisp-cp/lisp_msg_serdes.h
   lisp-cp/control.h
+  lisp-cp/lisp_types_api.h
 )
 
+list(APPEND VNET_API_FILES lisp-cp/lisp_types.api)
 list(APPEND VNET_API_FILES lisp-cp/lisp.api)
 list(APPEND VNET_API_FILES lisp-cp/one.api)
 
index 604b34d..de4fd51 100644 (file)
  * limitations under the License.
  */
 
-option version = "1.0.0";
+option version = "2.0.0";
 
-typedef local_locator
-{
-  u32 sw_if_index;
-  u8 priority;
-  u8 weight;
-};
+import "vnet/interface_types.api";
+import "vnet/lisp-cp/lisp_types.api";
 
 /** \brief add or delete locator_set
     @param client_index - opaque cookie to identify the sender
@@ -34,8 +30,8 @@ manual_endian manual_print define lisp_add_del_locator_set
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  string locator_set_name[64];
   u32 locator_num;
   vl_api_local_locator_t locators[locator_num];
 };
@@ -65,75 +61,59 @@ autoreply define lisp_add_del_locator
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
-  u32 sw_if_index;
+  bool is_add [default=true];
+  string locator_set_name[64];
+  vl_api_interface_index_t sw_if_index;
   u8 priority;
   u8 weight;
 };
 
 /** \brief add or delete lisp eid-table
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param is_add - add address if non-zero, else delete
-    @param eid_type:
-      0 : ipv4
-      1 : ipv6
-      2 : mac
-    @param eid - EID can be ip4, ip6 or mac
-    @param prefix_len - prefix len
-    @param locator_set_name - name of locator_set to add/del eid-table
-    @param vni - virtual network instance
-    @param key_id
-      HMAC_NO_KEY           0
-      HMAC_SHA_1_96         1
-      HMAC_SHA_256_128      2
-    @param key - secret key
+        @param client_index - opaque cookie to identify the sender
+        @param context - sender context, to match reply w/ request
+        @param is_add - add address if non-zero, else delete
+        @param eid - EID can be ip4, ip6 or mac
+        @param locator_set_name - name of locator_set to add/del eid-table
+        @param vni - virtual network instance
+        @param key - secret key
 */
 autoreply define lisp_add_del_local_eid
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 eid_type;
-  u8 eid[16];
-  u8 prefix_len;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  vl_api_eid_t eid;
+  string locator_set_name[64];
   u32 vni;
-  u16 key_id;
-  u8 key[64];
+  vl_api_hmac_key_t key;
 };
 
 /** \brief Add/delete map server
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
     @param is_add - add address if non-zero; delete otherwise
-    @param is_ipv6 - if non-zero the address is ipv6, else ipv4
     @param ip_address - map server IP address
 */
 autoreply define lisp_add_del_map_server
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  bool is_add [default=true];
+  vl_api_address_t ip_address;
 };
 
 /** \brief add or delete map-resolver
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
     @param is_add - add address if non-zero, else delete
-    @param is_ipv6 - if non-zero the address is ipv6, else ipv4
-    @param ip_address - array of address bytes
+    @param ip_address - ip address
 */
 autoreply define lisp_add_del_map_resolver
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  bool is_add [default=true];
+  vl_api_address_t ip_address;
 };
 
 /** \brief enable or disable LISP feature
@@ -145,7 +125,7 @@ autoreply define lisp_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 /** \brief configure or disable LISP PITR node
@@ -158,24 +138,22 @@ autoreply define lisp_pitr_set_locator_set
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 ls_name[64];
+  bool is_add [default=true];
+  string ls_name[64];
 };
 
 /** \brief configure or disable use of PETR
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param is_ip4 - Address is IPv4 if set and IPv6 otherwise
-    @param address - PETR IP address
+    @param ip_address - PETR IP address
     @param is_add - add locator set if non-zero, else disable pitr
 */
 autoreply define lisp_use_petr
 {
   u32 client_index;
   u32 context;
-  u8 is_ip4;
-  u8 address[16];
-  u8 is_add;
+  vl_api_address_t ip_address;
+  bool is_add [default=true];
 };
 
 /** \brief Request for LISP PETR status
@@ -191,16 +169,14 @@ define show_lisp_use_petr
 /** \brief LISP PETR status, enable or disable
     @param context - sender context, to match reply w/ request
     @param status - LISP PETR enable if non-zero, else disable
-    @param is_ip4 - Address is IPv4 if non-zero, else IPv6
     @param address - PETR IP address
 */
 define show_lisp_use_petr_reply
 {
   u32 context;
   i32 retval;
-  u8 status;
-  u8 is_ip4;
-  u8 address[16];
+  bool is_petr_enable [default=true];
+  vl_api_address_t ip_address;
 };
 
 /** \brief Get state of LISP RLOC probing
@@ -222,7 +198,7 @@ define show_lisp_rloc_probe_state_reply
 {
   u32 context;
   i32 retval;
-  u8 is_enabled;
+  bool is_enabled [default=true];
 };
 
 /** \brief enable/disable LISP RLOC probing
@@ -234,7 +210,7 @@ autoreply define lisp_rloc_probe_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_enabled;
+  bool is_enable [default=true];
 };
 
 /** \brief enable/disable LISP map-register
@@ -246,7 +222,7 @@ autoreply define lisp_map_register_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_enabled;
+  bool is_enable [default=true];
 };
 
 /** \brief Get state of LISP map-register
@@ -267,22 +243,20 @@ define show_lisp_map_register_state_reply
 {
   u32 context;
   i32 retval;
-  u8 is_enabled;
+  bool is_enabled [default=true];
 };
 
 /** \brief set LISP map-request mode. Based on configuration VPP will send
       src/dest or just normal destination map requests.
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param mode - new map-request mode. Supported values are:
-      0 - destination only
-      1 - source/destination
+    @param is_src_dst - if non-zero source/destination else destination only
 */
 autoreply define lisp_map_request_mode
 {
   u32 client_index;
   u32 context;
-  u8 mode;
+  bool is_src_dst;
 };
 
 /** \brief Request for LISP map-request mode
@@ -298,21 +272,13 @@ define show_lisp_map_request_mode
 /** \brief Reply for show_lisp_map_request_mode
     @param context - returned sender context, to match reply w/ request
     @param retval - return code
-    @param mode - map-request mode
+    @param is_src_dst - if non-zero source/destination else destination only
 */
 define show_lisp_map_request_mode_reply
 {
   u32 context;
   i32 retval;
-  u8 mode;
-};
-
-typedef remote_locator
-{
-  u8 is_ip4;
-  u8 priority;
-  u8 weight;
-  u8 addr[16];
+  bool is_src_dst;
 };
 
 /** \brief add or delete remote static mapping
@@ -323,10 +289,6 @@ typedef remote_locator
     @param del_all - if set, delete all remote mappings
     @param vni - virtual network instance
     @param action - negative map-reply action
-    @param eid_type -
-      0 : ipv4
-      1 : ipv6
-      2 : mac
     @param deid - dst EID
     @param seid - src EID, valid only if is_src_dst is enabled
     @param rloc_num - number of remote locators
@@ -336,16 +298,13 @@ autoreply manual_print manual_endian define lisp_add_del_remote_mapping
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_src_dst;
-  u8 del_all;
+  bool is_add [default=true];
+  bool is_src_dst;
+  bool del_all;
   u32 vni;
   u8 action;
-  u8 eid_type;
-  u8 eid[16];
-  u8 eid_len;
-  u8 seid[16];
-  u8 seid_len;
+  vl_api_eid_t deid;
+  vl_api_eid_t seid;
   u32 rloc_num;
   vl_api_remote_locator_t rlocs[rloc_num];
 };
@@ -355,10 +314,6 @@ autoreply manual_print manual_endian define lisp_add_del_remote_mapping
     @param context - sender context, to match reply w/ request
     @param is_add - add address if non-zero, else delete
     @param vni - virtual network instance
-    @param eid_type -
-      0 : ipv4
-      1 : ipv6
-      2 : mac
     @param reid - remote EID
     @param leid - local EID
 */
@@ -366,13 +321,10 @@ autoreply define lisp_add_del_adjacency
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
+  bool is_add [default=true];
   u32 vni;
-  u8 eid_type;
-  u8 reid[16];
-  u8 leid[16];
-  u8 reid_len;
-  u8 leid_len;
+  vl_api_eid_t reid;
+  vl_api_eid_t leid;
 };
 
 /** \brief add or delete map request itr rlocs
@@ -385,8 +337,8 @@ autoreply define lisp_add_del_map_request_itr_rlocs
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  string locator_set_name[64];
 };
 
 /** \brief Reply for lisp_add_del_map_request_itr_rlocs
@@ -405,10 +357,10 @@ autoreply define lisp_eid_table_add_del_map
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
+  bool is_add [default=true];
   u32 vni;
   u32 dp_table;
-  u8 is_l2;
+  bool is_l2;
 };
 
 /** \brief Request for map lisp locator status
@@ -423,7 +375,7 @@ define lisp_locator_dump
   u32 client_index;
   u32 context;
   u32 ls_index;
-  u8 ls_name[64];
+  string ls_name[64];
   u8 is_index_set;
 };
 
@@ -431,6 +383,7 @@ define lisp_locator_dump
     @param local - if is set, then locator is local
     @param locator_set_name - name of the locator_set
     @param sw_if_index - sw_if_index of the locator
+    @param ip_address - ip address
     @param priority - locator priority
     @param weight - locator weight
   */
@@ -438,9 +391,8 @@ define lisp_locator_details
 {
   u32 context;
   u8 local;
-  u32 sw_if_index;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_interface_index_t sw_if_index;
+  vl_api_address_t ip_address;
   u8 priority;
   u8 weight;
 };
@@ -454,23 +406,25 @@ define lisp_locator_set_details
 {
   u32 context;
   u32 ls_index;
-  u8 ls_name[64];
+  string ls_name[64];
+};
+
+enum lisp_locator_set_filter : u8 {
+        LISP_LOCATOR_SET_FILTER_API_ALL = 0,
+        LISP_LOCATOR_SET_FILTER_API_LOCAL = 1,
+        LISP_LOCATOR_SET_FILTER_API_REMOTE = 2,
 };
 
 /** \brief Request for locator_set summary status
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
     @param filter - filter type
-      Supported values:
-        0: all locator sets
-        1: local locator sets
-        2: remote locator sets
  */
 define lisp_locator_set_dump
 {
   u32 client_index;
   u32 context;
-  u8 filter;
+  vl_api_lisp_locator_set_filter_t filter;
 };
 
 /** \brief Dump lisp eid-table
@@ -504,18 +458,14 @@ define lisp_eid_table_details
   u32 context;
   u32 locator_set_index;
   u8 action;
-  u8 is_local;
-  u8 eid_type;
-  u8 is_src_dst;
+  bool is_local;
+  bool is_src_dst;
   u32 vni;
-  u8 eid[16];
-  u8 eid_prefix_len;
-  u8 seid[16];
-  u8 seid_prefix_len;
+  vl_api_eid_t deid;
+  vl_api_eid_t seid;
   u32 ttl;
   u8 authoritative;
-  u16 key_id;
-  u8 key[64];
+  vl_api_hmac_key_t key;
 };
 
 /** \brief Request for eid table summary status
@@ -544,9 +494,8 @@ define lisp_eid_table_dump
   u8 eid_set;
   u8 prefix_length;
   u32 vni;
-  u8 eid_type;
-  u8 eid[16];
-  u8 filter;
+  vl_api_eid_t eid;
+  vl_api_lisp_locator_set_filter_t filter;
 };
 
 /** \brief LISP adjacency
@@ -561,11 +510,8 @@ define lisp_eid_table_dump
   */
 typedef lisp_adjacency
 {
-  u8 eid_type;
-  u8 reid[16];
-  u8 leid[16];
-  u8 reid_prefix_len;
-  u8 leid_prefix_len;
+  vl_api_eid_t reid;
+  vl_api_eid_t leid;
 };
 
 /** \brief LISP adjacency reply
@@ -612,7 +558,7 @@ define lisp_eid_table_map_dump
 {
   u32 client_index;
   u32 context;
-  u8 is_l2;
+  bool is_l2;
 };
 
 /** \brief Dumps all VNIs used in mappings
@@ -636,14 +582,12 @@ define lisp_eid_table_vni_details
 };
 
 /** \brief LISP map resolver status
-    @param is_ipv6 - if non-zero the address is ipv6, else ipv4
     @param ip_address - array of address bytes
  */
 define lisp_map_resolver_details
 {
   u32 context;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_address_t ip_address;
 };
 
 /** \brief Request for map resolver summary status
@@ -657,14 +601,12 @@ define lisp_map_resolver_dump
 };
 
 /** \brief LISP map server details
-    @param is_ipv6 - if non-zero the address is ipv6, else ipv4
     @param ip_address - array of address bytes
  */
 define lisp_map_server_details
 {
   u32 context;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_address_t ip_address;
 };
 
 /** \brief Request for map server summary status
@@ -696,8 +638,8 @@ define show_lisp_status_reply
 {
   u32 context;
   i32 retval;
-  u8 feature_status;
-  u8 gpe_status;
+  bool is_lisp_enabled;
+  bool is_gpe_enabled;
 };
 
 /** \brief Get LISP map request itr rlocs status
@@ -716,7 +658,7 @@ define lisp_get_map_request_itr_rlocs_reply
 {
   u32 context;
   i32 retval;
-  u8 locator_set_name[64];
+  string locator_set_name[64];
 };
 
 /** \brief Request for lisp pitr status
@@ -738,8 +680,8 @@ define show_lisp_pitr_reply
 {
   u32 context;
   i32 retval;
-  u8 status;
-  u8 locator_set_name[64];
+  bool is_enabled;
+  string locator_set_name[64];
 };
 
 /*
@@ -747,4 +689,3 @@ define show_lisp_pitr_reply
  * eval: (c-set-style "gnu")
  * End:
  */
index 4ef4d18..3cb892f 100644 (file)
@@ -24,6 +24,9 @@
 #include <vnet/api_errno.h>
 #include <vnet/lisp-cp/control.h>
 #include <vnet/lisp-gpe/lisp_gpe.h>
+#include <vnet/ip/ip_types_api.h>
+#include <vnet/ethernet/ethernet_types_api.h>
+#include <vnet/lisp-cp/lisp_types_api.h>
 
 #include <vnet/vnet_msg_enum.h>
 
@@ -99,8 +102,9 @@ unformat_lisp_locs (vl_api_remote_locator_t * rmt_locs, u32 rloc_num)
       /* remote locators */
       r = &rmt_locs[i];
       clib_memset (&loc, 0, sizeof (loc));
-      gid_address_ip_set (&loc.address, &r->addr,
-                         r->is_ip4 ? AF_IP4 : AF_IP6);
+      ip_address_decode2 (&r->ip_address, &loc.address.ippref.addr);
+      loc.address.ippref.len =
+       ip_address_max_len (loc.address.ippref.addr.version);
 
       loc.priority = r->priority;
       loc.weight = r->weight;
@@ -198,54 +202,21 @@ vl_api_lisp_add_del_locator_t_handler (vl_api_lisp_add_del_locator_t * mp)
   REPLY_MACRO (VL_API_LISP_ADD_DEL_LOCATOR_REPLY);
 }
 
-static int
-unformat_lisp_eid_api (gid_address_t * dst, u32 vni, u8 type, void *src,
-                      u8 len)
-{
-  switch (type)
-    {
-    case 0:                    /* ipv4 */
-      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP4);
-      gid_address_ippref_len (dst) = len;
-      ip_prefix_normalize (&gid_address_ippref (dst));
-      break;
-    case 1:                    /* ipv6 */
-      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP6);
-      gid_address_ippref_len (dst) = len;
-      ip_prefix_normalize (&gid_address_ippref (dst));
-      break;
-    case 2:                    /* l2 mac */
-      gid_address_type (dst) = GID_ADDR_MAC;
-      clib_memcpy (&gid_address_mac (dst), src, 6);
-      break;
-    default:
-      /* unknown type */
-      return VNET_API_ERROR_INVALID_VALUE;
-    }
-
-  gid_address_vni (dst) = vni;
-
-  return 0;
-}
-
 static void
 vl_api_lisp_add_del_local_eid_t_handler (vl_api_lisp_add_del_local_eid_t * mp)
 {
   vl_api_lisp_add_del_local_eid_reply_t *rmp;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   int rv = 0;
-  gid_address_t _eid, *eid = &_eid;
+  gid_address_t _gid, *gid = &_gid;
   uword *p = NULL;
   u32 locator_set_index = ~0, map_index = ~0;
   vnet_lisp_add_del_mapping_args_t _a, *a = &_a;
   u8 *name = NULL, *key = NULL;
   clib_memset (a, 0, sizeof (a[0]));
-  clib_memset (eid, 0, sizeof (eid[0]));
+  clib_memset (gid, 0, sizeof (gid[0]));
 
-  rv = unformat_lisp_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                             mp->eid_type, mp->eid, mp->prefix_len);
+  rv = unformat_lisp_eid_api (gid, mp->vni, &mp->eid);
   if (rv)
     goto out;
 
@@ -260,16 +231,16 @@ vl_api_lisp_add_del_local_eid_t_handler (vl_api_lisp_add_del_local_eid_t * mp)
     }
   locator_set_index = p[0];
 
-  if (*mp->key)
-    key = format (0, "%s", mp->key);
+  if (mp->key.id)
+    key = format (0, "%s", mp->key.key);
 
   /* XXX treat batch configuration */
   a->is_add = mp->is_add;
-  gid_address_copy (&a->eid, eid);
+  gid_address_copy (&a->eid, gid);
   a->locator_set_index = locator_set_index;
   a->local = 1;
   a->key = key;
-  a->key_id = clib_net_to_host_u16 (mp->key_id);
+  a->key_id = clib_net_to_host_u16 (mp->key.id);
 
   rv = vnet_lisp_add_del_local_mapping (a, &map_index);
 
@@ -302,7 +273,7 @@ vl_api_lisp_add_del_map_server_t_handler (vl_api_lisp_add_del_map_server_t
 
   clib_memset (&addr, 0, sizeof (addr));
 
-  ip_address_set (&addr, mp->ip_address, mp->is_ipv6 ? AF_IP6 : AF_IP4);
+  ip_address_decode2 (&mp->ip_address, &addr);
   rv = vnet_lisp_add_del_map_server (&addr, mp->is_add);
 
   REPLY_MACRO (VL_API_LISP_ADD_DEL_MAP_SERVER_REPLY);
@@ -319,7 +290,7 @@ vl_api_lisp_add_del_map_resolver_t_handler (vl_api_lisp_add_del_map_resolver_t
   clib_memset (a, 0, sizeof (a[0]));
 
   a->is_add = mp->is_add;
-  ip_address_set (&a->address, mp->ip_address, mp->is_ipv6 ? AF_IP6 : AF_IP4);
+  ip_address_decode2 (&mp->ip_address, &a->address);
 
   rv = vnet_lisp_add_del_map_resolver (a);
 
@@ -333,7 +304,7 @@ static void
   vl_api_lisp_map_register_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_map_register_enable_disable (mp->is_enabled);
+  vnet_lisp_map_register_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_LISP_ENABLE_DISABLE_REPLY);
 }
 
@@ -344,7 +315,7 @@ static void
   vl_api_lisp_rloc_probe_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_rloc_probe_enable_disable (mp->is_enabled);
+  vnet_lisp_rloc_probe_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_LISP_ENABLE_DISABLE_REPLY);
 }
 
@@ -354,7 +325,7 @@ vl_api_lisp_enable_disable_t_handler (vl_api_lisp_enable_disable_t * mp)
   vl_api_lisp_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_enable_disable (mp->is_en);
+  vnet_lisp_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_LISP_ENABLE_DISABLE_REPLY);
 }
 
@@ -368,7 +339,7 @@ static void
   /* *INDENT-OFF* */
   REPLY_MACRO2(VL_API_SHOW_LISP_MAP_REQUEST_MODE_REPLY,
   ({
-    rmp->mode = vnet_lisp_get_map_request_mode ();
+    rmp->is_src_dst = vnet_lisp_get_map_request_mode ();
   }));
   /* *INDENT-ON* */
 }
@@ -379,7 +350,7 @@ vl_api_lisp_map_request_mode_t_handler (vl_api_lisp_map_request_mode_t * mp)
   vl_api_lisp_map_request_mode_reply_t *rmp;
   int rv = 0;
 
-  rv = vnet_lisp_set_map_request_mode (mp->mode);
+  rv = vnet_lisp_set_map_request_mode (mp->is_src_dst);
 
   REPLY_MACRO (VL_API_LISP_MAP_REQUEST_MODE_REPLY);
 }
@@ -408,7 +379,7 @@ vl_api_lisp_use_petr_t_handler (vl_api_lisp_use_petr_t * mp)
   int rv = 0;
   ip_address_t addr;
 
-  ip_address_set (&addr, &mp->address, mp->is_ip4 ? AF_IP4 : AF_IP6);
+  ip_address_decode2 (&mp->ip_address, &addr);
   rv = vnet_lisp_use_petr (&addr, mp->is_add);
 
   REPLY_MACRO (VL_API_LISP_USE_PETR_REPLY);
@@ -443,24 +414,8 @@ vl_api_show_lisp_use_petr_t_handler (vl_api_show_lisp_use_petr_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_SHOW_LISP_USE_PETR_REPLY,
   {
-    rmp->status = status;
-    ip_address_t *ip = &gid_address_ip (&addr);
-    switch (ip_addr_version (ip))
-      {
-      case AF_IP4:
-        clib_memcpy (rmp->address, &ip_addr_v4 (ip),
-                     sizeof (ip_addr_v4 (ip)));
-        break;
-
-      case AF_IP6:
-        clib_memcpy (rmp->address, &ip_addr_v6 (ip),
-                     sizeof (ip_addr_v6 (ip)));
-        break;
-
-      default:
-        ASSERT (0);
-      }
-    rmp->is_ip4 = (gid_address_ip_version (&addr) == AF_IP4);
+    rmp->is_petr_enable = status;
+    ip_address_encode2 (&gid_address_ip (&addr), &rmp->ip_address);
   });
   /* *INDENT-ON* */
 }
@@ -500,8 +455,7 @@ static void
 
   clib_memset (eid, 0, sizeof (eid[0]));
 
-  rv = unformat_lisp_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                             mp->eid_type, mp->eid, mp->eid_len);
+  rv = unformat_lisp_eid_api (eid, mp->vni, &mp->deid);
   if (rv)
     goto send_reply;
 
@@ -556,10 +510,8 @@ vl_api_lisp_add_del_adjacency_t_handler (vl_api_lisp_add_del_adjacency_t * mp)
   int rv = 0;
   clib_memset (a, 0, sizeof (a[0]));
 
-  rv = unformat_lisp_eid_api (&a->leid, clib_net_to_host_u32 (mp->vni),
-                             mp->eid_type, mp->leid, mp->leid_len);
-  rv |= unformat_lisp_eid_api (&a->reid, clib_net_to_host_u32 (mp->vni),
-                              mp->eid_type, mp->reid, mp->reid_len);
+  rv = unformat_lisp_eid_api (&a->leid, mp->vni, &mp->leid);
+  rv = unformat_lisp_eid_api (&a->reid, mp->vni, &mp->reid);
 
   if (rv)
     goto send_reply;
@@ -590,8 +542,7 @@ send_lisp_locator_details (lisp_cp_main_t * lcm,
     }
   else
     {
-      rmp->is_ipv6 = gid_address_ip_version (&loc->address);
-      ip_address_copy_addr (rmp->ip_address, &gid_address_ip (&loc->address));
+      ip_address_encode2 (&gid_address_ip (&loc->address), &rmp->ip_address);
     }
   rmp->priority = loc->priority;
   rmp->weight = loc->weight;
@@ -700,70 +651,15 @@ vl_api_lisp_locator_set_dump_t_handler (vl_api_lisp_locator_set_dump_t * mp)
   /* *INDENT-ON* */
 }
 
-static void
-lisp_fid_put_api (u8 * dst, fid_address_t * src, u8 * prefix_length)
-{
-  ASSERT (prefix_length);
-  ip_prefix_t *ippref = &fid_addr_ippref (src);
-
-  switch (fid_addr_type (src))
-    {
-    case FID_ADDR_IP_PREF:
-      if (ip_prefix_version (ippref) == AF_IP4)
-       clib_memcpy (dst, &ip_prefix_v4 (ippref), 4);
-      else
-       clib_memcpy (dst, &ip_prefix_v6 (ippref), 16);
-      prefix_length[0] = ip_prefix_len (ippref);
-      break;
-
-    case FID_ADDR_MAC:
-      prefix_length[0] = 0;
-      clib_memcpy (dst, fid_addr_mac (src), 6);
-      break;
-
-    default:
-      clib_warning ("Unknown FID type %d!", fid_addr_type (src));
-      break;
-    }
-}
-
-static u8
-fid_type_to_api_type (fid_address_t * fid)
-{
-  ip_prefix_t *ippref;
-
-  switch (fid_addr_type (fid))
-    {
-    case FID_ADDR_IP_PREF:
-      ippref = &fid_addr_ippref (fid);
-      if (ip_prefix_version (ippref) == AF_IP4)
-       return 0;
-      else if (ip_prefix_version (ippref) == AF_IP6)
-       return 1;
-      else
-       return ~0;
-
-    case FID_ADDR_MAC:
-      return 2;
-    case FID_ADDR_NSH:
-      return 3;
-    }
-
-  return ~0;
-}
-
 static void
 send_lisp_eid_table_details (mapping_t * mapit,
                             vl_api_registration_t * reg, u32 context,
                             u8 filter)
 {
-  fid_address_t *fid;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *ls = 0;
   vl_api_lisp_eid_table_details_t *rmp = NULL;
   gid_address_t *gid = NULL;
-  u8 *mac = 0;
-  ip_prefix_t *ip_prefix = NULL;
 
   switch (filter)
     {
@@ -788,8 +684,6 @@ send_lisp_eid_table_details (mapping_t * mapit,
     return;
 
   gid = &mapit->eid;
-  ip_prefix = &gid_address_ippref (gid);
-  mac = gid_address_mac (gid);
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   clib_memset (rmp, 0, sizeof (*rmp));
@@ -805,44 +699,26 @@ send_lisp_eid_table_details (mapping_t * mapit,
   rmp->ttl = clib_host_to_net_u32 (mapit->ttl);
   rmp->action = mapit->action;
   rmp->authoritative = mapit->authoritative;
-
   switch (gid_address_type (gid))
     {
     case GID_ADDR_SRC_DST:
+      lisp_fid_put_api (&rmp->seid, &gid_address_sd_src (gid));
+      lisp_fid_put_api (&rmp->deid, &gid_address_sd_dst (gid));
       rmp->is_src_dst = 1;
-      fid = &gid_address_sd_src (gid);
-      rmp->eid_type = fid_type_to_api_type (fid);
-      lisp_fid_put_api (rmp->seid, &gid_address_sd_src (gid),
-                       &rmp->seid_prefix_len);
-      lisp_fid_put_api (rmp->eid, &gid_address_sd_dst (gid),
-                       &rmp->eid_prefix_len);
       break;
     case GID_ADDR_IP_PREFIX:
-      rmp->eid_prefix_len = ip_prefix_len (ip_prefix);
-      if (ip_prefix_version (ip_prefix) == AF_IP4)
-       {
-         rmp->eid_type = 0;    /* ipv4 type */
-         clib_memcpy (rmp->eid, &ip_prefix_v4 (ip_prefix),
-                      sizeof (ip_prefix_v4 (ip_prefix)));
-       }
-      else
-       {
-         rmp->eid_type = 1;    /* ipv6 type */
-         clib_memcpy (rmp->eid, &ip_prefix_v6 (ip_prefix),
-                      sizeof (ip_prefix_v6 (ip_prefix)));
-       }
+      lisp_gid_put_api (&rmp->seid, gid);
       break;
     case GID_ADDR_MAC:
-      rmp->eid_type = 2;       /* l2 mac type */
-      clib_memcpy (rmp->eid, mac, 6);
+      lisp_gid_put_api (&rmp->seid, gid);
       break;
     default:
       ASSERT (0);
     }
   rmp->context = context;
   rmp->vni = clib_host_to_net_u32 (gid_address_vni (gid));
-  rmp->key_id = clib_host_to_net_u16 (mapit->key_id);
-  memcpy (rmp->key, mapit->key, vec_len (mapit->key));
+  rmp->key.id = clib_host_to_net_u16 (mapit->key_id);
+  memcpy (rmp->key.key, mapit->key, vec_len (mapit->key));
   vl_api_send_msg (reg, (u8 *) rmp);
 }
 
@@ -863,8 +739,7 @@ vl_api_lisp_eid_table_dump_t_handler (vl_api_lisp_eid_table_dump_t * mp)
     {
       clib_memset (eid, 0, sizeof (*eid));
 
-      unformat_lisp_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                            mp->eid_type, mp->eid, mp->prefix_length);
+      unformat_lisp_eid_api (eid, mp->vni, &mp->eid);
 
       mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, eid);
       if ((u32) ~ 0 == mi)
@@ -896,23 +771,7 @@ send_lisp_map_server_details (ip_address_t * ip, vl_api_registration_t * reg,
   clib_memset (rmp, 0, sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_LISP_MAP_SERVER_DETAILS);
 
-  switch (ip_addr_version (ip))
-    {
-    case AF_IP4:
-      rmp->is_ipv6 = 0;
-      clib_memcpy (rmp->ip_address, &ip_addr_v4 (ip),
-                  sizeof (ip_addr_v4 (ip)));
-      break;
-
-    case AF_IP6:
-      rmp->is_ipv6 = 1;
-      clib_memcpy (rmp->ip_address, &ip_addr_v6 (ip),
-                  sizeof (ip_addr_v6 (ip)));
-      break;
-
-    default:
-      ASSERT (0);
-    }
+  ip_address_encode2 (ip, &rmp->ip_address);
   rmp->context = context;
 
   vl_api_send_msg (reg, (u8 *) rmp);
@@ -945,23 +804,7 @@ send_lisp_map_resolver_details (ip_address_t * ip,
   clib_memset (rmp, 0, sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_LISP_MAP_RESOLVER_DETAILS);
 
-  switch (ip_addr_version (ip))
-    {
-    case AF_IP4:
-      rmp->is_ipv6 = 0;
-      clib_memcpy (rmp->ip_address, &ip_addr_v4 (ip),
-                  sizeof (ip_addr_v4 (ip)));
-      break;
-
-    case AF_IP6:
-      rmp->is_ipv6 = 1;
-      clib_memcpy (rmp->ip_address, &ip_addr_v6 (ip),
-                  sizeof (ip_addr_v6 (ip)));
-      break;
-
-    default:
-      ASSERT (0);
-    }
+  ip_address_encode2 (ip, &rmp->ip_address);
   rmp->context = context;
 
   vl_api_send_msg (reg, (u8 *) rmp);
@@ -1055,32 +898,9 @@ lisp_adjacency_copy (vl_api_lisp_adjacency_t * dst, lisp_adjacency_t * adjs)
       adj = vec_elt_at_index (adjs, i);
       clib_memset (&a, 0, sizeof (a));
 
-      switch (gid_address_type (&adj->reid))
-       {
-       case GID_ADDR_IP_PREFIX:
-         a.reid_prefix_len = gid_address_ippref_len (&adj->reid);
-         a.leid_prefix_len = gid_address_ippref_len (&adj->leid);
-         if (gid_address_ip_version (&adj->reid) == AF_IP4)
-           {
-             a.eid_type = 0;   /* ipv4 type */
-             clib_memcpy (a.reid, &gid_address_ip (&adj->reid), 4);
-             clib_memcpy (a.leid, &gid_address_ip (&adj->leid), 4);
-           }
-         else
-           {
-             a.eid_type = 1;   /* ipv6 type */
-             clib_memcpy (a.reid, &gid_address_ip (&adj->reid), 16);
-             clib_memcpy (a.leid, &gid_address_ip (&adj->leid), 16);
-           }
-         break;
-       case GID_ADDR_MAC:
-         a.eid_type = 2;       /* l2 mac type */
-         mac_copy (a.reid, gid_address_mac (&adj->reid));
-         mac_copy (a.leid, gid_address_mac (&adj->leid));
-         break;
-       default:
-         ASSERT (0);
-       }
+      lisp_gid_put_api (&a.reid, &adj->reid);
+      lisp_gid_put_api (&a.leid, &adj->leid);
+
       dst[i] = a;
     }
 }
@@ -1180,8 +1000,8 @@ vl_api_show_lisp_status_t_handler (vl_api_show_lisp_status_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2(VL_API_SHOW_LISP_STATUS_REPLY,
   ({
-    rmp->gpe_status = vnet_lisp_gpe_enable_disable_status ();
-    rmp->feature_status = vnet_lisp_enable_disable_status ();
+    rmp->is_gpe_enabled = vnet_lisp_gpe_enable_disable_status ();
+    rmp->is_lisp_enabled = vnet_lisp_enable_disable_status ();
   }));
   /* *INDENT-ON* */
 }
@@ -1254,7 +1074,7 @@ vl_api_show_lisp_pitr_t_handler (vl_api_show_lisp_pitr_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2(VL_API_SHOW_LISP_PITR_REPLY,
   ({
-    rmp->status = lcm->flags & LISP_FLAG_PITR_MODE;
+    rmp->is_enabled = lcm->flags & LISP_FLAG_PITR_MODE;
     strncpy((char *) rmp->locator_set_name, (char *) tmp_str,
             ARRAY_LEN(rmp->locator_set_name) - 1);
   }));
diff --git a/src/vnet/lisp-cp/lisp_types.api b/src/vnet/lisp-cp/lisp_types.api
new file mode 100644 (file)
index 0000000..aab0130
--- /dev/null
@@ -0,0 +1,75 @@
+/* Hey Emacs use -*- mode: C -*- */
+/*
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+option version = "1.0.0";
+
+import "vnet/interface_types.api";
+import "vnet/ethernet/ethernet_types.api";
+import "vnet/ip/ip_types.api";
+
+typedef local_locator
+{
+  vl_api_interface_index_t sw_if_index;
+  u8 priority;
+  u8 weight;
+};
+
+typedef remote_locator
+{
+  u8 priority;
+  u8 weight;
+  vl_api_address_t ip_address;
+};
+
+enum eid_type : u8
+{
+       EID_TYPE_API_PREFIX = 0,
+       EID_TYPE_API_MAC = 1,
+       EID_TYPE_API_NSH = 2,
+};
+
+typedef nsh
+{
+       u32 spi;
+       u8 si;
+};
+
+union eid_address
+{
+       vl_api_prefix_t prefix;
+       vl_api_mac_address_t mac;
+       vl_api_nsh_t nsh;
+};
+
+/* endpoint identifier */
+typedef eid
+{
+       vl_api_eid_type_t type;
+       vl_api_eid_address_t address;
+};
+
+enum hmac_key_id : u8
+{
+       KEY_ID_API_HMAC_NO_KEY = 0,
+       KEY_ID_API_HMAC_SHA_1_96 = 1,
+       KEY_ID_API_HMAC_SHA_256_128 = 2,
+};
+
+typedef hmac_key
+{
+       vl_api_hmac_key_id_t id;
+       u8 key[64];
+};
diff --git a/src/vnet/lisp-cp/lisp_types_api.c b/src/vnet/lisp-cp/lisp_types_api.c
new file mode 100644 (file)
index 0000000..e966f62
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ *------------------------------------------------------------------
+ *
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *------------------------------------------------------------------
+ */
+
+#include <vnet/lisp-cp/lisp_types_api.h>
+#include <vnet/ip/ip_types_api.h>
+#include <vnet/ethernet/ethernet_types_api.h>
+
+int
+unformat_lisp_eid_api (gid_address_t * dst, u32 vni, const vl_api_eid_t * eid)
+{
+  switch (eid->type)
+    {
+    case EID_TYPE_API_PREFIX:                  /* ip prefix */
+      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
+      ip_address_decode2 (&eid->address.prefix.address, &dst->ippref.addr);
+      gid_address_ippref_len (dst) = eid->address.prefix.len;
+      ip_prefix_normalize (&gid_address_ippref (dst));
+      break;
+    case EID_TYPE_API_MAC:                     /* l2 mac */
+      gid_address_type (dst) = GID_ADDR_MAC;
+      mac_address_decode (eid->address.mac, (mac_address_t *) gid_address_mac (dst));
+      break;
+    default:
+      /* unknown type */
+      return VNET_API_ERROR_INVALID_VALUE;
+    }
+
+  gid_address_vni (dst) = clib_net_to_host_u32 (vni);
+
+  return 0;
+}
+
+void
+lisp_fid_put_api (vl_api_eid_t * eid, const fid_address_t * fid)
+{
+  switch (fid_addr_type (fid))
+    {
+    case FID_ADDR_IP_PREF:
+      ip_prefix_encode2 (&fid_addr_ippref (fid), &eid->address.prefix);
+      eid->type = EID_TYPE_API_PREFIX;
+      break;
+
+    case FID_ADDR_MAC:
+      mac_address_encode ((mac_address_t *) fid_addr_mac (fid), eid->address.mac);
+      eid->type = EID_TYPE_API_MAC;
+      break;
+
+    default:
+      clib_warning ("Unknown FID type %d!", fid_addr_type (fid));
+      break;
+    }
+}
+
+void
+lisp_gid_put_api (vl_api_eid_t * eid, const gid_address_t * gid)
+{
+  switch (gid_address_type (gid))
+    {
+    case GID_ADDR_IP_PREFIX:
+      ip_prefix_encode2 (&gid_address_ippref (gid), &eid->address.prefix);
+      eid->type = EID_TYPE_API_PREFIX;
+      break;
+
+    case GID_ADDR_MAC:
+      mac_address_encode ((mac_address_t *) gid_address_mac (gid), eid->address.mac);
+      eid->type = EID_TYPE_API_MAC;
+      break;
+
+    default:
+      clib_warning ("Unknown GID type %d!", gid_address_type (gid));
+      break;
+    }
+}
diff --git a/src/vnet/lisp-cp/lisp_types_api.h b/src/vnet/lisp-cp/lisp_types_api.h
new file mode 100644 (file)
index 0000000..c1aa9dc
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ *------------------------------------------------------------------
+ *
+ * Copyright (c) 2020 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *------------------------------------------------------------------
+ */
+
+#include <vnet/lisp-cp/lisp_types.h>
+#include <vnet/lisp-cp/lisp.api_types.h>
+
+int unformat_lisp_eid_api (gid_address_t * dst, u32 vni, const vl_api_eid_t * eid);
+
+void lisp_fid_put_api (vl_api_eid_t * eid, const fid_address_t * fid);
+
+void lisp_gid_put_api (vl_api_eid_t * eid, const gid_address_t * gid);
index bc3f1b1..7318ba4 100644 (file)
  * limitations under the License.
  */
 
-option version = "1.0.0";
+option version = "2.0.0";
 
-typedef one_local_locator
-{
-  u32 sw_if_index;
-  u8 priority;
-  u8 weight;
-};
+import "vnet/interface_types.api";
+import "vnet/lisp-cp/lisp_types.api";
 
 /** \brief add or delete locator_set
     @param client_index - opaque cookie to identify the sender
@@ -34,10 +30,10 @@ manual_endian manual_print define one_add_del_locator_set
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  string locator_set_name[64];
   u32 locator_num;
-  vl_api_one_local_locator_t locators[locator_num];
+  vl_api_local_locator_t locators[locator_num];
 };
 
 /** \brief Reply for locator_set add/del
@@ -65,13 +61,14 @@ autoreply define one_add_del_locator
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
-  u32 sw_if_index;
+  bool is_add [default=true];
+  string locator_set_name[64];
+  vl_api_interface_index_t sw_if_index;
   u8 priority;
   u8 weight;
 };
 
+
 /** \brief add or delete ONE eid-table
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
@@ -84,24 +81,17 @@ autoreply define one_add_del_locator
     @param prefix_len - prefix len
     @param locator_set_name - name of locator_set to add/del eid-table
     @param vni - virtual network instance
-    @param key_id
-      HMAC_NO_KEY           0
-      HMAC_SHA_1_96         1
-      HMAC_SHA_256_128      2
     @param key - secret key
 */
 autoreply define one_add_del_local_eid
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 eid_type;
-  u8 eid[16];
-  u8 prefix_len;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  vl_api_eid_t eid;
+  string locator_set_name[64];
   u32 vni;
-  u16 key_id;
-  u8 key[64];
+  vl_api_hmac_key_t key;
 };
 
 /** \brief Set TTL for map register messages
@@ -149,9 +139,8 @@ autoreply define one_add_del_map_server
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  bool is_add [default=true];
+  vl_api_address_t ip_address;
 };
 
 /** \brief add or delete map-resolver
@@ -165,21 +154,20 @@ autoreply define one_add_del_map_resolver
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  bool is_add [default=true];
+  vl_api_address_t ip_address;
 };
 
 /** \brief enable or disable ONE feature
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param is_en - enable protocol if non-zero, else disable
+    @param is_enable - enable protocol if non-zero, else disable
 */
 autoreply define one_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 /** \brief configure or delete ONE NSH mapping
@@ -192,8 +180,8 @@ autoreply define one_nsh_set_locator_set
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 ls_name[64];
+  bool is_add [default=true];
+  string ls_name[64];
 };
 
 /** \brief configure or disable ONE PITR node
@@ -206,8 +194,8 @@ autoreply define one_pitr_set_locator_set
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 ls_name[64];
+  bool is_add [default=true];
+  string ls_name[64];
 };
 
 /** \brief configure or disable use of PETR
@@ -221,9 +209,8 @@ autoreply define one_use_petr
 {
   u32 client_index;
   u32 context;
-  u8 is_ip4;
-  u8 address[16];
-  u8 is_add;
+  vl_api_address_t ip_address;
+  bool is_add [default=true];
 };
 
 /** \brief Request for ONE PETR status
@@ -238,7 +225,7 @@ define show_one_use_petr
 
 /** \brief ONE PETR status, enable or disable
     @param context - sender context, to match reply w/ request
-    @param status - ONE PETR enable if non-zero, else disable
+    @param enable - ONE PETR enable if non-zero, else disable
     @param is_ip4 - Address is IPv4 if non-zero, else IPv6
     @param address - PETR IP address
 */
@@ -246,9 +233,8 @@ define show_one_use_petr_reply
 {
   u32 context;
   i32 retval;
-  u8 status;
-  u8 is_ip4;
-  u8 address[16];
+  bool status;
+  vl_api_address_t ip_address;
 };
 
 /** \brief Get state of ONE RLOC probing
@@ -264,13 +250,13 @@ define show_one_rloc_probe_state
 /** \brief Reply for show_one_rloc_probe_state
     @param context - returned sender context, to match reply w/ request
     @param retval - return code
-    @param is_enabled - state of RLOC probing
+    @param is_enable - state of RLOC probing
 */
 define show_one_rloc_probe_state_reply
 {
   u32 context;
   i32 retval;
-  u8 is_enabled;
+  bool is_enable;
 };
 
 /** \brief enable/disable ONE RLOC probing
@@ -282,7 +268,7 @@ autoreply define one_rloc_probe_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_enabled;
+  bool is_enable [default=true];
 };
 
 /** \brief enable/disable ONE map-register
@@ -294,7 +280,7 @@ autoreply define one_map_register_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_enabled;
+  bool is_enable [default=true];
 };
 
 /** \brief Get state of ONE map-register
@@ -315,7 +301,13 @@ define show_one_map_register_state_reply
 {
   u32 context;
   i32 retval;
-  u8 is_enabled;
+  bool is_enable;
+};
+
+enum one_map_mode
+{
+       ONE_MAP_MODE_API_DST_ONLY = 0,
+       ONE_MAP_MODE_API_SRC_DST = 1,
 };
 
 /** \brief set ONE map-request mode. Based on configuration VPP will send
@@ -330,7 +322,7 @@ autoreply define one_map_request_mode
 {
   u32 client_index;
   u32 context;
-  u8 mode;
+  vl_api_one_map_mode_t mode;
 };
 
 /** \brief Request for ONE map-request mode
@@ -352,15 +344,7 @@ define show_one_map_request_mode_reply
 {
   u32 context;
   i32 retval;
-  u8 mode;
-};
-
-typedef one_remote_locator
-{
-  u8 is_ip4;
-  u8 priority;
-  u8 weight;
-  u8 addr[16];
+  vl_api_one_map_mode_t mode;
 };
 
 /** \brief add or delete remote static mapping
@@ -371,16 +355,6 @@ typedef one_remote_locator
     @param del_all - if set, delete all remote mappings
     @param vni - virtual network instance
     @param action - negative map-reply action
-    @param eid_type -
-      0 : ipv4
-      1 : ipv6
-      2 : mac
-      3 : NSH : both information (service path ID and service index) are
-        encoded in 'eid' field in a following way:
-
-        |4 B |1 B |
-        -----------
-        |SPI | SI |
     @param deid - dst EID
     @param seid - src EID, valid only if is_src_dst is enabled
     @param rloc_num - number of remote locators
@@ -390,18 +364,21 @@ autoreply manual_print manual_endian define one_add_del_remote_mapping
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_src_dst;
-  u8 del_all;
+  bool is_add [default=true];
+  bool is_src_dst;
+  bool del_all;
   u32 vni;
   u8 action;
-  u8 eid_type;
-  u8 eid[16];
-  u8 eid_len;
-  u8 seid[16];
-  u8 seid_len;
+  vl_api_eid_t deid;
+  vl_api_eid_t seid;
   u32 rloc_num;
-  vl_api_one_remote_locator_t rlocs[rloc_num];
+  vl_api_remote_locator_t rlocs[rloc_num];
+};
+
+typedef one_l2_arp_entry
+{
+  vl_api_mac_address_t mac;
+  vl_api_ip4_address_t ip4;
 };
 
 /** \brief Add/delete L2 ARP entries
@@ -409,17 +386,15 @@ autoreply manual_print manual_endian define one_add_del_remote_mapping
     @param context - sender context, to match reply w/ request
     @param is_add - add if non-zero; delete otherwise
     @param bd - bridge domain
-    @param mac - MAC address
-    @param ip4 - IPv4 address
+    @param entry - ARP entry
 */
 autoreply define one_add_del_l2_arp_entry
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 mac[6];
+  bool is_add [default=true];
   u32 bd;
-  u32 ip4;
+  vl_api_one_l2_arp_entry_t entry;
 };
 
 /** \brief Request for L2 ARP entries from specified bridge domain
@@ -434,12 +409,6 @@ define one_l2_arp_entries_get
   u32 bd;
 };
 
-typedef one_l2_arp_entry
-{
-  u8 mac[6];
-  u32 ip4;
-};
-
 /** \brief Reply with L2 ARP entries from specified bridge domain
     @param context - sender context, to match reply w/ request
     @param retval - error code
@@ -454,14 +423,20 @@ manual_print manual_endian define one_l2_arp_entries_get_reply
   vl_api_one_l2_arp_entry_t entries[count];
 };
 
+typedef one_ndp_entry
+{
+  vl_api_mac_address_t mac;
+  vl_api_ip6_address_t ip6;
+};
+
+
 autoreply define one_add_del_ndp_entry
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 mac[6];
+  bool is_add [default=true];
   u32 bd;
-  u8 ip6[16];
+  vl_api_one_ndp_entry_t entry;
 };
 
 define one_ndp_entries_get
@@ -471,12 +446,6 @@ define one_ndp_entries_get
   u32 bd;
 };
 
-typedef one_ndp_entry
-{
-  u8 mac[6];
-  u8 ip6[16];
-};
-
 manual_print manual_endian define one_ndp_entries_get_reply
 {
   u32 context;
@@ -563,10 +532,6 @@ manual_print manual_endian define one_l2_arp_bd_get_reply
     @param context - sender context, to match reply w/ request
     @param is_add - add address if non-zero, else delete
     @param vni - virtual network instance
-    @param eid_type -
-      0 : ipv4
-      1 : ipv6
-      2 : mac
     @param reid - remote EID
     @param leid - local EID
 */
@@ -576,11 +541,8 @@ autoreply define one_add_del_adjacency
   u32 context;
   u8 is_add;
   u32 vni;
-  u8 eid_type;
-  u8 reid[16];
-  u8 leid[16];
-  u8 reid_len;
-  u8 leid_len;
+  vl_api_eid_t reid;
+  vl_api_eid_t leid;
 };
 
 /** \brief add or delete map request itr rlocs
@@ -593,8 +555,8 @@ autoreply define one_add_del_map_request_itr_rlocs
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 locator_set_name[64];
+  bool is_add [default=true];
+  string locator_set_name[64];
 };
 
 /** \brief map/unmap vni/bd_index to vrf
@@ -603,15 +565,16 @@ autoreply define one_add_del_map_request_itr_rlocs
     @param is_add - add or delete mapping
     @param dp_table - virtual network id/bridge domain index
     @param vrf - vrf
+    @param is_l2 - is l2
 */
 autoreply define one_eid_table_add_del_map
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
+  bool is_add [default=true];
   u32 vni;
   u32 dp_table;
-  u8 is_l2;
+  bool is_l2;
 };
 
 /** \brief Request for map one locator status
@@ -626,8 +589,8 @@ define one_locator_dump
   u32 client_index;
   u32 context;
   u32 ls_index;
-  u8 ls_name[64];
-  u8 is_index_set;
+  string ls_name[64];
+  bool is_index_set;
 };
 
 /** \brief ONE locator_set status
@@ -641,9 +604,8 @@ define one_locator_details
 {
   u32 context;
   u8 local;
-  u32 sw_if_index;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_interface_index_t sw_if_index;
+  vl_api_address_t ip_address;
   u8 priority;
   u8 weight;
 };
@@ -657,7 +619,14 @@ define one_locator_set_details
 {
   u32 context;
   u32 ls_index;
-  u8 ls_name[64];
+  string ls_name[64];
+};
+
+enum one_filter
+{
+       ONE_FILTER_API_ALL = 0,
+       ONE_FILTER_API_LOCAL = 1,
+       ONE_FILTER_API_REMOTE = 2,
 };
 
 /** \brief Request for locator_set summary status
@@ -673,7 +642,7 @@ define one_locator_set_dump
 {
   u32 client_index;
   u32 context;
-  u8 filter;
+  vl_api_one_filter_t filter;
 };
 
 /** \brief Dump ONE eid-table
@@ -683,42 +652,30 @@ define one_locator_set_dump
                                 is negative
     @param action - negative map request action
     @param is_local - local if non-zero, else remote
-    @param eid_type:
-      0 : ipv4
-      1 : ipv6
-      2 : mac
     @param is_src_dst - EID is type of source/destination
-    @param eid - EID can be ip4, ip6 or mac
-    @param eid_prefix_len - prefix length
+    @param deid - EID can be ip4, ip6 or mac
     @param seid - source EID can be ip4, ip6 or mac
-    @param seid_prefix_len - source prefix length
     @param vni - virtual network instance
     @param ttl - time to live
     @param authoritative - authoritative
-    @param key_id
-      HMAC_NO_KEY           0
-      HMAC_SHA_1_96         1
-      HMAC_SHA_256_128      2
     @param key - secret key
 */
 
+// FIXME: action, authoritative
+
 define one_eid_table_details
 {
   u32 context;
   u32 locator_set_index;
   u8 action;
-  u8 is_local;
-  u8 eid_type;
-  u8 is_src_dst;
+  bool is_local;
+  bool is_src_dst;
   u32 vni;
-  u8 eid[16];
-  u8 eid_prefix_len;
-  u8 seid[16];
-  u8 seid_prefix_len;
+  vl_api_eid_t deid;
+  vl_api_eid_t seid;
   u32 ttl;
   u8 authoritative;
-  u16 key_id;
-  u8 key[64];
+  vl_api_hmac_key_t key;
 };
 
 /** \brief Request for eid table summary status
@@ -726,19 +683,6 @@ define one_eid_table_details
     @param context - sender context, to match reply w/ request
     @param eid_set - if non-zero request info about specific mapping
     @param vni - virtual network instance; valid only if eid_set != 0
-    @param prefix_length - prefix length if EID is IP address;
-      valid only if eid_set != 0
-    @param eid_type - EID type; valid only if eid_set != 0
-      Supported values:
-        0: EID is IPv4
-        1: EID is IPv6
-        2: EID is ethernet address
-        3 : NSH : both information (service path ID and service index) are
-          encoded in 'eid' field in a following way:
-
-          |4 B |1 B |
-          -----------
-          |SPI | SI |
     @param eid - endpoint identifier
     @param filter - filter type;
       Support values:
@@ -750,12 +694,10 @@ define one_eid_table_dump
 {
   u32 client_index;
   u32 context;
-  u8 eid_set;
-  u8 prefix_length;
+  bool eid_set;
   u32 vni;
-  u8 eid_type;
-  u8 eid[16];
-  u8 filter;
+  vl_api_eid_t eid;
+  vl_api_one_filter_t filter;
 };
 
 /** \brief ONE adjacency
@@ -770,11 +712,8 @@ define one_eid_table_dump
   */
 typedef one_adjacency
 {
-  u8 eid_type;
-  u8 reid[16];
-  u8 leid[16];
-  u8 reid_prefix_len;
-  u8 leid_prefix_len;
+  vl_api_eid_t reid;
+  vl_api_eid_t leid;
 };
 
 /** \brief ONE adjacency reply
@@ -821,7 +760,7 @@ define one_eid_table_map_dump
 {
   u32 client_index;
   u32 context;
-  u8 is_l2;
+  bool is_l2;
 };
 
 /** \brief Dumps all VNIs used in mappings
@@ -851,8 +790,7 @@ define one_eid_table_vni_details
 define one_map_resolver_details
 {
   u32 context;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_address_t ip_address;
 };
 
 /** \brief Request for map resolver summary status
@@ -872,8 +810,7 @@ define one_map_resolver_dump
 define one_map_server_details
 {
   u32 context;
-  u8 is_ipv6;
-  u8 ip_address[16];
+  vl_api_address_t ip_address;
 };
 
 /** \brief Request for map server summary status
@@ -905,8 +842,8 @@ define show_one_status_reply
 {
   u32 context;
   i32 retval;
-  u8 feature_status;
-  u8 gpe_status;
+  bool feature_status;
+  bool gpe_status;
 };
 
 /** \brief Get ONE map request itr rlocs status
@@ -925,7 +862,7 @@ define one_get_map_request_itr_rlocs_reply
 {
   u32 context;
   i32 retval;
-  u8 locator_set_name[64];
+  string locator_set_name[64];
 };
 
 /** \brief Request for ONE NSH mapping
@@ -947,8 +884,8 @@ define show_one_nsh_mapping_reply
 {
   u32 context;
   i32 retval;
-  u8 is_set;
-  u8 locator_set_name[64];
+  bool is_set;
+  string locator_set_name[64];
 };
 
 /** \brief Request for ONE PITR status
@@ -970,8 +907,8 @@ define show_one_pitr_reply
 {
   u32 context;
   i32 retval;
-  u8 status;
-  u8 locator_set_name[64];
+  bool status;
+  string locator_set_name[64];
 };
 
 define one_stats_dump
@@ -984,14 +921,10 @@ define one_stats_details
 {
   u32 context;
   u32 vni;
-  u8 eid_type;
-  u8 deid[16];
-  u8 seid[16];
-  u8 deid_pref_len;
-  u8 seid_pref_len;
-  u8 is_ip4;
-  u8 rloc[16];
-  u8 lloc[16];
+  vl_api_eid_t deid;
+  vl_api_eid_t seid;
+  vl_api_address_t rloc;
+  vl_api_address_t lloc;
 
   u32 pkt_count;
   u32 bytes;
@@ -1007,7 +940,7 @@ autoreply define one_stats_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 define show_one_stats_enable_disable
@@ -1020,7 +953,7 @@ define show_one_stats_enable_disable_reply
 {
   u32 context;
   i32 retval;
-  u8 is_en;
+  bool is_enable;
 };
 
 autoreply define one_map_register_fallback_threshold
@@ -1047,7 +980,7 @@ autoreply define one_enable_disable_xtr_mode
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 define one_show_xtr_mode
@@ -1060,14 +993,14 @@ define one_show_xtr_mode_reply
 {
   u32 context;
   i32 retval;
-  u8 is_en;
+  bool is_enable;
 };
 
 autoreply define one_enable_disable_petr_mode
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 define one_show_petr_mode
@@ -1080,14 +1013,14 @@ define one_show_petr_mode_reply
 {
   u32 context;
   i32 retval;
-  u8 is_en;
+  bool is_enable;
 };
 
 autoreply define one_enable_disable_pitr_mode
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 define one_show_pitr_mode
@@ -1100,7 +1033,7 @@ define one_show_pitr_mode_reply
 {
   u32 context;
   i32 retval;
-  u8 is_en;
+  bool is_enable;
 };
 
 /*
index d1117ee..912b9df 100644 (file)
@@ -25,6 +25,9 @@
 #include <vnet/lisp-cp/control.h>
 #include <vnet/lisp-gpe/lisp_gpe.h>
 
+#include <vnet/ip/ip_types_api.h>
+#include <vnet/ethernet/ethernet_types_api.h>
+
 #include <vnet/vnet_msg_enum.h>
 
 #define vl_api_one_add_del_locator_set_t_endian vl_noop_handler
@@ -135,19 +138,20 @@ _(ONE_SHOW_PETR_MODE, one_show_petr_mode)                               \
 
 
 static locator_t *
-unformat_one_locs (vl_api_one_remote_locator_t * rmt_locs, u32 rloc_num)
+unformat_one_locs (vl_api_remote_locator_t * rmt_locs, u32 rloc_num)
 {
   u32 i;
   locator_t *locs = 0, loc;
-  vl_api_one_remote_locator_t *r;
+  vl_api_remote_locator_t *r;
 
   for (i = 0; i < rloc_num; i++)
     {
       /* remote locators */
       r = &rmt_locs[i];
       clib_memset (&loc, 0, sizeof (loc));
-      gid_address_ip_set (&loc.address, &r->addr,
-                         r->is_ip4 ? AF_IP4 : AF_IP6);
+      ip_address_decode2 (&r->ip_address, &loc.address.ippref.addr);
+      loc.address.ippref.len =
+       ip_address_max_len (loc.address.ippref.addr.version);
 
       loc.priority = r->priority;
       loc.weight = r->weight;
@@ -194,7 +198,7 @@ vl_api_one_add_del_locator_set_t_handler (vl_api_one_add_del_locator_set_t *
   int rv = 0;
   vnet_lisp_add_del_locator_set_args_t _a, *a = &_a;
   locator_t locator;
-  vl_api_one_local_locator_t *ls_loc;
+  vl_api_local_locator_t *ls_loc;
   u32 ls_index = ~0, locator_num;
   u8 *locator_name = NULL;
   int i;
@@ -281,34 +285,31 @@ typedef struct
 } __attribute__ ((__packed__)) lisp_nsh_api_t;
 
 static int
-unformat_one_eid_api (gid_address_t * dst, u32 vni, u8 type, void *src,
-                     u8 len)
+unformat_one_eid_api (gid_address_t * dst, u32 vni, vl_api_eid_t * eid)
 {
-  lisp_nsh_api_t *nsh;
+  fib_prefix_t prefix;
 
-  switch (type)
+  switch (eid->type)
     {
-    case 0:                    /* ipv4 */
-      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP4);
-      gid_address_ippref_len (dst) = len;
-      ip_prefix_normalize (&gid_address_ippref (dst));
-      break;
-    case 1:                    /* ipv6 */
+    case EID_TYPE_API_PREFIX:
+      ip_prefix_decode (&eid->address.prefix, &prefix);
       gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP6);
-      gid_address_ippref_len (dst) = len;
+      if (prefix.fp_proto == FIB_PROTOCOL_IP4)
+       gid_address_ip_set (dst, &prefix.fp_addr.ip4, AF_IP4);
+      if (prefix.fp_proto == FIB_PROTOCOL_IP6)
+       gid_address_ip_set (dst, &prefix.fp_addr.ip6, AF_IP6);
+      gid_address_ippref_len (dst) = prefix.fp_len;
       ip_prefix_normalize (&gid_address_ippref (dst));
       break;
-    case 2:                    /* l2 mac */
+    case EID_TYPE_API_MAC:
       gid_address_type (dst) = GID_ADDR_MAC;
-      clib_memcpy (&gid_address_mac (dst), src, 6);
+      mac_address_decode (eid->address.mac,
+                         (mac_address_t *) & gid_address_mac (dst));
       break;
-    case 3:                    /* NSH */
+    case EID_TYPE_API_NSH:
       gid_address_type (dst) = GID_ADDR_NSH;
-      nsh = src;
-      gid_address_nsh_spi (dst) = clib_net_to_host_u32 (nsh->spi);
-      gid_address_nsh_si (dst) = nsh->si;
+      gid_address_nsh_spi (dst) = clib_net_to_host_u32 (eid->address.nsh.spi);
+      gid_address_nsh_si (dst) = eid->address.nsh.si;
       break;
     default:
       /* unknown type */
@@ -320,6 +321,32 @@ unformat_one_eid_api (gid_address_t * dst, u32 vni, u8 type, void *src,
   return 0;
 }
 
+static void
+fid_to_api_eid (fid_address_t * fid, vl_api_eid_t * eid)
+{
+  fib_prefix_t fib_prefix;
+  u32 eid_type;
+
+  switch (fid_addr_type (fid))
+    {
+    case FID_ADDR_IP_PREF:
+      eid_type = EID_TYPE_API_PREFIX;
+      ip_prefix_to_fib_prefix (&fid_addr_ippref (fid), &fib_prefix);
+      ip_prefix_encode (&fib_prefix, &eid->address.prefix);
+      break;
+    case FID_ADDR_MAC:
+      eid_type = EID_TYPE_API_MAC;
+      mac_address_encode ((mac_address_t *) fid_addr_mac (fid),
+                         eid->address.mac);
+      break;
+    default:
+      /* unknown type */
+      return;
+    }
+
+  eid->type = eid_type;
+}
+
 static void
 vl_api_one_add_del_local_eid_t_handler (vl_api_one_add_del_local_eid_t * mp)
 {
@@ -334,8 +361,7 @@ vl_api_one_add_del_local_eid_t_handler (vl_api_one_add_del_local_eid_t * mp)
   clib_memset (a, 0, sizeof (a[0]));
   clib_memset (eid, 0, sizeof (eid[0]));
 
-  rv = unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                            mp->eid_type, mp->eid, mp->prefix_len);
+  rv = unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni), &mp->eid);
   if (rv)
     goto out;
 
@@ -356,8 +382,8 @@ vl_api_one_add_del_local_eid_t_handler (vl_api_one_add_del_local_eid_t * mp)
     }
   locator_set_index = p[0];
 
-  if (*mp->key)
-    key = format (0, "%s", mp->key);
+  if (mp->key.id != KEY_ID_API_HMAC_NO_KEY)
+    key = format (0, "%s", mp->key.key);
 
   /* XXX treat batch configuration */
   a->is_add = mp->is_add;
@@ -365,7 +391,7 @@ vl_api_one_add_del_local_eid_t_handler (vl_api_one_add_del_local_eid_t * mp)
   a->locator_set_index = locator_set_index;
   a->local = 1;
   a->key = key;
-  a->key_id = clib_net_to_host_u16 (mp->key_id);
+  a->key_id = mp->key.id;
 
   rv = vnet_lisp_add_del_local_mapping (a, &map_index);
 
@@ -397,7 +423,8 @@ vl_api_one_add_del_map_server_t_handler (vl_api_one_add_del_map_server_t * mp)
 
   clib_memset (&addr, 0, sizeof (addr));
 
-  ip_address_set (&addr, mp->ip_address, mp->is_ipv6 ? AF_IP6 : AF_IP4);
+  ip_address_decode2 (&mp->ip_address, &addr);
+
   rv = vnet_lisp_add_del_map_server (&addr, mp->is_add);
 
   REPLY_MACRO (VL_API_ONE_ADD_DEL_MAP_SERVER_REPLY);
@@ -413,8 +440,9 @@ vl_api_one_add_del_map_resolver_t_handler (vl_api_one_add_del_map_resolver_t
 
   clib_memset (a, 0, sizeof (a[0]));
 
+  ip_address_decode2 (&mp->ip_address, &a->address);
+
   a->is_add = mp->is_add;
-  ip_address_set (&a->address, mp->ip_address, mp->is_ipv6 ? AF_IP6 : AF_IP4);
 
   rv = vnet_lisp_add_del_map_resolver (a);
 
@@ -428,7 +456,7 @@ static void
   vl_api_one_map_register_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_map_register_enable_disable (mp->is_enabled);
+  vnet_lisp_map_register_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_REPLY);
 }
 
@@ -439,7 +467,7 @@ static void
   vl_api_one_rloc_probe_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_rloc_probe_enable_disable (mp->is_enabled);
+  vnet_lisp_rloc_probe_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_REPLY);
 }
 
@@ -449,7 +477,7 @@ vl_api_one_enable_disable_t_handler (vl_api_one_enable_disable_t * mp)
   vl_api_one_enable_disable_reply_t *rmp;
   int rv = 0;
 
-  vnet_lisp_enable_disable (mp->is_en);
+  vnet_lisp_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_REPLY);
 }
 
@@ -520,7 +548,8 @@ vl_api_one_use_petr_t_handler (vl_api_one_use_petr_t * mp)
   int rv = 0;
   ip_address_t addr;
 
-  ip_address_set (&addr, &mp->address, mp->is_ip4 ? AF_IP4 : AF_IP6);
+  ip_address_decode2 (&mp->ip_address, &addr);
+
   rv = vnet_lisp_use_petr (&addr, mp->is_add);
 
   REPLY_MACRO (VL_API_ONE_USE_PETR_REPLY);
@@ -557,22 +586,8 @@ vl_api_show_one_use_petr_t_handler (vl_api_show_one_use_petr_t * mp)
   {
     rmp->status = status;
     ip_address_t *ip = &gid_address_ip (&addr);
-    switch (ip_addr_version (ip))
-      {
-      case AF_IP4:
-        clib_memcpy (rmp->address, &ip_addr_v4 (ip),
-                     sizeof (ip_addr_v4 (ip)));
-        break;
-
-      case AF_IP6:
-        clib_memcpy (rmp->address, &ip_addr_v6 (ip),
-                     sizeof (ip_addr_v6 (ip)));
-        break;
-
-      default:
-        ASSERT (0);
-      }
-    rmp->is_ip4 = (gid_address_ip_version (&addr) == AF_IP4);
+
+    ip_address_encode2 (ip, &rmp->ip_address);
   });
   /* *INDENT-ON* */
 }
@@ -612,8 +627,7 @@ static void
 
   clib_memset (eid, 0, sizeof (eid[0]));
 
-  rv = unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                            mp->eid_type, mp->eid, mp->eid_len);
+  rv = unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni), &mp->deid);
   if (rv)
     goto send_reply;
 
@@ -666,10 +680,12 @@ vl_api_one_add_del_adjacency_t_handler (vl_api_one_add_del_adjacency_t * mp)
   int rv = 0;
   clib_memset (a, 0, sizeof (a[0]));
 
-  rv = unformat_one_eid_api (&a->leid, clib_net_to_host_u32 (mp->vni),
-                            mp->eid_type, mp->leid, mp->leid_len);
-  rv |= unformat_one_eid_api (&a->reid, clib_net_to_host_u32 (mp->vni),
-                             mp->eid_type, mp->reid, mp->reid_len);
+  rv =
+    unformat_one_eid_api (&a->leid, clib_net_to_host_u32 (mp->vni),
+                         &mp->leid);
+  rv |=
+    unformat_one_eid_api (&a->reid, clib_net_to_host_u32 (mp->vni),
+                         &mp->reid);
 
   if (rv)
     goto send_reply;
@@ -700,8 +716,7 @@ send_one_locator_details (lisp_cp_main_t * lcm,
     }
   else
     {
-      rmp->is_ipv6 = gid_address_ip_version (&loc->address);
-      ip_address_copy_addr (rmp->ip_address, &gid_address_ip (&loc->address));
+      ip_address_encode2 (&loc->address.ippref.addr, &rmp->ip_address);
     }
   rmp->priority = loc->priority;
   rmp->weight = loc->weight;
@@ -810,84 +825,31 @@ vl_api_one_locator_set_dump_t_handler (vl_api_one_locator_set_dump_t * mp)
   /* *INDENT-ON* */
 }
 
-static void
-one_fid_put_api (u8 * dst, fid_address_t * src, u8 * prefix_length)
-{
-  ASSERT (prefix_length);
-  ip_prefix_t *ippref = &fid_addr_ippref (src);
-
-  switch (fid_addr_type (src))
-    {
-    case FID_ADDR_IP_PREF:
-      if (ip_prefix_version (ippref) == AF_IP4)
-       clib_memcpy (dst, &ip_prefix_v4 (ippref), 4);
-      else
-       clib_memcpy (dst, &ip_prefix_v6 (ippref), 16);
-      prefix_length[0] = ip_prefix_len (ippref);
-      break;
-
-    case FID_ADDR_MAC:
-      prefix_length[0] = 0;
-      clib_memcpy (dst, fid_addr_mac (src), 6);
-      break;
-
-    default:
-      clib_warning ("Unknown FID type %d!", fid_addr_type (src));
-      break;
-    }
-}
-
-static u8
-fid_type_to_api_type (fid_address_t * fid)
-{
-  ip_prefix_t *ippref;
-
-  switch (fid_addr_type (fid))
-    {
-    case FID_ADDR_IP_PREF:
-      ippref = &fid_addr_ippref (fid);
-      if (ip_prefix_version (ippref) == AF_IP4)
-       return 0;
-      else if (ip_prefix_version (ippref) == AF_IP6)
-       return 1;
-      else
-       return ~0;
-
-    case FID_ADDR_MAC:
-      return 2;
-    case FID_ADDR_NSH:
-      return 3;
-    }
-
-  return ~0;
-}
-
 static void
 send_one_eid_table_details (mapping_t * mapit,
                            vl_api_registration_t * reg, u32 context,
                            u8 filter)
 {
-  fid_address_t *fid;
   lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
   locator_set_t *ls = 0;
   vl_api_one_eid_table_details_t *rmp = NULL;
   gid_address_t *gid = NULL;
-  u8 *mac = 0;
-  ip_prefix_t *ip_prefix = NULL;
+  u32 eid_type;
+  fib_prefix_t fib_prefix;
 
   if (mapit->pitr_set || mapit->nsh_set)
     return;
 
-  switch (filter)
+  switch (ntohl (filter))
     {
-    case 0:                    /* all mappings */
+    case ONE_FILTER_API_ALL:   /* all mappings */
       break;
 
-    case 1:                    /* local only */
+    case ONE_FILTER_API_LOCAL: /* local only */
       if (!mapit->local)
        return;
       break;
-    case 2:                    /* remote only */
+    case ONE_FILTER_API_REMOTE:        /* remote only */
       if (mapit->local)
        return;
       break;
@@ -897,8 +859,6 @@ send_one_eid_table_details (mapping_t * mapit,
     }
 
   gid = &mapit->eid;
-  ip_prefix = &gid_address_ippref (gid);
-  mac = gid_address_mac (gid);
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
   clib_memset (rmp, 0, sizeof (*rmp));
@@ -918,47 +878,37 @@ send_one_eid_table_details (mapping_t * mapit,
   switch (gid_address_type (gid))
     {
     case GID_ADDR_SRC_DST:
-      rmp->is_src_dst = 1;
-      fid = &gid_address_sd_src (gid);
-      rmp->eid_type = fid_type_to_api_type (fid);
-      one_fid_put_api (rmp->seid, &gid_address_sd_src (gid),
-                      &rmp->seid_prefix_len);
-      one_fid_put_api (rmp->eid, &gid_address_sd_dst (gid),
-                      &rmp->eid_prefix_len);
+      fid_to_api_eid (&gid_address_sd_src (gid), &rmp->seid);
+      fid_to_api_eid (&gid_address_sd_dst (gid), &rmp->deid);
       break;
     case GID_ADDR_IP_PREFIX:
-      rmp->eid_prefix_len = ip_prefix_len (ip_prefix);
-      if (ip_prefix_version (ip_prefix) == AF_IP4)
-       {
-         rmp->eid_type = 0;    /* ipv4 type */
-         clib_memcpy (rmp->eid, &ip_prefix_v4 (ip_prefix),
-                      sizeof (ip_prefix_v4 (ip_prefix)));
-       }
-      else
-       {
-         rmp->eid_type = 1;    /* ipv6 type */
-         clib_memcpy (rmp->eid, &ip_prefix_v6 (ip_prefix),
-                      sizeof (ip_prefix_v6 (ip_prefix)));
-       }
+      eid_type = EID_TYPE_API_PREFIX;
+      rmp->seid.type = eid_type;
+      ip_prefix_to_fib_prefix (&gid_address_ippref (gid), &fib_prefix);
+      ip_prefix_encode (&fib_prefix, &rmp->seid.address.prefix);
       break;
     case GID_ADDR_MAC:
-      rmp->eid_type = 2;       /* l2 mac type */
-      clib_memcpy (rmp->eid, mac, 6);
+      eid_type = EID_TYPE_API_MAC;
+      rmp->seid.type = eid_type;
+      mac_address_encode ((mac_address_t *) gid_address_mac (gid),
+                         rmp->seid.address.mac);
       break;
     case GID_ADDR_NSH:
-      rmp->eid_type = 3;       /* NSH type */
-      lisp_nsh_api_t nsh;
-      nsh.spi = clib_host_to_net_u32 (gid_address_nsh_spi (gid));
-      nsh.si = gid_address_nsh_si (gid);
-      clib_memcpy (rmp->eid, &nsh, sizeof (nsh));
+      eid_type = EID_TYPE_API_NSH;
+      rmp->seid.type = eid_type;
+      rmp->seid.address.nsh.spi =
+       clib_host_to_net_u32 (gid_address_nsh_spi (gid));
+      rmp->seid.address.nsh.si = gid_address_nsh_si (gid);
       break;
     default:
-      ASSERT (0);
+      /* unknown type */
+      return;
     }
+
   rmp->context = context;
   rmp->vni = clib_host_to_net_u32 (gid_address_vni (gid));
-  rmp->key_id = clib_host_to_net_u16 (mapit->key_id);
-  memcpy (rmp->key, mapit->key, vec_len (mapit->key));
+  rmp->key.id = mapit->key_id;
+  memcpy (rmp->key.key, mapit->key, vec_len (mapit->key));
   vl_api_send_msg (reg, (u8 *) rmp);
 }
 
@@ -979,8 +929,7 @@ vl_api_one_eid_table_dump_t_handler (vl_api_one_eid_table_dump_t * mp)
     {
       clib_memset (eid, 0, sizeof (*eid));
 
-      unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni),
-                           mp->eid_type, mp->eid, mp->prefix_length);
+      unformat_one_eid_api (eid, clib_net_to_host_u32 (mp->vni), &mp->eid);
 
       mi = gid_dictionary_lookup (&lcm->mapping_index_by_gid, eid);
       if ((u32) ~ 0 == mi)
@@ -1012,23 +961,9 @@ send_one_map_server_details (ip_address_t * ip, vl_api_registration_t * reg,
   clib_memset (rmp, 0, sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_ONE_MAP_SERVER_DETAILS);
 
-  switch (ip_addr_version (ip))
-    {
-    case AF_IP4:
-      rmp->is_ipv6 = 0;
-      clib_memcpy (rmp->ip_address, &ip_addr_v4 (ip),
-                  sizeof (ip_addr_v4 (ip)));
-      break;
 
-    case AF_IP6:
-      rmp->is_ipv6 = 1;
-      clib_memcpy (rmp->ip_address, &ip_addr_v6 (ip),
-                  sizeof (ip_addr_v6 (ip)));
-      break;
+  ip_address_encode2 (ip, &rmp->ip_address);
 
-    default:
-      ASSERT (0);
-    }
   rmp->context = context;
 
   vl_api_send_msg (reg, (u8 *) rmp);
@@ -1061,23 +996,7 @@ send_one_map_resolver_details (ip_address_t * ip,
   clib_memset (rmp, 0, sizeof (*rmp));
   rmp->_vl_msg_id = ntohs (VL_API_ONE_MAP_RESOLVER_DETAILS);
 
-  switch (ip_addr_version (ip))
-    {
-    case AF_IP4:
-      rmp->is_ipv6 = 0;
-      clib_memcpy (rmp->ip_address, &ip_addr_v4 (ip),
-                  sizeof (ip_addr_v4 (ip)));
-      break;
-
-    case AF_IP6:
-      rmp->is_ipv6 = 1;
-      clib_memcpy (rmp->ip_address, &ip_addr_v6 (ip),
-                  sizeof (ip_addr_v6 (ip)));
-      break;
-
-    default:
-      ASSERT (0);
-    }
+  ip_address_encode2 (ip, &rmp->ip_address);
   rmp->context = context;
 
   vl_api_send_msg (reg, (u8 *) rmp);
@@ -1164,7 +1083,8 @@ one_adjacency_copy (vl_api_one_adjacency_t * dst, lisp_adjacency_t * adjs)
   lisp_adjacency_t *adj;
   vl_api_one_adjacency_t a;
   u32 i, n = vec_len (adjs);
-  lisp_nsh_api_t nsh;
+  fib_prefix_t rfib_prefix, lfib_prefix;
+  u32 eid_type;
 
   for (i = 0; i < n; i++)
     {
@@ -1174,39 +1094,35 @@ one_adjacency_copy (vl_api_one_adjacency_t * dst, lisp_adjacency_t * adjs)
       switch (gid_address_type (&adj->reid))
        {
        case GID_ADDR_IP_PREFIX:
-         a.reid_prefix_len = gid_address_ippref_len (&adj->reid);
-         a.leid_prefix_len = gid_address_ippref_len (&adj->leid);
-         if (gid_address_ip_version (&adj->reid) == AF_IP4)
-           {
-             a.eid_type = 0;   /* ipv4 type */
-             clib_memcpy (a.reid, &gid_address_ip (&adj->reid), 4);
-             clib_memcpy (a.leid, &gid_address_ip (&adj->leid), 4);
-           }
-         else
-           {
-             a.eid_type = 1;   /* ipv6 type */
-             clib_memcpy (a.reid, &gid_address_ip (&adj->reid), 16);
-             clib_memcpy (a.leid, &gid_address_ip (&adj->leid), 16);
-           }
+         eid_type = EID_TYPE_API_PREFIX;
+         ip_prefix_to_fib_prefix (&gid_address_ippref (&adj->reid),
+                                  &rfib_prefix);
+         ip_prefix_to_fib_prefix (&gid_address_ippref (&adj->leid),
+                                  &lfib_prefix);
+         ip_prefix_encode (&rfib_prefix, &a.reid.address.prefix);
+         ip_prefix_encode (&lfib_prefix, &a.leid.address.prefix);
          break;
        case GID_ADDR_MAC:
-         a.eid_type = 2;       /* l2 mac type */
-         mac_copy (a.reid, gid_address_mac (&adj->reid));
-         mac_copy (a.leid, gid_address_mac (&adj->leid));
+         eid_type = EID_TYPE_API_PREFIX;
+         mac_address_encode ((mac_address_t *) gid_address_mac (&adj->reid),
+                             a.reid.address.mac);
+         mac_address_encode ((mac_address_t *) gid_address_mac (&adj->leid),
+                             a.leid.address.mac);
          break;
        case GID_ADDR_NSH:
-         a.eid_type = 3;       /* NSH type */
-         nsh.spi = clib_host_to_net_u32 (gid_address_nsh_spi (&adj->reid));
-         nsh.si = gid_address_nsh_si (&adj->reid);
-         clib_memcpy (a.reid, &nsh, sizeof (nsh));
-
-         nsh.spi = clib_host_to_net_u32 (gid_address_nsh_spi (&adj->leid));
-         nsh.si = gid_address_nsh_si (&adj->leid);
-         clib_memcpy (a.leid, &nsh, sizeof (nsh));
+         eid_type = EID_TYPE_API_PREFIX;
+         a.reid.address.nsh.spi =
+           clib_host_to_net_u32 (gid_address_nsh_spi (&adj->reid));
+         a.reid.address.nsh.si = gid_address_nsh_si (&adj->reid);
+         a.leid.address.nsh.spi =
+           clib_host_to_net_u32 (gid_address_nsh_spi (&adj->leid));
+         a.leid.address.nsh.si = gid_address_nsh_si (&adj->leid);
          break;
        default:
          ASSERT (0);
        }
+      a.reid.type = eid_type;
+      a.leid.type = eid_type;
       dst[i] = a;
     }
 }
@@ -1221,7 +1137,7 @@ static void
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_SHOW_ONE_RLOC_PROBE_STATE_REPLY,
   {
-    rmp->is_enabled = vnet_lisp_rloc_probe_state_get ();
+    rmp->is_enable = vnet_lisp_rloc_probe_state_get ();
   });
   /* *INDENT-ON* */
 }
@@ -1236,7 +1152,7 @@ static void
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_SHOW_ONE_MAP_REGISTER_STATE_REPLY,
   {
-    rmp->is_enabled = vnet_lisp_map_register_state_get ();
+    rmp->is_enable = vnet_lisp_map_register_state_get ();
   });
   /* *INDENT-ON* */
 }
@@ -1395,10 +1311,10 @@ vl_api_show_one_pitr_t_handler (vl_api_show_one_pitr_t * mp)
   u8 *tmp_str = 0;
   int rv = 0;
 
-  u8 is_enabled = (lcm->flags & LISP_FLAG_PITR_MODE)
+  u8 is_enable = (lcm->flags & LISP_FLAG_PITR_MODE)
     && lcm->pitr_map_index != ~0;
 
-  if (!is_enabled)
+  if (!is_enable)
     {
       tmp_str = format (0, "N/A");
     }
@@ -1438,7 +1354,7 @@ static void
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_SHOW_ONE_STATS_ENABLE_DISABLE_REPLY,
   ({
-    rmp->is_en = vnet_lisp_stats_enable_disable_state ();
+    rmp->is_enable = vnet_lisp_stats_enable_disable_state ();
   }));
   /* *INDENT-ON* */
 }
@@ -1449,38 +1365,10 @@ static void
 {
   vl_api_one_enable_disable_reply_t *rmp = NULL;
 
-  vnet_api_error_t rv = vnet_lisp_stats_enable_disable (mp->is_en);
+  vnet_api_error_t rv = vnet_lisp_stats_enable_disable (mp->is_enable);
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_REPLY);
 }
 
-static void
-lisp_fid_addr_to_api (fid_address_t * fid, u8 * dst, u8 * api_eid_type,
-                     u8 * prefix_length)
-{
-  switch (fid_addr_type (fid))
-    {
-    case FID_ADDR_IP_PREF:
-      *prefix_length = fid_addr_prefix_length (fid);
-      if (fid_addr_ip_version (fid) == AF_IP4)
-       {
-         *api_eid_type = 0;    /* ipv4 type */
-         clib_memcpy (dst, &fid_addr_ippref (fid), 4);
-       }
-      else
-       {
-         *api_eid_type = 1;    /* ipv6 type */
-         clib_memcpy (dst, &fid_addr_ippref (fid), 16);
-       }
-      break;
-    case FID_ADDR_MAC:
-      *api_eid_type = 2;       /* l2 mac type */
-      mac_copy (dst, fid_addr_mac (fid));
-      break;
-    default:
-      ASSERT (0);
-    }
-}
-
 static void
 vl_api_one_stats_flush_t_handler (vl_api_one_stats_flush_t * mp)
 {
@@ -1504,15 +1392,12 @@ vl_api_one_stats_dump_t_handler (vl_api_one_stats_dump_t * mp)
       /* *INDENT-OFF* */
       REPLY_DETAILS (VL_API_ONE_STATS_DETAILS,
       ({
-        lisp_fid_addr_to_api (&stat->deid, rmp->deid, &rmp->eid_type,
-                              &rmp->deid_pref_len);
-        lisp_fid_addr_to_api (&stat->seid, rmp->seid, &rmp->eid_type,
-                              &rmp->seid_pref_len);
+        fid_to_api_eid (&stat->deid, &rmp->deid);
+        fid_to_api_eid (&stat->seid, &rmp->seid);
         rmp->vni = clib_host_to_net_u32 (stat->vni);
 
-        rmp->is_ip4 = ip_addr_version (&stat->rmt_rloc) == AF_IP4 ? 1 : 0;
-        ip_address_copy_addr (rmp->rloc, &stat->rmt_rloc);
-        ip_address_copy_addr (rmp->lloc, &stat->loc_rloc);
+        ip_address_encode2 (&stat->rmt_rloc, &rmp->rloc);
+        ip_address_encode2 (&stat->loc_rloc, &rmp->lloc);
 
         rmp->pkt_count = clib_host_to_net_u32 (stat->counters.packets);
         rmp->bytes = clib_host_to_net_u32 (stat->counters.bytes);
@@ -1528,15 +1413,18 @@ static void
   vl_api_one_add_del_l2_arp_entry_reply_t *rmp;
   int rv = 0;
   gid_address_t _arp, *arp = &_arp;
+  ip4_address_t ip4;
+  mac_address_t mac;
   clib_memset (arp, 0, sizeof (*arp));
 
   gid_address_type (arp) = GID_ADDR_ARP;
   gid_address_arp_bd (arp) = clib_net_to_host_u32 (mp->bd);
 
-  /* vpp keeps ip4 addresses in network byte order */
-  ip_address_set (&gid_address_arp_ndp_ip (arp), &mp->ip4, AF_IP4);
+  ip4_address_decode (mp->entry.ip4, &ip4);
+  ip_address_set (&gid_address_arp_ndp_ip (arp), &ip4, AF_IP4);
+  mac_address_decode (mp->entry.mac, &mac);
 
-  rv = vnet_lisp_add_del_l2_arp_ndp_entry (arp, mp->mac, mp->is_add);
+  rv = vnet_lisp_add_del_l2_arp_ndp_entry (arp, mac.bytes, mp->is_add);
 
   REPLY_MACRO (VL_API_ONE_ADD_DEL_L2_ARP_ENTRY_REPLY);
 }
@@ -1547,13 +1435,18 @@ vl_api_one_add_del_ndp_entry_t_handler (vl_api_one_add_del_ndp_entry_t * mp)
   vl_api_one_add_del_ndp_entry_reply_t *rmp;
   int rv = 0;
   gid_address_t _g, *g = &_g;
+  ip6_address_t ip6;
+  mac_address_t mac;
   clib_memset (g, 0, sizeof (*g));
 
   gid_address_type (g) = GID_ADDR_NDP;
   gid_address_ndp_bd (g) = clib_net_to_host_u32 (mp->bd);
-  ip_address_set (&gid_address_arp_ndp_ip (g), mp->ip6, AF_IP6);
 
-  rv = vnet_lisp_add_del_l2_arp_ndp_entry (g, mp->mac, mp->is_add);
+  ip6_address_decode (mp->entry.ip6, &ip6);
+  ip_address_set (&gid_address_arp_ndp_ip (g), &ip6, AF_IP6);
+  mac_address_decode (mp->entry.mac, &mac);
+
+  rv = vnet_lisp_add_del_l2_arp_ndp_entry (g, mac.bytes, mp->is_add);
 
   REPLY_MACRO (VL_API_ONE_ADD_DEL_NDP_ENTRY_REPLY);
 }
@@ -1627,8 +1520,8 @@ vl_api_one_l2_arp_entries_get_t_handler (vl_api_one_l2_arp_entries_get_t * mp)
     rmp->count = clib_host_to_net_u32 (vec_len (entries));
     vec_foreach (e, entries)
       {
-        mac_copy (rmp->entries[i].mac, e->mac);
-        rmp->entries[i].ip4 = e->ip4;
+       mac_address_encode ((mac_address_t *) e->mac, rmp->entries[i].mac);
+       ip4_address_encode ((ip4_address_t *) &e->ip4, rmp->entries[i].ip4);
         i++;
       }
   });
@@ -1713,8 +1606,8 @@ vl_api_one_ndp_entries_get_t_handler (vl_api_one_ndp_entries_get_t * mp)
     rmp->count = clib_host_to_net_u32 (vec_len (entries));
     vec_foreach (e, entries)
       {
-        mac_copy (rmp->entries[i].mac, e->mac);
-        clib_memcpy (rmp->entries[i].ip6, e->ip6, 16);
+       mac_address_encode ((mac_address_t *) e->mac, rmp->entries[i].mac);
+       ip6_address_encode ((ip6_address_t *) &e->ip6, rmp->entries[i].ip6);
         i++;
       }
   });
@@ -1728,7 +1621,7 @@ static void
   (vl_api_one_enable_disable_xtr_mode_t * mp)
 {
   vl_api_one_enable_disable_xtr_mode_reply_t *rmp = 0;
-  int rv = vnet_lisp_enable_disable_xtr_mode (mp->is_en);
+  int rv = vnet_lisp_enable_disable_xtr_mode (mp->is_enable);
 
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_XTR_MODE_REPLY);
 }
@@ -1742,7 +1635,7 @@ vl_api_one_show_xtr_mode_t_handler (vl_api_one_show_xtr_mode_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_ONE_SHOW_XTR_MODE_REPLY,
   {
-    rmp->is_en = vnet_lisp_get_xtr_mode ();
+    rmp->is_enable = vnet_lisp_get_xtr_mode ();
   });
   /* *INDENT-ON* */
 }
@@ -1752,7 +1645,7 @@ static void
   (vl_api_one_enable_disable_pitr_mode_t * mp)
 {
   vl_api_one_enable_disable_pitr_mode_reply_t *rmp = 0;
-  int rv = vnet_lisp_enable_disable_pitr_mode (mp->is_en);
+  int rv = vnet_lisp_enable_disable_pitr_mode (mp->is_enable);
 
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_PITR_MODE_REPLY);
 }
@@ -1766,7 +1659,7 @@ vl_api_one_show_pitr_mode_t_handler (vl_api_one_show_pitr_mode_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_ONE_SHOW_PITR_MODE_REPLY,
   {
-    rmp->is_en = vnet_lisp_get_pitr_mode ();
+    rmp->is_enable = vnet_lisp_get_pitr_mode ();
   });
   /* *INDENT-ON* */
 }
@@ -1776,7 +1669,7 @@ static void
   (vl_api_one_enable_disable_petr_mode_t * mp)
 {
   vl_api_one_enable_disable_petr_mode_reply_t *rmp = 0;
-  int rv = vnet_lisp_enable_disable_petr_mode (mp->is_en);
+  int rv = vnet_lisp_enable_disable_petr_mode (mp->is_enable);
 
   REPLY_MACRO (VL_API_ONE_ENABLE_DISABLE_PETR_MODE_REPLY);
 }
@@ -1790,7 +1683,7 @@ vl_api_one_show_petr_mode_t_handler (vl_api_one_show_petr_mode_t * mp)
   /* *INDENT-OFF* */
   REPLY_MACRO2 (VL_API_ONE_SHOW_PETR_MODE_REPLY,
   {
-    rmp->is_en = vnet_lisp_get_petr_mode ();
+    rmp->is_enable = vnet_lisp_get_petr_mode ();
   });
   /* *INDENT-ON* */
 }
index 8f60b15..9fbd795 100644 (file)
  * limitations under the License.
  */
 
-option version = "1.0.0";
+option version = "2.0.0";
+
+import "vnet/interface_types.api";
+import "vnet/lisp-cp/lisp_types.api";
 
 /** \brief GPE locator structure
     @param is_ip4 - whether addr is IPv4 or v6
@@ -22,9 +25,8 @@ option version = "1.0.0";
 */
 typedef gpe_locator
 {
-  u8 is_ip4;
   u8 weight;
-  u8 addr[16];
+  vl_api_address_t addr;
 };
 
 /** \brief add or delete GPE tunnel
@@ -49,12 +51,9 @@ manual_print manual_endian define gpe_add_del_fwd_entry
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 eid_type;
-  u8 rmt_eid[16];
-  u8 lcl_eid[16];
-  u8 rmt_len;
-  u8 lcl_len;
+  bool is_add [default=true];
+  vl_api_eid_t rmt_eid;
+  vl_api_eid_t lcl_eid;
   u32 vni;
   u32 dp_table;
   u8 action;
@@ -72,13 +71,13 @@ define gpe_add_del_fwd_entry_reply
 /** \brief enable or disable gpe protocol
     @param client_index - opaque cookie to identify the sender
     @param context - sender context, to match reply w/ request
-    @param is_en - enable protocol if non-zero, else disable
+    @param is_enable [default=true] - enable protocol if non-zero, else disable
 */
 autoreply define gpe_enable_disable
 {
   u32 client_index;
   u32 context;
-  u8 is_en;
+  bool is_enable [default=true];
 };
 
 /** \brief add or delete gpe_iface
@@ -90,8 +89,8 @@ autoreply define gpe_add_del_iface
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
-  u8 is_l2;
+  bool is_add [default=true];
+  bool is_l2;
   u32 dp_table;
   u32 vni;
 };
@@ -121,11 +120,8 @@ typedef gpe_fwd_entry
 {
   u32 fwd_entry_index;
   u32 dp_table;
-  u8 eid_type;
-  u8 leid_prefix_len;
-  u8 reid_prefix_len;
-  u8 leid[16];
-  u8 reid[16];
+  vl_api_eid_t leid;
+  vl_api_eid_t reid;
   u32 vni;
   u8 action;
 };
@@ -161,7 +157,7 @@ autoreply define gpe_set_encap_mode
 {
   u32 client_index;
   u32 context;
-  u8 mode;
+  bool is_vxlan;
 };
 
 /** \brief get GPE encapsulation mode
@@ -184,6 +180,7 @@ define gpe_get_encap_mode_reply
 {
   u32 context;
   i32 retval;
+  /* FIXME: gpe encap enum */
   u8 encap_mode;
 };
 
@@ -200,11 +197,10 @@ autoreply define gpe_add_del_native_fwd_rpath
 {
   u32 client_index;
   u32 context;
-  u8 is_add;
+  bool is_add [default=true];
   u32 table_id;
-  u32 nh_sw_if_index;
-  u8 is_ip4;
-  u8 nh_addr[16];
+  vl_api_interface_index_t nh_sw_if_index;
+  vl_api_address_t nh_addr;
 };
 
 /** \brief get GPE native fwd rpath
@@ -215,7 +211,7 @@ define gpe_native_fwd_rpaths_get
 {
   u32 client_index;
   u32 context;
-  u8 is_ip4;
+  bool is_ip4;
 };
 
 /** \brief Reply for get native fwd rpath
@@ -228,9 +224,8 @@ define gpe_native_fwd_rpaths_get
 typedef gpe_native_fwd_rpath
 {
   u32 fib_index;
-  u32 nh_sw_if_index;
-  u8 is_ip4;
-  u8 nh_addr[16];
+  vl_api_interface_index_t nh_sw_if_index;
+  vl_api_address_t nh_addr;
 };
 
 manual_print manual_endian define gpe_native_fwd_rpaths_get_reply
@@ -246,4 +241,3 @@ manual_print manual_endian define gpe_native_fwd_rpaths_get_reply
  * eval: (c-set-style "gnu")
  * End:
  */
index 59a3fd1..e20347a 100644 (file)
@@ -29,6 +29,9 @@
 #include <vnet/lisp-gpe/lisp_gpe_tenant.h>
 #include <vnet/fib/fib_table.h>
 #include <vnet/vnet_msg_enum.h>
+#include <vnet/ip/ip_types_api.h>
+#include <vnet/ethernet/ethernet_types_api.h>
+#include <vnet/lisp-gpe/lisp_types_api.h>
 
 #define vl_api_gpe_locator_pair_t_endian vl_noop_handler
 #define vl_api_gpe_locator_pair_t_print vl_noop_handler
@@ -75,7 +78,7 @@ unformat_gpe_loc_pairs (void *locs, u32 rloc_num)
       /* local locator */
       r = &((vl_api_gpe_locator_t *) locs)[i];
       clib_memset (&pair, 0, sizeof (pair));
-      ip_address_set (&pair.lcl_loc, &r->addr, r->is_ip4 ? AF_IP4 : AF_IP6);
+      ip_address_decode2 (&r->addr, &pair.lcl_loc);
 
       pair.weight = r->weight;
       vec_add1 (pairs, pair);
@@ -86,43 +89,11 @@ unformat_gpe_loc_pairs (void *locs, u32 rloc_num)
       /* remote locators */
       r = &((vl_api_gpe_locator_t *) locs)[i];
       p = &pairs[i - rloc_num];
-      ip_address_set (&p->rmt_loc, &r->addr, r->is_ip4 ? AF_IP4 : AF_IP6);
+      ip_address_decode2 (&r->addr, &p->rmt_loc);
     }
   return pairs;
 }
 
-static int
-unformat_lisp_eid_api (gid_address_t * dst, u32 vni, u8 type, void *src,
-                      u8 len)
-{
-  switch (type)
-    {
-    case 0:                    /* ipv4 */
-      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP4);
-      gid_address_ippref_len (dst) = len;
-      ip_prefix_normalize (&gid_address_ippref (dst));
-      break;
-    case 1:                    /* ipv6 */
-      gid_address_type (dst) = GID_ADDR_IP_PREFIX;
-      gid_address_ip_set (dst, src, AF_IP6);
-      gid_address_ippref_len (dst) = len;
-      ip_prefix_normalize (&gid_address_ippref (dst));
-      break;
-    case 2:                    /* l2 mac */
-      gid_address_type (dst) = GID_ADDR_MAC;
-      clib_memcpy (&gid_address_mac (dst), src, 6);
-      break;
-    default:
-      /* unknown type */
-      return VNET_API_ERROR_INVALID_VALUE;
-    }
-
-  gid_address_vni (dst) = vni;
-
-  return 0;
-}
-
 static void
   gpe_fwd_entry_path_dump_t_net_to_host
   (vl_api_gpe_fwd_entry_path_dump_t * mp)
@@ -135,16 +106,7 @@ lisp_api_set_locator (vl_api_gpe_locator_t * loc,
                      const ip_address_t * addr, u8 weight)
 {
   loc->weight = weight;
-  if (AF_IP4 == ip_addr_version (addr))
-    {
-      loc->is_ip4 = 1;
-      memcpy (loc->addr, addr, 4);
-    }
-  else
-    {
-      loc->is_ip4 = 0;
-      memcpy (loc->addr, addr, 16);
-    }
+  ip_address_encode2 (addr, &loc->addr);
 }
 
 static void
@@ -208,25 +170,20 @@ gpe_fwd_entries_copy (vl_api_gpe_fwd_entry_t * dst,
     switch (fid_addr_type (&e->leid))
       {
       case FID_ADDR_IP_PREF:
-       if (AF_IP4 == ip_prefix_version (&fid_addr_ippref (&e->leid)))
-         {
-           memcpy (&dst[i].leid, &fid_addr_ippref (&e->leid), 4);
-           memcpy (&dst[i].reid, &fid_addr_ippref (&e->reid), 4);
-           dst[i].eid_type = 0;
-         }
-       else
-         {
-           memcpy (&dst[i].leid, &fid_addr_ippref (&e->leid), 16);
-           memcpy (&dst[i].reid, &fid_addr_ippref (&e->reid), 16);
-           dst[i].eid_type = 1;
-         }
-       dst[i].leid_prefix_len = ip_prefix_len (&fid_addr_ippref (&e->leid));
-       dst[i].reid_prefix_len = ip_prefix_len (&fid_addr_ippref (&e->reid));
+       dst[i].leid.type = EID_TYPE_API_PREFIX;
+       dst[i].reid.type = EID_TYPE_API_PREFIX;
+       ip_prefix_encode2 (&fid_addr_ippref (&e->leid),
+                          &dst[i].leid.address.prefix);
+       ip_prefix_encode2 (&fid_addr_ippref (&e->reid),
+                          &dst[i].reid.address.prefix);
        break;
       case FID_ADDR_MAC:
-       memcpy (&dst[i].leid, fid_addr_mac (&e->leid), 6);
-       memcpy (&dst[i].reid, fid_addr_mac (&e->reid), 6);
-       dst[i].eid_type = 2;
+       mac_address_encode ((mac_address_t *) fid_addr_mac (&e->leid),
+                           dst[i].leid.address.mac);
+       mac_address_encode ((mac_address_t *) fid_addr_mac (&e->reid),
+                           dst[i].reid.address.mac);
+       dst[i].leid.type = EID_TYPE_API_MAC;
+       dst[i].reid.type = EID_TYPE_API_MAC;
        break;
       default:
        clib_warning ("unknown fid type %d!", fid_addr_type (&e->leid));
@@ -334,10 +291,8 @@ vl_api_gpe_add_del_fwd_entry_t_handler (vl_api_gpe_add_del_fwd_entry_t * mp)
   gpe_add_del_fwd_entry_t_net_to_host (mp);
   clib_memset (a, 0, sizeof (a[0]));
 
-  rv = unformat_lisp_eid_api (&a->rmt_eid, mp->vni, mp->eid_type,
-                             mp->rmt_eid, mp->rmt_len);
-  rv |= unformat_lisp_eid_api (&a->lcl_eid, mp->vni, mp->eid_type,
-                              mp->lcl_eid, mp->lcl_len);
+  rv = unformat_lisp_eid_api (&a->rmt_eid, mp->vni, &mp->rmt_eid);
+  rv |= unformat_lisp_eid_api (&a->lcl_eid, mp->vni, &mp->lcl_eid);
 
   if (mp->loc_num % 2 != 0)
     {
@@ -375,7 +330,7 @@ vl_api_gpe_enable_disable_t_handler (vl_api_gpe_enable_disable_t * mp)
   int rv = 0;
   vnet_lisp_gpe_enable_disable_args_t _a, *a = &_a;
 
-  a->is_en = mp->is_en;
+  a->is_en = mp->is_enable;
   vnet_lisp_gpe_enable_disable (a);
 
   REPLY_MACRO (VL_API_GPE_ENABLE_DISABLE_REPLY);
@@ -421,7 +376,7 @@ vl_api_gpe_set_encap_mode_t_handler (vl_api_gpe_set_encap_mode_t * mp)
   vl_api_gpe_set_encap_mode_reply_t *rmp;
   int rv = 0;
 
-  rv = vnet_gpe_set_encap_mode (mp->mode);
+  rv = vnet_gpe_set_encap_mode (mp->is_vxlan);
   REPLY_MACRO (VL_API_GPE_SET_ENCAP_MODE_REPLY);
 }
 
@@ -449,13 +404,15 @@ static void
 
   clib_memset (a, 0, sizeof (a[0]));
 
-  if (mp->is_ip4)
-    clib_memcpy (&a->rpath.frp_addr.ip4, mp->nh_addr, sizeof (ip4_address_t));
+  if (mp->nh_addr.af)
+    clib_memcpy (&a->rpath.frp_addr.ip6, mp->nh_addr.un.ip6,
+                sizeof (ip6_address_t));
   else
-    clib_memcpy (&a->rpath.frp_addr.ip6, mp->nh_addr, sizeof (ip6_address_t));
+    clib_memcpy (&a->rpath.frp_addr.ip4, mp->nh_addr.un.ip4,
+                sizeof (ip4_address_t));
 
   a->is_add = mp->is_add;
-  a->rpath.frp_proto = mp->is_ip4 ? DPO_PROTO_IP4 : DPO_PROTO_IP6;
+  a->rpath.frp_proto = mp->nh_addr.af ? DPO_PROTO_IP6 : DPO_PROTO_IP4;
   a->rpath.frp_fib_index =
     fib_table_find (dpo_proto_to_fib (a->rpath.frp_proto),
                    clib_net_to_host_u32 (mp->table_id));
@@ -475,7 +432,7 @@ done:
 
 static void
 gpe_native_fwd_rpaths_copy (vl_api_gpe_native_fwd_rpath_t * dst,
-                           fib_route_path_t * src, u8 is_ip4)
+                           fib_route_path_t * src)
 {
   fib_route_path_t *e;
   fib_table_t *table;
@@ -487,11 +444,7 @@ gpe_native_fwd_rpaths_copy (vl_api_gpe_native_fwd_rpath_t * dst,
     table = fib_table_get (e->frp_fib_index, dpo_proto_to_fib (e->frp_proto));
     dst[i].fib_index = table->ft_table_id;
     dst[i].nh_sw_if_index = e->frp_sw_if_index;
-    dst[i].is_ip4 = is_ip4;
-    if (is_ip4)
-      clib_memcpy (&dst[i].nh_addr, &e->frp_addr.ip4, sizeof (ip4_address_t));
-    else
-      clib_memcpy (&dst[i].nh_addr, &e->frp_addr.ip6, sizeof (ip6_address_t));
+    ip_address_encode (&e->frp_addr, IP46_TYPE_ANY, &dst[i].nh_addr);
     i++;
   }
 }
@@ -527,7 +480,7 @@ vl_api_gpe_native_fwd_rpaths_get_t_handler (vl_api_gpe_native_fwd_rpaths_get_t
   u32 size = 0;
   int rv = 0;
 
-  u8 rpath_index = mp->is_ip4 ? 0 : 1;
+  u8 rpath_index = mp->is_ip4 ? 1 : 0;
 
   size = vec_len (lgm->native_fwd_rpath[rpath_index])
     * sizeof (vl_api_gpe_native_fwd_rpath_t);
@@ -537,8 +490,7 @@ vl_api_gpe_native_fwd_rpaths_get_t_handler (vl_api_gpe_native_fwd_rpaths_get_t
   {
     rmp->count = vec_len (lgm->native_fwd_rpath[rpath_index]);
     gpe_native_fwd_rpaths_copy (rmp->entries,
-                               lgm->native_fwd_rpath[rpath_index],
-                               mp->is_ip4);
+                               lgm->native_fwd_rpath[rpath_index]);
     gpe_native_fwd_rpaths_get_reply_t_host_to_net (rmp);
   });
   /* *INDENT-ON* */
diff --git a/src/vnet/lisp-gpe/lisp_types_api.c b/src/vnet/lisp-gpe/lisp_types_api.c
new file mode 120000 (symlink)
index 0000000..84e06c4
--- /dev/null
@@ -0,0 +1 @@
+../lisp-cp/lisp_types_api.c
\ No newline at end of file
diff --git a/src/vnet/lisp-gpe/lisp_types_api.h b/src/vnet/lisp-gpe/lisp_types_api.h
new file mode 120000 (symlink)
index 0000000..f895123
--- /dev/null
@@ -0,0 +1 @@
+../lisp-cp/lisp_types_api.h
\ No newline at end of file
index ab80d7e..a5c3fdb 100644 (file)
@@ -2611,7 +2611,7 @@ static void *vl_api_lisp_enable_disable_t_print
   u8 *s;
 
   s = format (0, "SCRIPT: lisp_enable_disable %s",
-             mp->is_en ? "enable" : "disable");
+             mp->is_enable ? "enable" : "disable");
 
   FINISH;
 }
@@ -2678,13 +2678,11 @@ static void *vl_api_lisp_add_del_remote_mapping_t_print
   s = format (s, "%s ", mp->is_add ? "add" : "del");
   s = format (s, "vni %d ", (mp->vni));
 
-  s = format (s, "eid %U ", format_lisp_flat_eid,
-             mp->eid_type, mp->eid, mp->eid_len);
+  s = format (s, "eid %U ", format_lisp_flat_eid, mp->deid);
 
   if (mp->is_src_dst)
     {
-      s = format (s, "seid %U ", format_lisp_flat_eid,
-                 mp->eid_type, mp->seid, mp->seid_len);
+      s = format (s, "seid %U ", format_lisp_flat_eid, mp->seid);
     }
   rloc_num = (mp->rloc_num);
 
@@ -2704,8 +2702,7 @@ static void *vl_api_lisp_add_del_adjacency_t_print
   s = format (s, "%s ", mp->is_add ? "add" : "del");
   s = format (s, "vni %d ", (mp->vni));
   s = format (s, "reid %U leid %U ",
-             format_lisp_flat_eid, mp->eid_type, mp->reid, mp->reid_len,
-             format_lisp_flat_eid, mp->eid_type, mp->leid, mp->leid_len);
+             format_lisp_flat_eid, mp->reid, format_lisp_flat_eid, mp->leid);
 
   FINISH;
 }
@@ -2751,14 +2748,13 @@ static void *vl_api_lisp_add_del_local_eid_t_print
     s = format (s, "del ");
 
   s = format (s, "vni %d ", (mp->vni));
-  s = format (s, "eid %U ", format_lisp_flat_eid, mp->eid_type, mp->eid,
-             mp->prefix_len);
+  s = format (s, "eid %U ", format_lisp_flat_eid, mp->eid);
   s = format (s, "locator-set %s ", mp->locator_set_name);
-  if (*mp->key)
+  if (mp->key.id)
     {
-      u32 key_id = mp->key_id;
+      u32 key_id = mp->key.id;
       s = format (s, "key-id %U", format_hmac_key_id, key_id);
-      s = format (s, "secret-key %s", mp->key);
+      s = format (s, "secret-key %s", mp->key.key);
     }
   FINISH;
 }
@@ -2783,10 +2779,10 @@ static void *vl_api_lisp_add_del_map_resolver_t_print
   if (!mp->is_add)
     s = format (s, "del ");
 
-  if (mp->is_ipv6)
-    s = format (s, "%U ", format_ip6_address, mp->ip_address);
+  if (mp->ip_address.af)
+    s = format (s, "%U ", format_ip6_address, mp->ip_address.un.ip6);
   else
-    s = format (s, "%U ", format_ip4_address, mp->ip_address);
+    s = format (s, "%U ", format_ip4_address, mp->ip_address.un.ip4);
 
   FINISH;
 }
@@ -2798,7 +2794,7 @@ static void *vl_api_gpe_enable_disable_t_print
 
   s = format (0, "SCRIPT: gpe_enable_disable ");
 
-  s = format (s, "%s ", mp->is_en ? "enable" : "disable");
+  s = format (s, "%s ", mp->is_enable ? "enable" : "disable");
 
   FINISH;
 }
@@ -2870,16 +2866,7 @@ static void *vl_api_lisp_map_request_mode_t_print
 
   s = format (0, "SCRIPT: lisp_map_request_mode ");
 
-  switch (mp->mode)
-    {
-    case 0:
-      s = format (s, "dst-only");
-      break;
-    case 1:
-      s = format (s, "src-dst");
-    default:
-      break;
-    }
+  s = mp->is_src_dst ? format (s, "src-dst") : format (s, "dst-only");
 
   FINISH;
 }
@@ -2894,8 +2881,7 @@ static void *vl_api_lisp_eid_table_dump_t_print
   if (mp->eid_set)
     {
       s = format (s, "vni %d ", (mp->vni));
-      s = format (s, "eid %U ", format_lisp_flat_eid, mp->eid_type,
-                 mp->eid, mp->prefix_length);
+      s = format (s, "eid %U ", format_lisp_flat_eid, mp->eid);
       switch (mp->filter)
        {
        case 1:
@@ -2904,6 +2890,8 @@ static void *vl_api_lisp_eid_table_dump_t_print
        case 2:
          s = format (s, "remote ");
          break;
+       default:
+         break;
        }
     }
   FINISH;
@@ -2915,7 +2903,7 @@ static void *vl_api_lisp_rloc_probe_enable_disable_t_print
   u8 *s;
 
   s = format (0, "SCRIPT: lisp_rloc_probe_enable_disable ");
-  if (mp->is_enabled)
+  if (mp->is_enable)
     s = format (s, "enable");
   else
     s = format (s, "disable");
@@ -2929,7 +2917,7 @@ static void *vl_api_lisp_map_register_enable_disable_t_print
   u8 *s;
 
   s = format (0, "SCRIPT: lisp_map_register_enable_disable ");
-  if (mp->is_enabled)
+  if (mp->is_enable)
     s = format (s, "enable");
   else
     s = format (s, "disable");
index 86f0009..a2e711f 100644 (file)
@@ -1,4 +1,5 @@
 import socket
+from ipaddress import ip_network
 
 from vpp_object import VppObject
 
@@ -19,13 +20,13 @@ class VppLispLocatorSet(VppObject):
         return self._ls_name
 
     def add_vpp_config(self):
-        self.test.vapi.lisp_add_del_locator_set(ls_name=self._ls_name)
+        self.test.vapi.lisp_add_del_locator_set(locator_set_name=self._ls_name)
         self._test.registry.register(self, self.test.logger)
 
     def get_lisp_locator_sets_dump_entry(self):
         result = self.test.vapi.lisp_locator_set_dump()
         for ls in result:
-            if ls.ls_name.strip(b'\x00') == self._ls_name:
+            if ls.ls_name.strip('\x00') == self._ls_name:
                 return ls
         return None
 
@@ -33,7 +34,7 @@ class VppLispLocatorSet(VppObject):
         return self.get_lisp_locator_sets_dump_entry() is not None
 
     def remove_vpp_config(self):
-        self.test.vapi.lisp_add_del_locator_set(ls_name=self._ls_name,
+        self.test.vapi.lisp_add_del_locator_set(locator_set_name=self._ls_name,
                                                 is_add=0)
 
     def object_id(self):
@@ -73,7 +74,7 @@ class VppLispLocator(VppObject):
         return self._weight
 
     def add_vpp_config(self):
-        self.test.vapi.lisp_add_del_locator(ls_name=self._ls_name,
+        self.test.vapi.lisp_add_del_locator(locator_set_name=self._ls_name,
                                             sw_if_index=self._sw_if_index,
                                             priority=self._priority,
                                             weight=self._weight)
@@ -93,7 +94,7 @@ class VppLispLocator(VppObject):
 
     def remove_vpp_config(self):
         self.test.vapi.lisp_add_del_locator(
-                ls_name=self._ls_name, sw_if_index=self._sw_if_index,
+                locator_set_name=self._ls_name, sw_if_index=self._sw_if_index,
                 priority=self._priority, weight=self._weight, is_add=0)
         self._test.registry.register(self, self.test.logger)
 
@@ -102,9 +103,9 @@ class VppLispLocator(VppObject):
 
 
 class LispEIDType(object):
-    IP4 = 0
-    IP6 = 1
-    MAC = 2
+    PREFIX = 0
+    MAC = 1
+    NSH = 2
 
 
 class LispKeyIdType(object):
@@ -117,35 +118,52 @@ class LispEID(object):
     """ Lisp endpoint identifier """
     def __init__(self, eid):
         self.eid = eid
+        self._type = -1
+
+        # find out whether EID is ip prefix, or MAC
+        try:
+            self.prefix = ip_network(self.eid)
+            self._type = LispEIDType.PREFIX
+            return
+        except ValueError:
+            if self.eid.count(":") == 5:  # MAC address
+                self.mac = self.eid
+                self._type = LispEIDType.MAC
+                return
+        raise Exception('Unsupported EID format {!s}!'.format(eid))
 
-        # find out whether EID is ip4 prefix, ip6 prefix or MAC
-        if self.eid.find("/") != -1:
-            if self.eid.find(":") == -1:
-                self.eid_type = LispEIDType.IP4
-                self.data_length = 4
-            else:
-                self.eid_type = LispEIDType.IP6
-                self.data_length = 16
-
-            self.eid_address = self.eid.split("/")[0]
-            self.prefix_length = int(self.eid.split("/")[1])
-        elif self.eid.count(":") == 5:  # MAC address
-            self.eid_type = LispEIDType.MAC
-            self.eid_address = self.eid
-            self.prefix_length = 0
-            self.data_length = 6
-        else:
-            raise Exception('Unsupported EID format {!s}!'.format(eid))
+    @property
+    def eid_type(self):
+        return self._type
+
+    @property
+    def address(self):
+        if self.eid_type == LispEIDType.PREFIX:
+            return self.prefix
+        elif self.eid_type == LispEIDType.MAC:
+            return self.mac
+        elif self.eid_type == LispEIDType.NSH:
+            return Exception('Unimplemented')
 
     @property
     def packed(self):
-        if self.eid_type == LispEIDType.IP4:
-            return socket.inet_pton(socket.AF_INET, self.eid_address)
-        elif self.eid_type == LispEIDType.IP6:
-            return socket.inet_pton(socket.AF_INET6, self.eid_address)
+        if self.eid_type == LispEIDType.PREFIX:
+            return {"type": self._type, "address": {"prefix": self.prefix}}
         elif self.eid_type == LispEIDType.MAC:
+            return {"type": self._type, "address": {"mac": self.mac}}
+        elif self.eid_type == LispEIDType.NSH:
             return Exception('Unimplemented')
-        raise Exception('Unknown EID type {!s}!'.format(self.eid_type))
+
+
+class LispKey(object):
+    """ Lisp Key """
+    def __init__(self, key_type, key):
+        self._key_type = key_type
+        self._key = key
+
+    @property
+    def packed(self):
+        return {"id": self._key_type, "key": self._key}
 
 
 class VppLispMapping(VppObject):
@@ -180,9 +198,7 @@ class VppLispMapping(VppObject):
 
     def get_lisp_mapping_dump_entry(self):
         return self.test.vapi.lisp_eid_table_dump(
-            eid_set=1, prefix_length=self._eid.prefix_length,
-            vni=self._vni, eid_type=self._eid.eid_type,
-            eid=self._eid.packed)
+            eid_set=1, vni=self._vni, eid=self._eid.packed)
 
     def query_vpp_config(self):
         mapping = self.get_lisp_mapping_dump_entry()
@@ -190,7 +206,7 @@ class VppLispMapping(VppObject):
 
     def object_id(self):
         return 'lisp-mapping-[%s]-%s-%s-%s' % (
-            self.vni, self.eid, self.priority, self.weight)
+            self.vni, self.eid.address, self.priority, self.weight)
 
 
 class VppLocalMapping(VppLispMapping):
@@ -199,8 +215,7 @@ class VppLocalMapping(VppLispMapping):
                  key_id=LispKeyIdType.NONE, key=''):
         super(VppLocalMapping, self).__init__(test, eid, vni, priority, weight)
         self._ls_name = ls_name
-        self._key_id = key_id
-        self._key = key
+        self._key = LispKey(key_id, key)
 
     @property
     def ls_name(self):
@@ -216,19 +231,29 @@ class VppLocalMapping(VppLispMapping):
 
     def add_vpp_config(self):
         self.test.vapi.lisp_add_del_local_eid(
-                ls_name=self._ls_name, eid_type=self._eid.eid_type,
-                eid=self._eid.packed, prefix_len=self._eid.prefix_length,
-                vni=self._vni, key_id=self._key_id, key=self._key)
+                locator_set_name=self._ls_name, eid=self._eid.packed,
+                vni=self._vni, key=self._key.packed)
         self._test.registry.register(self, self.test.logger)
 
     def remove_vpp_config(self):
         self.test.vapi.lisp_add_del_local_eid(
-                ls_name=self._ls_name, eid_type=self._eid.eid_type,
-                eid=self._eid.packed, prefix_len=self._eid.prefix_length,
+                locator_set_name=self._ls_name, eid=self._eid.packed,
                 vni=self._vni, is_add=0)
 
     def object_id(self):
-        return 'lisp-eid-local-mapping-%s[%d]' % (self._eid, self._vni)
+        return 'lisp-eid-local-mapping-%s[%d]' % (self._eid.address, self._vni)
+
+
+class LispRemoteLocator(object):
+    def __init__(self, addr, priority=1, weight=1):
+        self.addr = addr
+        self.priority = priority
+        self.weight = weight
+
+    @property
+    def packed(self):
+        return {"priority": self.priority, "weight": self.weight,
+                "ip_address": self.addr}
 
 
 class VppRemoteMapping(VppLispMapping):
@@ -240,23 +265,24 @@ class VppRemoteMapping(VppLispMapping):
 
     @property
     def rlocs(self):
-        return self._rlocs
+        rlocs = []
+        for rloc in self._rlocs:
+            rlocs.append(rloc.packed)
+        return rlocs
 
     def add_vpp_config(self):
         self.test.vapi.lisp_add_del_remote_mapping(
-                rlocs=self._rlocs, eid_type=self._eid.eid_type,
-                eid=self._eid.packed, eid_prefix_len=self._eid.prefix_length,
-                vni=self._vni, rlocs_num=len(self._rlocs))
+                rlocs=self.rlocs, deid=self._eid.packed,
+                vni=self._vni, rloc_num=len(self._rlocs))
         self._test.registry.register(self, self.test.logger)
 
     def remove_vpp_config(self):
         self.test.vapi.lisp_add_del_remote_mapping(
-                eid_type=self._eid.eid_type, eid=self._eid.packed,
-                eid_prefix_len=self._eid.prefix_length, vni=self._vni,
-                is_add=0, rlocs_num=0)
+                deid=self._eid.packed, vni=self._vni, is_add=0, rloc_num=0)
 
     def object_id(self):
-        return 'lisp-eid-remote-mapping-%s[%d]' % (self._eid, self._vni)
+        return 'lisp-eid-remote-mapping-%s[%d]' % (self._eid.address,
+                                                   self._vni)
 
 
 class VppLispAdjacency(VppObject):
@@ -288,22 +314,19 @@ class VppLispAdjacency(VppObject):
 
     def add_vpp_config(self):
         self.test.vapi.lisp_add_del_adjacency(
-                leid=self._leid.packed,
-                reid=self._reid.packed, eid_type=self._leid.eid_type,
-                leid_len=self._leid.prefix_length,
-                reid_len=self._reid.prefix_length, vni=self._vni)
+                leid=self._leid.packed, reid=self._reid.packed, vni=self._vni)
         self._test.registry.register(self, self.test.logger)
 
     @staticmethod
-    def eid_equal(eid, eid_type, eid_data, prefix_len):
-        if eid.eid_type != eid_type:
+    def eid_equal(eid, eid_api):
+        if eid.eid_type != eid_api.type:
             return False
 
-        if eid_type == LispEIDType.IP4 or eid_type == LispEIDType.IP6:
-            if eid.prefix_length != prefix_len:
+        if eid_api.type == LispEIDType.PREFIX:
+            if eid.address.prefixlen != eid_api.address.prefix.prefixlen:
                 return False
 
-        if eid.packed != eid_data[0:eid.data_length]:
+        if eid.address != eid_api.address:
             return False
 
         return True
@@ -311,19 +334,15 @@ class VppLispAdjacency(VppObject):
     def query_vpp_config(self):
         res = self.test.vapi.lisp_adjacencies_get(vni=self._vni)
         for adj in res.adjacencies:
-            if self.eid_equal(self._leid, adj.eid_type, adj.leid,
-                              adj.leid_prefix_len) and \
-                self.eid_equal(self._reid, adj.eid_type, adj.reid,
-                               adj.reid_prefix_len):
+            if self.eid_equal(self._leid, adj.leid) and \
+                    self.eid_equal(self._reid, adj.reid):
                 return True
         return False
 
     def remove_vpp_config(self):
         self.test.vapi.lisp_add_del_adjacency(
-                leid=self._leid.packed,
-                reid=self._reid.packed, eid_type=self._leid.eid_type,
-                leid_len=self._leid.prefix_length,
-                reid_len=self._reid.prefix_length, vni=self._vni, is_add=0)
+                leid=self._leid.packed, reid=self._reid.packed,
+                vni=self._vni, is_add=0)
 
     def object_id(self):
         return 'lisp-adjacency-%s-%s[%d]' % (self._leid, self._reid, self._vni)
index 596df8c..70cb4f4 100644 (file)
@@ -11,7 +11,7 @@ from scapy.layers.inet6 import IPv6
 
 from framework import VppTestCase, VppTestRunner
 from lisp import VppLocalMapping, VppLispAdjacency, VppLispLocator, \
-    VppLispLocatorSet, VppRemoteMapping
+    VppLispLocatorSet, VppRemoteMapping, LispRemoteLocator
 from util import ppp, ForeignAddressFactory
 
 # From py_lispnetworking.lisp.py:  # GNU General Public License v2.0
@@ -151,7 +151,7 @@ class TestLisp(VppTestCase):
 
     def setUp(self):
         super(TestLisp, self).setUp()
-        self.vapi.lisp_enable_disable(is_enabled=1)
+        self.vapi.lisp_enable_disable(is_enable=1)
 
     def test_lisp_basic_encap(self):
         """Test case for basic encapsulation"""
@@ -159,26 +159,21 @@ class TestLisp(VppTestCase):
         self.deid_ip4_net = self.faf.net
         self.deid_ip4 = self.faf.get_ip4()
         self.seid_ip4 = '{!s}/{!s}'.format(self.pg0.local_ip4, 32)
-        self.rloc_ip4 = self.pg1.remote_ip4n
+        self.rloc_ip4 = self.pg1.remote_ip4
 
         test_cases = [
             {
                 'name': 'basic ip4 over ip4',
-                'locator-sets': [VppLispLocatorSet(self, b'ls-4o4')],
+                'locator-sets': [VppLispLocatorSet(self, 'ls-4o4')],
                 'locators': [
-                    VppLispLocator(self, self.pg1.sw_if_index, b'ls-4o4')
+                    VppLispLocator(self, self.pg1.sw_if_index, 'ls-4o4')
                 ],
                 'local-mappings': [
-                    VppLocalMapping(self, self.seid_ip4, b'ls-4o4')
+                    VppLocalMapping(self, self.seid_ip4, 'ls-4o4')
                 ],
                 'remote-mappings': [
                     VppRemoteMapping(self, self.deid_ip4_net,
-                                     [{
-                                         "is_ip4": 1,
-                                         "priority": 1,
-                                         "weight": 1,
-                                         "addr": self.rloc_ip4
-                                     }])
+                                     [LispRemoteLocator(self.rloc_ip4)])
                 ],
                 'adjacencies': [
                     VppLispAdjacency(self, self.seid_ip4, self.deid_ip4_net)
index 94de500..92820b0 100644 (file)
@@ -711,130 +711,6 @@ class VppPapiProvider(object):
                             'is_ip6': is_ip6
                         }})
 
-    def lisp_enable_disable(self, is_enabled):
-        return self.api(
-            self.papi.lisp_enable_disable,
-            {
-                'is_en': is_enabled,
-            })
-
-    def lisp_add_del_locator_set(self,
-                                 ls_name,
-                                 is_add=1):
-        return self.api(
-            self.papi.lisp_add_del_locator_set,
-            {
-                'is_add': is_add,
-                'locator_set_name': ls_name
-            })
-
-    def lisp_add_del_locator(self,
-                             ls_name,
-                             sw_if_index,
-                             priority=1,
-                             weight=1,
-                             is_add=1):
-        return self.api(
-            self.papi.lisp_add_del_locator,
-            {
-                'is_add': is_add,
-                'locator_set_name': ls_name,
-                'sw_if_index': sw_if_index,
-                'priority': priority,
-                'weight': weight
-            })
-
-    def lisp_locator_dump(self, is_index_set, ls_name=None, ls_index=0):
-        return self.api(
-            self.papi.lisp_locator_dump,
-            {
-                'is_index_set': is_index_set,
-                'ls_name': ls_name,
-                'ls_index': ls_index,
-            })
-
-    def lisp_add_del_local_eid(self,
-                               ls_name,
-                               eid_type,
-                               eid,
-                               prefix_len,
-                               vni=0,
-                               key_id=0,
-                               key="",
-                               is_add=1):
-        return self.api(
-            self.papi.lisp_add_del_local_eid,
-            {
-                'locator_set_name': ls_name,
-                'is_add': is_add,
-                'eid_type': eid_type,
-                'eid': eid,
-                'prefix_len': prefix_len,
-                'vni': vni,
-                'key_id': key_id,
-                'key': key
-            })
-
-    def lisp_eid_table_dump(self,
-                            eid_set=0,
-                            prefix_length=0,
-                            vni=0,
-                            eid_type=0,
-                            eid=None,
-                            filter_opt=0):
-        return self.api(
-            self.papi.lisp_eid_table_dump,
-            {
-                'eid_set': eid_set,
-                'prefix_length': prefix_length,
-                'vni': vni,
-                'eid_type': eid_type,
-                'eid': eid,
-                'filter': filter_opt,
-            })
-
-    def lisp_add_del_remote_mapping(self,
-                                    eid_type,
-                                    eid,
-                                    eid_prefix_len=0,
-                                    vni=0,
-                                    rlocs=[],
-                                    rlocs_num=0,
-                                    is_src_dst=0,
-                                    is_add=1):
-        return self.api(
-            self.papi.lisp_add_del_remote_mapping,
-            {
-                'is_add': is_add,
-                'eid_type': eid_type,
-                'eid': eid,
-                'eid_len': eid_prefix_len,
-                'rloc_num': rlocs_num,
-                'rlocs': rlocs,
-                'vni': vni,
-                'is_src_dst': is_src_dst,
-            })
-
-    def lisp_add_del_adjacency(self,
-                               leid,
-                               reid,
-                               leid_len,
-                               reid_len,
-                               eid_type,
-                               is_add=1,
-                               vni=0):
-        return self.api(
-            self.papi.lisp_add_del_adjacency,
-            {
-                'is_add': is_add,
-                'vni': vni,
-                'eid_type': eid_type,
-                'leid': leid,
-                'reid': reid,
-                'leid_len': leid_len,
-                'reid_len': reid_len,
-            })
-
     def vxlan_gpe_add_del_tunnel(
             self,
             src_addr,