2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
15 #ifndef __included_vppjni_h__
16 #define __included_vppjni_h__
18 #include <vnet/vnet.h>
19 #include <vnet/ip/ip.h>
20 #include <vnet/api_errno.h>
21 #include <vlibapi/api.h>
22 #include <vlibmemory/api.h>
24 #include <japi/vppjni_bridge_domain.h>
32 u8 valid; // used in a vector of sw_interface_details_t
34 u8 interface_name[64];
37 u32 l2_address_length;
45 u8 sub_number_of_tags;
46 u16 sub_outer_vlan_id;
47 u16 sub_inner_vlan_id;
50 u8 sub_outer_vlan_id_any;
51 u8 sub_inner_vlan_id_any;
56 } sw_interface_details_t;
62 * Subinterface ID. A number 0-N to uniquely identify
63 * this subinterface under the super interface
67 /* 0 = dot1q, 1=dot1ad */
70 /* Number of tags 0-2 */
71 u8 sub_number_of_tags;
72 u16 sub_outer_vlan_id;
73 u16 sub_inner_vlan_id;
76 u8 sub_outer_vlan_id_any;
77 u8 sub_inner_vlan_id_any;
79 /* vlan tag rewrite */
84 } sw_interface_subif_t;
115 packet_counters_t pkts;
123 } sw_interface_stats_t;
130 u32 decap_next_index;
131 } vxlan_tunnel_details_t;
136 volatile u32 context_id_sent;
137 volatile u32 context_id_received;
143 /* To recycle pseudo-synchronous message code from vpp_api_test... */
144 volatile u32 result_ready;
146 volatile u8 *shmem_result;
149 pthread_key_t cleanup_rx_thread_key;
150 /* attachment of rx thread to java thread */
154 jmethodID jmtdIfDetails; // interfaceDetails method
155 uword *callback_hash; // map context_id => jobject
156 uword *ping_hash; // map ping context_id => msg type called
159 clib_time_t clib_time;
161 /* connected indication */
164 /* context -> non-trivial reply hash */
166 u32 saved_reply_count;
168 /* interface name map */
169 uword * sw_if_index_by_interface_name;
171 /* interface counters */
172 sw_interface_stats_t * sw_if_stats_by_sw_if_index;
174 /* interface table */
175 sw_interface_details_t * sw_if_table;
177 uword * sw_if_config_by_sw_if_index;
179 /* interface indices of responses to one sw_if_dump request */
181 u32 * sw_if_dump_if_indices;
183 /* program name, build_dir, version */
185 u8 build_directory[256];
189 /* subinterface table */
190 sw_interface_subif_t * sw_if_subif_table;
192 /* used in ip_address_dump request and response handling */
193 ipv4_address_t *ipv4_addresses;
194 ipv6_address_t *ipv6_addresses;
197 /* used in vxlan_tunnel_dump request and response handling */
198 vxlan_tunnel_details_t *vxlan_tunnel_details;
204 unix_shared_memory_queue_t * vl_input_queue;
205 api_main_t * api_main;
208 vjbd_main_t vjbd_main;
211 vppjni_main_t vppjni_main __attribute__((aligned (64)));
214 static inline u32 vppjni_get_context_id (vppjni_main_t * jm)
217 my_context_id = __sync_add_and_fetch (&jm->context_id_sent, 1);
218 return my_context_id;
221 static inline void vppjni_lock (vppjni_main_t * jm, u32 tag)
223 while (__sync_lock_test_and_set (&jm->lock, 1))
228 static inline void vppjni_unlock (vppjni_main_t * jm)
231 CLIB_MEMORY_BARRIER();
235 static inline f64 vppjni_time_now (vppjni_main_t *jm)
237 return clib_time_now (&jm->clib_time);
240 static inline int vppjni_sanity_check (vppjni_main_t * jm)
242 if (!jm->is_connected)
243 return VNET_API_ERROR_NOT_CONNECTED;
247 #define __PACKED(x) x __attribute__((packed))
249 typedef __PACKED(struct _vl_api_generic_reply {
254 }) vl_api_generic_reply_t;
256 void vl_api_generic_reply_handler (vl_api_generic_reply_t *mp);
258 /* M: construct, but don't yet send a message */
262 jm->result_ready = 0; \
263 mp = vl_msg_api_alloc(sizeof(*mp)); \
264 memset (mp, 0, sizeof (*mp)); \
265 mp->_vl_msg_id = ntohs (VL_API_##T); \
266 mp->client_index = jm->my_client_index; \
271 jm->result_ready = 0; \
272 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
273 memset (mp, 0, sizeof (*mp)); \
274 mp->_vl_msg_id = ntohs (VL_API_##T); \
275 mp->client_index = jm->my_client_index; \
279 /* S: send a message */
280 #define S (vl_msg_api_send_shmem (jm->vl_input_queue, (u8 *)&mp))
282 /* W: wait for results, with timeout */
285 timeout = vppjni_time_now (jm) + 1.0; \
287 while (vppjni_time_now (jm) < timeout) { \
288 if (jm->result_ready == 1) { \
289 return (jm->retval); \
295 /* WNR: wait for results, with timeout (without returning) */
298 timeout = vppjni_time_now (jm) + 1.0; \
301 while (vppjni_time_now (jm) < timeout) { \
302 if (jm->result_ready == 1) { \
309 #endif /* __included_vppjni_h__ */