Line data Source code
1 : /* 2 : *------------------------------------------------------------------ 3 : * Copyright (c) 2017 Cisco and/or its affiliates. 4 : * Licensed under the Apache License, Version 2.0 (the "License"); 5 : * you may not use this file except in compliance with the License. 6 : * You may obtain a copy of the License at: 7 : * 8 : * http://www.apache.org/licenses/LICENSE-2.0 9 : * 10 : * Unless required by applicable law or agreed to in writing, software 11 : * distributed under the License is distributed on an "AS IS" BASIS, 12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 : * See the License for the specific language governing permissions and 14 : * limitations under the License. 15 : *------------------------------------------------------------------ 16 : */ 17 : 18 : #ifndef VAPI_INTERNAL_H 19 : #define VAPI_INTERNAL_H 20 : 21 : #include <endian.h> 22 : #include <string.h> 23 : #include <vppinfra/types.h> 24 : 25 : /** 26 : * @file vapi_internal.h 27 : * 28 : * internal vpp api C declarations 29 : * 30 : * This file contains internal vpp api C declarations. It's not intended to be 31 : * used by the client programmer and the API defined here might change at any 32 : * time.. 33 : */ 34 : 35 : #ifdef __cplusplus 36 : extern "C" { 37 : #endif 38 : 39 : struct vapi_ctx_s; 40 : 41 : typedef struct __attribute__ ((__packed__)) 42 : { 43 : u16 _vl_msg_id; 44 : u32 context; 45 : } vapi_type_msg_header1_t; 46 : 47 : typedef struct __attribute__ ((__packed__)) 48 : { 49 : u16 _vl_msg_id; 50 : u32 client_index; 51 : u32 context; 52 : } vapi_type_msg_header2_t; 53 : 54 : static inline void 55 3 : vapi_type_msg_header1_t_hton (vapi_type_msg_header1_t * h) 56 : { 57 3 : h->_vl_msg_id = htobe16 (h->_vl_msg_id); 58 3 : } 59 : 60 : static inline void 61 1127 : vapi_type_msg_header1_t_ntoh (vapi_type_msg_header1_t * h) 62 : { 63 1127 : h->_vl_msg_id = be16toh (h->_vl_msg_id); 64 1127 : } 65 : 66 : static inline void 67 467 : vapi_type_msg_header2_t_hton (vapi_type_msg_header2_t * h) 68 : { 69 467 : h->_vl_msg_id = htobe16 (h->_vl_msg_id); 70 467 : } 71 : 72 : static inline void 73 1 : vapi_type_msg_header2_t_ntoh (vapi_type_msg_header2_t * h) 74 : { 75 1 : h->_vl_msg_id = be16toh (h->_vl_msg_id); 76 1 : } 77 : 78 : 79 : #include <vapi/vapi.h> 80 : 81 : typedef vapi_error_e (*vapi_cb_t) (struct vapi_ctx_s *, void *, vapi_error_e, 82 : bool, void *); 83 : 84 : typedef void (*generic_swap_fn_t) (void *payload); 85 : typedef int (*verify_msg_size_fn_t) (void *msg, uword buf_size); 86 : 87 : typedef struct 88 : { 89 : const char *name; 90 : size_t name_len; 91 : const char *name_with_crc; 92 : size_t name_with_crc_len; 93 : bool has_context; 94 : unsigned int context_offset; 95 : unsigned int payload_offset; 96 : verify_msg_size_fn_t verify_msg_size; 97 : generic_swap_fn_t swap_to_be; 98 : generic_swap_fn_t swap_to_host; 99 : vapi_msg_id_t id; /* assigned at run-time */ 100 : } vapi_message_desc_t; 101 : 102 : typedef struct 103 : { 104 : const char *name; 105 : int payload_offset; 106 : size_t size; 107 : void (*swap_to_be) (void *payload); 108 : void (*swap_to_host) (void *payload); 109 : } vapi_event_desc_t; 110 : 111 : vapi_msg_id_t vapi_register_msg (vapi_message_desc_t * msg); 112 : u16 vapi_lookup_vl_msg_id (vapi_ctx_t ctx, vapi_msg_id_t id); 113 : vapi_msg_id_t vapi_lookup_vapi_msg_id_t (vapi_ctx_t ctx, u16 vl_msg_id); 114 : int vapi_get_client_index (vapi_ctx_t ctx); 115 : bool vapi_is_nonblocking (vapi_ctx_t ctx); 116 : bool vapi_requests_empty (vapi_ctx_t ctx); 117 : bool vapi_requests_full (vapi_ctx_t ctx); 118 : size_t vapi_get_request_count (vapi_ctx_t ctx); 119 : size_t vapi_get_max_request_count (vapi_ctx_t ctx); 120 : u32 vapi_gen_req_context (vapi_ctx_t ctx); 121 : 122 : enum vapi_request_type 123 : { 124 : VAPI_REQUEST_REG = 0, 125 : VAPI_REQUEST_DUMP = 1, 126 : VAPI_REQUEST_STREAM = 2, 127 : }; 128 : 129 : void vapi_store_request (vapi_ctx_t ctx, u32 context, 130 : vapi_msg_id_t response_id, 131 : enum vapi_request_type type, vapi_cb_t callback, 132 : void *callback_ctx); 133 : int vapi_get_payload_offset (vapi_msg_id_t id); 134 : void (*vapi_get_swap_to_host_func (vapi_msg_id_t id)) (void *payload); 135 : void (*vapi_get_swap_to_be_func (vapi_msg_id_t id)) (void *payload); 136 : size_t vapi_get_context_offset (vapi_msg_id_t id); 137 : bool vapi_msg_is_with_context (vapi_msg_id_t id); 138 : size_t vapi_get_message_count(); 139 : const char *vapi_get_msg_name(vapi_msg_id_t id); 140 : 141 : vapi_error_e vapi_producer_lock (vapi_ctx_t ctx); 142 : vapi_error_e vapi_producer_unlock (vapi_ctx_t ctx); 143 : 144 : #ifdef __cplusplus 145 : } 146 : #endif 147 : 148 : #endif