MAP: Move MAP-E/T to a plugin. 85/13185/11
authorOle Troan <ot@cisco.com>
Fri, 22 Jun 2018 09:32:12 +0000 (11:32 +0200)
committerFlorin Coras <florin.coras@gmail.com>
Mon, 25 Jun 2018 20:19:40 +0000 (20:19 +0000)
Only remaining traces of MAP in the src/vnet is now in buffer.h.
Awaiting a new buffer opaque API (hint, hint).

Change-Id: Ie165561484731f1d7ed6e0f604b43624e06db3f0
Signed-off-by: Ole Troan <ot@cisco.com>
27 files changed:
MAINTAINERS
src/configure.ac
src/plugins/Makefile.am
src/plugins/examples/gen-rules.py [moved from src/vnet/map/examples/gen-rules.py with 100% similarity]
src/plugins/examples/health_check.c [moved from src/vnet/map/examples/health_check.c with 100% similarity]
src/plugins/examples/test_map.py [moved from src/vnet/map/examples/test_map.py with 100% similarity]
src/plugins/map.am [new file with mode: 0644]
src/plugins/map/gen-rules.py [moved from src/vnet/map/gen-rules.py with 100% similarity]
src/plugins/map/ip4_map.c [moved from src/vnet/map/ip4_map.c with 99% similarity]
src/plugins/map/ip4_map_t.c [moved from src/vnet/map/ip4_map_t.c with 99% similarity]
src/plugins/map/ip6_map.c [moved from src/vnet/map/ip6_map.c with 99% similarity]
src/plugins/map/ip6_map_t.c [moved from src/vnet/map/ip6_map_t.c with 99% similarity]
src/plugins/map/map.api [moved from src/vnet/map/map.api with 100% similarity]
src/plugins/map/map.c [moved from src/vnet/map/map.c with 99% similarity]
src/plugins/map/map.h [moved from src/vnet/map/map.h with 99% similarity]
src/plugins/map/map_all_api_h.h [new file with mode: 0644]
src/plugins/map/map_api.c [moved from src/vnet/map/map_api.c with 82% similarity]
src/plugins/map/map_doc.md [moved from src/vnet/map/map_doc.md with 100% similarity]
src/plugins/map/map_dpo.c [moved from src/vnet/map/map_dpo.c with 98% similarity]
src/plugins/map/map_dpo.h [moved from src/vnet/map/map_dpo.h with 100% similarity]
src/plugins/map/map_msg_enum.h [new file with mode: 0644]
src/plugins/map/map_test.c [new file with mode: 0644]
src/plugins/map/test.c [moved from src/vnet/map/test.c with 100% similarity]
src/vat/api_format.c
src/vnet.am
src/vnet/buffer.h
src/vnet/vnet_all_api_h.h

index 41f0971..6651fc9 100644 (file)
@@ -101,9 +101,9 @@ M:  Florin Coras <fcoras@cisco.com>
 F:     src/vnet/lisp-cp/
 F:     src/vnet/lisp-gpe/
 
-VNET MAP
+Plugin - MAP
 M:     Ole Troan <ot@cisco.com>
-F:     src/vnet/map
+F:     src/plugins/map
 
 VNET MPLS
 M:     Neale Ranns <nranns@cisco.com>
index 2b6db95..170a908 100644 (file)
@@ -315,6 +315,7 @@ PLUGIN_ENABLED(marvell)
 PLUGIN_ENABLED(memif)
 PLUGIN_ENABLED(pppoe)
 PLUGIN_ENABLED(nat)
+PLUGIN_ENABLED(map)
 PLUGIN_ENABLED(srv6ad)
 PLUGIN_ENABLED(srv6am)
 PLUGIN_ENABLED(srv6as)
index 9c891c5..5d9ca8b 100644 (file)
@@ -115,6 +115,10 @@ if ENABLE_NAT_PLUGIN
 include nat.am
 endif
 
+if ENABLE_MAP_PLUGIN
+include map.am
+endif
+
 if ENABLE_STN_PLUGIN
 include stn.am
 endif
diff --git a/src/plugins/map.am b/src/plugins/map.am
new file mode 100644 (file)
index 0000000..555d700
--- /dev/null
@@ -0,0 +1,39 @@
+
+# Copyright (c) <current-year> <your-organization>
+# 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.
+
+vppapitestplugins_LTLIBRARIES += map_test_plugin.la
+vppplugins_LTLIBRARIES += map_plugin.la
+
+map_plugin_la_SOURCES =                                \
+       map/ip4_map.c                           \
+       map/ip4_map_t.c                         \
+       map/ip6_map.c                           \
+       map/ip6_map_t.c                         \
+       map/map_api.c                           \
+       map/map.c                               \
+       map/map_dpo.c
+
+API_FILES += map/map.api
+
+nobase_apiinclude_HEADERS +=                   \
+       map/map_all_api_h.h                     \
+       map/map_msg_enum.h                      \
+       map/map.api.h                           \
+       map/map_dpo.h                           \
+       map/map.h
+
+map_test_plugin_la_SOURCES =                   \
+       map/map_test.c
+
+# vi:syntax=automake
similarity index 99%
rename from src/vnet/map/ip4_map.c
rename to src/plugins/map/ip4_map.c
index 6a3bdd5..1bb33b0 100644 (file)
@@ -18,7 +18,7 @@
 #define MAP_ENCAP_DUAL 0
 
 #include "map.h"
-#include "../ip/ip_frag.h"
+#include <vnet/ip/ip_frag.h>
 #include <vnet/ip/ip4_to_ip6.h>
 
 vlib_node_registration_t ip4_map_reass_node;
similarity index 99%
rename from src/vnet/map/ip4_map_t.c
rename to src/plugins/map/ip4_map_t.c
index 0a1dc8f..ab4b46c 100644 (file)
@@ -14,7 +14,7 @@
  */
 #include "map.h"
 
-#include "../ip/ip_frag.h"
+#include <vnet/ip/ip_frag.h>
 #include <vnet/ip/ip4_to_ip6.h>
 
 #define IP4_MAP_T_DUAL_LOOP 1
