FD.io VPP  v18.01.2-1-g9b554f3
Vector Packet Processing
stn_api.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 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:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
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.
14  */
15 
16 #include <vlibapi/api.h>
17 #include <vlibmemory/api.h>
18 
19 #include <plugins/stn/stn.h>
20 #include <vnet/ip/format.h>
21 
22 #include <vppinfra/byte_order.h>
23 
24 /* define message IDs */
25 #include <stn/stn_msg_enum.h>
26 
27 /* define message structures */
28 #define vl_typedefs
29 #include <stn/stn_all_api_h.h>
30 #undef vl_typedefs
31 
32 /* define generated endian-swappers */
33 #define vl_endianfun
34 #include <stn/stn_all_api_h.h>
35 #undef vl_endianfun
36 
37 /* instantiate all the print functions we know about */
38 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__)
39 #define vl_printfun
40 #include <stn/stn_all_api_h.h>
41 #undef vl_printfun
42 
43 /* Get the API version number */
44 #define vl_api_version(n,v) static u32 api_version=(v);
45 #include <stn/stn_all_api_h.h>
46 #undef vl_api_version
47 
48 #define REPLY_MSG_ID_BASE stn_main.msg_id_base
50 
51 /* Macro to finish up custom dump fns */
52 #define FINISH \
53  vec_add1 (s, 0); \
54  vl_print (handle, (char *)s); \
55  vec_free (s); \
56  return handle;
57 
58 /**
59  * @brief API message custom-dump function
60  * @param mp vl_api_stn_add_del_rule_t * mp the api message
61  * @param handle void * print function handle
62  * @returns u8 * output string
63  */
65  (vl_api_stn_add_del_rule_t * mp, void *handle)
66 {
67  u8 *s;
68 
69  s = format (0, "SCRIPT: stn_add_del_rule ");
70  if (mp->is_ip4)
71  s = format (s, "address %U ", format_ip4_address, mp->ip_address);
72  else
73  s = format (s, "address %U ", format_ip6_address, mp->ip_address);
74  s = format (s, "sw_if_index %d is_add %d", mp->sw_if_index, mp->is_add);
75 
76  FINISH;
77 }
78 
79 static void
81 {
83  vl_api_stn_add_del_rule_reply_t *rmp;
84  int rv = 0;
85 
86  if (mp->is_ip4)
87  {
89  memcpy(&a, mp->ip_address, sizeof(a));
90  ip46_address_set_ip4(&args.address, &a);
91  }
92  else
93  memcpy(&args.address.ip6, mp->ip_address, sizeof(ip6_address_t));
94 
95  args.sw_if_index = clib_net_to_host_u32(mp->sw_if_index);
96  args.del = !mp->is_add;
97 
98  rv = stn_rule_add_del(&args);
99 
100  REPLY_MACRO (VL_API_STN_ADD_DEL_RULE_REPLY);
101 }
102 
103 static void
105 {
107 
108  rmp =
109  vl_msg_api_alloc (sizeof (*rmp));
110  memset (rmp, 0, sizeof (*rmp));
111  rmp->_vl_msg_id =
112  clib_host_to_net_u32 (VL_API_STN_RULES_DUMP + stn_main.msg_id_base);
113 
114  if (ip46_address_is_ip4(&r->address))
115  {
116  clib_memcpy(rmp->ip_address, &r->address.ip4, sizeof(ip4_address_t));
117  rmp->is_ip4 = 1;
118  }
119  else
120  {
121  clib_memcpy(rmp->ip_address, &r->address.ip6, sizeof(ip6_address_t));
122  }
123 
124  rmp->context = context;
125  rmp->sw_if_index = clib_host_to_net_u32(r->sw_if_index);
126 
127  vl_msg_api_send_shmem (q, (u8 *) & rmp);
128 }
129 
130 static void
132 {
134  stn_main_t *stn = &stn_main;
135  stn_rule_t *r;
136 
138  if (q == 0)
139  return;
140 
141  /* *INDENT-OFF* */
142  pool_foreach (r, stn->rules,
143  ({
144 
145  send_stn_rule (r, q, mp->context);
146  }));
147  /* *INDENT-ON* */
148 }
149 
150 
151 /* List of message types that this plugin understands */
152 #define foreach_stn_plugin_api_msg \
153 _(STN_ADD_DEL_RULE, stn_add_del_rule) \
154 _(STN_RULES_DUMP, stn_rules_dump)
155 
156 /**
157  * @brief Set up the API message handling tables
158  * @param vm vlib_main_t * vlib main data structure pointer
159  * @returns 0 to indicate all is well
160  */
161 static clib_error_t *
163 {
164  stn_main_t *stn = &stn_main;
165 #define _(N,n) \
166  vl_msg_api_set_handlers((VL_API_##N + stn->msg_id_base), \
167  #n, \
168  vl_api_##n##_t_handler, \
169  vl_noop_handler, \
170  vl_api_##n##_t_endian, \
171  vl_api_##n##_t_print, \
172  sizeof(vl_api_##n##_t), 1);
174 #undef _
175 
176  return 0;
177 }
178 
179 #define vl_msg_name_crc_list
180 #include <stn/stn.api.h>
181 #undef vl_msg_name_crc_list
182 
183 static void
185 {
186 #define _(id,n,crc) \
187  vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + stn->msg_id_base);
188  foreach_vl_msg_name_crc_stn;
189 #undef _
190 }
191 
192 static void
194 {
195 #define _(n,f) api_main.msg_print_handlers \
196  [VL_API_##n + stn->msg_id_base] \
197  = (void *) vl_api_##f##_t_print;
199 #undef _
200 }
201 
202 clib_error_t *
204 {
205  u8 *name;
206  clib_error_t *error = 0;
207 
208  name = format (0, "stn_%08x%c", api_version, 0);
209 
210  /* Ask for a correctly-sized block of API message decode slots */
211  sm->msg_id_base =
213 
214  error = stn_plugin_api_hookup (vm);
215 
216  /* Add our API messages to the global name_crc hash table */
218 
220 
221  vec_free (name);
222 
223  return error;
224 }
u16 vl_msg_api_get_msg_ids(const char *name, int n)
Definition: api_shared.c:872
a
Definition: bitmap.h:516
static void setup_message_id_table(stn_main_t *stn, api_main_t *am)
Definition: stn_api.c:184
Definition: stn.h:24
Definition: stn.h:30
u32 sw_if_index
TX interface to send packets to.
Definition: stn.h:50
STN response to rules request.
Definition: stn.api:55
int stn_rule_add_del(stn_rule_add_del_args_t *args)
Add or delete an stn rule.
Definition: stn.c:332
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:419
stn_main_t stn_main
Definition: stn.c:25
Dump STN rules.
Definition: stn.api:44
ip46_address_t address
Destination address of intercepted packets.
Definition: stn.h:48
Add/del STN rules.
Definition: stn.api:31
stn_rule_t * rules
Definition: stn.h:32
format_function_t format_ip4_address
Definition: format.h:79
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
Definition: pool.h:438
u8 del
Whether to delete the rule.
Definition: stn.h:52
void * vl_msg_api_alloc(int nbytes)
static void vl_api_stn_add_del_rule_t_handler(vl_api_stn_add_del_rule_t *mp)
Definition: stn_api.c:80
static void vl_api_stn_rules_dump_t_handler(vl_api_stn_rules_dump_t *mp)
Definition: stn_api.c:131
#define REPLY_MACRO(t)
static void plugin_custom_dump_configure(stn_main_t *stn)
Definition: stn_api.c:193
API main structure, used by both vpp and binary API clients.
Definition: api_common.h:198
#define ip46_address_is_ip4(ip46)
Definition: ip6_packet.h:76
api_main_t api_main
Definition: api_shared.c:35
format_function_t format_ip6_address
Definition: format.h:95
vlib_main_t * vm
Definition: buffer.c:283
static void send_stn_rule(stn_rule_t *r, unix_shared_memory_queue_t *q, u32 context)
Definition: stn_api.c:104
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:336
#define clib_memcpy(a, b, c)
Definition: string.h:75
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
static void * vl_api_stn_add_del_rule_t_print(vl_api_stn_add_del_rule_t *mp, void *handle)
API message custom-dump function.
Definition: stn_api.c:65
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
unsigned int u32
Definition: types.h:88
#define ip46_address_set_ip4(ip46, ip)
Definition: ip6_packet.h:78
static clib_error_t * stn_plugin_api_hookup(vlib_main_t *vm)
Set up the API message handling tables.
Definition: stn_api.c:162
unsigned char u8
Definition: types.h:56
u16 msg_id_base
Definition: stn.h:43
u32 sw_if_index
Definition: stn.h:27
clib_error_t * stn_api_init(vlib_main_t *vm, stn_main_t *sm)
Definition: stn_api.c:203
#define FINISH
Definition: stn_api.c:52
ip46_address_t address
Definition: stn.h:25
#define foreach_stn_plugin_api_msg
Definition: stn_api.c:152
struct _unix_shared_memory_queue unix_shared_memory_queue_t