diff options
Diffstat (limited to 'src/scvpp/inc')
-rw-r--r-- | src/scvpp/inc/scvpp/comm.h | 213 | ||||
-rw-r--r-- | src/scvpp/inc/scvpp/interface.h | 69 | ||||
-rw-r--r-- | src/scvpp/inc/scvpp/ip.h | 77 | ||||
-rw-r--r-- | src/scvpp/inc/scvpp/nat.h | 61 | ||||
-rw-r--r-- | src/scvpp/inc/scvpp/v3po.h | 54 |
5 files changed, 474 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__ diff --git a/src/scvpp/inc/scvpp/interface.h b/src/scvpp/inc/scvpp/interface.h new file mode 100644 index 0000000..86cd185 --- /dev/null +++ b/src/scvpp/inc/scvpp/interface.h @@ -0,0 +1,69 @@ +/* + * 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 __BAPI_INTERFACE_H__ +#define __BAPI_INTERFACE_H__ + +#include <vapi/interface.api.vapi.h> +#include <scvpp/comm.h> + +typedef vapi_payload_sw_interface_details sw_interface_dump_t; + +/** + * @brief Change an interface state + * @param interface_name - name of target interface + * @param enable - true=state up, false=state down + * @return 0 for success, else negative SCVPP error code + */ +int interface_enable(const char *interface_name, const bool enable); + +/** + * @brief Dump details about all existing interfaces + * @return stack structure containing all interfaces or NULL if empty + */ +extern struct elt * interface_dump_all(); + + +/** + * @brief Dump details about a specific interface + * @param details - where answer will be written + * @param interface_name - name of the interface to dump + * @return 0 for success or negative SCVPP error code + */ +extern int interface_dump_iface(sw_interface_dump_t *details, + const char *interface_name); + +/* + * Library internal helper functions. Symbols should not be exported eventually + */ + +/* + * @brief Get VPP internal index for an interface + * @param interface_name - name of the interface to get id from + * @param sw_if_index - pointer to interface index to be returned + * @return 0 upon success or negative SCVPP error code + */ +extern int get_interface_id(const char *interface_name, uint32_t *sw_if_index); + +/* @brief Get interface name from an interface ID. This is a super expensive + * operation !!! Avoid using it. + * @param interface_name - pointer to string holding returned interface name + * @param sw_if_index - interface index provided + * @return 0 upon success or negative SCVPP error code + */ +extern int get_interface_name(char *interface_name, uint32_t sw_if_index); + +#endif /* __BAPI_INTERFACE_H__ */ diff --git a/src/scvpp/inc/scvpp/ip.h b/src/scvpp/inc/scvpp/ip.h new file mode 100644 index 0000000..f8805b3 --- /dev/null +++ b/src/scvpp/inc/scvpp/ip.h @@ -0,0 +1,77 @@ +/* + * 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 __BAPI_IP_H__ +#define __BAPI_IP_H__ + +#include <vapi/interface.api.vapi.h> +#include <vapi/ip.api.vapi.h> + +typedef vapi_payload_ip_fib_details fib_dump_t; + +/* + * @brief Dump IPv4/IPv6 address from an interface. + * @param interface_name - name of the interface to get ip from. + * @param ip_addr - where dump will store IP. If IP not found, returns 0.0.0.0 + * @param prefix_len - pointer where dump will store prefix + * @param is_ipv6 - true = IPv6, false = IPv4 + * @return 0 on success, or nergative SCVPP error code + */ +extern int ipv46_address_dump(const char *interface_name, char *ip_addr, + u8 *prefix_len, bool is_ipv6); + +/** + * @brief Add or remove IPv4/IPv6 address to/from an interface. + * @param interface_name - name of interface to configure + * @param addr - address to add + * @param prefix_len - prefix length of interface + * @param is_ipv6 - true if ipv6, false otherwise + * @param add - true to add, false to remove + */ +extern int ipv46_config_add_remove(const char *interface_name, const char *addr, + uint8_t prefix_len, bool is_ipv6, bool add); + +/* + * TODO should add a field is_ipv6 because it only do ipv4 now + * @brief Add or remove an IP route + * @param dst_address - subnet IP you wish to route + * @param dst_address_length - prefix length for subnet you wish to route + * @param next_address - Next hop IP (can use next_hop_interface instead) + * @param is_add - true to add, false to remove + * @param table_id - id of the tab in FIB + * @param next_hop_interface - Next hop interface (can use next_address instead) + */ +extern int +ipv46_config_add_del_route(const char* dst_address, u8 dst_address_length, + const char* next_address, u8 is_add, u32 table_id, + const char *next_hop_interface); + +/** + * @brief Dump all FIB tables entries + * @return stacked answers on success, or NULL on failure + */ +extern struct elt* ipv4_fib_dump_all(); + +/* + * @brief Dump information about a prefix, based on fib_dump_all + * @param prefix_xpath - prefix to look for in FIB + * @param reply - FIB entry dump replied + * @return SCVPP_OK if prefix found or SCVPP_NOT_FOUND + */ +extern int ipv4_fib_dump_prefix(const char *prefix_xpath, fib_dump_t **reply); + +#endif /* __BAPI_IP_H__ */ diff --git a/src/scvpp/inc/scvpp/nat.h b/src/scvpp/inc/scvpp/nat.h new file mode 100644 index 0000000..40e727e --- /dev/null +++ b/src/scvpp/inc/scvpp/nat.h @@ -0,0 +1,61 @@ +/* + * 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 __BAPI_NAT_H__ +#define __BAPI_NAT_H__ + +#include <vapi/nat.api.vapi.h> + +typedef vapi_payload_nat44_interface_details nat44_interface_details_t; +typedef vapi_payload_nat44_add_del_interface_addr nat44_add_del_interface_addr_t; +typedef vapi_payload_nat44_add_del_address_range nat44_add_del_address_range_t; +typedef vapi_payload_nat44_add_del_static_mapping nat44_add_del_static_mapping_t; +typedef vapi_payload_nat44_static_mapping_details nat44_static_mapping_details_t; +typedef vapi_payload_nat44_forwarding_enable_disable nat44_forwarding_enable_disable_t; +typedef vapi_payload_nat_set_workers nat_set_workers_t; + + +//Wrapper function, if we want hide the VAPI return value +extern int nat44_interface_dump(nat44_interface_details_t *reply); +extern int nat44_add_del_interface_addr( + const nat44_add_del_interface_addr_t *msg); +extern int nat44_add_del_addr_range(const nat44_add_del_address_range_t *range); +extern int nat44_add_del_static_mapping( + const nat44_add_del_static_mapping_t *msg); +extern int nat44_static_mapping_dump(nat44_static_mapping_details_t *reply); +extern int nat44_forwarding_enable_disable( + const nat44_forwarding_enable_disable_t *msg); +extern int nat_set_workers(const nat_set_workers_t *msg); + + +// Alternative, if we don't want hide VAPI return value + +// extern vapi_error_e bin_api_nat44_interface_dump(nat44_interface_details_t *reply); +// extern vapi_error_e bin_api_nat44_add_del_interface_addr( +// const nat44_add_del_interface_addr_t *msg); +// extern vapi_error_e bin_api_nat44_add_del_addr_range( +// const nat44_add_del_address_range_t *range); +// extern vapi_error_e bin_api_nat44_add_del_static_mapping( +// const nat44_add_del_static_mapping_t *msg); +// extern vapi_error_e bin_api_nat44_static_mapping_dump( +// nat44_static_mapping_details_t *reply); +// extern vapi_error_e bin_api_nat44_forwarding_enable_disable( +// const nat44_forwarding_enable_disable_t *msg); +// extern vapi_error_e bin_api_nat_set_workers(const nat_set_workers_t *msg); + + +#endif /* __BAPI_NAT_H__ */ + diff --git a/src/scvpp/inc/scvpp/v3po.h b/src/scvpp/inc/scvpp/v3po.h new file mode 100644 index 0000000..f876ab4 --- /dev/null +++ b/src/scvpp/inc/scvpp/v3po.h @@ -0,0 +1,54 @@ +/* + * 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 _V3PO__INTERFACE_H__ +#define _V3PO__INTERFACE_H__ + +#include <vapi/tapv2.api.vapi.h> +#include <vapi/l2.api.vapi.h> + +/** + * V3PO defines operations for specific interfaces used by VPP like: + * - tapv2 + */ + +/* tapv2 */ + +typedef vapi_payload_tap_create_v2 tapv2_create_t; +typedef vapi_payload_sw_interface_tap_v2_details tapv2_dump_t; + +/** + * TODO problem: vapi_payload_sw_interface_tap_v2_details reply is NULL + * @brief Dump information about a tap interface + * @param dump - where dump information will be stored + * @return 0 on success, or negative SCVPP error code + */ +extern int dump_tapv2(tapv2_dump_t *dump); + +/** + * @brief Create a tapv2 interface + * @param query - required structure for the creation of a VPP tapv2 interface + * @return 0 on success, or negative SCVPP error code + */ +extern int create_tapv2(tapv2_create_t *query); + +/** + * @brief Delete a tapv2 interface + * @param interface_name - name of the interface to delete + * @return 0 on success, or negative SCVPP error code + */ +extern int delete_tapv2(char *interface_name); + +#endif /* __V3PO_INTERFACE_H__ */ |