Start spliting vpe.api into logically related pieces 39/3639/9
authorDave Barach <dave@barachs.net>
Mon, 31 Oct 2016 15:59:07 +0000 (11:59 -0400)
committerOle Trøan <otroan@employees.org>
Wed, 30 Nov 2016 15:06:08 +0000 (15:06 +0000)
To reduce rebase / manual merge pain, among other things

Change-Id: I3186df0479066916a2ca69c48759178b45ef035c
Signed-off-by: Dave Barach <dave@barachs.net>
Signed-off-by: Ole Troan <ot@cisco.com>
18 files changed:
build-data/suffix-rules.mk [new file with mode: 0644]
vlib-api/Makefile.am
vlib-api/suffix-rules.mk [new symlink]
vlib-api/vlibapi/api_helper_macros.h [new file with mode: 0644]
vlib-api/vlibmemory/vl_memory_api_h.h
vnet/Makefile.am
vnet/suffix-rules.mk [new symlink]
vnet/vnet/interface.api [new file with mode: 0644]
vnet/vnet/interface_api.c [new file with mode: 0644]
vnet/vnet/vnet_all_api_h.h [new file with mode: 0644]
vnet/vnet/vnet_msg_enum.h [new file with mode: 0644]
vpp-api-test/vat/api_format.c
vpp-api/java/Makefile.am
vpp/Makefile.am
vpp/suffix-rules.mk [new symlink]
vpp/vpp-api/api.c
vpp/vpp-api/vpe.api
vpp/vpp-api/vpe_all_api_h.h

diff --git a/build-data/suffix-rules.mk b/build-data/suffix-rules.mk
new file mode 100644 (file)
index 0000000..9506929
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright (c) 2016 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.
+
+# Shared suffix rules
+# Please do not set "SUFFIXES = .api.h .api" here
+
+%.api.h: %.api
+       @echo "  APIGEN  " $@ ;                                 \
+       mkdir -p `dirname $@` ;                                 \
+       $(CC) $(CPPFLAGS) -E -P -C -x c $^                      \
+       | vppapigen --input - --output $@ --show-name $@
+
+
index 5bc00e7..087d56e 100644 (file)
@@ -20,10 +20,11 @@ lib_LTLIBRARIES = libvlibapi.la libvlibmemory.la libvlibmemoryclient.la \
 
 libvlibapi_la_SOURCES =                        \
        vlibapi/api.h                           \
+        vlibapi/api_helper_macros.h            \
        vlibapi/api_shared.c                    \
        vlibapi/node_serialize.c
 
-nobase_include_HEADERS = vlibapi/api.h
+nobase_include_HEADERS = vlibapi/api.h vlibapi/api_helper_macros.h
 
 libvlibmemory_la_SOURCES =                     \
        vlibmemory/api.h                        \
@@ -70,11 +71,10 @@ BUILT_SOURCES = vlibsocket/sockclnt.api.h vlibmemory/memclnt.api.h
 
 SUFFIXES = .api.h .api
 
-%.api.h: %.api
-       @echo "  APIGEN  " $@ ;                                 \
-       mkdir -p `dirname $@` ;                                 \
-       $(CC) $(CPPFLAGS) -E -P -C -x c $^                      \
-       | vppapigen --input - --output $@ --show-name $@
+# The actual %.api.h rule is in .../build-data/packages/suffix-rules.mk
+# and requires a symbolic link at the top of the vnet source tree
+
+include $(top_srcdir)/suffix-rules.mk
 
 # install the API definition, so we can produce java bindings, etc.
 apidir = $(prefix)/vlibmemory