similarity index 99%
rename from src/vnet/map/ip6_map.c
rename to src/plugins/map/ip6_map.c
index 720d13c..5cdd9d9 100644 (file)
@@ -14,7 +14,7 @@
  */
 #include "map.h"
 
-#include "../ip/ip_frag.h"
+#include <vnet/ip/ip_frag.h>
 #include <vnet/ip/ip4_to_ip6.h>
 #include <vnet/ip/ip6_to_ip4.h>
 
similarity index 99%
rename from src/vnet/map/ip6_map_t.c
rename to src/plugins/map/ip6_map_t.c
index 05bac1d..852b127 100644 (file)
@@ -14,7 +14,7 @@
  */
 #include "map.h"
 
-#include "../ip/ip_frag.h"
+#include <vnet/ip/ip_frag.h>
 #include <vnet/ip/ip6_to_ip4.h>
 #include <vnet/ip/ip4_to_ip6.h>
 
similarity index 100%
rename from src/vnet/map/map.api
rename to src/plugins/map/map.api
similarity index 99%
rename from src/vnet/map/map.c
rename to src/plugins/map/map.c
index 702b5f8..6d9730f 100644 (file)
 #include <vnet/fib/fib_table.h>
 #include <vnet/fib/ip6_fib.h>
 #include <vnet/adj/adj.h>
-#include <vnet/map/map_dpo.h>
+#include <map/map_dpo.h>
 #include <vppinfra/crc32.h>
-
+#include <vnet/plugin/plugin.h>
+#include <vpp/app/version.h>
 #include "map.h"
 
 map_main_t map_main;
@@ -2245,6 +2246,12 @@ VLIB_CLI_COMMAND(show_map_fragments_command, static) = {
   .short_help = "show map fragments",
   .function = show_map_fragments_command_fn,
 };
+
+VLIB_PLUGIN_REGISTER() = {
+  .version = VPP_BUILD_VER,
+  .description = "Mapping of address and port (MAP)",
+};
+
 /* *INDENT-ON* */
 
 static clib_error_t *
@@ -2276,6 +2283,7 @@ clib_error_t *
 map_init (vlib_main_t * vm)
 {
   map_main_t *mm = &map_main;
+  clib_error_t *error = 0;
   mm->vnet_main = vnet_get_main ();
   mm->vlib_main = vm;
 
@@ -2349,7 +2357,9 @@ map_init (vlib_main_t * vm)
 #endif
   map_dpo_module_init ();
 
-  return 0;
+  error = map_plugin_api_hookup (vm);
+
+  return error;
 }
 
 VLIB_INIT_FUNCTION (map_init);
similarity index 99%
rename from src/vnet/map/map.h
rename to src/plugins/map/map.h
index c304a1e..45959f0 100644 (file)
@@ -20,7 +20,7 @@
 #include <vnet/fib/fib_types.h>
 #include <vnet/fib/ip4_fib.h>
 #include <vnet/adj/adj.h>
-#include <vnet/map/map_dpo.h>
+#include <map/map_dpo.h>
 #include <vnet/dpo/load_balance.h>
 
 #define MAP_SKIP_IP6_LOOKUP 1
@@ -236,6 +236,9 @@ typedef struct {
   vlib_combined_counter_main_t *domain_counters;
   volatile u32 *counter_lock;
 
+  /* API message id base */
+  u16 msg_id_base;
+
   /* Traffic class: zero, copy (~0) or fixed value */
   u8 tc;
   bool tc_copy;
@@ -486,6 +489,8 @@ map_ip4_reass_get_fragments(map_ip4_reass_t *r, u32 **pi)
     }
 }
 
+clib_error_t * map_plugin_api_hookup (vlib_main_t * vm);
+
 int map_ip4_reass_add_fragment(map_ip4_reass_t *r, u32 pi);
 
 map_ip6_reass_t *
diff --git a/src/plugins/map/map_all_api_h.h b/src/plugins/map/map_all_api_h.h
new file mode 100644 (file)
index 0000000..4fb3e19
--- /dev/null
@@ -0,0 +1,19 @@
+
+/*
+ * map_all_api_h.h - skeleton vpp engine plug-in api #include file
+ *
+ * Copyright (c) 2018 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 the generated file, see BUILT_SOURCES in Makefile.am */
+#include <map/map.api.h>
similarity index 82%
rename from src/vnet/map/map_api.c
rename to src/plugins/map/map_api.c
index e06dd59..90dbd1b 100644 (file)
  *------------------------------------------------------------------
  */
 
-#include <vnet/vnet.h>
-#include <vlibmemory/api.h>
-
-#include "map.h"
-#include <vnet/api_errno.h>
+#include <map/map.h>
+#include <map/map_msg_enum.h>
 #include <vnet/ip/ip.h>
 #include <vnet/fib/fib_table.h>
-#include <vnet/vnet_msg_enum.h>
+#include <vlibmemory/api.h>
 
 #define vl_typedefs            /* define message structures */
-#include <vnet/vnet_all_api_h.h>
+#include <map/map_all_api_h.h>
 #undef vl_typedefs
 
 #define vl_endianfun           /* define message structures */
-#include <vnet/vnet_all_api_h.h>
+#include <map/map_all_api_h.h>
 #undef vl_endianfun
 
 /* instantiate all the print functions we know about */
 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
 #define vl_printfun
-#include <vnet/vnet_all_api_h.h>
+#include <map/map_all_api_h.h>
 #undef vl_printfun
 
-#include <vlibapi/api_helper_macros.h>
+/* Get the API version number */
+#define vl_api_version(n,v) static u32 api_version=(v);
+#include <map/map_all_api_h.h>
+#undef vl_api_version
 
