summaryrefslogtreecommitdiffstats
path: root/plugins/ila-plugin/ila/ila_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ila-plugin/ila/ila_api.c')
-rw-r--r--plugins/ila-plugin/ila/ila_api.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/plugins/ila-plugin/ila/ila_api.c b/plugins/ila-plugin/ila/ila_api.c
new file mode 100644
index 00000000000..c8bce6b57a3
--- /dev/null
+++ b/plugins/ila-plugin/ila/ila_api.c
@@ -0,0 +1,159 @@
+/*
+ * 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 <ila/ila.h>
+
+#include <vppinfra/byte_order.h>
+#include <vlibapi/api.h>
+#include <vlibapi/api.h>
+#include <vlibmemory/api.h>
+#include <vlibsocket/api.h>
+
+typedef struct
+{
+ u16 msg_id_base;
+} ila_api_main_t;
+
+ila_api_main_t ila_api_main;
+
+#define vl_msg_id(n,h) n,
+typedef enum
+{
+#include <ila/ila.api.h>
+ /* We'll want to know how many messages IDs we need... */
+ VL_MSG_FIRST_AVAILABLE,
+} vl_msg_id_t;
+#undef vl_msg_id
+
+/* define message structures */
+#define vl_typedefs
+#include <ila/ila.api.h>
+#undef vl_typedefs
+
+/* define generated endian-swappers */
+#define vl_endianfun
+#include <ila/ila.api.h>
+#undef vl_endianfun
+
+#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
+
+/* Get the API version number */
+#define vl_api_version(n,v) static u32 api_version=(v);
+#include <ila/ila.api.h>
+#undef vl_api_version
+
+#define FINISH \
+ vec_add1 (s, 0); \
+ vl_print (handle, (char *)s); \
+ vec_free (s); \
+ return handle;
+
+#define REPLY_MACRO(t) \
+do { \
+ unix_shared_memory_queue_t * 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)+ila_api_main.msg_id_base); \
+ rmp->context = mp->context; \
+ rmp->retval = ntohl(rv); \
+ \
+ vl_msg_api_send_shmem (q, (u8 *)&rmp); \
+} while(0);
+
+static void
+vl_api_ila_iface_t_handler (vl_api_ila_iface_t * mp)
+{
+ vl_api_ila_iface_reply_t *rmp;
+ int rv = 0;
+ rv = ila_interface (mp->sw_if_index, !mp->enable);
+
+ REPLY_MACRO (VL_API_ILA_IFACE_REPLY);
+}
+
+static void *
+vl_api_ila_iface_t_print (vl_api_ila_iface_t * mp, void *handle)
+{
+ u8 *s;
+ s = format (0, "SCRIPT: ila_iface ");
+ s = format (s, "%d ", mp->sw_if_index);
+ s = format (s, "%s", mp->enable ? "enable" : "disable");
+ FINISH;
+}
+
+static void
+vl_api_ila_add_del_entry_t_handler (vl_api_ila_add_del_entry_t * mp)
+{
+ vl_api_ila_add_del_entry_reply_t *rmp;
+ int rv = 0;
+ ila_add_del_entry_args_t args;
+ args.type = mp->type;
+ memcpy (&args.sir_address, mp->sir_address, sizeof (args.sir_address));
+ args.locator = mp->locator;
+ args.vnid = mp->vnid;
+ args.local_adj_index = mp->local_adj_index;
+ args.csum_mode = mp->csum_mode;
+ args.dir = mp->dir;
+ args.is_del = mp->is_del;
+
+ rv = ila_add_del_entry (&args);
+ REPLY_MACRO (VL_API_ILA_ADD_DEL_ENTRY_REPLY);
+}
+
+static void *vl_api_ila_add_del_entry_t_print
+ (vl_api_ila_add_del_entry_t * mp, void *handle)
+{
+ u8 *s;
+ s = format (0, "SCRIPT: ila_add_del_entry ");
+ s = format (s, "%U ", format_ila_type, mp->type);
+ s = format (s, "%U ", format_ip6_address, mp->sir_address);
+ s = format (s, "%U ", format_half_ip6_address, mp->locator);
+ s = format (s, "%d ", mp->vnid);
+ s = format (s, "%d ", mp->local_adj_index);
+ s = format (s, "%U ", format_ila_csum_mode, mp->csum_mode);
+ s = format (s, "%U ", format_ila_direction, mp->dir);
+ s = format (s, "%s ", mp->is_del ? "del" : "add");
+ FINISH;
+}
+
+/* List of message types that this plugin understands */
+#define foreach_ila_plugin_api_msg \
+_(ILA_IFACE, ila_iface) \
+_(ILA_ADD_DEL_ENTRY, ila_add_del_entry)
+
+static clib_error_t *
+ila_api_init (vlib_main_t * vm)
+{
+ u8 *name = format (0, "ila_%08x%c", api_version, 0);
+ ila_api_main.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 + ila_api_main.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_ila_plugin_api_msg;
+#undef _
+
+ return 0;
+}
+
+VLIB_INIT_FUNCTION (ila_api_init);