diff --git a/vlib-api/suffix-rules.mk b/vlib-api/suffix-rules.mk
new file mode 120000 (symlink)
index 0000000..f609840
--- /dev/null
@@ -0,0 +1 @@
+../build-data/suffix-rules.mk
\ No newline at end of file
diff --git a/vlib-api/vlibapi/api_helper_macros.h b/vlib-api/vlibapi/api_helper_macros.h
new file mode 100644 (file)
index 0000000..9ccdf96
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ *------------------------------------------------------------------
+ * api_helper_macros.h - message handler helper macros
+ *
+ * Copyright (c) 2016 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 __api_helper_macros_h__
+#define __api_helper_macros_h__
+
+#define f64_endian(a)
+#define f64_print(a,b)
+
+#define REPLY_MACRO(t)                                          \
+do {                                                            \
+    unix_shared_memory_queue_t * q;                             \
+    rv = vl_msg_api_pd_handler (mp, rv);                        \
+    q = vl_api_client_index_to_input_queue (mp->client_index);  \
+    if (!q)                                                     \
+        return;                                                 \
+                                                                \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                     \
+    rmp->_vl_msg_id = ntohs((t));                               \
+    rmp->context = mp->context;                                 \
+    rmp->retval = ntohl(rv);                                    \
+                                                                \
+    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
+} while(0);
+
+#define REPLY_MACRO2(t, body)                                   \
+do {                                                            \
+    unix_shared_memory_queue_t * q;                             \
+    rv = vl_msg_api_pd_handler (mp, rv);                        \
+    q = vl_api_client_index_to_input_queue (mp->client_index);  \
+    if (!q)                                                     \
+        return;                                                 \
+                                                                \
+    rmp = vl_msg_api_alloc (sizeof (*rmp));                     \
+    rmp->_vl_msg_id = ntohs((t));                               \
+    rmp->context = mp->context;                                 \
+    rmp->retval = ntohl(rv);                                    \
+    do {body;} while (0);                                       \
+    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
+} while(0);
+
+#define REPLY_MACRO3(t, n, body)                               \
+do {                                                            \
+    unix_shared_memory_queue_t * q;                             \
+    rv = vl_msg_api_pd_handler (mp, rv);                        \
+    q = vl_api_client_index_to_input_queue (mp->client_index);  \
+    if (!q)                                                     \
+        return;                                                 \
+                                                                \
+    rmp = vl_msg_api_alloc (sizeof (*rmp) + n);                 \
+    rmp->_vl_msg_id = ntohs((t));                               \
+    rmp->context = mp->context;                                 \
+    rmp->retval = ntohl(rv);                                    \
+    do {body;} while (0);                                       \
+    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
+} while(0);
+
+#define REPLY_MACRO4(t, n, body)                                \
+do {                                                            \
+    unix_shared_memory_queue_t * q;                             \
+    u8 is_error = 0;                                            \
+    rv = vl_msg_api_pd_handler (mp, rv);                        \
+    q = vl_api_client_index_to_input_queue (mp->client_index);  \
+    if (!q)                                                     \
+        return;                                                 \
+                                                                \
+    rmp = vl_msg_api_alloc_or_null (sizeof (*rmp) + n);         \
+    if (!rmp)                                                   \
+      {                                                         \
+        /* if there isn't enough memory, try to allocate */     \
+        /* some at least for returning an error */              \
+        rmp = vl_msg_api_alloc (sizeof (*rmp));                 \
+        if (!rmp)                                               \
+          return;                                               \
+                                                                \
+        memset (rmp, 0, sizeof (*rmp));                         \
+        rv = VNET_API_ERROR_TABLE_TOO_BIG;                      \
+        is_error = 1;                                           \
+      }                                                         \
+    rmp->_vl_msg_id = ntohs((t));                               \
+    rmp->context = mp->context;                                 \
+    rmp->retval = ntohl(rv);                                    \
+    if (!is_error)                                              \
+      do {body;} while (0);                                     \
+    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
+} while(0);
+
+/* "trust, but verify" */
+
+#define VALIDATE_SW_IF_INDEX(mp)                               \
+ do { u32 __sw_if_index = ntohl(mp->sw_if_index);              \
+    vnet_main_t *__vnm = vnet_get_main();                       \
+    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
+                           __sw_if_index)) {                    \
+        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
+        goto bad_sw_if_index;                                   \
+    }                                                           \
+} while(0);
+
+#define BAD_SW_IF_INDEX_LABEL                   \
+do {                                            \
+bad_sw_if_index:                                \
+    ;                                           \
+} while (0);
+
+#define VALIDATE_RX_SW_IF_INDEX(mp)                            \
+ do { u32 __rx_sw_if_index = ntohl(mp->rx_sw_if_index);                \
+    vnet_main_t *__vnm = vnet_get_main();                       \
+    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
+                           __rx_sw_if_index)) {                        \
+        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
+        goto bad_rx_sw_if_index;                               \
+    }                                                           \
+} while(0);
+
+#define BAD_RX_SW_IF_INDEX_LABEL               \
+do {                                            \
+bad_rx_sw_if_index:                            \
+    ;                                           \
+} while (0);
+
+#define VALIDATE_TX_SW_IF_INDEX(mp)                            \
+ do { u32 __tx_sw_if_index = ntohl(mp->tx_sw_if_index);                \
+    vnet_main_t *__vnm = vnet_get_main();                       \
+    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
+                           __tx_sw_if_index)) {                        \
+        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
+        goto bad_tx_sw_if_index;                               \
+    }                                                           \
+} while(0);
+
+#define BAD_TX_SW_IF_INDEX_LABEL               \
+do {                                            \
+bad_tx_sw_if_index:                            \
+    ;                                           \
+} while (0);
+
+#endif /* __api_helper_macros_h__ */
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
index 63d9a39..c1ae79b 100644 (file)
@@ -23,7 +23,6 @@
  */
 #include <vlibmemory/memclnt.api.h>
 