-#define foreach_vpe_api_msg                    \
-_(MAP_ADD_DOMAIN, map_add_domain)              \
-_(MAP_DEL_DOMAIN, map_del_domain)              \
-_(MAP_ADD_DEL_RULE, map_add_del_rule)          \
-_(MAP_DOMAIN_DUMP, map_domain_dump)            \
-_(MAP_RULE_DUMP, map_rule_dump)                        \
-_(MAP_SUMMARY_STATS, map_summary_stats)
+#define REPLY_MSG_ID_BASE mm->msg_id_base
+#include <vlibapi/api_helper_macros.h>
 
 static void
 vl_api_map_add_domain_t_handler (vl_api_map_add_domain_t * mp)
 {
+  map_main_t *mm = &map_main;
   vl_api_map_add_domain_reply_t *rmp;
   int rv = 0;
   u32 index;
@@ -83,6 +79,7 @@ vl_api_map_add_domain_t_handler (vl_api_map_add_domain_t * mp)
 static void
 vl_api_map_del_domain_t_handler (vl_api_map_del_domain_t * mp)
 {
+  map_main_t *mm = &map_main;
   vl_api_map_del_domain_reply_t *rmp;
   int rv = 0;
 
@@ -94,6 +91,7 @@ vl_api_map_del_domain_t_handler (vl_api_map_del_domain_t * mp)
 static void
 vl_api_map_add_del_rule_t_handler (vl_api_map_add_del_rule_t * mp)
 {
+  map_main_t *mm = &map_main;
   vl_api_map_del_domain_reply_t *rmp;
   int rv = 0;
 
@@ -124,22 +122,23 @@ vl_api_map_domain_dump_t_handler (vl_api_map_domain_dump_t * mp)
   ({
     /* Make sure every field is initiated (or don't skip the memset()) */
     rmp = vl_msg_api_alloc (sizeof (*rmp));
-    rmp->_vl_msg_id = ntohs(VL_API_MAP_DOMAIN_DETAILS);
+    rmp->_vl_msg_id = htons(VL_API_MAP_DOMAIN_DETAILS + mm->msg_id_base);
+    rmp->context = mp->context;
     rmp->domain_index = htonl(d - mm->domains);
-    rmp->ea_bits_len = d->ea_bits_len;
-    rmp->psid_offset = d->psid_offset;
-    rmp->psid_length = d->psid_length;
-    clib_memcpy(rmp->ip4_prefix, &d->ip4_prefix, sizeof(rmp->ip4_prefix));
-    rmp->ip4_prefix_len = d->ip4_prefix_len;
     clib_memcpy(rmp->ip6_prefix, &d->ip6_prefix, sizeof(rmp->ip6_prefix));
-    rmp->ip6_prefix_len = d->ip6_prefix_len;
+    clib_memcpy(rmp->ip4_prefix, &d->ip4_prefix, sizeof(rmp->ip4_prefix));
     clib_memcpy(rmp->ip6_src, &d->ip6_src, sizeof(rmp->ip6_src));
+    rmp->ip6_prefix_len = d->ip6_prefix_len;
+    rmp->ip4_prefix_len = d->ip4_prefix_len;
     rmp->ip6_src_len = d->ip6_src_len;
+    rmp->ea_bits_len = d->ea_bits_len;
+    rmp->psid_offset = d->psid_offset;
+    rmp->psid_length = d->psid_length;
+    rmp->flags = d->flags;
     rmp->mtu = htons(d->mtu);
-    rmp->is_translation = (d->flags & MAP_DOMAIN_TRANSLATION);
-    rmp->context = mp->context;
+    rmp->is_translation = (d->flags & MAP_DOMAIN_TRANSLATION); // Redundant
 
-    vl_api_send_msg (reg, (u8 *)&rmp);
+    vl_api_send_msg (reg, (u8 *) rmp);
   }));
   /* *INDENT-ON* */
 }
@@ -177,7 +176,7 @@ vl_api_map_rule_dump_t_handler (vl_api_map_rule_dump_t * mp)
        }
       rmp = vl_msg_api_alloc (sizeof (*rmp));
       memset (rmp, 0, sizeof (*rmp));
-      rmp->_vl_msg_id = ntohs (VL_API_MAP_RULE_DETAILS);
+      rmp->_vl_msg_id = ntohs (VL_API_MAP_RULE_DETAILS + mm->msg_id_base);
       rmp->psid = htons (i);
       clib_memcpy (rmp->ip6_dst, &dst, sizeof (rmp->ip6_dst));
       rmp->context = mp->context;
@@ -202,7 +201,7 @@ vl_api_map_summary_stats_t_handler (vl_api_map_summary_stats_t * mp)
     return;
 
   rmp = vl_msg_api_alloc (sizeof (*rmp));
-  rmp->_vl_msg_id = ntohs (VL_API_MAP_SUMMARY_STATS_REPLY);
+  rmp->_vl_msg_id = htons (VL_API_MAP_SUMMARY_STATS_REPLY + mm->msg_id_base);
   rmp->context = mp->context;
   rmp->retval = 0;
 
@@ -252,50 +251,57 @@ out:
   vl_api_send_msg (reg, (u8 *) rmp);
 }
 
-/*
- * vpe_api_hookup
- * Add vpe's API message handlers to the table.
- * vlib has alread mapped shared memory and
- * added the client registration handlers.
- * See .../vlib-api/vlibmemory/memclnt_vlib.c:memclnt_process()
- */
+#define foreach_map_plugin_api_msg             \
+_(MAP_ADD_DOMAIN, map_add_domain)              \
+_(MAP_DEL_DOMAIN, map_del_domain)              \
+_(MAP_ADD_DEL_RULE, map_add_del_rule)          \
+_(MAP_DOMAIN_DUMP, map_domain_dump)            \
+_(MAP_RULE_DUMP, map_rule_dump)                        \
+_(MAP_SUMMARY_STATS, map_summary_stats)
+
 #define vl_msg_name_crc_list
-#include <vnet/vnet_all_api_h.h>
+#include <map/map_all_api_h.h>
 #undef vl_msg_name_crc_list
 
 static void
-setup_message_id_table (api_main_t * am)
+setup_message_id_table (map_main_t * mm, api_main_t * am)
 {
-#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
+#define _(id,n,crc)                                                    \
+  vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + mm->msg_id_base);
   foreach_vl_msg_name_crc_map;
 #undef _
 }
 
