summaryrefslogtreecommitdiffstats
path: root/src/scvpp/inc/scvpp/comm.h
diff options
context:
space:
mode:
authorYohanPipereau <ypiperea@cisco.com>2019-03-06 14:01:58 +0100
committerYohanPipereau <ypiperea@cisco.com>2019-03-29 14:39:36 +0100
commita760dfb253161911fc3aa3c8b879c461d53ade6e (patch)
tree0e79953f4ed5615879a58f49a74df3f9c6739a42 /src/scvpp/inc/scvpp/comm.h
parent2b9b6b9b130b75799a40989c0ebe5040fa3e45fb (diff)
Sweetcomb global cleanup
-Merge IETF and Openconfig to use SCVPP 2 -Move L2 bridge from sc_vpp_interface to sc_vpp_v3po -Implement tav2 dump -Make openconfig-interfaces functions static -Try one more dispatch after failure in VAPI_CALL -Add error return code for scvpp -Remove unused length maccros -Return appropriate error code for interface dump when interface not found -Improve scvpp test suite -Change get_interface_id prototype -Use interface_dump_iface in openconfig_interface. -No more vapi types in openconfig_interfaces.c -Move openconfig_local_routing VAPI operations to sc_vpp_ip -Implement a multiple dump with a stack data structure -Comment out state_cb code from openconfig_local_routing to use new functions later. -Rename YANG model to their fully qualified name : <module>@<revision> -Remove headers almost empty and put registration declaration in sc_model.h -Shorten vapi context global variable name -Reorganize scvpp unit test suite -Add instructions to Makefile to install/uninstall YANG models in sysrepo. -Add this new instructions to README.md. -Reimplement interface_dump_all -Use a common message at INFO Log Level to know when sysrepo callbacks are triggered -Remove old structure to perform dump of all interfaces -Reimplement get_interface_name and add scvpp test for it -Clean sys_util -Use UNUSED maccro everywhere to have lighter prototypes -Have ietf-interfaces:interfaces-state work with new dump function -Add setup and teardown for NAT tests -Remove unused tapv2 dump -Remove useless sysrepo module callback -Remove xpath_find_first_key usage in openconfig-interfaces -Remove xpath_find_first_key in oc_local_routing and in the rest of sweetcomb -Reorganize scvpp include dir and fix scvpp_test new warnings -Fix scvpp tests for ip routes -Factorize scvpp nat and test return code of its function -Correct test_dump_if_all if there is an existing hardware interface -Implement a per-prefix dump in scvpp -free changes iterator in ietf-interfaces -Add new XPATH in oc local-routing -Introduce helper methods for sysrepo config callbacks -Factorize config callback -Refactor the openconfig-local-routing config callback -Use common foreach_change to iterate over changes in all models -Create a sample directory gathering example of configurations supposed to work with sweetcomb -Fix state callback of oc-local-routing -Add new sample for get operation on next-hop -foreach_elt maccro condition forgets to read one element Change-Id: I8e87fce577a00337977588f057a6e095a20f457c Signed-off-by: YohanPipereau <ypiperea@cisco.com>
Diffstat (limited to 'src/scvpp/inc/scvpp/comm.h')
-rw-r--r--src/scvpp/inc/scvpp/comm.h213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/scvpp/inc/scvpp/comm.h b/src/scvpp/inc/scvpp/comm.h
new file mode 100644
index 0000000..9a27517
--- /dev/null
+++ b/src/scvpp/inc/scvpp/comm.h
@@ -0,0 +1,213 @@
+/*
+ * Copyright (c) 2018 HUACHENTEL and/or its affiliates.
+ * Copyright (c) 2018 PANTHEON.tech
+ * 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 __SC_VPP_COMMM_H__
+#define __SC_VPP_COMMM_H__
+
+#include <errno.h>
+
+#include <vapi/vapi.h>
+#include <vapi/vapi_common.h>
+#include <vapi/vpe.api.vapi.h>
+
+typedef enum {
+ SCVPP_OK = 0, /* Success */
+ SCVPP_EINVAL, /* Invalid value encountered */
+ SCVPP_EAGAIN, /* Operation would block */
+ SCVPP_ENOTSUP, /* Operation not supported */
+ SCVPP_ENOMEM, /* Out of memory */
+ SCVPP_NOT_FOUND, /* Required element can not be found */
+} scvpp_error_e;
+
+// Use VAPI macros to define symbols
+DEFINE_VAPI_MSG_IDS_VPE_API_JSON;
+
+#define VPP_IP4_HOST_PREFIX_LEN 32
+#define VPP_INTFC_NAME_LEN 64 /* Interface name max length */
+#define VPP_IP4_ADDRESS_LEN 4 /* IPv4 length in VPP format */
+#define VPP_IP6_ADDRESS_LEN 16 /* IPv6 length in VPP format */
+#define VPP_MAC_ADDRESS_LEN 8 /* MAC length in VPP format */
+/* IPv4 and IPv6 length in string format */
+#define VPP_IP4_ADDRESS_STRING_LEN INET_ADDRSTRLEN //16, include '\0'
+#define VPP_IP6_ADDRESS_STRING_LEN INET6_ADDRSTRLEN //46, include '\0'
+#define VPP_IP4_PREFIX_STRING_LEN \
+ INET_ADDRSTRLEN + sizeof('/') + 2 // include '\0'
+#define VPP_IP6_PREFIX_STRING_LEN \
+ INET6_ADDRSTRLEN + sizeof('/') + 3 // include '\0'
+
+/**********************************MACROS**********************************/
+#define ARG_CHECK(retval, arg) \
+ do \
+ { \
+ if (NULL == (arg)) \
+ { \
+ return (retval); \
+ } \
+ } \
+ while (0)
+
+#define ARG_CHECK2(retval, arg1, arg2) \
+ ARG_CHECK(retval, arg1); \
+ ARG_CHECK(retval, arg2)
+
+#define ARG_CHECK3(retval, arg1, arg2, arg3) \
+ ARG_CHECK(retval, arg1); \
+ ARG_CHECK(retval, arg2); \
+ ARG_CHECK(retval, arg3)
+
+#define ARG_CHECK4(retval, arg1, arg2, arg3, arg4) \
+ ARG_CHECK(retval, arg1); \
+ ARG_CHECK(retval, arg2); \
+ ARG_CHECK(retval, arg3); \
+ ARG_CHECK(retval, arg4)
+
+/* Suppress compiler warning about unused variable.
+ * This must be used only for callback function else suppress your unused
+ * parameter in function prototype. */
+#define UNUSED(x) (void)x
+
+#define VAPI_RETVAL_CB(api_name) \
+static vapi_error_e \
+api_name##_cb (vapi_ctx_t ctx, void *caller_ctx, vapi_error_e rv, bool is_last, \
+ vapi_payload_##api_name##_reply * reply) \
+{ \
+ UNUSED(ctx); UNUSED(caller_ctx); UNUSED(rv); UNUSED(is_last); \
+ return reply->retval; \
+}
+
+#define VAPI_COPY_CB(api_name) \
+static vapi_error_e \
+api_name##_cb (vapi_ctx_t ctx, void *caller_ctx, vapi_error_e rv, bool is_last, \
+ vapi_payload_##api_name##_reply * reply) \
+{ \
+ UNUSED(ctx); UNUSED(rv); UNUSED(is_last); \
+ vapi_payload_##api_name##_reply * passed; \
+ if (caller_ctx) \
+ { \
+ passed = (vapi_payload_##api_name##_reply *)caller_ctx; \
+ *passed = *reply; \
+ } \
+ return VAPI_OK; \
+}\
+
+#define VAPI_CALL_MODE(call_code, vapi_mode) \
+ do \
+ { \
+ if (VAPI_MODE_BLOCKING == (vapi_mode)) \
+ { \
+ rv = call_code; \
+ } \
+ else \
+ { \
+ while (VAPI_EAGAIN == (rv = call_code)); \
+ if (rv != VAPI_OK) { /* try once more to get reply */ \
+ rv = vapi_dispatch (g_vapi_ctx); \
+ } \
+ } \
+ } \
+ while (0)
+
+#define VAPI_CALL(call_code) VAPI_CALL_MODE(call_code, g_vapi_mode)
+
+struct elt {
+ void *data; //vapi_payload structure
+ struct elt *next;
+ int id; //id of the stack element to count total nb of elements
+};
+
+static inline int push(struct elt **stack, void *data, int length)
+{
+ struct elt *el;
+
+ //new stack node
+ el = malloc(sizeof(struct elt));
+ if (!el)
+ return -ENOMEM;
+ el->data = malloc(length);
+ if (!el->data)
+ return -ENOMEM;
+
+ memcpy(el->data, data, length);
+ if (*stack)
+ el->id = (*stack)->id++;
+ else
+ el->id = 0;
+ el->next = *stack; //point to old value of stack
+ *stack = el; //el is new stack head
+
+ return 0;
+}
+
+static inline void * pop(struct elt **stack)
+{
+ struct elt *prev;
+ void *data;
+
+ if (!(*stack))
+ return NULL;
+
+ data = (*stack)->data; //get data at stack head
+ prev = *stack; //save stack to free memory later
+ *stack = (*stack)->next; //new stack
+
+ free(prev);
+ prev = NULL;
+
+ return data;
+}
+
+#define VAPI_DUMP_LIST_CB(api_name) \
+static vapi_error_e \
+api_name##_all_cb(vapi_ctx_t ctx, void *caller_ctx, vapi_error_e rv, bool is_last, \
+ vapi_payload_##api_name##_details *reply) \
+{ \
+ UNUSED(ctx); UNUSED(rv); UNUSED(is_last); \
+ struct elt **stackp; \
+ ARG_CHECK2(VAPI_EINVAL, caller_ctx, reply); \
+ \
+ stackp = (struct elt**) caller_ctx; \
+ push(stackp, reply, sizeof(*reply)); \
+ \
+ return VAPI_OK; \
+}
+
+#define foreach_stack_elt(stack) \
+ for(void *data = pop(&stack); data != NULL ; data = pop(&stack))
+//for(void *data = pop(&stack); stack != NULL ; data = pop(&stack)) // No!!
+
+int sc_aton(const char *cp, u8 * buf, size_t length);
+char * sc_ntoa(const u8 * buf);
+
+/**
+ * @brief Function converts the u8 array from network byte order to host byte order.
+ *
+ * @param[in] host IPv4 address.
+ * @return host byte order value.
+ */
+uint32_t hardntohlu32(uint8_t host[4]);
+
+/*
+ * VPP
+ */
+
+extern vapi_ctx_t g_vapi_ctx;
+extern vapi_mode_e g_vapi_mode;
+
+int sc_connect_vpp();
+int sc_disconnect_vpp();
+int sc_end_with(const char* str, const char* end);
+
+#endif //__SC_VPP_COMMM_H__