-
 /*
  * fd.io coding-style-patch-verification: ON
  *
index d806785..a9481d1 100644 (file)
@@ -15,6 +15,8 @@ AUTOMAKE_OPTIONS = foreign subdir-objects
 
 AM_CFLAGS = -Wall -Werror @DPDK@ @DPDK_CRYPTO@ @IPSEC@ @IPV6SR@
 
+BUILT_SOURCES = vnet/interface.api.h
+
 libvnet_la_SOURCES =
 libvnetplugin_la_SOURCES =
 nobase_include_HEADERS =
@@ -34,6 +36,7 @@ libvnet_la_SOURCES +=                                 \
   vnet/devices/devices.c                               \
   vnet/handoff.c                                       \
   vnet/interface.c                                     \
+  vnet/interface_api.c                                 \
   vnet/interface_cli.c                                 \
   vnet/interface_format.c                              \
   vnet/interface_output.c                              \
@@ -49,12 +52,15 @@ nobase_include_HEADERS +=                   \
   vnet/global_funcs.h                          \
   vnet/handoff.h                               \
   vnet/interface.h                             \
+  vnet/interface.api.h                         \
   vnet/interface_funcs.h                       \
   vnet/l3_types.h                              \
   vnet/pipeline.h                              \
   vnet/replication.h                           \
   vnet/rewrite.h                               \
-  vnet/vnet.h
+  vnet/vnet.h                                  \
+  vnet/vnet_all_api_h.h                                \
+  vnet/vnet_msg_enum.h
 
 ########################################
 # Policer infra
@@ -876,3 +882,16 @@ pcap2pg_LDFLAGS = -static
 pcap2pg_LDADD = libvnet.la -l:libvppinfra.a -lpthread -lm -ldl
 
 noinst_PROGRAMS += pcap2pg
+
+# Set the suffix list
+SUFFIXES = .api.h .api
+
+# install the API definition, so we can produce java bindings, etc.
+
+apidir = $(prefix)/vpp-api
+api_DATA = vnet/interface.api
+
+# The actual %.api.h rule is in .../build-data/packages/suffix-rules.mk
+# and requires a symbolic link at the top of the vnet source tree
+
+include $(top_srcdir)/suffix-rules.mk
diff --git a/vnet/suffix-rules.mk b/vnet/suffix-rules.mk
new file mode 120000 (symlink)
index 0000000..f609840
--- /dev/null
@@ -0,0 +1 @@
+../build-data/suffix-rules.mk
\ No newline at end of file
diff --git a/vnet/vnet/interface.api b/vnet/vnet/interface.api
new file mode 100644 (file)
index 0000000..acc52a8
--- /dev/null
@@ -0,0 +1,31 @@
+/* Hey Emacs use -*- mode: C -*- */
+
+/** \brief Set flags on the interface
+    @param client_index - opaque cookie to identify the sender
+    @param context - sender context, to match reply w/ request
+    @param sw_if_index - index of the interface to set flags on
+    @param admin_up_down - set the admin state, 1 = up, 0 = down
+    @param link_up_down - Oper state sent on change event, not used in config.
+    @param deleted - interface was deleted
+*/
+define sw_interface_set_flags
+{
+  u32 client_index;
+  u32 context;
+  u32 sw_if_index;
+  /* 1 = up, 0 = down */
+  u8 admin_up_down;
+  u8 link_up_down;
+  u8 deleted;
+};
+
+/** \brief Reply to sw_interface_set_flags 
+    @param context - sender context which was passed in the request
+    @param retval - return code of the set flags request
+*/
+define sw_interface_set_flags_reply
+{
+  u32 context;
+  i32 retval;
+};
+
diff --git a/vnet/vnet/interface_api.c b/vnet/vnet/interface_api.c
new file mode 100644 (file)
index 0000000..eeb1d81
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ *------------------------------------------------------------------
+ * interface_api.c - vnet interface api
+ *
+ * Copyright (c) 2016 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/vnet.h>
+#include <vlibmemory/api.h>
+
+#include <vnet/interface.h>
+#include <vnet/api_errno.h>
+
+#include <vnet/vnet_msg_enum.h>
+
+#define vl_typedefs            /* define message structures */
+#include <vnet/vnet_all_api_h.h>
+#undef vl_typedefs
+
+#define vl_endianfun           /* define message structures */
+#include <vnet/vnet_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>
+#undef vl_printfun
+
+#include <vlibapi/api_helper_macros.h>
+
+#define foreach_vpe_api_msg                             \
+_(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags)
+
+static void
+vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
+{
+  vl_api_sw_interface_set_flags_reply_t *rmp;
+  vnet_main_t *vnm = vnet_get_main ();
+  int rv = 0;
+  clib_error_t *error;
+  u16 flags;
+
+  VALIDATE_SW_IF_INDEX (mp);
+
+  flags = mp->admin_up_down ? VNET_SW_INTERFACE_FLAG_ADMIN_UP : 0;
+
+  error = vnet_sw_interface_set_flags (vnm, ntohl (mp->sw_if_index), flags);
+  if (error)
+    {
+      rv = -1;
+      clib_error_report (error);
+    }
+
+  BAD_SW_IF_INDEX_LABEL;
+  REPLY_MACRO (VL_API_SW_INTERFACE_SET_FLAGS_REPLY);
+}
+
+
+/*
+ * 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 vl_msg_name_crc_list
+#include <vnet/vnet_all_api_h.h>
+#undef vl_msg_name_crc_list
+
+static void
+setup_message_id_table (api_main_t * am)
+{
+#define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id);
+  foreach_vl_msg_name_crc_interface;
+#undef _
+}
+
+static clib_error_t *
+interface_api_hookup (vlib_main_t * vm)
+{
+  api_main_t *am = &api_main;
+
+#define _(N,n)                                                  \
+    vl_msg_api_set_handlers(VL_API_##N, #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;
+#undef _
+
+  /*
+   * Set up the (msg_name, crc, message-id) table
+   */
+  setup_message_id_table (am);
+
+  return 0;
+}
+
+VLIB_API_INIT_FUNCTION (interface_api_hookup);
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
diff --git a/vnet/vnet/vnet_all_api_h.h b/vnet/vnet/vnet_all_api_h.h
new file mode 100644 (file)
index 0000000..0dacdc1
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *------------------------------------------------------------------
+ * vl_memory_api_h.h - memory API headers, in a specific order.
+ *
+ * Copyright (c) 2009-2010 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.
+ *------------------------------------------------------------------
+ */
+
+/*
+ * Add to the bottom of the #include list, or elves will steal your
+ * keyboard in the middle of the night!
+ *
+ * Include current layer (2) last, or an artistic disagreement
+ * about message numbering will occur
+ */
+
+#ifndef included_from_layer_3
+#include <vlibmemory/vl_memory_api_h.h>
+#endif /* included_from_layer_3 */
+
+#include <vnet/interface.api.h>
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
diff --git a/vnet/vnet/vnet_msg_enum.h b/vnet/vnet/vnet_msg_enum.h
new file mode 100644 (file)
index 0000000..9899471
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016 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_vnet_msg_enum_h
+#define included_vnet_msg_enum_h
+
+#include <vppinfra/byte_order.h>
+
+#define vl_msg_id(n,h) n,
+typedef enum
+{
+  VL_ILLEGAL_MESSAGE_ID = 0,
+#include <vnet/vnet_all_api_h.h>
+  VL_MSG_FIRST_AVAILABLE,
+} vl_msg_id_t;
+#undef vl_msg_id
+
+#endif /* included_vnet_msg_enum_h */
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */
index aac7d89..9b02f1e 100644 (file)
@@ -17022,18 +17022,40 @@ vat_api_hookup (vat_main_t * vam)
 }
 
 #undef vl_api_version