-static clib_error_t *
-map_api_hookup (vlib_main_t * vm)
+/* Set up the API message handling tables */
+clib_error_t *
+map_plugin_api_hookup (vlib_main_t * vm)
 {
-  api_main_t *am = &api_main;
+  map_main_t *mm = &map_main;
+  u8 *name = format (0, "map_%08x%c", api_version, 0);
 
+  /* Ask for a correctly-sized block of API message decode slots */
+  mm->msg_id_base =
+    vl_msg_api_get_msg_ids ((char *) name, VL_MSG_FIRST_AVAILABLE);
 #define _(N,n)                                                  \
-    vl_msg_api_set_handlers(VL_API_##N, #n,                     \
+    vl_msg_api_set_handlers((VL_API_##N + mm->msg_id_base),     \
+                           #n,                                 \
                            vl_api_##n##_t_handler,              \
                            vl_noop_handler,                     \
                            vl_api_##n##_t_endian,               \
                            vl_api_##n##_t_print,                \
                            sizeof(vl_api_##n##_t), 1);
-  foreach_vpe_api_msg;
+  foreach_map_plugin_api_msg;
 #undef _
 
   /*
    * Set up the (msg_name, crc, message-id) table
    */
-  setup_message_id_table (am);
+  setup_message_id_table (mm, &api_main);
 
+  vec_free (name);
   return 0;
 }
 
-VLIB_API_INIT_FUNCTION (map_api_hookup);
-
 /*
  * fd.io coding-style-patch-verification: ON
  *
similarity index 98%
rename from src/vnet/map/map_dpo.c
rename to src/plugins/map/map_dpo.c
index 430c1fb..059a4df 100644 (file)
@@ -14,7 +14,7 @@
  */
 
 #include <vnet/ip/ip.h>
-#include <vnet/map/map_dpo.h>
+#include <map/map_dpo.h>
 
 /**
  * The register MAP DPO type
diff --git a/src/plugins/map/map_msg_enum.h b/src/plugins/map/map_msg_enum.h
new file mode 100644 (file)
index 0000000..b135cfc
--- /dev/null
@@ -0,0 +1,31 @@
+
+/*
+ * map_msg_enum.h - skeleton vpp engine plug-in message enumeration
+ *
+ * Copyright (c) 2018 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.
+ */
+#ifndef included_map_msg_enum_h
+#define included_map_msg_enum_h
+
+#include <vppinfra/byte_order.h>
+
+#define vl_msg_id(n,h) n,
+typedef enum {
+#include <map/map_all_api_h.h>
+    /* We'll want to know how many messages IDs we need... */
+    VL_MSG_FIRST_AVAILABLE,
+} vl_msg_id_t;
+#undef vl_msg_id
+
+#endif
diff --git a/src/plugins/map/map_test.c b/src/plugins/map/map_test.c
new file mode 100644 (file)
index 0000000..bb69cbc
--- /dev/null
@@ -0,0 +1,504 @@
+/*
+ * Copyright (c) 2018 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.
+ */
+/*
+ *------------------------------------------------------------------
+ * map_test.c - test harness plugin
+ *------------------------------------------------------------------
+ */
+
+#include <vat/vat.h>
+#include <vlibapi/api.h>
+#include <vlibmemory/api.h>
+#include <vppinfra/error.h>
+#include <vnet/ip/ip.h>
+
+#define __plugin_msg_base map_test_main.msg_id_base
+#include <vlibapi/vat_helper_macros.h>
+
+/* Declare message IDs */
+#include <map/map_msg_enum.h>
+
+/* Get CRC codes of the messages defined outside of this plugin */
+#define vl_msg_name_crc_list
+#include <vpp/api/vpe_all_api_h.h>
+#undef vl_msg_name_crc_list
+
+/* define message structures */
+#define vl_typedefs
+#include <vpp/api/vpe_all_api_h.h>
+#include <map/map_all_api_h.h> 
+#undef vl_typedefs
+
+/* declare message handlers for each api */
+
+#define vl_endianfun             /* define message structures */
+#include <map/map_all_api_h.h> 
+#undef vl_endianfun
+
+/* instantiate all the print functions we know about */
+#define vl_print(handle, ...)
+#define vl_printfun
+#include <map/map_all_api_h.h> 
+#undef vl_printfun
+
+/* Get the API version number. */
+#define vl_api_version(n,v) static u32 api_version=(v);
+#include <map/map_all_api_h.h>
+#undef vl_api_version
+
+typedef struct {
+  /* API message ID base */
+  u16 msg_id_base;
+  u32 ping_id;
+  vat_main_t *vat_main;
+} map_test_main_t;
+
+map_test_main_t map_test_main;
+
+#define foreach_standard_reply_retval_handler   \
+_(map_del_domain_reply)                                \
+_(map_add_del_rule_reply)
+
+#define _(n)                                                           \
+    static void vl_api_##n##_t_handler                                 \
+    (vl_api_##n##_t * mp)                                              \
+    {                                                                  \
+        vat_main_t * vam = map_test_main.vat_main;                     \
+        i32 retval = ntohl(mp->retval);                                        \
+       if (vam->json_output) {                                         \
+         vat_json_node_t node;                                         \
+         vat_json_init_object (&node);                                 \
+         vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); \
+         vat_json_print (vam->ofp, &node);                             \
+         vat_json_free (&node);                                        \
+         return;                                                       \
+       }                                                               \
+        if (vam->async_mode) {                                         \
+            vam->async_errors += (retval < 0);                         \
+        } else {                                                       \
+            vam->retval = retval;                                      \
+            vam->result_ready = 1;                                     \
+        }                                                              \
+    }
+foreach_standard_reply_retval_handler;
+#undef _
+
+/* 
+ * Table of message reply handlers, must include boilerplate handlers
+ * we just generated
+ */
+#define foreach_vpe_api_reply_msg                      \
+_(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply)          \
+_(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply)          \
+_(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply)      \
+_(MAP_DOMAIN_DETAILS, map_domain_details)
+
+static int
+api_map_add_domain (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_map_add_domain_t *mp;
+
+  ip4_address_t ip4_prefix;
+  ip6_address_t ip6_prefix;
+  ip6_address_t ip6_src;
+  u32 num_m_args = 0;
+  u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
+    0, psid_length = 0;
+  u8 is_translation = 0;
+  u32 mtu = 0;
+  u32 ip6_src_len = 128;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
+                   &ip4_prefix, &ip4_prefix_len))
+       num_m_args++;
+      else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
+                        &ip6_prefix, &ip6_prefix_len))
+       num_m_args++;
+      else
+       if (unformat
+           (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
+            &ip6_src_len))
+       num_m_args++;
+      else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
+       num_m_args++;
+      else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
+       num_m_args++;
+      else if (unformat (i, "psid-offset %d", &psid_offset))
+       num_m_args++;
+      else if (unformat (i, "psid-len %d", &psid_length))
+       num_m_args++;
+      else if (unformat (i, "mtu %d", &mtu))
+       num_m_args++;
+      else if (unformat (i, "map-t"))
+       is_translation = 1;
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, i);
+         return -99;
+       }
+    }
+
+  if (num_m_args < 3)
+    {
+      errmsg ("mandatory argument(s) missing");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (MAP_ADD_DOMAIN, mp);
+
+  clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
+  mp->ip4_prefix_len = ip4_prefix_len;
+
+  clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
+  mp->ip6_prefix_len = ip6_prefix_len;
+
+  clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
+  mp->ip6_src_prefix_len = ip6_src_len;
+
+  mp->ea_bits_len = ea_bits_len;
+  mp->psid_offset = psid_offset;
+  mp->psid_length = psid_length;
+  mp->is_translation = is_translation;
+  mp->mtu = htons (mtu);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply, return good/bad news  */
+  W (ret);
+  return ret;
+}
+static int
+api_map_del_domain (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_map_del_domain_t *mp;
+
+  u32 num_m_args = 0;
+  u32 index;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "index %d", &index))
+       num_m_args++;
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, i);
+         return -99;
+       }
+    }
+
+  if (num_m_args != 1)
+    {
+      errmsg ("mandatory argument(s) missing");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (MAP_DEL_DOMAIN, mp);
+
+  mp->index = ntohl (index);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply, return good/bad news  */
+  W (ret);
+  return ret;
+}
+
+static int
+api_map_add_del_rule (vat_main_t * vam)
+{
+  unformat_input_t *i = vam->input;
+  vl_api_map_add_del_rule_t *mp;
+  u8 is_add = 1;
+  ip6_address_t ip6_dst;
+  u32 num_m_args = 0, index, psid = 0;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "index %d", &index))
+       num_m_args++;
+      else if (unformat (i, "psid %d", &psid))
+       num_m_args++;
+      else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
+       num_m_args++;
+      else if (unformat (i, "del"))
+       {
+         is_add = 0;
+       }
+      else
+       {
+         clib_warning ("parse error '%U'", format_unformat_error, i);
+         return -99;
+       }
+    }
+
+  /* Construct the API message */
+  M (MAP_ADD_DEL_RULE, mp);
+
+  mp->index = ntohl (index);
+  mp->is_add = is_add;
+  clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
+  mp->psid = ntohs (psid);
+
+  /* send it... */
+  S (mp);
+
+  /* Wait for a reply, return good/bad news  */
+  W (ret);
+  return ret;
+}
+static int
+api_map_domain_dump (vat_main_t * vam)
+{
+  map_test_main_t *mm = &map_test_main;
+  vl_api_map_domain_dump_t *mp;
+  vl_api_control_ping_t *mp_ping;
+  int ret;
+
+  /* Construct the API message */
+  M (MAP_DOMAIN_DUMP, mp);
+
+  /* send it... */
+  S (mp);
+
+  /* Use a control ping for synchronization */
+  mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
+  mp_ping->_vl_msg_id = htons (mm->ping_id);
+  mp_ping->client_index = vam->my_client_index;
+
+  fformat (vam->ofp, "Sending ping id=%d\n", mm->ping_id);
+
+  vam->result_ready = 0;
+  S (mp_ping);
+
+  W (ret);
+
+  return ret;
+}
+
+static int
+api_map_rule_dump (vat_main_t * vam)
+{
+  map_test_main_t *mm = &map_test_main;
+  unformat_input_t *i = vam->input;
+  vl_api_map_rule_dump_t *mp;
+  vl_api_control_ping_t *mp_ping;
+  u32 domain_index = ~0;
+  int ret;
+
+  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
+    {
+      if (unformat (i, "index %u", &domain_index))
+       ;
+      else
+       break;
+    }
+
+  if (domain_index == ~0)
+    {
+      clib_warning ("parse error: domain index expected");
+      return -99;
+    }
+
+  /* Construct the API message */
+  M (MAP_RULE_DUMP, mp);
+
+  mp->domain_index = htonl (domain_index);
+
+  /* send it... */
+  S (mp);
+
+  /* Use a control ping for synchronization */
+  /* Use a control ping for synchronization */
+  mp_ping = vl_msg_api_alloc_as_if_client (sizeof (*mp_ping));
+  mp_ping->_vl_msg_id = htons (mm->ping_id);
+  mp_ping->client_index = vam->my_client_index;
+
+  vam->result_ready = 0;
+  S (mp_ping);
+
+  W (ret);
+  return ret;
+}
+
+static void vl_api_map_add_domain_reply_t_handler
+  (vl_api_map_add_domain_reply_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+  i32 retval = ntohl (mp->retval);
+
+  if (vam->json_output) {
+    vat_json_node_t node;
+    vat_json_init_object (&node);
+    vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
+    vat_json_object_add_uint (&node, "index", ntohl (mp->index));
+    vat_json_print (vam->ofp, &node);
+    vat_json_free (&node);
+  }
+
+  if (vam->async_mode)
+    {
+      vam->async_errors += (retval < 0);
+    }
+  else
+    {
+      vam->retval = retval;
+      vam->result_ready = 1;
+    }
+}
+
+static void vl_api_map_domain_details_t_handler_json
+  (vl_api_map_domain_details_t * mp)
+{
+  vat_json_node_t *node = NULL;
+  vat_main_t *vam = &vat_main;
+  struct in6_addr ip6;
+  struct in_addr ip4;
+
+  if (VAT_JSON_ARRAY != vam->json_tree.type)
+    {
+      ASSERT (VAT_JSON_NONE == vam->json_tree.type);
+      vat_json_init_array (&vam->json_tree);
+    }
+
+  node = vat_json_array_add (&vam->json_tree);
+  vat_json_init_object (node);
+
+  vat_json_object_add_uint (node, "domain_index",
+                           clib_net_to_host_u32 (mp->domain_index));
+  clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
+  vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
+  clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
+  vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
+  clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
+  vat_json_object_add_ip6 (node, "ip6_src", ip6);
+  vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
+  vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
+  vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
+  vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
+  vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
+  vat_json_object_add_int (node, "psid_length", mp->psid_length);
+  vat_json_object_add_uint (node, "flags", mp->flags);
+  vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
+  vat_json_object_add_int (node, "is_translation", mp->is_translation);
+}
+
+static void vl_api_map_domain_details_t_handler
+  (vl_api_map_domain_details_t * mp)
+{
+  vat_main_t *vam = &vat_main;
+
+  if (vam->json_output)
+    return vl_api_map_domain_details_t_handler_json (mp);
+
+  if (mp->is_translation)
+    {
+      print (vam->ofp,
+            "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u",
+            format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
+            format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
+            format_ip6_address, mp->ip6_src, mp->ip6_src_len,
+            clib_net_to_host_u32 (mp->domain_index));
+    }
+  else
+    {
+      print (vam->ofp,
+            "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u",
+            format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
+            format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
+            format_ip6_address, mp->ip6_src,
+            clib_net_to_host_u32 (mp->domain_index));
+    }
+  print (vam->ofp, "  ea-len %d psid-offset %d psid-len %d mtu %d %s",
+        mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
+        mp->is_translation ? "map-t" : "");
+}
+
+/* 
+ * List of messages that the api test plugin sends,
+ * and that the data plane plugin processes
+ */
+#define foreach_vpe_api_msg                            \
+_(map_add_domain,                                      \
+  "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> "                 \
+  "ip6-src <ip6addr> "                                 \
+  "ea-bits-len <n> psid-offset <n> psid-len <n>")      \
+_(map_del_domain, "index <n>")                         \
+_(map_add_del_rule,                                    \
+  "index <n> psid <n> dst <ip6addr> [del]")            \
+_(map_domain_dump, "")                                 \
+_(map_rule_dump, "index <map-domain>")
+
+static void map_api_hookup (vat_main_t *vam)
+{
+    map_test_main_t * mm = &map_test_main;
+    /* Hook up handlers for replies from the data plane plug-in */
+#define _(N,n)                                                  \
+    vl_msg_api_set_handlers((VL_API_##N + mm->msg_id_base),     \
+                           #n,                                  \
+                           vl_api_##n##_t_handler,              \
+                           vl_noop_handler,                     \
+                           vl_api_##n##_t_endian,               \
+                           vl_api_##n##_t_print,                \
+                           sizeof(vl_api_##n##_t), 1); 
+    foreach_vpe_api_reply_msg;
+#undef _
+
+    /* API messages we can send */
+#define _(n,h) \
+    hash_set_mem (vam->function_by_name, #n, api_##n);
+    foreach_vpe_api_msg;
+#undef _    
+    
+    /* Help strings */
+#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
+    foreach_vpe_api_msg;
+#undef _
+}
+
+clib_error_t * vat_plugin_register (vat_main_t *vam)
+{
+  map_test_main_t * mm = &map_test_main;
+  u8 * name;
+
+  mm->vat_main = vam;
+
+  name = format (0, "map_%08x%c", api_version, 0);
+  mm->msg_id_base = vl_client_get_first_plugin_msg_id ((char *) name);
+
+  /* Get the control ping ID */
+#define _(id,n,crc) \
+  const char *id ## _CRC __attribute__ ((unused)) = #n "_" #crc;
+  foreach_vl_msg_name_crc_vpe;
+#undef _
+  mm->ping_id = vl_msg_api_get_msg_index ((u8 *) (VL_API_CONTROL_PING_CRC));
+
+  if (mm->msg_id_base != (u16) ~0)
+    map_api_hookup (vam);
+
+  vec_free(name);
+
+  return 0;
+}
similarity index 100%
rename from src/vnet/map/test.c
rename to src/plugins/map/test.c
index 14f66c3..b87ec93 100644 (file)
@@ -41,7 +41,6 @@
 #include <vnet/ipsec/ipsec.h>
 #include <vnet/ipsec/ikev2.h>
 #include <inttypes.h>
-#include <vnet/map/map.h>
 #include <vnet/cop/cop.h>
 #include <vnet/ip/ip6_hop_by_hop.h>
 #include <vnet/ip/ip_source_and_port_range_check.h>
@@ -2615,99 +2614,6 @@ vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
                           clib_net_to_host_u32 (mp->sw_if_index));
 }
 
-static void vl_api_map_domain_details_t_handler_json
-  (vl_api_map_domain_details_t * mp)
-{
-  vat_json_node_t *node = NULL;
-  vat_main_t *vam = &vat_main;
-  struct in6_addr ip6;
-  struct in_addr ip4;
-
-  if (VAT_JSON_ARRAY != vam->json_tree.type)
-    {
-      ASSERT (VAT_JSON_NONE == vam->json_tree.type);
-      vat_json_init_array (&vam->json_tree);
-    }
-
-  node = vat_json_array_add (&vam->json_tree);
-  vat_json_init_object (node);
-
-  vat_json_object_add_uint (node, "domain_index",
-                           clib_net_to_host_u32 (mp->domain_index));
-  clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
-  vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
-  clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
-  vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
-  clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
-  vat_json_object_add_ip6 (node, "ip6_src", ip6);
-  vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
-  vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
-  vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
-  vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
-  vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
-  vat_json_object_add_int (node, "psid_length", mp->psid_length);
-  vat_json_object_add_uint (node, "flags", mp->flags);
-  vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
-  vat_json_object_add_int (node, "is_translation", mp->is_translation);
-}
-
-static void vl_api_map_domain_details_t_handler
-  (vl_api_map_domain_details_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-
-  if (mp->is_translation)
-    {
-      print (vam->ofp,
-            "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u",
-            format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
-            format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
-            format_ip6_address, mp->ip6_src, mp->ip6_src_len,
-            clib_net_to_host_u32 (mp->domain_index));
-    }
-  else
-    {
-      print (vam->ofp,
-            "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u",
-            format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
-            format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
-            format_ip6_address, mp->ip6_src,
-            clib_net_to_host_u32 (mp->domain_index));
-    }
-  print (vam->ofp, "  ea-len %d psid-offset %d psid-len %d mtu %d %s",
-        mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
-        mp->is_translation ? "map-t" : "");
-}
-
-static void vl_api_map_rule_details_t_handler_json
-  (vl_api_map_rule_details_t * mp)
-{
-  struct in6_addr ip6;
-  vat_json_node_t *node = NULL;
-  vat_main_t *vam = &vat_main;
-
-  if (VAT_JSON_ARRAY != vam->json_tree.type)
-    {
-      ASSERT (VAT_JSON_NONE == vam->json_tree.type);
-      vat_json_init_array (&vam->json_tree);
-    }
-
-  node = vat_json_array_add (&vam->json_tree);
-  vat_json_init_object (node);
-
-  vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
-  clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
-  vat_json_object_add_ip6 (node, "ip6_dst", ip6);
-}
-
-static void
-vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  print (vam->ofp, " %d (psid) %U (ip6-dst)",
-        clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
-}
-
 static void
 vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
 {
@@ -5525,8 +5431,6 @@ _(ikev2_initiate_del_child_sa_reply)                    \
 _(ikev2_initiate_rekey_child_sa_reply)                  \
 _(delete_loopback_reply)                                \
 _(bd_ip_mac_add_del_reply)                              \
-_(map_del_domain_reply)                                 \
-_(map_add_del_rule_reply)                               \
 _(want_interface_events_reply)                          \
 _(want_stats_reply)                                    \
 _(cop_interface_enable_disable_reply)                  \
@@ -5781,11 +5685,6 @@ _(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \
 _(DELETE_LOOPBACK_REPLY, delete_loopback_reply)                         \
 _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply)                     \
 _(DHCP_COMPL_EVENT, dhcp_compl_event)                                   \
-_(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply)                           \
-_(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply)                           \
-_(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply)                      \
-_(MAP_DOMAIN_DETAILS, map_domain_details)                               \
-_(MAP_RULE_DETAILS, map_rule_details)                                   \
 _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply)             \
 _(WANT_STATS_REPLY, want_stats_reply)                                  \
 _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply)                      \
@@ -16368,269 +16267,6 @@ api_ikev2_initiate_rekey_child_sa (vat_main_t * vam)
   return ret;
 }
 
