FD.io VPP  v21.01.1
Vector Packet Processing
vat_helper_macros.h
Go to the documentation of this file.
1 /*
2  *------------------------------------------------------------------
3  * vat_helper_macros.h - collect api client helper macros in one place
4  *
5  * Copyright (c) 2016 Cisco and/or its affiliates.
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at:
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *------------------------------------------------------------------
18  */
19 #ifndef __vat_helper_macros_h__
20 #define __vat_helper_macros_h__
21 
22 /* M: construct, but don't yet send a message */
23 #define M(T, mp) \
24 do { \
25  socket_client_main_t *scm = vam->socket_client_main; \
26  vam->result_ready = 0; \
27  if (scm && scm->socket_enable) \
28  mp = vl_socket_client_msg_alloc (sizeof(*mp)); \
29  else \
30  mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \
31  clib_memset (mp, 0, sizeof (*mp)); \
32  mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \
33  mp->client_index = vam->my_client_index; \
34 } while(0);
35 
36 /* MPING: construct a control-ping message, don't send it yet */
37 #define MPING(T, mp) \
38 do { \
39  socket_client_main_t *scm = vam->socket_client_main; \
40  vam->result_ready = 0; \
41  if (scm && scm->socket_enable) \
42  mp = vl_socket_client_msg_alloc (sizeof(*mp)); \
43  else \
44  mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \
45  clib_memset (mp, 0, sizeof (*mp)); \
46  mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \
47  mp->client_index = vam->my_client_index; \
48  if (scm) \
49  scm->control_pings_outstanding++; \
50 } while(0);
51 
52 #define M2(T, mp, n) \
53 do { \
54  socket_client_main_t *scm = vam->socket_client_main; \
55  vam->result_ready = 0; \
56  if (scm && scm->socket_enable) \
57  mp = vl_socket_client_msg_alloc (sizeof(*mp) + n); \
58  else \
59  mp = vl_msg_api_alloc_as_if_client(sizeof(*mp) + n); \
60  clib_memset (mp, 0, sizeof (*mp)); \
61  mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \
62  mp->client_index = vam->my_client_index; \
63 } while(0);
64 
65 /* S: send a message */
66 #define S(mp) \
67 do { \
68  socket_client_main_t *scm = vam->socket_client_main; \
69  if (scm && scm->socket_enable) \
70  vl_socket_client_write (); \
71  else \
72  vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp); \
73  } while (0);
74 
75 /* W: wait for results, with timeout */
76 #define W(ret) \
77 do { \
78  f64 timeout = vat_time_now (vam) + 1.0; \
79  socket_client_main_t *scm = vam->socket_client_main; \
80  ret = -99; \
81  \
82  if (scm && scm->socket_enable) \
83  vl_socket_client_read (5); \
84  while (vat_time_now (vam) < timeout) { \
85  if (vam->result_ready == 1) { \
86  ret = vam->retval; \
87  break; \
88  } \
89  vat_suspend (vam->vlib_main, 1e-5); \
90  } \
91 } while(0);
92 
93 /* W2: wait for results, with timeout */ \
94 #define W2(ret, body) \
95 do { \
96  f64 timeout = vat_time_now (vam) + 1.0; \
97  socket_client_main_t *scm = vam->socket_client_main; \
98  ret = -99; \
99  \
100  if (scm && scm->socket_enable) \
101  vl_socket_client_read (5); \
102  while (vat_time_now (vam) < timeout) { \
103  if (vam->result_ready == 1) { \
104  (body); \
105  ret = vam->retval; \
106  break; \
107  } \
108  vat_suspend (vam->vlib_main, 1e-5); \
109  } \
110 } while(0);
111 
112 #define VAT_PLUGIN_REGISTER(plug) \
113 clib_error_t * vat_plugin_register (vat_main_t *vam) \
114 { \
115  plug##_test_main_t * mp = &plug##_test_main; \
116  u8 * name; \
117  \
118  mp->vat_main = vam; \
119  \
120  /* Ask the vpp engine for the first assigned message-id */ \
121  name = format (0, #plug "_%08x%c", api_version, 0); \
122  mp->msg_id_base = \
123  vl_client_get_first_plugin_msg_id ((char *) name); \
124  vec_free(name); \
125  \
126  if (mp->msg_id_base != (u16) ~0) \
127  plug##_api_hookup (vam); \
128  else \
129  return clib_error_return (0, #plug " plugin not loaded...");\
130  return 0; \
131 }
132 
133 
134 #endif /* __vat_helper_macros_h__ */