-#define vl_api_version(n,v) static u32 vpe_api_version = v;
+#define vl_api_version(n,v) static u32 memory_api_version = v;
+#include <vlibmemory/vl_memory_api_h.h>
+#undef vl_api_version
+
+#undef vl_api_version
+#define vl_api_version(n,v) static u32 vnet_interface_api_version = v;
+#include <vnet/interface.api.h>
+#undef vl_api_version
+
+#undef vl_api_version
+#define vl_api_version(n,v) static u32 vpp_api_version = v;
 #include <vpp-api/vpe.api.h>
 #undef vl_api_version
 
+static u32 *api_versions[] = {
+  &memory_api_version,
+  &vnet_interface_api_version,
+  &vpp_api_version,
+};
+
 void
 vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
 {
+  int i;
+
+  ASSERT (ARRAY_LEN (mp->api_versions) >= ARRAY_LEN (api_versions));
+
   /*
-   * Send the main API signature in slot 0. This bit of code must
+   * Send the API signatures. This bit of code must
    * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
    */
-  mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
+
+  for (i = 0; i < ARRAY_LEN (api_versions); i++)
+    mp->api_versions[i] = clib_host_to_net_u32 (*api_versions[i]);
 }
 
 /*
index 390562b..b95c1fe 100644 (file)
@@ -104,10 +104,9 @@ jvpp-core/io_fd_vpp_jvpp_core_JVppCoreImpl.h: jvpp-registry/io_fd_vpp_jvpp_VppJN
                jvpp-core/$(packagedir_jvpp_core)/notification/*.java \
                jvpp-core/$(packagedir_jvpp_core)/future/*.java         \
                jvpp-core/$(packagedir_jvpp_core)/callfacade/*.java     \
-               jvpp-core/$(packagedir_jvpp_core)/test/*.java \
                || (echo "jvpp-core compilation failed: $$?"; exit 1)
        $(JAVAH) -force -classpath jvpp-registry/target:jvpp-core/target -d jvpp-core io.fd.vpp.jvpp.core.JVppCoreImpl
-       
+
 $(jarfile_jvpp_core): libjvpp_core.la
        cp .libs/libjvpp_core.so.0.0.0 jvpp-core/target
        $(JAR) cf $(JARFLAGS) $@ -C jvpp-core/target .
index 214cc74..1c40ed3 100644 (file)
@@ -121,14 +121,13 @@ if WITH_IPV6SR
   vpp_LDADD += -lcrypto
 endif
 
+# Set the suffix list
 SUFFIXES = .api.h .api
 
-%.api.h: %.api
-       @echo "  APIGEN  " $@ ;                                 \
-       mkdir -p `dirname $@` ;                                 \
-       $(CC) $(CPPFLAGS) -E -P -C -x c $^                      \
-       | vppapigen --input - --output $@ --show-name $@
+# The actual %.api.h rule is in .../build-data/packages/suffix-rules.mk
+# and requires a symbolic link at the top of the vpp source tree
 
+include $(top_srcdir)/suffix-rules.mk
 
 noinst_PROGRAMS += test_client
 
diff --git a/vpp/suffix-rules.mk b/vpp/suffix-rules.mk
new file mode 120000 (symlink)
index 0000000..f609840
--- /dev/null
@@ -0,0 +1 @@
+../build-data/suffix-rules.mk
\ No newline at end of file
index 73e3c0d..bbe1963 100644 (file)
 #include <vnet/dpo/classify_dpo.h>
 #include <vnet/dpo/ip_null_dpo.h>
 
-#define f64_endian(a)
-#define f64_print(a,b)
-
 #define vl_typedefs            /* define message structures */
 #include <vpp-api/vpe_all_api_h.h>
 #undef vl_typedefs
 #include <vpp-api/vpe_all_api_h.h>
 #undef vl_printfun
 