-/*
- * MAP
- */
-static int
-api_map_add_domain (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_map_add_domain_t *mp;
-
-  ip4_address_t ip4_prefix;
-  ip6_address_t ip6_prefix;
-  ip6_address_t ip6_src;
-  u32 num_m_args = 0;
-  u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
-    0, psid_length = 0;
-  u8 is_translation = 0;
-  u32 mtu = 0;
-  u32 ip6_src_len = 128;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
-                   &ip4_prefix, &ip4_prefix_len))
-       num_m_args++;
-      else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
-                        &ip6_prefix, &ip6_prefix_len))
-       num_m_args++;
-      else
-       if (unformat
-           (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
-            &ip6_src_len))
-       num_m_args++;
-      else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
-       num_m_args++;
-      else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
-       num_m_args++;
-      else if (unformat (i, "psid-offset %d", &psid_offset))
-       num_m_args++;
-      else if (unformat (i, "psid-len %d", &psid_length))
-       num_m_args++;
-      else if (unformat (i, "mtu %d", &mtu))
-       num_m_args++;
-      else if (unformat (i, "map-t"))
-       is_translation = 1;
-      else
-       {
-         clib_warning ("parse error '%U'", format_unformat_error, i);
-         return -99;
-       }
-    }
-
-  if (num_m_args < 3)
-    {
-      errmsg ("mandatory argument(s) missing");
-      return -99;
-    }
-
-  /* Construct the API message */
-  M (MAP_ADD_DOMAIN, mp);
-
-  clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
-  mp->ip4_prefix_len = ip4_prefix_len;
-
-  clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
-  mp->ip6_prefix_len = ip6_prefix_len;
-
-  clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
-  mp->ip6_src_prefix_len = ip6_src_len;
-
-  mp->ea_bits_len = ea_bits_len;
-  mp->psid_offset = psid_offset;
-  mp->psid_length = psid_length;
-  mp->is_translation = is_translation;
-  mp->mtu = htons (mtu);
-
-  /* send it... */
-  S (mp);
-
-  /* Wait for a reply, return good/bad news  */
-  W (ret);
-  return ret;
-}
-
-static int
-api_map_del_domain (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_map_del_domain_t *mp;
-
-  u32 num_m_args = 0;
-  u32 index;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "index %d", &index))
-       num_m_args++;
-      else
-       {
-         clib_warning ("parse error '%U'", format_unformat_error, i);
-         return -99;
-       }
-    }
-
-  if (num_m_args != 1)
-    {
-      errmsg ("mandatory argument(s) missing");
-      return -99;
-    }
-
-  /* Construct the API message */
-  M (MAP_DEL_DOMAIN, mp);
-
-  mp->index = ntohl (index);
-
-  /* send it... */
-  S (mp);
-
-  /* Wait for a reply, return good/bad news  */
-  W (ret);
-  return ret;
-}
-
-static int
-api_map_add_del_rule (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_map_add_del_rule_t *mp;
-  u8 is_add = 1;
-  ip6_address_t ip6_dst;
-  u32 num_m_args = 0, index, psid = 0;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "index %d", &index))
-       num_m_args++;
-      else if (unformat (i, "psid %d", &psid))
-       num_m_args++;
-      else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
-       num_m_args++;
-      else if (unformat (i, "del"))
-       {
-         is_add = 0;
-       }
-      else
-       {
-         clib_warning ("parse error '%U'", format_unformat_error, i);
-         return -99;
-       }
-    }
-
-  /* Construct the API message */
-  M (MAP_ADD_DEL_RULE, mp);
-
-  mp->index = ntohl (index);
-  mp->is_add = is_add;
-  clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
-  mp->psid = ntohs (psid);
-
-  /* send it... */
-  S (mp);
-
-  /* Wait for a reply, return good/bad news  */
-  W (ret);
-  return ret;
-}
-
-static int
-api_map_domain_dump (vat_main_t * vam)
-{
-  vl_api_map_domain_dump_t *mp;
-  vl_api_control_ping_t *mp_ping;
-  int ret;
-
-  /* Construct the API message */
-  M (MAP_DOMAIN_DUMP, mp);
-
-  /* send it... */
-  S (mp);
-
-  /* Use a control ping for synchronization */
-  MPING (CONTROL_PING, mp_ping);
-  S (mp_ping);
-
-  W (ret);
-  return ret;
-}
-
-static int
-api_map_rule_dump (vat_main_t * vam)
-{
-  unformat_input_t *i = vam->input;
-  vl_api_map_rule_dump_t *mp;
-  vl_api_control_ping_t *mp_ping;
-  u32 domain_index = ~0;
-  int ret;
-
-  while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
-    {
-      if (unformat (i, "index %u", &domain_index))
-       ;
-      else
-       break;
-    }
-
-  if (domain_index == ~0)
-    {
-      clib_warning ("parse error: domain index expected");
-      return -99;
-    }
-
-  /* Construct the API message */
-  M (MAP_RULE_DUMP, mp);
-
-  mp->domain_index = htonl (domain_index);
-
-  /* send it... */
-  S (mp);
-
-  /* Use a control ping for synchronization */
-  MPING (CONTROL_PING, mp_ping);
-  S (mp_ping);
-
-  W (ret);
-  return ret;
-}
-
-static void vl_api_map_add_domain_reply_t_handler
-  (vl_api_map_add_domain_reply_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  i32 retval = ntohl (mp->retval);
-
-  if (vam->async_mode)
-    {
-      vam->async_errors += (retval < 0);
-    }
-  else
-    {
-      vam->retval = retval;
-      vam->result_ready = 1;
-    }
-}
-
-static void vl_api_map_add_domain_reply_t_handler_json
-  (vl_api_map_add_domain_reply_t * mp)
-{
-  vat_main_t *vam = &vat_main;
-  vat_json_node_t node;
-
-  vat_json_init_object (&node);
-  vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
-  vat_json_object_add_uint (&node, "index", ntohl (mp->index));
-
-  vat_json_print (vam->ofp, &node);
-  vat_json_free (&node);
-
-  vam->retval = ntohl (mp->retval);
-  vam->result_ready = 1;
-}
-
 static int
 api_get_first_msg_id (vat_main_t * vam)
 {
@@ -23761,15 +23397,6 @@ _(ikev2_initiate_del_child_sa, "<ispi>")                                \
 _(ikev2_initiate_rekey_child_sa, "<ispi>")                              \
 _(delete_loopback,"sw_if_index <nn>")                                   \
 _(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
-_(map_add_domain,                                                       \
-  "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> "                                 \
-  "ip6-src <ip6addr> "                                                 \
-  "ea-bits-len <n> psid-offset <n> psid-len <n>")                      \
-_(map_del_domain, "index <n>")                                          \
-_(map_add_del_rule,                                                     \
-  "index <n> psid <n> dst <ip6addr> [del]")                             \
-_(map_domain_dump, "")                                                  \
-_(map_rule_dump, "index <map-domain>")                                  \
 _(want_interface_events,  "enable|disable")                             \
 _(want_stats,"enable|disable")                                          \
 _(get_first_msg_id, "client <name>")                                   \
index 95b94c3..78eb481 100644 (file)
@@ -488,37 +488,6 @@ libvnet_la_SOURCES +=                              \
 nobase_include_HEADERS +=                      \
  vnet/osi/osi.h
 
-########################################
-# Layer 3 protocol: MAP
-########################################
-libvnet_la_SOURCES +=                          \
- vnet/map/map.c                                        \
- vnet/map/map_dpo.c                            \
- vnet/map/ip4_map.c                            \
- vnet/map/ip6_map.c                            \
- vnet/map/ip4_map_t.c                          \
- vnet/map/ip6_map_t.c                          \
- vnet/map/map_api.c
-
-nobase_include_HEADERS +=                      \
- vnet/map/map.h                                        \
- vnet/map/map_dpo.h                            \
- vnet/map/map.api.h
-
-API_FILES += vnet/map/map.api
-
-if ENABLE_TESTS
-TESTS += test_map
-test_map_SOURCES =                             \
- vnet/map/test.c
-test_map_CPPFLAGS = $(AM_CPPFLAGS) -DCLIB_DEBUG
-
-test_map_LDADD = libvnet.la libvppinfra.la libvlib.la  \
-  -lpthread -lvlibmemory -ldl -lsvm -lrt
-
-test_map_LDFLAGS = -static
-endif
-
 ########################################
 # Layer 4 protocol: tcp
 ########################################
index 2ddea86..60efe6e 100644 (file)
@@ -85,7 +85,6 @@ enum
 
 #define foreach_buffer_opaque_union_subtype     \
 _(ip)                                           \
-_(swt)                                          \
 _(l2)                                           \
 _(l2t)                                          \
 _(l2_classify)                                  \
@@ -210,13 +209,6 @@ typedef struct
       } bier;
     } mpls;
 
-    /* ip4-in-ip6 softwire termination, only valid there */
-    struct
-    {
-      u8 swt_disable;
-      u32 mapping_index;
-    } swt;
-
     /* l2 bridging path, only valid there */
     struct opaque_l2
     {
index c5c47e8..06b76a5 100644 (file)
@@ -37,7 +37,6 @@
 #include <vnet/gre/gre.api.h>
 #include <vnet/ipip/ipip.api.h>
 #include <vnet/interface.api.h>
-#include <vnet/map/map.api.h>
 #include <vnet/l2/l2.api.h>
 #include <vnet/l2tp/l2tp.api.h>
 #include <vnet/span/span.api.h>