/* *------------------------------------------------------------------ * Copyright (c) 2017 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 vpp_api_h_included #define vpp_api_h_included #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @file vapi.h * * common vpp api C declarations * * This file declares the common C API functions. These include connect, * disconnect and utility functions as well as the low-level vapi_send and * vapi_recv API. This is only the transport layer. * * Message formats and higher-level APIs are generated by running the * vapi_c_gen.py script (which is run for in-tree APIs as part of the build * process). It's not recommended to mix the higher and lower level APIs. Due * to version issues, the higher-level APIs are not part of the shared library. */ typedef struct vapi_ctx_s *vapi_ctx_t; /** * @brief allocate vapi message of given size * * @note message must be freed by vapi_msg_free if not consumed by vapi_send * call * * @param ctx opaque vapi context * * @return pointer to message or NULL if out of memory */ void *vapi_msg_alloc (vapi_ctx_t ctx, size_t size); /** * @brief free a vapi message * * @note messages received by vapi_recv must be freed when no longer needed * * @param ctx opaque vapi context * @param msg message to be freed */ void vapi_msg_free (vapi_ctx_t ctx, void *msg); /** * @brief allocate vapi context * * @param[out] pointer to result variable * * @return VAPI_OK on success, other error code on error */ vapi_error_e vapi_ctx_alloc (vapi_ctx_t * result); /** * @brief free vapi context */ void vapi_ctx_free (vapi_ctx_t ctx); /** * @brief check if message identified by it's message id is known by the vpp to * which the connection is open */ bool vapi_is_msg_available (vapi_ctx_t ctx, vapi_msg_id_t type); /** * @brief connect to vpp * * @param ctx opaque vapi context, must be allocated using vapi_ctx_alloc first * @param name application name * @param chroot_prefix shared memory prefix * @param max_outstanding_requests max number of outstanding requests queued * @param response_queue_size size of the response queue * @param mode mode of operation - blocking or nonblocking * @param handle_keepalives - if true, automatically handle memclnt_keepalive * * @return VAPI_OK on success, other error code on error */ vapi_error_e vapi_connect (vapi_ctx_t ctx, const char *name, const char *chroot_prefix, int max_outstanding_requests, int response_queue_size, vapi_mode_e mode, bool handle_keepalives); /** * @brief disconnect from vpp * * @param ctx opaque vapi context * * @return VAPI_OK on success, other error code on error */ vapi_error_e vapi_disconnect (vapi_ctx_t ctx); /** * @brief get event file descriptor * * @note this file descriptor becomes readable when messages (from vpp) * are waiting in queue * * @param ctx opaque vapi context * @param[out] fd pointer to result variable * * @return VAPI_OK on success, other error code on error */ vapi_error_e vapi_get_fd (vapi_ctx_t ctx, int *fd); /** * @brief low-level api for sending messages to vpp * * @note it is not recommended to use this api directly, use generated api * instead * * @param ctx opaque vapi context * @param msg message to send * * @return VAPI_OK on success, other error code on error */ vapi_error_e vapi_send (vapi_ctx_t ctx, void *msg); /*