-#define REPLY_MACRO(t)                                          \
-do {                                                            \
-    unix_shared_memory_queue_t * q;                             \
-    rv = vl_msg_api_pd_handler (mp, rv);                        \
-    q = vl_api_client_index_to_input_queue (mp->client_index);  \
-    if (!q)                                                     \
-        return;                                                 \
-                                                                \
-    rmp = vl_msg_api_alloc (sizeof (*rmp));                     \
-    rmp->_vl_msg_id = ntohs((t));                               \
-    rmp->context = mp->context;                                 \
-    rmp->retval = ntohl(rv);                                    \
-                                                                \
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
-} while(0);
-
-#define REPLY_MACRO2(t, body)                                   \
-do {                                                            \
-    unix_shared_memory_queue_t * q;                             \
-    rv = vl_msg_api_pd_handler (mp, rv);                        \
-    q = vl_api_client_index_to_input_queue (mp->client_index);  \
-    if (!q)                                                     \
-        return;                                                 \
-                                                                \
-    rmp = vl_msg_api_alloc (sizeof (*rmp));                     \
-    rmp->_vl_msg_id = ntohs((t));                               \
-    rmp->context = mp->context;                                 \
-    rmp->retval = ntohl(rv);                                    \
-    do {body;} while (0);                                       \
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
-} while(0);
-
-#define REPLY_MACRO3(t, n, body)                               \
-do {                                                            \
-    unix_shared_memory_queue_t * q;                             \
-    rv = vl_msg_api_pd_handler (mp, rv);                        \
-    q = vl_api_client_index_to_input_queue (mp->client_index);  \
-    if (!q)                                                     \
-        return;                                                 \
-                                                                \
-    rmp = vl_msg_api_alloc (sizeof (*rmp) + n);                 \
-    rmp->_vl_msg_id = ntohs((t));                               \
-    rmp->context = mp->context;                                 \
-    rmp->retval = ntohl(rv);                                    \
-    do {body;} while (0);                                       \
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
-} while(0);
-
-#define REPLY_MACRO4(t, n, body)                                \
-do {                                                            \
-    unix_shared_memory_queue_t * q;                             \
-    u8 is_error = 0;                                            \
-    rv = vl_msg_api_pd_handler (mp, rv);                        \
-    q = vl_api_client_index_to_input_queue (mp->client_index);  \
-    if (!q)                                                     \
-        return;                                                 \
-                                                                \
-    rmp = vl_msg_api_alloc_or_null (sizeof (*rmp) + n);         \
-    if (!rmp)                                                   \
-      {                                                         \
-        /* if there isn't enough memory, try to allocate */     \
-        /* some at least for returning an error */              \
-        rmp = vl_msg_api_alloc (sizeof (*rmp));                 \
-        if (!rmp)                                               \
-          return;                                               \
-                                                                \
-        memset (rmp, 0, sizeof (*rmp));                         \
-        rv = VNET_API_ERROR_TABLE_TOO_BIG;                      \
-        is_error = 1;                                           \
-      }                                                         \
-    rmp->_vl_msg_id = ntohs((t));                               \
-    rmp->context = mp->context;                                 \
-    rmp->retval = ntohl(rv);                                    \
-    if (!is_error)                                              \
-      do {body;} while (0);                                     \
-    vl_msg_api_send_shmem (q, (u8 *)&rmp);                      \
-} while(0);
-
-#if (1 || CLIB_DEBUG > 0)      /* "trust, but verify" */
-
-#define VALIDATE_SW_IF_INDEX(mp)                               \
- do { u32 __sw_if_index = ntohl(mp->sw_if_index);              \
-    vnet_main_t *__vnm = vnet_get_main();                       \
-    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
-                           __sw_if_index)) {                    \
-        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
-        goto bad_sw_if_index;                                   \
-    }                                                           \
-} while(0);
-
-#define BAD_SW_IF_INDEX_LABEL                   \
-do {                                            \
-bad_sw_if_index:                                \
-    ;                                           \
-} while (0);
-
-#define VALIDATE_RX_SW_IF_INDEX(mp)                            \
- do { u32 __rx_sw_if_index = ntohl(mp->rx_sw_if_index);                \
-    vnet_main_t *__vnm = vnet_get_main();                       \
-    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
-                           __rx_sw_if_index)) {                        \
-        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
-        goto bad_rx_sw_if_index;                               \
-    }                                                           \
-} while(0);
-
-#define BAD_RX_SW_IF_INDEX_LABEL               \
-do {                                            \
-bad_rx_sw_if_index:                            \
-    ;                                           \
-} while (0);
-
-#define VALIDATE_TX_SW_IF_INDEX(mp)                            \
- do { u32 __tx_sw_if_index = ntohl(mp->tx_sw_if_index);                \
-    vnet_main_t *__vnm = vnet_get_main();                       \
-    if (pool_is_free_index(__vnm->interface_main.sw_interfaces, \
-                           __tx_sw_if_index)) {                        \
-        rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;                \
-        goto bad_tx_sw_if_index;                               \
-    }                                                           \
-} while(0);
-
-#define BAD_TX_SW_IF_INDEX_LABEL               \
-do {                                            \
-bad_tx_sw_if_index:                            \
-    ;                                           \
-} while (0);
-
-#else
-
-#define VALIDATE_SW_IF_INDEX(mp)
-#define BAD_SW_IF_INDEX_LABEL
-#define VALIDATE_RX_SW_IF_INDEX(mp)
-#define BAD_RX_SW_IF_INDEX_LABEL
-#define VALIDATE_TX_SW_IF_INDEX(mp)
-#define BAD_TX_SW_IF_INDEX_LABEL
-
-#endif /* CLIB_DEBUG > 0 */
+#include <vlibapi/api_helper_macros.h>
 
 #define foreach_vpe_api_msg                                             \
 _(WANT_INTERFACE_EVENTS, want_interface_events)                         \
@@ -287,7 +147,6 @@ _(WANT_OAM_EVENTS, want_oam_events)                                     \
 _(OAM_ADD_DEL, oam_add_del)                                             \
 _(SW_INTERFACE_DUMP, sw_interface_dump)                                 \
 _(SW_INTERFACE_DETAILS, sw_interface_details)                           \
-_(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags)                       \
 _(IP_ADD_DEL_ROUTE, ip_add_del_route)                                   \
 _(MPLS_ROUTE_ADD_DEL, mpls_route_add_del)                               \
 _(MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind)                             \
@@ -2715,30 +2574,6 @@ vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t * mp)
   clib_warning ("BUG");
 }
 
-static void
-vl_api_sw_interface_set_flags_t_handler (vl_api_sw_interface_set_flags_t * mp)
-{
-  vl_api_sw_interface_set_flags_reply_t *rmp;
-  vnet_main_t *vnm = vnet_get_main ();
-  int rv = 0;
-  clib_error_t *error;
-  u16 flags;
-
-  VALIDATE_SW_IF_INDEX (mp);
-
-  flags = mp->admin_up_down ? VNET_SW_INTERFACE_FLAG_ADMIN_UP : 0;
-
-  error = vnet_sw_interface_set_flags (vnm, ntohl (mp->sw_if_index), flags);
-  if (error)
-    {
-      rv = -1;
-      clib_error_report (error);
-    }
-
-  BAD_SW_IF_INDEX_LABEL;
-  REPLY_MACRO (VL_API_SW_INTERFACE_SET_FLAGS_REPLY);
-}
-
 static void
   vl_api_sw_interface_set_mpls_enable_t_handler
   (vl_api_sw_interface_set_mpls_enable_t * mp)
index 934c4d8..0e2f229 100644 (file)
@@ -119,35 +119,6 @@ define sw_interface_details
   u32 vtr_tag2;                        // second pushed tag
 };
 
-/** \brief Set flags on the interface
-    @param client_index - opaque cookie to identify the sender
-    @param context - sender context, to match reply w/ request
-    @param sw_if_index - index of the interface to set flags on
-    @param admin_up_down - set the admin state, 1 = up, 0 = down
-    @param link_up_down - Oper state sent on change event, not used in config.
-    @param deleted - interface was deleted
-*/
-define sw_interface_set_flags
-{
-  u32 client_index;
-  u32 context;
-  u32 sw_if_index;
-  /* 1 = up, 0 = down */
-  u8 admin_up_down;
-  u8 link_up_down;
-  u8 deleted;
-};
-
-/** \brief Reply to sw_interface_set_flags 
-    @param context - sender context which was passed in the request
-    @param retval - return code of the set flags request
-*/
-define sw_interface_set_flags_reply
-{
-  u32 context;
-  i32 retval;
-};
-
 /* works */
 define sw_interface_dump
 {
index f6793f7..98717ea 100644 (file)
  * keyboard in the middle of the night!
  */
 
-/* Inherited from vlib */
+/* Include the (first) vlib-api API definition layer */
 #include <vlibmemory/vl_memory_api_h.h>
 
-/* Here are the vpe forwarder specific API definitions */
+/* Include the (second) vnet API definition layer */
+#define included_from_layer_3
+#include <vnet/vnet_all_api_h.h>
+#undef included_from_layer_3
+
+/* Include the current layer (third) vpp API definition layer */
 #include <vpp-api/vpe.api.h>
 
 /*