blob: 6f11083844bcbd487e4e718cf1b26e75eec9d325 [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 *------------------------------------------------------------------
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08003 * api_format.c
4 *
Alexander Popovsky (apopovsk)4a7e58b2016-10-05 22:31:23 -07005 * Copyright (c) 2014-2016 Cisco and/or its affiliates.
Ed Warnickecb9cada2015-12-08 15:45:58 -07006 * 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
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016 * limitations under the License.
Ed Warnickecb9cada2015-12-08 15:45:58 -070017 *------------------------------------------------------------------
18 */
19
20#include <vat/vat.h>
21#include <vlibapi/api.h>
22#include <vlibmemory/api.h>
23#include <vlibsocket/api.h>
24#include <vnet/ip/ip.h>
25#include <vnet/sr/sr_packet.h>
26#include <vnet/l2/l2_input.h>
27#include <vnet/l2tp/l2tp.h>
28#include <vnet/vxlan/vxlan.h>
Chris Luke27fe48f2016-04-28 13:44:38 -040029#include <vnet/gre/gre.h>
Keith Burns (alagalah)94b14422016-05-05 18:16:50 -070030#include <vnet/vxlan-gpe/vxlan_gpe.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070031#include <vnet/lisp-gpe/lisp_gpe.h>
32
Dave Barachaa6920e2016-06-27 09:25:13 -040033#include <vpp-api/vpe_msg_enum.h>
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080034#include <vnet/l2/l2_classify.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070035#include <vnet/l2/l2_vtr.h>
36#include <vnet/classify/input_acl.h>
Matus Fabian70e6a8d2016-06-20 08:10:42 -070037#include <vnet/classify/policer_classify.h>
Juraj Sloboda506b2452016-08-07 23:45:24 -070038#include <vnet/classify/flow_classify.h>
Neale Ranns0bfe5d82016-08-25 15:29:12 +010039#include <vnet/mpls/mpls.h>
Dave Barachbfdedbd2016-01-20 09:11:55 -050040#if DPDK > 0
Ed Warnickecb9cada2015-12-08 15:45:58 -070041#include <vnet/ipsec/ipsec.h>
Matus Fabiane5f42fe2016-04-08 11:18:08 +020042#include <vnet/ipsec/ikev2.h>
Dave Barachbfdedbd2016-01-20 09:11:55 -050043#else
44#include <inttypes.h>
45#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070046#include <vnet/map/map.h>
Dave Barachc07bf5d2016-02-17 17:52:26 -050047#include <vnet/cop/cop.h>
Shwetha20a64f52016-03-25 10:55:01 +000048#include <vnet/ip/ip6_hop_by_hop.h>
Dave Barach6f9bca22016-04-30 10:25:32 -040049#include <vnet/ip/ip_source_and_port_range_check.h>
Matus Fabian65fcd4d2016-05-13 05:44:48 -070050#include <vnet/policer/xlate.h>
Matus Fabian4ac74c92016-05-31 07:33:29 -070051#include <vnet/policer/policer.h>
Matus Fabian70e6a8d2016-06-20 08:10:42 -070052#include <vnet/policer/police.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070053
54#include "vat/json_format.h"
55
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +020056#include <sys/stat.h>
57
Dave Barach72d72232016-08-04 10:15:08 -040058#define vl_typedefs /* define message structures */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080059#include <vpp-api/vpe_all_api_h.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070060#undef vl_typedefs
61
62/* declare message handlers for each api */
63
Dave Barach72d72232016-08-04 10:15:08 -040064#define vl_endianfun /* define message structures */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080065#include <vpp-api/vpe_all_api_h.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070066#undef vl_endianfun
67
68/* instantiate all the print functions we know about */
69#define vl_print(handle, ...)
70#define vl_printfun
Dave Barachaa6920e2016-06-27 09:25:13 -040071#include <vpp-api/vpe_all_api_h.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070072#undef vl_printfun
73
Dave Barach72d72232016-08-04 10:15:08 -040074uword
75unformat_sw_if_index (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -070076{
Dave Barach72d72232016-08-04 10:15:08 -040077 vat_main_t *vam = va_arg (*args, vat_main_t *);
78 u32 *result = va_arg (*args, u32 *);
79 u8 *if_name;
80 uword *p;
Ed Warnickecb9cada2015-12-08 15:45:58 -070081
82 if (!unformat (input, "%s", &if_name))
Dave Barach72d72232016-08-04 10:15:08 -040083 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070084
85 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
86 if (p == 0)
Dave Barach72d72232016-08-04 10:15:08 -040087 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070088 *result = p[0];
89 return 1;
90}
91
92/* Parse an IP4 address %d.%d.%d.%d. */
Dave Barach72d72232016-08-04 10:15:08 -040093uword
94unformat_ip4_address (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -070095{
Dave Barach72d72232016-08-04 10:15:08 -040096 u8 *result = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070097 unsigned a[4];
98
Dave Barach72d72232016-08-04 10:15:08 -040099 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
Ed Warnickecb9cada2015-12-08 15:45:58 -0700100 return 0;
101
102 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
103 return 0;
104
105 result[0] = a[0];
106 result[1] = a[1];
107 result[2] = a[2];
108 result[3] = a[3];
109
110 return 1;
111}
112
113
114uword
115unformat_ethernet_address (unformat_input_t * input, va_list * args)
116{
Dave Barach72d72232016-08-04 10:15:08 -0400117 u8 *result = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700118 u32 i, a[6];
119
Dave Barach72d72232016-08-04 10:15:08 -0400120 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
121 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
Ed Warnickecb9cada2015-12-08 15:45:58 -0700122 return 0;
123
124 /* Check range. */
125 for (i = 0; i < 6; i++)
126 if (a[i] >= (1 << 8))
127 return 0;
128
129 for (i = 0; i < 6; i++)
130 result[i] = a[i];
131
132 return 1;
133}
134
135/* Returns ethernet type as an int in host byte order. */
136uword
137unformat_ethernet_type_host_byte_order (unformat_input_t * input,
138 va_list * args)
139{
Dave Barach72d72232016-08-04 10:15:08 -0400140 u16 *result = va_arg (*args, u16 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700141 int type;
142
143 /* Numeric type. */
Dave Barach72d72232016-08-04 10:15:08 -0400144 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
Ed Warnickecb9cada2015-12-08 15:45:58 -0700145 {
146 if (type >= (1 << 16))
147 return 0;
148 *result = type;
149 return 1;
150 }
151 return 0;
152}
153
154/* Parse an IP6 address. */
Dave Barach72d72232016-08-04 10:15:08 -0400155uword
156unformat_ip6_address (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700157{
Dave Barach72d72232016-08-04 10:15:08 -0400158 ip6_address_t *result = va_arg (*args, ip6_address_t *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700159 u16 hex_quads[8];
160 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
161 uword c, n_colon, double_colon_index;
162
163 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
164 double_colon_index = ARRAY_LEN (hex_quads);
165 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
166 {
167 hex_digit = 16;
168 if (c >= '0' && c <= '9')
169 hex_digit = c - '0';
170 else if (c >= 'a' && c <= 'f')
171 hex_digit = c + 10 - 'a';
172 else if (c >= 'A' && c <= 'F')
173 hex_digit = c + 10 - 'A';
174 else if (c == ':' && n_colon < 2)
175 n_colon++;
176 else
177 {
178 unformat_put_input (input);
179 break;
180 }
181
182 /* Too many hex quads. */
183 if (n_hex_quads >= ARRAY_LEN (hex_quads))
184 return 0;
185
186 if (hex_digit < 16)
187 {
188 hex_quad = (hex_quad << 4) | hex_digit;
189
190 /* Hex quad must fit in 16 bits. */
191 if (n_hex_digits >= 4)
192 return 0;
193
194 n_colon = 0;
195 n_hex_digits++;
196 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800197
Ed Warnickecb9cada2015-12-08 15:45:58 -0700198 /* Save position of :: */
199 if (n_colon == 2)
200 {
201 /* More than one :: ? */
202 if (double_colon_index < ARRAY_LEN (hex_quads))
203 return 0;
204 double_colon_index = n_hex_quads;
205 }
206
207 if (n_colon > 0 && n_hex_digits > 0)
208 {
209 hex_quads[n_hex_quads++] = hex_quad;
210 hex_quad = 0;
211 n_hex_digits = 0;
212 }
213 }
214
215 if (n_hex_digits > 0)
216 hex_quads[n_hex_quads++] = hex_quad;
217
218 {
219 word i;
220
221 /* Expand :: to appropriate number of zero hex quads. */
222 if (double_colon_index < ARRAY_LEN (hex_quads))
223 {
224 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
225
226 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
227 hex_quads[n_zero + i] = hex_quads[i];
228
229 for (i = 0; i < n_zero; i++)
230 hex_quads[double_colon_index + i] = 0;
231
232 n_hex_quads = ARRAY_LEN (hex_quads);
233 }
234
235 /* Too few hex quads given. */
236 if (n_hex_quads < ARRAY_LEN (hex_quads))
237 return 0;
238
239 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
240 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
241
242 return 1;
243 }
244}
245
246uword
247unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
248{
Dave Barachbfdedbd2016-01-20 09:11:55 -0500249#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -0400250 u32 *r = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700251
Dave Barach72d72232016-08-04 10:15:08 -0400252 if (0);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700253#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
254 foreach_ipsec_policy_action
255#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400256 else
Ed Warnickecb9cada2015-12-08 15:45:58 -0700257 return 0;
258 return 1;
Dave Barachbfdedbd2016-01-20 09:11:55 -0500259#else
260 return 0;
261#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -0700262}
263
264uword
265unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args)
266{
Dave Barachbfdedbd2016-01-20 09:11:55 -0500267#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -0400268 u32 *r = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700269
Dave Barach72d72232016-08-04 10:15:08 -0400270 if (0);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700271#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f;
272 foreach_ipsec_crypto_alg
273#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400274 else
Ed Warnickecb9cada2015-12-08 15:45:58 -0700275 return 0;
276 return 1;
Dave Barachbfdedbd2016-01-20 09:11:55 -0500277#else
278 return 0;
279#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -0700280}
281
282u8 *
283format_ipsec_crypto_alg (u8 * s, va_list * args)
284{
Dave Barachbfdedbd2016-01-20 09:11:55 -0500285#if DPDK > 0
Ed Warnickecb9cada2015-12-08 15:45:58 -0700286 u32 i = va_arg (*args, u32);
Dave Barach72d72232016-08-04 10:15:08 -0400287 u8 *t = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700288
289 switch (i)
290 {
291#define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
Dave Barach72d72232016-08-04 10:15:08 -0400292 foreach_ipsec_crypto_alg
Ed Warnickecb9cada2015-12-08 15:45:58 -0700293#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400294 default:
295 return format (s, "unknown");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700296 }
297 return format (s, "%s", t);
Dave Barachbfdedbd2016-01-20 09:11:55 -0500298#else
299 return format (s, "Unimplemented");
300#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -0700301}
302
303uword
304unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args)
305{
Dave Barachbfdedbd2016-01-20 09:11:55 -0500306#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -0400307 u32 *r = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700308
Dave Barach72d72232016-08-04 10:15:08 -0400309 if (0);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700310#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f;
311 foreach_ipsec_integ_alg
312#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400313 else
Ed Warnickecb9cada2015-12-08 15:45:58 -0700314 return 0;
315 return 1;
Dave Barachbfdedbd2016-01-20 09:11:55 -0500316#else
317 return 0;
318#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -0700319}
320
321u8 *
322format_ipsec_integ_alg (u8 * s, va_list * args)
323{
Dave Barachbfdedbd2016-01-20 09:11:55 -0500324#if DPDK > 0
Ed Warnickecb9cada2015-12-08 15:45:58 -0700325 u32 i = va_arg (*args, u32);
Dave Barach72d72232016-08-04 10:15:08 -0400326 u8 *t = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700327
328 switch (i)
329 {
330#define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
Dave Barach72d72232016-08-04 10:15:08 -0400331 foreach_ipsec_integ_alg
Ed Warnickecb9cada2015-12-08 15:45:58 -0700332#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400333 default:
334 return format (s, "unknown");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700335 }
336 return format (s, "%s", t);
Dave Barachbfdedbd2016-01-20 09:11:55 -0500337#else
338 return format (s, "Unsupported");
339#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -0700340}
341
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200342uword
343unformat_ikev2_auth_method (unformat_input_t * input, va_list * args)
344{
345#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -0400346 u32 *r = va_arg (*args, u32 *);
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200347
Dave Barach72d72232016-08-04 10:15:08 -0400348 if (0);
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200349#define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f;
350 foreach_ikev2_auth_method
351#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400352 else
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200353 return 0;
354 return 1;
355#else
356 return 0;
357#endif
358}
359
360uword
361unformat_ikev2_id_type (unformat_input_t * input, va_list * args)
362{
363#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -0400364 u32 *r = va_arg (*args, u32 *);
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200365
Dave Barach72d72232016-08-04 10:15:08 -0400366 if (0);
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200367#define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f;
368 foreach_ikev2_id_type
369#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400370 else
Matus Fabiane5f42fe2016-04-08 11:18:08 +0200371 return 0;
372 return 1;
373#else
374 return 0;
375#endif
376}
377
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700378uword
379unformat_policer_rate_type (unformat_input_t * input, va_list * args)
380{
Dave Barach72d72232016-08-04 10:15:08 -0400381 u8 *r = va_arg (*args, u8 *);
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700382
383 if (unformat (input, "kbps"))
384 *r = SSE2_QOS_RATE_KBPS;
Dave Barach72d72232016-08-04 10:15:08 -0400385 else if (unformat (input, "pps"))
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700386 *r = SSE2_QOS_RATE_PPS;
387 else
388 return 0;
389 return 1;
390}
391
392uword
393unformat_policer_round_type (unformat_input_t * input, va_list * args)
394{
Dave Barach72d72232016-08-04 10:15:08 -0400395 u8 *r = va_arg (*args, u8 *);
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700396
Dave Barach72d72232016-08-04 10:15:08 -0400397 if (unformat (input, "closest"))
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700398 *r = SSE2_QOS_ROUND_TO_CLOSEST;
399 else if (unformat (input, "up"))
400 *r = SSE2_QOS_ROUND_TO_UP;
401 else if (unformat (input, "down"))
402 *r = SSE2_QOS_ROUND_TO_DOWN;
403 else
404 return 0;
405 return 1;
406}
407
408uword
409unformat_policer_type (unformat_input_t * input, va_list * args)
410{
Dave Barach72d72232016-08-04 10:15:08 -0400411 u8 *r = va_arg (*args, u8 *);
Matus Fabian65fcd4d2016-05-13 05:44:48 -0700412
413 if (unformat (input, "1r2c"))
414 *r = SSE2_QOS_POLICER_TYPE_1R2C;
415 else if (unformat (input, "1r3c"))
416 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
417 else if (unformat (input, "2r3c-2698"))
418 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
419 else if (unformat (input, "2r3c-4115"))
420 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
421 else if (unformat (input, "2r3c-mef5cf1"))
422 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
423 else
424 return 0;
425 return 1;
426}
427
Matus Fabian4ac74c92016-05-31 07:33:29 -0700428uword
429unformat_dscp (unformat_input_t * input, va_list * va)
430{
Dave Barach72d72232016-08-04 10:15:08 -0400431 u8 *r = va_arg (*va, u8 *);
Matus Fabian4ac74c92016-05-31 07:33:29 -0700432
Dave Barach72d72232016-08-04 10:15:08 -0400433 if (0);
Matus Fabian4ac74c92016-05-31 07:33:29 -0700434#define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
Dave Barach72d72232016-08-04 10:15:08 -0400435 foreach_vnet_dscp
Matus Fabian4ac74c92016-05-31 07:33:29 -0700436#undef _
Dave Barach72d72232016-08-04 10:15:08 -0400437 else
Matus Fabian4ac74c92016-05-31 07:33:29 -0700438 return 0;
439 return 1;
440}
441
442uword
443unformat_policer_action_type (unformat_input_t * input, va_list * va)
444{
Dave Barach72d72232016-08-04 10:15:08 -0400445 sse2_qos_pol_action_params_st *a
Matus Fabian4ac74c92016-05-31 07:33:29 -0700446 = va_arg (*va, sse2_qos_pol_action_params_st *);
447
448 if (unformat (input, "drop"))
449 a->action_type = SSE2_QOS_ACTION_DROP;
450 else if (unformat (input, "transmit"))
451 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
452 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
453 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
454 else
455 return 0;
456 return 1;
457}
458
Matus Fabian70e6a8d2016-06-20 08:10:42 -0700459uword
Juraj Sloboda506b2452016-08-07 23:45:24 -0700460unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
Matus Fabian70e6a8d2016-06-20 08:10:42 -0700461{
Dave Barach72d72232016-08-04 10:15:08 -0400462 u32 *r = va_arg (*va, u32 *);
Matus Fabian70e6a8d2016-06-20 08:10:42 -0700463 u32 tid;
464
465 if (unformat (input, "ip4"))
466 tid = POLICER_CLASSIFY_TABLE_IP4;
467 else if (unformat (input, "ip6"))
468 tid = POLICER_CLASSIFY_TABLE_IP6;
469 else if (unformat (input, "l2"))
470 tid = POLICER_CLASSIFY_TABLE_L2;
471 else
472 return 0;
473
474 *r = tid;
475 return 1;
476}
477
Juraj Sloboda506b2452016-08-07 23:45:24 -0700478uword
479unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
480{
481 u32 *r = va_arg (*va, u32 *);
482 u32 tid;
483
484 if (unformat (input, "ip4"))
485 tid = FLOW_CLASSIFY_TABLE_IP4;
486 else if (unformat (input, "ip6"))
487 tid = FLOW_CLASSIFY_TABLE_IP6;
488 else
489 return 0;
490
491 *r = tid;
492 return 1;
493}
494
Dave Barach72d72232016-08-04 10:15:08 -0400495u8 *
496format_ip4_address (u8 * s, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700497{
Dave Barach72d72232016-08-04 10:15:08 -0400498 u8 *a = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700499 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
500}
501
Dave Barach72d72232016-08-04 10:15:08 -0400502u8 *
503format_ip6_address (u8 * s, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700504{
Dave Barach72d72232016-08-04 10:15:08 -0400505 ip6_address_t *a = va_arg (*args, ip6_address_t *);
506 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700507
Dave Barach72d72232016-08-04 10:15:08 -0400508 i_max_n_zero = ARRAY_LEN (a->as_u16);
509 max_n_zeros = 0;
510 i_first_zero = i_max_n_zero;
511 n_zeros = 0;
512 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
513 {
514 u32 is_zero = a->as_u16[i] == 0;
515 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
516 {
517 i_first_zero = i;
518 n_zeros = 0;
519 }
520 n_zeros += is_zero;
521 if ((!is_zero && n_zeros > max_n_zeros)
522 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
523 {
524 i_max_n_zero = i_first_zero;
525 max_n_zeros = n_zeros;
526 i_first_zero = ARRAY_LEN (a->as_u16);
527 n_zeros = 0;
528 }
529 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700530
Dave Barach72d72232016-08-04 10:15:08 -0400531 last_double_colon = 0;
532 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
533 {
534 if (i == i_max_n_zero && max_n_zeros > 1)
535 {
536 s = format (s, "::");
537 i += max_n_zeros - 1;
538 last_double_colon = 1;
539 }
540 else
541 {
542 s = format (s, "%s%x",
543 (last_double_colon || i == 0) ? "" : ":",
544 clib_net_to_host_u16 (a->as_u16[i]));
545 last_double_colon = 0;
546 }
547 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700548
Dave Barach72d72232016-08-04 10:15:08 -0400549 return s;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700550}
551
Chris Luke99cb3352016-04-26 10:49:53 -0400552/* Format an IP46 address. */
Dave Barach72d72232016-08-04 10:15:08 -0400553u8 *
554format_ip46_address (u8 * s, va_list * args)
Chris Luke99cb3352016-04-26 10:49:53 -0400555{
556 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
Damjan Marion86be4872016-05-24 23:19:11 +0200557 ip46_type_t type = va_arg (*args, ip46_type_t);
558 int is_ip4 = 1;
559
560 switch (type)
561 {
Dave Barach72d72232016-08-04 10:15:08 -0400562 case IP46_TYPE_ANY:
563 is_ip4 = ip46_address_is_ip4 (ip46);
564 break;
565 case IP46_TYPE_IP4:
566 is_ip4 = 1;
567 break;
568 case IP46_TYPE_IP6:
569 is_ip4 = 0;
570 break;
Damjan Marion86be4872016-05-24 23:19:11 +0200571 }
572
573 return is_ip4 ?
Dave Barach72d72232016-08-04 10:15:08 -0400574 format (s, "%U", format_ip4_address, &ip46->ip4) :
575 format (s, "%U", format_ip6_address, &ip46->ip6);
Chris Luke99cb3352016-04-26 10:49:53 -0400576}
577
Dave Barach72d72232016-08-04 10:15:08 -0400578u8 *
579format_ethernet_address (u8 * s, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700580{
Dave Barach72d72232016-08-04 10:15:08 -0400581 u8 *a = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700582
583 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
Dave Barach72d72232016-08-04 10:15:08 -0400584 a[0], a[1], a[2], a[3], a[4], a[5]);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700585}
586
Dave Barach72d72232016-08-04 10:15:08 -0400587void
588increment_v4_address (ip4_address_t * a)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700589{
Dave Barach72d72232016-08-04 10:15:08 -0400590 u32 v;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700591
Dave Barach72d72232016-08-04 10:15:08 -0400592 v = ntohl (a->as_u32) + 1;
593 a->as_u32 = ntohl (v);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700594}
595
Dave Barach72d72232016-08-04 10:15:08 -0400596void
597increment_v6_address (ip6_address_t * a)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700598{
Dave Barach72d72232016-08-04 10:15:08 -0400599 u64 v0, v1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700600
Dave Barach72d72232016-08-04 10:15:08 -0400601 v0 = clib_net_to_host_u64 (a->as_u64[0]);
602 v1 = clib_net_to_host_u64 (a->as_u64[1]);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700603
Dave Barach72d72232016-08-04 10:15:08 -0400604 v1 += 1;
605 if (v1 == 0)
606 v0 += 1;
607 a->as_u64[0] = clib_net_to_host_u64 (v0);
608 a->as_u64[1] = clib_net_to_host_u64 (v1);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700609}
610
Dave Barach72d72232016-08-04 10:15:08 -0400611void
612increment_mac_address (u64 * mac)
Dave Barach41da02d2016-07-11 16:48:42 -0700613{
Dave Barach72d72232016-08-04 10:15:08 -0400614 u64 tmp = *mac;
Dave Barach41da02d2016-07-11 16:48:42 -0700615
Dave Barach72d72232016-08-04 10:15:08 -0400616 tmp = clib_net_to_host_u64 (tmp);
617 tmp += 1 << 16; /* skip unused (least significant) octets */
618 tmp = clib_host_to_net_u64 (tmp);
619 *mac = tmp;
Dave Barach41da02d2016-07-11 16:48:42 -0700620}
Ed Warnickecb9cada2015-12-08 15:45:58 -0700621
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800622static void vl_api_create_loopback_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400623 (vl_api_create_loopback_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700624{
Dave Barach72d72232016-08-04 10:15:08 -0400625 vat_main_t *vam = &vat_main;
626 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700627
Dave Barach72d72232016-08-04 10:15:08 -0400628 vam->retval = retval;
629 vam->regenerate_interface_table = 1;
630 vam->sw_if_index = ntohl (mp->sw_if_index);
631 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700632}
633
634static void vl_api_create_loopback_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400635 (vl_api_create_loopback_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700636{
Dave Barach72d72232016-08-04 10:15:08 -0400637 vat_main_t *vam = &vat_main;
638 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700639
Dave Barach72d72232016-08-04 10:15:08 -0400640 vat_json_init_object (&node);
641 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
642 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700643
Dave Barach72d72232016-08-04 10:15:08 -0400644 vat_json_print (vam->ofp, &node);
645 vat_json_free (&node);
646 vam->retval = ntohl (mp->retval);
647 vam->result_ready = 1;
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700648}
649
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800650static void vl_api_af_packet_create_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400651 (vl_api_af_packet_create_reply_t * mp)
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700652{
Dave Barach72d72232016-08-04 10:15:08 -0400653 vat_main_t *vam = &vat_main;
654 i32 retval = ntohl (mp->retval);
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700655
Dave Barach72d72232016-08-04 10:15:08 -0400656 vam->retval = retval;
657 vam->regenerate_interface_table = 1;
658 vam->sw_if_index = ntohl (mp->sw_if_index);
659 vam->result_ready = 1;
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700660}
661
662static void vl_api_af_packet_create_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400663 (vl_api_af_packet_create_reply_t * mp)
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700664{
Dave Barach72d72232016-08-04 10:15:08 -0400665 vat_main_t *vam = &vat_main;
666 vat_json_node_t node;
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700667
Dave Barach72d72232016-08-04 10:15:08 -0400668 vat_json_init_object (&node);
669 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
670 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -0700671
Dave Barach72d72232016-08-04 10:15:08 -0400672 vat_json_print (vam->ofp, &node);
673 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700674
Dave Barach72d72232016-08-04 10:15:08 -0400675 vam->retval = ntohl (mp->retval);
676 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700677}
678
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800679static void vl_api_create_vlan_subif_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400680 (vl_api_create_vlan_subif_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700681{
Dave Barach72d72232016-08-04 10:15:08 -0400682 vat_main_t *vam = &vat_main;
683 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700684
Dave Barach72d72232016-08-04 10:15:08 -0400685 vam->retval = retval;
686 vam->regenerate_interface_table = 1;
687 vam->sw_if_index = ntohl (mp->sw_if_index);
688 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700689}
690
691static void vl_api_create_vlan_subif_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400692 (vl_api_create_vlan_subif_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700693{
Dave Barach72d72232016-08-04 10:15:08 -0400694 vat_main_t *vam = &vat_main;
695 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700696
Dave Barach72d72232016-08-04 10:15:08 -0400697 vat_json_init_object (&node);
698 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
699 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700700
Dave Barach72d72232016-08-04 10:15:08 -0400701 vat_json_print (vam->ofp, &node);
702 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700703
Dave Barach72d72232016-08-04 10:15:08 -0400704 vam->retval = ntohl (mp->retval);
705 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700706}
707
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800708static void vl_api_create_subif_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400709 (vl_api_create_subif_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700710{
Dave Barach72d72232016-08-04 10:15:08 -0400711 vat_main_t *vam = &vat_main;
712 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700713
Dave Barach72d72232016-08-04 10:15:08 -0400714 vam->retval = retval;
715 vam->regenerate_interface_table = 1;
716 vam->sw_if_index = ntohl (mp->sw_if_index);
717 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700718}
719
720static void vl_api_create_subif_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400721 (vl_api_create_subif_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700722{
Dave Barach72d72232016-08-04 10:15:08 -0400723 vat_main_t *vam = &vat_main;
724 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700725
Dave Barach72d72232016-08-04 10:15:08 -0400726 vat_json_init_object (&node);
727 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
728 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700729
Dave Barach72d72232016-08-04 10:15:08 -0400730 vat_json_print (vam->ofp, &node);
731 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700732
Dave Barach72d72232016-08-04 10:15:08 -0400733 vam->retval = ntohl (mp->retval);
734 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700735}
736
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800737static void vl_api_interface_name_renumber_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400738 (vl_api_interface_name_renumber_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700739{
Dave Barach72d72232016-08-04 10:15:08 -0400740 vat_main_t *vam = &vat_main;
741 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700742
Dave Barach72d72232016-08-04 10:15:08 -0400743 vam->retval = retval;
744 vam->regenerate_interface_table = 1;
745 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700746}
747
748static void vl_api_interface_name_renumber_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400749 (vl_api_interface_name_renumber_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700750{
Dave Barach72d72232016-08-04 10:15:08 -0400751 vat_main_t *vam = &vat_main;
752 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700753
Dave Barach72d72232016-08-04 10:15:08 -0400754 vat_json_init_object (&node);
755 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700756
Dave Barach72d72232016-08-04 10:15:08 -0400757 vat_json_print (vam->ofp, &node);
758 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700759
Dave Barach72d72232016-08-04 10:15:08 -0400760 vam->retval = ntohl (mp->retval);
761 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700762}
763
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800764/*
Ed Warnickecb9cada2015-12-08 15:45:58 -0700765 * Special-case: build the interface table, maintain
766 * the next loopback sw_if_index vbl.
767 */
768static void vl_api_sw_interface_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400769 (vl_api_sw_interface_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700770{
Dave Barach72d72232016-08-04 10:15:08 -0400771 vat_main_t *vam = &vat_main;
772 u8 *s = format (0, "%s%c", mp->interface_name, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700773
Dave Barach72d72232016-08-04 10:15:08 -0400774 hash_set_mem (vam->sw_if_index_by_interface_name, s,
775 ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700776
Dave Barach72d72232016-08-04 10:15:08 -0400777 /* In sub interface case, fill the sub interface table entry */
778 if (mp->sw_if_index != mp->sup_sw_if_index)
779 {
780 sw_interface_subif_t *sub = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700781
Dave Barach72d72232016-08-04 10:15:08 -0400782 vec_add2 (vam->sw_if_subif_table, sub, 1);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700783
Dave Barach72d72232016-08-04 10:15:08 -0400784 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
785 strncpy ((char *) sub->interface_name, (char *) s,
786 vec_len (sub->interface_name));
787 sub->sw_if_index = ntohl (mp->sw_if_index);
788 sub->sub_id = ntohl (mp->sub_id);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700789
Dave Barach72d72232016-08-04 10:15:08 -0400790 sub->sub_dot1ad = mp->sub_dot1ad;
791 sub->sub_number_of_tags = mp->sub_number_of_tags;
792 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
793 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
794 sub->sub_exact_match = mp->sub_exact_match;
795 sub->sub_default = mp->sub_default;
796 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
797 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700798
Dave Barach72d72232016-08-04 10:15:08 -0400799 /* vlan tag rewrite */
800 sub->vtr_op = ntohl (mp->vtr_op);
801 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
802 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
803 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700804 }
805}
806
807static void vl_api_sw_interface_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400808 (vl_api_sw_interface_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700809{
Dave Barach72d72232016-08-04 10:15:08 -0400810 vat_main_t *vam = &vat_main;
811 vat_json_node_t *node = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700812
Dave Barach72d72232016-08-04 10:15:08 -0400813 if (VAT_JSON_ARRAY != vam->json_tree.type)
814 {
815 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
816 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700817 }
Dave Barach72d72232016-08-04 10:15:08 -0400818 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700819
Dave Barach72d72232016-08-04 10:15:08 -0400820 vat_json_init_object (node);
821 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
822 vat_json_object_add_uint (node, "sup_sw_if_index",
823 ntohl (mp->sup_sw_if_index));
824 vat_json_object_add_uint (node, "l2_address_length",
825 ntohl (mp->l2_address_length));
826 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
827 sizeof (mp->l2_address));
828 vat_json_object_add_string_copy (node, "interface_name",
829 mp->interface_name);
830 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
831 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
832 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
833 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
834 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
835 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
836 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
837 vat_json_object_add_uint (node, "sub_number_of_tags",
838 mp->sub_number_of_tags);
839 vat_json_object_add_uint (node, "sub_outer_vlan_id",
840 ntohs (mp->sub_outer_vlan_id));
841 vat_json_object_add_uint (node, "sub_inner_vlan_id",
842 ntohs (mp->sub_inner_vlan_id));
843 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
844 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
845 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
846 mp->sub_outer_vlan_id_any);
847 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
848 mp->sub_inner_vlan_id_any);
849 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
850 vat_json_object_add_uint (node, "vtr_push_dot1q",
851 ntohl (mp->vtr_push_dot1q));
852 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
853 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700854}
855
856static void vl_api_sw_interface_set_flags_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400857 (vl_api_sw_interface_set_flags_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700858{
Dave Barach72d72232016-08-04 10:15:08 -0400859 vat_main_t *vam = &vat_main;
860 if (vam->interface_event_display)
861 errmsg ("interface flags: sw_if_index %d %s %s\n",
862 ntohl (mp->sw_if_index),
863 mp->admin_up_down ? "admin-up" : "admin-down",
864 mp->link_up_down ? "link-up" : "link-down");
Ed Warnickecb9cada2015-12-08 15:45:58 -0700865}
866
867static void vl_api_sw_interface_set_flags_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400868 (vl_api_sw_interface_set_flags_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700869{
Dave Barach72d72232016-08-04 10:15:08 -0400870 /* JSON output not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700871}
872
Dave Barach72d72232016-08-04 10:15:08 -0400873static void
874vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700875{
Dave Barach72d72232016-08-04 10:15:08 -0400876 vat_main_t *vam = &vat_main;
877 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700878
Dave Barach72d72232016-08-04 10:15:08 -0400879 vam->retval = retval;
880 vam->shmem_result = (u8 *) mp->reply_in_shmem;
881 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700882}
883
Dave Barach72d72232016-08-04 10:15:08 -0400884static void
885vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700886{
Dave Barach72d72232016-08-04 10:15:08 -0400887 vat_main_t *vam = &vat_main;
888 vat_json_node_t node;
889 api_main_t *am = &api_main;
890 void *oldheap;
891 u8 *reply;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700892
Dave Barach72d72232016-08-04 10:15:08 -0400893 vat_json_init_object (&node);
894 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
895 vat_json_object_add_uint (&node, "reply_in_shmem",
896 ntohl (mp->reply_in_shmem));
897 /* Toss the shared-memory original... */
898 pthread_mutex_lock (&am->vlib_rp->mutex);
899 oldheap = svm_push_data_heap (am->vlib_rp);
Dave Barachb44e9bc2016-02-19 09:06:23 -0500900
Dave Barach72d72232016-08-04 10:15:08 -0400901 reply = (u8 *) (mp->reply_in_shmem);
902 vec_free (reply);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +0800903
Dave Barach72d72232016-08-04 10:15:08 -0400904 svm_pop_heap (oldheap);
905 pthread_mutex_unlock (&am->vlib_rp->mutex);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700906
Dave Barach72d72232016-08-04 10:15:08 -0400907 vat_json_print (vam->ofp, &node);
908 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700909
Dave Barach72d72232016-08-04 10:15:08 -0400910 vam->retval = ntohl (mp->retval);
911 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700912}
913
Ole Troanc27213a2016-08-31 14:50:49 +0200914static void
915vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
916{
917 vat_main_t *vam = &vat_main;
918 i32 retval = ntohl (mp->retval);
919
920 vam->retval = retval;
921 vam->cmd_reply = mp->reply;
922 vam->result_ready = 1;
923}
924
925static void
926vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
927{
928 vat_main_t *vam = &vat_main;
929 vat_json_node_t node;
930
931 vat_json_init_object (&node);
932 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
933 vat_json_object_add_string_copy (&node, "reply", mp->reply);
934
935 vat_json_print (vam->ofp, &node);
936 vat_json_free (&node);
937
938 vam->retval = ntohl (mp->retval);
939 vam->result_ready = 1;
940}
941
Ed Warnickecb9cada2015-12-08 15:45:58 -0700942static void vl_api_classify_add_del_table_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400943 (vl_api_classify_add_del_table_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700944{
Dave Barach72d72232016-08-04 10:15:08 -0400945 vat_main_t *vam = &vat_main;
946 i32 retval = ntohl (mp->retval);
947 if (vam->async_mode)
948 {
949 vam->async_errors += (retval < 0);
950 }
951 else
952 {
953 vam->retval = retval;
954 if (retval == 0 &&
955 ((mp->new_table_index != 0xFFFFFFFF) ||
956 (mp->skip_n_vectors != 0xFFFFFFFF) ||
957 (mp->match_n_vectors != 0xFFFFFFFF)))
958 /*
959 * Note: this is just barely thread-safe, depends on
960 * the main thread spinning waiting for an answer...
961 */
962 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d\n",
963 ntohl (mp->new_table_index),
964 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
965 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700966 }
967}
968
969static void vl_api_classify_add_del_table_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -0400970 (vl_api_classify_add_del_table_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700971{
Dave Barach72d72232016-08-04 10:15:08 -0400972 vat_main_t *vam = &vat_main;
973 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700974
Dave Barach72d72232016-08-04 10:15:08 -0400975 vat_json_init_object (&node);
976 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
977 vat_json_object_add_uint (&node, "new_table_index",
978 ntohl (mp->new_table_index));
979 vat_json_object_add_uint (&node, "skip_n_vectors",
980 ntohl (mp->skip_n_vectors));
981 vat_json_object_add_uint (&node, "match_n_vectors",
982 ntohl (mp->match_n_vectors));
Ed Warnickecb9cada2015-12-08 15:45:58 -0700983
Dave Barach72d72232016-08-04 10:15:08 -0400984 vat_json_print (vam->ofp, &node);
985 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700986
Dave Barach72d72232016-08-04 10:15:08 -0400987 vam->retval = ntohl (mp->retval);
988 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700989}
990
991static void vl_api_get_node_index_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -0400992 (vl_api_get_node_index_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700993{
Dave Barach72d72232016-08-04 10:15:08 -0400994 vat_main_t *vam = &vat_main;
995 i32 retval = ntohl (mp->retval);
996 if (vam->async_mode)
997 {
998 vam->async_errors += (retval < 0);
999 }
1000 else
1001 {
1002 vam->retval = retval;
1003 if (retval == 0)
1004 errmsg ("node index %d\n", ntohl (mp->node_index));
1005 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001006 }
1007}
1008
1009static void vl_api_get_node_index_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001010 (vl_api_get_node_index_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001011{
Dave Barach72d72232016-08-04 10:15:08 -04001012 vat_main_t *vam = &vat_main;
1013 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001014
Dave Barach72d72232016-08-04 10:15:08 -04001015 vat_json_init_object (&node);
1016 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1017 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001018
Dave Barach72d72232016-08-04 10:15:08 -04001019 vat_json_print (vam->ofp, &node);
1020 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001021
Dave Barach72d72232016-08-04 10:15:08 -04001022 vam->retval = ntohl (mp->retval);
1023 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001024}
1025
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001026static void vl_api_get_next_index_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001027 (vl_api_get_next_index_reply_t * mp)
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001028{
Dave Barach72d72232016-08-04 10:15:08 -04001029 vat_main_t *vam = &vat_main;
1030 i32 retval = ntohl (mp->retval);
1031 if (vam->async_mode)
1032 {
1033 vam->async_errors += (retval < 0);
1034 }
1035 else
1036 {
1037 vam->retval = retval;
1038 if (retval == 0)
1039 errmsg ("next node index %d\n", ntohl (mp->next_index));
1040 vam->result_ready = 1;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001041 }
1042}
1043
1044static void vl_api_get_next_index_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001045 (vl_api_get_next_index_reply_t * mp)
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001046{
Dave Barach72d72232016-08-04 10:15:08 -04001047 vat_main_t *vam = &vat_main;
1048 vat_json_node_t node;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001049
Dave Barach72d72232016-08-04 10:15:08 -04001050 vat_json_init_object (&node);
1051 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1052 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001053
Dave Barach72d72232016-08-04 10:15:08 -04001054 vat_json_print (vam->ofp, &node);
1055 vat_json_free (&node);
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001056
Dave Barach72d72232016-08-04 10:15:08 -04001057 vam->retval = ntohl (mp->retval);
1058 vam->result_ready = 1;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07001059}
1060
Ed Warnickecb9cada2015-12-08 15:45:58 -07001061static void vl_api_add_node_next_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001062 (vl_api_add_node_next_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001063{
Dave Barach72d72232016-08-04 10:15:08 -04001064 vat_main_t *vam = &vat_main;
1065 i32 retval = ntohl (mp->retval);
1066 if (vam->async_mode)
1067 {
1068 vam->async_errors += (retval < 0);
1069 }
1070 else
1071 {
1072 vam->retval = retval;
1073 if (retval == 0)
1074 errmsg ("next index %d\n", ntohl (mp->next_index));
1075 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001076 }
1077}
1078
1079static void vl_api_add_node_next_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001080 (vl_api_add_node_next_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001081{
Dave Barach72d72232016-08-04 10:15:08 -04001082 vat_main_t *vam = &vat_main;
1083 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001084
Dave Barach72d72232016-08-04 10:15:08 -04001085 vat_json_init_object (&node);
1086 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1087 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001088
Dave Barach72d72232016-08-04 10:15:08 -04001089 vat_json_print (vam->ofp, &node);
1090 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001091
Dave Barach72d72232016-08-04 10:15:08 -04001092 vam->retval = ntohl (mp->retval);
1093 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001094}
1095
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001096static void vl_api_show_version_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001097 (vl_api_show_version_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001098{
Dave Barach72d72232016-08-04 10:15:08 -04001099 vat_main_t *vam = &vat_main;
1100 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001101
Dave Barach72d72232016-08-04 10:15:08 -04001102 if (retval >= 0)
1103 {
1104 errmsg (" program: %s\n", mp->program);
1105 errmsg (" version: %s\n", mp->version);
1106 errmsg (" build date: %s\n", mp->build_date);
1107 errmsg ("build directory: %s\n", mp->build_directory);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001108 }
Dave Barach72d72232016-08-04 10:15:08 -04001109 vam->retval = retval;
1110 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001111}
1112
1113static void vl_api_show_version_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001114 (vl_api_show_version_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001115{
Dave Barach72d72232016-08-04 10:15:08 -04001116 vat_main_t *vam = &vat_main;
1117 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001118
Dave Barach72d72232016-08-04 10:15:08 -04001119 vat_json_init_object (&node);
1120 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1121 vat_json_object_add_string_copy (&node, "program", mp->program);
1122 vat_json_object_add_string_copy (&node, "version", mp->version);
1123 vat_json_object_add_string_copy (&node, "build_date", mp->build_date);
1124 vat_json_object_add_string_copy (&node, "build_directory",
1125 mp->build_directory);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001126
Dave Barach72d72232016-08-04 10:15:08 -04001127 vat_json_print (vam->ofp, &node);
1128 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001129
Dave Barach72d72232016-08-04 10:15:08 -04001130 vam->retval = ntohl (mp->retval);
1131 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001132}
1133
Dave Barach72d72232016-08-04 10:15:08 -04001134static void
1135vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001136{
Dave Barach72d72232016-08-04 10:15:08 -04001137 vat_main_t *vam = &vat_main;
John Loe016b5e2016-09-02 00:13:41 -04001138 errmsg ("arp %s event: address %U new mac %U sw_if_index %d\n",
1139 mp->mac_ip ? "mac/ip binding" : "address resolution",
Dave Barach72d72232016-08-04 10:15:08 -04001140 format_ip4_address, &mp->address,
1141 format_ethernet_address, mp->new_mac, mp->sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001142}
1143
Dave Barach72d72232016-08-04 10:15:08 -04001144static void
1145vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001146{
Dave Barach72d72232016-08-04 10:15:08 -04001147 /* JSON output not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -07001148}
1149
John Lo1edfba92016-08-27 01:11:57 -04001150static void
1151vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1152{
1153 vat_main_t *vam = &vat_main;
John Loe016b5e2016-09-02 00:13:41 -04001154 errmsg ("ip6 nd %s event: address %U new mac %U sw_if_index %d\n",
1155 mp->mac_ip ? "mac/ip binding" : "address resolution",
John Lo1edfba92016-08-27 01:11:57 -04001156 format_ip6_address, mp->address,
1157 format_ethernet_address, mp->new_mac, mp->sw_if_index);
1158}
1159
1160static void
1161vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1162{
1163 /* JSON output not supported */
1164}
1165
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001166/*
Ed Warnickecb9cada2015-12-08 15:45:58 -07001167 * Special-case: build the bridge domain table, maintain
1168 * the next bd id vbl.
1169 */
1170static void vl_api_bridge_domain_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001171 (vl_api_bridge_domain_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001172{
Dave Barach72d72232016-08-04 10:15:08 -04001173 vat_main_t *vam = &vat_main;
1174 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001175
Dave Barach72d72232016-08-04 10:15:08 -04001176 fformat (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-3s\n",
1177 " ID", "LRN", "FWD", "FLD", "BVI", "#IF");
Ed Warnickecb9cada2015-12-08 15:45:58 -07001178
Dave Barach72d72232016-08-04 10:15:08 -04001179 fformat (vam->ofp, "%3d %3d %3d %3d %3d %3d\n",
1180 ntohl (mp->bd_id), mp->learn, mp->forward,
1181 mp->flood, ntohl (mp->bvi_sw_if_index), n_sw_ifs);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001182
Dave Barach72d72232016-08-04 10:15:08 -04001183 if (n_sw_ifs)
1184 fformat (vam->ofp, "\n\n%s %s %s\n", "sw_if_index", "SHG",
1185 "Interface Name");
Ed Warnickecb9cada2015-12-08 15:45:58 -07001186}
1187
1188static void vl_api_bridge_domain_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001189 (vl_api_bridge_domain_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001190{
Dave Barach72d72232016-08-04 10:15:08 -04001191 vat_main_t *vam = &vat_main;
1192 vat_json_node_t *node, *array = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001193
Dave Barach72d72232016-08-04 10:15:08 -04001194 if (VAT_JSON_ARRAY != vam->json_tree.type)
1195 {
1196 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1197 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001198 }
Dave Barach72d72232016-08-04 10:15:08 -04001199 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001200
Dave Barach72d72232016-08-04 10:15:08 -04001201 vat_json_init_object (node);
1202 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1203 vat_json_object_add_uint (node, "flood", mp->flood);
1204 vat_json_object_add_uint (node, "forward", mp->forward);
1205 vat_json_object_add_uint (node, "learn", mp->learn);
1206 vat_json_object_add_uint (node, "bvi_sw_if_index",
1207 ntohl (mp->bvi_sw_if_index));
1208 vat_json_object_add_uint (node, "n_sw_ifs", ntohl (mp->n_sw_ifs));
1209 array = vat_json_object_add (node, "sw_if");
1210 vat_json_init_array (array);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001211}
1212
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001213/*
Ed Warnickecb9cada2015-12-08 15:45:58 -07001214 * Special-case: build the bridge domain sw if table.
1215 */
1216static void vl_api_bridge_domain_sw_if_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001217 (vl_api_bridge_domain_sw_if_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001218{
Dave Barach72d72232016-08-04 10:15:08 -04001219 vat_main_t *vam = &vat_main;
1220 hash_pair_t *p;
1221 u8 *sw_if_name = 0;
1222 u32 sw_if_index;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001223
Dave Barach72d72232016-08-04 10:15:08 -04001224 sw_if_index = ntohl (mp->sw_if_index);
1225 /* *INDENT-OFF* */
1226 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1227 ({
1228 if ((u32) p->value[0] == sw_if_index)
1229 {
1230 sw_if_name = (u8 *)(p->key);
1231 break;
1232 }
1233 }));
1234 /* *INDENT-ON* */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001235
Dave Barach72d72232016-08-04 10:15:08 -04001236 fformat (vam->ofp, "%7d %3d %s", sw_if_index,
1237 mp->shg, sw_if_name ? (char *) sw_if_name :
1238 "sw_if_index not found!");
Ed Warnickecb9cada2015-12-08 15:45:58 -07001239}
1240
1241static void vl_api_bridge_domain_sw_if_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001242 (vl_api_bridge_domain_sw_if_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001243{
Dave Barach72d72232016-08-04 10:15:08 -04001244 vat_main_t *vam = &vat_main;
1245 vat_json_node_t *node = NULL;
1246 uword last_index = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001247
Dave Barach72d72232016-08-04 10:15:08 -04001248 ASSERT (VAT_JSON_ARRAY == vam->json_tree.type);
1249 ASSERT (vec_len (vam->json_tree.array) >= 1);
1250 last_index = vec_len (vam->json_tree.array) - 1;
1251 node = &vam->json_tree.array[last_index];
1252 node = vat_json_object_get_element (node, "sw_if");
1253 ASSERT (NULL != node);
1254 node = vat_json_array_add (node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001255
Dave Barach72d72232016-08-04 10:15:08 -04001256 vat_json_init_object (node);
1257 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1258 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
1259 vat_json_object_add_uint (node, "shg", mp->shg);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001260}
1261
1262static void vl_api_control_ping_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001263 (vl_api_control_ping_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001264{
Dave Barach72d72232016-08-04 10:15:08 -04001265 vat_main_t *vam = &vat_main;
1266 i32 retval = ntohl (mp->retval);
1267 if (vam->async_mode)
1268 {
1269 vam->async_errors += (retval < 0);
1270 }
1271 else
1272 {
1273 vam->retval = retval;
1274 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001275 }
1276}
1277
1278static void vl_api_control_ping_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001279 (vl_api_control_ping_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001280{
Dave Barach72d72232016-08-04 10:15:08 -04001281 vat_main_t *vam = &vat_main;
1282 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001283
Dave Barach72d72232016-08-04 10:15:08 -04001284 if (VAT_JSON_NONE != vam->json_tree.type)
1285 {
1286 vat_json_print (vam->ofp, &vam->json_tree);
1287 vat_json_free (&vam->json_tree);
1288 vam->json_tree.type = VAT_JSON_NONE;
1289 }
1290 else
1291 {
1292 /* just print [] */
1293 vat_json_init_array (&vam->json_tree);
1294 vat_json_print (vam->ofp, &vam->json_tree);
1295 vam->json_tree.type = VAT_JSON_NONE;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001296 }
1297
Dave Barach72d72232016-08-04 10:15:08 -04001298 vam->retval = retval;
1299 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001300}
1301
Dave Barach72d72232016-08-04 10:15:08 -04001302static void
1303vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001304{
Dave Barach72d72232016-08-04 10:15:08 -04001305 vat_main_t *vam = &vat_main;
1306 i32 retval = ntohl (mp->retval);
1307 if (vam->async_mode)
1308 {
1309 vam->async_errors += (retval < 0);
1310 }
1311 else
1312 {
1313 vam->retval = retval;
1314 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001315 }
1316}
1317
1318static void vl_api_l2_flags_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001319 (vl_api_l2_flags_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001320{
Dave Barach72d72232016-08-04 10:15:08 -04001321 vat_main_t *vam = &vat_main;
1322 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001323
Dave Barach72d72232016-08-04 10:15:08 -04001324 vat_json_init_object (&node);
1325 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1326 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1327 ntohl (mp->resulting_feature_bitmap));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001328
Dave Barach72d72232016-08-04 10:15:08 -04001329 vat_json_print (vam->ofp, &node);
1330 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001331
Dave Barach72d72232016-08-04 10:15:08 -04001332 vam->retval = ntohl (mp->retval);
1333 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001334}
1335
1336static void vl_api_bridge_flags_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001337 (vl_api_bridge_flags_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001338{
Dave Barach72d72232016-08-04 10:15:08 -04001339 vat_main_t *vam = &vat_main;
1340 i32 retval = ntohl (mp->retval);
1341 if (vam->async_mode)
1342 {
1343 vam->async_errors += (retval < 0);
1344 }
1345 else
1346 {
1347 vam->retval = retval;
1348 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001349 }
1350}
1351
1352static void vl_api_bridge_flags_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001353 (vl_api_bridge_flags_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001354{
Dave Barach72d72232016-08-04 10:15:08 -04001355 vat_main_t *vam = &vat_main;
1356 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001357
Dave Barach72d72232016-08-04 10:15:08 -04001358 vat_json_init_object (&node);
1359 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1360 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1361 ntohl (mp->resulting_feature_bitmap));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001362
Dave Barach72d72232016-08-04 10:15:08 -04001363 vat_json_print (vam->ofp, &node);
1364 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001365
Dave Barach72d72232016-08-04 10:15:08 -04001366 vam->retval = ntohl (mp->retval);
1367 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001368}
1369
1370static void vl_api_tap_connect_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001371 (vl_api_tap_connect_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001372{
Dave Barach72d72232016-08-04 10:15:08 -04001373 vat_main_t *vam = &vat_main;
1374 i32 retval = ntohl (mp->retval);
1375 if (vam->async_mode)
1376 {
1377 vam->async_errors += (retval < 0);
1378 }
1379 else
1380 {
1381 vam->retval = retval;
1382 vam->sw_if_index = ntohl (mp->sw_if_index);
1383 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001384 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001385
Ed Warnickecb9cada2015-12-08 15:45:58 -07001386}
1387
1388static void vl_api_tap_connect_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001389 (vl_api_tap_connect_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001390{
Dave Barach72d72232016-08-04 10:15:08 -04001391 vat_main_t *vam = &vat_main;
1392 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001393
Dave Barach72d72232016-08-04 10:15:08 -04001394 vat_json_init_object (&node);
1395 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1396 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001397
Dave Barach72d72232016-08-04 10:15:08 -04001398 vat_json_print (vam->ofp, &node);
1399 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001400
Dave Barach72d72232016-08-04 10:15:08 -04001401 vam->retval = ntohl (mp->retval);
1402 vam->result_ready = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08001403
Ed Warnickecb9cada2015-12-08 15:45:58 -07001404}
1405
Dave Barach72d72232016-08-04 10:15:08 -04001406static void
1407vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001408{
Dave Barach72d72232016-08-04 10:15:08 -04001409 vat_main_t *vam = &vat_main;
1410 i32 retval = ntohl (mp->retval);
1411 if (vam->async_mode)
1412 {
1413 vam->async_errors += (retval < 0);
1414 }
1415 else
1416 {
1417 vam->retval = retval;
1418 vam->sw_if_index = ntohl (mp->sw_if_index);
1419 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001420 }
1421}
1422
1423static void vl_api_tap_modify_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001424 (vl_api_tap_modify_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001425{
Dave Barach72d72232016-08-04 10:15:08 -04001426 vat_main_t *vam = &vat_main;
1427 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001428
Dave Barach72d72232016-08-04 10:15:08 -04001429 vat_json_init_object (&node);
1430 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1431 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001432
Dave Barach72d72232016-08-04 10:15:08 -04001433 vat_json_print (vam->ofp, &node);
1434 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001435
Dave Barach72d72232016-08-04 10:15:08 -04001436 vam->retval = ntohl (mp->retval);
1437 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001438}
1439
Dave Barach72d72232016-08-04 10:15:08 -04001440static void
1441vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001442{
Dave Barach72d72232016-08-04 10:15:08 -04001443 vat_main_t *vam = &vat_main;
1444 i32 retval = ntohl (mp->retval);
1445 if (vam->async_mode)
1446 {
1447 vam->async_errors += (retval < 0);
1448 }
1449 else
1450 {
1451 vam->retval = retval;
1452 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001453 }
1454}
1455
1456static void vl_api_tap_delete_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001457 (vl_api_tap_delete_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001458{
Dave Barach72d72232016-08-04 10:15:08 -04001459 vat_main_t *vam = &vat_main;
1460 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001461
Dave Barach72d72232016-08-04 10:15:08 -04001462 vat_json_init_object (&node);
1463 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001464
Dave Barach72d72232016-08-04 10:15:08 -04001465 vat_json_print (vam->ofp, &node);
1466 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001467
Dave Barach72d72232016-08-04 10:15:08 -04001468 vam->retval = ntohl (mp->retval);
1469 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001470}
1471
1472static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001473 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001474{
Dave Barach72d72232016-08-04 10:15:08 -04001475 vat_main_t *vam = &vat_main;
1476 i32 retval = ntohl (mp->retval);
1477 if (vam->async_mode)
1478 {
1479 vam->async_errors += (retval < 0);
1480 }
1481 else
1482 {
1483 vam->retval = retval;
1484 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001485 }
1486}
1487
1488static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001489 (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001490{
Dave Barach72d72232016-08-04 10:15:08 -04001491 vat_main_t *vam = &vat_main;
1492 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001493
Dave Barach72d72232016-08-04 10:15:08 -04001494 vat_json_init_object (&node);
1495 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1496 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
1497 ntohl (mp->tunnel_sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001498
Dave Barach72d72232016-08-04 10:15:08 -04001499 vat_json_print (vam->ofp, &node);
1500 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001501
Dave Barach72d72232016-08-04 10:15:08 -04001502 vam->retval = ntohl (mp->retval);
1503 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001504}
1505
1506static void vl_api_l2tpv3_create_tunnel_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001507 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001508{
Dave Barach72d72232016-08-04 10:15:08 -04001509 vat_main_t *vam = &vat_main;
1510 i32 retval = ntohl (mp->retval);
1511 if (vam->async_mode)
1512 {
1513 vam->async_errors += (retval < 0);
1514 }
1515 else
1516 {
1517 vam->retval = retval;
1518 vam->sw_if_index = ntohl (mp->sw_if_index);
1519 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001520 }
1521}
1522
1523static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001524 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001525{
Dave Barach72d72232016-08-04 10:15:08 -04001526 vat_main_t *vam = &vat_main;
1527 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001528
Dave Barach72d72232016-08-04 10:15:08 -04001529 vat_json_init_object (&node);
1530 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1531 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001532
Dave Barach72d72232016-08-04 10:15:08 -04001533 vat_json_print (vam->ofp, &node);
1534 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001535
Dave Barach72d72232016-08-04 10:15:08 -04001536 vam->retval = ntohl (mp->retval);
1537 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001538}
1539
Filip Tehlar3a834602016-08-11 12:21:37 +02001540
1541static void vl_api_lisp_add_del_locator_set_reply_t_handler
1542 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1543{
1544 vat_main_t *vam = &vat_main;
1545 i32 retval = ntohl (mp->retval);
1546 if (vam->async_mode)
1547 {
1548 vam->async_errors += (retval < 0);
1549 }
1550 else
1551 {
1552 vam->retval = retval;
1553 vam->result_ready = 1;
1554 }
1555}
1556
1557static void vl_api_lisp_add_del_locator_set_reply_t_handler_json
1558 (vl_api_lisp_add_del_locator_set_reply_t * mp)
1559{
1560 vat_main_t *vam = &vat_main;
1561 vat_json_node_t node;
1562
1563 vat_json_init_object (&node);
1564 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1565 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
1566
1567 vat_json_print (vam->ofp, &node);
1568 vat_json_free (&node);
1569
1570 vam->retval = ntohl (mp->retval);
1571 vam->result_ready = 1;
1572}
1573
Ed Warnickecb9cada2015-12-08 15:45:58 -07001574static void vl_api_vxlan_add_del_tunnel_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001575 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001576{
Dave Barach72d72232016-08-04 10:15:08 -04001577 vat_main_t *vam = &vat_main;
1578 i32 retval = ntohl (mp->retval);
1579 if (vam->async_mode)
1580 {
1581 vam->async_errors += (retval < 0);
1582 }
1583 else
1584 {
1585 vam->retval = retval;
1586 vam->sw_if_index = ntohl (mp->sw_if_index);
1587 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001588 }
1589}
1590
1591static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001592 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001593{
Dave Barach72d72232016-08-04 10:15:08 -04001594 vat_main_t *vam = &vat_main;
1595 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001596
Dave Barach72d72232016-08-04 10:15:08 -04001597 vat_json_init_object (&node);
1598 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1599 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001600
Dave Barach72d72232016-08-04 10:15:08 -04001601 vat_json_print (vam->ofp, &node);
1602 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001603
Dave Barach72d72232016-08-04 10:15:08 -04001604 vam->retval = ntohl (mp->retval);
1605 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001606}
1607
Chris Luke27fe48f2016-04-28 13:44:38 -04001608static void vl_api_gre_add_del_tunnel_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001609 (vl_api_gre_add_del_tunnel_reply_t * mp)
Chris Luke27fe48f2016-04-28 13:44:38 -04001610{
Dave Barach72d72232016-08-04 10:15:08 -04001611 vat_main_t *vam = &vat_main;
1612 i32 retval = ntohl (mp->retval);
1613 if (vam->async_mode)
1614 {
1615 vam->async_errors += (retval < 0);
1616 }
1617 else
1618 {
1619 vam->retval = retval;
1620 vam->sw_if_index = ntohl (mp->sw_if_index);
1621 vam->result_ready = 1;
Chris Luke27fe48f2016-04-28 13:44:38 -04001622 }
1623}
1624
1625static void vl_api_gre_add_del_tunnel_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001626 (vl_api_gre_add_del_tunnel_reply_t * mp)
Chris Luke27fe48f2016-04-28 13:44:38 -04001627{
Dave Barach72d72232016-08-04 10:15:08 -04001628 vat_main_t *vam = &vat_main;
1629 vat_json_node_t node;
Chris Luke27fe48f2016-04-28 13:44:38 -04001630
Dave Barach72d72232016-08-04 10:15:08 -04001631 vat_json_init_object (&node);
1632 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1633 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Chris Luke27fe48f2016-04-28 13:44:38 -04001634
Dave Barach72d72232016-08-04 10:15:08 -04001635 vat_json_print (vam->ofp, &node);
1636 vat_json_free (&node);
Chris Luke27fe48f2016-04-28 13:44:38 -04001637
Dave Barach72d72232016-08-04 10:15:08 -04001638 vam->retval = ntohl (mp->retval);
1639 vam->result_ready = 1;
Chris Luke27fe48f2016-04-28 13:44:38 -04001640}
1641
Ed Warnickecb9cada2015-12-08 15:45:58 -07001642static void vl_api_create_vhost_user_if_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001643 (vl_api_create_vhost_user_if_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001644{
Dave Barach72d72232016-08-04 10:15:08 -04001645 vat_main_t *vam = &vat_main;
1646 i32 retval = ntohl (mp->retval);
1647 if (vam->async_mode)
1648 {
1649 vam->async_errors += (retval < 0);
1650 }
1651 else
1652 {
1653 vam->retval = retval;
1654 vam->sw_if_index = ntohl (mp->sw_if_index);
1655 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001656 }
1657}
1658
1659static void vl_api_create_vhost_user_if_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001660 (vl_api_create_vhost_user_if_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001661{
Dave Barach72d72232016-08-04 10:15:08 -04001662 vat_main_t *vam = &vat_main;
1663 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001664
Dave Barach72d72232016-08-04 10:15:08 -04001665 vat_json_init_object (&node);
1666 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1667 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001668
Dave Barach72d72232016-08-04 10:15:08 -04001669 vat_json_print (vam->ofp, &node);
1670 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001671
Dave Barach72d72232016-08-04 10:15:08 -04001672 vam->retval = ntohl (mp->retval);
1673 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001674}
1675
1676static void vl_api_ip_address_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001677 (vl_api_ip_address_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001678{
Dave Barach72d72232016-08-04 10:15:08 -04001679 vat_main_t *vam = &vat_main;
1680 static ip_address_details_t empty_ip_address_details = { {0} };
1681 ip_address_details_t *address = NULL;
1682 ip_details_t *current_ip_details = NULL;
1683 ip_details_t *details = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001684
Dave Barach72d72232016-08-04 10:15:08 -04001685 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
Ed Warnickecb9cada2015-12-08 15:45:58 -07001686
Dave Barach72d72232016-08-04 10:15:08 -04001687 if (!details || vam->current_sw_if_index >= vec_len (details)
1688 || !details[vam->current_sw_if_index].present)
1689 {
1690 errmsg ("ip address details arrived but not stored\n");
1691 errmsg ("ip_dump should be called first\n");
1692 return;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001693 }
1694
Dave Barach72d72232016-08-04 10:15:08 -04001695 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001696
1697#define addresses (current_ip_details->addr)
1698
Dave Barach72d72232016-08-04 10:15:08 -04001699 vec_validate_init_empty (addresses, vec_len (addresses),
1700 empty_ip_address_details);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001701
Dave Barach72d72232016-08-04 10:15:08 -04001702 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001703
Dave Barach72d72232016-08-04 10:15:08 -04001704 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
1705 address->prefix_length = mp->prefix_length;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001706#undef addresses
1707}
1708
1709static void vl_api_ip_address_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001710 (vl_api_ip_address_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001711{
Dave Barach72d72232016-08-04 10:15:08 -04001712 vat_main_t *vam = &vat_main;
1713 vat_json_node_t *node = NULL;
1714 struct in6_addr ip6;
1715 struct in_addr ip4;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001716
Dave Barach72d72232016-08-04 10:15:08 -04001717 if (VAT_JSON_ARRAY != vam->json_tree.type)
1718 {
1719 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1720 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001721 }
Dave Barach72d72232016-08-04 10:15:08 -04001722 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001723
Dave Barach72d72232016-08-04 10:15:08 -04001724 vat_json_init_object (node);
1725 if (vam->is_ipv6)
1726 {
1727 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
1728 vat_json_object_add_ip6 (node, "ip", ip6);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001729 }
Dave Barach72d72232016-08-04 10:15:08 -04001730 else
1731 {
1732 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
1733 vat_json_object_add_ip4 (node, "ip", ip4);
1734 }
1735 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001736}
1737
Dave Barach72d72232016-08-04 10:15:08 -04001738static void
1739vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001740{
Dave Barach72d72232016-08-04 10:15:08 -04001741 vat_main_t *vam = &vat_main;
1742 static ip_details_t empty_ip_details = { 0 };
1743 ip_details_t *ip = NULL;
1744 u32 sw_if_index = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001745
Dave Barach72d72232016-08-04 10:15:08 -04001746 sw_if_index = ntohl (mp->sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001747
Dave Barach72d72232016-08-04 10:15:08 -04001748 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1749 sw_if_index, empty_ip_details);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001750
Dave Barach72d72232016-08-04 10:15:08 -04001751 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
1752 sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001753
Dave Barach72d72232016-08-04 10:15:08 -04001754 ip->present = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001755}
1756
Dave Barach72d72232016-08-04 10:15:08 -04001757static void
1758vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001759{
Dave Barach72d72232016-08-04 10:15:08 -04001760 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001761
Dave Barach72d72232016-08-04 10:15:08 -04001762 if (VAT_JSON_ARRAY != vam->json_tree.type)
1763 {
1764 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1765 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001766 }
Dave Barach72d72232016-08-04 10:15:08 -04001767 vat_json_array_add_uint (&vam->json_tree,
1768 clib_net_to_host_u32 (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001769}
1770
1771static void vl_api_map_domain_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001772 (vl_api_map_domain_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001773{
Dave Barach72d72232016-08-04 10:15:08 -04001774 vat_json_node_t *node = NULL;
1775 vat_main_t *vam = &vat_main;
1776 struct in6_addr ip6;
1777 struct in_addr ip4;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001778
Dave Barach72d72232016-08-04 10:15:08 -04001779 if (VAT_JSON_ARRAY != vam->json_tree.type)
1780 {
1781 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1782 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001783 }
1784
Dave Barach72d72232016-08-04 10:15:08 -04001785 node = vat_json_array_add (&vam->json_tree);
1786 vat_json_init_object (node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001787
Dave Barach72d72232016-08-04 10:15:08 -04001788 vat_json_object_add_uint (node, "domain_index",
1789 clib_net_to_host_u32 (mp->domain_index));
1790 clib_memcpy (&ip6, mp->ip6_prefix, sizeof (ip6));
1791 vat_json_object_add_ip6 (node, "ip6_prefix", ip6);
1792 clib_memcpy (&ip4, mp->ip4_prefix, sizeof (ip4));
1793 vat_json_object_add_ip4 (node, "ip4_prefix", ip4);
1794 clib_memcpy (&ip6, mp->ip6_src, sizeof (ip6));
1795 vat_json_object_add_ip6 (node, "ip6_src", ip6);
1796 vat_json_object_add_int (node, "ip6_prefix_len", mp->ip6_prefix_len);
1797 vat_json_object_add_int (node, "ip4_prefix_len", mp->ip4_prefix_len);
1798 vat_json_object_add_int (node, "ip6_src_len", mp->ip6_src_len);
1799 vat_json_object_add_int (node, "ea_bits_len", mp->ea_bits_len);
1800 vat_json_object_add_int (node, "psid_offset", mp->psid_offset);
1801 vat_json_object_add_int (node, "psid_length", mp->psid_length);
1802 vat_json_object_add_uint (node, "flags", mp->flags);
1803 vat_json_object_add_uint (node, "mtu", clib_net_to_host_u16 (mp->mtu));
1804 vat_json_object_add_int (node, "is_translation", mp->is_translation);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001805}
1806
1807static void vl_api_map_domain_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001808 (vl_api_map_domain_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001809{
Dave Barach72d72232016-08-04 10:15:08 -04001810 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001811
Dave Barach72d72232016-08-04 10:15:08 -04001812 if (mp->is_translation)
1813 {
1814 fformat (vam->ofp,
1815 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U/%d (ip6-src) index: %u\n",
1816 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1817 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1818 format_ip6_address, mp->ip6_src, mp->ip6_src_len,
1819 clib_net_to_host_u32 (mp->domain_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07001820 }
Dave Barach72d72232016-08-04 10:15:08 -04001821 else
1822 {
1823 fformat (vam->ofp,
1824 "* %U/%d (ipv4-prefix) %U/%d (ipv6-prefix) %U (ip6-src) index: %u\n",
1825 format_ip4_address, mp->ip4_prefix, mp->ip4_prefix_len,
1826 format_ip6_address, mp->ip6_prefix, mp->ip6_prefix_len,
1827 format_ip6_address, mp->ip6_src,
1828 clib_net_to_host_u32 (mp->domain_index));
1829 }
1830 fformat (vam->ofp, " ea-len %d psid-offset %d psid-len %d mtu %d %s\n",
1831 mp->ea_bits_len, mp->psid_offset, mp->psid_length, mp->mtu,
1832 mp->is_translation ? "map-t" : "");
Ed Warnickecb9cada2015-12-08 15:45:58 -07001833}
1834
1835static void vl_api_map_rule_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001836 (vl_api_map_rule_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001837{
Dave Barach72d72232016-08-04 10:15:08 -04001838 struct in6_addr ip6;
1839 vat_json_node_t *node = NULL;
1840 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001841
Dave Barach72d72232016-08-04 10:15:08 -04001842 if (VAT_JSON_ARRAY != vam->json_tree.type)
1843 {
1844 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1845 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001846 }
1847
Dave Barach72d72232016-08-04 10:15:08 -04001848 node = vat_json_array_add (&vam->json_tree);
1849 vat_json_init_object (node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001850
Dave Barach72d72232016-08-04 10:15:08 -04001851 vat_json_object_add_uint (node, "psid", clib_net_to_host_u16 (mp->psid));
1852 clib_memcpy (&ip6, mp->ip6_dst, sizeof (ip6));
1853 vat_json_object_add_ip6 (node, "ip6_dst", ip6);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001854}
1855
Dave Barach72d72232016-08-04 10:15:08 -04001856static void
1857vl_api_map_rule_details_t_handler (vl_api_map_rule_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001858{
Dave Barach72d72232016-08-04 10:15:08 -04001859 vat_main_t *vam = &vat_main;
1860 fformat (vam->ofp, " %d (psid) %U (ip6-dst)\n",
1861 clib_net_to_host_u16 (mp->psid), format_ip6_address, mp->ip6_dst);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001862}
1863
Dave Barach72d72232016-08-04 10:15:08 -04001864static void
1865vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001866{
Dave Barach72d72232016-08-04 10:15:08 -04001867 vat_main_t *vam = &vat_main;
1868 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
1869 "router_addr %U host_mac %U\n",
1870 mp->pid, mp->is_ipv6 ? "ipv6" : "ipv4", mp->hostname,
1871 format_ip4_address, &mp->host_address,
1872 format_ip4_address, &mp->router_address,
1873 format_ethernet_address, mp->host_mac);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001874}
1875
1876static void vl_api_dhcp_compl_event_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001877 (vl_api_dhcp_compl_event_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001878{
Dave Barach72d72232016-08-04 10:15:08 -04001879 /* JSON output not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -07001880}
1881
Dave Barach72d72232016-08-04 10:15:08 -04001882static void
1883set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1884 u32 counter)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001885{
Dave Barach72d72232016-08-04 10:15:08 -04001886 vat_main_t *vam = &vat_main;
1887 static u64 default_counter = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001888
Dave Barach72d72232016-08-04 10:15:08 -04001889 vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type,
1890 NULL);
1891 vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type],
1892 sw_if_index, default_counter);
1893 vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001894}
1895
Dave Barach72d72232016-08-04 10:15:08 -04001896static void
1897set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index,
1898 interface_counter_t counter)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001899{
Dave Barach72d72232016-08-04 10:15:08 -04001900 vat_main_t *vam = &vat_main;
1901 static interface_counter_t default_counter = { 0, };
Ed Warnickecb9cada2015-12-08 15:45:58 -07001902
Dave Barach72d72232016-08-04 10:15:08 -04001903 vec_validate_init_empty (vam->combined_interface_counters,
1904 vnet_counter_type, NULL);
1905 vec_validate_init_empty (vam->combined_interface_counters
1906 [vnet_counter_type], sw_if_index, default_counter);
1907 vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001908}
1909
1910static void vl_api_vnet_interface_counters_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001911 (vl_api_vnet_interface_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001912{
Dave Barach72d72232016-08-04 10:15:08 -04001913 /* not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -07001914}
1915
1916static void vl_api_vnet_interface_counters_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001917 (vl_api_vnet_interface_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001918{
Dave Barach72d72232016-08-04 10:15:08 -04001919 interface_counter_t counter;
1920 vlib_counter_t *v;
1921 u64 *v_packets;
1922 u64 packets;
1923 u32 count;
1924 u32 first_sw_if_index;
1925 int i;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001926
Dave Barach72d72232016-08-04 10:15:08 -04001927 count = ntohl (mp->count);
1928 first_sw_if_index = ntohl (mp->first_sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07001929
Dave Barach72d72232016-08-04 10:15:08 -04001930 if (!mp->is_combined)
1931 {
1932 v_packets = (u64 *) & mp->data;
1933 for (i = 0; i < count; i++)
1934 {
1935 packets =
1936 clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64));
1937 set_simple_interface_counter (mp->vnet_counter_type,
1938 first_sw_if_index + i, packets);
1939 v_packets++;
1940 }
1941 }
1942 else
1943 {
1944 v = (vlib_counter_t *) & mp->data;
1945 for (i = 0; i < count; i++)
1946 {
1947 counter.packets =
1948 clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64));
1949 counter.bytes =
1950 clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64));
1951 set_combined_interface_counter (mp->vnet_counter_type,
1952 first_sw_if_index + i, counter);
1953 v++;
1954 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07001955 }
1956}
1957
Dave Barach72d72232016-08-04 10:15:08 -04001958static u32
1959ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001960{
Dave Barach72d72232016-08-04 10:15:08 -04001961 vat_main_t *vam = &vat_main;
1962 u32 i;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001963
Dave Barach72d72232016-08-04 10:15:08 -04001964 for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++)
1965 {
1966 if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id)
1967 {
1968 return i;
1969 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07001970 }
Dave Barach72d72232016-08-04 10:15:08 -04001971 return ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001972}
1973
Dave Barach72d72232016-08-04 10:15:08 -04001974static u32
1975ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001976{
Dave Barach72d72232016-08-04 10:15:08 -04001977 vat_main_t *vam = &vat_main;
1978 u32 i;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001979
Dave Barach72d72232016-08-04 10:15:08 -04001980 for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++)
1981 {
1982 if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id)
1983 {
1984 return i;
1985 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07001986 }
Dave Barach72d72232016-08-04 10:15:08 -04001987 return ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07001988}
1989
1990static void vl_api_vnet_ip4_fib_counters_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04001991 (vl_api_vnet_ip4_fib_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001992{
Dave Barach72d72232016-08-04 10:15:08 -04001993 /* not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -07001994}
1995
1996static void vl_api_vnet_ip4_fib_counters_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04001997 (vl_api_vnet_ip4_fib_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07001998{
Dave Barach72d72232016-08-04 10:15:08 -04001999 vat_main_t *vam = &vat_main;
2000 vl_api_ip4_fib_counter_t *v;
2001 ip4_fib_counter_t *counter;
2002 struct in_addr ip4;
2003 u32 vrf_id;
2004 u32 vrf_index;
2005 u32 count;
2006 int i;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002007
Dave Barach72d72232016-08-04 10:15:08 -04002008 vrf_id = ntohl (mp->vrf_id);
2009 vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2010 if (~0 == vrf_index)
2011 {
2012 vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index);
2013 vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index);
2014 vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2015 vec_validate (vam->ip4_fib_counters, vrf_index);
2016 vam->ip4_fib_counters[vrf_index] = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002017 }
2018
Dave Barach72d72232016-08-04 10:15:08 -04002019 vec_free (vam->ip4_fib_counters[vrf_index]);
2020 v = (vl_api_ip4_fib_counter_t *) & mp->c;
2021 count = ntohl (mp->count);
2022 for (i = 0; i < count; i++)
2023 {
2024 vec_validate (vam->ip4_fib_counters[vrf_index], i);
2025 counter = &vam->ip4_fib_counters[vrf_index][i];
2026 clib_memcpy (&ip4, &v->address, sizeof (ip4));
2027 counter->address = ip4;
2028 counter->address_length = v->address_length;
2029 counter->packets = clib_net_to_host_u64 (v->packets);
2030 counter->bytes = clib_net_to_host_u64 (v->bytes);
2031 v++;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002032 }
2033}
2034
2035static void vl_api_vnet_ip6_fib_counters_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04002036 (vl_api_vnet_ip6_fib_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07002037{
Dave Barach72d72232016-08-04 10:15:08 -04002038 /* not supported */
Ed Warnickecb9cada2015-12-08 15:45:58 -07002039}
2040
2041static void vl_api_vnet_ip6_fib_counters_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04002042 (vl_api_vnet_ip6_fib_counters_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07002043{
Dave Barach72d72232016-08-04 10:15:08 -04002044 vat_main_t *vam = &vat_main;
2045 vl_api_ip6_fib_counter_t *v;
2046 ip6_fib_counter_t *counter;
2047 struct in6_addr ip6;
2048 u32 vrf_id;
2049 u32 vrf_index;
2050 u32 count;
2051 int i;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002052
Dave Barach72d72232016-08-04 10:15:08 -04002053 vrf_id = ntohl (mp->vrf_id);
2054 vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id);
2055 if (~0 == vrf_index)
2056 {
2057 vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index);
2058 vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index);
2059 vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id;
2060 vec_validate (vam->ip6_fib_counters, vrf_index);
2061 vam->ip6_fib_counters[vrf_index] = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002062 }
2063
Dave Barach72d72232016-08-04 10:15:08 -04002064 vec_free (vam->ip6_fib_counters[vrf_index]);
2065 v = (vl_api_ip6_fib_counter_t *) & mp->c;
2066 count = ntohl (mp->count);
2067 for (i = 0; i < count; i++)
2068 {
2069 vec_validate (vam->ip6_fib_counters[vrf_index], i);
2070 counter = &vam->ip6_fib_counters[vrf_index][i];
2071 clib_memcpy (&ip6, &v->address, sizeof (ip6));
2072 counter->address = ip6;
2073 counter->address_length = v->address_length;
2074 counter->packets = clib_net_to_host_u64 (v->packets);
2075 counter->bytes = clib_net_to_host_u64 (v->bytes);
2076 v++;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002077 }
2078}
2079
2080static void vl_api_get_first_msg_id_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04002081 (vl_api_get_first_msg_id_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07002082{
Dave Barach72d72232016-08-04 10:15:08 -04002083 vat_main_t *vam = &vat_main;
2084 i32 retval = ntohl (mp->retval);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08002085
Dave Barach72d72232016-08-04 10:15:08 -04002086 if (vam->async_mode)
2087 {
2088 vam->async_errors += (retval < 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -07002089 }
Dave Barach72d72232016-08-04 10:15:08 -04002090 else
2091 {
2092 vam->retval = retval;
2093 vam->result_ready = 1;
2094 }
2095 if (retval >= 0)
2096 {
2097 errmsg ("first message id %d\n", ntohs (mp->first_msg_id));
Ed Warnickecb9cada2015-12-08 15:45:58 -07002098 }
2099}
2100
2101static void vl_api_get_first_msg_id_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04002102 (vl_api_get_first_msg_id_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07002103{
Dave Barach72d72232016-08-04 10:15:08 -04002104 vat_main_t *vam = &vat_main;
2105 vat_json_node_t node;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002106
Dave Barach72d72232016-08-04 10:15:08 -04002107 vat_json_init_object (&node);
2108 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2109 vat_json_object_add_uint (&node, "first_msg_id",
2110 (uint) ntohs (mp->first_msg_id));
Ed Warnickecb9cada2015-12-08 15:45:58 -07002111
Dave Barach72d72232016-08-04 10:15:08 -04002112 vat_json_print (vam->ofp, &node);
2113 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07002114
Dave Barach72d72232016-08-04 10:15:08 -04002115 vam->retval = ntohl (mp->retval);
2116 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07002117}
2118
Dave Barachb44e9bc2016-02-19 09:06:23 -05002119static void vl_api_get_node_graph_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04002120 (vl_api_get_node_graph_reply_t * mp)
Dave Barachb44e9bc2016-02-19 09:06:23 -05002121{
Dave Barach72d72232016-08-04 10:15:08 -04002122 vat_main_t *vam = &vat_main;
2123 api_main_t *am = &api_main;
2124 i32 retval = ntohl (mp->retval);
2125 u8 *pvt_copy, *reply;
2126 void *oldheap;
2127 vlib_node_t *node;
2128 int i;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08002129
Dave Barach72d72232016-08-04 10:15:08 -04002130 if (vam->async_mode)
2131 {
2132 vam->async_errors += (retval < 0);
2133 }
2134 else
2135 {
2136 vam->retval = retval;
2137 vam->result_ready = 1;
Dave Barachb44e9bc2016-02-19 09:06:23 -05002138 }
2139
Dave Barach72d72232016-08-04 10:15:08 -04002140 /* "Should never happen..." */
2141 if (retval != 0)
2142 return;
Dave Barachb44e9bc2016-02-19 09:06:23 -05002143
Dave Barach72d72232016-08-04 10:15:08 -04002144 reply = (u8 *) (mp->reply_in_shmem);
2145 pvt_copy = vec_dup (reply);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002146
Dave Barach72d72232016-08-04 10:15:08 -04002147 /* Toss the shared-memory original... */
2148 pthread_mutex_lock (&am->vlib_rp->mutex);
2149 oldheap = svm_push_data_heap (am->vlib_rp);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002150
Dave Barach72d72232016-08-04 10:15:08 -04002151 vec_free (reply);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08002152
Dave Barach72d72232016-08-04 10:15:08 -04002153 svm_pop_heap (oldheap);
2154 pthread_mutex_unlock (&am->vlib_rp->mutex);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002155
Dave Barach72d72232016-08-04 10:15:08 -04002156 if (vam->graph_nodes)
2157 {
2158 hash_free (vam->graph_node_index_by_name);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002159
Dave Barach72d72232016-08-04 10:15:08 -04002160 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2161 {
2162 node = vam->graph_nodes[i];
2163 vec_free (node->name);
2164 vec_free (node->next_nodes);
2165 vec_free (node);
2166 }
2167 vec_free (vam->graph_nodes);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002168 }
2169
Dave Barach72d72232016-08-04 10:15:08 -04002170 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2171 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2172 vec_free (pvt_copy);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002173
Dave Barach72d72232016-08-04 10:15:08 -04002174 for (i = 0; i < vec_len (vam->graph_nodes); i++)
2175 {
2176 node = vam->graph_nodes[i];
2177 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002178 }
2179}
2180
2181static void vl_api_get_node_graph_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04002182 (vl_api_get_node_graph_reply_t * mp)
Dave Barachb44e9bc2016-02-19 09:06:23 -05002183{
Dave Barach72d72232016-08-04 10:15:08 -04002184 vat_main_t *vam = &vat_main;
2185 api_main_t *am = &api_main;
2186 void *oldheap;
2187 vat_json_node_t node;
2188 u8 *reply;
Dave Barachb44e9bc2016-02-19 09:06:23 -05002189
Dave Barach72d72232016-08-04 10:15:08 -04002190 /* $$$$ make this real? */
2191 vat_json_init_object (&node);
2192 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2193 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002194
Dave Barach72d72232016-08-04 10:15:08 -04002195 reply = (u8 *) (mp->reply_in_shmem);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002196
Dave Barach72d72232016-08-04 10:15:08 -04002197 /* Toss the shared-memory original... */
2198 pthread_mutex_lock (&am->vlib_rp->mutex);
2199 oldheap = svm_push_data_heap (am->vlib_rp);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002200
Dave Barach72d72232016-08-04 10:15:08 -04002201 vec_free (reply);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08002202
Dave Barach72d72232016-08-04 10:15:08 -04002203 svm_pop_heap (oldheap);
2204 pthread_mutex_unlock (&am->vlib_rp->mutex);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002205
Dave Barach72d72232016-08-04 10:15:08 -04002206 vat_json_print (vam->ofp, &node);
2207 vat_json_free (&node);
Dave Barachb44e9bc2016-02-19 09:06:23 -05002208
Dave Barach72d72232016-08-04 10:15:08 -04002209 vam->retval = ntohl (mp->retval);
2210 vam->result_ready = 1;
Dave Barachb44e9bc2016-02-19 09:06:23 -05002211}
2212
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002213static void
Dave Barach72d72232016-08-04 10:15:08 -04002214vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002215{
Dave Barach72d72232016-08-04 10:15:08 -04002216 vat_main_t *vam = &vat_main;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002217 u8 *s = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002218
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002219 if (mp->local)
Dave Barach72d72232016-08-04 10:15:08 -04002220 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002221 s = format (s, "%=16d%=16d%=16d\n",
2222 ntohl (mp->sw_if_index), mp->priority, mp->weight);
Dave Barach72d72232016-08-04 10:15:08 -04002223 }
2224 else
2225 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002226 s = format (s, "%=16U%=16d%=16d\n",
2227 mp->is_ipv6 ? format_ip6_address :
2228 format_ip4_address,
2229 mp->ip_address, mp->priority, mp->weight);
Andrej Kozemcak3e53fc52016-05-09 10:52:16 +02002230 }
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002231
2232 fformat (vam->ofp, "%v", s);
2233 vec_free (s);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002234}
2235
2236static void
Dave Barach72d72232016-08-04 10:15:08 -04002237vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t *
2238 mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002239{
Dave Barach72d72232016-08-04 10:15:08 -04002240 vat_main_t *vam = &vat_main;
2241 vat_json_node_t *node = NULL;
Dave Barach72d72232016-08-04 10:15:08 -04002242 struct in6_addr ip6;
2243 struct in_addr ip4;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002244
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002245 if (VAT_JSON_ARRAY != vam->json_tree.type)
Dave Barach72d72232016-08-04 10:15:08 -04002246 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002247 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2248 vat_json_init_array (&vam->json_tree);
2249 }
2250 node = vat_json_array_add (&vam->json_tree);
2251 vat_json_init_object (node);
2252
2253 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2254 vat_json_object_add_uint (node, "priority", mp->priority);
2255 vat_json_object_add_uint (node, "weight", mp->weight);
2256
2257 if (mp->local)
2258 vat_json_object_add_uint (node, "sw_if_index",
2259 clib_net_to_host_u32 (mp->sw_if_index));
2260 else
2261 {
2262 if (mp->is_ipv6)
Dave Barach72d72232016-08-04 10:15:08 -04002263 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002264 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2265 vat_json_object_add_ip6 (node, "address", ip6);
Dave Barach72d72232016-08-04 10:15:08 -04002266 }
2267 else
2268 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002269 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2270 vat_json_object_add_ip4 (node, "address", ip4);
Dave Barach72d72232016-08-04 10:15:08 -04002271 }
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002272 }
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002273}
2274
2275static void
2276vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t *
2277 mp)
2278{
2279 vat_main_t *vam = &vat_main;
2280 u8 *ls_name = 0;
2281
2282 ls_name = format (0, "%s", mp->ls_name);
2283
2284 fformat (vam->ofp, "%=10d%=15v\n", clib_net_to_host_u32 (mp->ls_index),
2285 ls_name);
2286 vec_free (ls_name);
2287}
2288
2289static void
2290 vl_api_lisp_locator_set_details_t_handler_json
2291 (vl_api_lisp_locator_set_details_t * mp)
2292{
2293 vat_main_t *vam = &vat_main;
2294 vat_json_node_t *node = 0;
2295 u8 *ls_name = 0;
2296
2297 ls_name = format (0, "%s", mp->ls_name);
2298 vec_add1 (ls_name, 0);
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002299
Dave Barach72d72232016-08-04 10:15:08 -04002300 if (VAT_JSON_ARRAY != vam->json_tree.type)
2301 {
2302 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2303 vat_json_init_array (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002304 }
Dave Barach72d72232016-08-04 10:15:08 -04002305 node = vat_json_array_add (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002306
Dave Barach72d72232016-08-04 10:15:08 -04002307 vat_json_init_object (node);
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002308 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2309 vat_json_object_add_uint (node, "ls_index",
2310 clib_net_to_host_u32 (mp->ls_index));
2311 vec_free (ls_name);
2312}
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002313
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002314static u8 *
2315format_lisp_flat_eid (u8 * s, va_list * args)
2316{
2317 u32 type = va_arg (*args, u32);
2318 u8 *eid = va_arg (*args, u8 *);
2319 u32 eid_len = va_arg (*args, u32);
2320
2321 switch (type)
Dave Barach72d72232016-08-04 10:15:08 -04002322 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002323 case 0:
2324 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
2325 case 1:
2326 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
2327 case 2:
2328 return format (s, "%U", format_ethernet_address, eid);
Andrej Kozemcak3e53fc52016-05-09 10:52:16 +02002329 }
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002330 return 0;
Dave Barach72d72232016-08-04 10:15:08 -04002331}
2332
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002333static u8 *
2334format_lisp_eid_vat (u8 * s, va_list * args)
Dave Barach72d72232016-08-04 10:15:08 -04002335{
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002336 u32 type = va_arg (*args, u32);
2337 u8 *eid = va_arg (*args, u8 *);
2338 u32 eid_len = va_arg (*args, u32);
2339 u8 *seid = va_arg (*args, u8 *);
2340 u32 seid_len = va_arg (*args, u32);
2341 u32 is_src_dst = va_arg (*args, u32);
Dave Barach72d72232016-08-04 10:15:08 -04002342
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002343 if (is_src_dst)
2344 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
Dave Barach72d72232016-08-04 10:15:08 -04002345
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002346 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
Dave Barach72d72232016-08-04 10:15:08 -04002347
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002348 return s;
Dave Barach72d72232016-08-04 10:15:08 -04002349}
2350
2351static void
Filip Tehlarc00617b2016-08-27 08:40:26 +02002352vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp)
2353{
2354 vat_main_t *vam = &vat_main;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002355 u8 *s = 0, *eid = 0;
2356
2357 if (~0 == mp->locator_set_index)
2358 s = format (0, "action: %d", mp->action);
2359 else
2360 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
2361
2362 eid = format (0, "%U", format_lisp_eid_vat,
2363 mp->eid_type,
2364 mp->eid,
2365 mp->eid_prefix_len,
2366 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2367 vec_add1 (eid, 0);
2368
2369 fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-d\n",
2370 clib_net_to_host_u32 (mp->vni),
2371 eid,
2372 mp->is_local ? "local" : "remote",
2373 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative);
2374 vec_free (s);
2375 vec_free (eid);
Filip Tehlarc00617b2016-08-27 08:40:26 +02002376}
2377
2378static void
Dave Barach72d72232016-08-04 10:15:08 -04002379vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t
2380 * mp)
2381{
2382 vat_main_t *vam = &vat_main;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +02002383 vat_json_node_t *node = 0;
2384 u8 *eid = 0;
2385
2386 if (VAT_JSON_ARRAY != vam->json_tree.type)
2387 {
2388 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2389 vat_json_init_array (&vam->json_tree);
2390 }
2391 node = vat_json_array_add (&vam->json_tree);
2392
2393 vat_json_init_object (node);
2394 if (~0 == mp->locator_set_index)
2395 vat_json_object_add_uint (node, "action", mp->action);
2396 else
2397 vat_json_object_add_uint (node, "locator_set_index",
2398 clib_net_to_host_u32 (mp->locator_set_index));
2399
2400 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
2401 eid = format (0, "%U", format_lisp_eid_vat,
2402 mp->eid_type,
2403 mp->eid,
2404 mp->eid_prefix_len,
2405 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
2406 vec_add1 (eid, 0);
2407 vat_json_object_add_string_copy (node, "eid", eid);
2408 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2409 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
2410 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
2411 vec_free (eid);
Dave Barach72d72232016-08-04 10:15:08 -04002412}
2413
2414static void
2415 vl_api_lisp_eid_table_map_details_t_handler
2416 (vl_api_lisp_eid_table_map_details_t * mp)
2417{
2418 vat_main_t *vam = &vat_main;
2419
2420 u8 *line = format (0, "%=10d%=10d",
2421 clib_net_to_host_u32 (mp->vni),
Filip Tehlarc0681792016-08-24 14:11:07 +02002422 clib_net_to_host_u32 (mp->dp_table));
Dave Barach72d72232016-08-04 10:15:08 -04002423 fformat (vam->ofp, "%v\n", line);
2424 vec_free (line);
2425}
2426
2427static void
2428 vl_api_lisp_eid_table_map_details_t_handler_json
2429 (vl_api_lisp_eid_table_map_details_t * mp)
2430{
2431 vat_main_t *vam = &vat_main;
2432 vat_json_node_t *node = NULL;
2433
2434 if (VAT_JSON_ARRAY != vam->json_tree.type)
2435 {
2436 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2437 vat_json_init_array (&vam->json_tree);
2438 }
2439 node = vat_json_array_add (&vam->json_tree);
2440 vat_json_init_object (node);
Filip Tehlarc0681792016-08-24 14:11:07 +02002441 vat_json_object_add_uint (node, "dp_table",
2442 clib_net_to_host_u32 (mp->dp_table));
Dave Barach72d72232016-08-04 10:15:08 -04002443 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
Filip Tehlar2f653d02016-07-13 13:17:15 +02002444}
2445
Filip Tehlar50a4e142016-08-24 11:28:02 +02002446static void
2447 vl_api_lisp_eid_table_vni_details_t_handler
2448 (vl_api_lisp_eid_table_vni_details_t * mp)
2449{
2450 vat_main_t *vam = &vat_main;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002451
Filip Tehlar50a4e142016-08-24 11:28:02 +02002452 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
2453 fformat (vam->ofp, "%v\n", line);
2454 vec_free (line);
2455}
2456
2457static void
2458 vl_api_lisp_eid_table_vni_details_t_handler_json
2459 (vl_api_lisp_eid_table_vni_details_t * mp)
2460{
2461 vat_main_t *vam = &vat_main;
2462 vat_json_node_t *node = NULL;
2463
2464 if (VAT_JSON_ARRAY != vam->json_tree.type)
2465 {
2466 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2467 vat_json_init_array (&vam->json_tree);
2468 }
2469 node = vat_json_array_add (&vam->json_tree);
2470 vat_json_init_object (node);
2471 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
2472}
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002473
2474static u8 *
2475format_decap_next (u8 * s, va_list * args)
2476{
2477 u32 next_index = va_arg (*args, u32);
2478
2479 switch (next_index)
2480 {
2481 case LISP_GPE_INPUT_NEXT_DROP:
2482 return format (s, "drop");
2483 case LISP_GPE_INPUT_NEXT_IP4_INPUT:
2484 return format (s, "ip4");
2485 case LISP_GPE_INPUT_NEXT_IP6_INPUT:
2486 return format (s, "ip6");
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002487 default:
2488 return format (s, "unknown %d", next_index);
2489 }
2490 return s;
2491}
2492
2493static void
Dave Barach72d72232016-08-04 10:15:08 -04002494vl_api_lisp_gpe_tunnel_details_t_handler (vl_api_lisp_gpe_tunnel_details_t *
2495 mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002496{
Dave Barach72d72232016-08-04 10:15:08 -04002497 vat_main_t *vam = &vat_main;
2498 u8 *iid_str;
2499 u8 *flag_str = NULL;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002500
Dave Barach72d72232016-08-04 10:15:08 -04002501 iid_str = format (0, "%d (0x%x)", ntohl (mp->iid), ntohl (mp->iid));
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002502
2503#define _(n,v) if (mp->flags & v) flag_str = format (flag_str, "%s-bit ", #n);
2504 foreach_lisp_gpe_flag_bit;
2505#undef _
2506
Dave Barach72d72232016-08-04 10:15:08 -04002507 fformat (vam->ofp, "%=20d%=30U%=16U%=16d%=16d%=16U"
2508 "%=16d%=16d%=16sd=16d%=16s%=16s\n",
2509 mp->tunnels,
2510 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2511 mp->source_ip,
2512 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2513 mp->destination_ip,
2514 ntohl (mp->encap_fib_id),
2515 ntohl (mp->decap_fib_id),
2516 format_decap_next, ntohl (mp->dcap_next),
2517 mp->ver_res >> 6,
2518 flag_str, mp->next_protocol, mp->ver_res, mp->res, iid_str);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002519
Dave Barach72d72232016-08-04 10:15:08 -04002520 vec_free (iid_str);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002521}
2522
2523static void
Dave Barach72d72232016-08-04 10:15:08 -04002524 vl_api_lisp_gpe_tunnel_details_t_handler_json
2525 (vl_api_lisp_gpe_tunnel_details_t * mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002526{
Dave Barach72d72232016-08-04 10:15:08 -04002527 vat_main_t *vam = &vat_main;
2528 vat_json_node_t *node = NULL;
2529 struct in6_addr ip6;
2530 struct in_addr ip4;
2531 u8 *next_decap_str;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002532
Dave Barach72d72232016-08-04 10:15:08 -04002533 next_decap_str = format (0, "%U", format_decap_next, htonl (mp->dcap_next));
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002534
Dave Barach72d72232016-08-04 10:15:08 -04002535 if (VAT_JSON_ARRAY != vam->json_tree.type)
2536 {
2537 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2538 vat_json_init_array (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002539 }
Dave Barach72d72232016-08-04 10:15:08 -04002540 node = vat_json_array_add (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002541
Dave Barach72d72232016-08-04 10:15:08 -04002542 vat_json_init_object (node);
2543 vat_json_object_add_uint (node, "tunel", mp->tunnels);
2544 if (mp->is_ipv6)
2545 {
2546 clib_memcpy (&ip6, mp->source_ip, sizeof (ip6));
2547 vat_json_object_add_ip6 (node, "source address", ip6);
2548 clib_memcpy (&ip6, mp->destination_ip, sizeof (ip6));
2549 vat_json_object_add_ip6 (node, "destination address", ip6);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002550 }
Dave Barach72d72232016-08-04 10:15:08 -04002551 else
2552 {
2553 clib_memcpy (&ip4, mp->source_ip, sizeof (ip4));
2554 vat_json_object_add_ip4 (node, "source address", ip4);
2555 clib_memcpy (&ip4, mp->destination_ip, sizeof (ip4));
2556 vat_json_object_add_ip4 (node, "destination address", ip4);
2557 }
2558 vat_json_object_add_uint (node, "fib encap", ntohl (mp->encap_fib_id));
2559 vat_json_object_add_uint (node, "fib decap", ntohl (mp->decap_fib_id));
2560 vat_json_object_add_string_copy (node, "decap next", next_decap_str);
2561 vat_json_object_add_uint (node, "lisp version", mp->ver_res >> 6);
2562 vat_json_object_add_uint (node, "flags", mp->flags);
2563 vat_json_object_add_uint (node, "next protocol", mp->next_protocol);
2564 vat_json_object_add_uint (node, "ver_res", mp->ver_res);
2565 vat_json_object_add_uint (node, "res", mp->res);
2566 vat_json_object_add_uint (node, "iid", ntohl (mp->iid));
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002567
Dave Barach72d72232016-08-04 10:15:08 -04002568 vec_free (next_decap_str);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002569}
2570
2571static void
Filip Tehlar69a9b762016-09-23 10:00:52 +02002572 vl_api_lisp_adjacencies_get_reply_t_handler
2573 (vl_api_lisp_adjacencies_get_reply_t * mp)
2574{
2575 vat_main_t *vam = &vat_main;
2576 u32 i, n;
2577 int retval = clib_net_to_host_u32 (mp->retval);
2578 vl_api_lisp_adjacency_t *a;
2579
2580 if (retval)
2581 goto end;
2582
2583 n = clib_net_to_host_u32 (mp->count);
2584
2585 for (i = 0; i < n; i++)
2586 {
2587 a = &mp->adjacencies[i];
2588 fformat (vam->ofp, "%U %40U\n",
2589 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
2590 format_lisp_flat_eid, a->eid_type, a->reid,
2591 a->reid_prefix_len);
2592 }
2593
2594end:
2595 vam->retval = retval;
2596 vam->result_ready = 1;
2597}
2598
2599static void
2600 vl_api_lisp_adjacencies_get_reply_t_handler_json
2601 (vl_api_lisp_adjacencies_get_reply_t * mp)
2602{
2603 u8 *s = 0;
2604 vat_main_t *vam = &vat_main;
2605 vat_json_node_t *e = 0, root;
2606 u32 i, n;
2607 int retval = clib_net_to_host_u32 (mp->retval);
2608 vl_api_lisp_adjacency_t *a;
2609
2610 if (retval)
2611 goto end;
2612
2613 n = clib_net_to_host_u32 (mp->count);
2614 vat_json_init_array (&root);
2615
2616 for (i = 0; i < n; i++)
2617 {
2618 e = vat_json_array_add (&root);
2619 a = &mp->adjacencies[i];
2620
2621 vat_json_init_object (e);
2622 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
2623 a->leid_prefix_len);
2624 vec_add1 (s, 0);
2625 vat_json_object_add_string_copy (e, "leid", s);
2626 vec_free (s);
2627
2628 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
2629 a->reid_prefix_len);
2630 vec_add1 (s, 0);
2631 vat_json_object_add_string_copy (e, "reid", s);
2632 vec_free (s);
2633 }
2634
2635 vat_json_print (vam->ofp, &root);
2636 vat_json_free (&root);
2637
2638end:
2639 vam->retval = retval;
2640 vam->result_ready = 1;
2641}
2642
2643static void
Dave Barach72d72232016-08-04 10:15:08 -04002644vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t
2645 * mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002646{
Dave Barach72d72232016-08-04 10:15:08 -04002647 vat_main_t *vam = &vat_main;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002648
Dave Barach72d72232016-08-04 10:15:08 -04002649 fformat (vam->ofp, "%=20U\n",
2650 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
2651 mp->ip_address);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002652}
2653
2654static void
Dave Barach72d72232016-08-04 10:15:08 -04002655 vl_api_lisp_map_resolver_details_t_handler_json
2656 (vl_api_lisp_map_resolver_details_t * mp)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002657{
Dave Barach72d72232016-08-04 10:15:08 -04002658 vat_main_t *vam = &vat_main;
2659 vat_json_node_t *node = NULL;
2660 struct in6_addr ip6;
2661 struct in_addr ip4;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002662
Dave Barach72d72232016-08-04 10:15:08 -04002663 if (VAT_JSON_ARRAY != vam->json_tree.type)
2664 {
2665 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2666 vat_json_init_array (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002667 }
Dave Barach72d72232016-08-04 10:15:08 -04002668 node = vat_json_array_add (&vam->json_tree);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002669
Dave Barach72d72232016-08-04 10:15:08 -04002670 vat_json_init_object (node);
2671 if (mp->is_ipv6)
2672 {
2673 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2674 vat_json_object_add_ip6 (node, "map resolver", ip6);
2675 }
2676 else
2677 {
2678 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2679 vat_json_object_add_ip4 (node, "map resolver", ip4);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02002680 }
2681}
2682
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002683static void
Dave Barach72d72232016-08-04 10:15:08 -04002684 vl_api_show_lisp_status_reply_t_handler
2685 (vl_api_show_lisp_status_reply_t * mp)
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002686{
Dave Barach72d72232016-08-04 10:15:08 -04002687 vat_main_t *vam = &vat_main;
2688 i32 retval = ntohl (mp->retval);
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002689
Dave Barach72d72232016-08-04 10:15:08 -04002690 if (0 <= retval)
2691 {
2692 fformat (vam->ofp, "feature: %s\ngpe: %s\n",
2693 mp->feature_status ? "enabled" : "disabled",
2694 mp->gpe_status ? "enabled" : "disabled");
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002695 }
2696
Dave Barach72d72232016-08-04 10:15:08 -04002697 vam->retval = retval;
2698 vam->result_ready = 1;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002699}
2700
2701static void
Dave Barach72d72232016-08-04 10:15:08 -04002702 vl_api_show_lisp_status_reply_t_handler_json
2703 (vl_api_show_lisp_status_reply_t * mp)
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002704{
Dave Barach72d72232016-08-04 10:15:08 -04002705 vat_main_t *vam = &vat_main;
2706 vat_json_node_t node;
2707 u8 *gpe_status = NULL;
2708 u8 *feature_status = NULL;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002709
Dave Barach72d72232016-08-04 10:15:08 -04002710 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
2711 feature_status = format (0, "%s",
2712 mp->feature_status ? "enabled" : "disabled");
2713 vec_add1 (gpe_status, 0);
2714 vec_add1 (feature_status, 0);
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002715
Dave Barach72d72232016-08-04 10:15:08 -04002716 vat_json_init_object (&node);
2717 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
2718 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
Filip Tehlar46d4e362016-05-09 09:39:26 +02002719
Dave Barach72d72232016-08-04 10:15:08 -04002720 vec_free (gpe_status);
2721 vec_free (feature_status);
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002722
Dave Barach72d72232016-08-04 10:15:08 -04002723 vat_json_print (vam->ofp, &node);
2724 vat_json_free (&node);
Andrej Kozemcakd9831182016-06-20 08:47:57 +02002725
Dave Barach72d72232016-08-04 10:15:08 -04002726 vam->retval = ntohl (mp->retval);
2727 vam->result_ready = 1;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02002728}
2729
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002730static void
Dave Barach72d72232016-08-04 10:15:08 -04002731 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler
2732 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002733{
Dave Barach72d72232016-08-04 10:15:08 -04002734 vat_main_t *vam = &vat_main;
2735 i32 retval = ntohl (mp->retval);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002736
Dave Barach72d72232016-08-04 10:15:08 -04002737 if (retval >= 0)
2738 {
2739 fformat (vam->ofp, "%=20s\n", mp->locator_set_name);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002740 }
2741
Dave Barach72d72232016-08-04 10:15:08 -04002742 vam->retval = retval;
2743 vam->result_ready = 1;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002744}
2745
2746static void
Dave Barach72d72232016-08-04 10:15:08 -04002747 vl_api_lisp_get_map_request_itr_rlocs_reply_t_handler_json
2748 (vl_api_lisp_get_map_request_itr_rlocs_reply_t * mp)
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002749{
Dave Barach72d72232016-08-04 10:15:08 -04002750 vat_main_t *vam = &vat_main;
2751 vat_json_node_t *node = NULL;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002752
Dave Barach72d72232016-08-04 10:15:08 -04002753 if (VAT_JSON_ARRAY != vam->json_tree.type)
2754 {
2755 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2756 vat_json_init_array (&vam->json_tree);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002757 }
Dave Barach72d72232016-08-04 10:15:08 -04002758 node = vat_json_array_add (&vam->json_tree);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002759
Dave Barach72d72232016-08-04 10:15:08 -04002760 vat_json_init_object (node);
2761 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002762
Dave Barach72d72232016-08-04 10:15:08 -04002763 vat_json_print (vam->ofp, node);
2764 vat_json_free (node);
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002765
Dave Barach72d72232016-08-04 10:15:08 -04002766 vam->retval = ntohl (mp->retval);
2767 vam->result_ready = 1;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02002768}
2769
Florin Corasdca88042016-09-14 16:01:38 +02002770static u8 *
2771format_lisp_map_request_mode (u8 * s, va_list * args)
2772{
2773 u32 mode = va_arg (*args, u32);
2774
2775 switch (mode)
2776 {
2777 case 0:
2778 return format (0, "dst-only");
2779 case 1:
2780 return format (0, "src-dst");
2781 }
2782 return 0;
2783}
2784
2785static void
2786 vl_api_show_lisp_map_request_mode_reply_t_handler
2787 (vl_api_show_lisp_map_request_mode_reply_t * mp)
2788{
2789 vat_main_t *vam = &vat_main;
2790 i32 retval = ntohl (mp->retval);
2791
2792 if (0 <= retval)
2793 {
2794 u32 mode = mp->mode;
2795 fformat (vam->ofp, "map_request_mode: %U\n",
2796 format_lisp_map_request_mode, mode);
2797 }
2798
2799 vam->retval = retval;
2800 vam->result_ready = 1;
2801}
2802
2803static void
2804 vl_api_show_lisp_map_request_mode_reply_t_handler_json
2805 (vl_api_show_lisp_map_request_mode_reply_t * mp)
2806{
2807 vat_main_t *vam = &vat_main;
2808 vat_json_node_t node;
2809 u8 *s = 0;
2810 u32 mode;
2811
2812 mode = mp->mode;
2813 s = format (0, "%U", format_lisp_map_request_mode, mode);
2814 vec_add1 (s, 0);
2815
2816 vat_json_init_object (&node);
2817 vat_json_object_add_string_copy (&node, "map_request_mode", s);
2818 vat_json_print (vam->ofp, &node);
2819 vat_json_free (&node);
2820
2821 vec_free (s);
2822 vam->retval = ntohl (mp->retval);
2823 vam->result_ready = 1;
2824}
2825
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002826static void
2827vl_api_show_lisp_pitr_reply_t_handler (vl_api_show_lisp_pitr_reply_t * mp)
2828{
Dave Barach72d72232016-08-04 10:15:08 -04002829 vat_main_t *vam = &vat_main;
2830 i32 retval = ntohl (mp->retval);
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002831
Dave Barach72d72232016-08-04 10:15:08 -04002832 if (0 <= retval)
2833 {
2834 fformat (vam->ofp, "%-20s%-16s\n",
2835 mp->status ? "enabled" : "disabled",
2836 mp->status ? (char *) mp->locator_set_name : "");
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002837 }
2838
Dave Barach72d72232016-08-04 10:15:08 -04002839 vam->retval = retval;
2840 vam->result_ready = 1;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002841}
2842
2843static void
Dave Barach72d72232016-08-04 10:15:08 -04002844vl_api_show_lisp_pitr_reply_t_handler_json (vl_api_show_lisp_pitr_reply_t *
2845 mp)
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002846{
Dave Barach72d72232016-08-04 10:15:08 -04002847 vat_main_t *vam = &vat_main;
2848 vat_json_node_t node;
2849 u8 *status = 0;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002850
Dave Barach72d72232016-08-04 10:15:08 -04002851 status = format (0, "%s", mp->status ? "enabled" : "disabled");
2852 vec_add1 (status, 0);
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002853
Dave Barach72d72232016-08-04 10:15:08 -04002854 vat_json_init_object (&node);
2855 vat_json_object_add_string_copy (&node, "status", status);
2856 if (mp->status)
2857 {
2858 vat_json_object_add_string_copy (&node, "locator_set",
2859 mp->locator_set_name);
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002860 }
2861
Dave Barach72d72232016-08-04 10:15:08 -04002862 vec_free (status);
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002863
Dave Barach72d72232016-08-04 10:15:08 -04002864 vat_json_print (vam->ofp, &node);
2865 vat_json_free (&node);
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002866
Dave Barach72d72232016-08-04 10:15:08 -04002867 vam->retval = ntohl (mp->retval);
2868 vam->result_ready = 1;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02002869}
2870
Dave Barach72d72232016-08-04 10:15:08 -04002871static u8 *
2872format_policer_type (u8 * s, va_list * va)
Matus Fabiane8554802016-05-18 23:40:37 -07002873{
Dave Barach72d72232016-08-04 10:15:08 -04002874 u32 i = va_arg (*va, u32);
Matus Fabiane8554802016-05-18 23:40:37 -07002875
Dave Barach72d72232016-08-04 10:15:08 -04002876 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
2877 s = format (s, "1r2c");
2878 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
2879 s = format (s, "1r3c");
2880 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
2881 s = format (s, "2r3c-2698");
2882 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
2883 s = format (s, "2r3c-4115");
2884 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
2885 s = format (s, "2r3c-mef5cf1");
2886 else
2887 s = format (s, "ILLEGAL");
Matus Fabiane8554802016-05-18 23:40:37 -07002888 return s;
2889}
2890
Dave Barach72d72232016-08-04 10:15:08 -04002891static u8 *
2892format_policer_rate_type (u8 * s, va_list * va)
Matus Fabian4ac74c92016-05-31 07:33:29 -07002893{
2894 u32 i = va_arg (*va, u32);
Matus Fabian4ac74c92016-05-31 07:33:29 -07002895
Dave Barach72d72232016-08-04 10:15:08 -04002896 if (i == SSE2_QOS_RATE_KBPS)
2897 s = format (s, "kbps");
2898 else if (i == SSE2_QOS_RATE_PPS)
2899 s = format (s, "pps");
2900 else
2901 s = format (s, "ILLEGAL");
2902 return s;
2903}
2904
2905static u8 *
2906format_policer_round_type (u8 * s, va_list * va)
2907{
2908 u32 i = va_arg (*va, u32);
2909
2910 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
2911 s = format (s, "closest");
2912 else if (i == SSE2_QOS_ROUND_TO_UP)
2913 s = format (s, "up");
2914 else if (i == SSE2_QOS_ROUND_TO_DOWN)
2915 s = format (s, "down");
2916 else
2917 s = format (s, "ILLEGAL");
2918 return s;
2919}
2920
2921static u8 *
2922format_policer_action_type (u8 * s, va_list * va)
2923{
2924 u32 i = va_arg (*va, u32);
2925
2926 if (i == SSE2_QOS_ACTION_DROP)
2927 s = format (s, "drop");
2928 else if (i == SSE2_QOS_ACTION_TRANSMIT)
2929 s = format (s, "transmit");
2930 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2931 s = format (s, "mark-and-transmit");
2932 else
2933 s = format (s, "ILLEGAL");
2934 return s;
2935}
2936
2937static u8 *
2938format_dscp (u8 * s, va_list * va)
2939{
2940 u32 i = va_arg (*va, u32);
2941 char *t = 0;
2942
2943 switch (i)
2944 {
2945#define _(v,f,str) case VNET_DSCP_##f: t = str; break;
2946 foreach_vnet_dscp
2947#undef _
Matus Fabian4ac74c92016-05-31 07:33:29 -07002948 default:
2949 return format (s, "ILLEGAL");
Dave Barach72d72232016-08-04 10:15:08 -04002950 }
Matus Fabian4ac74c92016-05-31 07:33:29 -07002951 s = format (s, "%s", t);
2952 return s;
2953}
2954
Dave Barach72d72232016-08-04 10:15:08 -04002955static void
2956vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
Matus Fabiane8554802016-05-18 23:40:37 -07002957{
Dave Barach72d72232016-08-04 10:15:08 -04002958 vat_main_t *vam = &vat_main;
2959 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
Matus Fabian4ac74c92016-05-31 07:33:29 -07002960
Dave Barach72d72232016-08-04 10:15:08 -04002961 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2962 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
2963 else
2964 conform_dscp_str = format (0, "");
Matus Fabian4ac74c92016-05-31 07:33:29 -07002965
Dave Barach72d72232016-08-04 10:15:08 -04002966 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2967 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
2968 else
2969 exceed_dscp_str = format (0, "");
Matus Fabian4ac74c92016-05-31 07:33:29 -07002970
Dave Barach72d72232016-08-04 10:15:08 -04002971 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
2972 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
2973 else
2974 violate_dscp_str = format (0, "");
Matus Fabiane8554802016-05-18 23:40:37 -07002975
Dave Barach72d72232016-08-04 10:15:08 -04002976 fformat (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
2977 "rate type %U, round type %U, %s rate, %s color-aware, "
2978 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
2979 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
2980 "conform action %U%s, exceed action %U%s, violate action %U%s\n",
2981 mp->name,
2982 format_policer_type, mp->type,
2983 ntohl (mp->cir),
2984 ntohl (mp->eir),
2985 clib_net_to_host_u64 (mp->cb),
2986 clib_net_to_host_u64 (mp->eb),
2987 format_policer_rate_type, mp->rate_type,
2988 format_policer_round_type, mp->round_type,
2989 mp->single_rate ? "single" : "dual",
2990 mp->color_aware ? "is" : "not",
2991 ntohl (mp->cir_tokens_per_period),
2992 ntohl (mp->pir_tokens_per_period),
2993 ntohl (mp->scale),
2994 ntohl (mp->current_limit),
2995 ntohl (mp->current_bucket),
2996 ntohl (mp->extended_limit),
2997 ntohl (mp->extended_bucket),
2998 clib_net_to_host_u64 (mp->last_update_time),
2999 format_policer_action_type, mp->conform_action_type,
3000 conform_dscp_str,
3001 format_policer_action_type, mp->exceed_action_type,
3002 exceed_dscp_str,
3003 format_policer_action_type, mp->violate_action_type,
3004 violate_dscp_str);
Matus Fabian4ac74c92016-05-31 07:33:29 -07003005
Dave Barach72d72232016-08-04 10:15:08 -04003006 vec_free (conform_dscp_str);
3007 vec_free (exceed_dscp_str);
3008 vec_free (violate_dscp_str);
Matus Fabiane8554802016-05-18 23:40:37 -07003009}
3010
3011static void vl_api_policer_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04003012 (vl_api_policer_details_t * mp)
Matus Fabiane8554802016-05-18 23:40:37 -07003013{
Dave Barach72d72232016-08-04 10:15:08 -04003014 vat_main_t *vam = &vat_main;
3015 vat_json_node_t *node;
3016 u8 *rate_type_str, *round_type_str, *type_str;
3017 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
Matus Fabiane8554802016-05-18 23:40:37 -07003018
Dave Barach72d72232016-08-04 10:15:08 -04003019 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
3020 round_type_str =
3021 format (0, "%U", format_policer_round_type, mp->round_type);
3022 type_str = format (0, "%U", format_policer_type, mp->type);
3023 conform_action_str = format (0, "%U", format_policer_action_type,
3024 mp->conform_action_type);
3025 exceed_action_str = format (0, "%U", format_policer_action_type,
3026 mp->exceed_action_type);
3027 violate_action_str = format (0, "%U", format_policer_action_type,
3028 mp->violate_action_type);
Matus Fabiane8554802016-05-18 23:40:37 -07003029
Dave Barach72d72232016-08-04 10:15:08 -04003030 if (VAT_JSON_ARRAY != vam->json_tree.type)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003031 {
Dave Barach72d72232016-08-04 10:15:08 -04003032 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3033 vat_json_init_array (&vam->json_tree);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003034 }
Dave Barach72d72232016-08-04 10:15:08 -04003035 node = vat_json_array_add (&vam->json_tree);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003036
Dave Barach72d72232016-08-04 10:15:08 -04003037 vat_json_init_object (node);
3038 vat_json_object_add_string_copy (node, "name", mp->name);
3039 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
3040 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
3041 vat_json_object_add_uint (node, "cb", ntohl (mp->cb));
3042 vat_json_object_add_uint (node, "eb", ntohl (mp->eb));
3043 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
3044 vat_json_object_add_string_copy (node, "round_type", round_type_str);
3045 vat_json_object_add_string_copy (node, "type", type_str);
3046 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
3047 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
3048 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
3049 vat_json_object_add_uint (node, "cir_tokens_per_period",
3050 ntohl (mp->cir_tokens_per_period));
3051 vat_json_object_add_uint (node, "eir_tokens_per_period",
3052 ntohl (mp->pir_tokens_per_period));
3053 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
3054 vat_json_object_add_uint (node, "current_bucket",
3055 ntohl (mp->current_bucket));
3056 vat_json_object_add_uint (node, "extended_limit",
3057 ntohl (mp->extended_limit));
3058 vat_json_object_add_uint (node, "extended_bucket",
3059 ntohl (mp->extended_bucket));
3060 vat_json_object_add_uint (node, "last_update_time",
3061 ntohl (mp->last_update_time));
3062 vat_json_object_add_string_copy (node, "conform_action",
3063 conform_action_str);
3064 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3065 {
3066 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
3067 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
3068 vec_free (dscp_str);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003069 }
Dave Barach72d72232016-08-04 10:15:08 -04003070 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
3071 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3072 {
3073 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
3074 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
3075 vec_free (dscp_str);
3076 }
3077 vat_json_object_add_string_copy (node, "violate_action",
3078 violate_action_str);
3079 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
3080 {
3081 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
3082 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
3083 vec_free (dscp_str);
3084 }
3085
3086 vec_free (rate_type_str);
3087 vec_free (round_type_str);
3088 vec_free (type_str);
3089 vec_free (conform_action_str);
3090 vec_free (exceed_action_str);
3091 vec_free (violate_action_str);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003092}
3093
Dave Barach72d72232016-08-04 10:15:08 -04003094static void
3095vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
3096 mp)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003097{
Dave Barach72d72232016-08-04 10:15:08 -04003098 vat_main_t *vam = &vat_main;
3099 int i, count = ntohl (mp->count);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003100
Dave Barach72d72232016-08-04 10:15:08 -04003101 if (count > 0)
3102 fformat (vam->ofp, "classify table ids (%d) : ", count);
3103 for (i = 0; i < count; i++)
3104 {
3105 fformat (vam->ofp, "%d", ntohl (mp->ids[i]));
3106 fformat (vam->ofp, (i < count - 1) ? "," : "\n");
3107 }
3108 vam->retval = ntohl (mp->retval);
3109 vam->result_ready = 1;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003110}
3111
Dave Barach72d72232016-08-04 10:15:08 -04003112static void
3113 vl_api_classify_table_ids_reply_t_handler_json
3114 (vl_api_classify_table_ids_reply_t * mp)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003115{
Dave Barach72d72232016-08-04 10:15:08 -04003116 vat_main_t *vam = &vat_main;
3117 int i, count = ntohl (mp->count);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003118
Dave Barach72d72232016-08-04 10:15:08 -04003119 if (count > 0)
3120 {
3121 vat_json_node_t node;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003122
Dave Barach72d72232016-08-04 10:15:08 -04003123 vat_json_init_object (&node);
3124 for (i = 0; i < count; i++)
3125 {
3126 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
3127 }
3128 vat_json_print (vam->ofp, &node);
3129 vat_json_free (&node);
3130 }
3131 vam->retval = ntohl (mp->retval);
3132 vam->result_ready = 1;
3133}
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003134
Dave Barach72d72232016-08-04 10:15:08 -04003135static void
3136 vl_api_classify_table_by_interface_reply_t_handler
3137 (vl_api_classify_table_by_interface_reply_t * mp)
3138{
3139 vat_main_t *vam = &vat_main;
3140 u32 table_id;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003141
Dave Barach72d72232016-08-04 10:15:08 -04003142 table_id = ntohl (mp->l2_table_id);
3143 if (table_id != ~0)
3144 fformat (vam->ofp, "l2 table id : %d\n", table_id);
3145 else
3146 fformat (vam->ofp, "l2 table id : No input ACL tables configured\n");
3147 table_id = ntohl (mp->ip4_table_id);
3148 if (table_id != ~0)
3149 fformat (vam->ofp, "ip4 table id : %d\n", table_id);
3150 else
3151 fformat (vam->ofp, "ip4 table id : No input ACL tables configured\n");
3152 table_id = ntohl (mp->ip6_table_id);
3153 if (table_id != ~0)
3154 fformat (vam->ofp, "ip6 table id : %d\n", table_id);
3155 else
3156 fformat (vam->ofp, "ip6 table id : No input ACL tables configured\n");
3157 vam->retval = ntohl (mp->retval);
3158 vam->result_ready = 1;
3159}
3160
3161static void
3162 vl_api_classify_table_by_interface_reply_t_handler_json
3163 (vl_api_classify_table_by_interface_reply_t * mp)
3164{
3165 vat_main_t *vam = &vat_main;
3166 vat_json_node_t node;
3167
3168 vat_json_init_object (&node);
3169
3170 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
3171 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
3172 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
3173
3174 vat_json_print (vam->ofp, &node);
3175 vat_json_free (&node);
3176
3177 vam->retval = ntohl (mp->retval);
3178 vam->result_ready = 1;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003179}
3180
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003181static void vl_api_policer_add_del_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04003182 (vl_api_policer_add_del_reply_t * mp)
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003183{
Dave Barach72d72232016-08-04 10:15:08 -04003184 vat_main_t *vam = &vat_main;
3185 i32 retval = ntohl (mp->retval);
3186 if (vam->async_mode)
3187 {
3188 vam->async_errors += (retval < 0);
3189 }
3190 else
3191 {
3192 vam->retval = retval;
3193 vam->result_ready = 1;
3194 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
3195 /*
3196 * Note: this is just barely thread-safe, depends on
3197 * the main thread spinning waiting for an answer...
3198 */
3199 errmsg ("policer index %d\n", ntohl (mp->policer_index));
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003200 }
3201}
3202
3203static void vl_api_policer_add_del_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04003204 (vl_api_policer_add_del_reply_t * mp)
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003205{
Dave Barach72d72232016-08-04 10:15:08 -04003206 vat_main_t *vam = &vat_main;
3207 vat_json_node_t node;
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003208
Dave Barach72d72232016-08-04 10:15:08 -04003209 vat_json_init_object (&node);
3210 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3211 vat_json_object_add_uint (&node, "policer_index",
3212 ntohl (mp->policer_index));
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003213
Dave Barach72d72232016-08-04 10:15:08 -04003214 vat_json_print (vam->ofp, &node);
3215 vat_json_free (&node);
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003216
Dave Barach72d72232016-08-04 10:15:08 -04003217 vam->retval = ntohl (mp->retval);
3218 vam->result_ready = 1;
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003219}
3220
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003221/* Format hex dump. */
Dave Barach72d72232016-08-04 10:15:08 -04003222u8 *
3223format_hex_bytes (u8 * s, va_list * va)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003224{
Dave Barach72d72232016-08-04 10:15:08 -04003225 u8 *bytes = va_arg (*va, u8 *);
3226 int n_bytes = va_arg (*va, int);
3227 uword i;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003228
Dave Barach72d72232016-08-04 10:15:08 -04003229 /* Print short or long form depending on byte count. */
3230 uword short_form = n_bytes <= 32;
3231 uword indent = format_get_indent (s);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003232
Dave Barach72d72232016-08-04 10:15:08 -04003233 if (n_bytes == 0)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003234 return s;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003235
Dave Barach72d72232016-08-04 10:15:08 -04003236 for (i = 0; i < n_bytes; i++)
3237 {
3238 if (!short_form && (i % 32) == 0)
3239 s = format (s, "%08x: ", i);
3240 s = format (s, "%02x", bytes[i]);
3241 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
3242 s = format (s, "\n%U", format_white_space, indent);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003243 }
Dave Barach72d72232016-08-04 10:15:08 -04003244
3245 return s;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003246}
3247
Dave Barach72d72232016-08-04 10:15:08 -04003248static void
3249vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
3250 * mp)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003251{
Dave Barach72d72232016-08-04 10:15:08 -04003252 vat_main_t *vam = &vat_main;
3253 i32 retval = ntohl (mp->retval);
3254 if (retval == 0)
3255 {
3256 fformat (vam->ofp, "classify table info :\n");
3257 fformat (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d\n",
3258 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
3259 ntohl (mp->miss_next_index));
3260 fformat (vam->ofp, "nbuckets: %d skip: %d match: %d\n",
3261 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
3262 ntohl (mp->match_n_vectors));
3263 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->mask,
3264 ntohl (mp->mask_length));
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003265 }
Dave Barach72d72232016-08-04 10:15:08 -04003266 vam->retval = retval;
3267 vam->result_ready = 1;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003268}
3269
Dave Barach72d72232016-08-04 10:15:08 -04003270static void
3271 vl_api_classify_table_info_reply_t_handler_json
3272 (vl_api_classify_table_info_reply_t * mp)
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003273{
Dave Barach72d72232016-08-04 10:15:08 -04003274 vat_main_t *vam = &vat_main;
3275 vat_json_node_t node;
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003276
Dave Barach72d72232016-08-04 10:15:08 -04003277 i32 retval = ntohl (mp->retval);
3278 if (retval == 0)
3279 {
3280 vat_json_init_object (&node);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003281
Dave Barach72d72232016-08-04 10:15:08 -04003282 vat_json_object_add_int (&node, "sessions",
3283 ntohl (mp->active_sessions));
3284 vat_json_object_add_int (&node, "nexttbl",
3285 ntohl (mp->next_table_index));
3286 vat_json_object_add_int (&node, "nextnode",
3287 ntohl (mp->miss_next_index));
3288 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
3289 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
3290 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
3291 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
3292 ntohl (mp->mask_length), 0);
3293 vat_json_object_add_string_copy (&node, "mask", s);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003294
Dave Barach72d72232016-08-04 10:15:08 -04003295 vat_json_print (vam->ofp, &node);
3296 vat_json_free (&node);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003297 }
Dave Barach72d72232016-08-04 10:15:08 -04003298 vam->retval = ntohl (mp->retval);
3299 vam->result_ready = 1;
3300}
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003301
Dave Barach72d72232016-08-04 10:15:08 -04003302static void
3303vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
3304 mp)
3305{
3306 vat_main_t *vam = &vat_main;
3307
3308 fformat (vam->ofp, "next_index: %d advance: %d opaque: %d ",
3309 ntohl (mp->hit_next_index), ntohl (mp->advance),
3310 ntohl (mp->opaque_index));
3311 fformat (vam->ofp, "mask: %U\n", format_hex_bytes, mp->match,
3312 ntohl (mp->match_length));
3313}
3314
3315static void
3316 vl_api_classify_session_details_t_handler_json
3317 (vl_api_classify_session_details_t * mp)
3318{
3319 vat_main_t *vam = &vat_main;
3320 vat_json_node_t *node = NULL;
3321
3322 if (VAT_JSON_ARRAY != vam->json_tree.type)
3323 {
3324 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3325 vat_json_init_array (&vam->json_tree);
3326 }
3327 node = vat_json_array_add (&vam->json_tree);
3328
3329 vat_json_init_object (node);
3330 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
3331 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
3332 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
3333 u8 *s =
3334 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
3335 0);
3336 vat_json_object_add_string_copy (node, "match", s);
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003337}
Matus Fabiane8554802016-05-18 23:40:37 -07003338
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003339static void vl_api_pg_create_interface_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04003340 (vl_api_pg_create_interface_reply_t * mp)
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003341{
Dave Barach72d72232016-08-04 10:15:08 -04003342 vat_main_t *vam = &vat_main;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003343
Dave Barach72d72232016-08-04 10:15:08 -04003344 vam->retval = ntohl (mp->retval);
3345 vam->result_ready = 1;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003346}
3347
3348static void vl_api_pg_create_interface_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04003349 (vl_api_pg_create_interface_reply_t * mp)
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003350{
Dave Barach72d72232016-08-04 10:15:08 -04003351 vat_main_t *vam = &vat_main;
3352 vat_json_node_t node;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003353
Dave Barach72d72232016-08-04 10:15:08 -04003354 i32 retval = ntohl (mp->retval);
3355 if (retval == 0)
3356 {
3357 vat_json_init_object (&node);
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003358
Dave Barach72d72232016-08-04 10:15:08 -04003359 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003360
Dave Barach72d72232016-08-04 10:15:08 -04003361 vat_json_print (vam->ofp, &node);
3362 vat_json_free (&node);
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003363 }
Dave Barach72d72232016-08-04 10:15:08 -04003364 vam->retval = ntohl (mp->retval);
3365 vam->result_ready = 1;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003366}
3367
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003368static void vl_api_policer_classify_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04003369 (vl_api_policer_classify_details_t * mp)
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003370{
Dave Barach72d72232016-08-04 10:15:08 -04003371 vat_main_t *vam = &vat_main;
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003372
Dave Barach72d72232016-08-04 10:15:08 -04003373 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3374 ntohl (mp->table_index));
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003375}
3376
3377static void vl_api_policer_classify_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04003378 (vl_api_policer_classify_details_t * mp)
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003379{
Dave Barach72d72232016-08-04 10:15:08 -04003380 vat_main_t *vam = &vat_main;
3381 vat_json_node_t *node;
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003382
Dave Barach72d72232016-08-04 10:15:08 -04003383 if (VAT_JSON_ARRAY != vam->json_tree.type)
3384 {
3385 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3386 vat_json_init_array (&vam->json_tree);
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003387 }
Dave Barach72d72232016-08-04 10:15:08 -04003388 node = vat_json_array_add (&vam->json_tree);
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003389
Dave Barach72d72232016-08-04 10:15:08 -04003390 vat_json_init_object (node);
3391 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3392 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003393}
3394
Matus Fabian694265d2016-08-10 01:55:36 -07003395static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
3396 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3397{
3398 vat_main_t *vam = &vat_main;
3399 i32 retval = ntohl (mp->retval);
3400 if (vam->async_mode)
3401 {
3402 vam->async_errors += (retval < 0);
3403 }
3404 else
3405 {
3406 vam->retval = retval;
3407 vam->sw_if_index = ntohl (mp->sw_if_index);
3408 vam->result_ready = 1;
3409 }
3410}
3411
3412static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
3413 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
3414{
3415 vat_main_t *vam = &vat_main;
3416 vat_json_node_t node;
3417
3418 vat_json_init_object (&node);
3419 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
3420 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
3421
3422 vat_json_print (vam->ofp, &node);
3423 vat_json_free (&node);
3424
3425 vam->retval = ntohl (mp->retval);
3426 vam->result_ready = 1;
3427}
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003428
Juraj Sloboda506b2452016-08-07 23:45:24 -07003429static void vl_api_flow_classify_details_t_handler
3430 (vl_api_flow_classify_details_t * mp)
3431{
3432 vat_main_t *vam = &vat_main;
3433
3434 fformat (vam->ofp, "%10d%20d\n", ntohl (mp->sw_if_index),
3435 ntohl (mp->table_index));
3436}
3437
3438static void vl_api_flow_classify_details_t_handler_json
3439 (vl_api_flow_classify_details_t * mp)
3440{
3441 vat_main_t *vam = &vat_main;
3442 vat_json_node_t *node;
3443
3444 if (VAT_JSON_ARRAY != vam->json_tree.type)
3445 {
3446 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3447 vat_json_init_array (&vam->json_tree);
3448 }
3449 node = vat_json_array_add (&vam->json_tree);
3450
3451 vat_json_init_object (node);
3452 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
3453 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
3454}
3455
3456
3457
Ed Warnickecb9cada2015-12-08 15:45:58 -07003458#define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler
3459#define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler
3460#define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler
3461#define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler
Filip Tehlar69a9b762016-09-23 10:00:52 +02003462#define vl_api_lisp_adjacencies_get_reply_t_endian vl_noop_handler
3463#define vl_api_lisp_adjacencies_get_reply_t_print vl_noop_handler
Ed Warnickecb9cada2015-12-08 15:45:58 -07003464
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08003465/*
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003466 * Generate boilerplate reply handlers, which
Ed Warnickecb9cada2015-12-08 15:45:58 -07003467 * dig the return value out of the xxx_reply_t API message,
3468 * stick it into vam->retval, and set vam->result_ready
3469 *
3470 * Could also do this by pointing N message decode slots at
3471 * a single function, but that could break in subtle ways.
3472 */
3473
3474#define foreach_standard_reply_retval_handler \
3475_(sw_interface_set_flags_reply) \
3476_(sw_interface_add_del_address_reply) \
3477_(sw_interface_set_table_reply) \
John Lo06b14b92016-10-24 20:20:11 -04003478_(sw_interface_set_mpls_enable_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003479_(sw_interface_set_vpath_reply) \
3480_(sw_interface_set_l2_bridge_reply) \
Jasvinder Singh85ecc812016-07-21 17:02:19 +01003481_(sw_interface_set_dpdk_hqos_pipe_reply) \
3482_(sw_interface_set_dpdk_hqos_subport_reply) \
3483_(sw_interface_set_dpdk_hqos_tctbl_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003484_(bridge_domain_add_del_reply) \
3485_(sw_interface_set_l2_xconnect_reply) \
3486_(l2fib_add_del_reply) \
3487_(ip_add_del_route_reply) \
Neale Ranns1357f3b2016-10-16 12:01:42 -07003488_(mpls_route_add_del_reply) \
3489_(mpls_ip_bind_unbind_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003490_(proxy_arp_add_del_reply) \
3491_(proxy_arp_intfc_enable_disable_reply) \
3492_(mpls_add_del_encap_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003493_(mpls_ethernet_add_del_tunnel_2_reply) \
3494_(sw_interface_set_unnumbered_reply) \
3495_(ip_neighbor_add_del_reply) \
3496_(reset_vrf_reply) \
3497_(oam_add_del_reply) \
3498_(reset_fib_reply) \
3499_(dhcp_proxy_config_reply) \
3500_(dhcp_proxy_config_2_reply) \
3501_(dhcp_proxy_set_vss_reply) \
3502_(dhcp_client_config_reply) \
3503_(set_ip_flow_hash_reply) \
3504_(sw_interface_ip6_enable_disable_reply) \
3505_(sw_interface_ip6_set_link_local_address_reply) \
3506_(sw_interface_ip6nd_ra_prefix_reply) \
3507_(sw_interface_ip6nd_ra_config_reply) \
3508_(set_arp_neighbor_limit_reply) \
3509_(l2_patch_add_del_reply) \
3510_(sr_tunnel_add_del_reply) \
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07003511_(sr_policy_add_del_reply) \
Keith Burns (alagalah)94b14422016-05-05 18:16:50 -07003512_(sr_multicast_map_add_del_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003513_(classify_add_del_session_reply) \
3514_(classify_set_interface_ip_table_reply) \
3515_(classify_set_interface_l2_tables_reply) \
3516_(l2tpv3_set_tunnel_cookies_reply) \
3517_(l2tpv3_interface_enable_disable_reply) \
3518_(l2tpv3_set_lookup_key_reply) \
3519_(l2_fib_clear_table_reply) \
3520_(l2_interface_efp_filter_reply) \
3521_(l2_interface_vlan_tag_rewrite_reply) \
3522_(modify_vhost_user_if_reply) \
3523_(delete_vhost_user_if_reply) \
3524_(want_ip4_arp_events_reply) \
John Lo1edfba92016-08-27 01:11:57 -04003525_(want_ip6_nd_events_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003526_(input_acl_set_interface_reply) \
3527_(ipsec_spd_add_del_reply) \
3528_(ipsec_interface_add_del_spd_reply) \
3529_(ipsec_spd_add_del_entry_reply) \
3530_(ipsec_sad_add_del_entry_reply) \
3531_(ipsec_sa_set_key_reply) \
Matus Fabiane5f42fe2016-04-08 11:18:08 +02003532_(ikev2_profile_add_del_reply) \
3533_(ikev2_profile_set_auth_reply) \
3534_(ikev2_profile_set_id_reply) \
3535_(ikev2_profile_set_ts_reply) \
3536_(ikev2_set_local_key_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003537_(delete_loopback_reply) \
3538_(bd_ip_mac_add_del_reply) \
3539_(map_del_domain_reply) \
3540_(map_add_del_rule_reply) \
3541_(want_interface_events_reply) \
Dave Barachc07bf5d2016-02-17 17:52:26 -05003542_(want_stats_reply) \
3543_(cop_interface_enable_disable_reply) \
Pavel Kotucek00bbf272016-03-03 13:27:11 +01003544_(cop_whitelist_enable_disable_reply) \
Shwetha20a64f52016-03-25 10:55:01 +00003545_(sw_interface_clear_stats_reply) \
Vengada Govindan07d2f842016-08-25 10:34:34 -07003546_(ioam_enable_reply) \
3547_(ioam_disable_reply) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003548_(lisp_add_del_locator_reply) \
3549_(lisp_add_del_local_eid_reply) \
Florin Corasf727db92016-06-23 15:01:58 +02003550_(lisp_add_del_remote_mapping_reply) \
3551_(lisp_add_del_adjacency_reply) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003552_(lisp_gpe_add_del_fwd_entry_reply) \
3553_(lisp_add_del_map_resolver_reply) \
Florin Coras577c3552016-04-21 00:45:40 +02003554_(lisp_gpe_enable_disable_reply) \
Matus Fabian8a95a482016-05-06 15:14:13 +02003555_(lisp_gpe_add_del_iface_reply) \
Filip Tehlar46d4e362016-05-09 09:39:26 +02003556_(lisp_enable_disable_reply) \
Filip Tehlar53f09e32016-05-19 14:25:44 +02003557_(lisp_pitr_set_locator_set_reply) \
Florin Corasdca88042016-09-14 16:01:38 +02003558_(lisp_map_request_mode_reply) \
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02003559_(lisp_add_del_map_request_itr_rlocs_reply) \
Filip Tehlar324112f2016-06-02 16:07:38 +02003560_(lisp_eid_table_add_del_map_reply) \
Dave Barach6f9bca22016-04-30 10:25:32 -04003561_(vxlan_gpe_add_del_tunnel_reply) \
Matus Fabian65fcd4d2016-05-13 05:44:48 -07003562_(af_packet_delete_reply) \
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003563_(policer_classify_set_interface_reply) \
Matus Fabian82e29c42016-05-11 04:49:46 -07003564_(netmap_create_reply) \
Juraj Slobodaac645ad2016-07-07 00:18:57 -07003565_(netmap_delete_reply) \
Juraj Slobodaffa652a2016-08-07 23:43:42 -07003566_(set_ipfix_exporter_reply) \
3567_(set_ipfix_classify_stream_reply) \
3568_(ipfix_classify_table_add_del_reply) \
Juraj Sloboda506b2452016-08-07 23:45:24 -07003569_(flow_classify_set_interface_reply) \
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003570_(pg_capture_reply) \
Dave Barach6f9bca22016-04-30 10:25:32 -04003571_(pg_enable_disable_reply) \
3572_(ip_source_and_port_range_check_add_del_reply) \
Pavel Kotucekd85590a2016-08-26 13:35:40 +02003573_(ip_source_and_port_range_check_interface_add_del_reply)\
Pavel Kotucek95300d12016-08-26 16:11:36 +02003574_(delete_subif_reply) \
Alexander Popovsky (apopovsk)4a7e58b2016-10-05 22:31:23 -07003575_(l2_interface_pbb_tag_rewrite_reply) \
3576_(punt_reply)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003577
3578#define _(n) \
3579 static void vl_api_##n##_t_handler \
3580 (vl_api_##n##_t * mp) \
3581 { \
3582 vat_main_t * vam = &vat_main; \
3583 i32 retval = ntohl(mp->retval); \
3584 if (vam->async_mode) { \
3585 vam->async_errors += (retval < 0); \
3586 } else { \
3587 vam->retval = retval; \
3588 vam->result_ready = 1; \
3589 } \
3590 }
3591foreach_standard_reply_retval_handler;
3592#undef _
3593
3594#define _(n) \
3595 static void vl_api_##n##_t_handler_json \
3596 (vl_api_##n##_t * mp) \
3597 { \
3598 vat_main_t * vam = &vat_main; \
3599 vat_json_node_t node; \
3600 vat_json_init_object(&node); \
3601 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
3602 vat_json_print(vam->ofp, &node); \
3603 vam->retval = ntohl(mp->retval); \
3604 vam->result_ready = 1; \
3605 }
3606foreach_standard_reply_retval_handler;
3607#undef _
3608
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08003609/*
Ed Warnickecb9cada2015-12-08 15:45:58 -07003610 * Table of message reply handlers, must include boilerplate handlers
3611 * we just generated
3612 */
3613
3614#define foreach_vpe_api_reply_msg \
3615_(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
3616_(SW_INTERFACE_DETAILS, sw_interface_details) \
3617_(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
3618_(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
3619_(CONTROL_PING_REPLY, control_ping_reply) \
3620_(CLI_REPLY, cli_reply) \
Ole Troanc27213a2016-08-31 14:50:49 +02003621_(CLI_INBAND_REPLY, cli_inband_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003622_(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
3623 sw_interface_add_del_address_reply) \
3624_(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
John Lo06b14b92016-10-24 20:20:11 -04003625_(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003626_(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
3627_(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
3628 sw_interface_set_l2_xconnect_reply) \
3629_(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
3630 sw_interface_set_l2_bridge_reply) \
Jasvinder Singh85ecc812016-07-21 17:02:19 +01003631_(SW_INTERFACE_SET_DPDK_HQOS_PIPE_REPLY, \
3632 sw_interface_set_dpdk_hqos_pipe_reply) \
3633_(SW_INTERFACE_SET_DPDK_HQOS_SUBPORT_REPLY, \
3634 sw_interface_set_dpdk_hqos_subport_reply) \
3635_(SW_INTERFACE_SET_DPDK_HQOS_TCTBL_REPLY, \
3636 sw_interface_set_dpdk_hqos_tctbl_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003637_(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
3638_(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
3639_(BRIDGE_DOMAIN_SW_IF_DETAILS, bridge_domain_sw_if_details) \
3640_(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
3641_(L2_FLAGS_REPLY, l2_flags_reply) \
3642_(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
3643_(TAP_CONNECT_REPLY, tap_connect_reply) \
3644_(TAP_MODIFY_REPLY, tap_modify_reply) \
3645_(TAP_DELETE_REPLY, tap_delete_reply) \
3646_(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \
3647_(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
Neale Ranns1357f3b2016-10-16 12:01:42 -07003648_(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
3649_(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003650_(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
3651_(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
3652 proxy_arp_intfc_enable_disable_reply) \
3653_(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003654_(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \
3655 mpls_ethernet_add_del_tunnel_reply) \
3656_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \
3657 mpls_ethernet_add_del_tunnel_2_reply) \
3658_(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
3659 sw_interface_set_unnumbered_reply) \
3660_(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
3661_(RESET_VRF_REPLY, reset_vrf_reply) \
3662_(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
3663_(CREATE_SUBIF_REPLY, create_subif_reply) \
3664_(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
3665_(RESET_FIB_REPLY, reset_fib_reply) \
3666_(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
3667_(DHCP_PROXY_CONFIG_2_REPLY, dhcp_proxy_config_2_reply) \
3668_(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
3669_(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
3670_(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
3671_(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
3672 sw_interface_ip6_enable_disable_reply) \
3673_(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \
3674 sw_interface_ip6_set_link_local_address_reply) \
3675_(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
3676 sw_interface_ip6nd_ra_prefix_reply) \
3677_(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
3678 sw_interface_ip6nd_ra_config_reply) \
3679_(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
3680_(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
3681_(SR_TUNNEL_ADD_DEL_REPLY, sr_tunnel_add_del_reply) \
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07003682_(SR_POLICY_ADD_DEL_REPLY, sr_policy_add_del_reply) \
3683_(SR_MULTICAST_MAP_ADD_DEL_REPLY, sr_multicast_map_add_del_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003684_(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
3685_(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
3686_(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
3687classify_set_interface_ip_table_reply) \
3688_(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
3689 classify_set_interface_l2_tables_reply) \
3690_(GET_NODE_INDEX_REPLY, get_node_index_reply) \
3691_(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
3692_(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
3693_(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
3694_(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
3695 l2tpv3_interface_enable_disable_reply) \
3696_(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
3697_(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
3698_(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
Dave Wallace60231f32015-12-17 21:04:30 -05003699_(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
Chris Luke27fe48f2016-04-28 13:44:38 -04003700_(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
3701_(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003702_(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
3703_(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
3704_(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
3705_(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
3706_(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
3707_(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
3708_(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
3709_(SHOW_VERSION_REPLY, show_version_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003710_(L2_FIB_TABLE_ENTRY, l2_fib_table_entry) \
Hongjun Ni0e06e2b2016-05-30 19:45:51 +08003711_(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
3712_(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003713_(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
3714_(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
3715_(IP4_ARP_EVENT, ip4_arp_event) \
John Lo1edfba92016-08-27 01:11:57 -04003716_(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
3717_(IP6_ND_EVENT, ip6_nd_event) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003718_(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
3719_(IP_ADDRESS_DETAILS, ip_address_details) \
3720_(IP_DETAILS, ip_details) \
3721_(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
3722_(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
3723_(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \
3724_(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \
3725_(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
Matus Fabiane5f42fe2016-04-08 11:18:08 +02003726_(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \
3727_(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \
3728_(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \
3729_(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \
3730_(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003731_(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
3732_(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
3733_(DHCP_COMPL_EVENT, dhcp_compl_event) \
3734_(VNET_INTERFACE_COUNTERS, vnet_interface_counters) \
3735_(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \
3736_(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \
3737_(MAP_ADD_DOMAIN_REPLY, map_add_domain_reply) \
3738_(MAP_DEL_DOMAIN_REPLY, map_del_domain_reply) \
Dave Barachc07bf5d2016-02-17 17:52:26 -05003739_(MAP_ADD_DEL_RULE_REPLY, map_add_del_rule_reply) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07003740_(MAP_DOMAIN_DETAILS, map_domain_details) \
3741_(MAP_RULE_DETAILS, map_rule_details) \
3742_(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
3743_(WANT_STATS_REPLY, want_stats_reply) \
Dave Barachc07bf5d2016-02-17 17:52:26 -05003744_(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
3745_(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
Dave Barachb44e9bc2016-02-19 09:06:23 -05003746_(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
Pavel Kotucek00bbf272016-03-03 13:27:11 +01003747_(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
Shwetha20a64f52016-03-25 10:55:01 +00003748_(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
Vengada Govindan07d2f842016-08-25 10:34:34 -07003749_(IOAM_ENABLE_REPLY, ioam_enable_reply) \
3750_(IOAM_DISABLE_REPLY, ioam_disable_reply) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003751_(LISP_ADD_DEL_LOCATOR_SET_REPLY, lisp_add_del_locator_set_reply) \
3752_(LISP_ADD_DEL_LOCATOR_REPLY, lisp_add_del_locator_reply) \
3753_(LISP_ADD_DEL_LOCAL_EID_REPLY, lisp_add_del_local_eid_reply) \
Florin Corasf727db92016-06-23 15:01:58 +02003754_(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \
3755_(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003756_(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \
3757_(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \
Florin Coras577c3552016-04-21 00:45:40 +02003758_(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \
Filip Tehlar46d4e362016-05-09 09:39:26 +02003759_(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \
Filip Tehlar53f09e32016-05-19 14:25:44 +02003760_(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \
Florin Corasdca88042016-09-14 16:01:38 +02003761_(LISP_MAP_REQUEST_MODE_REPLY, lisp_map_request_mode_reply) \
Filip Tehlar324112f2016-06-02 16:07:38 +02003762_(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003763_(LISP_GPE_ADD_DEL_IFACE_REPLY, lisp_gpe_add_del_iface_reply) \
3764_(LISP_LOCATOR_SET_DETAILS, lisp_locator_set_details) \
Andrej Kozemcakd9831182016-06-20 08:47:57 +02003765_(LISP_LOCATOR_DETAILS, lisp_locator_details) \
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +02003766_(LISP_EID_TABLE_DETAILS, lisp_eid_table_details) \
Filip Tehlar2f653d02016-07-13 13:17:15 +02003767_(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \
Filip Tehlar50a4e142016-08-24 11:28:02 +02003768_(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +02003769_(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
Andrej Kozemcaka9edd852016-05-02 12:14:33 +02003770_(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
Filip Tehlar69a9b762016-09-23 10:00:52 +02003771_(LISP_ADJACENCIES_GET_REPLY, lisp_adjacencies_get_reply) \
Andrej Kozemcakd9831182016-06-20 08:47:57 +02003772_(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +02003773_(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
3774 lisp_add_del_map_request_itr_rlocs_reply) \
3775_(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
3776 lisp_get_map_request_itr_rlocs_reply) \
Andrej Kozemcak914f91b2016-07-18 13:55:37 +02003777_(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \
Florin Corasdca88042016-09-14 16:01:38 +02003778_(SHOW_LISP_MAP_REQUEST_MODE_REPLY, show_lisp_map_request_mode_reply) \
Matus Fabian8a95a482016-05-06 15:14:13 +02003779_(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
Matus Fabian65fcd4d2016-05-13 05:44:48 -07003780_(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
Matus Fabian82e29c42016-05-11 04:49:46 -07003781_(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
Matus Fabiane8554802016-05-18 23:40:37 -07003782_(POLICER_DETAILS, policer_details) \
Matus Fabian70e6a8d2016-06-20 08:10:42 -07003783_(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
3784_(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
Matus Fabian82e29c42016-05-11 04:49:46 -07003785_(NETMAP_CREATE_REPLY, netmap_create_reply) \
marek zavodsky2c21a9a2016-06-21 05:35:16 +02003786_(NETMAP_DELETE_REPLY, netmap_delete_reply) \
marek zavodsky2c21a9a2016-06-21 05:35:16 +02003787_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
3788_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
Neale Ranns1357f3b2016-10-16 12:01:42 -07003789_(MPLS_FIB_DETAILS, mpls_fib_details) \
Pavel Kotucek20c90f72016-06-07 14:44:26 +02003790_(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
3791_(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
3792_(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
Juraj Slobodaac645ad2016-07-07 00:18:57 -07003793_(CLASSIFY_SESSION_DETAILS, classify_session_details) \
Juraj Slobodaffa652a2016-08-07 23:43:42 -07003794_(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
3795_(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
3796_(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
3797_(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
3798_(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
3799_(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
Juraj Sloboda506b2452016-08-07 23:45:24 -07003800_(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
3801_(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +02003802_(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
3803_(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
3804_(PG_CAPTURE_REPLY, pg_capture_reply) \
Dave Barach6f9bca22016-04-30 10:25:32 -04003805_(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
3806_(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
3807 ip_source_and_port_range_check_add_del_reply) \
3808_(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
Matus Fabian694265d2016-08-10 01:55:36 -07003809 ip_source_and_port_range_check_interface_add_del_reply) \
3810_(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
Pavel Kotucekd85590a2016-08-26 13:35:40 +02003811_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
Pavel Kotucek95300d12016-08-26 16:11:36 +02003812_(DELETE_SUBIF_REPLY, delete_subif_reply) \
Alexander Popovsky (apopovsk)4a7e58b2016-10-05 22:31:23 -07003813_(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
3814_(PUNT_REPLY, punt_reply)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003815
3816/* M: construct, but don't yet send a message */
3817
3818#define M(T,t) \
3819do { \
3820 vam->result_ready = 0; \
3821 mp = vl_msg_api_alloc(sizeof(*mp)); \
3822 memset (mp, 0, sizeof (*mp)); \
3823 mp->_vl_msg_id = ntohs (VL_API_##T); \
3824 mp->client_index = vam->my_client_index; \
3825} while(0);
3826
3827#define M2(T,t,n) \
3828do { \
3829 vam->result_ready = 0; \
3830 mp = vl_msg_api_alloc(sizeof(*mp)+(n)); \
3831 memset (mp, 0, sizeof (*mp)); \
3832 mp->_vl_msg_id = ntohs (VL_API_##T); \
3833 mp->client_index = vam->my_client_index; \
3834} while(0);
3835
3836
3837/* S: send a message */
3838#define S (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp))
3839
3840/* W: wait for results, with timeout */
3841#define W \
3842do { \
3843 timeout = vat_time_now (vam) + 1.0; \
3844 \
3845 while (vat_time_now (vam) < timeout) { \
3846 if (vam->result_ready == 1) { \
3847 return (vam->retval); \
3848 } \
3849 } \
3850 return -99; \
3851} while(0);
3852
Keith Burns (alagalah)802255c2016-06-13 16:56:04 -07003853/* W2: wait for results, with timeout */
3854#define W2(body) \
3855do { \
3856 timeout = vat_time_now (vam) + 1.0; \
3857 \
3858 while (vat_time_now (vam) < timeout) { \
3859 if (vam->result_ready == 1) { \
3860 (body); \
3861 return (vam->retval); \
3862 } \
3863 } \
3864 return -99; \
3865} while(0);
3866
Dave Barach72d72232016-08-04 10:15:08 -04003867typedef struct
3868{
3869 u8 *name;
3870 u32 value;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003871} name_sort_t;
3872
3873
3874#define STR_VTR_OP_CASE(op) \
3875 case L2_VTR_ ## op: \
3876 return "" # op;
3877
Dave Barach72d72232016-08-04 10:15:08 -04003878static const char *
3879str_vtr_op (u32 vtr_op)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003880{
Dave Barach72d72232016-08-04 10:15:08 -04003881 switch (vtr_op)
3882 {
3883 STR_VTR_OP_CASE (DISABLED);
3884 STR_VTR_OP_CASE (PUSH_1);
3885 STR_VTR_OP_CASE (PUSH_2);
3886 STR_VTR_OP_CASE (POP_1);
3887 STR_VTR_OP_CASE (POP_2);
3888 STR_VTR_OP_CASE (TRANSLATE_1_1);
3889 STR_VTR_OP_CASE (TRANSLATE_1_2);
3890 STR_VTR_OP_CASE (TRANSLATE_2_1);
3891 STR_VTR_OP_CASE (TRANSLATE_2_2);
Ed Warnickecb9cada2015-12-08 15:45:58 -07003892 }
3893
Dave Barach72d72232016-08-04 10:15:08 -04003894 return "UNKNOWN";
Ed Warnickecb9cada2015-12-08 15:45:58 -07003895}
3896
Dave Barach72d72232016-08-04 10:15:08 -04003897static int
3898dump_sub_interface_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003899{
Dave Barach72d72232016-08-04 10:15:08 -04003900 const sw_interface_subif_t *sub = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003901
Dave Barach72d72232016-08-04 10:15:08 -04003902 if (vam->json_output)
3903 {
3904 clib_warning
3905 ("JSON output supported only for VPE API calls and dump_stats_table");
3906 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003907 }
3908
Dave Barach72d72232016-08-04 10:15:08 -04003909 fformat (vam->ofp,
3910 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s\n",
3911 "Interface", "sw_if_index",
3912 "sub id", "dot1ad", "tags", "outer id",
3913 "inner id", "exact", "default", "outer any", "inner any");
3914
3915 vec_foreach (sub, vam->sw_if_subif_table)
3916 {
Ed Warnickecb9cada2015-12-08 15:45:58 -07003917 fformat (vam->ofp,
Dave Barach72d72232016-08-04 10:15:08 -04003918 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d\n",
3919 sub->interface_name,
3920 sub->sw_if_index,
3921 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
3922 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
3923 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
3924 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
3925 if (sub->vtr_op != L2_VTR_DISABLED)
3926 {
3927 fformat (vam->ofp,
3928 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
3929 "tag1: %d tag2: %d ]\n",
3930 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
3931 sub->vtr_tag1, sub->vtr_tag2);
3932 }
3933 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07003934
Dave Barach72d72232016-08-04 10:15:08 -04003935 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003936}
3937
Dave Barach72d72232016-08-04 10:15:08 -04003938static int
3939name_sort_cmp (void *a1, void *a2)
Matus Fabiand2dc3df2015-12-14 10:31:33 -05003940{
Dave Barach72d72232016-08-04 10:15:08 -04003941 name_sort_t *n1 = a1;
3942 name_sort_t *n2 = a2;
Matus Fabiand2dc3df2015-12-14 10:31:33 -05003943
Dave Barach72d72232016-08-04 10:15:08 -04003944 return strcmp ((char *) n1->name, (char *) n2->name);
Matus Fabiand2dc3df2015-12-14 10:31:33 -05003945}
3946
Dave Barach72d72232016-08-04 10:15:08 -04003947static int
3948dump_interface_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003949{
Dave Barach72d72232016-08-04 10:15:08 -04003950 hash_pair_t *p;
3951 name_sort_t *nses = 0, *ns;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003952
Dave Barach72d72232016-08-04 10:15:08 -04003953 if (vam->json_output)
3954 {
3955 clib_warning
3956 ("JSON output supported only for VPE API calls and dump_stats_table");
3957 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003958 }
3959
Dave Barach72d72232016-08-04 10:15:08 -04003960 /* *INDENT-OFF* */
3961 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
3962 ({
3963 vec_add2 (nses, ns, 1);
3964 ns->name = (u8 *)(p->key);
3965 ns->value = (u32) p->value[0];
3966 }));
3967 /* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -07003968
Dave Barach72d72232016-08-04 10:15:08 -04003969 vec_sort_with_function (nses, name_sort_cmp);
Ed Warnickecb9cada2015-12-08 15:45:58 -07003970
Dave Barach72d72232016-08-04 10:15:08 -04003971 fformat (vam->ofp, "%-25s%-15s\n", "Interface", "sw_if_index");
3972 vec_foreach (ns, nses)
3973 {
3974 fformat (vam->ofp, "%-25s%-15d\n", ns->name, ns->value);
3975 }
3976 vec_free (nses);
3977 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003978}
3979
Dave Barach72d72232016-08-04 10:15:08 -04003980static int
3981dump_ip_table (vat_main_t * vam, int is_ipv6)
Ed Warnickecb9cada2015-12-08 15:45:58 -07003982{
Dave Barach72d72232016-08-04 10:15:08 -04003983 const ip_details_t *det = NULL;
3984 const ip_address_details_t *address = NULL;
3985 u32 i = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07003986
Dave Barach72d72232016-08-04 10:15:08 -04003987 fformat (vam->ofp, "%-12s\n", "sw_if_index");
3988
Dave Barach72d72232016-08-04 10:15:08 -04003989 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
3990 {
3991 i++;
3992 if (!det->present)
3993 {
3994 continue;
3995 }
3996 fformat (vam->ofp, "%-12d\n", i);
Ed Warnickecb9cada2015-12-08 15:45:58 -07003997 fformat (vam->ofp,
Dave Barach72d72232016-08-04 10:15:08 -04003998 " %-30s%-13s\n", "Address", "Prefix length");
3999 if (!det->addr)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004000 {
Dave Barach72d72232016-08-04 10:15:08 -04004001 continue;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004002 }
Dave Barach72d72232016-08-04 10:15:08 -04004003 vec_foreach (address, det->addr)
4004 {
4005 fformat (vam->ofp,
4006 " %-30U%-13d\n",
4007 is_ipv6 ? format_ip6_address : format_ip4_address,
4008 address->ip, address->prefix_length);
4009 }
4010 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07004011
Dave Barach72d72232016-08-04 10:15:08 -04004012 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004013}
4014
Dave Barach72d72232016-08-04 10:15:08 -04004015static int
4016dump_ipv4_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004017{
Dave Barach72d72232016-08-04 10:15:08 -04004018 if (vam->json_output)
4019 {
4020 clib_warning
4021 ("JSON output supported only for VPE API calls and dump_stats_table");
4022 return -99;
4023 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07004024
Dave Barach72d72232016-08-04 10:15:08 -04004025 return dump_ip_table (vam, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004026}
4027
Dave Barach72d72232016-08-04 10:15:08 -04004028static int
4029dump_ipv6_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004030{
Dave Barach72d72232016-08-04 10:15:08 -04004031 if (vam->json_output)
4032 {
4033 clib_warning
4034 ("JSON output supported only for VPE API calls and dump_stats_table");
4035 return -99;
4036 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07004037
Dave Barach72d72232016-08-04 10:15:08 -04004038 return dump_ip_table (vam, 1);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004039}
4040
Dave Barach72d72232016-08-04 10:15:08 -04004041static char *
4042counter_type_to_str (u8 counter_type, u8 is_combined)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004043{
Dave Barach72d72232016-08-04 10:15:08 -04004044 if (!is_combined)
4045 {
4046 switch (counter_type)
4047 {
4048 case VNET_INTERFACE_COUNTER_DROP:
4049 return "drop";
4050 case VNET_INTERFACE_COUNTER_PUNT:
4051 return "punt";
4052 case VNET_INTERFACE_COUNTER_IP4:
4053 return "ip4";
4054 case VNET_INTERFACE_COUNTER_IP6:
4055 return "ip6";
4056 case VNET_INTERFACE_COUNTER_RX_NO_BUF:
4057 return "rx-no-buf";
4058 case VNET_INTERFACE_COUNTER_RX_MISS:
4059 return "rx-miss";
4060 case VNET_INTERFACE_COUNTER_RX_ERROR:
4061 return "rx-error";
4062 case VNET_INTERFACE_COUNTER_TX_ERROR:
4063 return "tx-error";
4064 default:
4065 return "INVALID-COUNTER-TYPE";
4066 }
4067 }
4068 else
4069 {
4070 switch (counter_type)
4071 {
4072 case VNET_INTERFACE_COUNTER_RX:
4073 return "rx";
4074 case VNET_INTERFACE_COUNTER_TX:
4075 return "tx";
4076 default:
4077 return "INVALID-COUNTER-TYPE";
4078 }
4079 }
4080}
Ed Warnickecb9cada2015-12-08 15:45:58 -07004081
Dave Barach72d72232016-08-04 10:15:08 -04004082static int
4083dump_stats_table (vat_main_t * vam)
4084{
4085 vat_json_node_t node;
4086 vat_json_node_t *msg_array;
4087 vat_json_node_t *msg;
4088 vat_json_node_t *counter_array;
4089 vat_json_node_t *counter;
4090 interface_counter_t c;
4091 u64 packets;
4092 ip4_fib_counter_t *c4;
4093 ip6_fib_counter_t *c6;
4094 int i, j;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004095
Dave Barach72d72232016-08-04 10:15:08 -04004096 if (!vam->json_output)
4097 {
4098 clib_warning ("dump_stats_table supported only in JSON format");
4099 return -99;
4100 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07004101
Dave Barach72d72232016-08-04 10:15:08 -04004102 vat_json_init_object (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004103
Dave Barach72d72232016-08-04 10:15:08 -04004104 /* interface counters */
4105 msg_array = vat_json_object_add (&node, "interface_counters");
4106 vat_json_init_array (msg_array);
4107 for (i = 0; i < vec_len (vam->simple_interface_counters); i++)
4108 {
4109 msg = vat_json_array_add (msg_array);
4110 vat_json_init_object (msg);
4111 vat_json_object_add_string_copy (msg, "vnet_counter_type",
4112 (u8 *) counter_type_to_str (i, 0));
4113 vat_json_object_add_int (msg, "is_combined", 0);
4114 counter_array = vat_json_object_add (msg, "data");
4115 vat_json_init_array (counter_array);
4116 for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++)
4117 {
4118 packets = vam->simple_interface_counters[i][j];
4119 vat_json_array_add_uint (counter_array, packets);
4120 }
4121 }
4122 for (i = 0; i < vec_len (vam->combined_interface_counters); i++)
4123 {
4124 msg = vat_json_array_add (msg_array);
4125 vat_json_init_object (msg);
4126 vat_json_object_add_string_copy (msg, "vnet_counter_type",
4127 (u8 *) counter_type_to_str (i, 1));
4128 vat_json_object_add_int (msg, "is_combined", 1);
4129 counter_array = vat_json_object_add (msg, "data");
4130 vat_json_init_array (counter_array);
4131 for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++)
4132 {
4133 c = vam->combined_interface_counters[i][j];
4134 counter = vat_json_array_add (counter_array);
4135 vat_json_init_object (counter);
4136 vat_json_object_add_uint (counter, "packets", c.packets);
4137 vat_json_object_add_uint (counter, "bytes", c.bytes);
4138 }
4139 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07004140
Dave Barach72d72232016-08-04 10:15:08 -04004141 /* ip4 fib counters */
4142 msg_array = vat_json_object_add (&node, "ip4_fib_counters");
4143 vat_json_init_array (msg_array);
4144 for (i = 0; i < vec_len (vam->ip4_fib_counters); i++)
4145 {
4146 msg = vat_json_array_add (msg_array);
4147 vat_json_init_object (msg);
4148 vat_json_object_add_uint (msg, "vrf_id",
4149 vam->ip4_fib_counters_vrf_id_by_index[i]);
4150 counter_array = vat_json_object_add (msg, "c");
4151 vat_json_init_array (counter_array);
4152 for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++)
4153 {
4154 counter = vat_json_array_add (counter_array);
4155 vat_json_init_object (counter);
4156 c4 = &vam->ip4_fib_counters[i][j];
4157 vat_json_object_add_ip4 (counter, "address", c4->address);
4158 vat_json_object_add_uint (counter, "address_length",
4159 c4->address_length);
4160 vat_json_object_add_uint (counter, "packets", c4->packets);
4161 vat_json_object_add_uint (counter, "bytes", c4->bytes);
4162 }
4163 }
4164
4165 /* ip6 fib counters */
4166 msg_array = vat_json_object_add (&node, "ip6_fib_counters");
4167 vat_json_init_array (msg_array);
4168 for (i = 0; i < vec_len (vam->ip6_fib_counters); i++)
4169 {
4170 msg = vat_json_array_add (msg_array);
4171 vat_json_init_object (msg);
4172 vat_json_object_add_uint (msg, "vrf_id",
4173 vam->ip6_fib_counters_vrf_id_by_index[i]);
4174 counter_array = vat_json_object_add (msg, "c");
4175 vat_json_init_array (counter_array);
4176 for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++)
4177 {
4178 counter = vat_json_array_add (counter_array);
4179 vat_json_init_object (counter);
4180 c6 = &vam->ip6_fib_counters[i][j];
4181 vat_json_object_add_ip6 (counter, "address", c6->address);
4182 vat_json_object_add_uint (counter, "address_length",
4183 c6->address_length);
4184 vat_json_object_add_uint (counter, "packets", c6->packets);
4185 vat_json_object_add_uint (counter, "bytes", c6->bytes);
4186 }
4187 }
4188
4189 vat_json_print (vam->ofp, &node);
4190 vat_json_free (&node);
4191
4192 return 0;
4193}
4194
4195int
4196exec (vat_main_t * vam)
4197{
4198 api_main_t *am = &api_main;
4199 vl_api_cli_request_t *mp;
4200 f64 timeout;
4201 void *oldheap;
4202 u8 *cmd = 0;
4203 unformat_input_t *i = vam->input;
4204
4205 if (vec_len (i->buffer) == 0)
4206 return -1;
4207
4208 if (vam->exec_mode == 0 && unformat (i, "mode"))
4209 {
4210 vam->exec_mode = 1;
4211 return 0;
4212 }
4213 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4214 {
4215 vam->exec_mode = 0;
4216 return 0;
4217 }
4218
4219
4220 M (CLI_REQUEST, cli_request);
4221
4222 /*
4223 * Copy cmd into shared memory.
4224 * In order for the CLI command to work, it
4225 * must be a vector ending in \n, not a C-string ending
4226 * in \n\0.
4227 */
4228 pthread_mutex_lock (&am->vlib_rp->mutex);
4229 oldheap = svm_push_data_heap (am->vlib_rp);
4230
4231 vec_validate (cmd, vec_len (vam->input->buffer) - 1);
4232 clib_memcpy (cmd, vam->input->buffer, vec_len (vam->input->buffer));
4233
4234 svm_pop_heap (oldheap);
4235 pthread_mutex_unlock (&am->vlib_rp->mutex);
4236
4237 mp->cmd_in_shmem = (u64) cmd;
4238 S;
4239 timeout = vat_time_now (vam) + 10.0;
4240
4241 while (vat_time_now (vam) < timeout)
4242 {
4243 if (vam->result_ready == 1)
4244 {
4245 u8 *free_me;
4246 if (vam->shmem_result != NULL)
4247 fformat (vam->ofp, "%s", vam->shmem_result);
4248 pthread_mutex_lock (&am->vlib_rp->mutex);
4249 oldheap = svm_push_data_heap (am->vlib_rp);
4250
4251 free_me = (u8 *) vam->shmem_result;
4252 vec_free (free_me);
4253
4254 svm_pop_heap (oldheap);
4255 pthread_mutex_unlock (&am->vlib_rp->mutex);
4256 return 0;
4257 }
4258 }
4259 return -99;
4260}
4261
Ole Troanc27213a2016-08-31 14:50:49 +02004262/*
4263 * Future replacement of exec() that passes CLI buffers directly in
4264 * the API messages instead of an additional shared memory area.
4265 */
4266static int
4267exec_inband (vat_main_t * vam)
4268{
4269 vl_api_cli_inband_t *mp;
4270 f64 timeout;
4271 unformat_input_t *i = vam->input;
4272
4273 if (vec_len (i->buffer) == 0)
4274 return -1;
4275
4276 if (vam->exec_mode == 0 && unformat (i, "mode"))
4277 {
4278 vam->exec_mode = 1;
4279 return 0;
4280 }
4281 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
4282 {
4283 vam->exec_mode = 0;
4284 return 0;
4285 }
4286
4287 /*
4288 * In order for the CLI command to work, it
4289 * must be a vector ending in \n, not a C-string ending
4290 * in \n\0.
4291 */
4292 u32 len = vec_len (vam->input->buffer);
4293 M2 (CLI_INBAND, cli_inband, len);
4294 clib_memcpy (mp->cmd, vam->input->buffer, len);
4295 mp->length = htonl (len);
4296
4297 S;
4298 W2 (fformat (vam->ofp, "%s", vam->cmd_reply));
4299}
4300
Dave Barach72d72232016-08-04 10:15:08 -04004301static int
4302api_create_loopback (vat_main_t * vam)
4303{
4304 unformat_input_t *i = vam->input;
4305 vl_api_create_loopback_t *mp;
4306 f64 timeout;
4307 u8 mac_address[6];
4308 u8 mac_set = 0;
4309
4310 memset (mac_address, 0, sizeof (mac_address));
4311
4312 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4313 {
4314 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
4315 mac_set = 1;
4316 else
4317 break;
4318 }
4319
4320 /* Construct the API message */
4321 M (CREATE_LOOPBACK, create_loopback);
4322 if (mac_set)
4323 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
4324
4325 S;
4326 W;
4327}
4328
4329static int
4330api_delete_loopback (vat_main_t * vam)
4331{
4332 unformat_input_t *i = vam->input;
4333 vl_api_delete_loopback_t *mp;
4334 f64 timeout;
4335 u32 sw_if_index = ~0;
4336
4337 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4338 {
4339 if (unformat (i, "sw_if_index %d", &sw_if_index))
4340 ;
4341 else
4342 break;
4343 }
4344
4345 if (sw_if_index == ~0)
4346 {
4347 errmsg ("missing sw_if_index\n");
4348 return -99;
4349 }
4350
4351 /* Construct the API message */
4352 M (DELETE_LOOPBACK, delete_loopback);
4353 mp->sw_if_index = ntohl (sw_if_index);
4354
4355 S;
4356 W;
4357}
4358
4359static int
4360api_want_stats (vat_main_t * vam)
4361{
4362 unformat_input_t *i = vam->input;
4363 vl_api_want_stats_t *mp;
4364 f64 timeout;
4365 int enable = -1;
4366
4367 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4368 {
4369 if (unformat (i, "enable"))
4370 enable = 1;
4371 else if (unformat (i, "disable"))
4372 enable = 0;
4373 else
4374 break;
4375 }
4376
4377 if (enable == -1)
4378 {
4379 errmsg ("missing enable|disable\n");
4380 return -99;
4381 }
4382
4383 M (WANT_STATS, want_stats);
4384 mp->enable_disable = enable;
4385
4386 S;
4387 W;
4388}
4389
4390static int
4391api_want_interface_events (vat_main_t * vam)
4392{
4393 unformat_input_t *i = vam->input;
4394 vl_api_want_interface_events_t *mp;
4395 f64 timeout;
4396 int enable = -1;
4397
4398 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4399 {
4400 if (unformat (i, "enable"))
4401 enable = 1;
4402 else if (unformat (i, "disable"))
4403 enable = 0;
4404 else
4405 break;
4406 }
4407
4408 if (enable == -1)
4409 {
4410 errmsg ("missing enable|disable\n");
4411 return -99;
4412 }
4413
4414 M (WANT_INTERFACE_EVENTS, want_interface_events);
4415 mp->enable_disable = enable;
4416
4417 vam->interface_event_display = enable;
4418
4419 S;
4420 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004421}
4422
4423
4424/* Note: non-static, called once to set up the initial intfc table */
Dave Barach72d72232016-08-04 10:15:08 -04004425int
4426api_sw_interface_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004427{
Dave Barach72d72232016-08-04 10:15:08 -04004428 vl_api_sw_interface_dump_t *mp;
4429 f64 timeout;
4430 hash_pair_t *p;
4431 name_sort_t *nses = 0, *ns;
4432 sw_interface_subif_t *sub = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004433
Dave Barach72d72232016-08-04 10:15:08 -04004434 /* Toss the old name table */
4435 /* *INDENT-OFF* */
4436 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
4437 ({
4438 vec_add2 (nses, ns, 1);
4439 ns->name = (u8 *)(p->key);
4440 ns->value = (u32) p->value[0];
4441 }));
4442 /* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -07004443
Dave Barach72d72232016-08-04 10:15:08 -04004444 hash_free (vam->sw_if_index_by_interface_name);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004445
Dave Barach72d72232016-08-04 10:15:08 -04004446 vec_foreach (ns, nses) vec_free (ns->name);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004447
Dave Barach72d72232016-08-04 10:15:08 -04004448 vec_free (nses);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004449
Dave Barach72d72232016-08-04 10:15:08 -04004450 vec_foreach (sub, vam->sw_if_subif_table)
4451 {
4452 vec_free (sub->interface_name);
4453 }
4454 vec_free (vam->sw_if_subif_table);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004455
Dave Barach72d72232016-08-04 10:15:08 -04004456 /* recreate the interface name hash table */
4457 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
Ed Warnickecb9cada2015-12-08 15:45:58 -07004458
Dave Barach72d72232016-08-04 10:15:08 -04004459 /* Get list of ethernets */
4460 M (SW_INTERFACE_DUMP, sw_interface_dump);
4461 mp->name_filter_valid = 1;
4462 strncpy ((char *) mp->name_filter, "Ether", sizeof (mp->name_filter) - 1);
4463 S;
4464
4465 /* and local / loopback interfaces */
4466 M (SW_INTERFACE_DUMP, sw_interface_dump);
4467 mp->name_filter_valid = 1;
4468 strncpy ((char *) mp->name_filter, "lo", sizeof (mp->name_filter) - 1);
4469 S;
4470
Damjan Marionf2c6ed12016-09-30 10:53:30 +02004471 /* and packet-generator interfaces */
4472 M (SW_INTERFACE_DUMP, sw_interface_dump);
4473 mp->name_filter_valid = 1;
4474 strncpy ((char *) mp->name_filter, "pg", sizeof (mp->name_filter) - 1);
4475 S;
Dave Barach72d72232016-08-04 10:15:08 -04004476
4477 /* and vxlan-gpe tunnel interfaces */
4478 M (SW_INTERFACE_DUMP, sw_interface_dump);
4479 mp->name_filter_valid = 1;
4480 strncpy ((char *) mp->name_filter, "vxlan_gpe",
4481 sizeof (mp->name_filter) - 1);
4482 S;
4483
4484 /* and vxlan tunnel interfaces */
4485 M (SW_INTERFACE_DUMP, sw_interface_dump);
4486 mp->name_filter_valid = 1;
4487 strncpy ((char *) mp->name_filter, "vxlan", sizeof (mp->name_filter) - 1);
4488 S;
4489
4490 /* and host (af_packet) interfaces */
4491 M (SW_INTERFACE_DUMP, sw_interface_dump);
4492 mp->name_filter_valid = 1;
4493 strncpy ((char *) mp->name_filter, "host", sizeof (mp->name_filter) - 1);
4494 S;
4495
4496 /* and l2tpv3 tunnel interfaces */
4497 M (SW_INTERFACE_DUMP, sw_interface_dump);
4498 mp->name_filter_valid = 1;
4499 strncpy ((char *) mp->name_filter, "l2tpv3_tunnel",
4500 sizeof (mp->name_filter) - 1);
4501 S;
4502
4503 /* and GRE tunnel interfaces */
4504 M (SW_INTERFACE_DUMP, sw_interface_dump);
4505 mp->name_filter_valid = 1;
4506 strncpy ((char *) mp->name_filter, "gre", sizeof (mp->name_filter) - 1);
4507 S;
4508
Florin Corasce982752016-09-06 13:36:11 +02004509 /* and LISP-GPE interfaces */
4510 M (SW_INTERFACE_DUMP, sw_interface_dump);
4511 mp->name_filter_valid = 1;
4512 strncpy ((char *) mp->name_filter, "lisp_gpe",
4513 sizeof (mp->name_filter) - 1);
4514 S;
4515
Matus Fabian8fce3e32016-09-06 23:19:43 -07004516 /* and IPSEC tunnel interfaces */
4517 M (SW_INTERFACE_DUMP, sw_interface_dump);
4518 mp->name_filter_valid = 1;
4519 strncpy ((char *) mp->name_filter, "ipsec", sizeof (mp->name_filter) - 1);
4520 S;
4521
Dave Barach72d72232016-08-04 10:15:08 -04004522 /* Use a control ping for synchronization */
4523 {
4524 vl_api_control_ping_t *mp;
4525 M (CONTROL_PING, control_ping);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004526 S;
Dave Barach72d72232016-08-04 10:15:08 -04004527 }
4528 W;
4529}
Ed Warnickecb9cada2015-12-08 15:45:58 -07004530
Dave Barach72d72232016-08-04 10:15:08 -04004531static int
4532api_sw_interface_set_flags (vat_main_t * vam)
4533{
4534 unformat_input_t *i = vam->input;
4535 vl_api_sw_interface_set_flags_t *mp;
4536 f64 timeout;
4537 u32 sw_if_index;
4538 u8 sw_if_index_set = 0;
4539 u8 admin_up = 0, link_up = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004540
Dave Barach72d72232016-08-04 10:15:08 -04004541 /* Parse args required to build the message */
4542 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004543 {
Dave Barach72d72232016-08-04 10:15:08 -04004544 if (unformat (i, "admin-up"))
4545 admin_up = 1;
4546 else if (unformat (i, "admin-down"))
4547 admin_up = 0;
4548 else if (unformat (i, "link-up"))
4549 link_up = 1;
4550 else if (unformat (i, "link-down"))
4551 link_up = 0;
4552 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4553 sw_if_index_set = 1;
4554 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4555 sw_if_index_set = 1;
4556 else
4557 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004558 }
4559
Dave Barach72d72232016-08-04 10:15:08 -04004560 if (sw_if_index_set == 0)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004561 {
Dave Barach72d72232016-08-04 10:15:08 -04004562 errmsg ("missing interface name or sw_if_index\n");
4563 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004564 }
4565
Dave Barach72d72232016-08-04 10:15:08 -04004566 /* Construct the API message */
4567 M (SW_INTERFACE_SET_FLAGS, sw_interface_set_flags);
4568 mp->sw_if_index = ntohl (sw_if_index);
4569 mp->admin_up_down = admin_up;
4570 mp->link_up_down = link_up;
4571
4572 /* send it... */
4573 S;
4574
4575 /* Wait for a reply, return the good/bad news... */
4576 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004577}
4578
Dave Barach72d72232016-08-04 10:15:08 -04004579static int
4580api_sw_interface_clear_stats (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004581{
Dave Barach72d72232016-08-04 10:15:08 -04004582 unformat_input_t *i = vam->input;
4583 vl_api_sw_interface_clear_stats_t *mp;
4584 f64 timeout;
4585 u32 sw_if_index;
4586 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004587
Dave Barach72d72232016-08-04 10:15:08 -04004588 /* Parse args required to build the message */
4589 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4590 {
4591 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4592 sw_if_index_set = 1;
4593 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4594 sw_if_index_set = 1;
4595 else
4596 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004597 }
4598
Dave Barach72d72232016-08-04 10:15:08 -04004599 /* Construct the API message */
4600 M (SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats);
Ed Warnickecb9cada2015-12-08 15:45:58 -07004601
Dave Barach72d72232016-08-04 10:15:08 -04004602 if (sw_if_index_set == 1)
4603 mp->sw_if_index = ntohl (sw_if_index);
4604 else
4605 mp->sw_if_index = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004606
Dave Barach72d72232016-08-04 10:15:08 -04004607 /* send it... */
4608 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004609
Dave Barach72d72232016-08-04 10:15:08 -04004610 /* Wait for a reply, return the good/bad news... */
4611 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004612}
4613
Dave Barach72d72232016-08-04 10:15:08 -04004614static int
Jasvinder Singh85ecc812016-07-21 17:02:19 +01004615api_sw_interface_set_dpdk_hqos_pipe (vat_main_t * vam)
4616{
4617 unformat_input_t *i = vam->input;
4618 vl_api_sw_interface_set_dpdk_hqos_pipe_t *mp;
4619 f64 timeout;
4620 u32 sw_if_index;
4621 u8 sw_if_index_set = 0;
4622 u32 subport;
4623 u8 subport_set = 0;
4624 u32 pipe;
4625 u8 pipe_set = 0;
4626 u32 profile;
4627 u8 profile_set = 0;
4628
4629 /* Parse args required to build the message */
4630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4631 {
4632 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4633 sw_if_index_set = 1;
4634 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4635 sw_if_index_set = 1;
4636 else if (unformat (i, "subport %u", &subport))
4637 subport_set = 1;
4638 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4639 sw_if_index_set = 1;
4640 else if (unformat (i, "pipe %u", &pipe))
4641 pipe_set = 1;
4642 else if (unformat (i, "profile %u", &profile))
4643 profile_set = 1;
4644 else
4645 break;
4646 }
4647
4648 if (sw_if_index_set == 0)
4649 {
4650 errmsg ("missing interface name or sw_if_index\n");
4651 return -99;
4652 }
4653
4654 if (subport_set == 0)
4655 {
4656 errmsg ("missing subport \n");
4657 return -99;
4658 }
4659
4660 if (pipe_set == 0)
4661 {
4662 errmsg ("missing pipe\n");
4663 return -99;
4664 }
4665
4666 if (profile_set == 0)
4667 {
4668 errmsg ("missing profile\n");
4669 return -99;
4670 }
4671
4672 M (SW_INTERFACE_SET_DPDK_HQOS_PIPE, sw_interface_set_dpdk_hqos_pipe);
4673
4674 mp->sw_if_index = ntohl (sw_if_index);
4675 mp->subport = ntohl (subport);
4676 mp->pipe = ntohl (pipe);
4677 mp->profile = ntohl (profile);
4678
4679
4680 S;
4681 W;
4682 /* NOTREACHED */
4683 return 0;
4684}
4685
4686static int
4687api_sw_interface_set_dpdk_hqos_subport (vat_main_t * vam)
4688{
4689 unformat_input_t *i = vam->input;
4690 vl_api_sw_interface_set_dpdk_hqos_subport_t *mp;
4691 f64 timeout;
4692 u32 sw_if_index;
4693 u8 sw_if_index_set = 0;
4694 u32 subport;
4695 u8 subport_set = 0;
4696 u32 tb_rate = 1250000000; /* 10GbE */
4697 u32 tb_size = 1000000;
4698 u32 tc_rate[] = { 1250000000, 1250000000, 1250000000, 1250000000 };
4699 u32 tc_period = 10;
4700
4701 /* Parse args required to build the message */
4702 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4703 {
4704 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4705 sw_if_index_set = 1;
4706 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4707 sw_if_index_set = 1;
4708 else if (unformat (i, "subport %u", &subport))
4709 subport_set = 1;
4710 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4711 sw_if_index_set = 1;
4712 else if (unformat (i, "rate %u", &tb_rate))
4713 {
4714 u32 tc_id;
4715
4716 for (tc_id = 0; tc_id < (sizeof (tc_rate) / sizeof (tc_rate[0]));
4717 tc_id++)
4718 tc_rate[tc_id] = tb_rate;
4719 }
4720 else if (unformat (i, "bktsize %u", &tb_size))
4721 ;
4722 else if (unformat (i, "tc0 %u", &tc_rate[0]))
4723 ;
4724 else if (unformat (i, "tc1 %u", &tc_rate[1]))
4725 ;
4726 else if (unformat (i, "tc2 %u", &tc_rate[2]))
4727 ;
4728 else if (unformat (i, "tc3 %u", &tc_rate[3]))
4729 ;
4730 else if (unformat (i, "period %u", &tc_period))
4731 ;
4732 else
4733 break;
4734 }
4735
4736 if (sw_if_index_set == 0)
4737 {
4738 errmsg ("missing interface name or sw_if_index\n");
4739 return -99;
4740 }
4741
4742 if (subport_set == 0)
4743 {
4744 errmsg ("missing subport \n");
4745 return -99;
4746 }
4747
4748 M (SW_INTERFACE_SET_DPDK_HQOS_SUBPORT, sw_interface_set_dpdk_hqos_subport);
4749
4750 mp->sw_if_index = ntohl (sw_if_index);
4751 mp->subport = ntohl (subport);
4752 mp->tb_rate = ntohl (tb_rate);
4753 mp->tb_size = ntohl (tb_size);
4754 mp->tc_rate[0] = ntohl (tc_rate[0]);
4755 mp->tc_rate[1] = ntohl (tc_rate[1]);
4756 mp->tc_rate[2] = ntohl (tc_rate[2]);
4757 mp->tc_rate[3] = ntohl (tc_rate[3]);
4758 mp->tc_period = ntohl (tc_period);
4759
4760 S;
4761 W;
4762 /* NOTREACHED */
4763 return 0;
4764}
4765
4766static int
4767api_sw_interface_set_dpdk_hqos_tctbl (vat_main_t * vam)
4768{
4769 unformat_input_t *i = vam->input;
4770 vl_api_sw_interface_set_dpdk_hqos_tctbl_t *mp;
4771 f64 timeout;
4772 u32 sw_if_index;
4773 u8 sw_if_index_set = 0;
4774 u8 entry_set = 0;
4775 u8 tc_set = 0;
4776 u8 queue_set = 0;
4777 u32 entry, tc, queue;
4778
4779 /* Parse args required to build the message */
4780 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4781 {
4782 if (unformat (i, "rx %U", unformat_sw_if_index, vam, &sw_if_index))
4783 sw_if_index_set = 1;
4784 else if (unformat (i, "sw_if_index %u", &sw_if_index))
4785 sw_if_index_set = 1;
4786 else if (unformat (i, "entry %d", &entry))
4787 entry_set = 1;
4788 else if (unformat (i, "tc %d", &tc))
4789 tc_set = 1;
4790 else if (unformat (i, "queue %d", &queue))
4791 queue_set = 1;
4792 else
4793 break;
4794 }
4795
4796 if (sw_if_index_set == 0)
4797 {
4798 errmsg ("missing interface name or sw_if_index\n");
4799 return -99;
4800 }
4801
4802 if (entry_set == 0)
4803 {
4804 errmsg ("missing entry \n");
4805 return -99;
4806 }
4807
4808 if (tc_set == 0)
4809 {
4810 errmsg ("missing traffic class \n");
4811 return -99;
4812 }
4813
4814 if (queue_set == 0)
4815 {
4816 errmsg ("missing queue \n");
4817 return -99;
4818 }
4819
4820 M (SW_INTERFACE_SET_DPDK_HQOS_TCTBL, sw_interface_set_dpdk_hqos_tctbl);
4821
4822 mp->sw_if_index = ntohl (sw_if_index);
4823 mp->entry = ntohl (entry);
4824 mp->tc = ntohl (tc);
4825 mp->queue = ntohl (queue);
4826
4827 S;
4828 W;
4829 /* NOTREACHED */
4830 return 0;
4831}
4832
4833static int
Dave Barach72d72232016-08-04 10:15:08 -04004834api_sw_interface_add_del_address (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07004835{
Dave Barach72d72232016-08-04 10:15:08 -04004836 unformat_input_t *i = vam->input;
4837 vl_api_sw_interface_add_del_address_t *mp;
4838 f64 timeout;
4839 u32 sw_if_index;
4840 u8 sw_if_index_set = 0;
4841 u8 is_add = 1, del_all = 0;
4842 u32 address_length = 0;
4843 u8 v4_address_set = 0;
4844 u8 v6_address_set = 0;
4845 ip4_address_t v4address;
4846 ip6_address_t v6address;
Ed Warnickecb9cada2015-12-08 15:45:58 -07004847
Dave Barach72d72232016-08-04 10:15:08 -04004848 /* Parse args required to build the message */
4849 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4850 {
4851 if (unformat (i, "del-all"))
4852 del_all = 1;
4853 else if (unformat (i, "del"))
4854 is_add = 0;
4855 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4856 sw_if_index_set = 1;
4857 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4858 sw_if_index_set = 1;
4859 else if (unformat (i, "%U/%d",
4860 unformat_ip4_address, &v4address, &address_length))
4861 v4_address_set = 1;
4862 else if (unformat (i, "%U/%d",
4863 unformat_ip6_address, &v6address, &address_length))
4864 v6_address_set = 1;
4865 else
4866 break;
4867 }
4868
4869 if (sw_if_index_set == 0)
4870 {
4871 errmsg ("missing interface name or sw_if_index\n");
4872 return -99;
4873 }
4874 if (v4_address_set && v6_address_set)
4875 {
4876 errmsg ("both v4 and v6 addresses set\n");
4877 return -99;
4878 }
4879 if (!v4_address_set && !v6_address_set && !del_all)
4880 {
4881 errmsg ("no addresses set\n");
4882 return -99;
4883 }
4884
4885 /* Construct the API message */
4886 M (SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address);
4887
4888 mp->sw_if_index = ntohl (sw_if_index);
4889 mp->is_add = is_add;
4890 mp->del_all = del_all;
4891 if (v6_address_set)
4892 {
4893 mp->is_ipv6 = 1;
4894 clib_memcpy (mp->address, &v6address, sizeof (v6address));
4895 }
4896 else
4897 {
4898 clib_memcpy (mp->address, &v4address, sizeof (v4address));
4899 }
4900 mp->address_length = address_length;
4901
4902 /* send it... */
4903 S;
4904
4905 /* Wait for a reply, return good/bad news */
4906 W;
4907}
4908
4909static int
John Lo06b14b92016-10-24 20:20:11 -04004910api_sw_interface_set_mpls_enable (vat_main_t * vam)
4911{
4912 unformat_input_t *i = vam->input;
4913 vl_api_sw_interface_set_mpls_enable_t *mp;
4914 f64 timeout;
4915 u32 sw_if_index;
4916 u8 sw_if_index_set = 0;
4917 u8 enable = 1;
4918
4919 /* Parse args required to build the message */
4920 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4921 {
4922 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4923 sw_if_index_set = 1;
4924 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4925 sw_if_index_set = 1;
4926 else if (unformat (i, "disable"))
4927 enable = 0;
4928 else if (unformat (i, "dis"))
4929 enable = 0;
4930 else
4931 break;
4932 }
4933
4934 if (sw_if_index_set == 0)
4935 {
4936 errmsg ("missing interface name or sw_if_index\n");
4937 return -99;
4938 }
4939
4940 /* Construct the API message */
4941 M (SW_INTERFACE_SET_MPLS_ENABLE, sw_interface_set_mpls_enable);
4942
4943 mp->sw_if_index = ntohl (sw_if_index);
4944 mp->enable = enable;
4945
4946 /* send it... */
4947 S;
4948
4949 /* Wait for a reply... */
4950 W;
4951}
4952
4953static int
Dave Barach72d72232016-08-04 10:15:08 -04004954api_sw_interface_set_table (vat_main_t * vam)
4955{
4956 unformat_input_t *i = vam->input;
4957 vl_api_sw_interface_set_table_t *mp;
4958 f64 timeout;
4959 u32 sw_if_index, vrf_id = 0;
4960 u8 sw_if_index_set = 0;
4961 u8 is_ipv6 = 0;
4962
4963 /* Parse args required to build the message */
4964 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
4965 {
4966 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
4967 sw_if_index_set = 1;
4968 else if (unformat (i, "sw_if_index %d", &sw_if_index))
4969 sw_if_index_set = 1;
4970 else if (unformat (i, "vrf %d", &vrf_id))
4971 ;
4972 else if (unformat (i, "ipv6"))
4973 is_ipv6 = 1;
4974 else
4975 break;
4976 }
4977
4978 if (sw_if_index_set == 0)
4979 {
4980 errmsg ("missing interface name or sw_if_index\n");
4981 return -99;
4982 }
4983
4984 /* Construct the API message */
4985 M (SW_INTERFACE_SET_TABLE, sw_interface_set_table);
4986
4987 mp->sw_if_index = ntohl (sw_if_index);
4988 mp->is_ipv6 = is_ipv6;
4989 mp->vrf_id = ntohl (vrf_id);
4990
4991 /* send it... */
4992 S;
4993
4994 /* Wait for a reply... */
4995 W;
4996}
4997
4998static int
4999api_sw_interface_set_vpath (vat_main_t * vam)
5000{
5001 unformat_input_t *i = vam->input;
5002 vl_api_sw_interface_set_vpath_t *mp;
5003 f64 timeout;
5004 u32 sw_if_index = 0;
5005 u8 sw_if_index_set = 0;
5006 u8 is_enable = 0;
5007
5008 /* Parse args required to build the message */
5009 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5010 {
5011 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5012 sw_if_index_set = 1;
5013 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5014 sw_if_index_set = 1;
5015 else if (unformat (i, "enable"))
5016 is_enable = 1;
5017 else if (unformat (i, "disable"))
5018 is_enable = 0;
5019 else
5020 break;
5021 }
5022
5023 if (sw_if_index_set == 0)
5024 {
5025 errmsg ("missing interface name or sw_if_index\n");
5026 return -99;
5027 }
5028
5029 /* Construct the API message */
5030 M (SW_INTERFACE_SET_VPATH, sw_interface_set_vpath);
5031
5032 mp->sw_if_index = ntohl (sw_if_index);
5033 mp->enable = is_enable;
5034
5035 /* send it... */
5036 S;
5037
5038 /* Wait for a reply... */
5039 W;
5040}
5041
5042static int
5043api_sw_interface_set_l2_xconnect (vat_main_t * vam)
5044{
5045 unformat_input_t *i = vam->input;
5046 vl_api_sw_interface_set_l2_xconnect_t *mp;
5047 f64 timeout;
5048 u32 rx_sw_if_index;
5049 u8 rx_sw_if_index_set = 0;
5050 u32 tx_sw_if_index;
5051 u8 tx_sw_if_index_set = 0;
5052 u8 enable = 1;
5053
5054 /* Parse args required to build the message */
5055 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5056 {
5057 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
5058 rx_sw_if_index_set = 1;
5059 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
5060 tx_sw_if_index_set = 1;
5061 else if (unformat (i, "rx"))
5062 {
5063 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5064 {
5065 if (unformat (i, "%U", unformat_sw_if_index, vam,
5066 &rx_sw_if_index))
5067 rx_sw_if_index_set = 1;
5068 }
5069 else
Dave Barach41da02d2016-07-11 16:48:42 -07005070 break;
Dave Barach41da02d2016-07-11 16:48:42 -07005071 }
Dave Barach72d72232016-08-04 10:15:08 -04005072 else if (unformat (i, "tx"))
5073 {
5074 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5075 {
5076 if (unformat (i, "%U", unformat_sw_if_index, vam,
5077 &tx_sw_if_index))
5078 tx_sw_if_index_set = 1;
5079 }
5080 else
5081 break;
5082 }
5083 else if (unformat (i, "enable"))
5084 enable = 1;
5085 else if (unformat (i, "disable"))
5086 enable = 0;
5087 else
5088 break;
Dave Barach41da02d2016-07-11 16:48:42 -07005089 }
5090
Dave Barach72d72232016-08-04 10:15:08 -04005091 if (rx_sw_if_index_set == 0)
5092 {
5093 errmsg ("missing rx interface name or rx_sw_if_index\n");
5094 return -99;
5095 }
Dave Barach41da02d2016-07-11 16:48:42 -07005096
Dave Barach72d72232016-08-04 10:15:08 -04005097 if (enable && (tx_sw_if_index_set == 0))
5098 {
5099 errmsg ("missing tx interface name or tx_sw_if_index\n");
5100 return -99;
5101 }
Dave Barach41da02d2016-07-11 16:48:42 -07005102
Dave Barach72d72232016-08-04 10:15:08 -04005103 M (SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect);
Dave Barach41da02d2016-07-11 16:48:42 -07005104
Dave Barach72d72232016-08-04 10:15:08 -04005105 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5106 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
5107 mp->enable = enable;
5108
5109 S;
5110 W;
5111 /* NOTREACHED */
5112 return 0;
5113}
5114
5115static int
5116api_sw_interface_set_l2_bridge (vat_main_t * vam)
5117{
5118 unformat_input_t *i = vam->input;
5119 vl_api_sw_interface_set_l2_bridge_t *mp;
5120 f64 timeout;
5121 u32 rx_sw_if_index;
5122 u8 rx_sw_if_index_set = 0;
5123 u32 bd_id;
5124 u8 bd_id_set = 0;
5125 u8 bvi = 0;
5126 u32 shg = 0;
5127 u8 enable = 1;
5128
5129 /* Parse args required to build the message */
5130 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5131 {
5132 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
5133 rx_sw_if_index_set = 1;
5134 else if (unformat (i, "bd_id %d", &bd_id))
5135 bd_id_set = 1;
5136 else if (unformat (i, "%U", unformat_sw_if_index, vam, &rx_sw_if_index))
5137 rx_sw_if_index_set = 1;
5138 else if (unformat (i, "shg %d", &shg))
5139 ;
5140 else if (unformat (i, "bvi"))
5141 bvi = 1;
5142 else if (unformat (i, "enable"))
5143 enable = 1;
5144 else if (unformat (i, "disable"))
5145 enable = 0;
5146 else
5147 break;
5148 }
5149
5150 if (rx_sw_if_index_set == 0)
5151 {
5152 errmsg ("missing rx interface name or sw_if_index\n");
5153 return -99;
5154 }
5155
5156 if (enable && (bd_id_set == 0))
5157 {
5158 errmsg ("missing bridge domain\n");
5159 return -99;
5160 }
5161
5162 M (SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge);
5163
5164 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
5165 mp->bd_id = ntohl (bd_id);
5166 mp->shg = (u8) shg;
5167 mp->bvi = bvi;
5168 mp->enable = enable;
5169
5170 S;
5171 W;
5172 /* NOTREACHED */
5173 return 0;
5174}
5175
5176static int
5177api_bridge_domain_dump (vat_main_t * vam)
5178{
5179 unformat_input_t *i = vam->input;
5180 vl_api_bridge_domain_dump_t *mp;
5181 f64 timeout;
5182 u32 bd_id = ~0;
5183
5184 /* Parse args required to build the message */
5185 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5186 {
5187 if (unformat (i, "bd_id %d", &bd_id))
5188 ;
5189 else
5190 break;
5191 }
5192
5193 M (BRIDGE_DOMAIN_DUMP, bridge_domain_dump);
5194 mp->bd_id = ntohl (bd_id);
5195 S;
5196
5197 /* Use a control ping for synchronization */
5198 {
5199 vl_api_control_ping_t *mp;
5200 M (CONTROL_PING, control_ping);
5201 S;
5202 }
5203
5204 W;
5205 /* NOTREACHED */
5206 return 0;
5207}
5208
5209static int
5210api_bridge_domain_add_del (vat_main_t * vam)
5211{
5212 unformat_input_t *i = vam->input;
5213 vl_api_bridge_domain_add_del_t *mp;
5214 f64 timeout;
5215 u32 bd_id = ~0;
5216 u8 is_add = 1;
5217 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
5218
5219 /* Parse args required to build the message */
5220 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5221 {
5222 if (unformat (i, "bd_id %d", &bd_id))
5223 ;
5224 else if (unformat (i, "flood %d", &flood))
5225 ;
5226 else if (unformat (i, "uu-flood %d", &uu_flood))
5227 ;
5228 else if (unformat (i, "forward %d", &forward))
5229 ;
5230 else if (unformat (i, "learn %d", &learn))
5231 ;
5232 else if (unformat (i, "arp-term %d", &arp_term))
5233 ;
5234 else if (unformat (i, "del"))
5235 {
5236 is_add = 0;
5237 flood = uu_flood = forward = learn = 0;
5238 }
5239 else
5240 break;
5241 }
5242
5243 if (bd_id == ~0)
5244 {
5245 errmsg ("missing bridge domain\n");
5246 return -99;
5247 }
5248
5249 M (BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del);
5250
5251 mp->bd_id = ntohl (bd_id);
5252 mp->flood = flood;
5253 mp->uu_flood = uu_flood;
5254 mp->forward = forward;
5255 mp->learn = learn;
5256 mp->arp_term = arp_term;
5257 mp->is_add = is_add;
5258
5259 S;
5260 W;
5261 /* NOTREACHED */
5262 return 0;
5263}
5264
5265static int
5266api_l2fib_add_del (vat_main_t * vam)
5267{
5268 unformat_input_t *i = vam->input;
5269 vl_api_l2fib_add_del_t *mp;
5270 f64 timeout;
5271 u64 mac = 0;
5272 u8 mac_set = 0;
5273 u32 bd_id;
5274 u8 bd_id_set = 0;
5275 u32 sw_if_index;
5276 u8 sw_if_index_set = 0;
5277 u8 is_add = 1;
5278 u8 static_mac = 0;
5279 u8 filter_mac = 0;
5280 u8 bvi_mac = 0;
5281 int count = 1;
5282 f64 before = 0;
5283 int j;
5284
5285 /* Parse args required to build the message */
5286 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5287 {
5288 if (unformat (i, "mac %U", unformat_ethernet_address, &mac))
5289 mac_set = 1;
5290 else if (unformat (i, "bd_id %d", &bd_id))
5291 bd_id_set = 1;
5292 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5293 sw_if_index_set = 1;
5294 else if (unformat (i, "sw_if"))
5295 {
5296 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5297 {
5298 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5299 sw_if_index_set = 1;
5300 }
5301 else
5302 break;
5303 }
5304 else if (unformat (i, "static"))
5305 static_mac = 1;
5306 else if (unformat (i, "filter"))
5307 {
5308 filter_mac = 1;
5309 static_mac = 1;
5310 }
5311 else if (unformat (i, "bvi"))
5312 {
5313 bvi_mac = 1;
5314 static_mac = 1;
5315 }
5316 else if (unformat (i, "del"))
5317 is_add = 0;
5318 else if (unformat (i, "count %d", &count))
5319 ;
5320 else
5321 break;
5322 }
5323
5324 if (mac_set == 0)
5325 {
5326 errmsg ("missing mac address\n");
5327 return -99;
5328 }
5329
5330 if (bd_id_set == 0)
5331 {
5332 errmsg ("missing bridge domain\n");
5333 return -99;
5334 }
5335
5336 if (is_add && (sw_if_index_set == 0))
5337 {
5338 errmsg ("missing interface name or sw_if_index\n");
5339 return -99;
5340 }
5341
5342 if (count > 1)
5343 {
5344 /* Turn on async mode */
5345 vam->async_mode = 1;
5346 vam->async_errors = 0;
5347 before = vat_time_now (vam);
5348 }
5349
5350 for (j = 0; j < count; j++)
5351 {
5352 M (L2FIB_ADD_DEL, l2fib_add_del);
5353
5354 mp->mac = mac;
5355 mp->bd_id = ntohl (bd_id);
5356 mp->is_add = is_add;
5357
5358 if (is_add)
5359 {
5360 mp->sw_if_index = ntohl (sw_if_index);
5361 mp->static_mac = static_mac;
5362 mp->filter_mac = filter_mac;
5363 mp->bvi_mac = bvi_mac;
5364 }
5365 increment_mac_address (&mac);
5366 /* send it... */
5367 S;
5368 }
5369
5370 if (count > 1)
5371 {
5372 vl_api_control_ping_t *mp;
5373 f64 after;
5374
5375 /* Shut off async mode */
5376 vam->async_mode = 0;
5377
5378 M (CONTROL_PING, control_ping);
5379 S;
5380
5381 timeout = vat_time_now (vam) + 1.0;
5382 while (vat_time_now (vam) < timeout)
5383 if (vam->result_ready == 1)
5384 goto out;
5385 vam->retval = -99;
Dave Barach41da02d2016-07-11 16:48:42 -07005386
5387 out:
Dave Barach72d72232016-08-04 10:15:08 -04005388 if (vam->retval == -99)
5389 errmsg ("timeout\n");
Dave Barach41da02d2016-07-11 16:48:42 -07005390
Dave Barach72d72232016-08-04 10:15:08 -04005391 if (vam->async_errors > 0)
5392 {
5393 errmsg ("%d asynchronous errors\n", vam->async_errors);
5394 vam->retval = -98;
5395 }
5396 vam->async_errors = 0;
5397 after = vat_time_now (vam);
Dave Barach41da02d2016-07-11 16:48:42 -07005398
Dave Barach72d72232016-08-04 10:15:08 -04005399 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
5400 count, after - before, count / (after - before));
Dave Barach41da02d2016-07-11 16:48:42 -07005401 }
Dave Barach72d72232016-08-04 10:15:08 -04005402 else
5403 {
5404 /* Wait for a reply... */
5405 W;
5406 }
5407 /* Return the good/bad news */
5408 return (vam->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005409}
5410
Dave Barach72d72232016-08-04 10:15:08 -04005411static int
5412api_l2_flags (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005413{
Dave Barach72d72232016-08-04 10:15:08 -04005414 unformat_input_t *i = vam->input;
5415 vl_api_l2_flags_t *mp;
5416 f64 timeout;
5417 u32 sw_if_index;
5418 u32 feature_bitmap = 0;
5419 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005420
Dave Barach72d72232016-08-04 10:15:08 -04005421 /* Parse args required to build the message */
5422 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5423 {
5424 if (unformat (i, "sw_if_index %d", &sw_if_index))
5425 sw_if_index_set = 1;
5426 else if (unformat (i, "sw_if"))
5427 {
5428 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5429 {
5430 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5431 sw_if_index_set = 1;
5432 }
5433 else
5434 break;
5435 }
5436 else if (unformat (i, "learn"))
5437 feature_bitmap |= L2INPUT_FEAT_LEARN;
5438 else if (unformat (i, "forward"))
5439 feature_bitmap |= L2INPUT_FEAT_FWD;
5440 else if (unformat (i, "flood"))
5441 feature_bitmap |= L2INPUT_FEAT_FLOOD;
5442 else if (unformat (i, "uu-flood"))
5443 feature_bitmap |= L2INPUT_FEAT_UU_FLOOD;
5444 else
5445 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005446 }
5447
Dave Barach72d72232016-08-04 10:15:08 -04005448 if (sw_if_index_set == 0)
5449 {
5450 errmsg ("missing interface name or sw_if_index\n");
5451 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005452 }
5453
Dave Barach72d72232016-08-04 10:15:08 -04005454 M (L2_FLAGS, l2_flags);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005455
Dave Barach72d72232016-08-04 10:15:08 -04005456 mp->sw_if_index = ntohl (sw_if_index);
5457 mp->feature_bitmap = ntohl (feature_bitmap);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005458
Dave Barach72d72232016-08-04 10:15:08 -04005459 S;
5460 W;
5461 /* NOTREACHED */
5462 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005463}
5464
Dave Barach72d72232016-08-04 10:15:08 -04005465static int
5466api_bridge_flags (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005467{
Dave Barach72d72232016-08-04 10:15:08 -04005468 unformat_input_t *i = vam->input;
5469 vl_api_bridge_flags_t *mp;
5470 f64 timeout;
5471 u32 bd_id;
5472 u8 bd_id_set = 0;
5473 u8 is_set = 1;
5474 u32 flags = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005475
Dave Barach72d72232016-08-04 10:15:08 -04005476 /* Parse args required to build the message */
5477 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5478 {
5479 if (unformat (i, "bd_id %d", &bd_id))
5480 bd_id_set = 1;
5481 else if (unformat (i, "learn"))
5482 flags |= L2_LEARN;
5483 else if (unformat (i, "forward"))
5484 flags |= L2_FWD;
5485 else if (unformat (i, "flood"))
5486 flags |= L2_FLOOD;
5487 else if (unformat (i, "uu-flood"))
5488 flags |= L2_UU_FLOOD;
5489 else if (unformat (i, "arp-term"))
5490 flags |= L2_ARP_TERM;
5491 else if (unformat (i, "off"))
5492 is_set = 0;
5493 else if (unformat (i, "disable"))
5494 is_set = 0;
5495 else
5496 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005497 }
5498
Dave Barach72d72232016-08-04 10:15:08 -04005499 if (bd_id_set == 0)
5500 {
5501 errmsg ("missing bridge domain\n");
5502 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005503 }
5504
Dave Barach72d72232016-08-04 10:15:08 -04005505 M (BRIDGE_FLAGS, bridge_flags);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005506
Dave Barach72d72232016-08-04 10:15:08 -04005507 mp->bd_id = ntohl (bd_id);
5508 mp->feature_bitmap = ntohl (flags);
5509 mp->is_set = is_set;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005510
Dave Barach72d72232016-08-04 10:15:08 -04005511 S;
5512 W;
5513 /* NOTREACHED */
5514 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005515}
5516
Dave Barach72d72232016-08-04 10:15:08 -04005517static int
5518api_bd_ip_mac_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005519{
Dave Barach72d72232016-08-04 10:15:08 -04005520 unformat_input_t *i = vam->input;
5521 vl_api_bd_ip_mac_add_del_t *mp;
5522 f64 timeout;
5523 u32 bd_id;
5524 u8 is_ipv6 = 0;
5525 u8 is_add = 1;
5526 u8 bd_id_set = 0;
5527 u8 ip_set = 0;
5528 u8 mac_set = 0;
5529 ip4_address_t v4addr;
5530 ip6_address_t v6addr;
5531 u8 macaddr[6];
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005532
Ed Warnickecb9cada2015-12-08 15:45:58 -07005533
Dave Barach72d72232016-08-04 10:15:08 -04005534 /* Parse args required to build the message */
5535 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5536 {
5537 if (unformat (i, "bd_id %d", &bd_id))
5538 {
5539 bd_id_set++;
5540 }
5541 else if (unformat (i, "%U", unformat_ip4_address, &v4addr))
5542 {
5543 ip_set++;
5544 }
5545 else if (unformat (i, "%U", unformat_ip6_address, &v6addr))
5546 {
5547 ip_set++;
5548 is_ipv6++;
5549 }
5550 else if (unformat (i, "%U", unformat_ethernet_address, macaddr))
5551 {
5552 mac_set++;
5553 }
5554 else if (unformat (i, "del"))
5555 is_add = 0;
5556 else
5557 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005558 }
5559
Dave Barach72d72232016-08-04 10:15:08 -04005560 if (bd_id_set == 0)
5561 {
5562 errmsg ("missing bridge domain\n");
5563 return -99;
5564 }
5565 else if (ip_set == 0)
5566 {
5567 errmsg ("missing IP address\n");
5568 return -99;
5569 }
5570 else if (mac_set == 0)
5571 {
5572 errmsg ("missing MAC address\n");
5573 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005574 }
5575
Dave Barach72d72232016-08-04 10:15:08 -04005576 M (BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005577
Dave Barach72d72232016-08-04 10:15:08 -04005578 mp->bd_id = ntohl (bd_id);
5579 mp->is_ipv6 = is_ipv6;
5580 mp->is_add = is_add;
5581 if (is_ipv6)
5582 clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr));
5583 else
5584 clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr));
5585 clib_memcpy (mp->mac_address, macaddr, 6);
5586 S;
5587 W;
5588 /* NOTREACHED */
5589 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005590}
5591
Dave Barach72d72232016-08-04 10:15:08 -04005592static int
5593api_tap_connect (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005594{
Dave Barach72d72232016-08-04 10:15:08 -04005595 unformat_input_t *i = vam->input;
5596 vl_api_tap_connect_t *mp;
5597 f64 timeout;
5598 u8 mac_address[6];
5599 u8 random_mac = 1;
5600 u8 name_set = 0;
5601 u8 *tap_name;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005602
Dave Barach72d72232016-08-04 10:15:08 -04005603 memset (mac_address, 0, sizeof (mac_address));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005604
Dave Barach72d72232016-08-04 10:15:08 -04005605 /* Parse args required to build the message */
5606 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5607 {
5608 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5609 {
5610 random_mac = 0;
5611 }
5612 else if (unformat (i, "random-mac"))
5613 random_mac = 1;
5614 else if (unformat (i, "tapname %s", &tap_name))
5615 name_set = 1;
5616 else
5617 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005618 }
5619
Dave Barach72d72232016-08-04 10:15:08 -04005620 if (name_set == 0)
5621 {
5622 errmsg ("missing tap name\n");
5623 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005624 }
Dave Barach72d72232016-08-04 10:15:08 -04005625 if (vec_len (tap_name) > 63)
5626 {
5627 errmsg ("tap name too long\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -07005628 }
Dave Barach72d72232016-08-04 10:15:08 -04005629 vec_add1 (tap_name, 0);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005630
Dave Barach72d72232016-08-04 10:15:08 -04005631 /* Construct the API message */
5632 M (TAP_CONNECT, tap_connect);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005633
Dave Barach72d72232016-08-04 10:15:08 -04005634 mp->use_random_mac = random_mac;
5635 clib_memcpy (mp->mac_address, mac_address, 6);
5636 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5637 vec_free (tap_name);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005638
Dave Barach72d72232016-08-04 10:15:08 -04005639 /* send it... */
5640 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005641
Dave Barach72d72232016-08-04 10:15:08 -04005642 /* Wait for a reply... */
5643 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005644}
5645
Dave Barach72d72232016-08-04 10:15:08 -04005646static int
5647api_tap_modify (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005648{
Dave Barach72d72232016-08-04 10:15:08 -04005649 unformat_input_t *i = vam->input;
5650 vl_api_tap_modify_t *mp;
5651 f64 timeout;
5652 u8 mac_address[6];
5653 u8 random_mac = 1;
5654 u8 name_set = 0;
5655 u8 *tap_name;
5656 u32 sw_if_index = ~0;
5657 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005658
Dave Barach72d72232016-08-04 10:15:08 -04005659 memset (mac_address, 0, sizeof (mac_address));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005660
Dave Barach72d72232016-08-04 10:15:08 -04005661 /* Parse args required to build the message */
5662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5663 {
5664 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5665 sw_if_index_set = 1;
5666 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5667 sw_if_index_set = 1;
5668 else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5669 {
5670 random_mac = 0;
5671 }
5672 else if (unformat (i, "random-mac"))
5673 random_mac = 1;
5674 else if (unformat (i, "tapname %s", &tap_name))
5675 name_set = 1;
5676 else
5677 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005678 }
5679
Dave Barach72d72232016-08-04 10:15:08 -04005680 if (sw_if_index_set == 0)
5681 {
5682 errmsg ("missing vpp interface name");
5683 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005684 }
Dave Barach72d72232016-08-04 10:15:08 -04005685 if (name_set == 0)
5686 {
5687 errmsg ("missing tap name\n");
5688 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005689 }
Dave Barach72d72232016-08-04 10:15:08 -04005690 if (vec_len (tap_name) > 63)
5691 {
5692 errmsg ("tap name too long\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -07005693 }
Dave Barach72d72232016-08-04 10:15:08 -04005694 vec_add1 (tap_name, 0);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005695
Dave Barach72d72232016-08-04 10:15:08 -04005696 /* Construct the API message */
5697 M (TAP_MODIFY, tap_modify);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005698
Dave Barach72d72232016-08-04 10:15:08 -04005699 mp->use_random_mac = random_mac;
5700 mp->sw_if_index = ntohl (sw_if_index);
5701 clib_memcpy (mp->mac_address, mac_address, 6);
5702 clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name));
5703 vec_free (tap_name);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005704
Dave Barach72d72232016-08-04 10:15:08 -04005705 /* send it... */
5706 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005707
Dave Barach72d72232016-08-04 10:15:08 -04005708 /* Wait for a reply... */
5709 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005710}
5711
Dave Barach72d72232016-08-04 10:15:08 -04005712static int
5713api_tap_delete (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005714{
Dave Barach72d72232016-08-04 10:15:08 -04005715 unformat_input_t *i = vam->input;
5716 vl_api_tap_delete_t *mp;
5717 f64 timeout;
5718 u32 sw_if_index = ~0;
5719 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005720
Dave Barach72d72232016-08-04 10:15:08 -04005721 /* Parse args required to build the message */
5722 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5723 {
5724 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5725 sw_if_index_set = 1;
5726 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5727 sw_if_index_set = 1;
5728 else
5729 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005730 }
5731
Dave Barach72d72232016-08-04 10:15:08 -04005732 if (sw_if_index_set == 0)
5733 {
5734 errmsg ("missing vpp interface name");
5735 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005736 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005737
Dave Barach72d72232016-08-04 10:15:08 -04005738 /* Construct the API message */
5739 M (TAP_DELETE, tap_delete);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005740
Dave Barach72d72232016-08-04 10:15:08 -04005741 mp->sw_if_index = ntohl (sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005742
Dave Barach72d72232016-08-04 10:15:08 -04005743 /* send it... */
5744 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005745
Dave Barach72d72232016-08-04 10:15:08 -04005746 /* Wait for a reply... */
5747 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005748}
5749
Dave Barach72d72232016-08-04 10:15:08 -04005750static int
5751api_ip_add_del_route (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07005752{
Dave Barach72d72232016-08-04 10:15:08 -04005753 unformat_input_t *i = vam->input;
5754 vl_api_ip_add_del_route_t *mp;
5755 f64 timeout;
5756 u32 sw_if_index = ~0, vrf_id = 0;
5757 u8 sw_if_index_set = 0;
5758 u8 is_ipv6 = 0;
5759 u8 is_local = 0, is_drop = 0;
Neale Ranns948e00f2016-10-20 13:39:34 +01005760 u8 is_unreach = 0, is_prohibit = 0;
Dave Barach72d72232016-08-04 10:15:08 -04005761 u8 create_vrf_if_needed = 0;
5762 u8 is_add = 1;
5763 u8 next_hop_weight = 1;
5764 u8 not_last = 0;
5765 u8 is_multipath = 0;
5766 u8 address_set = 0;
5767 u8 address_length_set = 0;
Neale Ranns1357f3b2016-10-16 12:01:42 -07005768 u32 next_hop_table_id = 0;
Dave Barach72d72232016-08-04 10:15:08 -04005769 u32 resolve_attempts = 0;
5770 u32 dst_address_length = 0;
5771 u8 next_hop_set = 0;
5772 ip4_address_t v4_dst_address, v4_next_hop_address;
5773 ip6_address_t v6_dst_address, v6_next_hop_address;
5774 int count = 1;
5775 int j;
5776 f64 before = 0;
5777 u32 random_add_del = 0;
5778 u32 *random_vector = 0;
5779 uword *random_hash;
5780 u32 random_seed = 0xdeaddabe;
5781 u32 classify_table_index = ~0;
5782 u8 is_classify = 0;
Neale Ranns33a7dd52016-10-07 15:14:33 +01005783 u8 resolve_host = 0, resolve_attached = 0;
Neale Ranns1357f3b2016-10-16 12:01:42 -07005784 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005785
Dave Barach72d72232016-08-04 10:15:08 -04005786 /* Parse args required to build the message */
5787 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5788 {
5789 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
5790 sw_if_index_set = 1;
5791 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5792 sw_if_index_set = 1;
5793 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
5794 {
5795 address_set = 1;
5796 is_ipv6 = 0;
5797 }
5798 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
5799 {
5800 address_set = 1;
5801 is_ipv6 = 1;
5802 }
5803 else if (unformat (i, "/%d", &dst_address_length))
5804 {
5805 address_length_set = 1;
5806 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005807
Dave Barach72d72232016-08-04 10:15:08 -04005808 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
5809 &v4_next_hop_address))
5810 {
5811 next_hop_set = 1;
5812 }
5813 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
5814 &v6_next_hop_address))
5815 {
5816 next_hop_set = 1;
5817 }
5818 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
5819 ;
5820 else if (unformat (i, "weight %d", &next_hop_weight))
5821 ;
5822 else if (unformat (i, "drop"))
5823 {
5824 is_drop = 1;
5825 }
Neale Ranns948e00f2016-10-20 13:39:34 +01005826 else if (unformat (i, "null-send-unreach"))
5827 {
5828 is_unreach = 1;
5829 }
5830 else if (unformat (i, "null-send-prohibit"))
5831 {
5832 is_prohibit = 1;
5833 }
Dave Barach72d72232016-08-04 10:15:08 -04005834 else if (unformat (i, "local"))
5835 {
5836 is_local = 1;
5837 }
5838 else if (unformat (i, "classify %d", &classify_table_index))
5839 {
5840 is_classify = 1;
5841 }
5842 else if (unformat (i, "del"))
5843 is_add = 0;
5844 else if (unformat (i, "add"))
5845 is_add = 1;
5846 else if (unformat (i, "not-last"))
5847 not_last = 1;
Neale Ranns0bfe5d82016-08-25 15:29:12 +01005848 else if (unformat (i, "resolve-via-host"))
5849 resolve_host = 1;
5850 else if (unformat (i, "resolve-via-attached"))
5851 resolve_attached = 1;
Dave Barach72d72232016-08-04 10:15:08 -04005852 else if (unformat (i, "multipath"))
5853 is_multipath = 1;
5854 else if (unformat (i, "vrf %d", &vrf_id))
5855 ;
5856 else if (unformat (i, "create-vrf"))
5857 create_vrf_if_needed = 1;
5858 else if (unformat (i, "count %d", &count))
5859 ;
Neale Ranns1357f3b2016-10-16 12:01:42 -07005860 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
5861 ;
5862 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
5863 ;
5864 else if (unformat (i, "out-label %d", &next_hop_out_label))
Dave Barach72d72232016-08-04 10:15:08 -04005865 ;
5866 else if (unformat (i, "random"))
5867 random_add_del = 1;
5868 else if (unformat (i, "seed %d", &random_seed))
5869 ;
5870 else
5871 {
5872 clib_warning ("parse error '%U'", format_unformat_error, i);
5873 return -99;
5874 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07005875 }
5876
Dave Barach72d72232016-08-04 10:15:08 -04005877 if (resolve_attempts > 0 && sw_if_index_set == 0)
5878 {
5879 errmsg ("ARP resolution needs explicit interface or sw_if_index\n");
5880 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005881 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005882
Neale Ranns948e00f2016-10-20 13:39:34 +01005883 if (!next_hop_set && !is_drop && !is_local &&
5884 !is_classify && !is_unreach && !is_prohibit)
Dave Barach72d72232016-08-04 10:15:08 -04005885 {
Neale Ranns948e00f2016-10-20 13:39:34 +01005886 errmsg
5887 ("next hop / local / drop / unreach / prohibit / classify not set\n");
Dave Barach72d72232016-08-04 10:15:08 -04005888 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005889 }
5890
Dave Barach72d72232016-08-04 10:15:08 -04005891 if (address_set == 0)
5892 {
5893 errmsg ("missing addresses\n");
5894 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005895 }
5896
Dave Barach72d72232016-08-04 10:15:08 -04005897 if (address_length_set == 0)
5898 {
5899 errmsg ("missing address length\n");
5900 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005901 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005902
Dave Barach72d72232016-08-04 10:15:08 -04005903 /* Generate a pile of unique, random routes */
5904 if (random_add_del)
5905 {
5906 u32 this_random_address;
5907 random_hash = hash_create (count, sizeof (uword));
Ed Warnickecb9cada2015-12-08 15:45:58 -07005908
Dave Barach72d72232016-08-04 10:15:08 -04005909 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
5910 for (j = 0; j <= count; j++)
5911 {
5912 do
5913 {
5914 this_random_address = random_u32 (&random_seed);
5915 this_random_address =
5916 clib_host_to_net_u32 (this_random_address);
5917 }
5918 while (hash_get (random_hash, this_random_address));
5919 vec_add1 (random_vector, this_random_address);
5920 hash_set (random_hash, this_random_address, 1);
5921 }
5922 hash_free (random_hash);
5923 v4_dst_address.as_u32 = random_vector[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -07005924 }
5925
Dave Barach72d72232016-08-04 10:15:08 -04005926 if (count > 1)
5927 {
5928 /* Turn on async mode */
5929 vam->async_mode = 1;
5930 vam->async_errors = 0;
5931 before = vat_time_now (vam);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005932 }
5933
Dave Barach72d72232016-08-04 10:15:08 -04005934 for (j = 0; j < count; j++)
5935 {
5936 /* Construct the API message */
5937 M (IP_ADD_DEL_ROUTE, ip_add_del_route);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005938
Dave Barach72d72232016-08-04 10:15:08 -04005939 mp->next_hop_sw_if_index = ntohl (sw_if_index);
Neale Ranns1357f3b2016-10-16 12:01:42 -07005940 mp->table_id = ntohl (vrf_id);
Dave Barach72d72232016-08-04 10:15:08 -04005941 if (resolve_attempts > 0)
5942 {
5943 mp->resolve_attempts = ntohl (resolve_attempts);
5944 mp->resolve_if_needed = 1;
5945 }
5946 mp->create_vrf_if_needed = create_vrf_if_needed;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08005947
Dave Barach72d72232016-08-04 10:15:08 -04005948 mp->is_add = is_add;
5949 mp->is_drop = is_drop;
Neale Ranns948e00f2016-10-20 13:39:34 +01005950 mp->is_unreach = is_unreach;
5951 mp->is_prohibit = is_prohibit;
Dave Barach72d72232016-08-04 10:15:08 -04005952 mp->is_ipv6 = is_ipv6;
5953 mp->is_local = is_local;
5954 mp->is_classify = is_classify;
5955 mp->is_multipath = is_multipath;
Neale Ranns0bfe5d82016-08-25 15:29:12 +01005956 mp->is_resolve_host = resolve_host;
5957 mp->is_resolve_attached = resolve_attached;
Dave Barach72d72232016-08-04 10:15:08 -04005958 mp->not_last = not_last;
5959 mp->next_hop_weight = next_hop_weight;
5960 mp->dst_address_length = dst_address_length;
Neale Ranns1357f3b2016-10-16 12:01:42 -07005961 mp->next_hop_table_id = ntohl (next_hop_table_id);
Dave Barach72d72232016-08-04 10:15:08 -04005962 mp->classify_table_index = ntohl (classify_table_index);
Neale Ranns1357f3b2016-10-16 12:01:42 -07005963 mp->next_hop_out_label = ntohl (next_hop_out_label);
Ed Warnickecb9cada2015-12-08 15:45:58 -07005964
Dave Barach72d72232016-08-04 10:15:08 -04005965 if (is_ipv6)
5966 {
5967 clib_memcpy (mp->dst_address, &v6_dst_address,
5968 sizeof (v6_dst_address));
5969 if (next_hop_set)
5970 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
5971 sizeof (v6_next_hop_address));
5972 increment_v6_address (&v6_dst_address);
5973 }
5974 else
5975 {
5976 clib_memcpy (mp->dst_address, &v4_dst_address,
5977 sizeof (v4_dst_address));
5978 if (next_hop_set)
5979 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
5980 sizeof (v4_next_hop_address));
5981 if (random_add_del)
5982 v4_dst_address.as_u32 = random_vector[j + 1];
5983 else
5984 increment_v4_address (&v4_dst_address);
5985 }
5986 /* send it... */
5987 S;
Dave Barach477570e2016-10-09 17:43:22 -04005988 /* If we receive SIGTERM, stop now... */
5989 if (vam->do_exit)
5990 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005991 }
5992
Dave Barach72d72232016-08-04 10:15:08 -04005993 /* When testing multiple add/del ops, use a control-ping to sync */
5994 if (count > 1)
5995 {
5996 vl_api_control_ping_t *mp;
5997 f64 after;
Ed Warnickecb9cada2015-12-08 15:45:58 -07005998
Dave Barach72d72232016-08-04 10:15:08 -04005999 /* Shut off async mode */
6000 vam->async_mode = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006001
Dave Barach72d72232016-08-04 10:15:08 -04006002 M (CONTROL_PING, control_ping);
6003 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006004
Dave Barach72d72232016-08-04 10:15:08 -04006005 timeout = vat_time_now (vam) + 1.0;
6006 while (vat_time_now (vam) < timeout)
6007 if (vam->result_ready == 1)
6008 goto out;
6009 vam->retval = -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006010
6011 out:
Dave Barach72d72232016-08-04 10:15:08 -04006012 if (vam->retval == -99)
6013 errmsg ("timeout\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -07006014
Dave Barach72d72232016-08-04 10:15:08 -04006015 if (vam->async_errors > 0)
6016 {
6017 errmsg ("%d asynchronous errors\n", vam->async_errors);
6018 vam->retval = -98;
6019 }
6020 vam->async_errors = 0;
6021 after = vat_time_now (vam);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006022
Dave Barach477570e2016-10-09 17:43:22 -04006023 /* slim chance, but we might have eaten SIGTERM on the first iteration */
6024 if (j > 0)
6025 count = j;
6026
Dave Barach72d72232016-08-04 10:15:08 -04006027 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
6028 count, after - before, count / (after - before));
6029 }
6030 else
6031 {
6032 /* Wait for a reply... */
6033 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006034 }
6035
Dave Barach72d72232016-08-04 10:15:08 -04006036 /* Return the good/bad news */
6037 return (vam->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006038}
6039
Dave Barach72d72232016-08-04 10:15:08 -04006040static int
Neale Ranns1357f3b2016-10-16 12:01:42 -07006041api_mpls_route_add_del (vat_main_t * vam)
6042{
6043 unformat_input_t *i = vam->input;
6044 vl_api_mpls_route_add_del_t *mp;
6045 f64 timeout;
6046 u32 sw_if_index = ~0, table_id = 0;
6047 u8 create_table_if_needed = 0;
6048 u8 is_add = 1;
6049 u8 next_hop_weight = 1;
6050 u8 is_multipath = 0;
6051 u32 next_hop_table_id = 0;
6052 u8 next_hop_set = 0;
6053 ip4_address_t v4_next_hop_address = {
6054 .as_u32 = 0,
6055 };
6056 ip6_address_t v6_next_hop_address = { {0} };
6057 int count = 1;
6058 int j;
6059 f64 before = 0;
6060 u32 classify_table_index = ~0;
6061 u8 is_classify = 0;
6062 u8 resolve_host = 0, resolve_attached = 0;
6063 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
6064 mpls_label_t local_label = MPLS_LABEL_INVALID;
6065 u8 is_eos = 1;
6066 u8 next_hop_proto_is_ip4 = 1;
6067
6068 /* Parse args required to build the message */
6069 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6070 {
6071 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6072 ;
6073 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6074 ;
6075 else if (unformat (i, "%d", &local_label))
6076 ;
6077 else if (unformat (i, "eos"))
6078 is_eos = 1;
6079 else if (unformat (i, "non-eos"))
6080 is_eos = 0;
6081 else if (unformat (i, "via %U", unformat_ip4_address,
6082 &v4_next_hop_address))
6083 {
6084 next_hop_set = 1;
6085 next_hop_proto_is_ip4 = 1;
6086 }
6087 else if (unformat (i, "via %U", unformat_ip6_address,
6088 &v6_next_hop_address))
6089 {
6090 next_hop_set = 1;
6091 next_hop_proto_is_ip4 = 0;
6092 }
6093 else if (unformat (i, "weight %d", &next_hop_weight))
6094 ;
6095 else if (unformat (i, "create-table"))
6096 create_table_if_needed = 1;
6097 else if (unformat (i, "classify %d", &classify_table_index))
6098 {
6099 is_classify = 1;
6100 }
6101 else if (unformat (i, "del"))
6102 is_add = 0;
6103 else if (unformat (i, "add"))
6104 is_add = 1;
6105 else if (unformat (i, "resolve-via-host"))
6106 resolve_host = 1;
6107 else if (unformat (i, "resolve-via-attached"))
6108 resolve_attached = 1;
6109 else if (unformat (i, "multipath"))
6110 is_multipath = 1;
6111 else if (unformat (i, "count %d", &count))
6112 ;
6113 else if (unformat (i, "lookup-in-ip4-table %d", &next_hop_table_id))
6114 {
6115 next_hop_set = 1;
6116 next_hop_proto_is_ip4 = 1;
6117 }
6118 else if (unformat (i, "lookup-in-ip6-table %d", &next_hop_table_id))
6119 {
6120 next_hop_set = 1;
6121 next_hop_proto_is_ip4 = 0;
6122 }
6123 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
6124 ;
6125 else if (unformat (i, "out-label %d", &next_hop_out_label))
6126 ;
6127 else
6128 {
6129 clib_warning ("parse error '%U'", format_unformat_error, i);
6130 return -99;
6131 }
6132 }
6133
6134 if (!next_hop_set && !is_classify)
6135 {
6136 errmsg ("next hop / classify not set\n");
6137 return -99;
6138 }
6139
6140 if (MPLS_LABEL_INVALID == local_label)
6141 {
6142 errmsg ("missing label\n");
6143 return -99;
6144 }
6145
6146 if (count > 1)
6147 {
6148 /* Turn on async mode */
6149 vam->async_mode = 1;
6150 vam->async_errors = 0;
6151 before = vat_time_now (vam);
6152 }
6153
6154 for (j = 0; j < count; j++)
6155 {
6156 /* Construct the API message */
6157 M (MPLS_ROUTE_ADD_DEL, mpls_route_add_del);
6158
6159 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
6160 mp->mr_table_id = ntohl (table_id);
6161 mp->mr_create_table_if_needed = create_table_if_needed;
6162
6163 mp->mr_is_add = is_add;
6164 mp->mr_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
6165 mp->mr_is_classify = is_classify;
6166 mp->mr_is_multipath = is_multipath;
6167 mp->mr_is_resolve_host = resolve_host;
6168 mp->mr_is_resolve_attached = resolve_attached;
6169 mp->mr_next_hop_weight = next_hop_weight;
6170 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
6171 mp->mr_classify_table_index = ntohl (classify_table_index);
6172 mp->mr_next_hop_out_label = ntohl (next_hop_out_label);
6173 mp->mr_label = ntohl (local_label);
6174 mp->mr_eos = is_eos;
6175
6176 if (next_hop_set)
6177 {
6178 if (next_hop_proto_is_ip4)
6179 {
6180 clib_memcpy (mp->mr_next_hop,
6181 &v4_next_hop_address,
6182 sizeof (v4_next_hop_address));
6183 }
6184 else
6185 {
6186 clib_memcpy (mp->mr_next_hop,
6187 &v6_next_hop_address,
6188 sizeof (v6_next_hop_address));
6189 }
6190 }
6191 local_label++;
6192
6193 /* send it... */
6194 S;
6195 /* If we receive SIGTERM, stop now... */
6196 if (vam->do_exit)
6197 break;
6198 }
6199
6200 /* When testing multiple add/del ops, use a control-ping to sync */
6201 if (count > 1)
6202 {
6203 vl_api_control_ping_t *mp;
6204 f64 after;
6205
6206 /* Shut off async mode */
6207 vam->async_mode = 0;
6208
6209 M (CONTROL_PING, control_ping);
6210 S;
6211
6212 timeout = vat_time_now (vam) + 1.0;
6213 while (vat_time_now (vam) < timeout)
6214 if (vam->result_ready == 1)
6215 goto out;
6216 vam->retval = -99;
6217
6218 out:
6219 if (vam->retval == -99)
6220 errmsg ("timeout\n");
6221
6222 if (vam->async_errors > 0)
6223 {
6224 errmsg ("%d asynchronous errors\n", vam->async_errors);
6225 vam->retval = -98;
6226 }
6227 vam->async_errors = 0;
6228 after = vat_time_now (vam);
6229
6230 /* slim chance, but we might have eaten SIGTERM on the first iteration */
6231 if (j > 0)
6232 count = j;
6233
6234 fformat (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec\n",
6235 count, after - before, count / (after - before));
6236 }
6237 else
6238 {
6239 /* Wait for a reply... */
6240 W;
6241 }
6242
6243 /* Return the good/bad news */
6244 return (vam->retval);
6245}
6246
6247static int
6248api_mpls_ip_bind_unbind (vat_main_t * vam)
6249{
6250 unformat_input_t *i = vam->input;
6251 vl_api_mpls_ip_bind_unbind_t *mp;
6252 f64 timeout;
6253 u32 ip_table_id = 0;
6254 u8 create_table_if_needed = 0;
6255 u8 is_bind = 1;
6256 u8 is_ip4 = 1;
6257 ip4_address_t v4_address;
6258 ip6_address_t v6_address;
6259 u32 address_length;
6260 u8 address_set = 0;
6261 mpls_label_t local_label = MPLS_LABEL_INVALID;
6262
6263 /* Parse args required to build the message */
6264 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6265 {
6266 if (unformat (i, "%U/%d", unformat_ip4_address,
6267 &v4_address, &address_length))
6268 {
6269 is_ip4 = 1;
6270 address_set = 1;
6271 }
6272 else if (unformat (i, "%U/%d", unformat_ip6_address,
6273 &v6_address, &address_length))
6274 {
6275 is_ip4 = 0;
6276 address_set = 1;
6277 }
6278 else if (unformat (i, "%d", &local_label))
6279 ;
6280 else if (unformat (i, "create-table"))
6281 create_table_if_needed = 1;
6282 else if (unformat (i, "table-id %d", &ip_table_id))
6283 ;
6284 else if (unformat (i, "unbind"))
6285 is_bind = 0;
6286 else if (unformat (i, "bind"))
6287 is_bind = 1;
6288 else
6289 {
6290 clib_warning ("parse error '%U'", format_unformat_error, i);
6291 return -99;
6292 }
6293 }
6294
6295 if (!address_set)
6296 {
6297 errmsg ("IP addres not set\n");
6298 return -99;
6299 }
6300
6301 if (MPLS_LABEL_INVALID == local_label)
6302 {
6303 errmsg ("missing label\n");
6304 return -99;
6305 }
6306
6307 /* Construct the API message */
6308 M (MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind);
6309
6310 mp->mb_create_table_if_needed = create_table_if_needed;
6311 mp->mb_is_bind = is_bind;
6312 mp->mb_is_ip4 = is_ip4;
6313 mp->mb_ip_table_id = ntohl (ip_table_id);
6314 mp->mb_mpls_table_id = 0;
6315 mp->mb_label = ntohl (local_label);
6316 mp->mb_address_length = address_length;
6317
6318 if (is_ip4)
6319 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
6320 else
6321 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
6322
6323 /* send it... */
6324 S;
6325
6326 /* Wait for a reply... */
6327 W;
6328
6329 /* Return the good/bad news */
6330 return (vam->retval);
6331}
6332
6333static int
Dave Barach72d72232016-08-04 10:15:08 -04006334api_proxy_arp_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006335{
Dave Barach72d72232016-08-04 10:15:08 -04006336 unformat_input_t *i = vam->input;
6337 vl_api_proxy_arp_add_del_t *mp;
6338 f64 timeout;
6339 u32 vrf_id = 0;
6340 u8 is_add = 1;
6341 ip4_address_t lo, hi;
6342 u8 range_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006343
Dave Barach72d72232016-08-04 10:15:08 -04006344 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6345 {
6346 if (unformat (i, "vrf %d", &vrf_id))
6347 ;
6348 else if (unformat (i, "%U - %U", unformat_ip4_address, &lo,
6349 unformat_ip4_address, &hi))
6350 range_set = 1;
6351 else if (unformat (i, "del"))
6352 is_add = 0;
6353 else
6354 {
6355 clib_warning ("parse error '%U'", format_unformat_error, i);
6356 return -99;
6357 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006358 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006359
Dave Barach72d72232016-08-04 10:15:08 -04006360 if (range_set == 0)
6361 {
6362 errmsg ("address range not set\n");
6363 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006364 }
6365
Dave Barach72d72232016-08-04 10:15:08 -04006366 M (PROXY_ARP_ADD_DEL, proxy_arp_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006367
Dave Barach72d72232016-08-04 10:15:08 -04006368 mp->vrf_id = ntohl (vrf_id);
6369 mp->is_add = is_add;
6370 clib_memcpy (mp->low_address, &lo, sizeof (mp->low_address));
6371 clib_memcpy (mp->hi_address, &hi, sizeof (mp->hi_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07006372
Dave Barach72d72232016-08-04 10:15:08 -04006373 S;
6374 W;
6375 /* NOTREACHED */
6376 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006377}
6378
Dave Barach72d72232016-08-04 10:15:08 -04006379static int
6380api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006381{
Dave Barach72d72232016-08-04 10:15:08 -04006382 unformat_input_t *i = vam->input;
6383 vl_api_proxy_arp_intfc_enable_disable_t *mp;
6384 f64 timeout;
6385 u32 sw_if_index;
6386 u8 enable = 1;
6387 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006388
Dave Barach72d72232016-08-04 10:15:08 -04006389 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6390 {
6391 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6392 sw_if_index_set = 1;
6393 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6394 sw_if_index_set = 1;
6395 else if (unformat (i, "enable"))
6396 enable = 1;
6397 else if (unformat (i, "disable"))
6398 enable = 0;
6399 else
6400 {
6401 clib_warning ("parse error '%U'", format_unformat_error, i);
6402 return -99;
6403 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006404 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006405
Dave Barach72d72232016-08-04 10:15:08 -04006406 if (sw_if_index_set == 0)
6407 {
6408 errmsg ("missing interface name or sw_if_index\n");
6409 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006410 }
6411
Dave Barach72d72232016-08-04 10:15:08 -04006412 M (PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006413
Dave Barach72d72232016-08-04 10:15:08 -04006414 mp->sw_if_index = ntohl (sw_if_index);
6415 mp->enable_disable = enable;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006416
Dave Barach72d72232016-08-04 10:15:08 -04006417 S;
6418 W;
6419 /* NOTREACHED */
6420 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006421}
6422
Dave Barach72d72232016-08-04 10:15:08 -04006423static int
Dave Barach72d72232016-08-04 10:15:08 -04006424api_mpls_add_del_encap (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006425{
Dave Barach72d72232016-08-04 10:15:08 -04006426 unformat_input_t *i = vam->input;
6427 vl_api_mpls_add_del_encap_t *mp;
6428 f64 timeout;
6429 u32 vrf_id = 0;
6430 u32 *labels = 0;
6431 u32 label;
6432 ip4_address_t dst_address;
6433 u8 is_add = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006434
Dave Barach72d72232016-08-04 10:15:08 -04006435 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6436 {
6437 if (unformat (i, "vrf %d", &vrf_id))
6438 ;
6439 else if (unformat (i, "label %d", &label))
6440 vec_add1 (labels, ntohl (label));
6441 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
6442 ;
6443 else if (unformat (i, "del"))
6444 is_add = 0;
6445 else
6446 {
6447 clib_warning ("parse error '%U'", format_unformat_error, i);
6448 return -99;
6449 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006450 }
6451
Dave Barach72d72232016-08-04 10:15:08 -04006452 if (vec_len (labels) == 0)
6453 {
6454 errmsg ("missing encap label stack\n");
6455 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006456 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006457
Dave Barach72d72232016-08-04 10:15:08 -04006458 M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap,
6459 sizeof (u32) * vec_len (labels));
Ed Warnickecb9cada2015-12-08 15:45:58 -07006460
Dave Barach72d72232016-08-04 10:15:08 -04006461 mp->vrf_id = ntohl (vrf_id);
6462 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
6463 mp->is_add = is_add;
6464 mp->nlabels = vec_len (labels);
6465 clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006466
Dave Barach72d72232016-08-04 10:15:08 -04006467 vec_free (labels);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006468
Dave Barach72d72232016-08-04 10:15:08 -04006469 S;
6470 W;
6471 /* NOTREACHED */
6472 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006473}
6474
Dave Barach72d72232016-08-04 10:15:08 -04006475static int
Dave Barach72d72232016-08-04 10:15:08 -04006476api_mpls_ethernet_add_del_tunnel (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006477{
Dave Barach72d72232016-08-04 10:15:08 -04006478 unformat_input_t *i = vam->input;
6479 vl_api_mpls_ethernet_add_del_tunnel_t *mp;
6480 f64 timeout;
6481 u32 inner_vrf_id = 0;
6482 ip4_address_t intfc_address;
6483 u8 dst_mac_address[6];
6484 int dst_set = 1;
6485 u32 tmp;
6486 u8 intfc_address_length = 0;
6487 u8 is_add = 1;
6488 u8 l2_only = 0;
6489 u32 tx_sw_if_index;
6490 int tx_sw_if_index_set = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006491
Dave Barach72d72232016-08-04 10:15:08 -04006492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6493 {
6494 if (unformat (i, "vrf %d", &inner_vrf_id))
6495 ;
6496 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6497 &intfc_address, &tmp))
6498 intfc_address_length = tmp;
6499 else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index))
6500 tx_sw_if_index_set = 1;
6501 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6502 tx_sw_if_index_set = 1;
6503 else if (unformat (i, "dst %U", unformat_ethernet_address,
6504 dst_mac_address))
6505 dst_set = 1;
6506 else if (unformat (i, "l2-only"))
6507 l2_only = 1;
6508 else if (unformat (i, "del"))
6509 is_add = 0;
6510 else
6511 {
6512 clib_warning ("parse error '%U'", format_unformat_error, i);
6513 return -99;
6514 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006515 }
6516
Dave Barach72d72232016-08-04 10:15:08 -04006517 if (!dst_set)
6518 {
6519 errmsg ("dst (mac address) not set\n");
6520 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006521 }
Dave Barach72d72232016-08-04 10:15:08 -04006522 if (!tx_sw_if_index_set)
6523 {
6524 errmsg ("tx-intfc not set\n");
6525 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006526 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006527
Dave Barach72d72232016-08-04 10:15:08 -04006528 M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006529
Dave Barach72d72232016-08-04 10:15:08 -04006530 mp->vrf_id = ntohl (inner_vrf_id);
6531 clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address));
6532 mp->adj_address_length = intfc_address_length;
6533 clib_memcpy (mp->dst_mac_address, dst_mac_address,
6534 sizeof (dst_mac_address));
6535 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6536 mp->l2_only = l2_only;
6537 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006538
Dave Barach72d72232016-08-04 10:15:08 -04006539 S;
6540 W;
6541 /* NOTREACHED */
6542 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006543}
6544
Dave Barach72d72232016-08-04 10:15:08 -04006545static int
6546api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006547{
Dave Barach72d72232016-08-04 10:15:08 -04006548 unformat_input_t *i = vam->input;
6549 vl_api_mpls_ethernet_add_del_tunnel_2_t *mp;
6550 f64 timeout;
6551 u32 inner_vrf_id = 0;
6552 u32 outer_vrf_id = 0;
6553 ip4_address_t adj_address;
6554 int adj_address_set = 0;
6555 ip4_address_t next_hop_address;
6556 int next_hop_address_set = 0;
6557 u32 tmp;
6558 u8 adj_address_length = 0;
6559 u8 l2_only = 0;
6560 u8 is_add = 1;
6561 u32 resolve_attempts = 5;
6562 u8 resolve_if_needed = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006563
Dave Barach72d72232016-08-04 10:15:08 -04006564 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6565 {
6566 if (unformat (i, "inner_vrf_id %d", &inner_vrf_id))
6567 ;
6568 else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id))
6569 ;
6570 else if (unformat (i, "adj %U/%d", unformat_ip4_address,
6571 &adj_address, &tmp))
6572 {
6573 adj_address_length = tmp;
6574 adj_address_set = 1;
6575 }
6576 else if (unformat (i, "next-hop %U", unformat_ip4_address,
6577 &next_hop_address))
6578 next_hop_address_set = 1;
6579 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
6580 ;
6581 else if (unformat (i, "resolve-if-needed %d", &tmp))
6582 resolve_if_needed = tmp;
6583 else if (unformat (i, "l2-only"))
6584 l2_only = 1;
6585 else if (unformat (i, "del"))
6586 is_add = 0;
6587 else
6588 {
6589 clib_warning ("parse error '%U'", format_unformat_error, i);
6590 return -99;
6591 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006592 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006593
Dave Barach72d72232016-08-04 10:15:08 -04006594 if (!adj_address_set)
6595 {
6596 errmsg ("adjacency address/mask not set\n");
6597 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006598 }
Dave Barach72d72232016-08-04 10:15:08 -04006599 if (!next_hop_address_set)
6600 {
6601 errmsg ("ip4 next hop address (in outer fib) not set\n");
6602 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006603 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006604
Dave Barach72d72232016-08-04 10:15:08 -04006605 M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006606
Dave Barach72d72232016-08-04 10:15:08 -04006607 mp->inner_vrf_id = ntohl (inner_vrf_id);
6608 mp->outer_vrf_id = ntohl (outer_vrf_id);
6609 mp->resolve_attempts = ntohl (resolve_attempts);
6610 mp->resolve_if_needed = resolve_if_needed;
6611 mp->is_add = is_add;
6612 mp->l2_only = l2_only;
6613 clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address));
6614 mp->adj_address_length = adj_address_length;
6615 clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address,
6616 sizeof (next_hop_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07006617
Dave Barach72d72232016-08-04 10:15:08 -04006618 S;
6619 W;
6620 /* NOTREACHED */
6621 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006622}
6623
Dave Barach72d72232016-08-04 10:15:08 -04006624static int
6625api_sw_interface_set_unnumbered (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006626{
Dave Barach72d72232016-08-04 10:15:08 -04006627 unformat_input_t *i = vam->input;
6628 vl_api_sw_interface_set_unnumbered_t *mp;
6629 f64 timeout;
6630 u32 sw_if_index;
Dave Barach839fe3e2016-08-10 11:35:54 -04006631 u32 unnum_sw_index = ~0;
Dave Barach72d72232016-08-04 10:15:08 -04006632 u8 is_add = 1;
6633 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006634
Dave Barach72d72232016-08-04 10:15:08 -04006635 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6636 {
6637 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6638 sw_if_index_set = 1;
6639 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6640 sw_if_index_set = 1;
6641 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
6642 ;
6643 else if (unformat (i, "del"))
6644 is_add = 0;
6645 else
6646 {
6647 clib_warning ("parse error '%U'", format_unformat_error, i);
6648 return -99;
6649 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006650 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006651
Dave Barach72d72232016-08-04 10:15:08 -04006652 if (sw_if_index_set == 0)
6653 {
6654 errmsg ("missing interface name or sw_if_index\n");
6655 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006656 }
6657
Dave Barach72d72232016-08-04 10:15:08 -04006658 M (SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006659
Dave Barach72d72232016-08-04 10:15:08 -04006660 mp->sw_if_index = ntohl (sw_if_index);
6661 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
6662 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006663
Dave Barach72d72232016-08-04 10:15:08 -04006664 S;
6665 W;
6666 /* NOTREACHED */
6667 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006668}
6669
Dave Barach72d72232016-08-04 10:15:08 -04006670static int
6671api_ip_neighbor_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006672{
Dave Barach72d72232016-08-04 10:15:08 -04006673 unformat_input_t *i = vam->input;
6674 vl_api_ip_neighbor_add_del_t *mp;
6675 f64 timeout;
6676 u32 sw_if_index;
6677 u8 sw_if_index_set = 0;
6678 u32 vrf_id = 0;
6679 u8 is_add = 1;
6680 u8 is_static = 0;
6681 u8 mac_address[6];
6682 u8 mac_set = 0;
6683 u8 v4_address_set = 0;
6684 u8 v6_address_set = 0;
6685 ip4_address_t v4address;
6686 ip6_address_t v6address;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006687
Dave Barach72d72232016-08-04 10:15:08 -04006688 memset (mac_address, 0, sizeof (mac_address));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006689
Dave Barach72d72232016-08-04 10:15:08 -04006690 /* Parse args required to build the message */
6691 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6692 {
6693 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
6694 {
6695 mac_set = 1;
6696 }
6697 else if (unformat (i, "del"))
6698 is_add = 0;
6699 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6700 sw_if_index_set = 1;
6701 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6702 sw_if_index_set = 1;
6703 else if (unformat (i, "is_static"))
6704 is_static = 1;
6705 else if (unformat (i, "vrf %d", &vrf_id))
6706 ;
6707 else if (unformat (i, "dst %U", unformat_ip4_address, &v4address))
6708 v4_address_set = 1;
6709 else if (unformat (i, "dst %U", unformat_ip6_address, &v6address))
6710 v6_address_set = 1;
6711 else
6712 {
6713 clib_warning ("parse error '%U'", format_unformat_error, i);
6714 return -99;
6715 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006716 }
6717
Dave Barach72d72232016-08-04 10:15:08 -04006718 if (sw_if_index_set == 0)
6719 {
6720 errmsg ("missing interface name or sw_if_index\n");
6721 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006722 }
Dave Barach72d72232016-08-04 10:15:08 -04006723 if (v4_address_set && v6_address_set)
6724 {
6725 errmsg ("both v4 and v6 addresses set\n");
6726 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006727 }
Dave Barach72d72232016-08-04 10:15:08 -04006728 if (!v4_address_set && !v6_address_set)
6729 {
6730 errmsg ("no address set\n");
6731 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006732 }
6733
Dave Barach72d72232016-08-04 10:15:08 -04006734 /* Construct the API message */
6735 M (IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006736
Dave Barach72d72232016-08-04 10:15:08 -04006737 mp->sw_if_index = ntohl (sw_if_index);
6738 mp->is_add = is_add;
6739 mp->vrf_id = ntohl (vrf_id);
6740 mp->is_static = is_static;
6741 if (mac_set)
6742 clib_memcpy (mp->mac_address, mac_address, 6);
6743 if (v6_address_set)
6744 {
6745 mp->is_ipv6 = 1;
6746 clib_memcpy (mp->dst_address, &v6address, sizeof (v6address));
6747 }
6748 else
6749 {
6750 /* mp->is_ipv6 = 0; via memset in M macro above */
6751 clib_memcpy (mp->dst_address, &v4address, sizeof (v4address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07006752 }
6753
Dave Barach72d72232016-08-04 10:15:08 -04006754 /* send it... */
6755 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006756
Dave Barach72d72232016-08-04 10:15:08 -04006757 /* Wait for a reply, return good/bad news */
6758 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006759
Dave Barach72d72232016-08-04 10:15:08 -04006760 /* NOTREACHED */
6761 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006762}
6763
Dave Barach72d72232016-08-04 10:15:08 -04006764static int
6765api_reset_vrf (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006766{
Dave Barach72d72232016-08-04 10:15:08 -04006767 unformat_input_t *i = vam->input;
6768 vl_api_reset_vrf_t *mp;
6769 f64 timeout;
6770 u32 vrf_id = 0;
6771 u8 is_ipv6 = 0;
6772 u8 vrf_id_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006773
Dave Barach72d72232016-08-04 10:15:08 -04006774 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6775 {
6776 if (unformat (i, "vrf %d", &vrf_id))
6777 vrf_id_set = 1;
6778 else if (unformat (i, "ipv6"))
6779 is_ipv6 = 1;
6780 else
6781 {
6782 clib_warning ("parse error '%U'", format_unformat_error, i);
6783 return -99;
6784 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006785 }
6786
Dave Barach72d72232016-08-04 10:15:08 -04006787 if (vrf_id_set == 0)
6788 {
6789 errmsg ("missing vrf id\n");
6790 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006791 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006792
Dave Barach72d72232016-08-04 10:15:08 -04006793 M (RESET_VRF, reset_vrf);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006794
Dave Barach72d72232016-08-04 10:15:08 -04006795 mp->vrf_id = ntohl (vrf_id);
6796 mp->is_ipv6 = is_ipv6;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006797
Dave Barach72d72232016-08-04 10:15:08 -04006798 S;
6799 W;
6800 /* NOTREACHED */
6801 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006802}
6803
Dave Barach72d72232016-08-04 10:15:08 -04006804static int
6805api_create_vlan_subif (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006806{
Dave Barach72d72232016-08-04 10:15:08 -04006807 unformat_input_t *i = vam->input;
6808 vl_api_create_vlan_subif_t *mp;
6809 f64 timeout;
6810 u32 sw_if_index;
6811 u8 sw_if_index_set = 0;
6812 u32 vlan_id;
6813 u8 vlan_id_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006814
Dave Barach72d72232016-08-04 10:15:08 -04006815 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6816 {
6817 if (unformat (i, "sw_if_index %d", &sw_if_index))
6818 sw_if_index_set = 1;
6819 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6820 sw_if_index_set = 1;
6821 else if (unformat (i, "vlan %d", &vlan_id))
6822 vlan_id_set = 1;
6823 else
6824 {
6825 clib_warning ("parse error '%U'", format_unformat_error, i);
6826 return -99;
6827 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006828 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006829
Dave Barach72d72232016-08-04 10:15:08 -04006830 if (sw_if_index_set == 0)
6831 {
6832 errmsg ("missing interface name or sw_if_index\n");
6833 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006834 }
6835
Dave Barach72d72232016-08-04 10:15:08 -04006836 if (vlan_id_set == 0)
6837 {
6838 errmsg ("missing vlan_id\n");
6839 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006840 }
Dave Barach72d72232016-08-04 10:15:08 -04006841 M (CREATE_VLAN_SUBIF, create_vlan_subif);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006842
Dave Barach72d72232016-08-04 10:15:08 -04006843 mp->sw_if_index = ntohl (sw_if_index);
6844 mp->vlan_id = ntohl (vlan_id);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006845
Dave Barach72d72232016-08-04 10:15:08 -04006846 S;
6847 W;
6848 /* NOTREACHED */
6849 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006850}
6851
6852#define foreach_create_subif_bit \
6853_(no_tags) \
6854_(one_tag) \
6855_(two_tags) \
6856_(dot1ad) \
6857_(exact_match) \
6858_(default_sub) \
6859_(outer_vlan_id_any) \
6860_(inner_vlan_id_any)
6861
Dave Barach72d72232016-08-04 10:15:08 -04006862static int
6863api_create_subif (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006864{
Dave Barach72d72232016-08-04 10:15:08 -04006865 unformat_input_t *i = vam->input;
6866 vl_api_create_subif_t *mp;
6867 f64 timeout;
6868 u32 sw_if_index;
6869 u8 sw_if_index_set = 0;
6870 u32 sub_id;
6871 u8 sub_id_set = 0;
6872 u32 no_tags = 0;
6873 u32 one_tag = 0;
6874 u32 two_tags = 0;
6875 u32 dot1ad = 0;
6876 u32 exact_match = 0;
6877 u32 default_sub = 0;
6878 u32 outer_vlan_id_any = 0;
6879 u32 inner_vlan_id_any = 0;
6880 u32 tmp;
6881 u16 outer_vlan_id = 0;
6882 u16 inner_vlan_id = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006883
Dave Barach72d72232016-08-04 10:15:08 -04006884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6885 {
6886 if (unformat (i, "sw_if_index %d", &sw_if_index))
6887 sw_if_index_set = 1;
6888 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
6889 sw_if_index_set = 1;
6890 else if (unformat (i, "sub_id %d", &sub_id))
6891 sub_id_set = 1;
6892 else if (unformat (i, "outer_vlan_id %d", &tmp))
6893 outer_vlan_id = tmp;
6894 else if (unformat (i, "inner_vlan_id %d", &tmp))
6895 inner_vlan_id = tmp;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006896
6897#define _(a) else if (unformat (i, #a)) a = 1 ;
Dave Barach72d72232016-08-04 10:15:08 -04006898 foreach_create_subif_bit
Ed Warnickecb9cada2015-12-08 15:45:58 -07006899#undef _
Dave Barach72d72232016-08-04 10:15:08 -04006900 else
6901 {
6902 clib_warning ("parse error '%U'", format_unformat_error, i);
6903 return -99;
6904 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006905 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006906
Dave Barach72d72232016-08-04 10:15:08 -04006907 if (sw_if_index_set == 0)
6908 {
6909 errmsg ("missing interface name or sw_if_index\n");
6910 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006911 }
6912
Dave Barach72d72232016-08-04 10:15:08 -04006913 if (sub_id_set == 0)
6914 {
6915 errmsg ("missing sub_id\n");
6916 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006917 }
Dave Barach72d72232016-08-04 10:15:08 -04006918 M (CREATE_SUBIF, create_subif);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006919
Dave Barach72d72232016-08-04 10:15:08 -04006920 mp->sw_if_index = ntohl (sw_if_index);
6921 mp->sub_id = ntohl (sub_id);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006922
Ed Warnickecb9cada2015-12-08 15:45:58 -07006923#define _(a) mp->a = a;
Dave Barach72d72232016-08-04 10:15:08 -04006924 foreach_create_subif_bit;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006925#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006926
Dave Barach72d72232016-08-04 10:15:08 -04006927 mp->outer_vlan_id = ntohs (outer_vlan_id);
6928 mp->inner_vlan_id = ntohs (inner_vlan_id);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006929
Dave Barach72d72232016-08-04 10:15:08 -04006930 S;
6931 W;
6932 /* NOTREACHED */
6933 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006934}
6935
Dave Barach72d72232016-08-04 10:15:08 -04006936static int
6937api_oam_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006938{
Dave Barach72d72232016-08-04 10:15:08 -04006939 unformat_input_t *i = vam->input;
6940 vl_api_oam_add_del_t *mp;
6941 f64 timeout;
6942 u32 vrf_id = 0;
6943 u8 is_add = 1;
6944 ip4_address_t src, dst;
6945 u8 src_set = 0;
6946 u8 dst_set = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006947
Dave Barach72d72232016-08-04 10:15:08 -04006948 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6949 {
6950 if (unformat (i, "vrf %d", &vrf_id))
6951 ;
6952 else if (unformat (i, "src %U", unformat_ip4_address, &src))
6953 src_set = 1;
6954 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
6955 dst_set = 1;
6956 else if (unformat (i, "del"))
6957 is_add = 0;
6958 else
6959 {
6960 clib_warning ("parse error '%U'", format_unformat_error, i);
6961 return -99;
6962 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07006963 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08006964
Dave Barach72d72232016-08-04 10:15:08 -04006965 if (src_set == 0)
6966 {
6967 errmsg ("missing src addr\n");
6968 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006969 }
6970
Dave Barach72d72232016-08-04 10:15:08 -04006971 if (dst_set == 0)
6972 {
6973 errmsg ("missing dst addr\n");
6974 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006975 }
6976
Dave Barach72d72232016-08-04 10:15:08 -04006977 M (OAM_ADD_DEL, oam_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -07006978
Dave Barach72d72232016-08-04 10:15:08 -04006979 mp->vrf_id = ntohl (vrf_id);
6980 mp->is_add = is_add;
6981 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
6982 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07006983
Dave Barach72d72232016-08-04 10:15:08 -04006984 S;
6985 W;
6986 /* NOTREACHED */
6987 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006988}
6989
Dave Barach72d72232016-08-04 10:15:08 -04006990static int
6991api_reset_fib (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07006992{
Dave Barach72d72232016-08-04 10:15:08 -04006993 unformat_input_t *i = vam->input;
6994 vl_api_reset_fib_t *mp;
6995 f64 timeout;
6996 u32 vrf_id = 0;
6997 u8 is_ipv6 = 0;
6998 u8 vrf_id_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07006999
Dave Barach72d72232016-08-04 10:15:08 -04007000 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7001 {
7002 if (unformat (i, "vrf %d", &vrf_id))
7003 vrf_id_set = 1;
7004 else if (unformat (i, "ipv6"))
7005 is_ipv6 = 1;
7006 else
7007 {
7008 clib_warning ("parse error '%U'", format_unformat_error, i);
7009 return -99;
7010 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007011 }
7012
Dave Barach72d72232016-08-04 10:15:08 -04007013 if (vrf_id_set == 0)
7014 {
7015 errmsg ("missing vrf id\n");
7016 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007017 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007018
Dave Barach72d72232016-08-04 10:15:08 -04007019 M (RESET_FIB, reset_fib);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007020
Dave Barach72d72232016-08-04 10:15:08 -04007021 mp->vrf_id = ntohl (vrf_id);
7022 mp->is_ipv6 = is_ipv6;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007023
Dave Barach72d72232016-08-04 10:15:08 -04007024 S;
7025 W;
7026 /* NOTREACHED */
7027 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007028}
7029
Dave Barach72d72232016-08-04 10:15:08 -04007030static int
7031api_dhcp_proxy_config (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007032{
Dave Barach72d72232016-08-04 10:15:08 -04007033 unformat_input_t *i = vam->input;
7034 vl_api_dhcp_proxy_config_t *mp;
7035 f64 timeout;
7036 u32 vrf_id = 0;
7037 u8 is_add = 1;
7038 u8 insert_cid = 1;
7039 u8 v4_address_set = 0;
7040 u8 v6_address_set = 0;
7041 ip4_address_t v4address;
7042 ip6_address_t v6address;
7043 u8 v4_src_address_set = 0;
7044 u8 v6_src_address_set = 0;
7045 ip4_address_t v4srcaddress;
7046 ip6_address_t v6srcaddress;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007047
Dave Barach72d72232016-08-04 10:15:08 -04007048 /* Parse args required to build the message */
7049 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7050 {
7051 if (unformat (i, "del"))
7052 is_add = 0;
7053 else if (unformat (i, "vrf %d", &vrf_id))
7054 ;
7055 else if (unformat (i, "insert-cid %d", &insert_cid))
7056 ;
7057 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7058 v4_address_set = 1;
7059 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7060 v6_address_set = 1;
7061 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7062 v4_src_address_set = 1;
7063 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7064 v6_src_address_set = 1;
7065 else
7066 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007067 }
7068
Dave Barach72d72232016-08-04 10:15:08 -04007069 if (v4_address_set && v6_address_set)
7070 {
7071 errmsg ("both v4 and v6 server addresses set\n");
7072 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007073 }
Dave Barach72d72232016-08-04 10:15:08 -04007074 if (!v4_address_set && !v6_address_set)
7075 {
7076 errmsg ("no server addresses set\n");
7077 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007078 }
7079
Dave Barach72d72232016-08-04 10:15:08 -04007080 if (v4_src_address_set && v6_src_address_set)
7081 {
7082 errmsg ("both v4 and v6 src addresses set\n");
7083 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007084 }
Dave Barach72d72232016-08-04 10:15:08 -04007085 if (!v4_src_address_set && !v6_src_address_set)
7086 {
7087 errmsg ("no src addresses set\n");
7088 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007089 }
7090
Dave Barach72d72232016-08-04 10:15:08 -04007091 if (!(v4_src_address_set && v4_address_set) &&
7092 !(v6_src_address_set && v6_address_set))
7093 {
7094 errmsg ("no matching server and src addresses set\n");
7095 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007096 }
7097
Dave Barach72d72232016-08-04 10:15:08 -04007098 /* Construct the API message */
7099 M (DHCP_PROXY_CONFIG, dhcp_proxy_config);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007100
Dave Barach72d72232016-08-04 10:15:08 -04007101 mp->insert_circuit_id = insert_cid;
7102 mp->is_add = is_add;
7103 mp->vrf_id = ntohl (vrf_id);
7104 if (v6_address_set)
7105 {
7106 mp->is_ipv6 = 1;
7107 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7108 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7109 }
7110 else
7111 {
7112 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7113 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007114 }
7115
Dave Barach72d72232016-08-04 10:15:08 -04007116 /* send it... */
7117 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007118
Dave Barach72d72232016-08-04 10:15:08 -04007119 /* Wait for a reply, return good/bad news */
7120 W;
7121 /* NOTREACHED */
7122 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007123}
7124
Dave Barach72d72232016-08-04 10:15:08 -04007125static int
7126api_dhcp_proxy_config_2 (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007127{
Dave Barach72d72232016-08-04 10:15:08 -04007128 unformat_input_t *i = vam->input;
7129 vl_api_dhcp_proxy_config_2_t *mp;
7130 f64 timeout;
7131 u32 rx_vrf_id = 0;
7132 u32 server_vrf_id = 0;
7133 u8 is_add = 1;
7134 u8 insert_cid = 1;
7135 u8 v4_address_set = 0;
7136 u8 v6_address_set = 0;
7137 ip4_address_t v4address;
7138 ip6_address_t v6address;
7139 u8 v4_src_address_set = 0;
7140 u8 v6_src_address_set = 0;
7141 ip4_address_t v4srcaddress;
7142 ip6_address_t v6srcaddress;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007143
Dave Barach72d72232016-08-04 10:15:08 -04007144 /* Parse args required to build the message */
7145 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7146 {
7147 if (unformat (i, "del"))
7148 is_add = 0;
7149 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
7150 ;
7151 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
7152 ;
7153 else if (unformat (i, "insert-cid %d", &insert_cid))
7154 ;
7155 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
7156 v4_address_set = 1;
7157 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
7158 v6_address_set = 1;
7159 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
7160 v4_src_address_set = 1;
7161 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
7162 v6_src_address_set = 1;
7163 else
7164 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007165 }
7166
Dave Barach72d72232016-08-04 10:15:08 -04007167 if (v4_address_set && v6_address_set)
7168 {
7169 errmsg ("both v4 and v6 server addresses set\n");
7170 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007171 }
Dave Barach72d72232016-08-04 10:15:08 -04007172 if (!v4_address_set && !v6_address_set)
7173 {
7174 errmsg ("no server addresses set\n");
7175 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007176 }
7177
Dave Barach72d72232016-08-04 10:15:08 -04007178 if (v4_src_address_set && v6_src_address_set)
7179 {
7180 errmsg ("both v4 and v6 src addresses set\n");
7181 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007182 }
Dave Barach72d72232016-08-04 10:15:08 -04007183 if (!v4_src_address_set && !v6_src_address_set)
7184 {
7185 errmsg ("no src addresses set\n");
7186 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007187 }
7188
Dave Barach72d72232016-08-04 10:15:08 -04007189 if (!(v4_src_address_set && v4_address_set) &&
7190 !(v6_src_address_set && v6_address_set))
7191 {
7192 errmsg ("no matching server and src addresses set\n");
7193 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007194 }
7195
Dave Barach72d72232016-08-04 10:15:08 -04007196 /* Construct the API message */
7197 M (DHCP_PROXY_CONFIG_2, dhcp_proxy_config_2);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007198
Dave Barach72d72232016-08-04 10:15:08 -04007199 mp->insert_circuit_id = insert_cid;
7200 mp->is_add = is_add;
7201 mp->rx_vrf_id = ntohl (rx_vrf_id);
7202 mp->server_vrf_id = ntohl (server_vrf_id);
7203 if (v6_address_set)
7204 {
7205 mp->is_ipv6 = 1;
7206 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
7207 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
7208 }
7209 else
7210 {
7211 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
7212 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007213 }
7214
Dave Barach72d72232016-08-04 10:15:08 -04007215 /* send it... */
7216 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007217
Dave Barach72d72232016-08-04 10:15:08 -04007218 /* Wait for a reply, return good/bad news */
7219 W;
7220 /* NOTREACHED */
7221 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007222}
7223
Dave Barach72d72232016-08-04 10:15:08 -04007224static int
7225api_dhcp_proxy_set_vss (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007226{
Dave Barach72d72232016-08-04 10:15:08 -04007227 unformat_input_t *i = vam->input;
7228 vl_api_dhcp_proxy_set_vss_t *mp;
7229 f64 timeout;
7230 u8 is_ipv6 = 0;
7231 u8 is_add = 1;
7232 u32 tbl_id;
7233 u8 tbl_id_set = 0;
7234 u32 oui;
7235 u8 oui_set = 0;
7236 u32 fib_id;
7237 u8 fib_id_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007238
Dave Barach72d72232016-08-04 10:15:08 -04007239 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7240 {
7241 if (unformat (i, "tbl_id %d", &tbl_id))
7242 tbl_id_set = 1;
7243 if (unformat (i, "fib_id %d", &fib_id))
7244 fib_id_set = 1;
7245 if (unformat (i, "oui %d", &oui))
7246 oui_set = 1;
7247 else if (unformat (i, "ipv6"))
7248 is_ipv6 = 1;
7249 else if (unformat (i, "del"))
7250 is_add = 0;
7251 else
7252 {
7253 clib_warning ("parse error '%U'", format_unformat_error, i);
7254 return -99;
7255 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007256 }
7257
Dave Barach72d72232016-08-04 10:15:08 -04007258 if (tbl_id_set == 0)
7259 {
7260 errmsg ("missing tbl id\n");
7261 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007262 }
7263
Dave Barach72d72232016-08-04 10:15:08 -04007264 if (fib_id_set == 0)
7265 {
7266 errmsg ("missing fib id\n");
7267 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007268 }
Dave Barach72d72232016-08-04 10:15:08 -04007269 if (oui_set == 0)
7270 {
7271 errmsg ("missing oui\n");
7272 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007273 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007274
Dave Barach72d72232016-08-04 10:15:08 -04007275 M (DHCP_PROXY_SET_VSS, dhcp_proxy_set_vss);
7276 mp->tbl_id = ntohl (tbl_id);
7277 mp->fib_id = ntohl (fib_id);
7278 mp->oui = ntohl (oui);
7279 mp->is_ipv6 = is_ipv6;
7280 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007281
Dave Barach72d72232016-08-04 10:15:08 -04007282 S;
7283 W;
7284 /* NOTREACHED */
7285 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007286}
7287
Dave Barach72d72232016-08-04 10:15:08 -04007288static int
7289api_dhcp_client_config (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007290{
Dave Barach72d72232016-08-04 10:15:08 -04007291 unformat_input_t *i = vam->input;
7292 vl_api_dhcp_client_config_t *mp;
7293 f64 timeout;
7294 u32 sw_if_index;
7295 u8 sw_if_index_set = 0;
7296 u8 is_add = 1;
7297 u8 *hostname = 0;
7298 u8 disable_event = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007299
Dave Barach72d72232016-08-04 10:15:08 -04007300 /* Parse args required to build the message */
7301 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7302 {
7303 if (unformat (i, "del"))
7304 is_add = 0;
7305 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7306 sw_if_index_set = 1;
7307 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7308 sw_if_index_set = 1;
7309 else if (unformat (i, "hostname %s", &hostname))
7310 ;
7311 else if (unformat (i, "disable_event"))
7312 disable_event = 1;
7313 else
7314 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007315 }
7316
Dave Barach72d72232016-08-04 10:15:08 -04007317 if (sw_if_index_set == 0)
7318 {
7319 errmsg ("missing interface name or sw_if_index\n");
7320 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007321 }
7322
Dave Barach72d72232016-08-04 10:15:08 -04007323 if (vec_len (hostname) > 63)
7324 {
7325 errmsg ("hostname too long\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -07007326 }
Dave Barach72d72232016-08-04 10:15:08 -04007327 vec_add1 (hostname, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007328
Dave Barach72d72232016-08-04 10:15:08 -04007329 /* Construct the API message */
7330 M (DHCP_CLIENT_CONFIG, dhcp_client_config);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007331
Dave Barach72d72232016-08-04 10:15:08 -04007332 mp->sw_if_index = ntohl (sw_if_index);
7333 clib_memcpy (mp->hostname, hostname, vec_len (hostname));
7334 vec_free (hostname);
7335 mp->is_add = is_add;
7336 mp->want_dhcp_event = disable_event ? 0 : 1;
7337 mp->pid = getpid ();
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007338
Dave Barach72d72232016-08-04 10:15:08 -04007339 /* send it... */
7340 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007341
Dave Barach72d72232016-08-04 10:15:08 -04007342 /* Wait for a reply, return good/bad news */
7343 W;
7344 /* NOTREACHED */
7345 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007346}
7347
Dave Barach72d72232016-08-04 10:15:08 -04007348static int
7349api_set_ip_flow_hash (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007350{
Dave Barach72d72232016-08-04 10:15:08 -04007351 unformat_input_t *i = vam->input;
7352 vl_api_set_ip_flow_hash_t *mp;
7353 f64 timeout;
7354 u32 vrf_id = 0;
7355 u8 is_ipv6 = 0;
7356 u8 vrf_id_set = 0;
7357 u8 src = 0;
7358 u8 dst = 0;
7359 u8 sport = 0;
7360 u8 dport = 0;
7361 u8 proto = 0;
7362 u8 reverse = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007363
Dave Barach72d72232016-08-04 10:15:08 -04007364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7365 {
7366 if (unformat (i, "vrf %d", &vrf_id))
7367 vrf_id_set = 1;
7368 else if (unformat (i, "ipv6"))
7369 is_ipv6 = 1;
7370 else if (unformat (i, "src"))
7371 src = 1;
7372 else if (unformat (i, "dst"))
7373 dst = 1;
7374 else if (unformat (i, "sport"))
7375 sport = 1;
7376 else if (unformat (i, "dport"))
7377 dport = 1;
7378 else if (unformat (i, "proto"))
7379 proto = 1;
7380 else if (unformat (i, "reverse"))
7381 reverse = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007382
Dave Barach72d72232016-08-04 10:15:08 -04007383 else
7384 {
7385 clib_warning ("parse error '%U'", format_unformat_error, i);
7386 return -99;
7387 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007388 }
7389
Dave Barach72d72232016-08-04 10:15:08 -04007390 if (vrf_id_set == 0)
7391 {
7392 errmsg ("missing vrf id\n");
7393 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007394 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007395
Dave Barach72d72232016-08-04 10:15:08 -04007396 M (SET_IP_FLOW_HASH, set_ip_flow_hash);
7397 mp->src = src;
7398 mp->dst = dst;
7399 mp->sport = sport;
7400 mp->dport = dport;
7401 mp->proto = proto;
7402 mp->reverse = reverse;
7403 mp->vrf_id = ntohl (vrf_id);
7404 mp->is_ipv6 = is_ipv6;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007405
Dave Barach72d72232016-08-04 10:15:08 -04007406 S;
7407 W;
7408 /* NOTREACHED */
7409 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007410}
7411
Dave Barach72d72232016-08-04 10:15:08 -04007412static int
7413api_sw_interface_ip6_enable_disable (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007414{
Dave Barach72d72232016-08-04 10:15:08 -04007415 unformat_input_t *i = vam->input;
7416 vl_api_sw_interface_ip6_enable_disable_t *mp;
7417 f64 timeout;
7418 u32 sw_if_index;
7419 u8 sw_if_index_set = 0;
7420 u8 enable = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007421
Dave Barach72d72232016-08-04 10:15:08 -04007422 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7423 {
7424 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7425 sw_if_index_set = 1;
7426 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7427 sw_if_index_set = 1;
7428 else if (unformat (i, "enable"))
7429 enable = 1;
7430 else if (unformat (i, "disable"))
7431 enable = 0;
7432 else
7433 {
7434 clib_warning ("parse error '%U'", format_unformat_error, i);
7435 return -99;
7436 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007437 }
7438
Dave Barach72d72232016-08-04 10:15:08 -04007439 if (sw_if_index_set == 0)
7440 {
7441 errmsg ("missing interface name or sw_if_index\n");
7442 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007443 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007444
Dave Barach72d72232016-08-04 10:15:08 -04007445 M (SW_INTERFACE_IP6_ENABLE_DISABLE, sw_interface_ip6_enable_disable);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007446
Dave Barach72d72232016-08-04 10:15:08 -04007447 mp->sw_if_index = ntohl (sw_if_index);
7448 mp->enable = enable;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007449
Dave Barach72d72232016-08-04 10:15:08 -04007450 S;
7451 W;
7452 /* NOTREACHED */
7453 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007454}
7455
Dave Barach72d72232016-08-04 10:15:08 -04007456static int
7457api_sw_interface_ip6_set_link_local_address (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007458{
Dave Barach72d72232016-08-04 10:15:08 -04007459 unformat_input_t *i = vam->input;
7460 vl_api_sw_interface_ip6_set_link_local_address_t *mp;
7461 f64 timeout;
7462 u32 sw_if_index;
7463 u8 sw_if_index_set = 0;
7464 u32 address_length = 0;
7465 u8 v6_address_set = 0;
7466 ip6_address_t v6address;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007467
Dave Barach72d72232016-08-04 10:15:08 -04007468 /* Parse args required to build the message */
7469 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7470 {
7471 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7472 sw_if_index_set = 1;
7473 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7474 sw_if_index_set = 1;
7475 else if (unformat (i, "%U/%d",
7476 unformat_ip6_address, &v6address, &address_length))
7477 v6_address_set = 1;
7478 else
7479 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007480 }
7481
Dave Barach72d72232016-08-04 10:15:08 -04007482 if (sw_if_index_set == 0)
7483 {
7484 errmsg ("missing interface name or sw_if_index\n");
7485 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007486 }
Dave Barach72d72232016-08-04 10:15:08 -04007487 if (!v6_address_set)
7488 {
7489 errmsg ("no address set\n");
7490 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007491 }
7492
Dave Barach72d72232016-08-04 10:15:08 -04007493 /* Construct the API message */
7494 M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS,
7495 sw_interface_ip6_set_link_local_address);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007496
Dave Barach72d72232016-08-04 10:15:08 -04007497 mp->sw_if_index = ntohl (sw_if_index);
7498 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7499 mp->address_length = address_length;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007500
Dave Barach72d72232016-08-04 10:15:08 -04007501 /* send it... */
7502 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007503
Dave Barach72d72232016-08-04 10:15:08 -04007504 /* Wait for a reply, return good/bad news */
7505 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007506
Dave Barach72d72232016-08-04 10:15:08 -04007507 /* NOTREACHED */
7508 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007509}
7510
7511
Dave Barach72d72232016-08-04 10:15:08 -04007512static int
7513api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007514{
Dave Barach72d72232016-08-04 10:15:08 -04007515 unformat_input_t *i = vam->input;
7516 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
7517 f64 timeout;
7518 u32 sw_if_index;
7519 u8 sw_if_index_set = 0;
7520 u32 address_length = 0;
7521 u8 v6_address_set = 0;
7522 ip6_address_t v6address;
7523 u8 use_default = 0;
7524 u8 no_advertise = 0;
7525 u8 off_link = 0;
7526 u8 no_autoconfig = 0;
7527 u8 no_onlink = 0;
7528 u8 is_no = 0;
7529 u32 val_lifetime = 0;
7530 u32 pref_lifetime = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007531
Dave Barach72d72232016-08-04 10:15:08 -04007532 /* Parse args required to build the message */
7533 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7534 {
7535 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7536 sw_if_index_set = 1;
7537 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7538 sw_if_index_set = 1;
7539 else if (unformat (i, "%U/%d",
7540 unformat_ip6_address, &v6address, &address_length))
7541 v6_address_set = 1;
7542 else if (unformat (i, "val_life %d", &val_lifetime))
7543 ;
7544 else if (unformat (i, "pref_life %d", &pref_lifetime))
7545 ;
7546 else if (unformat (i, "def"))
7547 use_default = 1;
7548 else if (unformat (i, "noadv"))
7549 no_advertise = 1;
7550 else if (unformat (i, "offl"))
7551 off_link = 1;
7552 else if (unformat (i, "noauto"))
7553 no_autoconfig = 1;
7554 else if (unformat (i, "nolink"))
7555 no_onlink = 1;
7556 else if (unformat (i, "isno"))
7557 is_no = 1;
7558 else
7559 {
7560 clib_warning ("parse error '%U'", format_unformat_error, i);
7561 return -99;
7562 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007563 }
7564
Dave Barach72d72232016-08-04 10:15:08 -04007565 if (sw_if_index_set == 0)
7566 {
7567 errmsg ("missing interface name or sw_if_index\n");
7568 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007569 }
Dave Barach72d72232016-08-04 10:15:08 -04007570 if (!v6_address_set)
7571 {
7572 errmsg ("no address set\n");
7573 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007574 }
7575
Dave Barach72d72232016-08-04 10:15:08 -04007576 /* Construct the API message */
7577 M (SW_INTERFACE_IP6ND_RA_PREFIX, sw_interface_ip6nd_ra_prefix);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007578
Dave Barach72d72232016-08-04 10:15:08 -04007579 mp->sw_if_index = ntohl (sw_if_index);
7580 clib_memcpy (mp->address, &v6address, sizeof (v6address));
7581 mp->address_length = address_length;
7582 mp->use_default = use_default;
7583 mp->no_advertise = no_advertise;
7584 mp->off_link = off_link;
7585 mp->no_autoconfig = no_autoconfig;
7586 mp->no_onlink = no_onlink;
7587 mp->is_no = is_no;
7588 mp->val_lifetime = ntohl (val_lifetime);
7589 mp->pref_lifetime = ntohl (pref_lifetime);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007590
Dave Barach72d72232016-08-04 10:15:08 -04007591 /* send it... */
7592 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007593
Dave Barach72d72232016-08-04 10:15:08 -04007594 /* Wait for a reply, return good/bad news */
7595 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007596
Dave Barach72d72232016-08-04 10:15:08 -04007597 /* NOTREACHED */
7598 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007599}
7600
Dave Barach72d72232016-08-04 10:15:08 -04007601static int
7602api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007603{
Dave Barach72d72232016-08-04 10:15:08 -04007604 unformat_input_t *i = vam->input;
7605 vl_api_sw_interface_ip6nd_ra_config_t *mp;
7606 f64 timeout;
7607 u32 sw_if_index;
7608 u8 sw_if_index_set = 0;
7609 u8 suppress = 0;
7610 u8 managed = 0;
7611 u8 other = 0;
7612 u8 ll_option = 0;
7613 u8 send_unicast = 0;
7614 u8 cease = 0;
7615 u8 is_no = 0;
7616 u8 default_router = 0;
7617 u32 max_interval = 0;
7618 u32 min_interval = 0;
7619 u32 lifetime = 0;
7620 u32 initial_count = 0;
7621 u32 initial_interval = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007622
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007623
Dave Barach72d72232016-08-04 10:15:08 -04007624 /* Parse args required to build the message */
7625 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7626 {
7627 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
7628 sw_if_index_set = 1;
7629 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7630 sw_if_index_set = 1;
7631 else if (unformat (i, "maxint %d", &max_interval))
7632 ;
7633 else if (unformat (i, "minint %d", &min_interval))
7634 ;
7635 else if (unformat (i, "life %d", &lifetime))
7636 ;
7637 else if (unformat (i, "count %d", &initial_count))
7638 ;
7639 else if (unformat (i, "interval %d", &initial_interval))
7640 ;
7641 else if (unformat (i, "suppress") || unformat (i, "surpress"))
7642 suppress = 1;
7643 else if (unformat (i, "managed"))
7644 managed = 1;
7645 else if (unformat (i, "other"))
7646 other = 1;
7647 else if (unformat (i, "ll"))
7648 ll_option = 1;
7649 else if (unformat (i, "send"))
7650 send_unicast = 1;
7651 else if (unformat (i, "cease"))
7652 cease = 1;
7653 else if (unformat (i, "isno"))
7654 is_no = 1;
7655 else if (unformat (i, "def"))
7656 default_router = 1;
7657 else
7658 {
7659 clib_warning ("parse error '%U'", format_unformat_error, i);
7660 return -99;
7661 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007662 }
7663
Dave Barach72d72232016-08-04 10:15:08 -04007664 if (sw_if_index_set == 0)
7665 {
7666 errmsg ("missing interface name or sw_if_index\n");
7667 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007668 }
7669
Dave Barach72d72232016-08-04 10:15:08 -04007670 /* Construct the API message */
7671 M (SW_INTERFACE_IP6ND_RA_CONFIG, sw_interface_ip6nd_ra_config);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007672
Dave Barach72d72232016-08-04 10:15:08 -04007673 mp->sw_if_index = ntohl (sw_if_index);
7674 mp->max_interval = ntohl (max_interval);
7675 mp->min_interval = ntohl (min_interval);
7676 mp->lifetime = ntohl (lifetime);
7677 mp->initial_count = ntohl (initial_count);
7678 mp->initial_interval = ntohl (initial_interval);
7679 mp->suppress = suppress;
7680 mp->managed = managed;
7681 mp->other = other;
7682 mp->ll_option = ll_option;
7683 mp->send_unicast = send_unicast;
7684 mp->cease = cease;
7685 mp->is_no = is_no;
7686 mp->default_router = default_router;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007687
Dave Barach72d72232016-08-04 10:15:08 -04007688 /* send it... */
7689 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007690
Dave Barach72d72232016-08-04 10:15:08 -04007691 /* Wait for a reply, return good/bad news */
7692 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007693
Dave Barach72d72232016-08-04 10:15:08 -04007694 /* NOTREACHED */
7695 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007696}
7697
Dave Barach72d72232016-08-04 10:15:08 -04007698static int
7699api_set_arp_neighbor_limit (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007700{
Dave Barach72d72232016-08-04 10:15:08 -04007701 unformat_input_t *i = vam->input;
7702 vl_api_set_arp_neighbor_limit_t *mp;
7703 f64 timeout;
7704 u32 arp_nbr_limit;
7705 u8 limit_set = 0;
7706 u8 is_ipv6 = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007707
Dave Barach72d72232016-08-04 10:15:08 -04007708 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7709 {
7710 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
7711 limit_set = 1;
7712 else if (unformat (i, "ipv6"))
7713 is_ipv6 = 1;
7714 else
7715 {
7716 clib_warning ("parse error '%U'", format_unformat_error, i);
7717 return -99;
7718 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007719 }
7720
Dave Barach72d72232016-08-04 10:15:08 -04007721 if (limit_set == 0)
7722 {
7723 errmsg ("missing limit value\n");
7724 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007725 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007726
Dave Barach72d72232016-08-04 10:15:08 -04007727 M (SET_ARP_NEIGHBOR_LIMIT, set_arp_neighbor_limit);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007728
Dave Barach72d72232016-08-04 10:15:08 -04007729 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
7730 mp->is_ipv6 = is_ipv6;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007731
Dave Barach72d72232016-08-04 10:15:08 -04007732 S;
7733 W;
7734 /* NOTREACHED */
7735 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007736}
7737
Dave Barach72d72232016-08-04 10:15:08 -04007738static int
7739api_l2_patch_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007740{
Dave Barach72d72232016-08-04 10:15:08 -04007741 unformat_input_t *i = vam->input;
7742 vl_api_l2_patch_add_del_t *mp;
7743 f64 timeout;
7744 u32 rx_sw_if_index;
7745 u8 rx_sw_if_index_set = 0;
7746 u32 tx_sw_if_index;
7747 u8 tx_sw_if_index_set = 0;
7748 u8 is_add = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007749
Dave Barach72d72232016-08-04 10:15:08 -04007750 /* Parse args required to build the message */
7751 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7752 {
7753 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
7754 rx_sw_if_index_set = 1;
7755 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
7756 tx_sw_if_index_set = 1;
7757 else if (unformat (i, "rx"))
7758 {
7759 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7760 {
7761 if (unformat (i, "%U", unformat_sw_if_index, vam,
7762 &rx_sw_if_index))
7763 rx_sw_if_index_set = 1;
7764 }
7765 else
7766 break;
7767 }
7768 else if (unformat (i, "tx"))
7769 {
7770 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7771 {
7772 if (unformat (i, "%U", unformat_sw_if_index, vam,
7773 &tx_sw_if_index))
7774 tx_sw_if_index_set = 1;
7775 }
7776 else
7777 break;
7778 }
7779 else if (unformat (i, "del"))
7780 is_add = 0;
7781 else
7782 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007783 }
7784
Dave Barach72d72232016-08-04 10:15:08 -04007785 if (rx_sw_if_index_set == 0)
7786 {
7787 errmsg ("missing rx interface name or rx_sw_if_index\n");
7788 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007789 }
7790
Dave Barach72d72232016-08-04 10:15:08 -04007791 if (tx_sw_if_index_set == 0)
7792 {
7793 errmsg ("missing tx interface name or tx_sw_if_index\n");
7794 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007795 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007796
Dave Barach72d72232016-08-04 10:15:08 -04007797 M (L2_PATCH_ADD_DEL, l2_patch_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -07007798
Dave Barach72d72232016-08-04 10:15:08 -04007799 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
7800 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
7801 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007802
Dave Barach72d72232016-08-04 10:15:08 -04007803 S;
7804 W;
7805 /* NOTREACHED */
7806 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007807}
Dave Barach72d72232016-08-04 10:15:08 -04007808
7809static int
Vengada Govindan07d2f842016-08-25 10:34:34 -07007810api_ioam_enable (vat_main_t * vam)
Shwetha20a64f52016-03-25 10:55:01 +00007811{
Dave Barach72d72232016-08-04 10:15:08 -04007812 unformat_input_t *input = vam->input;
Vengada Govindan07d2f842016-08-25 10:34:34 -07007813 vl_api_ioam_enable_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -04007814 f64 timeout;
7815 u32 id = 0;
Vengada Govindan07d2f842016-08-25 10:34:34 -07007816 int has_trace_option = 0;
Dave Barach72d72232016-08-04 10:15:08 -04007817 int has_pow_option = 0;
7818 int has_ppc_option = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007819
Shwetha20a64f52016-03-25 10:55:01 +00007820 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
7821 {
Vengada Govindan07d2f842016-08-25 10:34:34 -07007822 if (unformat (input, "trace"))
7823 has_trace_option = 1;
Shwetha20a64f52016-03-25 10:55:01 +00007824 else if (unformat (input, "pow"))
Dave Barach72d72232016-08-04 10:15:08 -04007825 has_pow_option = 1;
Shwetha20a64f52016-03-25 10:55:01 +00007826 else if (unformat (input, "ppc encap"))
Dave Barach72d72232016-08-04 10:15:08 -04007827 has_ppc_option = PPC_ENCAP;
Shwetha20a64f52016-03-25 10:55:01 +00007828 else if (unformat (input, "ppc decap"))
Dave Barach72d72232016-08-04 10:15:08 -04007829 has_ppc_option = PPC_DECAP;
Shwetha20a64f52016-03-25 10:55:01 +00007830 else if (unformat (input, "ppc none"))
Dave Barach72d72232016-08-04 10:15:08 -04007831 has_ppc_option = PPC_NONE;
Shwetha20a64f52016-03-25 10:55:01 +00007832 else
Dave Barach72d72232016-08-04 10:15:08 -04007833 break;
Shwetha20a64f52016-03-25 10:55:01 +00007834 }
Vengada Govindan07d2f842016-08-25 10:34:34 -07007835 M (IOAM_ENABLE, ioam_enable);
Dave Barach72d72232016-08-04 10:15:08 -04007836 mp->id = htons (id);
Shwetha20a64f52016-03-25 10:55:01 +00007837 mp->trace_ppc = has_ppc_option;
Shwetha20a64f52016-03-25 10:55:01 +00007838 mp->pow_enable = has_pow_option;
Vengada Govindan07d2f842016-08-25 10:34:34 -07007839 mp->trace_enable = has_trace_option;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007840
Dave Barach72d72232016-08-04 10:15:08 -04007841 S;
7842 W;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007843
Dave Barach72d72232016-08-04 10:15:08 -04007844 return (0);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007845
Shwetha20a64f52016-03-25 10:55:01 +00007846}
Dave Barach72d72232016-08-04 10:15:08 -04007847
Shwetha20a64f52016-03-25 10:55:01 +00007848
Dave Barach72d72232016-08-04 10:15:08 -04007849static int
Vengada Govindan07d2f842016-08-25 10:34:34 -07007850api_ioam_disable (vat_main_t * vam)
Shwetha20a64f52016-03-25 10:55:01 +00007851{
Vengada Govindan07d2f842016-08-25 10:34:34 -07007852 vl_api_ioam_disable_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -04007853 f64 timeout;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007854
Vengada Govindan07d2f842016-08-25 10:34:34 -07007855 M (IOAM_DISABLE, ioam_disable);
Dave Barach72d72232016-08-04 10:15:08 -04007856 S;
7857 W;
7858 return 0;
Shwetha20a64f52016-03-25 10:55:01 +00007859}
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07007860
Dave Barach72d72232016-08-04 10:15:08 -04007861static int
7862api_sr_tunnel_add_del (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07007863{
Dave Barach72d72232016-08-04 10:15:08 -04007864 unformat_input_t *i = vam->input;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007865 vl_api_sr_tunnel_add_del_t *mp;
7866 f64 timeout;
7867 int is_del = 0;
7868 int pl_index;
7869 ip6_address_t src_address;
7870 int src_address_set = 0;
7871 ip6_address_t dst_address;
7872 u32 dst_mask_width;
7873 int dst_address_set = 0;
7874 u16 flags = 0;
7875 u32 rx_table_id = 0;
7876 u32 tx_table_id = 0;
Dave Barach72d72232016-08-04 10:15:08 -04007877 ip6_address_t *segments = 0;
7878 ip6_address_t *this_seg;
7879 ip6_address_t *tags = 0;
7880 ip6_address_t *this_tag;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007881 ip6_address_t next_address, tag;
Dave Barach72d72232016-08-04 10:15:08 -04007882 u8 *name = 0;
7883 u8 *policy_name = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007884
7885 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7886 {
7887 if (unformat (i, "del"))
Dave Barach72d72232016-08-04 10:15:08 -04007888 is_del = 1;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07007889 else if (unformat (i, "name %s", &name))
Dave Barach72d72232016-08-04 10:15:08 -04007890 ;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07007891 else if (unformat (i, "policy %s", &policy_name))
Dave Barach72d72232016-08-04 10:15:08 -04007892 ;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007893 else if (unformat (i, "rx_fib_id %d", &rx_table_id))
Dave Barach72d72232016-08-04 10:15:08 -04007894 ;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007895 else if (unformat (i, "tx_fib_id %d", &tx_table_id))
Dave Barach72d72232016-08-04 10:15:08 -04007896 ;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007897 else if (unformat (i, "src %U", unformat_ip6_address, &src_address))
Dave Barach72d72232016-08-04 10:15:08 -04007898 src_address_set = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007899 else if (unformat (i, "dst %U/%d",
Dave Barach72d72232016-08-04 10:15:08 -04007900 unformat_ip6_address, &dst_address, &dst_mask_width))
7901 dst_address_set = 1;
7902 else if (unformat (i, "next %U", unformat_ip6_address, &next_address))
7903 {
7904 vec_add2 (segments, this_seg, 1);
7905 clib_memcpy (this_seg->as_u8, next_address.as_u8,
7906 sizeof (*this_seg));
7907 }
7908 else if (unformat (i, "tag %U", unformat_ip6_address, &tag))
7909 {
7910 vec_add2 (tags, this_tag, 1);
7911 clib_memcpy (this_tag->as_u8, tag.as_u8, sizeof (*this_tag));
7912 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007913 else if (unformat (i, "clean"))
Dave Barach72d72232016-08-04 10:15:08 -04007914 flags |= IP6_SR_HEADER_FLAG_CLEANUP;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007915 else if (unformat (i, "protected"))
Dave Barach72d72232016-08-04 10:15:08 -04007916 flags |= IP6_SR_HEADER_FLAG_PROTECTED;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007917 else if (unformat (i, "InPE %d", &pl_index))
Dave Barach72d72232016-08-04 10:15:08 -04007918 {
7919 if (pl_index <= 0 || pl_index > 4)
7920 {
7921 pl_index_range_error:
7922 errmsg ("pl index %d out of range\n", pl_index);
7923 return -99;
7924 }
7925 flags |=
7926 IP6_SR_HEADER_FLAG_PL_ELT_INGRESS_PE << (3 * (pl_index - 1));
7927 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007928 else if (unformat (i, "EgPE %d", &pl_index))
Dave Barach72d72232016-08-04 10:15:08 -04007929 {
7930 if (pl_index <= 0 || pl_index > 4)
7931 goto pl_index_range_error;
7932 flags |=
7933 IP6_SR_HEADER_FLAG_PL_ELT_EGRESS_PE << (3 * (pl_index - 1));
7934 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07007935 else if (unformat (i, "OrgSrc %d", &pl_index))
Dave Barach72d72232016-08-04 10:15:08 -04007936 {
7937 if (pl_index <= 0 || pl_index > 4)
7938 goto pl_index_range_error;
7939 flags |=
7940 IP6_SR_HEADER_FLAG_PL_ELT_ORIG_SRC_ADDR << (3 * (pl_index - 1));
7941 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007942 else
Dave Barach72d72232016-08-04 10:15:08 -04007943 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007944 }
7945
7946 if (!src_address_set)
7947 {
7948 errmsg ("src address required\n");
7949 return -99;
7950 }
7951
7952 if (!dst_address_set)
7953 {
7954 errmsg ("dst address required\n");
7955 return -99;
7956 }
7957
7958 if (!segments)
7959 {
7960 errmsg ("at least one sr segment required\n");
7961 return -99;
7962 }
7963
Dave Barach72d72232016-08-04 10:15:08 -04007964 M2 (SR_TUNNEL_ADD_DEL, sr_tunnel_add_del,
7965 vec_len (segments) * sizeof (ip6_address_t)
7966 + vec_len (tags) * sizeof (ip6_address_t));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007967
Damjan Marionf1213b82016-03-13 02:22:06 +01007968 clib_memcpy (mp->src_address, &src_address, sizeof (mp->src_address));
7969 clib_memcpy (mp->dst_address, &dst_address, sizeof (mp->dst_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007970 mp->dst_mask_width = dst_mask_width;
7971 mp->flags_net_byte_order = clib_host_to_net_u16 (flags);
7972 mp->n_segments = vec_len (segments);
7973 mp->n_tags = vec_len (tags);
7974 mp->is_add = is_del == 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007975 clib_memcpy (mp->segs_and_tags, segments,
Dave Barach72d72232016-08-04 10:15:08 -04007976 vec_len (segments) * sizeof (ip6_address_t));
7977 clib_memcpy (mp->segs_and_tags +
7978 vec_len (segments) * sizeof (ip6_address_t), tags,
7979 vec_len (tags) * sizeof (ip6_address_t));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007980
7981 mp->outer_vrf_id = ntohl (rx_table_id);
7982 mp->inner_vrf_id = ntohl (tx_table_id);
Dave Barach72d72232016-08-04 10:15:08 -04007983 memcpy (mp->name, name, vec_len (name));
7984 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
Ed Warnickecb9cada2015-12-08 15:45:58 -07007985
7986 vec_free (segments);
7987 vec_free (tags);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08007988
Dave Barach72d72232016-08-04 10:15:08 -04007989 S;
7990 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07007991 /* NOTREACHED */
7992}
7993
Dave Barach72d72232016-08-04 10:15:08 -04007994static int
7995api_sr_policy_add_del (vat_main_t * vam)
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07007996{
Dave Barach72d72232016-08-04 10:15:08 -04007997 unformat_input_t *input = vam->input;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07007998 vl_api_sr_policy_add_del_t *mp;
7999 f64 timeout;
8000 int is_del = 0;
Dave Barach72d72232016-08-04 10:15:08 -04008001 u8 *name = 0;
8002 u8 *tunnel_name = 0;
8003 u8 **tunnel_names = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008004
Dave Barach72d72232016-08-04 10:15:08 -04008005 int name_set = 0;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008006 int tunnel_set = 0;
8007 int j = 0;
Dave Barach72d72232016-08-04 10:15:08 -04008008 int tunnel_names_length = 1; // Init to 1 to offset the #tunnel_names counter byte
8009 int tun_name_len = 0; // Different naming convention used as confusing these would be "bad" (TM)
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008010
8011 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8012 {
8013 if (unformat (input, "del"))
Dave Barach72d72232016-08-04 10:15:08 -04008014 is_del = 1;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008015 else if (unformat (input, "name %s", &name))
8016 name_set = 1;
8017 else if (unformat (input, "tunnel %s", &tunnel_name))
Dave Barach72d72232016-08-04 10:15:08 -04008018 {
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008019 if (tunnel_name)
8020 {
8021 vec_add1 (tunnel_names, tunnel_name);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008022 /* For serializer:
Dave Barach72d72232016-08-04 10:15:08 -04008023 - length = #bytes to store in serial vector
8024 - +1 = byte to store that length
8025 */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008026 tunnel_names_length += (vec_len (tunnel_name) + 1);
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008027 tunnel_set = 1;
8028 tunnel_name = 0;
8029 }
Dave Barach72d72232016-08-04 10:15:08 -04008030 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008031 else
Dave Barach72d72232016-08-04 10:15:08 -04008032 break;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008033 }
8034
8035 if (!name_set)
8036 {
8037 errmsg ("policy name required\n");
8038 return -99;
8039 }
8040
8041 if ((!tunnel_set) && (!is_del))
8042 {
8043 errmsg ("tunnel name required\n");
8044 return -99;
8045 }
8046
Dave Barach72d72232016-08-04 10:15:08 -04008047 M2 (SR_POLICY_ADD_DEL, sr_policy_add_del, tunnel_names_length);
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008048
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008049
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008050
8051 mp->is_add = !is_del;
8052
Dave Barach72d72232016-08-04 10:15:08 -04008053 memcpy (mp->name, name, vec_len (name));
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008054 // Since mp->tunnel_names is of type u8[0] and not a u8 *, u8 ** needs to be serialized
Dave Barach72d72232016-08-04 10:15:08 -04008055 u8 *serial_orig = 0;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008056 vec_validate (serial_orig, tunnel_names_length);
Dave Barach72d72232016-08-04 10:15:08 -04008057 *serial_orig = vec_len (tunnel_names); // Store the number of tunnels as length in first byte of serialized vector
8058 serial_orig += 1; // Move along one byte to store the length of first tunnel_name
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008059
Dave Barach72d72232016-08-04 10:15:08 -04008060 for (j = 0; j < vec_len (tunnel_names); j++)
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008061 {
8062 tun_name_len = vec_len (tunnel_names[j]);
Dave Barach72d72232016-08-04 10:15:08 -04008063 *serial_orig = tun_name_len; // Store length of tunnel name in first byte of Length/Value pair
8064 serial_orig += 1; // Move along one byte to store the actual tunnel name
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008065 memcpy (serial_orig, tunnel_names[j], tun_name_len);
Dave Barach72d72232016-08-04 10:15:08 -04008066 serial_orig += tun_name_len; // Advance past the copy
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008067 }
Dave Barach72d72232016-08-04 10:15:08 -04008068 memcpy (mp->tunnel_names, serial_orig - tunnel_names_length, tunnel_names_length); // Regress serial_orig to head then copy fwd
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008069
8070 vec_free (tunnel_names);
8071 vec_free (tunnel_name);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008072
Dave Barach72d72232016-08-04 10:15:08 -04008073 S;
8074 W;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008075 /* NOTREACHED */
8076}
8077
Dave Barach72d72232016-08-04 10:15:08 -04008078static int
8079api_sr_multicast_map_add_del (vat_main_t * vam)
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008080{
Dave Barach72d72232016-08-04 10:15:08 -04008081 unformat_input_t *input = vam->input;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008082 vl_api_sr_multicast_map_add_del_t *mp;
8083 f64 timeout;
8084 int is_del = 0;
8085 ip6_address_t multicast_address;
Dave Barach72d72232016-08-04 10:15:08 -04008086 u8 *policy_name = 0;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008087 int multicast_address_set = 0;
8088
8089 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8090 {
8091 if (unformat (input, "del"))
Dave Barach72d72232016-08-04 10:15:08 -04008092 is_del = 1;
8093 else
8094 if (unformat
8095 (input, "address %U", unformat_ip6_address, &multicast_address))
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008096 multicast_address_set = 1;
8097 else if (unformat (input, "sr-policy %s", &policy_name))
Dave Barach72d72232016-08-04 10:15:08 -04008098 ;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008099 else
Dave Barach72d72232016-08-04 10:15:08 -04008100 break;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008101 }
8102
8103 if (!is_del && !policy_name)
8104 {
8105 errmsg ("sr-policy name required\n");
8106 return -99;
8107 }
8108
8109
8110 if (!multicast_address_set)
8111 {
8112 errmsg ("address required\n");
8113 return -99;
8114 }
8115
Dave Barach72d72232016-08-04 10:15:08 -04008116 M (SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del);
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008117
8118 mp->is_add = !is_del;
Dave Barach72d72232016-08-04 10:15:08 -04008119 memcpy (mp->policy_name, policy_name, vec_len (policy_name));
8120 clib_memcpy (mp->multicast_address, &multicast_address,
8121 sizeof (mp->multicast_address));
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008122
8123
8124 vec_free (policy_name);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008125
Dave Barach72d72232016-08-04 10:15:08 -04008126 S;
8127 W;
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -07008128 /* NOTREACHED */
8129}
8130
Ed Warnickecb9cada2015-12-08 15:45:58 -07008131
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008132#define foreach_tcp_proto_field \
8133_(src_port) \
8134_(dst_port)
8135
8136#define foreach_udp_proto_field \
8137_(src_port) \
8138_(dst_port)
8139
Ed Warnickecb9cada2015-12-08 15:45:58 -07008140#define foreach_ip4_proto_field \
8141_(src_address) \
8142_(dst_address) \
8143_(tos) \
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008144_(length) \
Ed Warnickecb9cada2015-12-08 15:45:58 -07008145_(fragment_id) \
8146_(ttl) \
8147_(protocol) \
8148_(checksum)
8149
Dave Barach72d72232016-08-04 10:15:08 -04008150uword
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008151unformat_tcp_mask (unformat_input_t * input, va_list * args)
8152{
8153 u8 **maskp = va_arg (*args, u8 **);
8154 u8 *mask = 0;
8155 u8 found_something = 0;
8156 tcp_header_t *tcp;
8157
8158#define _(a) u8 a=0;
8159 foreach_tcp_proto_field;
8160#undef _
8161
8162 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8163 {
8164 if (0);
8165#define _(a) else if (unformat (input, #a)) a=1;
8166 foreach_tcp_proto_field
8167#undef _
8168 else
8169 break;
8170 }
8171
8172#define _(a) found_something += a;
8173 foreach_tcp_proto_field;
8174#undef _
8175
8176 if (found_something == 0)
8177 return 0;
8178
8179 vec_validate (mask, sizeof (*tcp) - 1);
8180
8181 tcp = (tcp_header_t *) mask;
8182
8183#define _(a) if (a) memset (&tcp->a, 0xff, sizeof (tcp->a));
8184 foreach_tcp_proto_field;
8185#undef _
8186
8187 *maskp = mask;
8188 return 1;
8189}
8190
8191uword
8192unformat_udp_mask (unformat_input_t * input, va_list * args)
8193{
8194 u8 **maskp = va_arg (*args, u8 **);
8195 u8 *mask = 0;
8196 u8 found_something = 0;
8197 udp_header_t *udp;
8198
8199#define _(a) u8 a=0;
8200 foreach_udp_proto_field;
8201#undef _
8202
8203 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8204 {
8205 if (0);
8206#define _(a) else if (unformat (input, #a)) a=1;
8207 foreach_udp_proto_field
8208#undef _
8209 else
8210 break;
8211 }
8212
8213#define _(a) found_something += a;
8214 foreach_udp_proto_field;
8215#undef _
8216
8217 if (found_something == 0)
8218 return 0;
8219
8220 vec_validate (mask, sizeof (*udp) - 1);
8221
8222 udp = (udp_header_t *) mask;
8223
8224#define _(a) if (a) memset (&udp->a, 0xff, sizeof (udp->a));
8225 foreach_udp_proto_field;
8226#undef _
8227
8228 *maskp = mask;
8229 return 1;
8230}
8231
8232typedef struct
8233{
8234 u16 src_port, dst_port;
8235} tcpudp_header_t;
8236
8237uword
8238unformat_l4_mask (unformat_input_t * input, va_list * args)
8239{
8240 u8 **maskp = va_arg (*args, u8 **);
8241 u16 src_port = 0, dst_port = 0;
8242 tcpudp_header_t *tcpudp;
8243
8244 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8245 {
8246 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
8247 return 1;
8248 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
8249 return 1;
8250 else if (unformat (input, "src_port"))
8251 src_port = 0xFFFF;
8252 else if (unformat (input, "dst_port"))
8253 dst_port = 0xFFFF;
8254 else
8255 return 0;
8256 }
8257
8258 if (!src_port && !dst_port)
8259 return 0;
8260
8261 u8 *mask = 0;
8262 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
8263
8264 tcpudp = (tcpudp_header_t *) mask;
8265 tcpudp->src_port = src_port;
8266 tcpudp->dst_port = dst_port;
8267
8268 *maskp = mask;
8269
8270 return 1;
8271}
8272
8273uword
Dave Barach72d72232016-08-04 10:15:08 -04008274unformat_ip4_mask (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008275{
Dave Barach72d72232016-08-04 10:15:08 -04008276 u8 **maskp = va_arg (*args, u8 **);
8277 u8 *mask = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008278 u8 found_something = 0;
Dave Barach72d72232016-08-04 10:15:08 -04008279 ip4_header_t *ip;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008280
Ed Warnickecb9cada2015-12-08 15:45:58 -07008281#define _(a) u8 a=0;
8282 foreach_ip4_proto_field;
8283#undef _
8284 u8 version = 0;
8285 u8 hdr_length = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008286
8287
8288 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008289 {
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008290 if (unformat (input, "version"))
Dave Barach72d72232016-08-04 10:15:08 -04008291 version = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008292 else if (unformat (input, "hdr_length"))
Dave Barach72d72232016-08-04 10:15:08 -04008293 hdr_length = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008294 else if (unformat (input, "src"))
Dave Barach72d72232016-08-04 10:15:08 -04008295 src_address = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008296 else if (unformat (input, "dst"))
Dave Barach72d72232016-08-04 10:15:08 -04008297 dst_address = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008298 else if (unformat (input, "proto"))
Dave Barach72d72232016-08-04 10:15:08 -04008299 protocol = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008300
Ed Warnickecb9cada2015-12-08 15:45:58 -07008301#define _(a) else if (unformat (input, #a)) a=1;
8302 foreach_ip4_proto_field
8303#undef _
Dave Barach72d72232016-08-04 10:15:08 -04008304 else
8305 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008306 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008307
Ed Warnickecb9cada2015-12-08 15:45:58 -07008308#define _(a) found_something += a;
8309 foreach_ip4_proto_field;
8310#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008311
Ed Warnickecb9cada2015-12-08 15:45:58 -07008312 if (found_something == 0)
8313 return 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008314
Ed Warnickecb9cada2015-12-08 15:45:58 -07008315 vec_validate (mask, sizeof (*ip) - 1);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008316
Ed Warnickecb9cada2015-12-08 15:45:58 -07008317 ip = (ip4_header_t *) mask;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008318
Ed Warnickecb9cada2015-12-08 15:45:58 -07008319#define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8320 foreach_ip4_proto_field;
8321#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008322
Ed Warnickecb9cada2015-12-08 15:45:58 -07008323 ip->ip_version_and_header_length = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008324
Ed Warnickecb9cada2015-12-08 15:45:58 -07008325 if (version)
8326 ip->ip_version_and_header_length |= 0xF0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008327
Ed Warnickecb9cada2015-12-08 15:45:58 -07008328 if (hdr_length)
8329 ip->ip_version_and_header_length |= 0x0F;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008330
Ed Warnickecb9cada2015-12-08 15:45:58 -07008331 *maskp = mask;
8332 return 1;
8333}
8334
8335#define foreach_ip6_proto_field \
8336_(src_address) \
8337_(dst_address) \
8338_(payload_length) \
8339_(hop_limit) \
8340_(protocol)
8341
Dave Barach72d72232016-08-04 10:15:08 -04008342uword
8343unformat_ip6_mask (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008344{
Dave Barach72d72232016-08-04 10:15:08 -04008345 u8 **maskp = va_arg (*args, u8 **);
8346 u8 *mask = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008347 u8 found_something = 0;
Dave Barach72d72232016-08-04 10:15:08 -04008348 ip6_header_t *ip;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008349 u32 ip_version_traffic_class_and_flow_label;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008350
Ed Warnickecb9cada2015-12-08 15:45:58 -07008351#define _(a) u8 a=0;
8352 foreach_ip6_proto_field;
8353#undef _
8354 u8 version = 0;
8355 u8 traffic_class = 0;
8356 u8 flow_label = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008357
8358 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008359 {
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008360 if (unformat (input, "version"))
Dave Barach72d72232016-08-04 10:15:08 -04008361 version = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008362 else if (unformat (input, "traffic-class"))
Dave Barach72d72232016-08-04 10:15:08 -04008363 traffic_class = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008364 else if (unformat (input, "flow-label"))
Dave Barach72d72232016-08-04 10:15:08 -04008365 flow_label = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008366 else if (unformat (input, "src"))
Dave Barach72d72232016-08-04 10:15:08 -04008367 src_address = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008368 else if (unformat (input, "dst"))
Dave Barach72d72232016-08-04 10:15:08 -04008369 dst_address = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008370 else if (unformat (input, "proto"))
Dave Barach72d72232016-08-04 10:15:08 -04008371 protocol = 1;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008372
Ed Warnickecb9cada2015-12-08 15:45:58 -07008373#define _(a) else if (unformat (input, #a)) a=1;
8374 foreach_ip6_proto_field
8375#undef _
Dave Barach72d72232016-08-04 10:15:08 -04008376 else
8377 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008378 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008379
Ed Warnickecb9cada2015-12-08 15:45:58 -07008380#define _(a) found_something += a;
8381 foreach_ip6_proto_field;
8382#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008383
Ed Warnickecb9cada2015-12-08 15:45:58 -07008384 if (found_something == 0)
8385 return 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008386
Ed Warnickecb9cada2015-12-08 15:45:58 -07008387 vec_validate (mask, sizeof (*ip) - 1);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008388
Ed Warnickecb9cada2015-12-08 15:45:58 -07008389 ip = (ip6_header_t *) mask;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008390
Ed Warnickecb9cada2015-12-08 15:45:58 -07008391#define _(a) if (a) memset (&ip->a, 0xff, sizeof (ip->a));
8392 foreach_ip6_proto_field;
8393#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008394
Ed Warnickecb9cada2015-12-08 15:45:58 -07008395 ip_version_traffic_class_and_flow_label = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008396
Ed Warnickecb9cada2015-12-08 15:45:58 -07008397 if (version)
8398 ip_version_traffic_class_and_flow_label |= 0xF0000000;
8399
8400 if (traffic_class)
8401 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
8402
8403 if (flow_label)
8404 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
8405
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008406 ip->ip_version_traffic_class_and_flow_label =
Ed Warnickecb9cada2015-12-08 15:45:58 -07008407 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008408
Ed Warnickecb9cada2015-12-08 15:45:58 -07008409 *maskp = mask;
8410 return 1;
8411}
8412
Dave Barach72d72232016-08-04 10:15:08 -04008413uword
8414unformat_l3_mask (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008415{
Dave Barach72d72232016-08-04 10:15:08 -04008416 u8 **maskp = va_arg (*args, u8 **);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008417
Dave Barach72d72232016-08-04 10:15:08 -04008418 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8419 {
8420 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
8421 return 1;
8422 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
8423 return 1;
8424 else
8425 break;
8426 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008427 return 0;
8428}
8429
Dave Barach72d72232016-08-04 10:15:08 -04008430uword
8431unformat_l2_mask (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008432{
Dave Barach72d72232016-08-04 10:15:08 -04008433 u8 **maskp = va_arg (*args, u8 **);
8434 u8 *mask = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008435 u8 src = 0;
8436 u8 dst = 0;
8437 u8 proto = 0;
8438 u8 tag1 = 0;
8439 u8 tag2 = 0;
8440 u8 ignore_tag1 = 0;
8441 u8 ignore_tag2 = 0;
8442 u8 cos1 = 0;
8443 u8 cos2 = 0;
8444 u8 dot1q = 0;
8445 u8 dot1ad = 0;
8446 int len = 14;
8447
Dave Barach72d72232016-08-04 10:15:08 -04008448 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8449 {
8450 if (unformat (input, "src"))
8451 src = 1;
8452 else if (unformat (input, "dst"))
8453 dst = 1;
8454 else if (unformat (input, "proto"))
8455 proto = 1;
8456 else if (unformat (input, "tag1"))
8457 tag1 = 1;
8458 else if (unformat (input, "tag2"))
8459 tag2 = 1;
8460 else if (unformat (input, "ignore-tag1"))
8461 ignore_tag1 = 1;
8462 else if (unformat (input, "ignore-tag2"))
8463 ignore_tag2 = 1;
8464 else if (unformat (input, "cos1"))
8465 cos1 = 1;
8466 else if (unformat (input, "cos2"))
8467 cos2 = 1;
8468 else if (unformat (input, "dot1q"))
8469 dot1q = 1;
8470 else if (unformat (input, "dot1ad"))
8471 dot1ad = 1;
8472 else
8473 break;
8474 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008475 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
Dave Barach72d72232016-08-04 10:15:08 -04008476 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008477 return 0;
8478
8479 if (tag1 || ignore_tag1 || cos1 || dot1q)
8480 len = 18;
8481 if (tag2 || ignore_tag2 || cos2 || dot1ad)
8482 len = 22;
8483
Dave Barach72d72232016-08-04 10:15:08 -04008484 vec_validate (mask, len - 1);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008485
8486 if (dst)
8487 memset (mask, 0xff, 6);
8488
8489 if (src)
8490 memset (mask + 6, 0xff, 6);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008491
Ed Warnickecb9cada2015-12-08 15:45:58 -07008492 if (tag2 || dot1ad)
8493 {
8494 /* inner vlan tag */
8495 if (tag2)
Dave Barach72d72232016-08-04 10:15:08 -04008496 {
8497 mask[19] = 0xff;
8498 mask[18] = 0x0f;
8499 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008500 if (cos2)
Dave Barach72d72232016-08-04 10:15:08 -04008501 mask[18] |= 0xe0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008502 if (proto)
Dave Barach72d72232016-08-04 10:15:08 -04008503 mask[21] = mask[20] = 0xff;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008504 if (tag1)
Dave Barach72d72232016-08-04 10:15:08 -04008505 {
8506 mask[15] = 0xff;
8507 mask[14] = 0x0f;
8508 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008509 if (cos1)
Dave Barach72d72232016-08-04 10:15:08 -04008510 mask[14] |= 0xe0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008511 *maskp = mask;
8512 return 1;
8513 }
8514 if (tag1 | dot1q)
8515 {
8516 if (tag1)
Dave Barach72d72232016-08-04 10:15:08 -04008517 {
8518 mask[15] = 0xff;
8519 mask[14] = 0x0f;
8520 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008521 if (cos1)
Dave Barach72d72232016-08-04 10:15:08 -04008522 mask[14] |= 0xe0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008523 if (proto)
Dave Barach72d72232016-08-04 10:15:08 -04008524 mask[16] = mask[17] = 0xff;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008525
8526 *maskp = mask;
8527 return 1;
8528 }
8529 if (cos2)
8530 mask[18] |= 0xe0;
8531 if (cos1)
8532 mask[14] |= 0xe0;
8533 if (proto)
Dave Barach72d72232016-08-04 10:15:08 -04008534 mask[12] = mask[13] = 0xff;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008535
Ed Warnickecb9cada2015-12-08 15:45:58 -07008536 *maskp = mask;
8537 return 1;
8538}
8539
Dave Barach72d72232016-08-04 10:15:08 -04008540uword
8541unformat_classify_mask (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008542{
Dave Barach72d72232016-08-04 10:15:08 -04008543 u8 **maskp = va_arg (*args, u8 **);
8544 u32 *skipp = va_arg (*args, u32 *);
8545 u32 *matchp = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008546 u32 match;
Dave Barach72d72232016-08-04 10:15:08 -04008547 u8 *mask = 0;
8548 u8 *l2 = 0;
8549 u8 *l3 = 0;
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008550 u8 *l4 = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008551 int i;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008552
Dave Barach72d72232016-08-04 10:15:08 -04008553 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8554 {
8555 if (unformat (input, "hex %U", unformat_hex_string, &mask))
8556 ;
8557 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
8558 ;
8559 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
8560 ;
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008561 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
8562 ;
Dave Barach72d72232016-08-04 10:15:08 -04008563 else
8564 break;
8565 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008566
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008567 if (l4 && !l3)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008568 {
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008569 vec_free (mask);
8570 vec_free (l2);
8571 vec_free (l4);
8572 return 0;
8573 }
8574
8575 if (mask || l2 || l3 || l4)
8576 {
8577 if (l2 || l3 || l4)
Dave Barach72d72232016-08-04 10:15:08 -04008578 {
8579 /* "With a free Ethernet header in every package" */
8580 if (l2 == 0)
8581 vec_validate (l2, 13);
8582 mask = l2;
Dave Barach839fe3e2016-08-10 11:35:54 -04008583 if (vec_len (l3))
8584 {
8585 vec_append (mask, l3);
8586 vec_free (l3);
8587 }
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008588 if (vec_len (l4))
8589 {
8590 vec_append (mask, l4);
8591 vec_free (l4);
8592 }
Dave Barach72d72232016-08-04 10:15:08 -04008593 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008594
8595 /* Scan forward looking for the first significant mask octet */
8596 for (i = 0; i < vec_len (mask); i++)
Dave Barach72d72232016-08-04 10:15:08 -04008597 if (mask[i])
8598 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008599
8600 /* compute (skip, match) params */
Dave Barach72d72232016-08-04 10:15:08 -04008601 *skipp = i / sizeof (u32x4);
8602 vec_delete (mask, *skipp * sizeof (u32x4), 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008603
8604 /* Pad mask to an even multiple of the vector size */
8605 while (vec_len (mask) % sizeof (u32x4))
Dave Barach72d72232016-08-04 10:15:08 -04008606 vec_add1 (mask, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008607
8608 match = vec_len (mask) / sizeof (u32x4);
8609
Dave Barach72d72232016-08-04 10:15:08 -04008610 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
8611 {
8612 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
8613 if (*tmp || *(tmp + 1))
8614 break;
8615 match--;
8616 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008617 if (match == 0)
Dave Barach72d72232016-08-04 10:15:08 -04008618 clib_warning ("BUG: match 0");
Ed Warnickecb9cada2015-12-08 15:45:58 -07008619
Dave Barach72d72232016-08-04 10:15:08 -04008620 _vec_len (mask) = match * sizeof (u32x4);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008621
8622 *matchp = match;
8623 *maskp = mask;
8624
8625 return 1;
8626 }
8627
8628 return 0;
8629}
8630
8631#define foreach_l2_next \
8632_(drop, DROP) \
8633_(ethernet, ETHERNET_INPUT) \
8634_(ip4, IP4_INPUT) \
8635_(ip6, IP6_INPUT)
8636
Dave Barach72d72232016-08-04 10:15:08 -04008637uword
8638unformat_l2_next_index (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008639{
Dave Barach72d72232016-08-04 10:15:08 -04008640 u32 *miss_next_indexp = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008641 u32 next_index = 0;
8642 u32 tmp;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008643
Ed Warnickecb9cada2015-12-08 15:45:58 -07008644#define _(n,N) \
Dave Barachb84a3e52016-08-30 17:01:52 -04008645 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
Ed Warnickecb9cada2015-12-08 15:45:58 -07008646 foreach_l2_next;
8647#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008648
Ed Warnickecb9cada2015-12-08 15:45:58 -07008649 if (unformat (input, "%d", &tmp))
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008650 {
8651 next_index = tmp;
8652 goto out;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008653 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008654
Ed Warnickecb9cada2015-12-08 15:45:58 -07008655 return 0;
8656
Dave Barach72d72232016-08-04 10:15:08 -04008657out:
Ed Warnickecb9cada2015-12-08 15:45:58 -07008658 *miss_next_indexp = next_index;
8659 return 1;
8660}
8661
8662#define foreach_ip_next \
Ed Warnickecb9cada2015-12-08 15:45:58 -07008663_(drop, DROP) \
8664_(local, LOCAL) \
8665_(rewrite, REWRITE)
8666
Dave Barach72d72232016-08-04 10:15:08 -04008667uword
8668unformat_ip_next_index (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008669{
Dave Barach72d72232016-08-04 10:15:08 -04008670 u32 *miss_next_indexp = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008671 u32 next_index = 0;
8672 u32 tmp;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008673
Ed Warnickecb9cada2015-12-08 15:45:58 -07008674#define _(n,N) \
8675 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
8676 foreach_ip_next;
8677#undef _
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008678
Ed Warnickecb9cada2015-12-08 15:45:58 -07008679 if (unformat (input, "%d", &tmp))
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008680 {
8681 next_index = tmp;
8682 goto out;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008683 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008684
Ed Warnickecb9cada2015-12-08 15:45:58 -07008685 return 0;
8686
Dave Barach72d72232016-08-04 10:15:08 -04008687out:
Ed Warnickecb9cada2015-12-08 15:45:58 -07008688 *miss_next_indexp = next_index;
8689 return 1;
8690}
8691
8692#define foreach_acl_next \
8693_(deny, DENY)
8694
Dave Barach72d72232016-08-04 10:15:08 -04008695uword
8696unformat_acl_next_index (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008697{
Dave Barach72d72232016-08-04 10:15:08 -04008698 u32 *miss_next_indexp = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008699 u32 next_index = 0;
8700 u32 tmp;
8701
8702#define _(n,N) \
8703 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
8704 foreach_acl_next;
8705#undef _
8706
8707 if (unformat (input, "permit"))
8708 {
8709 next_index = ~0;
8710 goto out;
8711 }
8712 else if (unformat (input, "%d", &tmp))
8713 {
8714 next_index = tmp;
8715 goto out;
8716 }
8717
8718 return 0;
8719
Dave Barach72d72232016-08-04 10:15:08 -04008720out:
Ed Warnickecb9cada2015-12-08 15:45:58 -07008721 *miss_next_indexp = next_index;
8722 return 1;
8723}
8724
Dave Barach72d72232016-08-04 10:15:08 -04008725uword
8726unformat_policer_precolor (unformat_input_t * input, va_list * args)
Matus Fabian70e6a8d2016-06-20 08:10:42 -07008727{
Dave Barach72d72232016-08-04 10:15:08 -04008728 u32 *r = va_arg (*args, u32 *);
Matus Fabian70e6a8d2016-06-20 08:10:42 -07008729
8730 if (unformat (input, "conform-color"))
8731 *r = POLICE_CONFORM;
8732 else if (unformat (input, "exceed-color"))
8733 *r = POLICE_EXCEED;
8734 else
8735 return 0;
8736
8737 return 1;
8738}
8739
Dave Barach72d72232016-08-04 10:15:08 -04008740static int
8741api_classify_add_del_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008742{
Dave Barach72d72232016-08-04 10:15:08 -04008743 unformat_input_t *i = vam->input;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008744 vl_api_classify_add_del_table_t *mp;
8745
8746 u32 nbuckets = 2;
8747 u32 skip = ~0;
8748 u32 match = ~0;
8749 int is_add = 1;
8750 u32 table_index = ~0;
8751 u32 next_table_index = ~0;
8752 u32 miss_next_index = ~0;
Dave Barach72d72232016-08-04 10:15:08 -04008753 u32 memory_size = 32 << 20;
8754 u8 *mask = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008755 f64 timeout;
8756
Dave Barach72d72232016-08-04 10:15:08 -04008757 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8758 {
8759 if (unformat (i, "del"))
8760 is_add = 0;
8761 else if (unformat (i, "buckets %d", &nbuckets))
8762 ;
8763 else if (unformat (i, "memory_size %d", &memory_size))
8764 ;
8765 else if (unformat (i, "skip %d", &skip))
8766 ;
8767 else if (unformat (i, "match %d", &match))
8768 ;
8769 else if (unformat (i, "table %d", &table_index))
8770 ;
8771 else if (unformat (i, "mask %U", unformat_classify_mask,
8772 &mask, &skip, &match))
8773 ;
8774 else if (unformat (i, "next-table %d", &next_table_index))
8775 ;
8776 else if (unformat (i, "miss-next %U", unformat_ip_next_index,
8777 &miss_next_index))
8778 ;
8779 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
8780 &miss_next_index))
8781 ;
8782 else if (unformat (i, "acl-miss-next %U", unformat_acl_next_index,
8783 &miss_next_index))
8784 ;
8785 else
8786 break;
8787 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008788
Dave Barach72d72232016-08-04 10:15:08 -04008789 if (is_add && mask == 0)
8790 {
Ed Warnickecb9cada2015-12-08 15:45:58 -07008791 errmsg ("Mask required\n");
8792 return -99;
Dave Barach72d72232016-08-04 10:15:08 -04008793 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008794
Dave Barach72d72232016-08-04 10:15:08 -04008795 if (is_add && skip == ~0)
8796 {
Ed Warnickecb9cada2015-12-08 15:45:58 -07008797 errmsg ("skip count required\n");
8798 return -99;
Dave Barach72d72232016-08-04 10:15:08 -04008799 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008800
Dave Barach72d72232016-08-04 10:15:08 -04008801 if (is_add && match == ~0)
8802 {
Ed Warnickecb9cada2015-12-08 15:45:58 -07008803 errmsg ("match count required\n");
8804 return -99;
Dave Barach72d72232016-08-04 10:15:08 -04008805 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008806
Dave Barach72d72232016-08-04 10:15:08 -04008807 if (!is_add && table_index == ~0)
8808 {
Ed Warnickecb9cada2015-12-08 15:45:58 -07008809 errmsg ("table index required for delete\n");
8810 return -99;
Dave Barach72d72232016-08-04 10:15:08 -04008811 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07008812
Dave Barach72d72232016-08-04 10:15:08 -04008813 M2 (CLASSIFY_ADD_DEL_TABLE, classify_add_del_table, vec_len (mask));
Ed Warnickecb9cada2015-12-08 15:45:58 -07008814
8815 mp->is_add = is_add;
Dave Barach72d72232016-08-04 10:15:08 -04008816 mp->table_index = ntohl (table_index);
8817 mp->nbuckets = ntohl (nbuckets);
8818 mp->memory_size = ntohl (memory_size);
8819 mp->skip_n_vectors = ntohl (skip);
8820 mp->match_n_vectors = ntohl (match);
8821 mp->next_table_index = ntohl (next_table_index);
8822 mp->miss_next_index = ntohl (miss_next_index);
8823 clib_memcpy (mp->mask, mask, vec_len (mask));
Ed Warnickecb9cada2015-12-08 15:45:58 -07008824
Dave Barach72d72232016-08-04 10:15:08 -04008825 vec_free (mask);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008826
Dave Barach72d72232016-08-04 10:15:08 -04008827 S;
8828 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008829 /* NOTREACHED */
8830}
8831
Dave Barach72d72232016-08-04 10:15:08 -04008832uword
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008833unformat_l4_match (unformat_input_t * input, va_list * args)
8834{
8835 u8 **matchp = va_arg (*args, u8 **);
8836
8837 u8 *proto_header = 0;
8838 int src_port = 0;
8839 int dst_port = 0;
8840
8841 tcpudp_header_t h;
8842
8843 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
8844 {
8845 if (unformat (input, "src_port %d", &src_port))
8846 ;
8847 else if (unformat (input, "dst_port %d", &dst_port))
8848 ;
8849 else
8850 return 0;
8851 }
8852
8853 h.src_port = clib_host_to_net_u16 (src_port);
8854 h.dst_port = clib_host_to_net_u16 (dst_port);
8855 vec_validate (proto_header, sizeof (h) - 1);
8856 memcpy (proto_header, &h, sizeof (h));
8857
8858 *matchp = proto_header;
8859
8860 return 1;
8861}
8862
8863uword
Dave Barach72d72232016-08-04 10:15:08 -04008864unformat_ip4_match (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008865{
Dave Barach72d72232016-08-04 10:15:08 -04008866 u8 **matchp = va_arg (*args, u8 **);
8867 u8 *match = 0;
8868 ip4_header_t *ip;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008869 int version = 0;
8870 u32 version_val;
8871 int hdr_length = 0;
8872 u32 hdr_length_val;
8873 int src = 0, dst = 0;
8874 ip4_address_t src_val, dst_val;
8875 int proto = 0;
8876 u32 proto_val;
8877 int tos = 0;
8878 u32 tos_val;
8879 int length = 0;
8880 u32 length_val;
8881 int fragment_id = 0;
8882 u32 fragment_id_val;
8883 int ttl = 0;
8884 int ttl_val;
8885 int checksum = 0;
8886 u32 checksum_val;
8887
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008888 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008889 {
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008890 if (unformat (input, "version %d", &version_val))
Dave Barach72d72232016-08-04 10:15:08 -04008891 version = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008892 else if (unformat (input, "hdr_length %d", &hdr_length_val))
Dave Barach72d72232016-08-04 10:15:08 -04008893 hdr_length = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008894 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
Dave Barach72d72232016-08-04 10:15:08 -04008895 src = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008896 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
Dave Barach72d72232016-08-04 10:15:08 -04008897 dst = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008898 else if (unformat (input, "proto %d", &proto_val))
Dave Barach72d72232016-08-04 10:15:08 -04008899 proto = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008900 else if (unformat (input, "tos %d", &tos_val))
Dave Barach72d72232016-08-04 10:15:08 -04008901 tos = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008902 else if (unformat (input, "length %d", &length_val))
Dave Barach72d72232016-08-04 10:15:08 -04008903 length = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008904 else if (unformat (input, "fragment_id %d", &fragment_id_val))
Dave Barach72d72232016-08-04 10:15:08 -04008905 fragment_id = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008906 else if (unformat (input, "ttl %d", &ttl_val))
Dave Barach72d72232016-08-04 10:15:08 -04008907 ttl = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008908 else if (unformat (input, "checksum %d", &checksum_val))
Dave Barach72d72232016-08-04 10:15:08 -04008909 checksum = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008910 else
Dave Barach72d72232016-08-04 10:15:08 -04008911 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008912 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008913
Ed Warnickecb9cada2015-12-08 15:45:58 -07008914 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
8915 + ttl + checksum == 0)
8916 return 0;
8917
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008918 /*
Ed Warnickecb9cada2015-12-08 15:45:58 -07008919 * Aligned because we use the real comparison functions
8920 */
Dave Barach72d72232016-08-04 10:15:08 -04008921 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008922
Ed Warnickecb9cada2015-12-08 15:45:58 -07008923 ip = (ip4_header_t *) match;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008924
Ed Warnickecb9cada2015-12-08 15:45:58 -07008925 /* These are realistically matched in practice */
8926 if (src)
8927 ip->src_address.as_u32 = src_val.as_u32;
8928
8929 if (dst)
8930 ip->dst_address.as_u32 = dst_val.as_u32;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008931
Ed Warnickecb9cada2015-12-08 15:45:58 -07008932 if (proto)
8933 ip->protocol = proto_val;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008934
Ed Warnickecb9cada2015-12-08 15:45:58 -07008935
8936 /* These are not, but they're included for completeness */
8937 if (version)
Dave Barach72d72232016-08-04 10:15:08 -04008938 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008939
8940 if (hdr_length)
8941 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008942
Ed Warnickecb9cada2015-12-08 15:45:58 -07008943 if (tos)
8944 ip->tos = tos_val;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008945
Ed Warnickecb9cada2015-12-08 15:45:58 -07008946 if (length)
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008947 ip->length = clib_host_to_net_u16 (length_val);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008948
Ed Warnickecb9cada2015-12-08 15:45:58 -07008949 if (ttl)
8950 ip->ttl = ttl_val;
8951
8952 if (checksum)
Juraj Sloboda51ffa812016-08-07 23:46:45 -07008953 ip->checksum = clib_host_to_net_u16 (checksum_val);
Ed Warnickecb9cada2015-12-08 15:45:58 -07008954
8955 *matchp = match;
8956 return 1;
8957}
8958
Dave Barach72d72232016-08-04 10:15:08 -04008959uword
8960unformat_ip6_match (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008961{
Dave Barach72d72232016-08-04 10:15:08 -04008962 u8 **matchp = va_arg (*args, u8 **);
8963 u8 *match = 0;
8964 ip6_header_t *ip;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008965 int version = 0;
8966 u32 version_val;
Dave Barach839fe3e2016-08-10 11:35:54 -04008967 u8 traffic_class = 0;
8968 u32 traffic_class_val = 0;
8969 u8 flow_label = 0;
Dave Barach72d72232016-08-04 10:15:08 -04008970 u8 flow_label_val;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008971 int src = 0, dst = 0;
8972 ip6_address_t src_val, dst_val;
8973 int proto = 0;
8974 u32 proto_val;
8975 int payload_length = 0;
8976 u32 payload_length_val;
8977 int hop_limit = 0;
8978 int hop_limit_val;
8979 u32 ip_version_traffic_class_and_flow_label;
8980
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008981 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -07008982 {
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08008983 if (unformat (input, "version %d", &version_val))
Dave Barach72d72232016-08-04 10:15:08 -04008984 version = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008985 else if (unformat (input, "traffic_class %d", &traffic_class_val))
Dave Barach72d72232016-08-04 10:15:08 -04008986 traffic_class = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008987 else if (unformat (input, "flow_label %d", &flow_label_val))
Dave Barach72d72232016-08-04 10:15:08 -04008988 flow_label = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008989 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
Dave Barach72d72232016-08-04 10:15:08 -04008990 src = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008991 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
Dave Barach72d72232016-08-04 10:15:08 -04008992 dst = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008993 else if (unformat (input, "proto %d", &proto_val))
Dave Barach72d72232016-08-04 10:15:08 -04008994 proto = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008995 else if (unformat (input, "payload_length %d", &payload_length_val))
Dave Barach72d72232016-08-04 10:15:08 -04008996 payload_length = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008997 else if (unformat (input, "hop_limit %d", &hop_limit_val))
Dave Barach72d72232016-08-04 10:15:08 -04008998 hop_limit = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07008999 else
Dave Barach72d72232016-08-04 10:15:08 -04009000 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009001 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009002
Ed Warnickecb9cada2015-12-08 15:45:58 -07009003 if (version + traffic_class + flow_label + src + dst + proto +
9004 payload_length + hop_limit == 0)
9005 return 0;
9006
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009007 /*
Ed Warnickecb9cada2015-12-08 15:45:58 -07009008 * Aligned because we use the real comparison functions
9009 */
Dave Barach72d72232016-08-04 10:15:08 -04009010 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009011
Ed Warnickecb9cada2015-12-08 15:45:58 -07009012 ip = (ip6_header_t *) match;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009013
Ed Warnickecb9cada2015-12-08 15:45:58 -07009014 if (src)
Damjan Marionf1213b82016-03-13 02:22:06 +01009015 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009016
9017 if (dst)
Damjan Marionf1213b82016-03-13 02:22:06 +01009018 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009019
Ed Warnickecb9cada2015-12-08 15:45:58 -07009020 if (proto)
9021 ip->protocol = proto_val;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009022
Ed Warnickecb9cada2015-12-08 15:45:58 -07009023 ip_version_traffic_class_and_flow_label = 0;
9024
9025 if (version)
9026 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
9027
9028 if (traffic_class)
Dave Barach72d72232016-08-04 10:15:08 -04009029 ip_version_traffic_class_and_flow_label |=
9030 (traffic_class_val & 0xFF) << 20;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009031
9032 if (flow_label)
9033 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009034
9035 ip->ip_version_traffic_class_and_flow_label =
Ed Warnickecb9cada2015-12-08 15:45:58 -07009036 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
9037
9038 if (payload_length)
9039 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009040
Ed Warnickecb9cada2015-12-08 15:45:58 -07009041 if (hop_limit)
9042 ip->hop_limit = hop_limit_val;
9043
9044 *matchp = match;
9045 return 1;
9046}
9047
Dave Barach72d72232016-08-04 10:15:08 -04009048uword
9049unformat_l3_match (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009050{
Dave Barach72d72232016-08-04 10:15:08 -04009051 u8 **matchp = va_arg (*args, u8 **);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009052
Dave Barach72d72232016-08-04 10:15:08 -04009053 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9054 {
9055 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
9056 return 1;
9057 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
9058 return 1;
9059 else
9060 break;
9061 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009062 return 0;
9063}
9064
Dave Barach72d72232016-08-04 10:15:08 -04009065uword
9066unformat_vlan_tag (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009067{
Dave Barach72d72232016-08-04 10:15:08 -04009068 u8 *tagp = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009069 u32 tag;
9070
Dave Barach72d72232016-08-04 10:15:08 -04009071 if (unformat (input, "%d", &tag))
Ed Warnickecb9cada2015-12-08 15:45:58 -07009072 {
Dave Barach72d72232016-08-04 10:15:08 -04009073 tagp[0] = (tag >> 8) & 0x0F;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009074 tagp[1] = tag & 0xFF;
9075 return 1;
9076 }
9077
9078 return 0;
9079}
9080
Dave Barach72d72232016-08-04 10:15:08 -04009081uword
9082unformat_l2_match (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009083{
Dave Barach72d72232016-08-04 10:15:08 -04009084 u8 **matchp = va_arg (*args, u8 **);
9085 u8 *match = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009086 u8 src = 0;
9087 u8 src_val[6];
9088 u8 dst = 0;
9089 u8 dst_val[6];
9090 u8 proto = 0;
9091 u16 proto_val;
9092 u8 tag1 = 0;
Dave Barach72d72232016-08-04 10:15:08 -04009093 u8 tag1_val[2];
Ed Warnickecb9cada2015-12-08 15:45:58 -07009094 u8 tag2 = 0;
Dave Barach72d72232016-08-04 10:15:08 -04009095 u8 tag2_val[2];
Ed Warnickecb9cada2015-12-08 15:45:58 -07009096 int len = 14;
9097 u8 ignore_tag1 = 0;
9098 u8 ignore_tag2 = 0;
9099 u8 cos1 = 0;
9100 u8 cos2 = 0;
9101 u32 cos1_val = 0;
9102 u32 cos2_val = 0;
9103
Dave Barach72d72232016-08-04 10:15:08 -04009104 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9105 {
9106 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
9107 src = 1;
9108 else
9109 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
9110 dst = 1;
9111 else if (unformat (input, "proto %U",
9112 unformat_ethernet_type_host_byte_order, &proto_val))
9113 proto = 1;
9114 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
9115 tag1 = 1;
9116 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
9117 tag2 = 1;
9118 else if (unformat (input, "ignore-tag1"))
9119 ignore_tag1 = 1;
9120 else if (unformat (input, "ignore-tag2"))
9121 ignore_tag2 = 1;
9122 else if (unformat (input, "cos1 %d", &cos1_val))
9123 cos1 = 1;
9124 else if (unformat (input, "cos2 %d", &cos2_val))
9125 cos2 = 1;
9126 else
9127 break;
9128 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009129 if ((src + dst + proto + tag1 + tag2 +
Dave Barach72d72232016-08-04 10:15:08 -04009130 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009131 return 0;
9132
9133 if (tag1 || ignore_tag1 || cos1)
9134 len = 18;
9135 if (tag2 || ignore_tag2 || cos2)
9136 len = 22;
9137
Dave Barach72d72232016-08-04 10:15:08 -04009138 vec_validate_aligned (match, len - 1, sizeof (u32x4));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009139
9140 if (dst)
Damjan Marionf1213b82016-03-13 02:22:06 +01009141 clib_memcpy (match, dst_val, 6);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009142
9143 if (src)
Damjan Marionf1213b82016-03-13 02:22:06 +01009144 clib_memcpy (match + 6, src_val, 6);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009145
Ed Warnickecb9cada2015-12-08 15:45:58 -07009146 if (tag2)
9147 {
9148 /* inner vlan tag */
9149 match[19] = tag2_val[1];
9150 match[18] = tag2_val[0];
9151 if (cos2)
Dave Barach72d72232016-08-04 10:15:08 -04009152 match[18] |= (cos2_val & 0x7) << 5;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009153 if (proto)
Dave Barach72d72232016-08-04 10:15:08 -04009154 {
9155 match[21] = proto_val & 0xff;
9156 match[20] = proto_val >> 8;
9157 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009158 if (tag1)
Dave Barach72d72232016-08-04 10:15:08 -04009159 {
9160 match[15] = tag1_val[1];
9161 match[14] = tag1_val[0];
9162 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009163 if (cos1)
Dave Barach72d72232016-08-04 10:15:08 -04009164 match[14] |= (cos1_val & 0x7) << 5;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009165 *matchp = match;
9166 return 1;
9167 }
9168 if (tag1)
9169 {
Dave Barach72d72232016-08-04 10:15:08 -04009170 match[15] = tag1_val[1];
9171 match[14] = tag1_val[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -07009172 if (proto)
Dave Barach72d72232016-08-04 10:15:08 -04009173 {
9174 match[17] = proto_val & 0xff;
9175 match[16] = proto_val >> 8;
9176 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009177 if (cos1)
Dave Barach72d72232016-08-04 10:15:08 -04009178 match[14] |= (cos1_val & 0x7) << 5;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009179
9180 *matchp = match;
9181 return 1;
9182 }
9183 if (cos2)
Dave Barach72d72232016-08-04 10:15:08 -04009184 match[18] |= (cos2_val & 0x7) << 5;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009185 if (cos1)
Dave Barach72d72232016-08-04 10:15:08 -04009186 match[14] |= (cos1_val & 0x7) << 5;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009187 if (proto)
9188 {
9189 match[13] = proto_val & 0xff;
9190 match[12] = proto_val >> 8;
9191 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009192
Ed Warnickecb9cada2015-12-08 15:45:58 -07009193 *matchp = match;
9194 return 1;
9195}
9196
9197
Dave Barach72d72232016-08-04 10:15:08 -04009198uword
9199unformat_classify_match (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009200{
Dave Barach72d72232016-08-04 10:15:08 -04009201 u8 **matchp = va_arg (*args, u8 **);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009202 u32 skip_n_vectors = va_arg (*args, u32);
9203 u32 match_n_vectors = va_arg (*args, u32);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009204
Dave Barach72d72232016-08-04 10:15:08 -04009205 u8 *match = 0;
9206 u8 *l2 = 0;
9207 u8 *l3 = 0;
Juraj Sloboda51ffa812016-08-07 23:46:45 -07009208 u8 *l4 = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009209
Dave Barach72d72232016-08-04 10:15:08 -04009210 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
9211 {
9212 if (unformat (input, "hex %U", unformat_hex_string, &match))
9213 ;
9214 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
9215 ;
9216 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
9217 ;
Juraj Sloboda51ffa812016-08-07 23:46:45 -07009218 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
9219 ;
Dave Barach72d72232016-08-04 10:15:08 -04009220 else
9221 break;
9222 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009223
Juraj Sloboda51ffa812016-08-07 23:46:45 -07009224 if (l4 && !l3)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009225 {
Juraj Sloboda51ffa812016-08-07 23:46:45 -07009226 vec_free (match);
9227 vec_free (l2);
9228 vec_free (l4);
9229 return 0;
9230 }
9231
9232 if (match || l2 || l3 || l4)
9233 {
9234 if (l2 || l3 || l4)
Dave Barach72d72232016-08-04 10:15:08 -04009235 {
9236 /* "Win a free Ethernet header in every packet" */
9237 if (l2 == 0)
9238 vec_validate_aligned (l2, 13, sizeof (u32x4));
9239 match = l2;
Dave Barach839fe3e2016-08-10 11:35:54 -04009240 if (vec_len (l3))
9241 {
9242 vec_append_aligned (match, l3, sizeof (u32x4));
9243 vec_free (l3);
9244 }
Juraj Sloboda51ffa812016-08-07 23:46:45 -07009245 if (vec_len (l4))
9246 {
9247 vec_append_aligned (match, l4, sizeof (u32x4));
9248 vec_free (l4);
9249 }
Dave Barach72d72232016-08-04 10:15:08 -04009250 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009251
9252 /* Make sure the vector is big enough even if key is all 0's */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009253 vec_validate_aligned
Dave Barach72d72232016-08-04 10:15:08 -04009254 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
9255 sizeof (u32x4));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009256
Dave Barach72d72232016-08-04 10:15:08 -04009257 /* Set size, include skipped vectors */
9258 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009259
9260 *matchp = match;
9261
9262 return 1;
9263 }
9264
9265 return 0;
9266}
9267
Dave Barach72d72232016-08-04 10:15:08 -04009268static int
9269api_classify_add_del_session (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009270{
Dave Barach72d72232016-08-04 10:15:08 -04009271 unformat_input_t *i = vam->input;
9272 vl_api_classify_add_del_session_t *mp;
9273 int is_add = 1;
9274 u32 table_index = ~0;
9275 u32 hit_next_index = ~0;
9276 u32 opaque_index = ~0;
9277 u8 *match = 0;
9278 i32 advance = 0;
9279 f64 timeout;
9280 u32 skip_n_vectors = 0;
9281 u32 match_n_vectors = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009282
Dave Barach72d72232016-08-04 10:15:08 -04009283 /*
9284 * Warning: you have to supply skip_n and match_n
9285 * because the API client cant simply look at the classify
9286 * table object.
9287 */
Ed Warnickecb9cada2015-12-08 15:45:58 -07009288
Dave Barach72d72232016-08-04 10:15:08 -04009289 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9290 {
9291 if (unformat (i, "del"))
9292 is_add = 0;
9293 else if (unformat (i, "hit-next %U", unformat_ip_next_index,
9294 &hit_next_index))
9295 ;
9296 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
9297 &hit_next_index))
9298 ;
9299 else if (unformat (i, "acl-hit-next %U", unformat_acl_next_index,
9300 &hit_next_index))
9301 ;
9302 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
9303 ;
9304 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
9305 ;
9306 else if (unformat (i, "opaque-index %d", &opaque_index))
9307 ;
9308 else if (unformat (i, "skip_n %d", &skip_n_vectors))
9309 ;
9310 else if (unformat (i, "match_n %d", &match_n_vectors))
9311 ;
9312 else if (unformat (i, "match %U", unformat_classify_match,
9313 &match, skip_n_vectors, match_n_vectors))
9314 ;
9315 else if (unformat (i, "advance %d", &advance))
9316 ;
9317 else if (unformat (i, "table-index %d", &table_index))
9318 ;
9319 else
9320 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009321 }
9322
Dave Barach72d72232016-08-04 10:15:08 -04009323 if (table_index == ~0)
9324 {
9325 errmsg ("Table index required\n");
9326 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009327 }
9328
Dave Barach72d72232016-08-04 10:15:08 -04009329 if (is_add && match == 0)
9330 {
9331 errmsg ("Match value required\n");
9332 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009333 }
9334
Dave Barach72d72232016-08-04 10:15:08 -04009335 M2 (CLASSIFY_ADD_DEL_SESSION, classify_add_del_session, vec_len (match));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009336
Dave Barach72d72232016-08-04 10:15:08 -04009337 mp->is_add = is_add;
9338 mp->table_index = ntohl (table_index);
9339 mp->hit_next_index = ntohl (hit_next_index);
9340 mp->opaque_index = ntohl (opaque_index);
9341 mp->advance = ntohl (advance);
9342 clib_memcpy (mp->match, match, vec_len (match));
9343 vec_free (match);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009344
Dave Barach72d72232016-08-04 10:15:08 -04009345 S;
9346 W;
9347 /* NOTREACHED */
Ed Warnickecb9cada2015-12-08 15:45:58 -07009348}
9349
Dave Barach72d72232016-08-04 10:15:08 -04009350static int
9351api_classify_set_interface_ip_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009352{
Dave Barach72d72232016-08-04 10:15:08 -04009353 unformat_input_t *i = vam->input;
9354 vl_api_classify_set_interface_ip_table_t *mp;
9355 f64 timeout;
9356 u32 sw_if_index;
9357 int sw_if_index_set;
9358 u32 table_index = ~0;
9359 u8 is_ipv6 = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009360
Dave Barach72d72232016-08-04 10:15:08 -04009361 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9362 {
9363 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9364 sw_if_index_set = 1;
9365 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9366 sw_if_index_set = 1;
9367 else if (unformat (i, "table %d", &table_index))
9368 ;
9369 else
9370 {
9371 clib_warning ("parse error '%U'", format_unformat_error, i);
9372 return -99;
9373 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009374 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009375
Dave Barach72d72232016-08-04 10:15:08 -04009376 if (sw_if_index_set == 0)
9377 {
9378 errmsg ("missing interface name or sw_if_index\n");
9379 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009380 }
9381
9382
Dave Barach72d72232016-08-04 10:15:08 -04009383 M (CLASSIFY_SET_INTERFACE_IP_TABLE, classify_set_interface_ip_table);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009384
Dave Barach72d72232016-08-04 10:15:08 -04009385 mp->sw_if_index = ntohl (sw_if_index);
9386 mp->table_index = ntohl (table_index);
9387 mp->is_ipv6 = is_ipv6;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009388
Dave Barach72d72232016-08-04 10:15:08 -04009389 S;
9390 W;
9391 /* NOTREACHED */
9392 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009393}
9394
Dave Barach72d72232016-08-04 10:15:08 -04009395static int
9396api_classify_set_interface_l2_tables (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009397{
Dave Barach72d72232016-08-04 10:15:08 -04009398 unformat_input_t *i = vam->input;
9399 vl_api_classify_set_interface_l2_tables_t *mp;
9400 f64 timeout;
9401 u32 sw_if_index;
9402 int sw_if_index_set;
9403 u32 ip4_table_index = ~0;
9404 u32 ip6_table_index = ~0;
9405 u32 other_table_index = ~0;
Dave Barachb84a3e52016-08-30 17:01:52 -04009406 u32 is_input = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009407
Dave Barach72d72232016-08-04 10:15:08 -04009408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9409 {
9410 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9411 sw_if_index_set = 1;
9412 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9413 sw_if_index_set = 1;
9414 else if (unformat (i, "ip4-table %d", &ip4_table_index))
9415 ;
9416 else if (unformat (i, "ip6-table %d", &ip6_table_index))
9417 ;
9418 else if (unformat (i, "other-table %d", &other_table_index))
9419 ;
Dave Barachb84a3e52016-08-30 17:01:52 -04009420 else if (unformat (i, "is-input %d", &is_input))
9421 ;
Dave Barach72d72232016-08-04 10:15:08 -04009422 else
9423 {
9424 clib_warning ("parse error '%U'", format_unformat_error, i);
9425 return -99;
9426 }
Ed Warnickecb9cada2015-12-08 15:45:58 -07009427 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009428
Dave Barach72d72232016-08-04 10:15:08 -04009429 if (sw_if_index_set == 0)
9430 {
9431 errmsg ("missing interface name or sw_if_index\n");
9432 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009433 }
9434
9435
Dave Barach72d72232016-08-04 10:15:08 -04009436 M (CLASSIFY_SET_INTERFACE_L2_TABLES, classify_set_interface_l2_tables);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009437
Dave Barach72d72232016-08-04 10:15:08 -04009438 mp->sw_if_index = ntohl (sw_if_index);
9439 mp->ip4_table_index = ntohl (ip4_table_index);
9440 mp->ip6_table_index = ntohl (ip6_table_index);
9441 mp->other_table_index = ntohl (other_table_index);
Dave Barachb84a3e52016-08-30 17:01:52 -04009442 mp->is_input = (u8) is_input;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009443
Dave Barach72d72232016-08-04 10:15:08 -04009444 S;
9445 W;
9446 /* NOTREACHED */
9447 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009448}
9449
Dave Barach72d72232016-08-04 10:15:08 -04009450static int
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009451api_set_ipfix_exporter (vat_main_t * vam)
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009452{
Dave Barach72d72232016-08-04 10:15:08 -04009453 unformat_input_t *i = vam->input;
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009454 vl_api_set_ipfix_exporter_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -04009455 ip4_address_t collector_address;
9456 u8 collector_address_set = 0;
9457 u32 collector_port = ~0;
9458 ip4_address_t src_address;
9459 u8 src_address_set = 0;
9460 u32 vrf_id = ~0;
9461 u32 path_mtu = ~0;
9462 u32 template_interval = ~0;
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009463 u8 udp_checksum = 0;
Dave Barach72d72232016-08-04 10:15:08 -04009464 f64 timeout;
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009465
Dave Barach72d72232016-08-04 10:15:08 -04009466 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9467 {
9468 if (unformat (i, "collector_address %U", unformat_ip4_address,
9469 &collector_address))
9470 collector_address_set = 1;
9471 else if (unformat (i, "collector_port %d", &collector_port))
9472 ;
9473 else if (unformat (i, "src_address %U", unformat_ip4_address,
9474 &src_address))
9475 src_address_set = 1;
9476 else if (unformat (i, "vrf_id %d", &vrf_id))
9477 ;
9478 else if (unformat (i, "path_mtu %d", &path_mtu))
9479 ;
9480 else if (unformat (i, "template_interval %d", &template_interval))
9481 ;
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009482 else if (unformat (i, "udp_checksum"))
9483 udp_checksum = 1;
Dave Barach72d72232016-08-04 10:15:08 -04009484 else
9485 break;
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009486 }
9487
Dave Barach72d72232016-08-04 10:15:08 -04009488 if (collector_address_set == 0)
9489 {
9490 errmsg ("collector_address required\n");
9491 return -99;
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009492 }
9493
Dave Barach72d72232016-08-04 10:15:08 -04009494 if (src_address_set == 0)
9495 {
9496 errmsg ("src_address required\n");
9497 return -99;
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009498 }
9499
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009500 M (SET_IPFIX_EXPORTER, set_ipfix_exporter);
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009501
Dave Barach72d72232016-08-04 10:15:08 -04009502 memcpy (mp->collector_address, collector_address.data,
9503 sizeof (collector_address.data));
9504 mp->collector_port = htons ((u16) collector_port);
9505 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
9506 mp->vrf_id = htonl (vrf_id);
9507 mp->path_mtu = htonl (path_mtu);
9508 mp->template_interval = htonl (template_interval);
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009509 mp->udp_checksum = udp_checksum;
9510
9511 S;
9512 W;
9513 /* NOTREACHED */
9514}
9515
9516static int
9517api_set_ipfix_classify_stream (vat_main_t * vam)
9518{
9519 unformat_input_t *i = vam->input;
9520 vl_api_set_ipfix_classify_stream_t *mp;
9521 u32 domain_id = 0;
9522 u32 src_port = UDP_DST_PORT_ipfix;
9523 f64 timeout;
9524
9525 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9526 {
9527 if (unformat (i, "domain %d", &domain_id))
9528 ;
9529 else if (unformat (i, "src_port %d", &src_port))
9530 ;
9531 else
9532 {
9533 errmsg ("unknown input `%U'", format_unformat_error, i);
9534 return -99;
9535 }
9536 }
9537
9538 M (SET_IPFIX_CLASSIFY_STREAM, set_ipfix_classify_stream);
9539
9540 mp->domain_id = htonl (domain_id);
9541 mp->src_port = htons ((u16) src_port);
9542
9543 S;
9544 W;
9545 /* NOTREACHED */
9546}
9547
9548static int
9549api_ipfix_classify_table_add_del (vat_main_t * vam)
9550{
9551 unformat_input_t *i = vam->input;
9552 vl_api_ipfix_classify_table_add_del_t *mp;
9553 int is_add = -1;
Juraj Sloboda24648ad2016-09-06 04:43:52 -07009554 u32 classify_table_index = ~0;
Juraj Slobodaffa652a2016-08-07 23:43:42 -07009555 u8 ip_version = 0;
9556 u8 transport_protocol = 255;
9557 f64 timeout;
9558
9559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9560 {
9561 if (unformat (i, "add"))
9562 is_add = 1;
9563 else if (unformat (i, "del"))
9564 is_add = 0;
9565 else if (unformat (i, "table %d", &classify_table_index))
9566 ;
9567 else if (unformat (i, "ip4"))
9568 ip_version = 4;
9569 else if (unformat (i, "ip6"))
9570 ip_version = 6;
9571 else if (unformat (i, "tcp"))
9572 transport_protocol = 6;
9573 else if (unformat (i, "udp"))
9574 transport_protocol = 17;
9575 else
9576 {
9577 errmsg ("unknown input `%U'", format_unformat_error, i);
9578 return -99;
9579 }
9580 }
9581
9582 if (is_add == -1)
9583 {
9584 errmsg ("expecting: add|del");
9585 return -99;
9586 }
9587 if (classify_table_index == ~0)
9588 {
9589 errmsg ("classifier table not specified");
9590 return -99;
9591 }
9592 if (ip_version == 0)
9593 {
9594 errmsg ("IP version not specified");
9595 return -99;
9596 }
9597
9598 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, ipfix_classify_table_add_del);
9599
9600 mp->is_add = is_add;
9601 mp->table_id = htonl (classify_table_index);
9602 mp->ip_version = ip_version;
9603 mp->transport_protocol = transport_protocol;
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009604
Dave Barach72d72232016-08-04 10:15:08 -04009605 S;
9606 W;
9607 /* NOTREACHED */
Juraj Slobodaac645ad2016-07-07 00:18:57 -07009608}
9609
Dave Barach72d72232016-08-04 10:15:08 -04009610static int
9611api_get_node_index (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009612{
Dave Barach72d72232016-08-04 10:15:08 -04009613 unformat_input_t *i = vam->input;
9614 vl_api_get_node_index_t *mp;
9615 f64 timeout;
9616 u8 *name = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009617
Dave Barach72d72232016-08-04 10:15:08 -04009618 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9619 {
9620 if (unformat (i, "node %s", &name))
9621 ;
9622 else
9623 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009624 }
Dave Barach72d72232016-08-04 10:15:08 -04009625 if (name == 0)
9626 {
9627 errmsg ("node name required\n");
9628 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009629 }
Dave Barach72d72232016-08-04 10:15:08 -04009630 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9631 {
9632 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9633 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009634 }
9635
Dave Barach72d72232016-08-04 10:15:08 -04009636 M (GET_NODE_INDEX, get_node_index);
9637 clib_memcpy (mp->node_name, name, vec_len (name));
9638 vec_free (name);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009639
Dave Barach72d72232016-08-04 10:15:08 -04009640 S;
9641 W;
9642 /* NOTREACHED */
9643 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009644}
9645
Dave Barach72d72232016-08-04 10:15:08 -04009646static int
9647api_get_next_index (vat_main_t * vam)
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009648{
Dave Barach72d72232016-08-04 10:15:08 -04009649 unformat_input_t *i = vam->input;
9650 vl_api_get_next_index_t *mp;
9651 f64 timeout;
9652 u8 *node_name = 0, *next_node_name = 0;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009653
Dave Barach72d72232016-08-04 10:15:08 -04009654 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9655 {
9656 if (unformat (i, "node-name %s", &node_name))
9657 ;
9658 else if (unformat (i, "next-node-name %s", &next_node_name))
9659 break;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009660 }
9661
Dave Barach72d72232016-08-04 10:15:08 -04009662 if (node_name == 0)
9663 {
9664 errmsg ("node name required\n");
9665 return -99;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009666 }
Dave Barach72d72232016-08-04 10:15:08 -04009667 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
9668 {
9669 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9670 return -99;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009671 }
9672
Dave Barach72d72232016-08-04 10:15:08 -04009673 if (next_node_name == 0)
9674 {
9675 errmsg ("next node name required\n");
9676 return -99;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009677 }
Dave Barach72d72232016-08-04 10:15:08 -04009678 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
9679 {
9680 errmsg ("next node name too long, max %d\n", ARRAY_LEN (mp->next_name));
9681 return -99;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009682 }
9683
Dave Barach72d72232016-08-04 10:15:08 -04009684 M (GET_NEXT_INDEX, get_next_index);
9685 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
9686 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
9687 vec_free (node_name);
9688 vec_free (next_node_name);
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009689
Dave Barach72d72232016-08-04 10:15:08 -04009690 S;
9691 W;
9692 /* NOTREACHED */
9693 return 0;
Keith Burns (alagalah)c61080e2016-07-19 14:47:43 -07009694}
9695
Dave Barach72d72232016-08-04 10:15:08 -04009696static int
9697api_add_node_next (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009698{
Dave Barach72d72232016-08-04 10:15:08 -04009699 unformat_input_t *i = vam->input;
9700 vl_api_add_node_next_t *mp;
9701 f64 timeout;
9702 u8 *name = 0;
9703 u8 *next = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009704
Dave Barach72d72232016-08-04 10:15:08 -04009705 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9706 {
9707 if (unformat (i, "node %s", &name))
9708 ;
9709 else if (unformat (i, "next %s", &next))
9710 ;
9711 else
9712 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009713 }
Dave Barach72d72232016-08-04 10:15:08 -04009714 if (name == 0)
9715 {
9716 errmsg ("node name required\n");
9717 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009718 }
Dave Barach72d72232016-08-04 10:15:08 -04009719 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
9720 {
9721 errmsg ("node name too long, max %d\n", ARRAY_LEN (mp->node_name));
9722 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009723 }
Dave Barach72d72232016-08-04 10:15:08 -04009724 if (next == 0)
9725 {
9726 errmsg ("next node required\n");
9727 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009728 }
Dave Barach72d72232016-08-04 10:15:08 -04009729 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
9730 {
9731 errmsg ("next name too long, max %d\n", ARRAY_LEN (mp->next_name));
9732 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009733 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009734
Dave Barach72d72232016-08-04 10:15:08 -04009735 M (ADD_NODE_NEXT, add_node_next);
9736 clib_memcpy (mp->node_name, name, vec_len (name));
9737 clib_memcpy (mp->next_name, next, vec_len (next));
9738 vec_free (name);
9739 vec_free (next);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009740
Dave Barach72d72232016-08-04 10:15:08 -04009741 S;
9742 W;
9743 /* NOTREACHED */
9744 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009745}
9746
Dave Barach72d72232016-08-04 10:15:08 -04009747static int
9748api_l2tpv3_create_tunnel (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009749{
Dave Barach72d72232016-08-04 10:15:08 -04009750 unformat_input_t *i = vam->input;
9751 ip6_address_t client_address, our_address;
9752 int client_address_set = 0;
9753 int our_address_set = 0;
9754 u32 local_session_id = 0;
9755 u32 remote_session_id = 0;
9756 u64 local_cookie = 0;
9757 u64 remote_cookie = 0;
9758 u8 l2_sublayer_present = 0;
9759 vl_api_l2tpv3_create_tunnel_t *mp;
9760 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009761
Dave Barach72d72232016-08-04 10:15:08 -04009762 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9763 {
9764 if (unformat (i, "client_address %U", unformat_ip6_address,
9765 &client_address))
9766 client_address_set = 1;
9767 else if (unformat (i, "our_address %U", unformat_ip6_address,
9768 &our_address))
9769 our_address_set = 1;
9770 else if (unformat (i, "local_session_id %d", &local_session_id))
9771 ;
9772 else if (unformat (i, "remote_session_id %d", &remote_session_id))
9773 ;
9774 else if (unformat (i, "local_cookie %lld", &local_cookie))
9775 ;
9776 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
9777 ;
9778 else if (unformat (i, "l2-sublayer-present"))
9779 l2_sublayer_present = 1;
9780 else
9781 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009782 }
9783
Dave Barach72d72232016-08-04 10:15:08 -04009784 if (client_address_set == 0)
9785 {
9786 errmsg ("client_address required\n");
9787 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009788 }
9789
Dave Barach72d72232016-08-04 10:15:08 -04009790 if (our_address_set == 0)
9791 {
9792 errmsg ("our_address required\n");
9793 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009794 }
9795
Dave Barach72d72232016-08-04 10:15:08 -04009796 M (L2TPV3_CREATE_TUNNEL, l2tpv3_create_tunnel);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009797
Dave Barach72d72232016-08-04 10:15:08 -04009798 clib_memcpy (mp->client_address, client_address.as_u8,
9799 sizeof (mp->client_address));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009800
Dave Barach72d72232016-08-04 10:15:08 -04009801 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009802
Dave Barach72d72232016-08-04 10:15:08 -04009803 mp->local_session_id = ntohl (local_session_id);
9804 mp->remote_session_id = ntohl (remote_session_id);
9805 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
9806 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
9807 mp->l2_sublayer_present = l2_sublayer_present;
9808 mp->is_ipv6 = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009809
Dave Barach72d72232016-08-04 10:15:08 -04009810 S;
9811 W;
9812 /* NOTREACHED */
9813 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009814}
9815
Dave Barach72d72232016-08-04 10:15:08 -04009816static int
9817api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009818{
Dave Barach72d72232016-08-04 10:15:08 -04009819 unformat_input_t *i = vam->input;
9820 u32 sw_if_index;
9821 u8 sw_if_index_set = 0;
9822 u64 new_local_cookie = 0;
9823 u64 new_remote_cookie = 0;
9824 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
9825 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009826
Dave Barach72d72232016-08-04 10:15:08 -04009827 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9828 {
9829 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9830 sw_if_index_set = 1;
9831 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9832 sw_if_index_set = 1;
9833 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
9834 ;
9835 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
9836 ;
9837 else
9838 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009839 }
9840
Dave Barach72d72232016-08-04 10:15:08 -04009841 if (sw_if_index_set == 0)
9842 {
9843 errmsg ("missing interface name or sw_if_index\n");
9844 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009845 }
9846
Dave Barach72d72232016-08-04 10:15:08 -04009847 M (L2TPV3_SET_TUNNEL_COOKIES, l2tpv3_set_tunnel_cookies);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009848
Dave Barach72d72232016-08-04 10:15:08 -04009849 mp->sw_if_index = ntohl (sw_if_index);
9850 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
9851 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009852
Dave Barach72d72232016-08-04 10:15:08 -04009853 S;
9854 W;
9855 /* NOTREACHED */
9856 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009857}
9858
Dave Barach72d72232016-08-04 10:15:08 -04009859static int
9860api_l2tpv3_interface_enable_disable (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009861{
Dave Barach72d72232016-08-04 10:15:08 -04009862 unformat_input_t *i = vam->input;
9863 vl_api_l2tpv3_interface_enable_disable_t *mp;
9864 f64 timeout;
9865 u32 sw_if_index;
9866 u8 sw_if_index_set = 0;
9867 u8 enable_disable = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009868
Dave Barach72d72232016-08-04 10:15:08 -04009869 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9870 {
9871 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
9872 sw_if_index_set = 1;
9873 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9874 sw_if_index_set = 1;
9875 else if (unformat (i, "enable"))
9876 enable_disable = 1;
9877 else if (unformat (i, "disable"))
9878 enable_disable = 0;
9879 else
9880 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009881 }
9882
Dave Barach72d72232016-08-04 10:15:08 -04009883 if (sw_if_index_set == 0)
9884 {
9885 errmsg ("missing interface name or sw_if_index\n");
9886 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009887 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009888
Dave Barach72d72232016-08-04 10:15:08 -04009889 M (L2TPV3_INTERFACE_ENABLE_DISABLE, l2tpv3_interface_enable_disable);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009890
Dave Barach72d72232016-08-04 10:15:08 -04009891 mp->sw_if_index = ntohl (sw_if_index);
9892 mp->enable_disable = enable_disable;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009893
Dave Barach72d72232016-08-04 10:15:08 -04009894 S;
9895 W;
9896 /* NOTREACHED */
9897 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009898}
9899
Dave Barach72d72232016-08-04 10:15:08 -04009900static int
9901api_l2tpv3_set_lookup_key (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009902{
Dave Barach72d72232016-08-04 10:15:08 -04009903 unformat_input_t *i = vam->input;
9904 vl_api_l2tpv3_set_lookup_key_t *mp;
9905 f64 timeout;
9906 u8 key = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009907
Dave Barach72d72232016-08-04 10:15:08 -04009908 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9909 {
9910 if (unformat (i, "lookup_v6_src"))
9911 key = L2T_LOOKUP_SRC_ADDRESS;
9912 else if (unformat (i, "lookup_v6_dst"))
9913 key = L2T_LOOKUP_DST_ADDRESS;
9914 else if (unformat (i, "lookup_session_id"))
9915 key = L2T_LOOKUP_SESSION_ID;
9916 else
9917 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009918 }
9919
Dave Barach72d72232016-08-04 10:15:08 -04009920 if (key == (u8) ~ 0)
9921 {
9922 errmsg ("l2tp session lookup key unset\n");
9923 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009924 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +08009925
Dave Barach72d72232016-08-04 10:15:08 -04009926 M (L2TPV3_SET_LOOKUP_KEY, l2tpv3_set_lookup_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009927
Dave Barach72d72232016-08-04 10:15:08 -04009928 mp->key = key;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009929
Dave Barach72d72232016-08-04 10:15:08 -04009930 S;
9931 W;
9932 /* NOTREACHED */
9933 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009934}
9935
9936static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -04009937 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009938{
Dave Barach72d72232016-08-04 10:15:08 -04009939 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009940
Dave Barach72d72232016-08-04 10:15:08 -04009941 fformat (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)\n",
9942 format_ip6_address, mp->our_address,
9943 format_ip6_address, mp->client_address,
9944 clib_net_to_host_u32 (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009945
Dave Barach72d72232016-08-04 10:15:08 -04009946 fformat (vam->ofp,
9947 " local cookies %016llx %016llx remote cookie %016llx\n",
9948 clib_net_to_host_u64 (mp->local_cookie[0]),
9949 clib_net_to_host_u64 (mp->local_cookie[1]),
9950 clib_net_to_host_u64 (mp->remote_cookie));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009951
Dave Barach72d72232016-08-04 10:15:08 -04009952 fformat (vam->ofp, " local session-id %d remote session-id %d\n",
9953 clib_net_to_host_u32 (mp->local_session_id),
9954 clib_net_to_host_u32 (mp->remote_session_id));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009955
Dave Barach72d72232016-08-04 10:15:08 -04009956 fformat (vam->ofp, " l2 specific sublayer %s\n\n",
9957 mp->l2_sublayer_present ? "preset" : "absent");
Ed Warnickecb9cada2015-12-08 15:45:58 -07009958
9959}
9960
9961static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -04009962 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -07009963{
Dave Barach72d72232016-08-04 10:15:08 -04009964 vat_main_t *vam = &vat_main;
9965 vat_json_node_t *node = NULL;
9966 struct in6_addr addr;
Ed Warnickecb9cada2015-12-08 15:45:58 -07009967
Dave Barach72d72232016-08-04 10:15:08 -04009968 if (VAT_JSON_ARRAY != vam->json_tree.type)
9969 {
9970 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9971 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009972 }
Dave Barach72d72232016-08-04 10:15:08 -04009973 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009974
Dave Barach72d72232016-08-04 10:15:08 -04009975 vat_json_init_object (node);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009976
Dave Barach72d72232016-08-04 10:15:08 -04009977 clib_memcpy (&addr, mp->our_address, sizeof (addr));
9978 vat_json_object_add_ip6 (node, "our_address", addr);
9979 clib_memcpy (&addr, mp->client_address, sizeof (addr));
9980 vat_json_object_add_ip6 (node, "client_address", addr);
Ed Warnickecb9cada2015-12-08 15:45:58 -07009981
Dave Barach72d72232016-08-04 10:15:08 -04009982 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
9983 vat_json_init_array (lc);
9984 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
9985 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
9986 vat_json_object_add_uint (node, "remote_cookie",
9987 clib_net_to_host_u64 (mp->remote_cookie));
Ed Warnickecb9cada2015-12-08 15:45:58 -07009988
Dave Barach72d72232016-08-04 10:15:08 -04009989 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
9990 vat_json_object_add_uint (node, "local_session_id",
9991 clib_net_to_host_u32 (mp->local_session_id));
9992 vat_json_object_add_uint (node, "remote_session_id",
9993 clib_net_to_host_u32 (mp->remote_session_id));
9994 vat_json_object_add_string_copy (node, "l2_sublayer",
9995 mp->l2_sublayer_present ? (u8 *) "present"
9996 : (u8 *) "absent");
Ed Warnickecb9cada2015-12-08 15:45:58 -07009997}
9998
Dave Barach72d72232016-08-04 10:15:08 -04009999static int
10000api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010001{
Dave Barach72d72232016-08-04 10:15:08 -040010002 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
10003 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010004
Dave Barach72d72232016-08-04 10:15:08 -040010005 /* Get list of l2tpv3-tunnel interfaces */
10006 M (SW_IF_L2TPV3_TUNNEL_DUMP, sw_if_l2tpv3_tunnel_dump);
10007 S;
10008
10009 /* Use a control ping for synchronization */
10010 {
10011 vl_api_control_ping_t *mp;
10012 M (CONTROL_PING, control_ping);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010013 S;
Dave Barach72d72232016-08-04 10:15:08 -040010014 }
10015 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010016}
10017
10018
10019static void vl_api_sw_interface_tap_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040010020 (vl_api_sw_interface_tap_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010021{
Dave Barach72d72232016-08-04 10:15:08 -040010022 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010023
Dave Barach72d72232016-08-04 10:15:08 -040010024 fformat (vam->ofp, "%-16s %d\n",
10025 mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index));
Ed Warnickecb9cada2015-12-08 15:45:58 -070010026}
10027
10028static void vl_api_sw_interface_tap_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040010029 (vl_api_sw_interface_tap_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010030{
Dave Barach72d72232016-08-04 10:15:08 -040010031 vat_main_t *vam = &vat_main;
10032 vat_json_node_t *node = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010033
Dave Barach72d72232016-08-04 10:15:08 -040010034 if (VAT_JSON_ARRAY != vam->json_tree.type)
10035 {
10036 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10037 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010038 }
Dave Barach72d72232016-08-04 10:15:08 -040010039 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010040
Dave Barach72d72232016-08-04 10:15:08 -040010041 vat_json_init_object (node);
10042 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10043 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010044}
10045
Dave Barach72d72232016-08-04 10:15:08 -040010046static int
10047api_sw_interface_tap_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010048{
Dave Barach72d72232016-08-04 10:15:08 -040010049 vl_api_sw_interface_tap_dump_t *mp;
10050 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010051
Dave Barach72d72232016-08-04 10:15:08 -040010052 fformat (vam->ofp, "\n%-16s %s\n", "dev_name", "sw_if_index");
10053 /* Get list of tap interfaces */
10054 M (SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump);
10055 S;
10056
10057 /* Use a control ping for synchronization */
10058 {
10059 vl_api_control_ping_t *mp;
10060 M (CONTROL_PING, control_ping);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010061 S;
Dave Barach72d72232016-08-04 10:15:08 -040010062 }
10063 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010064}
10065
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080010066static uword unformat_vxlan_decap_next
Dave Barach72d72232016-08-04 10:15:08 -040010067 (unformat_input_t * input, va_list * args)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010068{
Dave Barach72d72232016-08-04 10:15:08 -040010069 u32 *result = va_arg (*args, u32 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010070 u32 tmp;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080010071
Ed Warnickecb9cada2015-12-08 15:45:58 -070010072 if (unformat (input, "drop"))
10073 *result = VXLAN_INPUT_NEXT_DROP;
10074 else if (unformat (input, "ip4"))
10075 *result = VXLAN_INPUT_NEXT_IP4_INPUT;
10076 else if (unformat (input, "ip6"))
10077 *result = VXLAN_INPUT_NEXT_IP6_INPUT;
10078 else if (unformat (input, "l2"))
10079 *result = VXLAN_INPUT_NEXT_L2_INPUT;
10080 else if (unformat (input, "%d", &tmp))
10081 *result = tmp;
10082 else
10083 return 0;
10084 return 1;
10085}
10086
Dave Barach72d72232016-08-04 10:15:08 -040010087static int
10088api_vxlan_add_del_tunnel (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010089{
Dave Barach72d72232016-08-04 10:15:08 -040010090 unformat_input_t *line_input = vam->input;
10091 vl_api_vxlan_add_del_tunnel_t *mp;
10092 f64 timeout;
10093 ip4_address_t src4, dst4;
10094 ip6_address_t src6, dst6;
10095 u8 is_add = 1;
10096 u8 ipv4_set = 0, ipv6_set = 0;
10097 u8 src_set = 0;
10098 u8 dst_set = 0;
10099 u32 encap_vrf_id = 0;
10100 u32 decap_next_index = ~0;
10101 u32 vni = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010102
Dave Barach72d72232016-08-04 10:15:08 -040010103 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10104 {
10105 if (unformat (line_input, "del"))
10106 is_add = 0;
10107 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10108 {
10109 ipv4_set = 1;
10110 src_set = 1;
10111 }
10112 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10113 {
10114 ipv4_set = 1;
10115 dst_set = 1;
10116 }
10117 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
10118 {
10119 ipv6_set = 1;
10120 src_set = 1;
10121 }
10122 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
10123 {
10124 ipv6_set = 1;
10125 dst_set = 1;
10126 }
10127 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10128 ;
10129 else if (unformat (line_input, "decap-next %U",
10130 unformat_vxlan_decap_next, &decap_next_index))
10131 ;
10132 else if (unformat (line_input, "vni %d", &vni))
10133 ;
10134 else
10135 {
10136 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10137 return -99;
10138 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070010139 }
10140
Dave Barach72d72232016-08-04 10:15:08 -040010141 if (src_set == 0)
10142 {
10143 errmsg ("tunnel src address not specified\n");
10144 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010145 }
Dave Barach72d72232016-08-04 10:15:08 -040010146 if (dst_set == 0)
10147 {
10148 errmsg ("tunnel dst address not specified\n");
10149 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010150 }
10151
Dave Barach72d72232016-08-04 10:15:08 -040010152 if (ipv4_set && ipv6_set)
10153 {
10154 errmsg ("both IPv4 and IPv6 addresses specified");
10155 return -99;
Chris Luke99cb3352016-04-26 10:49:53 -040010156 }
10157
Dave Barach72d72232016-08-04 10:15:08 -040010158 if ((vni == 0) || (vni >> 24))
10159 {
10160 errmsg ("vni not specified or out of range\n");
10161 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010162 }
10163
Dave Barach72d72232016-08-04 10:15:08 -040010164 M (VXLAN_ADD_DEL_TUNNEL, vxlan_add_del_tunnel);
Chris Luke99cb3352016-04-26 10:49:53 -040010165
Dave Barach72d72232016-08-04 10:15:08 -040010166 if (ipv6_set)
10167 {
10168 clib_memcpy (&mp->src_address, &src6, sizeof (src6));
10169 clib_memcpy (&mp->dst_address, &dst6, sizeof (dst6));
Chris Luke99cb3352016-04-26 10:49:53 -040010170 }
Dave Barach72d72232016-08-04 10:15:08 -040010171 else
10172 {
10173 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10174 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10175 }
10176 mp->encap_vrf_id = ntohl (encap_vrf_id);
10177 mp->decap_next_index = ntohl (decap_next_index);
10178 mp->vni = ntohl (vni);
10179 mp->is_add = is_add;
10180 mp->is_ipv6 = ipv6_set;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010181
Dave Barach72d72232016-08-04 10:15:08 -040010182 S;
10183 W;
10184 /* NOTREACHED */
10185 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010186}
10187
Dave Wallace60231f32015-12-17 21:04:30 -050010188static void vl_api_vxlan_tunnel_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040010189 (vl_api_vxlan_tunnel_details_t * mp)
Dave Wallace60231f32015-12-17 21:04:30 -050010190{
Dave Barach72d72232016-08-04 10:15:08 -040010191 vat_main_t *vam = &vat_main;
Dave Wallace60231f32015-12-17 21:04:30 -050010192
Dave Barach72d72232016-08-04 10:15:08 -040010193 fformat (vam->ofp, "%11d%24U%24U%14d%18d%13d\n",
10194 ntohl (mp->sw_if_index),
10195 format_ip46_address, &(mp->src_address[0]),
10196 IP46_TYPE_ANY,
10197 format_ip46_address, &(mp->dst_address[0]),
10198 IP46_TYPE_ANY,
10199 ntohl (mp->encap_vrf_id),
10200 ntohl (mp->decap_next_index), ntohl (mp->vni));
Dave Wallace60231f32015-12-17 21:04:30 -050010201}
10202
10203static void vl_api_vxlan_tunnel_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040010204 (vl_api_vxlan_tunnel_details_t * mp)
Dave Wallace60231f32015-12-17 21:04:30 -050010205{
Dave Barach72d72232016-08-04 10:15:08 -040010206 vat_main_t *vam = &vat_main;
10207 vat_json_node_t *node = NULL;
10208 struct in_addr ip4;
10209 struct in6_addr ip6;
Dave Wallace60231f32015-12-17 21:04:30 -050010210
Dave Barach72d72232016-08-04 10:15:08 -040010211 if (VAT_JSON_ARRAY != vam->json_tree.type)
Dave Wallace60231f32015-12-17 21:04:30 -050010212 {
Dave Barach72d72232016-08-04 10:15:08 -040010213 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10214 vat_json_init_array (&vam->json_tree);
Dave Wallace60231f32015-12-17 21:04:30 -050010215 }
Dave Barach72d72232016-08-04 10:15:08 -040010216 node = vat_json_array_add (&vam->json_tree);
10217
10218 vat_json_init_object (node);
10219 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10220 if (mp->is_ipv6)
10221 {
10222 clib_memcpy (&ip6, &(mp->src_address[0]), sizeof (ip6));
10223 vat_json_object_add_ip6 (node, "src_address", ip6);
10224 clib_memcpy (&ip6, &(mp->dst_address[0]), sizeof (ip6));
10225 vat_json_object_add_ip6 (node, "dst_address", ip6);
10226 }
10227 else
10228 {
10229 clib_memcpy (&ip4, &(mp->src_address[0]), sizeof (ip4));
10230 vat_json_object_add_ip4 (node, "src_address", ip4);
10231 clib_memcpy (&ip4, &(mp->dst_address[0]), sizeof (ip4));
10232 vat_json_object_add_ip4 (node, "dst_address", ip4);
10233 }
10234 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10235 vat_json_object_add_uint (node, "decap_next_index",
10236 ntohl (mp->decap_next_index));
10237 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10238 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
Dave Wallace60231f32015-12-17 21:04:30 -050010239}
10240
Dave Barach72d72232016-08-04 10:15:08 -040010241static int
10242api_vxlan_tunnel_dump (vat_main_t * vam)
Chris Luke27fe48f2016-04-28 13:44:38 -040010243{
Dave Barach72d72232016-08-04 10:15:08 -040010244 unformat_input_t *i = vam->input;
10245 vl_api_vxlan_tunnel_dump_t *mp;
10246 f64 timeout;
10247 u32 sw_if_index;
10248 u8 sw_if_index_set = 0;
Chris Luke27fe48f2016-04-28 13:44:38 -040010249
Dave Barach72d72232016-08-04 10:15:08 -040010250 /* Parse args required to build the message */
10251 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10252 {
10253 if (unformat (i, "sw_if_index %d", &sw_if_index))
10254 sw_if_index_set = 1;
10255 else
10256 break;
Chris Luke27fe48f2016-04-28 13:44:38 -040010257 }
10258
Dave Barach72d72232016-08-04 10:15:08 -040010259 if (sw_if_index_set == 0)
10260 {
10261 sw_if_index = ~0;
Chris Luke27fe48f2016-04-28 13:44:38 -040010262 }
Dave Barach72d72232016-08-04 10:15:08 -040010263
10264 if (!vam->json_output)
10265 {
10266 fformat (vam->ofp, "%11s%24s%24s%14s%18s%13s\n",
10267 "sw_if_index", "src_address", "dst_address",
10268 "encap_vrf_id", "decap_next_index", "vni");
10269 }
10270
10271 /* Get list of vxlan-tunnel interfaces */
10272 M (VXLAN_TUNNEL_DUMP, vxlan_tunnel_dump);
10273
10274 mp->sw_if_index = htonl (sw_if_index);
10275
10276 S;
10277
10278 /* Use a control ping for synchronization */
10279 {
10280 vl_api_control_ping_t *mp;
10281 M (CONTROL_PING, control_ping);
10282 S;
10283 }
10284 W;
10285}
10286
10287static int
10288api_gre_add_del_tunnel (vat_main_t * vam)
10289{
10290 unformat_input_t *line_input = vam->input;
10291 vl_api_gre_add_del_tunnel_t *mp;
10292 f64 timeout;
10293 ip4_address_t src4, dst4;
10294 u8 is_add = 1;
David Hothama8cd3092016-09-19 09:55:07 -070010295 u8 teb = 0;
Dave Barach72d72232016-08-04 10:15:08 -040010296 u8 src_set = 0;
10297 u8 dst_set = 0;
10298 u32 outer_fib_id = 0;
10299
10300 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10301 {
10302 if (unformat (line_input, "del"))
10303 is_add = 0;
10304 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
10305 src_set = 1;
10306 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
10307 dst_set = 1;
10308 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
10309 ;
David Hothama8cd3092016-09-19 09:55:07 -070010310 else if (unformat (line_input, "teb"))
10311 teb = 1;
Dave Barach72d72232016-08-04 10:15:08 -040010312 else
10313 {
10314 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10315 return -99;
10316 }
10317 }
10318
10319 if (src_set == 0)
10320 {
10321 errmsg ("tunnel src address not specified\n");
10322 return -99;
10323 }
10324 if (dst_set == 0)
10325 {
10326 errmsg ("tunnel dst address not specified\n");
10327 return -99;
Chris Luke27fe48f2016-04-28 13:44:38 -040010328 }
10329
10330
Dave Barach72d72232016-08-04 10:15:08 -040010331 M (GRE_ADD_DEL_TUNNEL, gre_add_del_tunnel);
Chris Luke27fe48f2016-04-28 13:44:38 -040010332
Dave Barach72d72232016-08-04 10:15:08 -040010333 clib_memcpy (&mp->src_address, &src4, sizeof (src4));
10334 clib_memcpy (&mp->dst_address, &dst4, sizeof (dst4));
10335 mp->outer_fib_id = ntohl (outer_fib_id);
10336 mp->is_add = is_add;
David Hothama8cd3092016-09-19 09:55:07 -070010337 mp->teb = teb;
Chris Luke27fe48f2016-04-28 13:44:38 -040010338
Dave Barach72d72232016-08-04 10:15:08 -040010339 S;
10340 W;
10341 /* NOTREACHED */
10342 return 0;
Chris Luke27fe48f2016-04-28 13:44:38 -040010343}
10344
10345static void vl_api_gre_tunnel_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040010346 (vl_api_gre_tunnel_details_t * mp)
Chris Luke27fe48f2016-04-28 13:44:38 -040010347{
Dave Barach72d72232016-08-04 10:15:08 -040010348 vat_main_t *vam = &vat_main;
Chris Luke27fe48f2016-04-28 13:44:38 -040010349
David Hothama8cd3092016-09-19 09:55:07 -070010350 fformat (vam->ofp, "%11d%15U%15U%6d%14d\n",
Dave Barach72d72232016-08-04 10:15:08 -040010351 ntohl (mp->sw_if_index),
10352 format_ip4_address, &mp->src_address,
David Hothama8cd3092016-09-19 09:55:07 -070010353 format_ip4_address, &mp->dst_address,
10354 mp->teb, ntohl (mp->outer_fib_id));
Chris Luke27fe48f2016-04-28 13:44:38 -040010355}
10356
10357static void vl_api_gre_tunnel_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040010358 (vl_api_gre_tunnel_details_t * mp)
Chris Luke27fe48f2016-04-28 13:44:38 -040010359{
Dave Barach72d72232016-08-04 10:15:08 -040010360 vat_main_t *vam = &vat_main;
10361 vat_json_node_t *node = NULL;
10362 struct in_addr ip4;
Chris Luke27fe48f2016-04-28 13:44:38 -040010363
Dave Barach72d72232016-08-04 10:15:08 -040010364 if (VAT_JSON_ARRAY != vam->json_tree.type)
Chris Luke27fe48f2016-04-28 13:44:38 -040010365 {
Dave Barach72d72232016-08-04 10:15:08 -040010366 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10367 vat_json_init_array (&vam->json_tree);
Chris Luke27fe48f2016-04-28 13:44:38 -040010368 }
Dave Barach72d72232016-08-04 10:15:08 -040010369 node = vat_json_array_add (&vam->json_tree);
10370
10371 vat_json_init_object (node);
10372 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10373 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
10374 vat_json_object_add_ip4 (node, "src_address", ip4);
10375 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
10376 vat_json_object_add_ip4 (node, "dst_address", ip4);
David Hothama8cd3092016-09-19 09:55:07 -070010377 vat_json_object_add_uint (node, "teb", mp->teb);
Dave Barach72d72232016-08-04 10:15:08 -040010378 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
Chris Luke27fe48f2016-04-28 13:44:38 -040010379}
10380
Dave Barach72d72232016-08-04 10:15:08 -040010381static int
10382api_gre_tunnel_dump (vat_main_t * vam)
10383{
10384 unformat_input_t *i = vam->input;
10385 vl_api_gre_tunnel_dump_t *mp;
10386 f64 timeout;
10387 u32 sw_if_index;
10388 u8 sw_if_index_set = 0;
10389
10390 /* Parse args required to build the message */
10391 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10392 {
10393 if (unformat (i, "sw_if_index %d", &sw_if_index))
10394 sw_if_index_set = 1;
10395 else
10396 break;
10397 }
10398
10399 if (sw_if_index_set == 0)
10400 {
10401 sw_if_index = ~0;
10402 }
10403
10404 if (!vam->json_output)
10405 {
David Hothama8cd3092016-09-19 09:55:07 -070010406 fformat (vam->ofp, "%11s%15s%15s%6s%14s\n",
10407 "sw_if_index", "src_address", "dst_address", "teb",
10408 "outer_fib_id");
Dave Barach72d72232016-08-04 10:15:08 -040010409 }
10410
10411 /* Get list of gre-tunnel interfaces */
10412 M (GRE_TUNNEL_DUMP, gre_tunnel_dump);
10413
10414 mp->sw_if_index = htonl (sw_if_index);
10415
10416 S;
10417
10418 /* Use a control ping for synchronization */
10419 {
10420 vl_api_control_ping_t *mp;
10421 M (CONTROL_PING, control_ping);
10422 S;
10423 }
10424 W;
10425}
10426
10427static int
10428api_l2_fib_clear_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010429{
10430// unformat_input_t * i = vam->input;
Dave Barach72d72232016-08-04 10:15:08 -040010431 vl_api_l2_fib_clear_table_t *mp;
10432 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010433
Dave Barach72d72232016-08-04 10:15:08 -040010434 M (L2_FIB_CLEAR_TABLE, l2_fib_clear_table);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010435
Dave Barach72d72232016-08-04 10:15:08 -040010436 S;
10437 W;
10438 /* NOTREACHED */
10439 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010440}
10441
Dave Barach72d72232016-08-04 10:15:08 -040010442static int
10443api_l2_interface_efp_filter (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010444{
Dave Barach72d72232016-08-04 10:15:08 -040010445 unformat_input_t *i = vam->input;
10446 vl_api_l2_interface_efp_filter_t *mp;
10447 f64 timeout;
10448 u32 sw_if_index;
10449 u8 enable = 1;
10450 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010451
Dave Barach72d72232016-08-04 10:15:08 -040010452 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10453 {
10454 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10455 sw_if_index_set = 1;
10456 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10457 sw_if_index_set = 1;
10458 else if (unformat (i, "enable"))
10459 enable = 1;
10460 else if (unformat (i, "disable"))
10461 enable = 0;
10462 else
10463 {
10464 clib_warning ("parse error '%U'", format_unformat_error, i);
10465 return -99;
10466 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070010467 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080010468
Dave Barach72d72232016-08-04 10:15:08 -040010469 if (sw_if_index_set == 0)
10470 {
10471 errmsg ("missing sw_if_index\n");
10472 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010473 }
10474
Dave Barach72d72232016-08-04 10:15:08 -040010475 M (L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010476
Dave Barach72d72232016-08-04 10:15:08 -040010477 mp->sw_if_index = ntohl (sw_if_index);
10478 mp->enable_disable = enable;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010479
Dave Barach72d72232016-08-04 10:15:08 -040010480 S;
10481 W;
10482 /* NOTREACHED */
10483 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010484}
10485
10486#define foreach_vtr_op \
10487_("disable", L2_VTR_DISABLED) \
10488_("push-1", L2_VTR_PUSH_1) \
10489_("push-2", L2_VTR_PUSH_2) \
10490_("pop-1", L2_VTR_POP_1) \
10491_("pop-2", L2_VTR_POP_2) \
10492_("translate-1-1", L2_VTR_TRANSLATE_1_1) \
10493_("translate-1-2", L2_VTR_TRANSLATE_1_2) \
10494_("translate-2-1", L2_VTR_TRANSLATE_2_1) \
10495_("translate-2-2", L2_VTR_TRANSLATE_2_2)
10496
Dave Barach72d72232016-08-04 10:15:08 -040010497static int
10498api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010499{
Dave Barach72d72232016-08-04 10:15:08 -040010500 unformat_input_t *i = vam->input;
10501 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
10502 f64 timeout;
10503 u32 sw_if_index;
10504 u8 sw_if_index_set = 0;
10505 u8 vtr_op_set = 0;
10506 u32 vtr_op = 0;
10507 u32 push_dot1q = 1;
10508 u32 tag1 = ~0;
10509 u32 tag2 = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010510
Dave Barach72d72232016-08-04 10:15:08 -040010511 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10512 {
10513 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
10514 sw_if_index_set = 1;
10515 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10516 sw_if_index_set = 1;
10517 else if (unformat (i, "vtr_op %d", &vtr_op))
10518 vtr_op_set = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010519#define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
Dave Barach72d72232016-08-04 10:15:08 -040010520 foreach_vtr_op
Ed Warnickecb9cada2015-12-08 15:45:58 -070010521#undef _
Dave Barach72d72232016-08-04 10:15:08 -040010522 else if (unformat (i, "push_dot1q %d", &push_dot1q))
10523 ;
10524 else if (unformat (i, "tag1 %d", &tag1))
10525 ;
10526 else if (unformat (i, "tag2 %d", &tag2))
10527 ;
10528 else
10529 {
10530 clib_warning ("parse error '%U'", format_unformat_error, i);
10531 return -99;
10532 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070010533 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080010534
Dave Barach72d72232016-08-04 10:15:08 -040010535 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
10536 {
10537 errmsg ("missing vtr operation or sw_if_index\n");
10538 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010539 }
10540
Dave Barach72d72232016-08-04 10:15:08 -040010541 M (L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite)
10542 mp->sw_if_index = ntohl (sw_if_index);
10543 mp->vtr_op = ntohl (vtr_op);
10544 mp->push_dot1q = ntohl (push_dot1q);
10545 mp->tag1 = ntohl (tag1);
10546 mp->tag2 = ntohl (tag2);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010547
Dave Barach72d72232016-08-04 10:15:08 -040010548 S;
10549 W;
10550 /* NOTREACHED */
10551 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010552}
10553
Dave Barach72d72232016-08-04 10:15:08 -040010554static int
10555api_create_vhost_user_if (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010556{
Dave Barach72d72232016-08-04 10:15:08 -040010557 unformat_input_t *i = vam->input;
10558 vl_api_create_vhost_user_if_t *mp;
10559 f64 timeout;
10560 u8 *file_name;
10561 u8 is_server = 0;
10562 u8 file_name_set = 0;
10563 u32 custom_dev_instance = ~0;
10564 u8 hwaddr[6];
10565 u8 use_custom_mac = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010566
Dave Barach72d72232016-08-04 10:15:08 -040010567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10568 {
10569 if (unformat (i, "socket %s", &file_name))
10570 {
10571 file_name_set = 1;
10572 }
10573 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10574 ;
Pierre Pfisteref65cb02016-02-19 13:52:44 +000010575 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
Dave Barach72d72232016-08-04 10:15:08 -040010576 use_custom_mac = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010577 else if (unformat (i, "server"))
Dave Barach72d72232016-08-04 10:15:08 -040010578 is_server = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010579 else
Dave Barach72d72232016-08-04 10:15:08 -040010580 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010581 }
10582
Dave Barach72d72232016-08-04 10:15:08 -040010583 if (file_name_set == 0)
10584 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010585 errmsg ("missing socket file name\n");
10586 return -99;
10587 }
10588
Dave Barach72d72232016-08-04 10:15:08 -040010589 if (vec_len (file_name) > 255)
10590 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010591 errmsg ("socket file name too long\n");
10592 return -99;
10593 }
Dave Barach72d72232016-08-04 10:15:08 -040010594 vec_add1 (file_name, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010595
Dave Barach72d72232016-08-04 10:15:08 -040010596 M (CREATE_VHOST_USER_IF, create_vhost_user_if);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010597
Dave Barach72d72232016-08-04 10:15:08 -040010598 mp->is_server = is_server;
10599 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10600 vec_free (file_name);
10601 if (custom_dev_instance != ~0)
10602 {
10603 mp->renumber = 1;
10604 mp->custom_dev_instance = ntohl (custom_dev_instance);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010605 }
Dave Barach72d72232016-08-04 10:15:08 -040010606 mp->use_custom_mac = use_custom_mac;
10607 clib_memcpy (mp->mac_address, hwaddr, 6);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010608
Dave Barach72d72232016-08-04 10:15:08 -040010609 S;
10610 W;
10611 /* NOTREACHED */
10612 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010613}
10614
Dave Barach72d72232016-08-04 10:15:08 -040010615static int
10616api_modify_vhost_user_if (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010617{
Dave Barach72d72232016-08-04 10:15:08 -040010618 unformat_input_t *i = vam->input;
10619 vl_api_modify_vhost_user_if_t *mp;
10620 f64 timeout;
10621 u8 *file_name;
10622 u8 is_server = 0;
10623 u8 file_name_set = 0;
10624 u32 custom_dev_instance = ~0;
10625 u8 sw_if_index_set = 0;
10626 u32 sw_if_index = (u32) ~ 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010627
Dave Barach72d72232016-08-04 10:15:08 -040010628 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10629 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010630 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
Dave Barach72d72232016-08-04 10:15:08 -040010631 sw_if_index_set = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010632 else if (unformat (i, "sw_if_index %d", &sw_if_index))
Dave Barach72d72232016-08-04 10:15:08 -040010633 sw_if_index_set = 1;
10634 else if (unformat (i, "socket %s", &file_name))
10635 {
10636 file_name_set = 1;
10637 }
10638 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
10639 ;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010640 else if (unformat (i, "server"))
Dave Barach72d72232016-08-04 10:15:08 -040010641 is_server = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010642 else
Dave Barach72d72232016-08-04 10:15:08 -040010643 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010644 }
10645
Dave Barach72d72232016-08-04 10:15:08 -040010646 if (sw_if_index_set == 0)
10647 {
10648 errmsg ("missing sw_if_index or interface name\n");
10649 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010650 }
10651
Dave Barach72d72232016-08-04 10:15:08 -040010652 if (file_name_set == 0)
10653 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010654 errmsg ("missing socket file name\n");
10655 return -99;
10656 }
10657
Dave Barach72d72232016-08-04 10:15:08 -040010658 if (vec_len (file_name) > 255)
10659 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010660 errmsg ("socket file name too long\n");
10661 return -99;
10662 }
Dave Barach72d72232016-08-04 10:15:08 -040010663 vec_add1 (file_name, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010664
Dave Barach72d72232016-08-04 10:15:08 -040010665 M (MODIFY_VHOST_USER_IF, modify_vhost_user_if);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010666
Dave Barach72d72232016-08-04 10:15:08 -040010667 mp->sw_if_index = ntohl (sw_if_index);
10668 mp->is_server = is_server;
10669 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
10670 vec_free (file_name);
10671 if (custom_dev_instance != ~0)
10672 {
10673 mp->renumber = 1;
10674 mp->custom_dev_instance = ntohl (custom_dev_instance);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010675 }
10676
Dave Barach72d72232016-08-04 10:15:08 -040010677 S;
10678 W;
10679 /* NOTREACHED */
10680 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010681}
10682
Dave Barach72d72232016-08-04 10:15:08 -040010683static int
10684api_delete_vhost_user_if (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010685{
Dave Barach72d72232016-08-04 10:15:08 -040010686 unformat_input_t *i = vam->input;
10687 vl_api_delete_vhost_user_if_t *mp;
10688 f64 timeout;
10689 u32 sw_if_index = ~0;
10690 u8 sw_if_index_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010691
Dave Barach72d72232016-08-04 10:15:08 -040010692 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10693 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070010694 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
Dave Barach72d72232016-08-04 10:15:08 -040010695 sw_if_index_set = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010696 else if (unformat (i, "sw_if_index %d", &sw_if_index))
Dave Barach72d72232016-08-04 10:15:08 -040010697 sw_if_index_set = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010698 else
Dave Barach72d72232016-08-04 10:15:08 -040010699 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010700 }
10701
Dave Barach72d72232016-08-04 10:15:08 -040010702 if (sw_if_index_set == 0)
10703 {
10704 errmsg ("missing sw_if_index or interface name\n");
10705 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010706 }
10707
10708
Dave Barach72d72232016-08-04 10:15:08 -040010709 M (DELETE_VHOST_USER_IF, delete_vhost_user_if);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010710
Dave Barach72d72232016-08-04 10:15:08 -040010711 mp->sw_if_index = ntohl (sw_if_index);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010712
Dave Barach72d72232016-08-04 10:15:08 -040010713 S;
10714 W;
10715 /* NOTREACHED */
10716 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010717}
10718
10719static void vl_api_sw_interface_vhost_user_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040010720 (vl_api_sw_interface_vhost_user_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010721{
Dave Barach72d72232016-08-04 10:15:08 -040010722 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010723
Dave Barach72d72232016-08-04 10:15:08 -040010724 fformat (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s\n",
10725 (char *) mp->interface_name,
10726 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
10727 clib_net_to_host_u64 (mp->features), mp->is_server,
10728 ntohl (mp->num_regions), (char *) mp->sock_filename);
10729 fformat (vam->ofp, " Status: '%s'\n", strerror (ntohl (mp->sock_errno)));
Ed Warnickecb9cada2015-12-08 15:45:58 -070010730}
10731
10732static void vl_api_sw_interface_vhost_user_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040010733 (vl_api_sw_interface_vhost_user_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010734{
Dave Barach72d72232016-08-04 10:15:08 -040010735 vat_main_t *vam = &vat_main;
10736 vat_json_node_t *node = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010737
Dave Barach72d72232016-08-04 10:15:08 -040010738 if (VAT_JSON_ARRAY != vam->json_tree.type)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010739 {
Dave Barach72d72232016-08-04 10:15:08 -040010740 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10741 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -070010742 }
Dave Barach72d72232016-08-04 10:15:08 -040010743 node = vat_json_array_add (&vam->json_tree);
10744
10745 vat_json_init_object (node);
10746 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10747 vat_json_object_add_string_copy (node, "interface_name",
10748 mp->interface_name);
10749 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
10750 ntohl (mp->virtio_net_hdr_sz));
10751 vat_json_object_add_uint (node, "features",
10752 clib_net_to_host_u64 (mp->features));
10753 vat_json_object_add_uint (node, "is_server", mp->is_server);
10754 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
10755 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
10756 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
Ed Warnickecb9cada2015-12-08 15:45:58 -070010757}
10758
Dave Barach72d72232016-08-04 10:15:08 -040010759static int
10760api_sw_interface_vhost_user_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010761{
Dave Barach72d72232016-08-04 10:15:08 -040010762 vl_api_sw_interface_vhost_user_dump_t *mp;
10763 f64 timeout;
10764 fformat (vam->ofp,
10765 "Interface name idx hdr_sz features server regions filename\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -070010766
Dave Barach72d72232016-08-04 10:15:08 -040010767 /* Get list of vhost-user interfaces */
10768 M (SW_INTERFACE_VHOST_USER_DUMP, sw_interface_vhost_user_dump);
10769 S;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010770
Dave Barach72d72232016-08-04 10:15:08 -040010771 /* Use a control ping for synchronization */
10772 {
10773 vl_api_control_ping_t *mp;
10774 M (CONTROL_PING, control_ping);
10775 S;
10776 }
10777 W;
10778}
10779
10780static int
10781api_show_version (vat_main_t * vam)
10782{
10783 vl_api_show_version_t *mp;
10784 f64 timeout;
10785
10786 M (SHOW_VERSION, show_version);
10787
10788 S;
10789 W;
10790 /* NOTREACHED */
10791 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010792}
10793
Ed Warnickecb9cada2015-12-08 15:45:58 -070010794
Dave Barach72d72232016-08-04 10:15:08 -040010795static int
10796api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010797{
Dave Barach72d72232016-08-04 10:15:08 -040010798 unformat_input_t *line_input = vam->input;
10799 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
10800 f64 timeout;
10801 ip4_address_t local4, remote4;
10802 ip6_address_t local6, remote6;
10803 u8 is_add = 1;
10804 u8 ipv4_set = 0, ipv6_set = 0;
10805 u8 local_set = 0;
10806 u8 remote_set = 0;
10807 u32 encap_vrf_id = 0;
10808 u32 decap_vrf_id = 0;
10809 u8 protocol = ~0;
10810 u32 vni;
10811 u8 vni_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010812
Dave Barach72d72232016-08-04 10:15:08 -040010813 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
10814 {
10815 if (unformat (line_input, "del"))
10816 is_add = 0;
10817 else if (unformat (line_input, "local %U",
10818 unformat_ip4_address, &local4))
10819 {
10820 local_set = 1;
10821 ipv4_set = 1;
10822 }
10823 else if (unformat (line_input, "remote %U",
10824 unformat_ip4_address, &remote4))
10825 {
10826 remote_set = 1;
10827 ipv4_set = 1;
10828 }
10829 else if (unformat (line_input, "local %U",
10830 unformat_ip6_address, &local6))
10831 {
10832 local_set = 1;
10833 ipv6_set = 1;
10834 }
10835 else if (unformat (line_input, "remote %U",
10836 unformat_ip6_address, &remote6))
10837 {
10838 remote_set = 1;
10839 ipv6_set = 1;
10840 }
10841 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
10842 ;
10843 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
10844 ;
10845 else if (unformat (line_input, "vni %d", &vni))
10846 vni_set = 1;
10847 else if (unformat (line_input, "next-ip4"))
10848 protocol = 1;
10849 else if (unformat (line_input, "next-ip6"))
10850 protocol = 2;
10851 else if (unformat (line_input, "next-ethernet"))
10852 protocol = 3;
10853 else if (unformat (line_input, "next-nsh"))
10854 protocol = 4;
10855 else
10856 {
10857 errmsg ("parse error '%U'\n", format_unformat_error, line_input);
10858 return -99;
10859 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070010860 }
10861
Dave Barach72d72232016-08-04 10:15:08 -040010862 if (local_set == 0)
10863 {
10864 errmsg ("tunnel local address not specified\n");
10865 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010866 }
Dave Barach72d72232016-08-04 10:15:08 -040010867 if (remote_set == 0)
10868 {
10869 errmsg ("tunnel remote address not specified\n");
10870 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010871 }
Dave Barach72d72232016-08-04 10:15:08 -040010872 if (ipv4_set && ipv6_set)
10873 {
10874 errmsg ("both IPv4 and IPv6 addresses specified");
10875 return -99;
Hongjun Nidf921cc2016-05-25 01:16:19 +080010876 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070010877
Dave Barach72d72232016-08-04 10:15:08 -040010878 if (vni_set == 0)
10879 {
10880 errmsg ("vni not specified\n");
10881 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010882 }
10883
Dave Barach72d72232016-08-04 10:15:08 -040010884 M (VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080010885
Hongjun Nidf921cc2016-05-25 01:16:19 +080010886
Dave Barach72d72232016-08-04 10:15:08 -040010887 if (ipv6_set)
10888 {
10889 clib_memcpy (&mp->local, &local6, sizeof (local6));
10890 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
10891 }
10892 else
10893 {
10894 clib_memcpy (&mp->local, &local4, sizeof (local4));
10895 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
Hongjun Nidf921cc2016-05-25 01:16:19 +080010896 }
10897
Dave Barach72d72232016-08-04 10:15:08 -040010898 mp->encap_vrf_id = ntohl (encap_vrf_id);
10899 mp->decap_vrf_id = ntohl (decap_vrf_id);
10900 mp->protocol = ntohl (protocol);
10901 mp->vni = ntohl (vni);
10902 mp->is_add = is_add;
10903 mp->is_ipv6 = ipv6_set;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010904
Dave Barach72d72232016-08-04 10:15:08 -040010905 S;
10906 W;
10907 /* NOTREACHED */
10908 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070010909}
10910
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010911static void vl_api_vxlan_gpe_tunnel_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040010912 (vl_api_vxlan_gpe_tunnel_details_t * mp)
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010913{
Dave Barach72d72232016-08-04 10:15:08 -040010914 vat_main_t *vam = &vat_main;
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010915
Dave Barach72d72232016-08-04 10:15:08 -040010916 fformat (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d\n",
10917 ntohl (mp->sw_if_index),
10918 format_ip46_address, &(mp->local[0]),
10919 format_ip46_address, &(mp->remote[0]),
10920 ntohl (mp->vni),
10921 ntohl (mp->protocol),
10922 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010923}
10924
10925static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040010926 (vl_api_vxlan_gpe_tunnel_details_t * mp)
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010927{
Dave Barach72d72232016-08-04 10:15:08 -040010928 vat_main_t *vam = &vat_main;
10929 vat_json_node_t *node = NULL;
10930 struct in_addr ip4;
10931 struct in6_addr ip6;
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010932
Dave Barach72d72232016-08-04 10:15:08 -040010933 if (VAT_JSON_ARRAY != vam->json_tree.type)
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010934 {
Dave Barach72d72232016-08-04 10:15:08 -040010935 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10936 vat_json_init_array (&vam->json_tree);
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010937 }
Dave Barach72d72232016-08-04 10:15:08 -040010938 node = vat_json_array_add (&vam->json_tree);
10939
10940 vat_json_init_object (node);
10941 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10942 if (mp->is_ipv6)
10943 {
10944 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
10945 vat_json_object_add_ip6 (node, "local", ip6);
10946 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
10947 vat_json_object_add_ip6 (node, "remote", ip6);
10948 }
10949 else
10950 {
10951 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
10952 vat_json_object_add_ip4 (node, "local", ip4);
10953 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
10954 vat_json_object_add_ip4 (node, "remote", ip4);
10955 }
10956 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
10957 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
10958 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
10959 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
10960 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080010961}
10962
Dave Barach72d72232016-08-04 10:15:08 -040010963static int
10964api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070010965{
Dave Barach72d72232016-08-04 10:15:08 -040010966 unformat_input_t *i = vam->input;
10967 vl_api_vxlan_gpe_tunnel_dump_t *mp;
10968 f64 timeout;
10969 u32 sw_if_index;
10970 u8 sw_if_index_set = 0;
10971
10972 /* Parse args required to build the message */
10973 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10974 {
10975 if (unformat (i, "sw_if_index %d", &sw_if_index))
10976 sw_if_index_set = 1;
10977 else
10978 break;
10979 }
10980
10981 if (sw_if_index_set == 0)
10982 {
10983 sw_if_index = ~0;
10984 }
10985
10986 if (!vam->json_output)
10987 {
10988 fformat (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s\n",
10989 "sw_if_index", "local", "remote", "vni",
10990 "protocol", "encap_vrf_id", "decap_vrf_id");
10991 }
10992
10993 /* Get list of vxlan-tunnel interfaces */
10994 M (VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump);
10995
10996 mp->sw_if_index = htonl (sw_if_index);
10997
10998 S;
10999
11000 /* Use a control ping for synchronization */
11001 {
11002 vl_api_control_ping_t *mp;
11003 M (CONTROL_PING, control_ping);
11004 S;
11005 }
11006 W;
11007}
11008
11009u8 *
11010format_l2_fib_mac_address (u8 * s, va_list * args)
11011{
11012 u8 *a = va_arg (*args, u8 *);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011013
11014 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
Dave Barach72d72232016-08-04 10:15:08 -040011015 a[2], a[3], a[4], a[5], a[6], a[7]);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011016}
11017
11018static void vl_api_l2_fib_table_entry_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040011019 (vl_api_l2_fib_table_entry_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011020{
Dave Barach72d72232016-08-04 10:15:08 -040011021 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011022
Dave Barach72d72232016-08-04 10:15:08 -040011023 fformat (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
11024 " %d %d %d\n",
11025 ntohl (mp->bd_id), format_l2_fib_mac_address, &mp->mac,
11026 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
11027 mp->bvi_mac);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011028}
11029
11030static void vl_api_l2_fib_table_entry_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040011031 (vl_api_l2_fib_table_entry_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011032{
Dave Barach72d72232016-08-04 10:15:08 -040011033 vat_main_t *vam = &vat_main;
11034 vat_json_node_t *node = NULL;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011035
Dave Barach72d72232016-08-04 10:15:08 -040011036 if (VAT_JSON_ARRAY != vam->json_tree.type)
11037 {
11038 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
11039 vat_json_init_array (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011040 }
Dave Barach72d72232016-08-04 10:15:08 -040011041 node = vat_json_array_add (&vam->json_tree);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011042
Dave Barach72d72232016-08-04 10:15:08 -040011043 vat_json_init_object (node);
11044 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
11045 vat_json_object_add_uint (node, "mac", clib_net_to_host_u64 (mp->mac));
11046 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
11047 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
11048 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
11049 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011050}
11051
Dave Barach72d72232016-08-04 10:15:08 -040011052static int
11053api_l2_fib_table_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011054{
Dave Barach72d72232016-08-04 10:15:08 -040011055 unformat_input_t *i = vam->input;
11056 vl_api_l2_fib_table_dump_t *mp;
11057 f64 timeout;
11058 u32 bd_id;
11059 u8 bd_id_set = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011060
Dave Barach72d72232016-08-04 10:15:08 -040011061 /* Parse args required to build the message */
11062 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011063 {
Dave Barach72d72232016-08-04 10:15:08 -040011064 if (unformat (i, "bd_id %d", &bd_id))
11065 bd_id_set = 1;
11066 else
11067 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011068 }
Dave Barach72d72232016-08-04 10:15:08 -040011069
11070 if (bd_id_set == 0)
11071 {
11072 errmsg ("missing bridge domain\n");
11073 return -99;
11074 }
11075
11076 fformat (vam->ofp,
11077 "BD-ID Mac Address sw-ndx Static Filter BVI\n");
11078
11079 /* Get list of l2 fib entries */
11080 M (L2_FIB_TABLE_DUMP, l2_fib_table_dump);
11081
11082 mp->bd_id = ntohl (bd_id);
11083 S;
11084
11085 /* Use a control ping for synchronization */
11086 {
11087 vl_api_control_ping_t *mp;
11088 M (CONTROL_PING, control_ping);
11089 S;
11090 }
11091 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011092}
11093
11094
11095static int
11096api_interface_name_renumber (vat_main_t * vam)
11097{
Dave Barach72d72232016-08-04 10:15:08 -040011098 unformat_input_t *line_input = vam->input;
11099 vl_api_interface_name_renumber_t *mp;
11100 u32 sw_if_index = ~0;
11101 f64 timeout;
11102 u32 new_show_dev_instance = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011103
Dave Barach72d72232016-08-04 10:15:08 -040011104 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11105 {
11106 if (unformat (line_input, "%U", unformat_sw_if_index, vam,
11107 &sw_if_index))
11108 ;
11109 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
11110 ;
11111 else if (unformat (line_input, "new_show_dev_instance %d",
11112 &new_show_dev_instance))
11113 ;
11114 else
11115 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011116 }
11117
Dave Barach72d72232016-08-04 10:15:08 -040011118 if (sw_if_index == ~0)
11119 {
11120 errmsg ("missing interface name or sw_if_index\n");
11121 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011122 }
11123
Dave Barach72d72232016-08-04 10:15:08 -040011124 if (new_show_dev_instance == ~0)
11125 {
11126 errmsg ("missing new_show_dev_instance\n");
11127 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011128 }
11129
Dave Barach72d72232016-08-04 10:15:08 -040011130 M (INTERFACE_NAME_RENUMBER, interface_name_renumber);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011131
Dave Barach72d72232016-08-04 10:15:08 -040011132 mp->sw_if_index = ntohl (sw_if_index);
11133 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011134
Dave Barach72d72232016-08-04 10:15:08 -040011135 S;
11136 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011137}
11138
11139static int
11140api_want_ip4_arp_events (vat_main_t * vam)
11141{
Dave Barach72d72232016-08-04 10:15:08 -040011142 unformat_input_t *line_input = vam->input;
11143 vl_api_want_ip4_arp_events_t *mp;
11144 f64 timeout;
11145 ip4_address_t address;
11146 int address_set = 0;
11147 u32 enable_disable = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011148
Dave Barach72d72232016-08-04 10:15:08 -040011149 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11150 {
11151 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
11152 address_set = 1;
11153 else if (unformat (line_input, "del"))
11154 enable_disable = 0;
11155 else
11156 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011157 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080011158
Dave Barach72d72232016-08-04 10:15:08 -040011159 if (address_set == 0)
11160 {
11161 errmsg ("missing addresses\n");
11162 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011163 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080011164
Dave Barach72d72232016-08-04 10:15:08 -040011165 M (WANT_IP4_ARP_EVENTS, want_ip4_arp_events);
11166 mp->enable_disable = enable_disable;
11167 mp->pid = getpid ();
11168 mp->address = address.as_u32;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011169
Dave Barach72d72232016-08-04 10:15:08 -040011170 S;
11171 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011172}
11173
Dave Barach72d72232016-08-04 10:15:08 -040011174static int
John Lo1edfba92016-08-27 01:11:57 -040011175api_want_ip6_nd_events (vat_main_t * vam)
11176{
11177 unformat_input_t *line_input = vam->input;
11178 vl_api_want_ip6_nd_events_t *mp;
11179 f64 timeout;
11180 ip6_address_t address;
11181 int address_set = 0;
11182 u32 enable_disable = 1;
11183
11184 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
11185 {
11186 if (unformat (line_input, "address %U", unformat_ip6_address, &address))
11187 address_set = 1;
11188 else if (unformat (line_input, "del"))
11189 enable_disable = 0;
11190 else
11191 break;
11192 }
11193
11194 if (address_set == 0)
11195 {
11196 errmsg ("missing addresses\n");
11197 return -99;
11198 }
11199
11200 M (WANT_IP6_ND_EVENTS, want_ip6_nd_events);
11201 mp->enable_disable = enable_disable;
11202 mp->pid = getpid ();
11203 clib_memcpy (mp->address, &address, sizeof (ip6_address_t));
11204
11205 S;
11206 W;
11207}
11208
11209static int
Dave Barach72d72232016-08-04 10:15:08 -040011210api_input_acl_set_interface (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011211{
Dave Barach72d72232016-08-04 10:15:08 -040011212 unformat_input_t *i = vam->input;
11213 vl_api_input_acl_set_interface_t *mp;
11214 f64 timeout;
11215 u32 sw_if_index;
11216 int sw_if_index_set;
11217 u32 ip4_table_index = ~0;
11218 u32 ip6_table_index = ~0;
11219 u32 l2_table_index = ~0;
11220 u8 is_add = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011221
Dave Barach72d72232016-08-04 10:15:08 -040011222 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11223 {
11224 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11225 sw_if_index_set = 1;
11226 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11227 sw_if_index_set = 1;
11228 else if (unformat (i, "del"))
11229 is_add = 0;
11230 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11231 ;
11232 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11233 ;
11234 else if (unformat (i, "l2-table %d", &l2_table_index))
11235 ;
11236 else
11237 {
11238 clib_warning ("parse error '%U'", format_unformat_error, i);
11239 return -99;
11240 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011241 }
11242
Dave Barach72d72232016-08-04 10:15:08 -040011243 if (sw_if_index_set == 0)
11244 {
11245 errmsg ("missing interface name or sw_if_index\n");
11246 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011247 }
11248
Dave Barach72d72232016-08-04 10:15:08 -040011249 M (INPUT_ACL_SET_INTERFACE, input_acl_set_interface);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011250
Dave Barach72d72232016-08-04 10:15:08 -040011251 mp->sw_if_index = ntohl (sw_if_index);
11252 mp->ip4_table_index = ntohl (ip4_table_index);
11253 mp->ip6_table_index = ntohl (ip6_table_index);
11254 mp->l2_table_index = ntohl (l2_table_index);
11255 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011256
Dave Barach72d72232016-08-04 10:15:08 -040011257 S;
11258 W;
11259 /* NOTREACHED */
11260 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011261}
11262
11263static int
11264api_ip_address_dump (vat_main_t * vam)
11265{
Dave Barach72d72232016-08-04 10:15:08 -040011266 unformat_input_t *i = vam->input;
11267 vl_api_ip_address_dump_t *mp;
11268 u32 sw_if_index = ~0;
11269 u8 sw_if_index_set = 0;
11270 u8 ipv4_set = 0;
11271 u8 ipv6_set = 0;
11272 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011273
Dave Barach72d72232016-08-04 10:15:08 -040011274 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011275 {
Dave Barach72d72232016-08-04 10:15:08 -040011276 if (unformat (i, "sw_if_index %d", &sw_if_index))
11277 sw_if_index_set = 1;
11278 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11279 sw_if_index_set = 1;
11280 else if (unformat (i, "ipv4"))
11281 ipv4_set = 1;
11282 else if (unformat (i, "ipv6"))
11283 ipv6_set = 1;
11284 else
11285 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011286 }
Dave Barach72d72232016-08-04 10:15:08 -040011287
11288 if (ipv4_set && ipv6_set)
11289 {
11290 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11291 return -99;
11292 }
11293
11294 if ((!ipv4_set) && (!ipv6_set))
11295 {
11296 errmsg ("no ipv4 nor ipv6 flag set\n");
11297 return -99;
11298 }
11299
11300 if (sw_if_index_set == 0)
11301 {
11302 errmsg ("missing interface name or sw_if_index\n");
11303 return -99;
11304 }
11305
11306 vam->current_sw_if_index = sw_if_index;
11307 vam->is_ipv6 = ipv6_set;
11308
11309 M (IP_ADDRESS_DUMP, ip_address_dump);
11310 mp->sw_if_index = ntohl (sw_if_index);
11311 mp->is_ipv6 = ipv6_set;
11312 S;
11313
11314 /* Use a control ping for synchronization */
11315 {
11316 vl_api_control_ping_t *mp;
11317 M (CONTROL_PING, control_ping);
11318 S;
11319 }
11320 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011321}
11322
11323static int
11324api_ip_dump (vat_main_t * vam)
11325{
Dave Barach72d72232016-08-04 10:15:08 -040011326 vl_api_ip_dump_t *mp;
11327 unformat_input_t *in = vam->input;
11328 int ipv4_set = 0;
11329 int ipv6_set = 0;
11330 int is_ipv6;
11331 f64 timeout;
11332 int i;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011333
Dave Barach72d72232016-08-04 10:15:08 -040011334 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -070011335 {
Dave Barach72d72232016-08-04 10:15:08 -040011336 if (unformat (in, "ipv4"))
11337 ipv4_set = 1;
11338 else if (unformat (in, "ipv6"))
11339 ipv6_set = 1;
11340 else
11341 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011342 }
Dave Barach72d72232016-08-04 10:15:08 -040011343
11344 if (ipv4_set && ipv6_set)
11345 {
11346 errmsg ("ipv4 and ipv6 flags cannot be both set\n");
11347 return -99;
11348 }
11349
11350 if ((!ipv4_set) && (!ipv6_set))
11351 {
11352 errmsg ("no ipv4 nor ipv6 flag set\n");
11353 return -99;
11354 }
11355
11356 is_ipv6 = ipv6_set;
11357 vam->is_ipv6 = is_ipv6;
11358
11359 /* free old data */
11360 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
11361 {
11362 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
11363 }
11364 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
11365
11366 M (IP_DUMP, ip_dump);
11367 mp->is_ipv6 = ipv6_set;
11368 S;
11369
11370 /* Use a control ping for synchronization */
11371 {
11372 vl_api_control_ping_t *mp;
11373 M (CONTROL_PING, control_ping);
11374 S;
11375 }
11376 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011377}
11378
11379static int
11380api_ipsec_spd_add_del (vat_main_t * vam)
11381{
Dave Barachbfdedbd2016-01-20 09:11:55 -050011382#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011383 unformat_input_t *i = vam->input;
11384 vl_api_ipsec_spd_add_del_t *mp;
11385 f64 timeout;
11386 u32 spd_id = ~0;
11387 u8 is_add = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011388
Dave Barach72d72232016-08-04 10:15:08 -040011389 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11390 {
11391 if (unformat (i, "spd_id %d", &spd_id))
11392 ;
11393 else if (unformat (i, "del"))
11394 is_add = 0;
11395 else
11396 {
11397 clib_warning ("parse error '%U'", format_unformat_error, i);
11398 return -99;
11399 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011400 }
Dave Barach72d72232016-08-04 10:15:08 -040011401 if (spd_id == ~0)
11402 {
11403 errmsg ("spd_id must be set\n");
11404 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011405 }
11406
Dave Barach72d72232016-08-04 10:15:08 -040011407 M (IPSEC_SPD_ADD_DEL, ipsec_spd_add_del);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011408
Dave Barach72d72232016-08-04 10:15:08 -040011409 mp->spd_id = ntohl (spd_id);
11410 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011411
Dave Barach72d72232016-08-04 10:15:08 -040011412 S;
11413 W;
11414 /* NOTREACHED */
11415 return 0;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011416#else
Dave Barach72d72232016-08-04 10:15:08 -040011417 clib_warning ("unsupported (no dpdk)");
11418 return -99;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011419#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070011420}
11421
11422static int
11423api_ipsec_interface_add_del_spd (vat_main_t * vam)
11424{
Dave Barachbfdedbd2016-01-20 09:11:55 -050011425#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011426 unformat_input_t *i = vam->input;
11427 vl_api_ipsec_interface_add_del_spd_t *mp;
11428 f64 timeout;
11429 u32 sw_if_index;
11430 u8 sw_if_index_set = 0;
11431 u32 spd_id = (u32) ~ 0;
11432 u8 is_add = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011433
Dave Barach72d72232016-08-04 10:15:08 -040011434 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11435 {
11436 if (unformat (i, "del"))
11437 is_add = 0;
11438 else if (unformat (i, "spd_id %d", &spd_id))
11439 ;
11440 else if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
11441 sw_if_index_set = 1;
11442 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11443 sw_if_index_set = 1;
11444 else
11445 {
11446 clib_warning ("parse error '%U'", format_unformat_error, i);
11447 return -99;
11448 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011449
11450 }
11451
Dave Barach72d72232016-08-04 10:15:08 -040011452 if (spd_id == (u32) ~ 0)
11453 {
11454 errmsg ("spd_id must be set\n");
11455 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011456 }
11457
Dave Barach72d72232016-08-04 10:15:08 -040011458 if (sw_if_index_set == 0)
11459 {
11460 errmsg ("missing interface name or sw_if_index\n");
11461 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011462 }
11463
Dave Barach72d72232016-08-04 10:15:08 -040011464 M (IPSEC_INTERFACE_ADD_DEL_SPD, ipsec_interface_add_del_spd);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011465
Dave Barach72d72232016-08-04 10:15:08 -040011466 mp->spd_id = ntohl (spd_id);
11467 mp->sw_if_index = ntohl (sw_if_index);
11468 mp->is_add = is_add;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011469
Dave Barach72d72232016-08-04 10:15:08 -040011470 S;
11471 W;
11472 /* NOTREACHED */
11473 return 0;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011474#else
Dave Barach72d72232016-08-04 10:15:08 -040011475 clib_warning ("unsupported (no dpdk)");
11476 return -99;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011477#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070011478}
11479
11480static int
11481api_ipsec_spd_add_del_entry (vat_main_t * vam)
11482{
Dave Barachbfdedbd2016-01-20 09:11:55 -050011483#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011484 unformat_input_t *i = vam->input;
11485 vl_api_ipsec_spd_add_del_entry_t *mp;
11486 f64 timeout;
11487 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
Dave Barach839fe3e2016-08-10 11:35:54 -040011488 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
Dave Barach042ffb42016-08-12 09:26:47 -040011489 i32 priority = 0;
Dave Barach72d72232016-08-04 10:15:08 -040011490 u32 rport_start = 0, rport_stop = (u32) ~ 0;
11491 u32 lport_start = 0, lport_stop = (u32) ~ 0;
11492 ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop;
11493 ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011494
Dave Barach72d72232016-08-04 10:15:08 -040011495 laddr4_start.as_u32 = raddr4_start.as_u32 = 0;
11496 laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0;
11497 laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0;
11498 laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0;
11499 laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0;
11500 laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011501
Dave Barach72d72232016-08-04 10:15:08 -040011502 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11503 {
11504 if (unformat (i, "del"))
11505 is_add = 0;
11506 if (unformat (i, "outbound"))
11507 is_outbound = 1;
11508 if (unformat (i, "inbound"))
11509 is_outbound = 0;
11510 else if (unformat (i, "spd_id %d", &spd_id))
11511 ;
11512 else if (unformat (i, "sa_id %d", &sa_id))
11513 ;
11514 else if (unformat (i, "priority %d", &priority))
11515 ;
11516 else if (unformat (i, "protocol %d", &protocol))
11517 ;
11518 else if (unformat (i, "lport_start %d", &lport_start))
11519 ;
11520 else if (unformat (i, "lport_stop %d", &lport_stop))
11521 ;
11522 else if (unformat (i, "rport_start %d", &rport_start))
11523 ;
11524 else if (unformat (i, "rport_stop %d", &rport_stop))
11525 ;
11526 else
11527 if (unformat
11528 (i, "laddr_start %U", unformat_ip4_address, &laddr4_start))
11529 {
11530 is_ipv6 = 0;
11531 is_ip_any = 0;
11532 }
11533 else
11534 if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop))
11535 {
11536 is_ipv6 = 0;
11537 is_ip_any = 0;
11538 }
11539 else
11540 if (unformat
11541 (i, "raddr_start %U", unformat_ip4_address, &raddr4_start))
11542 {
11543 is_ipv6 = 0;
11544 is_ip_any = 0;
11545 }
11546 else
11547 if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop))
11548 {
11549 is_ipv6 = 0;
11550 is_ip_any = 0;
11551 }
11552 else
11553 if (unformat
11554 (i, "laddr_start %U", unformat_ip6_address, &laddr6_start))
11555 {
11556 is_ipv6 = 1;
11557 is_ip_any = 0;
11558 }
11559 else
11560 if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop))
11561 {
11562 is_ipv6 = 1;
11563 is_ip_any = 0;
11564 }
11565 else
11566 if (unformat
11567 (i, "raddr_start %U", unformat_ip6_address, &raddr6_start))
11568 {
11569 is_ipv6 = 1;
11570 is_ip_any = 0;
11571 }
11572 else
11573 if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop))
11574 {
11575 is_ipv6 = 1;
11576 is_ip_any = 0;
11577 }
11578 else
11579 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
11580 {
11581 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
11582 {
11583 clib_warning ("unsupported action: 'resolve'");
11584 return -99;
11585 }
11586 }
11587 else
11588 {
11589 clib_warning ("parse error '%U'", format_unformat_error, i);
11590 return -99;
11591 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011592
11593 }
11594
Dave Barach72d72232016-08-04 10:15:08 -040011595 M (IPSEC_SPD_ADD_DEL_ENTRY, ipsec_spd_add_del_entry);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011596
Dave Barach72d72232016-08-04 10:15:08 -040011597 mp->spd_id = ntohl (spd_id);
11598 mp->priority = ntohl (priority);
11599 mp->is_outbound = is_outbound;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011600
Dave Barach72d72232016-08-04 10:15:08 -040011601 mp->is_ipv6 = is_ipv6;
11602 if (is_ipv6 || is_ip_any)
11603 {
11604 clib_memcpy (mp->remote_address_start, &raddr6_start,
11605 sizeof (ip6_address_t));
11606 clib_memcpy (mp->remote_address_stop, &raddr6_stop,
11607 sizeof (ip6_address_t));
11608 clib_memcpy (mp->local_address_start, &laddr6_start,
11609 sizeof (ip6_address_t));
11610 clib_memcpy (mp->local_address_stop, &laddr6_stop,
11611 sizeof (ip6_address_t));
Ed Warnickecb9cada2015-12-08 15:45:58 -070011612 }
Dave Barach72d72232016-08-04 10:15:08 -040011613 else
11614 {
11615 clib_memcpy (mp->remote_address_start, &raddr4_start,
11616 sizeof (ip4_address_t));
11617 clib_memcpy (mp->remote_address_stop, &raddr4_stop,
11618 sizeof (ip4_address_t));
11619 clib_memcpy (mp->local_address_start, &laddr4_start,
11620 sizeof (ip4_address_t));
11621 clib_memcpy (mp->local_address_stop, &laddr4_stop,
11622 sizeof (ip4_address_t));
11623 }
11624 mp->protocol = (u8) protocol;
11625 mp->local_port_start = ntohs ((u16) lport_start);
11626 mp->local_port_stop = ntohs ((u16) lport_stop);
11627 mp->remote_port_start = ntohs ((u16) rport_start);
11628 mp->remote_port_stop = ntohs ((u16) rport_stop);
11629 mp->policy = (u8) policy;
11630 mp->sa_id = ntohl (sa_id);
11631 mp->is_add = is_add;
11632 mp->is_ip_any = is_ip_any;
11633 S;
11634 W;
11635 /* NOTREACHED */
11636 return 0;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011637#else
Dave Barach72d72232016-08-04 10:15:08 -040011638 clib_warning ("unsupported (no dpdk)");
11639 return -99;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011640#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070011641}
11642
11643static int
11644api_ipsec_sad_add_del_entry (vat_main_t * vam)
11645{
Dave Barachbfdedbd2016-01-20 09:11:55 -050011646#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011647 unformat_input_t *i = vam->input;
11648 vl_api_ipsec_sad_add_del_entry_t *mp;
11649 f64 timeout;
Dave Barach839fe3e2016-08-10 11:35:54 -040011650 u32 sad_id = 0, spi = 0;
Dave Barach72d72232016-08-04 10:15:08 -040011651 u8 *ck = 0, *ik = 0;
11652 u8 is_add = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011653
Dave Barach72d72232016-08-04 10:15:08 -040011654 u8 protocol = IPSEC_PROTOCOL_AH;
11655 u8 is_tunnel = 0, is_tunnel_ipv6 = 0;
11656 u32 crypto_alg = 0, integ_alg = 0;
11657 ip4_address_t tun_src4;
11658 ip4_address_t tun_dst4;
11659 ip6_address_t tun_src6;
11660 ip6_address_t tun_dst6;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011661
Dave Barach72d72232016-08-04 10:15:08 -040011662 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11663 {
11664 if (unformat (i, "del"))
11665 is_add = 0;
11666 else if (unformat (i, "sad_id %d", &sad_id))
11667 ;
11668 else if (unformat (i, "spi %d", &spi))
11669 ;
11670 else if (unformat (i, "esp"))
11671 protocol = IPSEC_PROTOCOL_ESP;
11672 else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4))
11673 {
11674 is_tunnel = 1;
11675 is_tunnel_ipv6 = 0;
11676 }
11677 else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4))
11678 {
11679 is_tunnel = 1;
11680 is_tunnel_ipv6 = 0;
11681 }
11682 else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6))
11683 {
11684 is_tunnel = 1;
11685 is_tunnel_ipv6 = 1;
11686 }
11687 else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6))
11688 {
11689 is_tunnel = 1;
11690 is_tunnel_ipv6 = 1;
11691 }
11692 else
11693 if (unformat
11694 (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg))
11695 {
11696 if (crypto_alg < IPSEC_CRYPTO_ALG_AES_CBC_128 ||
11697 crypto_alg > IPSEC_INTEG_ALG_SHA_512_256)
11698 {
11699 clib_warning ("unsupported crypto-alg: '%U'",
11700 format_ipsec_crypto_alg, crypto_alg);
11701 return -99;
11702 }
11703 }
11704 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11705 ;
11706 else
11707 if (unformat
11708 (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg))
11709 {
11710 if (integ_alg < IPSEC_INTEG_ALG_SHA1_96 ||
11711 integ_alg > IPSEC_INTEG_ALG_SHA_512_256)
11712 {
11713 clib_warning ("unsupported integ-alg: '%U'",
11714 format_ipsec_integ_alg, integ_alg);
11715 return -99;
11716 }
11717 }
11718 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11719 ;
11720 else
11721 {
11722 clib_warning ("parse error '%U'", format_unformat_error, i);
11723 return -99;
11724 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011725
11726 }
11727
Dave Barach72d72232016-08-04 10:15:08 -040011728 M (IPSEC_SAD_ADD_DEL_ENTRY, ipsec_sad_add_del_entry);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011729
Dave Barach72d72232016-08-04 10:15:08 -040011730 mp->sad_id = ntohl (sad_id);
11731 mp->is_add = is_add;
11732 mp->protocol = protocol;
11733 mp->spi = ntohl (spi);
11734 mp->is_tunnel = is_tunnel;
11735 mp->is_tunnel_ipv6 = is_tunnel_ipv6;
11736 mp->crypto_algorithm = crypto_alg;
11737 mp->integrity_algorithm = integ_alg;
11738 mp->crypto_key_length = vec_len (ck);
11739 mp->integrity_key_length = vec_len (ik);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011740
Dave Barach72d72232016-08-04 10:15:08 -040011741 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11742 mp->crypto_key_length = sizeof (mp->crypto_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011743
Dave Barach72d72232016-08-04 10:15:08 -040011744 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11745 mp->integrity_key_length = sizeof (mp->integrity_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011746
Dave Barach839fe3e2016-08-10 11:35:54 -040011747 if (ck)
11748 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11749 if (ik)
11750 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011751
Dave Barach72d72232016-08-04 10:15:08 -040011752 if (is_tunnel)
11753 {
11754 if (is_tunnel_ipv6)
11755 {
11756 clib_memcpy (mp->tunnel_src_address, &tun_src6,
11757 sizeof (ip6_address_t));
11758 clib_memcpy (mp->tunnel_dst_address, &tun_dst6,
11759 sizeof (ip6_address_t));
11760 }
11761 else
11762 {
11763 clib_memcpy (mp->tunnel_src_address, &tun_src4,
11764 sizeof (ip4_address_t));
11765 clib_memcpy (mp->tunnel_dst_address, &tun_dst4,
11766 sizeof (ip4_address_t));
11767 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011768 }
11769
Dave Barach72d72232016-08-04 10:15:08 -040011770 S;
11771 W;
11772 /* NOTREACHED */
11773 return 0;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011774#else
Dave Barach72d72232016-08-04 10:15:08 -040011775 clib_warning ("unsupported (no dpdk)");
11776 return -99;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011777#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070011778}
11779
11780static int
11781api_ipsec_sa_set_key (vat_main_t * vam)
11782{
Dave Barachbfdedbd2016-01-20 09:11:55 -050011783#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011784 unformat_input_t *i = vam->input;
11785 vl_api_ipsec_sa_set_key_t *mp;
11786 f64 timeout;
11787 u32 sa_id;
11788 u8 *ck = 0, *ik = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070011789
Dave Barach72d72232016-08-04 10:15:08 -040011790 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11791 {
11792 if (unformat (i, "sa_id %d", &sa_id))
11793 ;
11794 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
11795 ;
11796 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
11797 ;
11798 else
11799 {
11800 clib_warning ("parse error '%U'", format_unformat_error, i);
11801 return -99;
11802 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070011803 }
11804
Dave Barach72d72232016-08-04 10:15:08 -040011805 M (IPSEC_SA_SET_KEY, ipsec_set_sa_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011806
Dave Barach72d72232016-08-04 10:15:08 -040011807 mp->sa_id = ntohl (sa_id);
11808 mp->crypto_key_length = vec_len (ck);
11809 mp->integrity_key_length = vec_len (ik);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011810
Dave Barach72d72232016-08-04 10:15:08 -040011811 if (mp->crypto_key_length > sizeof (mp->crypto_key))
11812 mp->crypto_key_length = sizeof (mp->crypto_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011813
Dave Barach72d72232016-08-04 10:15:08 -040011814 if (mp->integrity_key_length > sizeof (mp->integrity_key))
11815 mp->integrity_key_length = sizeof (mp->integrity_key);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011816
Dave Barach839fe3e2016-08-10 11:35:54 -040011817 if (ck)
11818 clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length);
11819 if (ik)
11820 clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length);
Ed Warnickecb9cada2015-12-08 15:45:58 -070011821
Dave Barach72d72232016-08-04 10:15:08 -040011822 S;
11823 W;
11824 /* NOTREACHED */
11825 return 0;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011826#else
Dave Barach72d72232016-08-04 10:15:08 -040011827 clib_warning ("unsupported (no dpdk)");
11828 return -99;
Dave Barachbfdedbd2016-01-20 09:11:55 -050011829#endif
Ed Warnickecb9cada2015-12-08 15:45:58 -070011830}
11831
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011832static int
11833api_ikev2_profile_add_del (vat_main_t * vam)
11834{
11835#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011836 unformat_input_t *i = vam->input;
11837 vl_api_ikev2_profile_add_del_t *mp;
11838 f64 timeout;
11839 u8 is_add = 1;
11840 u8 *name = 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011841
Dave Barach72d72232016-08-04 10:15:08 -040011842 const char *valid_chars = "a-zA-Z0-9_";
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011843
Dave Barach72d72232016-08-04 10:15:08 -040011844 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11845 {
11846 if (unformat (i, "del"))
11847 is_add = 0;
11848 else if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11849 vec_add1 (name, 0);
11850 else
11851 {
11852 errmsg ("parse error '%U'", format_unformat_error, i);
11853 return -99;
11854 }
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011855 }
11856
Dave Barach72d72232016-08-04 10:15:08 -040011857 if (!vec_len (name))
11858 {
11859 errmsg ("profile name must be specified");
11860 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011861 }
11862
Dave Barach72d72232016-08-04 10:15:08 -040011863 if (vec_len (name) > 64)
11864 {
11865 errmsg ("profile name too long");
11866 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011867 }
11868
Dave Barach72d72232016-08-04 10:15:08 -040011869 M (IKEV2_PROFILE_ADD_DEL, ikev2_profile_add_del);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011870
Dave Barach72d72232016-08-04 10:15:08 -040011871 clib_memcpy (mp->name, name, vec_len (name));
11872 mp->is_add = is_add;
11873 vec_free (name);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011874
Dave Barach72d72232016-08-04 10:15:08 -040011875 S;
11876 W;
11877 /* NOTREACHED */
11878 return 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011879#else
Dave Barach72d72232016-08-04 10:15:08 -040011880 clib_warning ("unsupported (no dpdk)");
11881 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011882#endif
11883}
11884
11885static int
11886api_ikev2_profile_set_auth (vat_main_t * vam)
11887{
11888#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011889 unformat_input_t *i = vam->input;
11890 vl_api_ikev2_profile_set_auth_t *mp;
11891 f64 timeout;
11892 u8 *name = 0;
11893 u8 *data = 0;
11894 u32 auth_method = 0;
11895 u8 is_hex = 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011896
Dave Barach72d72232016-08-04 10:15:08 -040011897 const char *valid_chars = "a-zA-Z0-9_";
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011898
Dave Barach72d72232016-08-04 10:15:08 -040011899 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11900 {
11901 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11902 vec_add1 (name, 0);
11903 else if (unformat (i, "auth_method %U",
11904 unformat_ikev2_auth_method, &auth_method))
11905 ;
11906 else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data))
11907 is_hex = 1;
11908 else if (unformat (i, "auth_data %v", &data))
11909 ;
11910 else
11911 {
11912 errmsg ("parse error '%U'", format_unformat_error, i);
11913 return -99;
11914 }
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011915 }
11916
Dave Barach72d72232016-08-04 10:15:08 -040011917 if (!vec_len (name))
11918 {
11919 errmsg ("profile name must be specified");
11920 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011921 }
11922
Dave Barach72d72232016-08-04 10:15:08 -040011923 if (vec_len (name) > 64)
11924 {
11925 errmsg ("profile name too long");
11926 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011927 }
11928
Dave Barach72d72232016-08-04 10:15:08 -040011929 if (!vec_len (data))
11930 {
11931 errmsg ("auth_data must be specified");
11932 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011933 }
11934
Dave Barach72d72232016-08-04 10:15:08 -040011935 if (!auth_method)
11936 {
11937 errmsg ("auth_method must be specified");
11938 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011939 }
11940
Dave Barach72d72232016-08-04 10:15:08 -040011941 M (IKEV2_PROFILE_SET_AUTH, ikev2_profile_set_auth);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011942
Dave Barach72d72232016-08-04 10:15:08 -040011943 mp->is_hex = is_hex;
11944 mp->auth_method = (u8) auth_method;
11945 mp->data_len = vec_len (data);
11946 clib_memcpy (mp->name, name, vec_len (name));
11947 clib_memcpy (mp->data, data, vec_len (data));
11948 vec_free (name);
11949 vec_free (data);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011950
Dave Barach72d72232016-08-04 10:15:08 -040011951 S;
11952 W;
11953 /* NOTREACHED */
11954 return 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011955#else
Dave Barach72d72232016-08-04 10:15:08 -040011956 clib_warning ("unsupported (no dpdk)");
11957 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011958#endif
11959}
11960
11961static int
11962api_ikev2_profile_set_id (vat_main_t * vam)
11963{
11964#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040011965 unformat_input_t *i = vam->input;
11966 vl_api_ikev2_profile_set_id_t *mp;
11967 f64 timeout;
11968 u8 *name = 0;
11969 u8 *data = 0;
11970 u8 is_local = 0;
11971 u32 id_type = 0;
11972 ip4_address_t ip4;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011973
Dave Barach72d72232016-08-04 10:15:08 -040011974 const char *valid_chars = "a-zA-Z0-9_";
Matus Fabiane5f42fe2016-04-08 11:18:08 +020011975
Dave Barach72d72232016-08-04 10:15:08 -040011976 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11977 {
11978 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
11979 vec_add1 (name, 0);
11980 else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type))
11981 ;
11982 else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4))
11983 {
11984 data = vec_new (u8, 4);
11985 clib_memcpy (data, ip4.as_u8, 4);
11986 }
11987 else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data))
11988 ;
11989 else if (unformat (i, "id_data %v", &data))
11990 ;
11991 else if (unformat (i, "local"))
11992 is_local = 1;
11993 else if (unformat (i, "remote"))
11994 is_local = 0;
11995 else
11996 {
11997 errmsg ("parse error '%U'", format_unformat_error, i);
11998 return -99;
11999 }
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012000 }
12001
Dave Barach72d72232016-08-04 10:15:08 -040012002 if (!vec_len (name))
12003 {
12004 errmsg ("profile name must be specified");
12005 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012006 }
12007
Dave Barach72d72232016-08-04 10:15:08 -040012008 if (vec_len (name) > 64)
12009 {
12010 errmsg ("profile name too long");
12011 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012012 }
12013
Dave Barach72d72232016-08-04 10:15:08 -040012014 if (!vec_len (data))
12015 {
12016 errmsg ("id_data must be specified");
12017 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012018 }
12019
Dave Barach72d72232016-08-04 10:15:08 -040012020 if (!id_type)
12021 {
12022 errmsg ("id_type must be specified");
12023 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012024 }
12025
Dave Barach72d72232016-08-04 10:15:08 -040012026 M (IKEV2_PROFILE_SET_ID, ikev2_profile_set_id);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012027
Dave Barach72d72232016-08-04 10:15:08 -040012028 mp->is_local = is_local;
12029 mp->id_type = (u8) id_type;
12030 mp->data_len = vec_len (data);
12031 clib_memcpy (mp->name, name, vec_len (name));
12032 clib_memcpy (mp->data, data, vec_len (data));
12033 vec_free (name);
12034 vec_free (data);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012035
Dave Barach72d72232016-08-04 10:15:08 -040012036 S;
12037 W;
12038 /* NOTREACHED */
12039 return 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012040#else
Dave Barach72d72232016-08-04 10:15:08 -040012041 clib_warning ("unsupported (no dpdk)");
12042 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012043#endif
12044}
12045
12046static int
12047api_ikev2_profile_set_ts (vat_main_t * vam)
12048{
12049#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040012050 unformat_input_t *i = vam->input;
12051 vl_api_ikev2_profile_set_ts_t *mp;
12052 f64 timeout;
12053 u8 *name = 0;
12054 u8 is_local = 0;
12055 u32 proto = 0, start_port = 0, end_port = (u32) ~ 0;
12056 ip4_address_t start_addr, end_addr;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012057
Dave Barach72d72232016-08-04 10:15:08 -040012058 const char *valid_chars = "a-zA-Z0-9_";
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012059
Dave Barach72d72232016-08-04 10:15:08 -040012060 start_addr.as_u32 = 0;
12061 end_addr.as_u32 = (u32) ~ 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012062
Dave Barach72d72232016-08-04 10:15:08 -040012063 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12064 {
12065 if (unformat (i, "name %U", unformat_token, valid_chars, &name))
12066 vec_add1 (name, 0);
12067 else if (unformat (i, "protocol %d", &proto))
12068 ;
12069 else if (unformat (i, "start_port %d", &start_port))
12070 ;
12071 else if (unformat (i, "end_port %d", &end_port))
12072 ;
12073 else
12074 if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr))
12075 ;
12076 else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr))
12077 ;
12078 else if (unformat (i, "local"))
12079 is_local = 1;
12080 else if (unformat (i, "remote"))
12081 is_local = 0;
12082 else
12083 {
12084 errmsg ("parse error '%U'", format_unformat_error, i);
12085 return -99;
12086 }
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012087 }
12088
Dave Barach72d72232016-08-04 10:15:08 -040012089 if (!vec_len (name))
12090 {
12091 errmsg ("profile name must be specified");
12092 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012093 }
12094
Dave Barach72d72232016-08-04 10:15:08 -040012095 if (vec_len (name) > 64)
12096 {
12097 errmsg ("profile name too long");
12098 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012099 }
12100
Dave Barach72d72232016-08-04 10:15:08 -040012101 M (IKEV2_PROFILE_SET_TS, ikev2_profile_set_ts);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012102
Dave Barach72d72232016-08-04 10:15:08 -040012103 mp->is_local = is_local;
12104 mp->proto = (u8) proto;
12105 mp->start_port = (u16) start_port;
12106 mp->end_port = (u16) end_port;
12107 mp->start_addr = start_addr.as_u32;
12108 mp->end_addr = end_addr.as_u32;
12109 clib_memcpy (mp->name, name, vec_len (name));
12110 vec_free (name);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012111
Dave Barach72d72232016-08-04 10:15:08 -040012112 S;
12113 W;
12114 /* NOTREACHED */
12115 return 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012116#else
Dave Barach72d72232016-08-04 10:15:08 -040012117 clib_warning ("unsupported (no dpdk)");
12118 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012119#endif
12120}
12121
12122static int
12123api_ikev2_set_local_key (vat_main_t * vam)
12124{
12125#if DPDK > 0
Dave Barach72d72232016-08-04 10:15:08 -040012126 unformat_input_t *i = vam->input;
12127 vl_api_ikev2_set_local_key_t *mp;
12128 f64 timeout;
12129 u8 *file = 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012130
Dave Barach72d72232016-08-04 10:15:08 -040012131 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12132 {
12133 if (unformat (i, "file %v", &file))
12134 vec_add1 (file, 0);
12135 else
12136 {
12137 errmsg ("parse error '%U'", format_unformat_error, i);
12138 return -99;
12139 }
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012140 }
12141
Dave Barach72d72232016-08-04 10:15:08 -040012142 if (!vec_len (file))
12143 {
12144 errmsg ("RSA key file must be specified");
12145 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012146 }
12147
Dave Barach72d72232016-08-04 10:15:08 -040012148 if (vec_len (file) > 256)
12149 {
12150 errmsg ("file name too long");
12151 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012152 }
12153
Dave Barach72d72232016-08-04 10:15:08 -040012154 M (IKEV2_SET_LOCAL_KEY, ikev2_set_local_key);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012155
Dave Barach72d72232016-08-04 10:15:08 -040012156 clib_memcpy (mp->key_file, file, vec_len (file));
12157 vec_free (file);
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012158
Dave Barach72d72232016-08-04 10:15:08 -040012159 S;
12160 W;
12161 /* NOTREACHED */
12162 return 0;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012163#else
Dave Barach72d72232016-08-04 10:15:08 -040012164 clib_warning ("unsupported (no dpdk)");
12165 return -99;
Matus Fabiane5f42fe2016-04-08 11:18:08 +020012166#endif
12167}
12168
Ed Warnickecb9cada2015-12-08 15:45:58 -070012169/*
12170 * MAP
12171 */
Dave Barach72d72232016-08-04 10:15:08 -040012172static int
12173api_map_add_domain (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012174{
12175 unformat_input_t *i = vam->input;
12176 vl_api_map_add_domain_t *mp;
12177 f64 timeout;
12178
12179 ip4_address_t ip4_prefix;
12180 ip6_address_t ip6_prefix;
12181 ip6_address_t ip6_src;
12182 u32 num_m_args = 0;
Dave Barach839fe3e2016-08-10 11:35:54 -040012183 u32 ip6_prefix_len = 0, ip4_prefix_len = 0, ea_bits_len = 0, psid_offset =
12184 0, psid_length = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012185 u8 is_translation = 0;
12186 u32 mtu = 0;
Ole Troand847d1c2016-08-24 16:17:29 +020012187 u32 ip6_src_len = 128;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012188
Dave Barach72d72232016-08-04 10:15:08 -040012189 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12190 {
12191 if (unformat (i, "ip4-pfx %U/%d", unformat_ip4_address,
12192 &ip4_prefix, &ip4_prefix_len))
12193 num_m_args++;
12194 else if (unformat (i, "ip6-pfx %U/%d", unformat_ip6_address,
12195 &ip6_prefix, &ip6_prefix_len))
12196 num_m_args++;
12197 else
12198 if (unformat
12199 (i, "ip6-src %U/%d", unformat_ip6_address, &ip6_src,
12200 &ip6_src_len))
12201 num_m_args++;
12202 else if (unformat (i, "ip6-src %U", unformat_ip6_address, &ip6_src))
12203 num_m_args++;
12204 else if (unformat (i, "ea-bits-len %d", &ea_bits_len))
12205 num_m_args++;
12206 else if (unformat (i, "psid-offset %d", &psid_offset))
12207 num_m_args++;
12208 else if (unformat (i, "psid-len %d", &psid_length))
12209 num_m_args++;
12210 else if (unformat (i, "mtu %d", &mtu))
12211 num_m_args++;
12212 else if (unformat (i, "map-t"))
12213 is_translation = 1;
12214 else
12215 {
12216 clib_warning ("parse error '%U'", format_unformat_error, i);
12217 return -99;
12218 }
12219 }
12220
Ole Troan07e7eab2016-08-25 00:24:08 +020012221 if (num_m_args < 3)
Dave Barach72d72232016-08-04 10:15:08 -040012222 {
12223 errmsg ("mandatory argument(s) missing\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -070012224 return -99;
12225 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070012226
12227 /* Construct the API message */
Dave Barach72d72232016-08-04 10:15:08 -040012228 M (MAP_ADD_DOMAIN, map_add_domain);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012229
Dave Barach72d72232016-08-04 10:15:08 -040012230 clib_memcpy (mp->ip4_prefix, &ip4_prefix, sizeof (ip4_prefix));
Ed Warnickecb9cada2015-12-08 15:45:58 -070012231 mp->ip4_prefix_len = ip4_prefix_len;
12232
Dave Barach72d72232016-08-04 10:15:08 -040012233 clib_memcpy (mp->ip6_prefix, &ip6_prefix, sizeof (ip6_prefix));
Ed Warnickecb9cada2015-12-08 15:45:58 -070012234 mp->ip6_prefix_len = ip6_prefix_len;
12235
Dave Barach72d72232016-08-04 10:15:08 -040012236 clib_memcpy (mp->ip6_src, &ip6_src, sizeof (ip6_src));
Ed Warnickecb9cada2015-12-08 15:45:58 -070012237 mp->ip6_src_prefix_len = ip6_src_len;
12238
12239 mp->ea_bits_len = ea_bits_len;
12240 mp->psid_offset = psid_offset;
12241 mp->psid_length = psid_length;
12242 mp->is_translation = is_translation;
Dave Barach72d72232016-08-04 10:15:08 -040012243 mp->mtu = htons (mtu);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012244
12245 /* send it... */
12246 S;
12247
12248 /* Wait for a reply, return good/bad news */
12249 W;
12250}
12251
Dave Barach72d72232016-08-04 10:15:08 -040012252static int
12253api_map_del_domain (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012254{
12255 unformat_input_t *i = vam->input;
12256 vl_api_map_del_domain_t *mp;
12257 f64 timeout;
12258
12259 u32 num_m_args = 0;
12260 u32 index;
12261
Dave Barach72d72232016-08-04 10:15:08 -040012262 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12263 {
12264 if (unformat (i, "index %d", &index))
12265 num_m_args++;
12266 else
12267 {
12268 clib_warning ("parse error '%U'", format_unformat_error, i);
12269 return -99;
12270 }
12271 }
12272
12273 if (num_m_args != 1)
12274 {
12275 errmsg ("mandatory argument(s) missing\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -070012276 return -99;
12277 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070012278
12279 /* Construct the API message */
Dave Barach72d72232016-08-04 10:15:08 -040012280 M (MAP_DEL_DOMAIN, map_del_domain);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012281
Dave Barach72d72232016-08-04 10:15:08 -040012282 mp->index = ntohl (index);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012283
12284 /* send it... */
12285 S;
12286
12287 /* Wait for a reply, return good/bad news */
12288 W;
12289}
12290
Dave Barach72d72232016-08-04 10:15:08 -040012291static int
12292api_map_add_del_rule (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012293{
12294 unformat_input_t *i = vam->input;
12295 vl_api_map_add_del_rule_t *mp;
12296 f64 timeout;
12297 u8 is_add = 1;
12298 ip6_address_t ip6_dst;
Dave Barach839fe3e2016-08-10 11:35:54 -040012299 u32 num_m_args = 0, index, psid = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012300
Dave Barach72d72232016-08-04 10:15:08 -040012301 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12302 {
12303 if (unformat (i, "index %d", &index))
12304 num_m_args++;
12305 else if (unformat (i, "psid %d", &psid))
12306 num_m_args++;
12307 else if (unformat (i, "dst %U", unformat_ip6_address, &ip6_dst))
12308 num_m_args++;
12309 else if (unformat (i, "del"))
12310 {
12311 is_add = 0;
12312 }
12313 else
12314 {
12315 clib_warning ("parse error '%U'", format_unformat_error, i);
12316 return -99;
12317 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070012318 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070012319
12320 /* Construct the API message */
Dave Barach72d72232016-08-04 10:15:08 -040012321 M (MAP_ADD_DEL_RULE, map_add_del_rule);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012322
Dave Barach72d72232016-08-04 10:15:08 -040012323 mp->index = ntohl (index);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012324 mp->is_add = is_add;
Dave Barach72d72232016-08-04 10:15:08 -040012325 clib_memcpy (mp->ip6_dst, &ip6_dst, sizeof (ip6_dst));
12326 mp->psid = ntohs (psid);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012327
12328 /* send it... */
12329 S;
12330
12331 /* Wait for a reply, return good/bad news */
12332 W;
12333}
12334
Dave Barach72d72232016-08-04 10:15:08 -040012335static int
12336api_map_domain_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012337{
Dave Barach72d72232016-08-04 10:15:08 -040012338 vl_api_map_domain_dump_t *mp;
12339 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012340
Dave Barach72d72232016-08-04 10:15:08 -040012341 /* Construct the API message */
12342 M (MAP_DOMAIN_DUMP, map_domain_dump);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012343
Dave Barach72d72232016-08-04 10:15:08 -040012344 /* send it... */
12345 S;
12346
12347 /* Use a control ping for synchronization */
12348 {
12349 vl_api_control_ping_t *mp;
12350 M (CONTROL_PING, control_ping);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012351 S;
Dave Barach72d72232016-08-04 10:15:08 -040012352 }
12353 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012354}
12355
Dave Barach72d72232016-08-04 10:15:08 -040012356static int
12357api_map_rule_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012358{
Dave Barach72d72232016-08-04 10:15:08 -040012359 unformat_input_t *i = vam->input;
12360 vl_api_map_rule_dump_t *mp;
12361 f64 timeout;
12362 u32 domain_index = ~0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012363
Dave Barach72d72232016-08-04 10:15:08 -040012364 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012365 {
Dave Barach72d72232016-08-04 10:15:08 -040012366 if (unformat (i, "index %u", &domain_index))
12367 ;
12368 else
12369 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012370 }
Dave Barach72d72232016-08-04 10:15:08 -040012371
12372 if (domain_index == ~0)
12373 {
12374 clib_warning ("parse error: domain index expected");
12375 return -99;
12376 }
12377
12378 /* Construct the API message */
12379 M (MAP_RULE_DUMP, map_rule_dump);
12380
12381 mp->domain_index = htonl (domain_index);
12382
12383 /* send it... */
12384 S;
12385
12386 /* Use a control ping for synchronization */
12387 {
12388 vl_api_control_ping_t *mp;
12389 M (CONTROL_PING, control_ping);
12390 S;
12391 }
12392 W;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012393}
12394
12395static void vl_api_map_add_domain_reply_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040012396 (vl_api_map_add_domain_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012397{
Dave Barach72d72232016-08-04 10:15:08 -040012398 vat_main_t *vam = &vat_main;
12399 i32 retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012400
Dave Barach72d72232016-08-04 10:15:08 -040012401 if (vam->async_mode)
12402 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070012403 vam->async_errors += (retval < 0);
Dave Barach72d72232016-08-04 10:15:08 -040012404 }
12405 else
12406 {
Ed Warnickecb9cada2015-12-08 15:45:58 -070012407 vam->retval = retval;
12408 vam->result_ready = 1;
Dave Barach72d72232016-08-04 10:15:08 -040012409 }
Ed Warnickecb9cada2015-12-08 15:45:58 -070012410}
12411
12412static void vl_api_map_add_domain_reply_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040012413 (vl_api_map_add_domain_reply_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070012414{
Dave Barach72d72232016-08-04 10:15:08 -040012415 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012416 vat_json_node_t node;
12417
Dave Barach72d72232016-08-04 10:15:08 -040012418 vat_json_init_object (&node);
12419 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
12420 vat_json_object_add_uint (&node, "index", ntohl (mp->index));
Ed Warnickecb9cada2015-12-08 15:45:58 -070012421
Dave Barach72d72232016-08-04 10:15:08 -040012422 vat_json_print (vam->ofp, &node);
12423 vat_json_free (&node);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012424
Dave Barach72d72232016-08-04 10:15:08 -040012425 vam->retval = ntohl (mp->retval);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012426 vam->result_ready = 1;
12427}
12428
12429static int
12430api_get_first_msg_id (vat_main_t * vam)
12431{
Dave Barach72d72232016-08-04 10:15:08 -040012432 vl_api_get_first_msg_id_t *mp;
12433 f64 timeout;
12434 unformat_input_t *i = vam->input;
12435 u8 *name;
12436 u8 name_set = 0;
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080012437
Dave Barach72d72232016-08-04 10:15:08 -040012438 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12439 {
12440 if (unformat (i, "client %s", &name))
12441 name_set = 1;
12442 else
12443 break;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012444 }
12445
Dave Barach72d72232016-08-04 10:15:08 -040012446 if (name_set == 0)
12447 {
12448 errmsg ("missing client name\n");
12449 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012450 }
Dave Barach72d72232016-08-04 10:15:08 -040012451 vec_add1 (name, 0);
Ed Warnickecb9cada2015-12-08 15:45:58 -070012452
Dave Barach72d72232016-08-04 10:15:08 -040012453 if (vec_len (name) > 63)
12454 {
12455 errmsg ("client name too long\n");
12456 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012457 }
12458
Dave Barach72d72232016-08-04 10:15:08 -040012459 M (GET_FIRST_MSG_ID, get_first_msg_id);
12460 clib_memcpy (mp->name, name, vec_len (name));
12461 S;
12462 W;
12463 /* NOTREACHED */
12464 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070012465}
12466
Dave Barach72d72232016-08-04 10:15:08 -040012467static int
12468api_cop_interface_enable_disable (vat_main_t * vam)
Dave Barachc07bf5d2016-02-17 17:52:26 -050012469{
Dave Barach72d72232016-08-04 10:15:08 -040012470 unformat_input_t *line_input = vam->input;
12471 vl_api_cop_interface_enable_disable_t *mp;
12472 f64 timeout;
12473 u32 sw_if_index = ~0;
12474 u8 enable_disable = 1;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012475
Dave Barach72d72232016-08-04 10:15:08 -040012476 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12477 {
12478 if (unformat (line_input, "disable"))
12479 enable_disable = 0;
12480 if (unformat (line_input, "enable"))
12481 enable_disable = 1;
12482 else if (unformat (line_input, "%U", unformat_sw_if_index,
12483 vam, &sw_if_index))
12484 ;
12485 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12486 ;
12487 else
12488 break;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012489 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080012490
Dave Barach72d72232016-08-04 10:15:08 -040012491 if (sw_if_index == ~0)
12492 {
12493 errmsg ("missing interface name or sw_if_index\n");
12494 return -99;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012495 }
12496
Dave Barach72d72232016-08-04 10:15:08 -040012497 /* Construct the API message */
12498 M (COP_INTERFACE_ENABLE_DISABLE, cop_interface_enable_disable);
12499 mp->sw_if_index = ntohl (sw_if_index);
12500 mp->enable_disable = enable_disable;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012501
Dave Barach72d72232016-08-04 10:15:08 -040012502 /* send it... */
12503 S;
12504 /* Wait for the reply */
12505 W;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012506}
12507
Dave Barach72d72232016-08-04 10:15:08 -040012508static int
12509api_cop_whitelist_enable_disable (vat_main_t * vam)
Dave Barachc07bf5d2016-02-17 17:52:26 -050012510{
Dave Barach72d72232016-08-04 10:15:08 -040012511 unformat_input_t *line_input = vam->input;
12512 vl_api_cop_whitelist_enable_disable_t *mp;
12513 f64 timeout;
12514 u32 sw_if_index = ~0;
12515 u8 ip4 = 0, ip6 = 0, default_cop = 0;
Dave Barach839fe3e2016-08-10 11:35:54 -040012516 u32 fib_id = 0;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012517
Dave Barach72d72232016-08-04 10:15:08 -040012518 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12519 {
12520 if (unformat (line_input, "ip4"))
12521 ip4 = 1;
12522 else if (unformat (line_input, "ip6"))
12523 ip6 = 1;
12524 else if (unformat (line_input, "default"))
12525 default_cop = 1;
12526 else if (unformat (line_input, "%U", unformat_sw_if_index,
12527 vam, &sw_if_index))
12528 ;
12529 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
12530 ;
12531 else if (unformat (line_input, "fib-id %d", &fib_id))
12532 ;
12533 else
12534 break;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012535 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080012536
Dave Barach72d72232016-08-04 10:15:08 -040012537 if (sw_if_index == ~0)
12538 {
12539 errmsg ("missing interface name or sw_if_index\n");
12540 return -99;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012541 }
12542
Dave Barach72d72232016-08-04 10:15:08 -040012543 /* Construct the API message */
12544 M (COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable);
12545 mp->sw_if_index = ntohl (sw_if_index);
12546 mp->fib_id = ntohl (fib_id);
12547 mp->ip4 = ip4;
12548 mp->ip6 = ip6;
12549 mp->default_cop = default_cop;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012550
Dave Barach72d72232016-08-04 10:15:08 -040012551 /* send it... */
12552 S;
12553 /* Wait for the reply */
12554 W;
Dave Barachc07bf5d2016-02-17 17:52:26 -050012555}
12556
Dave Barach72d72232016-08-04 10:15:08 -040012557static int
12558api_get_node_graph (vat_main_t * vam)
Dave Barachb44e9bc2016-02-19 09:06:23 -050012559{
Dave Barach72d72232016-08-04 10:15:08 -040012560 vl_api_get_node_graph_t *mp;
12561 f64 timeout;
Dave Barachb44e9bc2016-02-19 09:06:23 -050012562
Dave Barach72d72232016-08-04 10:15:08 -040012563 M (GET_NODE_GRAPH, get_node_graph);
Dave Barachb44e9bc2016-02-19 09:06:23 -050012564
Dave Barach72d72232016-08-04 10:15:08 -040012565 /* send it... */
12566 S;
12567 /* Wait for the reply */
12568 W;
Dave Barachb44e9bc2016-02-19 09:06:23 -050012569}
12570
Dave Barach72d72232016-08-04 10:15:08 -040012571/* *INDENT-OFF* */
Florin Coras429e7952016-08-02 02:31:03 +020012572/** Used for parsing LISP eids */
12573typedef CLIB_PACKED(struct{
12574 u8 addr[16]; /**< eid address */
12575 u32 len; /**< prefix length if IP */
12576 u8 type; /**< type of eid */
12577}) lisp_eid_vat_t;
Dave Barach72d72232016-08-04 10:15:08 -040012578/* *INDENT-ON* */
Florin Coras429e7952016-08-02 02:31:03 +020012579
12580static uword
12581unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
12582{
Dave Barach72d72232016-08-04 10:15:08 -040012583 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
Florin Coras429e7952016-08-02 02:31:03 +020012584
Dave Barach72d72232016-08-04 10:15:08 -040012585 memset (a, 0, sizeof (a[0]));
Florin Coras429e7952016-08-02 02:31:03 +020012586
Dave Barach72d72232016-08-04 10:15:08 -040012587 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
12588 {
12589 a->type = 0; /* ipv4 type */
12590 }
12591 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
12592 {
12593 a->type = 1; /* ipv6 type */
12594 }
12595 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
12596 {
12597 a->type = 2; /* mac type */
12598 }
12599 else
12600 {
Florin Coras429e7952016-08-02 02:31:03 +020012601 return 0;
Dave Barach72d72232016-08-04 10:15:08 -040012602 }
Florin Coras429e7952016-08-02 02:31:03 +020012603
Dave Barach72d72232016-08-04 10:15:08 -040012604 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
12605 {
Florin Coras429e7952016-08-02 02:31:03 +020012606 return 0;
Dave Barach72d72232016-08-04 10:15:08 -040012607 }
Florin Coras429e7952016-08-02 02:31:03 +020012608
12609 return 1;
12610}
12611
12612static int
12613lisp_eid_size_vat (u8 type)
12614{
Dave Barach72d72232016-08-04 10:15:08 -040012615 switch (type)
12616 {
Florin Coras429e7952016-08-02 02:31:03 +020012617 case 0:
12618 return 4;
12619 case 1:
12620 return 16;
12621 case 2:
12622 return 6;
Dave Barach72d72232016-08-04 10:15:08 -040012623 }
Florin Coras429e7952016-08-02 02:31:03 +020012624 return 0;
12625}
12626
12627static void
12628lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
12629{
Dave Barach72d72232016-08-04 10:15:08 -040012630 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
Florin Coras429e7952016-08-02 02:31:03 +020012631}
12632
Dave Barach72d72232016-08-04 10:15:08 -040012633/* *INDENT-OFF* */
Andrej Kozemcaka8691752016-07-27 10:33:38 +020012634/** Used for transferring locators via VPP API */
12635typedef CLIB_PACKED(struct
12636{
Dave Barach72d72232016-08-04 10:15:08 -040012637 u32 sw_if_index; /**< locator sw_if_index */
12638 u8 priority; /**< locator priority */
12639 u8 weight; /**< locator weight */
Andrej Kozemcaka8691752016-07-27 10:33:38 +020012640}) ls_locator_t;
Dave Barach72d72232016-08-04 10:15:08 -040012641/* *INDENT-ON* */
Andrej Kozemcaka8691752016-07-27 10:33:38 +020012642
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012643static int
Dave Barach72d72232016-08-04 10:15:08 -040012644api_lisp_add_del_locator_set (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012645{
Dave Barach72d72232016-08-04 10:15:08 -040012646 unformat_input_t *input = vam->input;
12647 vl_api_lisp_add_del_locator_set_t *mp;
12648 f64 timeout = ~0;
12649 u8 is_add = 1;
12650 u8 *locator_set_name = NULL;
12651 u8 locator_set_name_set = 0;
12652 ls_locator_t locator, *locators = 0;
12653 u32 sw_if_index, priority, weight;
Filip Tehlar3fa0af52016-09-27 13:28:01 +020012654 u32 data_len = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012655
Dave Barach72d72232016-08-04 10:15:08 -040012656 /* Parse args required to build the message */
12657 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12658 {
12659 if (unformat (input, "del"))
12660 {
12661 is_add = 0;
12662 }
12663 else if (unformat (input, "locator-set %s", &locator_set_name))
12664 {
12665 locator_set_name_set = 1;
12666 }
12667 else if (unformat (input, "sw_if_index %u p %u w %u",
12668 &sw_if_index, &priority, &weight))
12669 {
12670 locator.sw_if_index = htonl (sw_if_index);
12671 locator.priority = priority;
12672 locator.weight = weight;
12673 vec_add1 (locators, locator);
12674 }
12675 else if (unformat (input, "iface %U p %u w %u", unformat_sw_if_index,
12676 vam, &sw_if_index, &priority, &weight))
12677 {
12678 locator.sw_if_index = htonl (sw_if_index);
12679 locator.priority = priority;
12680 locator.weight = weight;
12681 vec_add1 (locators, locator);
12682 }
12683 else
12684 break;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012685 }
12686
Dave Barach72d72232016-08-04 10:15:08 -040012687 if (locator_set_name_set == 0)
12688 {
12689 errmsg ("missing locator-set name");
12690 vec_free (locators);
12691 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012692 }
12693
Dave Barach72d72232016-08-04 10:15:08 -040012694 if (vec_len (locator_set_name) > 64)
12695 {
12696 errmsg ("locator-set name too long\n");
12697 vec_free (locator_set_name);
12698 vec_free (locators);
12699 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012700 }
Dave Barach72d72232016-08-04 10:15:08 -040012701 vec_add1 (locator_set_name, 0);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012702
Filip Tehlar3fa0af52016-09-27 13:28:01 +020012703 data_len = sizeof (ls_locator_t) * vec_len (locators);
12704
Dave Barach72d72232016-08-04 10:15:08 -040012705 /* Construct the API message */
Filip Tehlar3fa0af52016-09-27 13:28:01 +020012706 M2 (LISP_ADD_DEL_LOCATOR_SET, lisp_add_del_locator_set, data_len);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012707
Dave Barach72d72232016-08-04 10:15:08 -040012708 mp->is_add = is_add;
12709 clib_memcpy (mp->locator_set_name, locator_set_name,
12710 vec_len (locator_set_name));
12711 vec_free (locator_set_name);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012712
Filip Tehlare3552c42016-08-26 12:44:38 +020012713 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
Dave Barach839fe3e2016-08-10 11:35:54 -040012714 if (locators)
Filip Tehlar3fa0af52016-09-27 13:28:01 +020012715 clib_memcpy (mp->locators, locators, data_len);
Dave Barach72d72232016-08-04 10:15:08 -040012716 vec_free (locators);
Andrej Kozemcaka8691752016-07-27 10:33:38 +020012717
Dave Barach72d72232016-08-04 10:15:08 -040012718 /* send it... */
12719 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012720
Dave Barach72d72232016-08-04 10:15:08 -040012721 /* Wait for a reply... */
12722 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012723
Dave Barach72d72232016-08-04 10:15:08 -040012724 /* NOTREACHED */
12725 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012726}
12727
12728static int
Dave Barach72d72232016-08-04 10:15:08 -040012729api_lisp_add_del_locator (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012730{
Dave Barach72d72232016-08-04 10:15:08 -040012731 unformat_input_t *input = vam->input;
12732 vl_api_lisp_add_del_locator_t *mp;
12733 f64 timeout = ~0;
12734 u32 tmp_if_index = ~0;
12735 u32 sw_if_index = ~0;
12736 u8 sw_if_index_set = 0;
12737 u8 sw_if_index_if_name_set = 0;
12738 u32 priority = ~0;
12739 u8 priority_set = 0;
12740 u32 weight = ~0;
12741 u8 weight_set = 0;
12742 u8 is_add = 1;
12743 u8 *locator_set_name = NULL;
12744 u8 locator_set_name_set = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012745
Dave Barach72d72232016-08-04 10:15:08 -040012746 /* Parse args required to build the message */
12747 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12748 {
12749 if (unformat (input, "del"))
12750 {
12751 is_add = 0;
12752 }
12753 else if (unformat (input, "locator-set %s", &locator_set_name))
12754 {
12755 locator_set_name_set = 1;
12756 }
12757 else if (unformat (input, "iface %U", unformat_sw_if_index, vam,
12758 &tmp_if_index))
12759 {
12760 sw_if_index_if_name_set = 1;
12761 sw_if_index = tmp_if_index;
12762 }
12763 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
12764 {
12765 sw_if_index_set = 1;
12766 sw_if_index = tmp_if_index;
12767 }
12768 else if (unformat (input, "p %d", &priority))
12769 {
12770 priority_set = 1;
12771 }
12772 else if (unformat (input, "w %d", &weight))
12773 {
12774 weight_set = 1;
12775 }
12776 else
12777 break;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012778 }
12779
Dave Barach72d72232016-08-04 10:15:08 -040012780 if (locator_set_name_set == 0)
12781 {
12782 errmsg ("missing locator-set name");
12783 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012784 }
12785
Dave Barach72d72232016-08-04 10:15:08 -040012786 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
12787 {
12788 errmsg ("missing sw_if_index");
12789 vec_free (locator_set_name);
12790 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012791 }
12792
Dave Barach72d72232016-08-04 10:15:08 -040012793 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
12794 {
12795 errmsg ("cannot use both params interface name and sw_if_index");
12796 vec_free (locator_set_name);
12797 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012798 }
12799
Dave Barach72d72232016-08-04 10:15:08 -040012800 if (priority_set == 0)
12801 {
12802 errmsg ("missing locator-set priority\n");
12803 vec_free (locator_set_name);
12804 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012805 }
12806
Dave Barach72d72232016-08-04 10:15:08 -040012807 if (weight_set == 0)
12808 {
12809 errmsg ("missing locator-set weight\n");
12810 vec_free (locator_set_name);
12811 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012812 }
12813
Dave Barach72d72232016-08-04 10:15:08 -040012814 if (vec_len (locator_set_name) > 64)
12815 {
12816 errmsg ("locator-set name too long\n");
12817 vec_free (locator_set_name);
12818 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012819 }
Dave Barach72d72232016-08-04 10:15:08 -040012820 vec_add1 (locator_set_name, 0);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012821
Dave Barach72d72232016-08-04 10:15:08 -040012822 /* Construct the API message */
12823 M (LISP_ADD_DEL_LOCATOR, lisp_add_del_locator);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012824
Dave Barach72d72232016-08-04 10:15:08 -040012825 mp->is_add = is_add;
12826 mp->sw_if_index = ntohl (sw_if_index);
12827 mp->priority = priority;
12828 mp->weight = weight;
12829 clib_memcpy (mp->locator_set_name, locator_set_name,
12830 vec_len (locator_set_name));
12831 vec_free (locator_set_name);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012832
Dave Barach72d72232016-08-04 10:15:08 -040012833 /* send it... */
12834 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012835
Dave Barach72d72232016-08-04 10:15:08 -040012836 /* Wait for a reply... */
12837 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012838
Dave Barach72d72232016-08-04 10:15:08 -040012839 /* NOTREACHED */
12840 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012841}
12842
12843static int
Dave Barach72d72232016-08-04 10:15:08 -040012844api_lisp_add_del_local_eid (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012845{
Dave Barach72d72232016-08-04 10:15:08 -040012846 unformat_input_t *input = vam->input;
12847 vl_api_lisp_add_del_local_eid_t *mp;
12848 f64 timeout = ~0;
12849 u8 is_add = 1;
12850 u8 eid_set = 0;
12851 lisp_eid_vat_t _eid, *eid = &_eid;
12852 u8 *locator_set_name = 0;
12853 u8 locator_set_name_set = 0;
12854 u32 vni = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012855
Dave Barach72d72232016-08-04 10:15:08 -040012856 /* Parse args required to build the message */
12857 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12858 {
12859 if (unformat (input, "del"))
12860 {
12861 is_add = 0;
12862 }
12863 else if (unformat (input, "vni %d", &vni))
12864 {
12865 ;
12866 }
12867 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
12868 {
12869 eid_set = 1;
12870 }
12871 else if (unformat (input, "locator-set %s", &locator_set_name))
12872 {
12873 locator_set_name_set = 1;
12874 }
12875 else
12876 break;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012877 }
12878
Dave Barach72d72232016-08-04 10:15:08 -040012879 if (locator_set_name_set == 0)
12880 {
12881 errmsg ("missing locator-set name\n");
12882 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012883 }
12884
Dave Barach72d72232016-08-04 10:15:08 -040012885 if (0 == eid_set)
12886 {
12887 errmsg ("EID address not set!");
12888 vec_free (locator_set_name);
12889 return -99;
Filip Tehlar006eb262016-06-27 13:09:20 +020012890 }
12891
Dave Barach72d72232016-08-04 10:15:08 -040012892 if (vec_len (locator_set_name) > 64)
12893 {
12894 errmsg ("locator-set name too long\n");
12895 vec_free (locator_set_name);
12896 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012897 }
Dave Barach72d72232016-08-04 10:15:08 -040012898 vec_add1 (locator_set_name, 0);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012899
Dave Barach72d72232016-08-04 10:15:08 -040012900 /* Construct the API message */
12901 M (LISP_ADD_DEL_LOCAL_EID, lisp_add_del_local_eid);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012902
Dave Barach72d72232016-08-04 10:15:08 -040012903 mp->is_add = is_add;
12904 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
12905 mp->eid_type = eid->type;
12906 mp->prefix_len = eid->len;
12907 mp->vni = clib_host_to_net_u32 (vni);
12908 clib_memcpy (mp->locator_set_name, locator_set_name,
12909 vec_len (locator_set_name));
Florin Coras429e7952016-08-02 02:31:03 +020012910
Dave Barach72d72232016-08-04 10:15:08 -040012911 vec_free (locator_set_name);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012912
Dave Barach72d72232016-08-04 10:15:08 -040012913 /* send it... */
12914 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012915
Dave Barach72d72232016-08-04 10:15:08 -040012916 /* Wait for a reply... */
12917 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012918
Dave Barach72d72232016-08-04 10:15:08 -040012919 /* NOTREACHED */
12920 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012921}
12922
Dave Barach72d72232016-08-04 10:15:08 -040012923/* *INDENT-OFF* */
Florin Coras429e7952016-08-02 02:31:03 +020012924/** Used for transferring locators via VPP API */
12925typedef CLIB_PACKED(struct
12926{
Dave Barach72d72232016-08-04 10:15:08 -040012927 u8 is_ip4; /**< is locator an IPv4 address? */
12928 u8 priority; /**< locator priority */
12929 u8 weight; /**< locator weight */
12930 u8 addr[16]; /**< IPv4/IPv6 address */
Florin Coras429e7952016-08-02 02:31:03 +020012931}) rloc_t;
Dave Barach72d72232016-08-04 10:15:08 -040012932/* *INDENT-ON* */
Florin Coras429e7952016-08-02 02:31:03 +020012933
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012934static int
Dave Barach72d72232016-08-04 10:15:08 -040012935api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012936{
Dave Barach72d72232016-08-04 10:15:08 -040012937 unformat_input_t *input = vam->input;
12938 vl_api_lisp_gpe_add_del_fwd_entry_t *mp;
12939 f64 timeout = ~0;
12940 u8 is_add = 1;
12941 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
12942 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
12943 u8 rmt_eid_set = 0, lcl_eid_set = 0;
12944 u32 action = ~0, p, w;
12945 ip4_address_t rmt_rloc4, lcl_rloc4;
12946 ip6_address_t rmt_rloc6, lcl_rloc6;
12947 rloc_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020012948
Dave Barach839fe3e2016-08-10 11:35:54 -040012949 memset (&rloc, 0, sizeof (rloc));
Florin Coras7fbfad32016-08-05 16:57:33 +020012950
Dave Barach72d72232016-08-04 10:15:08 -040012951 /* Parse args required to build the message */
12952 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
12953 {
12954 if (unformat (input, "del"))
12955 {
12956 is_add = 0;
12957 }
12958 else if (unformat (input, "rmt_eid %U", unformat_lisp_eid_vat, rmt_eid))
12959 {
12960 rmt_eid_set = 1;
12961 }
12962 else if (unformat (input, "lcl_eid %U", unformat_lisp_eid_vat, lcl_eid))
12963 {
12964 lcl_eid_set = 1;
12965 }
12966 else if (unformat (input, "p %d w %d", &p, &w))
12967 {
12968 if (!curr_rloc)
12969 {
12970 errmsg ("No RLOC configured for setting priority/weight!");
12971 return -99;
12972 }
12973 curr_rloc->priority = p;
12974 curr_rloc->weight = w;
12975 }
12976 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
12977 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
12978 {
12979 rloc.is_ip4 = 1;
Florin Coras7fbfad32016-08-05 16:57:33 +020012980
Dave Barach72d72232016-08-04 10:15:08 -040012981 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
Florin Coras7fbfad32016-08-05 16:57:33 +020012982 rloc.priority = rloc.weight = 0;
Dave Barach72d72232016-08-04 10:15:08 -040012983 vec_add1 (lcl_locs, rloc);
Florin Coras7fbfad32016-08-05 16:57:33 +020012984
Dave Barach72d72232016-08-04 10:15:08 -040012985 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
12986 vec_add1 (rmt_locs, rloc);
Florin Coras7fbfad32016-08-05 16:57:33 +020012987 /* priority and weight saved in rmt loc */
Dave Barach72d72232016-08-04 10:15:08 -040012988 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
12989 }
Florin Coras7fbfad32016-08-05 16:57:33 +020012990 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
Dave Barach72d72232016-08-04 10:15:08 -040012991 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
12992 {
12993 rloc.is_ip4 = 0;
12994 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
Florin Coras7fbfad32016-08-05 16:57:33 +020012995 rloc.priority = rloc.weight = 0;
Dave Barach72d72232016-08-04 10:15:08 -040012996 vec_add1 (lcl_locs, rloc);
Florin Coras7fbfad32016-08-05 16:57:33 +020012997
Dave Barach72d72232016-08-04 10:15:08 -040012998 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
12999 vec_add1 (rmt_locs, rloc);
Florin Coras7fbfad32016-08-05 16:57:33 +020013000 /* priority and weight saved in rmt loc */
Dave Barach72d72232016-08-04 10:15:08 -040013001 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
13002 }
13003 else if (unformat (input, "action %d", &action))
13004 {
13005 ;
13006 }
13007 else
13008 {
13009 clib_warning ("parse error '%U'", format_unformat_error, input);
13010 return -99;
13011 }
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013012 }
13013
Dave Barach72d72232016-08-04 10:15:08 -040013014 if (!rmt_eid_set)
13015 {
13016 errmsg ("remote eid addresses not set\n");
13017 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013018 }
13019
Dave Barach72d72232016-08-04 10:15:08 -040013020 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
13021 {
13022 errmsg ("eid types don't match\n");
13023 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013024 }
13025
Dave Barach839fe3e2016-08-10 11:35:54 -040013026 if (0 == rmt_locs && (u32) ~ 0 == action)
Florin Coras7fbfad32016-08-05 16:57:33 +020013027 {
13028 errmsg ("action not set for negative mapping\n");
13029 return -99;
13030 }
13031
Dave Barach72d72232016-08-04 10:15:08 -040013032 /* Construct the API message */
13033 M (LISP_GPE_ADD_DEL_FWD_ENTRY, lisp_gpe_add_del_fwd_entry);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013034
Dave Barach72d72232016-08-04 10:15:08 -040013035 mp->is_add = is_add;
13036 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
13037 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
13038 mp->eid_type = rmt_eid->type;
13039 mp->rmt_len = rmt_eid->len;
13040 mp->lcl_len = lcl_eid->len;
13041 mp->action = action;
Florin Coras429e7952016-08-02 02:31:03 +020013042
Florin Coras7fbfad32016-08-05 16:57:33 +020013043 if (0 != rmt_locs && 0 != lcl_locs)
13044 {
Dave Barach839fe3e2016-08-10 11:35:54 -040013045 mp->loc_num = vec_len (rmt_locs);
Florin Coras7fbfad32016-08-05 16:57:33 +020013046 clib_memcpy (mp->lcl_locs, lcl_locs,
Dave Barach839fe3e2016-08-10 11:35:54 -040013047 (sizeof (rloc_t) * vec_len (lcl_locs)));
Florin Coras7fbfad32016-08-05 16:57:33 +020013048 clib_memcpy (mp->rmt_locs, rmt_locs,
Dave Barach839fe3e2016-08-10 11:35:54 -040013049 (sizeof (rloc_t) * vec_len (rmt_locs)));
Florin Coras7fbfad32016-08-05 16:57:33 +020013050 }
Dave Barach72d72232016-08-04 10:15:08 -040013051 vec_free (lcl_locs);
13052 vec_free (rmt_locs);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013053
Dave Barach72d72232016-08-04 10:15:08 -040013054 /* send it... */
13055 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013056
Dave Barach72d72232016-08-04 10:15:08 -040013057 /* Wait for a reply... */
13058 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013059
Dave Barach72d72232016-08-04 10:15:08 -040013060 /* NOTREACHED */
13061 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013062}
13063
13064static int
Dave Barach72d72232016-08-04 10:15:08 -040013065api_lisp_add_del_map_resolver (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013066{
Dave Barach72d72232016-08-04 10:15:08 -040013067 unformat_input_t *input = vam->input;
13068 vl_api_lisp_add_del_map_resolver_t *mp;
13069 f64 timeout = ~0;
13070 u8 is_add = 1;
13071 u8 ipv4_set = 0;
13072 u8 ipv6_set = 0;
13073 ip4_address_t ipv4;
13074 ip6_address_t ipv6;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013075
Dave Barach72d72232016-08-04 10:15:08 -040013076 /* Parse args required to build the message */
13077 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13078 {
13079 if (unformat (input, "del"))
13080 {
13081 is_add = 0;
13082 }
13083 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
13084 {
13085 ipv4_set = 1;
13086 }
13087 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
13088 {
13089 ipv6_set = 1;
13090 }
13091 else
13092 break;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013093 }
13094
Dave Barach72d72232016-08-04 10:15:08 -040013095 if (ipv4_set && ipv6_set)
13096 {
13097 errmsg ("both eid v4 and v6 addresses set\n");
13098 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013099 }
13100
Dave Barach72d72232016-08-04 10:15:08 -040013101 if (!ipv4_set && !ipv6_set)
13102 {
13103 errmsg ("eid addresses not set\n");
13104 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013105 }
13106
Dave Barach72d72232016-08-04 10:15:08 -040013107 /* Construct the API message */
13108 M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013109
Dave Barach72d72232016-08-04 10:15:08 -040013110 mp->is_add = is_add;
13111 if (ipv6_set)
13112 {
13113 mp->is_ipv6 = 1;
13114 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
13115 }
13116 else
13117 {
13118 mp->is_ipv6 = 0;
13119 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013120 }
13121
Dave Barach72d72232016-08-04 10:15:08 -040013122 /* send it... */
13123 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013124
Dave Barach72d72232016-08-04 10:15:08 -040013125 /* Wait for a reply... */
13126 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013127
Dave Barach72d72232016-08-04 10:15:08 -040013128 /* NOTREACHED */
13129 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013130}
13131
13132static int
Florin Coras577c3552016-04-21 00:45:40 +020013133api_lisp_gpe_enable_disable (vat_main_t * vam)
13134{
Dave Barach72d72232016-08-04 10:15:08 -040013135 unformat_input_t *input = vam->input;
Florin Coras577c3552016-04-21 00:45:40 +020013136 vl_api_lisp_gpe_enable_disable_t *mp;
13137 f64 timeout = ~0;
13138 u8 is_set = 0;
13139 u8 is_en = 1;
13140
13141 /* Parse args required to build the message */
Dave Barach72d72232016-08-04 10:15:08 -040013142 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13143 {
13144 if (unformat (input, "enable"))
13145 {
13146 is_set = 1;
13147 is_en = 1;
13148 }
13149 else if (unformat (input, "disable"))
13150 {
13151 is_set = 1;
13152 is_en = 0;
13153 }
13154 else
13155 break;
13156 }
Florin Coras577c3552016-04-21 00:45:40 +020013157
Dave Barach72d72232016-08-04 10:15:08 -040013158 if (is_set == 0)
13159 {
13160 errmsg ("Value not set\n");
Florin Coras577c3552016-04-21 00:45:40 +020013161 return -99;
Dave Barach72d72232016-08-04 10:15:08 -040013162 }
Florin Coras577c3552016-04-21 00:45:40 +020013163
13164 /* Construct the API message */
Dave Barach72d72232016-08-04 10:15:08 -040013165 M (LISP_GPE_ENABLE_DISABLE, lisp_gpe_enable_disable);
Florin Coras577c3552016-04-21 00:45:40 +020013166
13167 mp->is_en = is_en;
13168
13169 /* send it... */
13170 S;
13171
13172 /* Wait for a reply... */
13173 W;
13174
13175 /* NOTREACHED */
13176 return 0;
13177}
13178
13179static int
Filip Tehlar46d4e362016-05-09 09:39:26 +020013180api_lisp_enable_disable (vat_main_t * vam)
13181{
Dave Barach72d72232016-08-04 10:15:08 -040013182 unformat_input_t *input = vam->input;
Filip Tehlar46d4e362016-05-09 09:39:26 +020013183 vl_api_lisp_enable_disable_t *mp;
13184 f64 timeout = ~0;
13185 u8 is_set = 0;
13186 u8 is_en = 0;
13187
13188 /* Parse args required to build the message */
13189 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13190 {
13191 if (unformat (input, "enable"))
Dave Barach72d72232016-08-04 10:15:08 -040013192 {
13193 is_set = 1;
13194 is_en = 1;
13195 }
Filip Tehlar46d4e362016-05-09 09:39:26 +020013196 else if (unformat (input, "disable"))
Dave Barach72d72232016-08-04 10:15:08 -040013197 {
13198 is_set = 1;
13199 }
Filip Tehlar46d4e362016-05-09 09:39:26 +020013200 else
Dave Barach72d72232016-08-04 10:15:08 -040013201 break;
Filip Tehlar46d4e362016-05-09 09:39:26 +020013202 }
13203
13204 if (!is_set)
13205 {
13206 errmsg ("Value not set\n");
13207 return -99;
13208 }
13209
13210 /* Construct the API message */
Dave Barach72d72232016-08-04 10:15:08 -040013211 M (LISP_ENABLE_DISABLE, lisp_enable_disable);
Filip Tehlar46d4e362016-05-09 09:39:26 +020013212
13213 mp->is_en = is_en;
13214
13215 /* send it... */
13216 S;
13217
13218 /* Wait for a reply... */
13219 W;
13220
13221 /* NOTREACHED */
13222 return 0;
13223}
13224
Florin Corasdca88042016-09-14 16:01:38 +020013225static int
13226api_show_lisp_map_request_mode (vat_main_t * vam)
13227{
13228 f64 timeout = ~0;
13229 vl_api_show_lisp_map_request_mode_t *mp;
13230
13231 M (SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode);
13232
13233 /* send */
13234 S;
13235
13236 /* wait for reply */
13237 W;
13238
13239 return 0;
13240}
13241
13242static int
13243api_lisp_map_request_mode (vat_main_t * vam)
13244{
13245 f64 timeout = ~0;
13246 unformat_input_t *input = vam->input;
13247 vl_api_lisp_map_request_mode_t *mp;
13248 u8 mode = 0;
13249
13250 /* Parse args required to build the message */
13251 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13252 {
13253 if (unformat (input, "dst-only"))
13254 mode = 0;
13255 else if (unformat (input, "src-dst"))
13256 mode = 1;
13257 else
13258 {
13259 errmsg ("parse error '%U'", format_unformat_error, input);
13260 return -99;
13261 }
13262 }
13263
13264 M (LISP_MAP_REQUEST_MODE, lisp_map_request_mode);
13265
13266 mp->mode = mode;
13267
13268 /* send */
13269 S;
13270
13271 /* wait for reply */
13272 W;
13273
13274 /* notreached */
13275 return 0;
13276}
13277
Filip Tehlar195bcee2016-05-13 17:37:35 +020013278/**
Filip Tehlar53f09e32016-05-19 14:25:44 +020013279 * Enable/disable LISP proxy ITR.
13280 *
13281 * @param vam vpp API test context
13282 * @return return code
13283 */
13284static int
13285api_lisp_pitr_set_locator_set (vat_main_t * vam)
13286{
13287 f64 timeout = ~0;
13288 u8 ls_name_set = 0;
Dave Barach72d72232016-08-04 10:15:08 -040013289 unformat_input_t *input = vam->input;
13290 vl_api_lisp_pitr_set_locator_set_t *mp;
Filip Tehlar53f09e32016-05-19 14:25:44 +020013291 u8 is_add = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013292 u8 *ls_name = 0;
Filip Tehlar53f09e32016-05-19 14:25:44 +020013293
13294 /* Parse args required to build the message */
13295 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13296 {
13297 if (unformat (input, "del"))
Dave Barach72d72232016-08-04 10:15:08 -040013298 is_add = 0;
Filip Tehlar53f09e32016-05-19 14:25:44 +020013299 else if (unformat (input, "locator-set %s", &ls_name))
Dave Barach72d72232016-08-04 10:15:08 -040013300 ls_name_set = 1;
Filip Tehlar53f09e32016-05-19 14:25:44 +020013301 else
Dave Barach72d72232016-08-04 10:15:08 -040013302 {
13303 errmsg ("parse error '%U'", format_unformat_error, input);
13304 return -99;
13305 }
Filip Tehlar53f09e32016-05-19 14:25:44 +020013306 }
13307
13308 if (!ls_name_set)
13309 {
13310 errmsg ("locator-set name not set!");
13311 return -99;
13312 }
13313
Dave Barach72d72232016-08-04 10:15:08 -040013314 M (LISP_PITR_SET_LOCATOR_SET, lisp_pitr_set_locator_set);
Filip Tehlar53f09e32016-05-19 14:25:44 +020013315
13316 mp->is_add = is_add;
13317 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
13318 vec_free (ls_name);
13319
13320 /* send */
13321 S;
13322
13323 /* wait for reply */
13324 W;
13325
Dave Barach72d72232016-08-04 10:15:08 -040013326 /* notreached */
Filip Tehlar53f09e32016-05-19 14:25:44 +020013327 return 0;
13328}
13329
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013330static int
13331api_show_lisp_pitr (vat_main_t * vam)
13332{
Dave Barach72d72232016-08-04 10:15:08 -040013333 vl_api_show_lisp_pitr_t *mp;
13334 f64 timeout = ~0;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013335
Dave Barach72d72232016-08-04 10:15:08 -040013336 if (!vam->json_output)
13337 {
13338 fformat (vam->ofp, "%=20s\n", "lisp status:");
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013339 }
13340
Dave Barach72d72232016-08-04 10:15:08 -040013341 M (SHOW_LISP_PITR, show_lisp_pitr);
13342 /* send it... */
13343 S;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013344
Dave Barach72d72232016-08-04 10:15:08 -040013345 /* Wait for a reply... */
13346 W;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013347
Dave Barach72d72232016-08-04 10:15:08 -040013348 /* NOTREACHED */
13349 return 0;
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020013350}
13351
Filip Tehlar53f09e32016-05-19 14:25:44 +020013352/**
Filip Tehlar324112f2016-06-02 16:07:38 +020013353 * Add/delete mapping between vni and vrf
13354 */
13355static int
13356api_lisp_eid_table_add_del_map (vat_main_t * vam)
13357{
13358 f64 timeout = ~0;
Dave Barach72d72232016-08-04 10:15:08 -040013359 unformat_input_t *input = vam->input;
Filip Tehlar324112f2016-06-02 16:07:38 +020013360 vl_api_lisp_eid_table_add_del_map_t *mp;
Florin Coras1a1adc72016-07-22 01:45:30 +020013361 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
13362 u32 vni, vrf, bd_index;
Filip Tehlar324112f2016-06-02 16:07:38 +020013363
13364 /* Parse args required to build the message */
13365 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13366 {
13367 if (unformat (input, "del"))
Dave Barach72d72232016-08-04 10:15:08 -040013368 is_add = 0;
13369 else if (unformat (input, "vrf %d", &vrf))
13370 vrf_set = 1;
13371 else if (unformat (input, "bd_index %d", &bd_index))
13372 bd_index_set = 1;
13373 else if (unformat (input, "vni %d", &vni))
13374 vni_set = 1;
Filip Tehlar324112f2016-06-02 16:07:38 +020013375 else
Dave Barach72d72232016-08-04 10:15:08 -040013376 break;
Filip Tehlar324112f2016-06-02 16:07:38 +020013377 }
13378
Florin Coras1a1adc72016-07-22 01:45:30 +020013379 if (!vni_set || (!vrf_set && !bd_index_set))
Filip Tehlar324112f2016-06-02 16:07:38 +020013380 {
13381 errmsg ("missing arguments!");
13382 return -99;
13383 }
13384
Filip Tehlar5a4e2dd2016-08-30 15:05:18 +020013385 if (vrf_set && bd_index_set)
13386 {
13387 errmsg ("error: both vrf and bd entered!");
13388 return -99;
13389 }
13390
Dave Barach72d72232016-08-04 10:15:08 -040013391 M (LISP_EID_TABLE_ADD_DEL_MAP, lisp_eid_table_add_del_map);
Filip Tehlar324112f2016-06-02 16:07:38 +020013392
13393 mp->is_add = is_add;
13394 mp->vni = htonl (vni);
Filip Tehlar5a4e2dd2016-08-30 15:05:18 +020013395 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
Florin Coras1a1adc72016-07-22 01:45:30 +020013396 mp->is_l2 = bd_index_set;
Filip Tehlar324112f2016-06-02 16:07:38 +020013397
13398 /* send */
13399 S;
13400
13401 /* wait for reply */
13402 W;
13403
Dave Barach72d72232016-08-04 10:15:08 -040013404 /* notreached */
Filip Tehlar324112f2016-06-02 16:07:38 +020013405 return 0;
13406}
13407
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013408uword
13409unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
13410{
13411 u32 *action = va_arg (*args, u32 *);
13412 u8 *s = 0;
13413
13414 if (unformat (input, "%s", &s))
13415 {
13416 if (!strcmp ((char *) s, "no-action"))
13417 action[0] = 0;
13418 else if (!strcmp ((char *) s, "natively-forward"))
13419 action[0] = 1;
13420 else if (!strcmp ((char *) s, "send-map-request"))
13421 action[0] = 2;
13422 else if (!strcmp ((char *) s, "drop"))
13423 action[0] = 3;
13424 else
13425 {
13426 clib_warning ("invalid action: '%s'", s);
13427 action[0] = 3;
13428 }
13429 }
13430 else
13431 return 0;
13432
13433 vec_free (s);
13434 return 1;
13435}
13436
Filip Tehlar324112f2016-06-02 16:07:38 +020013437/**
Florin Corasf727db92016-06-23 15:01:58 +020013438 * Add/del remote mapping to/from LISP control plane
Filip Tehlar195bcee2016-05-13 17:37:35 +020013439 *
13440 * @param vam vpp API test context
13441 * @return return code
13442 */
13443static int
13444api_lisp_add_del_remote_mapping (vat_main_t * vam)
13445{
Dave Barach72d72232016-08-04 10:15:08 -040013446 unformat_input_t *input = vam->input;
13447 vl_api_lisp_add_del_remote_mapping_t *mp;
13448 f64 timeout = ~0;
13449 u32 vni = 0;
Dave Barach72d72232016-08-04 10:15:08 -040013450 lisp_eid_vat_t _eid, *eid = &_eid;
13451 lisp_eid_vat_t _seid, *seid = &_seid;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013452 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
Filip Tehlar3fa0af52016-09-27 13:28:01 +020013453 u32 action = ~0, p, w, data_len;
Dave Barach72d72232016-08-04 10:15:08 -040013454 ip4_address_t rloc4;
13455 ip6_address_t rloc6;
13456 rloc_t *rlocs = 0, rloc, *curr_rloc = 0;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013457
Dave Barach839fe3e2016-08-10 11:35:54 -040013458 memset (&rloc, 0, sizeof (rloc));
13459
Dave Barach72d72232016-08-04 10:15:08 -040013460 /* Parse args required to build the message */
13461 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13462 {
13463 if (unformat (input, "del-all"))
13464 {
13465 del_all = 1;
13466 }
13467 else if (unformat (input, "del"))
13468 {
13469 is_add = 0;
13470 }
13471 else if (unformat (input, "add"))
13472 {
13473 is_add = 1;
13474 }
Filip Tehlarc9e08432016-09-22 15:30:01 +020013475 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
Dave Barach72d72232016-08-04 10:15:08 -040013476 {
13477 eid_set = 1;
13478 }
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013479 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
Dave Barach72d72232016-08-04 10:15:08 -040013480 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013481 seid_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013482 }
13483 else if (unformat (input, "vni %d", &vni))
13484 {
13485 ;
13486 }
13487 else if (unformat (input, "p %d w %d", &p, &w))
13488 {
13489 if (!curr_rloc)
13490 {
13491 errmsg ("No RLOC configured for setting priority/weight!");
13492 return -99;
13493 }
13494 curr_rloc->priority = p;
13495 curr_rloc->weight = w;
13496 }
13497 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
13498 {
13499 rloc.is_ip4 = 1;
13500 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
13501 vec_add1 (rlocs, rloc);
13502 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13503 }
13504 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
13505 {
13506 rloc.is_ip4 = 0;
13507 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
13508 vec_add1 (rlocs, rloc);
13509 curr_rloc = &rlocs[vec_len (rlocs) - 1];
13510 }
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013511 else if (unformat (input, "action %U",
13512 unformat_negative_mapping_action, &action))
Dave Barach72d72232016-08-04 10:15:08 -040013513 {
13514 ;
13515 }
13516 else
13517 {
13518 clib_warning ("parse error '%U'", format_unformat_error, input);
13519 return -99;
13520 }
Filip Tehlar195bcee2016-05-13 17:37:35 +020013521 }
13522
Dave Barach72d72232016-08-04 10:15:08 -040013523 if (0 == eid_set)
13524 {
13525 errmsg ("missing params!");
13526 return -99;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013527 }
13528
Dave Barach72d72232016-08-04 10:15:08 -040013529 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
13530 {
13531 errmsg ("no action set for negative map-reply!");
13532 return -99;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013533 }
13534
Filip Tehlar3fa0af52016-09-27 13:28:01 +020013535 data_len = vec_len (rlocs) * sizeof (rloc_t);
13536
13537 M2 (LISP_ADD_DEL_REMOTE_MAPPING, lisp_add_del_remote_mapping, data_len);
Dave Barach72d72232016-08-04 10:15:08 -040013538 mp->is_add = is_add;
13539 mp->vni = htonl (vni);
13540 mp->action = (u8) action;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013541 mp->is_src_dst = seid_set;
Dave Barach72d72232016-08-04 10:15:08 -040013542 mp->eid_len = eid->len;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013543 mp->seid_len = seid->len;
Dave Barach72d72232016-08-04 10:15:08 -040013544 mp->del_all = del_all;
13545 mp->eid_type = eid->type;
13546 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013547 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
Filip Tehlar195bcee2016-05-13 17:37:35 +020013548
Filip Tehlare3552c42016-08-26 12:44:38 +020013549 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
Filip Tehlar3fa0af52016-09-27 13:28:01 +020013550 clib_memcpy (mp->rlocs, rlocs, data_len);
Dave Barach72d72232016-08-04 10:15:08 -040013551 vec_free (rlocs);
Filip Tehlar195bcee2016-05-13 17:37:35 +020013552
Dave Barach72d72232016-08-04 10:15:08 -040013553 /* send it... */
13554 S;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013555
Dave Barach72d72232016-08-04 10:15:08 -040013556 /* Wait for a reply... */
13557 W;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013558
Dave Barach72d72232016-08-04 10:15:08 -040013559 /* NOTREACHED */
13560 return 0;
Filip Tehlar195bcee2016-05-13 17:37:35 +020013561}
13562
Florin Corasf727db92016-06-23 15:01:58 +020013563/**
13564 * Add/del LISP adjacency. Saves mapping in LISP control plane and updates
13565 * forwarding entries in data-plane accordingly.
13566 *
13567 * @param vam vpp API test context
13568 * @return return code
13569 */
13570static int
13571api_lisp_add_del_adjacency (vat_main_t * vam)
13572{
Dave Barach72d72232016-08-04 10:15:08 -040013573 unformat_input_t *input = vam->input;
13574 vl_api_lisp_add_del_adjacency_t *mp;
13575 f64 timeout = ~0;
13576 u32 vni = 0;
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013577 ip4_address_t leid4, reid4;
13578 ip6_address_t leid6, reid6;
13579 u8 reid_mac[6] = { 0 };
13580 u8 leid_mac[6] = { 0 };
13581 u8 reid_type, leid_type;
13582 u32 leid_len = 0, reid_len = 0, len;
Dave Barach72d72232016-08-04 10:15:08 -040013583 u8 is_add = 1;
Florin Corasf727db92016-06-23 15:01:58 +020013584
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013585 leid_type = reid_type = (u8) ~ 0;
Florin Corasf727db92016-06-23 15:01:58 +020013586
Dave Barach72d72232016-08-04 10:15:08 -040013587 /* Parse args required to build the message */
13588 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13589 {
13590 if (unformat (input, "del"))
13591 {
13592 is_add = 0;
13593 }
13594 else if (unformat (input, "add"))
13595 {
13596 is_add = 1;
13597 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013598 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
13599 &reid4, &len))
Dave Barach72d72232016-08-04 10:15:08 -040013600 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013601 reid_type = 0; /* ipv4 */
13602 reid_len = len;
Dave Barach72d72232016-08-04 10:15:08 -040013603 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013604 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
13605 &reid6, &len))
Dave Barach72d72232016-08-04 10:15:08 -040013606 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013607 reid_type = 1; /* ipv6 */
13608 reid_len = len;
Dave Barach72d72232016-08-04 10:15:08 -040013609 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013610 else if (unformat (input, "reid %U", unformat_ethernet_address,
13611 reid_mac))
Dave Barach72d72232016-08-04 10:15:08 -040013612 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013613 reid_type = 2; /* mac */
Dave Barach72d72232016-08-04 10:15:08 -040013614 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013615 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
13616 &leid4, &len))
Dave Barach72d72232016-08-04 10:15:08 -040013617 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013618 leid_type = 0; /* ipv4 */
13619 leid_len = len;
Dave Barach72d72232016-08-04 10:15:08 -040013620 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013621 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
13622 &leid6, &len))
Dave Barach72d72232016-08-04 10:15:08 -040013623 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013624 leid_type = 1; /* ipv6 */
13625 leid_len = len;
Dave Barach72d72232016-08-04 10:15:08 -040013626 }
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013627 else if (unformat (input, "leid %U", unformat_ethernet_address,
13628 leid_mac))
Dave Barach72d72232016-08-04 10:15:08 -040013629 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013630 leid_type = 2; /* mac */
Dave Barach72d72232016-08-04 10:15:08 -040013631 }
13632 else if (unformat (input, "vni %d", &vni))
13633 {
13634 ;
13635 }
13636 else
13637 {
13638 errmsg ("parse error '%U'", format_unformat_error, input);
13639 return -99;
13640 }
Florin Corasf727db92016-06-23 15:01:58 +020013641 }
13642
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013643 if ((u8) ~ 0 == reid_type)
Dave Barach72d72232016-08-04 10:15:08 -040013644 {
13645 errmsg ("missing params!");
13646 return -99;
Florin Corasf727db92016-06-23 15:01:58 +020013647 }
13648
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013649 if (leid_type != reid_type)
Dave Barach72d72232016-08-04 10:15:08 -040013650 {
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013651 errmsg ("remote and local EIDs are of different types!");
Dave Barach72d72232016-08-04 10:15:08 -040013652 return -99;
Florin Corasf727db92016-06-23 15:01:58 +020013653 }
13654
Dave Barach72d72232016-08-04 10:15:08 -040013655 M (LISP_ADD_DEL_ADJACENCY, lisp_add_del_adjacency);
13656 mp->is_add = is_add;
13657 mp->vni = htonl (vni);
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013658 mp->leid_len = leid_len;
13659 mp->reid_len = reid_len;
13660 mp->eid_type = reid_type;
Florin Corasf727db92016-06-23 15:01:58 +020013661
Dave Barach72d72232016-08-04 10:15:08 -040013662 switch (mp->eid_type)
13663 {
Florin Corasf727db92016-06-23 15:01:58 +020013664 case 0:
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013665 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
13666 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
Dave Barach72d72232016-08-04 10:15:08 -040013667 break;
Florin Corasf727db92016-06-23 15:01:58 +020013668 case 1:
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013669 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
13670 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
Dave Barach72d72232016-08-04 10:15:08 -040013671 break;
Florin Corasf727db92016-06-23 15:01:58 +020013672 case 2:
Filip Tehlar2fdaece2016-09-28 14:27:59 +020013673 clib_memcpy (mp->leid, leid_mac, 6);
13674 clib_memcpy (mp->reid, reid_mac, 6);
Dave Barach72d72232016-08-04 10:15:08 -040013675 break;
Florin Corasf727db92016-06-23 15:01:58 +020013676 default:
Dave Barach72d72232016-08-04 10:15:08 -040013677 errmsg ("unknown EID type %d!", mp->eid_type);
13678 return 0;
Florin Corasf727db92016-06-23 15:01:58 +020013679 }
13680
Dave Barach72d72232016-08-04 10:15:08 -040013681 /* send it... */
13682 S;
Florin Corasf727db92016-06-23 15:01:58 +020013683
Dave Barach72d72232016-08-04 10:15:08 -040013684 /* Wait for a reply... */
13685 W;
Florin Corasf727db92016-06-23 15:01:58 +020013686
Dave Barach72d72232016-08-04 10:15:08 -040013687 /* NOTREACHED */
13688 return 0;
Florin Corasf727db92016-06-23 15:01:58 +020013689}
13690
Filip Tehlar46d4e362016-05-09 09:39:26 +020013691static int
Dave Barach72d72232016-08-04 10:15:08 -040013692api_lisp_gpe_add_del_iface (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013693{
Dave Barach72d72232016-08-04 10:15:08 -040013694 unformat_input_t *input = vam->input;
13695 vl_api_lisp_gpe_add_del_iface_t *mp;
13696 f64 timeout = ~0;
Florin Coras7fbfad32016-08-05 16:57:33 +020013697 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
Dave Barach839fe3e2016-08-10 11:35:54 -040013698 u32 dp_table = 0, vni = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013699
Dave Barach72d72232016-08-04 10:15:08 -040013700 /* Parse args required to build the message */
13701 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13702 {
13703 if (unformat (input, "up"))
13704 {
Florin Coras7fbfad32016-08-05 16:57:33 +020013705 action_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013706 is_add = 1;
13707 }
13708 else if (unformat (input, "down"))
13709 {
Florin Coras7fbfad32016-08-05 16:57:33 +020013710 action_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013711 is_add = 0;
13712 }
13713 else if (unformat (input, "table_id %d", &dp_table))
13714 {
Florin Coras7fbfad32016-08-05 16:57:33 +020013715 dp_table_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013716 }
13717 else if (unformat (input, "bd_id %d", &dp_table))
13718 {
Dave Barach839fe3e2016-08-10 11:35:54 -040013719 dp_table_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013720 is_l2 = 1;
13721 }
13722 else if (unformat (input, "vni %d", &vni))
13723 {
Florin Coras7fbfad32016-08-05 16:57:33 +020013724 vni_set = 1;
Dave Barach72d72232016-08-04 10:15:08 -040013725 }
13726 else
13727 break;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013728 }
13729
Florin Coras7fbfad32016-08-05 16:57:33 +020013730 if (action_set == 0)
Dave Barach72d72232016-08-04 10:15:08 -040013731 {
Florin Coras7fbfad32016-08-05 16:57:33 +020013732 errmsg ("Action not set\n");
13733 return -99;
13734 }
13735 if (dp_table_set == 0 || vni_set == 0)
13736 {
13737 errmsg ("vni and dp_table must be set\n");
Dave Barach72d72232016-08-04 10:15:08 -040013738 return -99;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013739 }
13740
Dave Barach72d72232016-08-04 10:15:08 -040013741 /* Construct the API message */
13742 M (LISP_GPE_ADD_DEL_IFACE, lisp_gpe_add_del_iface);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013743
Dave Barach72d72232016-08-04 10:15:08 -040013744 mp->is_add = is_add;
13745 mp->dp_table = dp_table;
13746 mp->is_l2 = is_l2;
13747 mp->vni = vni;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013748
Dave Barach72d72232016-08-04 10:15:08 -040013749 /* send it... */
13750 S;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013751
Dave Barach72d72232016-08-04 10:15:08 -040013752 /* Wait for a reply... */
13753 W;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013754
Dave Barach72d72232016-08-04 10:15:08 -040013755 /* NOTREACHED */
13756 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013757}
13758
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020013759/**
13760 * Add/del map request itr rlocs from LISP control plane and updates
13761 *
13762 * @param vam vpp API test context
13763 * @return return code
13764 */
13765static int
Dave Barach72d72232016-08-04 10:15:08 -040013766api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam)
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020013767{
Dave Barach72d72232016-08-04 10:15:08 -040013768 unformat_input_t *input = vam->input;
13769 vl_api_lisp_add_del_map_request_itr_rlocs_t *mp;
13770 f64 timeout = ~0;
13771 u8 *locator_set_name = 0;
13772 u8 locator_set_name_set = 0;
13773 u8 is_add = 1;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020013774
Dave Barach72d72232016-08-04 10:15:08 -040013775 /* Parse args required to build the message */
13776 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020013777 {
Dave Barach72d72232016-08-04 10:15:08 -040013778 if (unformat (input, "del"))
13779 {
13780 is_add = 0;
13781 }
13782 else if (unformat (input, "%_%v%_", &locator_set_name))
13783 {
13784 locator_set_name_set = 1;
13785 }
13786 else
13787 {
13788 clib_warning ("parse error '%U'", format_unformat_error, input);
13789 return -99;
13790 }
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013791 }
13792
Dave Barach72d72232016-08-04 10:15:08 -040013793 if (is_add && !locator_set_name_set)
13794 {
13795 errmsg ("itr-rloc is not set!");
Andrej Kozemcakd9831182016-06-20 08:47:57 +020013796 return -99;
13797 }
13798
Dave Barach72d72232016-08-04 10:15:08 -040013799 if (is_add && vec_len (locator_set_name) > 64)
Filip Tehlar2f653d02016-07-13 13:17:15 +020013800 {
Dave Barach72d72232016-08-04 10:15:08 -040013801 errmsg ("itr-rloc locator-set name too long\n");
13802 vec_free (locator_set_name);
13803 return -99;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013804 }
13805
Dave Barach72d72232016-08-04 10:15:08 -040013806 M (LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS, lisp_add_del_map_request_itr_rlocs);
13807 mp->is_add = is_add;
13808 if (is_add)
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013809 {
Dave Barach72d72232016-08-04 10:15:08 -040013810 clib_memcpy (mp->locator_set_name, locator_set_name,
13811 vec_len (locator_set_name));
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013812 }
Dave Barach72d72232016-08-04 10:15:08 -040013813 else
13814 {
13815 memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013816 }
Dave Barach72d72232016-08-04 10:15:08 -040013817 vec_free (locator_set_name);
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013818
Dave Barach72d72232016-08-04 10:15:08 -040013819 /* send it... */
13820 S;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013821
Dave Barach72d72232016-08-04 10:15:08 -040013822 /* Wait for a reply... */
13823 W;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013824
Dave Barach72d72232016-08-04 10:15:08 -040013825 /* NOTREACHED */
13826 return 0;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013827}
13828
13829static int
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013830api_lisp_locator_dump (vat_main_t * vam)
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013831{
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013832 unformat_input_t *input = vam->input;
Dave Barach72d72232016-08-04 10:15:08 -040013833 vl_api_lisp_locator_dump_t *mp;
13834 f64 timeout = ~0;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013835 u8 is_index_set = 0, is_name_set = 0;
13836 u8 *ls_name = 0;
13837 u32 ls_index = ~0;
13838
13839 /* Parse args required to build the message */
13840 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13841 {
13842 if (unformat (input, "ls_name %_%v%_", &ls_name))
13843 {
13844 is_name_set = 1;
13845 }
13846 else if (unformat (input, "ls_index %d", &ls_index))
13847 {
13848 is_index_set = 1;
13849 }
13850 else
13851 {
13852 errmsg ("parse error '%U'", format_unformat_error, input);
13853 return -99;
13854 }
13855 }
13856
13857 if (!is_index_set && !is_name_set)
13858 {
13859 errmsg ("error: expected one of index or name!\n");
13860 return -99;
13861 }
13862
13863 if (is_index_set && is_name_set)
13864 {
13865 errmsg ("error: only one param expected!\n");
13866 return -99;
13867 }
13868
Florin Coras042d2122016-09-21 16:38:19 +020013869 if (vec_len (ls_name) > 62)
Filip Tehlarf07fb712016-09-20 12:37:09 +020013870 {
13871 errmsg ("error: locator set name too long!");
13872 return -99;
13873 }
13874
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013875 if (!vam->json_output)
13876 {
13877 fformat (vam->ofp, "%=16s%=16s%=16s\n", "locator", "priority",
13878 "weight");
13879 }
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013880
Dave Barach72d72232016-08-04 10:15:08 -040013881 M (LISP_LOCATOR_DUMP, lisp_locator_dump);
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013882 mp->is_index_set = is_index_set;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013883
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013884 if (is_index_set)
13885 mp->ls_index = clib_host_to_net_u32 (ls_index);
13886 else
13887 {
13888 vec_add1 (ls_name, 0);
Florin Coras042d2122016-09-21 16:38:19 +020013889 strncpy ((char *) mp->ls_name, (char *) ls_name,
13890 sizeof (mp->ls_name) - 1);
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013891 }
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013892
Dave Barach72d72232016-08-04 10:15:08 -040013893 /* send it... */
13894 S;
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020013895
Dave Barach72d72232016-08-04 10:15:08 -040013896 /* Use a control ping for synchronization */
13897 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013898 vl_api_control_ping_t *mp;
13899 M (CONTROL_PING, control_ping);
Dave Barach72d72232016-08-04 10:15:08 -040013900 S;
13901 }
13902 /* Wait for a reply... */
13903 W;
Dave Barach72d72232016-08-04 10:15:08 -040013904
13905 /* NOTREACHED */
13906 return 0;
13907}
13908
13909static int
13910api_lisp_locator_set_dump (vat_main_t * vam)
13911{
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013912 vl_api_lisp_locator_set_dump_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -040013913 unformat_input_t *input = vam->input;
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013914 f64 timeout = ~0;
Dave Barach72d72232016-08-04 10:15:08 -040013915 u8 filter = 0;
Dave Barach72d72232016-08-04 10:15:08 -040013916
13917 /* Parse args required to build the message */
13918 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13919 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013920 if (unformat (input, "local"))
Dave Barach72d72232016-08-04 10:15:08 -040013921 {
13922 filter = 1;
13923 }
13924 else if (unformat (input, "remote"))
13925 {
13926 filter = 2;
13927 }
13928 else
13929 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013930 errmsg ("parse error '%U'", format_unformat_error, input);
13931 return -99;
Dave Barach72d72232016-08-04 10:15:08 -040013932 }
13933 }
13934
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013935 if (!vam->json_output)
Dave Barach72d72232016-08-04 10:15:08 -040013936 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013937 fformat (vam->ofp, "%=10s%=15s\n", "ls_index", "ls_name");
Dave Barach72d72232016-08-04 10:15:08 -040013938 }
13939
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013940 M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
Dave Barach72d72232016-08-04 10:15:08 -040013941
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013942 mp->filter = filter;
Dave Barach72d72232016-08-04 10:15:08 -040013943
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020013944 /* send it... */
13945 S;
13946
13947 /* Use a control ping for synchronization */
13948 {
13949 vl_api_control_ping_t *mp;
13950 M (CONTROL_PING, control_ping);
13951 S;
13952 }
13953 /* Wait for a reply... */
13954 W;
13955
13956 /* NOTREACHED */
13957 return 0;
Dave Barach72d72232016-08-04 10:15:08 -040013958}
13959
13960static int
13961api_lisp_eid_table_map_dump (vat_main_t * vam)
13962{
Filip Tehlarc0681792016-08-24 14:11:07 +020013963 u8 is_l2 = 0;
13964 u8 mode_set = 0;
13965 unformat_input_t *input = vam->input;
Dave Barach72d72232016-08-04 10:15:08 -040013966 vl_api_lisp_eid_table_map_dump_t *mp;
13967 f64 timeout = ~0;
13968
Filip Tehlarc0681792016-08-24 14:11:07 +020013969 /* Parse args required to build the message */
13970 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
13971 {
13972 if (unformat (input, "l2"))
13973 {
13974 is_l2 = 1;
13975 mode_set = 1;
13976 }
13977 else if (unformat (input, "l3"))
13978 {
13979 is_l2 = 0;
13980 mode_set = 1;
13981 }
13982 else
13983 {
13984 errmsg ("parse error '%U'", format_unformat_error, input);
13985 return -99;
13986 }
13987 }
13988
13989 if (!mode_set)
13990 {
13991 errmsg ("expected one of 'l2' or 'l3' parameter!\n");
13992 return -99;
13993 }
13994
Dave Barach72d72232016-08-04 10:15:08 -040013995 if (!vam->json_output)
13996 {
Filip Tehlarc0681792016-08-24 14:11:07 +020013997 fformat (vam->ofp, "%=10s%=10s\n", "VNI", is_l2 ? "BD" : "VRF");
Dave Barach72d72232016-08-04 10:15:08 -040013998 }
13999
14000 M (LISP_EID_TABLE_MAP_DUMP, lisp_eid_table_map_dump);
Filip Tehlarc0681792016-08-24 14:11:07 +020014001 mp->is_l2 = is_l2;
Dave Barach72d72232016-08-04 10:15:08 -040014002
14003 /* send it... */
14004 S;
14005
14006 /* Use a control ping for synchronization */
14007 {
14008 vl_api_control_ping_t *mp;
14009 M (CONTROL_PING, control_ping);
14010 S;
14011 }
14012 /* Wait for a reply... */
14013 W;
14014
14015 /* NOTREACHED */
14016 return 0;
14017}
14018
14019static int
Filip Tehlar50a4e142016-08-24 11:28:02 +020014020api_lisp_eid_table_vni_dump (vat_main_t * vam)
14021{
14022 vl_api_lisp_eid_table_vni_dump_t *mp;
14023 f64 timeout = ~0;
14024
14025 if (!vam->json_output)
14026 {
14027 fformat (vam->ofp, "VNI\n");
14028 }
14029
14030 M (LISP_EID_TABLE_VNI_DUMP, lisp_eid_table_vni_dump);
14031
14032 /* send it... */
14033 S;
14034
14035 /* Use a control ping for synchronization */
14036 {
14037 vl_api_control_ping_t *mp;
14038 M (CONTROL_PING, control_ping);
14039 S;
14040 }
14041 /* Wait for a reply... */
14042 W;
14043
14044 /* NOTREACHED */
14045 return 0;
14046}
14047
14048static int
Dave Barach72d72232016-08-04 10:15:08 -040014049api_lisp_eid_table_dump (vat_main_t * vam)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014050{
Dave Barach72d72232016-08-04 10:15:08 -040014051 unformat_input_t *i = vam->input;
14052 vl_api_lisp_eid_table_dump_t *mp;
14053 f64 timeout = ~0;
14054 struct in_addr ip4;
14055 struct in6_addr ip6;
14056 u8 mac[6];
14057 u8 eid_type = ~0, eid_set = 0;
14058 u32 prefix_length = ~0, t, vni = 0;
14059 u8 filter = 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014060
Dave Barach72d72232016-08-04 10:15:08 -040014061 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014062 {
Dave Barach72d72232016-08-04 10:15:08 -040014063 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
14064 {
14065 eid_set = 1;
14066 eid_type = 0;
14067 prefix_length = t;
14068 }
14069 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
14070 {
14071 eid_set = 1;
14072 eid_type = 1;
14073 prefix_length = t;
14074 }
14075 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
14076 {
14077 eid_set = 1;
14078 eid_type = 2;
14079 }
14080 else if (unformat (i, "vni %d", &t))
14081 {
14082 vni = t;
14083 }
14084 else if (unformat (i, "local"))
14085 {
14086 filter = 1;
14087 }
14088 else if (unformat (i, "remote"))
14089 {
14090 filter = 2;
14091 }
14092 else
14093 {
14094 errmsg ("parse error '%U'", format_unformat_error, i);
14095 return -99;
14096 }
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014097 }
14098
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020014099 if (!vam->json_output)
14100 {
14101 fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type",
14102 "ls_index", "ttl", "authoritative");
14103 }
14104
Dave Barach72d72232016-08-04 10:15:08 -040014105 M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump);
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014106
Dave Barach72d72232016-08-04 10:15:08 -040014107 mp->filter = filter;
14108 if (eid_set)
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014109 {
Dave Barach72d72232016-08-04 10:15:08 -040014110 mp->eid_set = 1;
14111 mp->vni = htonl (vni);
14112 mp->eid_type = eid_type;
14113 switch (eid_type)
14114 {
14115 case 0:
14116 mp->prefix_length = prefix_length;
14117 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
14118 break;
14119 case 1:
14120 mp->prefix_length = prefix_length;
14121 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
14122 break;
14123 case 2:
14124 clib_memcpy (mp->eid, mac, sizeof (mac));
14125 break;
14126 default:
14127 errmsg ("unknown EID type %d!", eid_type);
14128 return -99;
14129 }
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014130 }
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014131
Dave Barach72d72232016-08-04 10:15:08 -040014132 /* send it... */
14133 S;
14134
14135 /* Use a control ping for synchronization */
14136 {
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020014137 vl_api_control_ping_t *mp;
14138 M (CONTROL_PING, control_ping);
Dave Barach72d72232016-08-04 10:15:08 -040014139 S;
14140 }
14141
14142 /* Wait for a reply... */
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020014143 W;
Dave Barach72d72232016-08-04 10:15:08 -040014144
14145 /* NOTREACHED */
14146 return 0;
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020014147}
14148
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014149static int
Dave Barach72d72232016-08-04 10:15:08 -040014150api_lisp_gpe_tunnel_dump (vat_main_t * vam)
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014151{
Dave Barach72d72232016-08-04 10:15:08 -040014152 vl_api_lisp_gpe_tunnel_dump_t *mp;
14153 f64 timeout = ~0;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014154
Dave Barach72d72232016-08-04 10:15:08 -040014155 if (!vam->json_output)
14156 {
14157 fformat (vam->ofp, "%=20s%=30s%=16s%=16s%=16s%=16s"
14158 "%=16s%=16s%=16s%=16s%=16s\n",
14159 "Tunel", "Source", "Destination", "Fib encap", "Fib decap",
14160 "Decap next", "Lisp version", "Flags", "Next protocol",
14161 "ver_res", "res", "iid");
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014162 }
14163
Dave Barach72d72232016-08-04 10:15:08 -040014164 M (LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump);
14165 /* send it... */
14166 S;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014167
Dave Barach72d72232016-08-04 10:15:08 -040014168 /* Use a control ping for synchronization */
14169 {
14170 vl_api_control_ping_t *mp;
14171 M (CONTROL_PING, control_ping);
14172 S;
14173 }
14174 /* Wait for a reply... */
14175 W;
14176
14177 /* NOTREACHED */
14178 return 0;
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020014179}
14180
Matus Fabian8a95a482016-05-06 15:14:13 +020014181static int
Filip Tehlar69a9b762016-09-23 10:00:52 +020014182api_lisp_adjacencies_get (vat_main_t * vam)
14183{
14184 unformat_input_t *i = vam->input;
14185 vl_api_lisp_adjacencies_get_t *mp;
14186 f64 timeout = ~0;
14187 u8 vni_set = 0;
14188 u32 vni = ~0;
14189
14190 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14191 {
14192 if (unformat (i, "vni %d", &vni))
14193 {
14194 vni_set = 1;
14195 }
14196 else
14197 {
14198 errmsg ("parse error '%U'\n", format_unformat_error, i);
14199 return -99;
14200 }
14201 }
14202
14203 if (!vni_set)
14204 {
14205 errmsg ("vni not set!\n");
14206 return -99;
14207 }
14208
14209 if (!vam->json_output)
14210 {
14211 fformat (vam->ofp, "%s %40s\n", "leid", "reid");
14212 }
14213
14214 M (LISP_ADJACENCIES_GET, lisp_adjacencies_get);
14215 mp->vni = clib_host_to_net_u32 (vni);
14216
14217 /* send it... */
14218 S;
14219
14220 /* Wait for a reply... */
14221 W;
14222
14223 /* NOTREACHED */
14224 return 0;
14225}
14226
14227static int
Dave Barach72d72232016-08-04 10:15:08 -040014228api_lisp_map_resolver_dump (vat_main_t * vam)
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020014229{
Dave Barach72d72232016-08-04 10:15:08 -040014230 vl_api_lisp_map_resolver_dump_t *mp;
14231 f64 timeout = ~0;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020014232
Dave Barach72d72232016-08-04 10:15:08 -040014233 if (!vam->json_output)
14234 {
14235 fformat (vam->ofp, "%=20s\n", "Map resolver");
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020014236 }
14237
Dave Barach72d72232016-08-04 10:15:08 -040014238 M (LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump);
14239 /* send it... */
14240 S;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020014241
Dave Barach72d72232016-08-04 10:15:08 -040014242 /* Use a control ping for synchronization */
14243 {
14244 vl_api_control_ping_t *mp;
14245 M (CONTROL_PING, control_ping);
14246 S;
14247 }
14248 /* Wait for a reply... */
14249 W;
14250
14251 /* NOTREACHED */
14252 return 0;
14253}
14254
14255static int
14256api_show_lisp_status (vat_main_t * vam)
14257{
14258 vl_api_show_lisp_status_t *mp;
14259 f64 timeout = ~0;
14260
14261 if (!vam->json_output)
14262 {
14263 fformat (vam->ofp, "%-20s%-16s\n", "lisp status", "locator-set");
14264 }
14265
14266 M (SHOW_LISP_STATUS, show_lisp_status);
14267 /* send it... */
14268 S;
14269 /* Wait for a reply... */
14270 W;
14271
14272 /* NOTREACHED */
14273 return 0;
14274}
14275
14276static int
14277api_lisp_get_map_request_itr_rlocs (vat_main_t * vam)
14278{
14279 vl_api_lisp_get_map_request_itr_rlocs_t *mp;
14280 f64 timeout = ~0;
14281
14282 if (!vam->json_output)
14283 {
14284 fformat (vam->ofp, "%=20s\n", "itr-rlocs:");
14285 }
14286
14287 M (LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs);
14288 /* send it... */
14289 S;
14290 /* Wait for a reply... */
14291 W;
14292
14293 /* NOTREACHED */
14294 return 0;
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020014295}
14296
14297static int
Matus Fabian8a95a482016-05-06 15:14:13 +020014298api_af_packet_create (vat_main_t * vam)
14299{
Dave Barach72d72232016-08-04 10:15:08 -040014300 unformat_input_t *i = vam->input;
14301 vl_api_af_packet_create_t *mp;
14302 f64 timeout;
14303 u8 *host_if_name = 0;
14304 u8 hw_addr[6];
14305 u8 random_hw_addr = 1;
Matus Fabian8a95a482016-05-06 15:14:13 +020014306
Dave Barach72d72232016-08-04 10:15:08 -040014307 memset (hw_addr, 0, sizeof (hw_addr));
Matus Fabian8a95a482016-05-06 15:14:13 +020014308
Dave Barach72d72232016-08-04 10:15:08 -040014309 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14310 {
14311 if (unformat (i, "name %s", &host_if_name))
14312 vec_add1 (host_if_name, 0);
14313 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14314 random_hw_addr = 0;
14315 else
14316 break;
Matus Fabian8a95a482016-05-06 15:14:13 +020014317 }
14318
Dave Barach72d72232016-08-04 10:15:08 -040014319 if (!vec_len (host_if_name))
14320 {
14321 errmsg ("host-interface name must be specified");
14322 return -99;
Matus Fabian8a95a482016-05-06 15:14:13 +020014323 }
14324
Dave Barach72d72232016-08-04 10:15:08 -040014325 if (vec_len (host_if_name) > 64)
14326 {
14327 errmsg ("host-interface name too long");
14328 return -99;
Matus Fabian8a95a482016-05-06 15:14:13 +020014329 }
14330
Dave Barach72d72232016-08-04 10:15:08 -040014331 M (AF_PACKET_CREATE, af_packet_create);
Matus Fabian8a95a482016-05-06 15:14:13 +020014332
Dave Barach72d72232016-08-04 10:15:08 -040014333 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14334 clib_memcpy (mp->hw_addr, hw_addr, 6);
14335 mp->use_random_hw_addr = random_hw_addr;
14336 vec_free (host_if_name);
Matus Fabian8a95a482016-05-06 15:14:13 +020014337
Dave Barach72d72232016-08-04 10:15:08 -040014338 S;
14339 W2 (fprintf (vam->ofp, " new sw_if_index = %d ", vam->sw_if_index));
14340 /* NOTREACHED */
14341 return 0;
Matus Fabian8a95a482016-05-06 15:14:13 +020014342}
14343
14344static int
14345api_af_packet_delete (vat_main_t * vam)
14346{
Dave Barach72d72232016-08-04 10:15:08 -040014347 unformat_input_t *i = vam->input;
14348 vl_api_af_packet_delete_t *mp;
14349 f64 timeout;
14350 u8 *host_if_name = 0;
Matus Fabian8a95a482016-05-06 15:14:13 +020014351
Dave Barach72d72232016-08-04 10:15:08 -040014352 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14353 {
14354 if (unformat (i, "name %s", &host_if_name))
14355 vec_add1 (host_if_name, 0);
14356 else
14357 break;
Matus Fabian8a95a482016-05-06 15:14:13 +020014358 }
14359
Dave Barach72d72232016-08-04 10:15:08 -040014360 if (!vec_len (host_if_name))
14361 {
14362 errmsg ("host-interface name must be specified");
14363 return -99;
Matus Fabian8a95a482016-05-06 15:14:13 +020014364 }
14365
Dave Barach72d72232016-08-04 10:15:08 -040014366 if (vec_len (host_if_name) > 64)
14367 {
14368 errmsg ("host-interface name too long");
14369 return -99;
Matus Fabian8a95a482016-05-06 15:14:13 +020014370 }
14371
Dave Barach72d72232016-08-04 10:15:08 -040014372 M (AF_PACKET_DELETE, af_packet_delete);
Matus Fabian8a95a482016-05-06 15:14:13 +020014373
Dave Barach72d72232016-08-04 10:15:08 -040014374 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
14375 vec_free (host_if_name);
Matus Fabian8a95a482016-05-06 15:14:13 +020014376
Dave Barach72d72232016-08-04 10:15:08 -040014377 S;
14378 W;
14379 /* NOTREACHED */
14380 return 0;
Matus Fabian8a95a482016-05-06 15:14:13 +020014381}
14382
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014383static int
14384api_policer_add_del (vat_main_t * vam)
14385{
Dave Barach72d72232016-08-04 10:15:08 -040014386 unformat_input_t *i = vam->input;
14387 vl_api_policer_add_del_t *mp;
14388 f64 timeout;
14389 u8 is_add = 1;
14390 u8 *name = 0;
14391 u32 cir = 0;
14392 u32 eir = 0;
14393 u64 cb = 0;
14394 u64 eb = 0;
14395 u8 rate_type = 0;
14396 u8 round_type = 0;
14397 u8 type = 0;
14398 u8 color_aware = 0;
14399 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014400
Dave Barach839fe3e2016-08-10 11:35:54 -040014401 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
14402 conform_action.dscp = 0;
14403 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
14404 exceed_action.dscp = 0;
14405 violate_action.action_type = SSE2_QOS_ACTION_DROP;
14406 violate_action.dscp = 0;
14407
Dave Barach72d72232016-08-04 10:15:08 -040014408 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14409 {
14410 if (unformat (i, "del"))
14411 is_add = 0;
14412 else if (unformat (i, "name %s", &name))
14413 vec_add1 (name, 0);
14414 else if (unformat (i, "cir %u", &cir))
14415 ;
14416 else if (unformat (i, "eir %u", &eir))
14417 ;
14418 else if (unformat (i, "cb %u", &cb))
14419 ;
14420 else if (unformat (i, "eb %u", &eb))
14421 ;
14422 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
14423 &rate_type))
14424 ;
14425 else if (unformat (i, "round_type %U", unformat_policer_round_type,
14426 &round_type))
14427 ;
14428 else if (unformat (i, "type %U", unformat_policer_type, &type))
14429 ;
14430 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
14431 &conform_action))
14432 ;
14433 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
14434 &exceed_action))
14435 ;
14436 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
14437 &violate_action))
14438 ;
14439 else if (unformat (i, "color-aware"))
14440 color_aware = 1;
14441 else
14442 break;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014443 }
14444
Dave Barach72d72232016-08-04 10:15:08 -040014445 if (!vec_len (name))
14446 {
14447 errmsg ("policer name must be specified");
14448 return -99;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014449 }
14450
Dave Barach72d72232016-08-04 10:15:08 -040014451 if (vec_len (name) > 64)
14452 {
14453 errmsg ("policer name too long");
14454 return -99;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014455 }
14456
Dave Barach72d72232016-08-04 10:15:08 -040014457 M (POLICER_ADD_DEL, policer_add_del);
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014458
Dave Barach72d72232016-08-04 10:15:08 -040014459 clib_memcpy (mp->name, name, vec_len (name));
14460 vec_free (name);
14461 mp->is_add = is_add;
14462 mp->cir = cir;
14463 mp->eir = eir;
14464 mp->cb = cb;
14465 mp->eb = eb;
14466 mp->rate_type = rate_type;
14467 mp->round_type = round_type;
14468 mp->type = type;
14469 mp->conform_action_type = conform_action.action_type;
14470 mp->conform_dscp = conform_action.dscp;
14471 mp->exceed_action_type = exceed_action.action_type;
14472 mp->exceed_dscp = exceed_action.dscp;
14473 mp->violate_action_type = violate_action.action_type;
14474 mp->violate_dscp = violate_action.dscp;
14475 mp->color_aware = color_aware;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014476
Dave Barach72d72232016-08-04 10:15:08 -040014477 S;
14478 W;
14479 /* NOTREACHED */
14480 return 0;
Matus Fabian65fcd4d2016-05-13 05:44:48 -070014481}
14482
Matus Fabian82e29c42016-05-11 04:49:46 -070014483static int
Dave Barach72d72232016-08-04 10:15:08 -040014484api_policer_dump (vat_main_t * vam)
Matus Fabiane8554802016-05-18 23:40:37 -070014485{
Dave Barach72d72232016-08-04 10:15:08 -040014486 unformat_input_t *i = vam->input;
14487 vl_api_policer_dump_t *mp;
14488 f64 timeout = ~0;
14489 u8 *match_name = 0;
14490 u8 match_name_valid = 0;
Matus Fabiane8554802016-05-18 23:40:37 -070014491
Dave Barach72d72232016-08-04 10:15:08 -040014492 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
Matus Fabiane8554802016-05-18 23:40:37 -070014493 {
Dave Barach72d72232016-08-04 10:15:08 -040014494 if (unformat (i, "name %s", &match_name))
14495 {
14496 vec_add1 (match_name, 0);
14497 match_name_valid = 1;
14498 }
14499 else
14500 break;
Matus Fabiane8554802016-05-18 23:40:37 -070014501 }
Matus Fabiane8554802016-05-18 23:40:37 -070014502
Dave Barach72d72232016-08-04 10:15:08 -040014503 M (POLICER_DUMP, policer_dump);
14504 mp->match_name_valid = match_name_valid;
14505 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
14506 vec_free (match_name);
14507 /* send it... */
14508 S;
14509
14510 /* Use a control ping for synchronization */
14511 {
14512 vl_api_control_ping_t *mp;
14513 M (CONTROL_PING, control_ping);
14514 S;
14515 }
14516 /* Wait for a reply... */
14517 W;
14518
14519 /* NOTREACHED */
14520 return 0;
Matus Fabiane8554802016-05-18 23:40:37 -070014521}
14522
14523static int
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014524api_policer_classify_set_interface (vat_main_t * vam)
14525{
Dave Barach72d72232016-08-04 10:15:08 -040014526 unformat_input_t *i = vam->input;
14527 vl_api_policer_classify_set_interface_t *mp;
14528 f64 timeout;
14529 u32 sw_if_index;
14530 int sw_if_index_set;
14531 u32 ip4_table_index = ~0;
14532 u32 ip6_table_index = ~0;
14533 u32 l2_table_index = ~0;
14534 u8 is_add = 1;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014535
Dave Barach72d72232016-08-04 10:15:08 -040014536 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14537 {
14538 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
14539 sw_if_index_set = 1;
14540 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14541 sw_if_index_set = 1;
14542 else if (unformat (i, "del"))
14543 is_add = 0;
14544 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14545 ;
14546 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14547 ;
14548 else if (unformat (i, "l2-table %d", &l2_table_index))
14549 ;
14550 else
14551 {
14552 clib_warning ("parse error '%U'", format_unformat_error, i);
14553 return -99;
14554 }
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014555 }
14556
Dave Barach72d72232016-08-04 10:15:08 -040014557 if (sw_if_index_set == 0)
14558 {
14559 errmsg ("missing interface name or sw_if_index\n");
14560 return -99;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014561 }
14562
Dave Barach72d72232016-08-04 10:15:08 -040014563 M (POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface);
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014564
Dave Barach72d72232016-08-04 10:15:08 -040014565 mp->sw_if_index = ntohl (sw_if_index);
14566 mp->ip4_table_index = ntohl (ip4_table_index);
14567 mp->ip6_table_index = ntohl (ip6_table_index);
14568 mp->l2_table_index = ntohl (l2_table_index);
14569 mp->is_add = is_add;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014570
Dave Barach72d72232016-08-04 10:15:08 -040014571 S;
14572 W;
14573 /* NOTREACHED */
14574 return 0;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014575}
14576
14577static int
Dave Barach72d72232016-08-04 10:15:08 -040014578api_policer_classify_dump (vat_main_t * vam)
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014579{
Dave Barach72d72232016-08-04 10:15:08 -040014580 unformat_input_t *i = vam->input;
14581 vl_api_policer_classify_dump_t *mp;
14582 f64 timeout = ~0;
14583 u8 type = POLICER_CLASSIFY_N_TABLES;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014584
Juraj Sloboda506b2452016-08-07 23:45:24 -070014585 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
Dave Barach72d72232016-08-04 10:15:08 -040014586 ;
14587 else
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014588 {
Dave Barach72d72232016-08-04 10:15:08 -040014589 errmsg ("classify table type must be specified\n");
14590 return -99;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014591 }
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014592
Dave Barach72d72232016-08-04 10:15:08 -040014593 if (!vam->json_output)
14594 {
14595 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
14596 }
14597
14598 M (POLICER_CLASSIFY_DUMP, policer_classify_dump);
14599 mp->type = type;
14600 /* send it... */
14601 S;
14602
14603 /* Use a control ping for synchronization */
14604 {
14605 vl_api_control_ping_t *mp;
14606 M (CONTROL_PING, control_ping);
14607 S;
14608 }
14609 /* Wait for a reply... */
14610 W;
14611
14612 /* NOTREACHED */
14613 return 0;
Matus Fabian70e6a8d2016-06-20 08:10:42 -070014614}
14615
14616static int
Matus Fabian82e29c42016-05-11 04:49:46 -070014617api_netmap_create (vat_main_t * vam)
14618{
Dave Barach72d72232016-08-04 10:15:08 -040014619 unformat_input_t *i = vam->input;
14620 vl_api_netmap_create_t *mp;
14621 f64 timeout;
14622 u8 *if_name = 0;
14623 u8 hw_addr[6];
14624 u8 random_hw_addr = 1;
14625 u8 is_pipe = 0;
14626 u8 is_master = 0;
Matus Fabian82e29c42016-05-11 04:49:46 -070014627
Dave Barach72d72232016-08-04 10:15:08 -040014628 memset (hw_addr, 0, sizeof (hw_addr));
Matus Fabian82e29c42016-05-11 04:49:46 -070014629
Dave Barach72d72232016-08-04 10:15:08 -040014630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14631 {
14632 if (unformat (i, "name %s", &if_name))
14633 vec_add1 (if_name, 0);
14634 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
14635 random_hw_addr = 0;
14636 else if (unformat (i, "pipe"))
14637 is_pipe = 1;
14638 else if (unformat (i, "master"))
14639 is_master = 1;
14640 else if (unformat (i, "slave"))
14641 is_master = 0;
14642 else
14643 break;
Matus Fabian82e29c42016-05-11 04:49:46 -070014644 }
14645
Dave Barach72d72232016-08-04 10:15:08 -040014646 if (!vec_len (if_name))
14647 {
14648 errmsg ("interface name must be specified");
14649 return -99;
Matus Fabian82e29c42016-05-11 04:49:46 -070014650 }
14651
Dave Barach72d72232016-08-04 10:15:08 -040014652 if (vec_len (if_name) > 64)
14653 {
14654 errmsg ("interface name too long");
14655 return -99;
Matus Fabian82e29c42016-05-11 04:49:46 -070014656 }
14657
Dave Barach72d72232016-08-04 10:15:08 -040014658 M (NETMAP_CREATE, netmap_create);
Matus Fabian82e29c42016-05-11 04:49:46 -070014659
Dave Barach72d72232016-08-04 10:15:08 -040014660 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14661 clib_memcpy (mp->hw_addr, hw_addr, 6);
14662 mp->use_random_hw_addr = random_hw_addr;
14663 mp->is_pipe = is_pipe;
14664 mp->is_master = is_master;
14665 vec_free (if_name);
Matus Fabian82e29c42016-05-11 04:49:46 -070014666
Dave Barach72d72232016-08-04 10:15:08 -040014667 S;
14668 W;
14669 /* NOTREACHED */
14670 return 0;
Matus Fabian82e29c42016-05-11 04:49:46 -070014671}
14672
14673static int
14674api_netmap_delete (vat_main_t * vam)
14675{
Dave Barach72d72232016-08-04 10:15:08 -040014676 unformat_input_t *i = vam->input;
14677 vl_api_netmap_delete_t *mp;
14678 f64 timeout;
14679 u8 *if_name = 0;
Matus Fabian82e29c42016-05-11 04:49:46 -070014680
Dave Barach72d72232016-08-04 10:15:08 -040014681 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14682 {
14683 if (unformat (i, "name %s", &if_name))
14684 vec_add1 (if_name, 0);
14685 else
14686 break;
Matus Fabian82e29c42016-05-11 04:49:46 -070014687 }
14688
Dave Barach72d72232016-08-04 10:15:08 -040014689 if (!vec_len (if_name))
14690 {
14691 errmsg ("interface name must be specified");
14692 return -99;
Matus Fabian82e29c42016-05-11 04:49:46 -070014693 }
14694
Dave Barach72d72232016-08-04 10:15:08 -040014695 if (vec_len (if_name) > 64)
14696 {
14697 errmsg ("interface name too long");
14698 return -99;
Matus Fabian82e29c42016-05-11 04:49:46 -070014699 }
14700
Dave Barach72d72232016-08-04 10:15:08 -040014701 M (NETMAP_DELETE, netmap_delete);
Matus Fabian82e29c42016-05-11 04:49:46 -070014702
Dave Barach72d72232016-08-04 10:15:08 -040014703 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
14704 vec_free (if_name);
Matus Fabian82e29c42016-05-11 04:49:46 -070014705
Dave Barach72d72232016-08-04 10:15:08 -040014706 S;
14707 W;
14708 /* NOTREACHED */
14709 return 0;
Matus Fabian82e29c42016-05-11 04:49:46 -070014710}
14711
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014712static void vl_api_mpls_eth_tunnel_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040014713 (vl_api_mpls_eth_tunnel_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014714{
Dave Barach72d72232016-08-04 10:15:08 -040014715 vat_main_t *vam = &vat_main;
14716 i32 i;
14717 i32 len = ntohl (mp->nlabels);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014718
Dave Barach72d72232016-08-04 10:15:08 -040014719 fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ",
14720 ntohl (mp->tunnel_index),
14721 format_ethernet_address, &mp->tunnel_dst_mac,
14722 format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width));
14723 for (i = 0; i < len; i++)
14724 {
14725 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014726 }
Dave Barach72d72232016-08-04 10:15:08 -040014727 fformat (vam->ofp, "\n");
14728 fformat (vam->ofp, " tx on %d, rx fib index %d\n",
14729 ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014730}
14731
14732static void vl_api_mpls_eth_tunnel_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040014733 (vl_api_mpls_eth_tunnel_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014734{
Dave Barach72d72232016-08-04 10:15:08 -040014735 vat_main_t *vam = &vat_main;
14736 vat_json_node_t *node = NULL;
14737 struct in_addr ip4;
14738 i32 i;
14739 i32 len = ntohl (mp->nlabels);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014740
Dave Barach72d72232016-08-04 10:15:08 -040014741 if (VAT_JSON_ARRAY != vam->json_tree.type)
14742 {
14743 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14744 vat_json_init_array (&vam->json_tree);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014745 }
Dave Barach72d72232016-08-04 10:15:08 -040014746 node = vat_json_array_add (&vam->json_tree);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014747
Dave Barach72d72232016-08-04 10:15:08 -040014748 vat_json_init_object (node);
14749 vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index));
14750 clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4));
14751 vat_json_object_add_ip4 (node, "intfc_address", ip4);
14752 vat_json_object_add_uint (node, "inner_fib_index",
14753 ntohl (mp->inner_fib_index));
14754 vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width));
14755 vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index));
14756 vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index));
14757 vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only));
14758 vat_json_object_add_string_copy (node, "tunnel_dst_mac",
14759 format (0, "%U", format_ethernet_address,
14760 &mp->tunnel_dst_mac));
14761 vat_json_object_add_uint (node, "tx_sw_if_index",
14762 ntohl (mp->tx_sw_if_index));
14763 vat_json_object_add_uint (node, "label_count", len);
14764 for (i = 0; i < len; i++)
14765 {
14766 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014767 }
14768}
14769
Dave Barach72d72232016-08-04 10:15:08 -040014770static int
14771api_mpls_eth_tunnel_dump (vat_main_t * vam)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014772{
Dave Barach72d72232016-08-04 10:15:08 -040014773 vl_api_mpls_eth_tunnel_dump_t *mp;
14774 f64 timeout;
14775 i32 index = -1;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014776
Dave Barach72d72232016-08-04 10:15:08 -040014777 /* Parse args required to build the message */
14778 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014779 {
Dave Barach72d72232016-08-04 10:15:08 -040014780 if (!unformat (vam->input, "tunnel_index %d", &index))
14781 {
14782 index = -1;
14783 break;
14784 }
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014785 }
Dave Barach72d72232016-08-04 10:15:08 -040014786
14787 fformat (vam->ofp, " tunnel_index %d\n", index);
14788
14789 M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump);
14790 mp->tunnel_index = htonl (index);
14791 S;
14792
14793 /* Use a control ping for synchronization */
14794 {
14795 vl_api_control_ping_t *mp;
14796 M (CONTROL_PING, control_ping);
14797 S;
14798 }
14799 W;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014800}
14801
14802static void vl_api_mpls_fib_encap_details_t_handler
Dave Barach72d72232016-08-04 10:15:08 -040014803 (vl_api_mpls_fib_encap_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014804{
Dave Barach72d72232016-08-04 10:15:08 -040014805 vat_main_t *vam = &vat_main;
14806 i32 i;
14807 i32 len = ntohl (mp->nlabels);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014808
Dave Barach72d72232016-08-04 10:15:08 -040014809 fformat (vam->ofp, "table %d, dest %U, label ",
14810 ntohl (mp->fib_index), format_ip4_address, &mp->dest, len);
14811 for (i = 0; i < len; i++)
14812 {
14813 fformat (vam->ofp, "%u ", ntohl (mp->labels[i]));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014814 }
Dave Barach72d72232016-08-04 10:15:08 -040014815 fformat (vam->ofp, "\n");
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014816}
14817
14818static void vl_api_mpls_fib_encap_details_t_handler_json
Dave Barach72d72232016-08-04 10:15:08 -040014819 (vl_api_mpls_fib_encap_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014820{
Dave Barach72d72232016-08-04 10:15:08 -040014821 vat_main_t *vam = &vat_main;
14822 vat_json_node_t *node = NULL;
14823 i32 i;
14824 i32 len = ntohl (mp->nlabels);
14825 struct in_addr ip4;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014826
Dave Barach72d72232016-08-04 10:15:08 -040014827 if (VAT_JSON_ARRAY != vam->json_tree.type)
14828 {
14829 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14830 vat_json_init_array (&vam->json_tree);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014831 }
Dave Barach72d72232016-08-04 10:15:08 -040014832 node = vat_json_array_add (&vam->json_tree);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014833
Dave Barach72d72232016-08-04 10:15:08 -040014834 vat_json_init_object (node);
14835 vat_json_object_add_uint (node, "table", ntohl (mp->fib_index));
14836 vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index));
14837 clib_memcpy (&ip4, &(mp->dest), sizeof (ip4));
14838 vat_json_object_add_ip4 (node, "dest", ip4);
14839 vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit));
14840 vat_json_object_add_uint (node, "label_count", len);
14841 for (i = 0; i < len; i++)
14842 {
14843 vat_json_object_add_uint (node, "label", ntohl (mp->labels[i]));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014844 }
14845}
14846
Dave Barach72d72232016-08-04 10:15:08 -040014847static int
14848api_mpls_fib_encap_dump (vat_main_t * vam)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014849{
Dave Barach72d72232016-08-04 10:15:08 -040014850 vl_api_mpls_fib_encap_dump_t *mp;
14851 f64 timeout;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014852
Dave Barach72d72232016-08-04 10:15:08 -040014853 M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump);
14854 S;
14855
14856 /* Use a control ping for synchronization */
14857 {
14858 vl_api_control_ping_t *mp;
14859 M (CONTROL_PING, control_ping);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014860 S;
Dave Barach72d72232016-08-04 10:15:08 -040014861 }
14862 W;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014863}
14864
Neale Ranns1357f3b2016-10-16 12:01:42 -070014865static void
14866vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014867{
Dave Barach72d72232016-08-04 10:15:08 -040014868 vat_main_t *vam = &vat_main;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014869
Dave Barach72d72232016-08-04 10:15:08 -040014870 fformat (vam->ofp,
Neale Ranns1357f3b2016-10-16 12:01:42 -070014871 "table-id %d, label %u, ess_bit %u\n",
14872 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014873}
14874
Neale Ranns1357f3b2016-10-16 12:01:42 -070014875static void vl_api_mpls_fib_details_t_handler_json
14876 (vl_api_mpls_fib_details_t * mp)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014877{
Dave Barach72d72232016-08-04 10:15:08 -040014878 vat_main_t *vam = &vat_main;
14879 vat_json_node_t *node = NULL;
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014880
Dave Barach72d72232016-08-04 10:15:08 -040014881 if (VAT_JSON_ARRAY != vam->json_tree.type)
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014882 {
Dave Barach72d72232016-08-04 10:15:08 -040014883 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14884 vat_json_init_array (&vam->json_tree);
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014885 }
Dave Barach72d72232016-08-04 10:15:08 -040014886 node = vat_json_array_add (&vam->json_tree);
14887
14888 vat_json_init_object (node);
Neale Ranns1357f3b2016-10-16 12:01:42 -070014889 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
14890 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
Dave Barach72d72232016-08-04 10:15:08 -040014891 vat_json_object_add_uint (node, "label", ntohl (mp->label));
marek zavodsky2c21a9a2016-06-21 05:35:16 +020014892}
14893
Dave Barach72d72232016-08-04 10:15:08 -040014894static int
Neale Ranns1357f3b2016-10-16 12:01:42 -070014895api_mpls_fib_dump (vat_main_t * vam)
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014896{
Neale Ranns1357f3b2016-10-16 12:01:42 -070014897 vl_api_mpls_fib_dump_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -040014898 f64 timeout;
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014899
Neale Ranns1357f3b2016-10-16 12:01:42 -070014900 M (MPLS_FIB_DUMP, mpls_fib_dump);
Dave Barach72d72232016-08-04 10:15:08 -040014901 S;
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014902
Dave Barach72d72232016-08-04 10:15:08 -040014903 /* Use a control ping for synchronization */
14904 {
14905 vl_api_control_ping_t *mp;
14906 M (CONTROL_PING, control_ping);
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014907 S;
Dave Barach72d72232016-08-04 10:15:08 -040014908 }
14909 W;
14910}
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014911
Dave Barach72d72232016-08-04 10:15:08 -040014912int
14913api_classify_table_ids (vat_main_t * vam)
14914{
14915 vl_api_classify_table_ids_t *mp;
14916 f64 timeout;
14917
14918 /* Construct the API message */
14919 M (CLASSIFY_TABLE_IDS, classify_table_ids);
14920 mp->context = 0;
14921
14922 S;
14923 W;
14924 /* NOTREACHED */
14925 return 0;
14926}
14927
14928int
14929api_classify_table_by_interface (vat_main_t * vam)
14930{
14931 unformat_input_t *input = vam->input;
14932 vl_api_classify_table_by_interface_t *mp;
14933 f64 timeout;
14934
14935 u32 sw_if_index = ~0;
14936 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014937 {
Dave Barach72d72232016-08-04 10:15:08 -040014938 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
14939 ;
14940 else if (unformat (input, "sw_if_index %d", &sw_if_index))
14941 ;
14942 else
14943 break;
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014944 }
Dave Barach72d72232016-08-04 10:15:08 -040014945 if (sw_if_index == ~0)
14946 {
14947 errmsg ("missing interface name or sw_if_index\n");
14948 return -99;
14949 }
14950
14951 /* Construct the API message */
14952 M (CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface);
14953 mp->context = 0;
14954 mp->sw_if_index = ntohl (sw_if_index);
14955
14956 S;
14957 W;
14958 /* NOTREACHED */
14959 return 0;
Pavel Kotucek20c90f72016-06-07 14:44:26 +020014960}
14961
Dave Barach72d72232016-08-04 10:15:08 -040014962int
14963api_classify_table_info (vat_main_t * vam)
Juraj Slobodaac645ad2016-07-07 00:18:57 -070014964{
Dave Barach72d72232016-08-04 10:15:08 -040014965 unformat_input_t *input = vam->input;
14966 vl_api_classify_table_info_t *mp;
14967 f64 timeout;
Juraj Slobodaac645ad2016-07-07 00:18:57 -070014968
Dave Barach72d72232016-08-04 10:15:08 -040014969 u32 table_id = ~0;
14970 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
14971 {
14972 if (unformat (input, "table_id %d", &table_id))
14973 ;
14974 else
14975 break;
14976 }
14977 if (table_id == ~0)
14978 {
14979 errmsg ("missing table id\n");
14980 return -99;
14981 }
Juraj Slobodaac645ad2016-07-07 00:18:57 -070014982
Dave Barach72d72232016-08-04 10:15:08 -040014983 /* Construct the API message */
14984 M (CLASSIFY_TABLE_INFO, classify_table_info);
14985 mp->context = 0;
14986 mp->table_id = ntohl (table_id);
14987
14988 S;
14989 W;
14990 /* NOTREACHED */
14991 return 0;
Juraj Slobodaac645ad2016-07-07 00:18:57 -070014992}
14993
Dave Barach72d72232016-08-04 10:15:08 -040014994int
14995api_classify_session_dump (vat_main_t * vam)
Juraj Slobodaac645ad2016-07-07 00:18:57 -070014996{
Dave Barach72d72232016-08-04 10:15:08 -040014997 unformat_input_t *input = vam->input;
14998 vl_api_classify_session_dump_t *mp;
14999 f64 timeout;
Juraj Slobodaac645ad2016-07-07 00:18:57 -070015000
Dave Barach72d72232016-08-04 10:15:08 -040015001 u32 table_id = ~0;
15002 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15003 {
15004 if (unformat (input, "table_id %d", &table_id))
15005 ;
15006 else
15007 break;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +020015008 }
Dave Barach72d72232016-08-04 10:15:08 -040015009 if (table_id == ~0)
15010 {
15011 errmsg ("missing table id\n");
15012 return -99;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +020015013 }
15014
Dave Barach72d72232016-08-04 10:15:08 -040015015 /* Construct the API message */
15016 M (CLASSIFY_SESSION_DUMP, classify_session_dump);
15017 mp->context = 0;
15018 mp->table_id = ntohl (table_id);
15019 S;
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +020015020
Dave Barach72d72232016-08-04 10:15:08 -040015021 /* Use a control ping for synchronization */
15022 {
15023 vl_api_control_ping_t *mp;
15024 M (CONTROL_PING, control_ping);
Dave Barach6f9bca22016-04-30 10:25:32 -040015025 S;
Dave Barach72d72232016-08-04 10:15:08 -040015026 }
15027 W;
15028 /* NOTREACHED */
15029 return 0;
Dave Barach6f9bca22016-04-30 10:25:32 -040015030}
15031
Dave Barach72d72232016-08-04 10:15:08 -040015032static void
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015033vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070015034{
Dave Barach72d72232016-08-04 10:15:08 -040015035 vat_main_t *vam = &vat_main;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015036
Dave Barach72d72232016-08-04 10:15:08 -040015037 fformat (vam->ofp, "collector_address %U, collector_port %d, "
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015038 "src_address %U, vrf_id %d, path_mtu %u, "
15039 "template_interval %u, udp_checksum %d\n",
Dave Barach72d72232016-08-04 10:15:08 -040015040 format_ip4_address, mp->collector_address,
15041 ntohs (mp->collector_port),
15042 format_ip4_address, mp->src_address,
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015043 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
15044 ntohl (mp->template_interval), mp->udp_checksum);
Dave Barach72d72232016-08-04 10:15:08 -040015045
15046 vam->retval = 0;
15047 vam->result_ready = 1;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015048}
15049
Dave Barach72d72232016-08-04 10:15:08 -040015050static void
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015051 vl_api_ipfix_exporter_details_t_handler_json
15052 (vl_api_ipfix_exporter_details_t * mp)
Matus Fabiand2dc3df2015-12-14 10:31:33 -050015053{
Dave Barach72d72232016-08-04 10:15:08 -040015054 vat_main_t *vam = &vat_main;
15055 vat_json_node_t node;
15056 struct in_addr collector_address;
15057 struct in_addr src_address;
Matus Fabiand2dc3df2015-12-14 10:31:33 -050015058
Dave Barach72d72232016-08-04 10:15:08 -040015059 vat_json_init_object (&node);
15060 clib_memcpy (&collector_address, &mp->collector_address,
15061 sizeof (collector_address));
15062 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
15063 vat_json_object_add_uint (&node, "collector_port",
15064 ntohs (mp->collector_port));
15065 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
15066 vat_json_object_add_ip4 (&node, "src_address", src_address);
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015067 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
Dave Barach72d72232016-08-04 10:15:08 -040015068 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
15069 vat_json_object_add_uint (&node, "template_interval",
15070 ntohl (mp->template_interval));
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015071 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
Dave Barach72d72232016-08-04 10:15:08 -040015072
15073 vat_json_print (vam->ofp, &node);
15074 vat_json_free (&node);
15075 vam->retval = 0;
15076 vam->result_ready = 1;
Matus Fabiand2dc3df2015-12-14 10:31:33 -050015077}
15078
Dave Barach72d72232016-08-04 10:15:08 -040015079int
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015080api_ipfix_exporter_dump (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070015081{
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015082 vl_api_ipfix_exporter_dump_t *mp;
Dave Barach72d72232016-08-04 10:15:08 -040015083 f64 timeout;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015084
Dave Barach72d72232016-08-04 10:15:08 -040015085 /* Construct the API message */
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015086 M (IPFIX_EXPORTER_DUMP, ipfix_exporter_dump);
Dave Barach72d72232016-08-04 10:15:08 -040015087 mp->context = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015088
Dave Barach72d72232016-08-04 10:15:08 -040015089 S;
15090 W;
15091 /* NOTREACHED */
15092 return 0;
15093}
Ed Warnickecb9cada2015-12-08 15:45:58 -070015094
Juraj Slobodaffa652a2016-08-07 23:43:42 -070015095static int
15096api_ipfix_classify_stream_dump (vat_main_t * vam)
15097{
15098 vl_api_ipfix_classify_stream_dump_t *mp;
15099 f64 timeout;
15100
15101 /* Construct the API message */
15102 M (IPFIX_CLASSIFY_STREAM_DUMP, ipfix_classify_stream_dump);
15103 mp->context = 0;
15104
15105 S;
15106 W;
15107 /* NOTREACHED */
15108 return 0;
15109}
15110
15111static void
15112 vl_api_ipfix_classify_stream_details_t_handler
15113 (vl_api_ipfix_classify_stream_details_t * mp)
15114{
15115 vat_main_t *vam = &vat_main;
15116 fformat (vam->ofp, "domain_id %d, src_port %d\n",
15117 ntohl (mp->domain_id), ntohs (mp->src_port));
15118 vam->retval = 0;
15119 vam->result_ready = 1;
15120}
15121
15122static void
15123 vl_api_ipfix_classify_stream_details_t_handler_json
15124 (vl_api_ipfix_classify_stream_details_t * mp)
15125{
15126 vat_main_t *vam = &vat_main;
15127 vat_json_node_t node;
15128
15129 vat_json_init_object (&node);
15130 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
15131 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
15132
15133 vat_json_print (vam->ofp, &node);
15134 vat_json_free (&node);
15135 vam->retval = 0;
15136 vam->result_ready = 1;
15137}
15138
15139static int
15140api_ipfix_classify_table_dump (vat_main_t * vam)
15141{
15142 vl_api_ipfix_classify_table_dump_t *mp;
15143 f64 timeout;
15144
15145 if (!vam->json_output)
15146 {
15147 fformat (vam->ofp, "%15s%15s%20s\n", "table_id", "ip_version",
15148 "transport_protocol");
15149 }
15150
15151 /* Construct the API message */
15152 M (IPFIX_CLASSIFY_TABLE_DUMP, ipfix_classify_table_dump);
15153
15154 /* send it... */
15155 S;
15156
15157 /* Use a control ping for synchronization */
15158 {
15159 vl_api_control_ping_t *mp;
15160 M (CONTROL_PING, control_ping);
15161 S;
15162 }
15163 W;
15164}
15165
15166static void
15167 vl_api_ipfix_classify_table_details_t_handler
15168 (vl_api_ipfix_classify_table_details_t * mp)
15169{
15170 vat_main_t *vam = &vat_main;
15171 fformat (vam->ofp, "%15d%15d%20d\n", ntohl (mp->table_id), mp->ip_version,
15172 mp->transport_protocol);
15173}
15174
15175static void
15176 vl_api_ipfix_classify_table_details_t_handler_json
15177 (vl_api_ipfix_classify_table_details_t * mp)
15178{
15179 vat_json_node_t *node = NULL;
15180 vat_main_t *vam = &vat_main;
15181
15182 if (VAT_JSON_ARRAY != vam->json_tree.type)
15183 {
15184 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15185 vat_json_init_array (&vam->json_tree);
15186 }
15187
15188 node = vat_json_array_add (&vam->json_tree);
15189 vat_json_init_object (node);
15190
15191 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
15192 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
15193 vat_json_object_add_uint (node, "transport_protocol",
15194 mp->transport_protocol);
15195}
15196
Dave Barach72d72232016-08-04 10:15:08 -040015197int
15198api_pg_create_interface (vat_main_t * vam)
15199{
15200 unformat_input_t *input = vam->input;
15201 vl_api_pg_create_interface_t *mp;
15202 f64 timeout;
15203
15204 u32 if_id = ~0;
15205 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15206 {
15207 if (unformat (input, "if_id %d", &if_id))
15208 ;
15209 else
15210 break;
15211 }
15212 if (if_id == ~0)
15213 {
15214 errmsg ("missing pg interface index\n");
15215 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015216 }
15217
Dave Barach72d72232016-08-04 10:15:08 -040015218 /* Construct the API message */
15219 M (PG_CREATE_INTERFACE, pg_create_interface);
15220 mp->context = 0;
15221 mp->interface_id = ntohl (if_id);
Ed Warnickecb9cada2015-12-08 15:45:58 -070015222
Dave Barach72d72232016-08-04 10:15:08 -040015223 S;
15224 W;
15225 /* NOTREACHED */
15226 return 0;
15227}
15228
15229int
15230api_pg_capture (vat_main_t * vam)
15231{
15232 unformat_input_t *input = vam->input;
15233 vl_api_pg_capture_t *mp;
15234 f64 timeout;
15235
15236 u32 if_id = ~0;
15237 u8 enable = 1;
15238 u32 count = 1;
15239 u8 pcap_file_set = 0;
15240 u8 *pcap_file = 0;
15241 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15242 {
15243 if (unformat (input, "if_id %d", &if_id))
15244 ;
15245 else if (unformat (input, "pcap %s", &pcap_file))
15246 pcap_file_set = 1;
15247 else if (unformat (input, "count %d", &count))
15248 ;
15249 else if (unformat (input, "disable"))
15250 enable = 0;
15251 else
15252 break;
15253 }
15254 if (if_id == ~0)
15255 {
15256 errmsg ("missing pg interface index\n");
15257 return -99;
15258 }
15259 if (pcap_file_set > 0)
15260 {
15261 if (vec_len (pcap_file) > 255)
15262 {
15263 errmsg ("pcap file name is too long\n");
15264 return -99;
15265 }
15266 }
15267
15268 u32 name_len = vec_len (pcap_file);
15269 /* Construct the API message */
15270 M (PG_CAPTURE, pg_capture);
15271 mp->context = 0;
15272 mp->interface_id = ntohl (if_id);
15273 mp->is_enabled = enable;
15274 mp->count = ntohl (count);
15275 mp->pcap_name_length = ntohl (name_len);
15276 if (pcap_file_set != 0)
15277 {
15278 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
15279 }
15280 vec_free (pcap_file);
15281
15282 S;
15283 W;
15284 /* NOTREACHED */
15285 return 0;
15286}
15287
15288int
15289api_pg_enable_disable (vat_main_t * vam)
15290{
15291 unformat_input_t *input = vam->input;
15292 vl_api_pg_enable_disable_t *mp;
15293 f64 timeout;
15294
15295 u8 enable = 1;
15296 u8 stream_name_set = 0;
15297 u8 *stream_name = 0;
15298 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15299 {
15300 if (unformat (input, "stream %s", &stream_name))
15301 stream_name_set = 1;
15302 else if (unformat (input, "disable"))
15303 enable = 0;
15304 else
15305 break;
15306 }
15307
15308 if (stream_name_set > 0)
15309 {
15310 if (vec_len (stream_name) > 255)
15311 {
15312 errmsg ("stream name too long\n");
15313 return -99;
15314 }
15315 }
15316
15317 u32 name_len = vec_len (stream_name);
15318 /* Construct the API message */
15319 M (PG_ENABLE_DISABLE, pg_enable_disable);
15320 mp->context = 0;
15321 mp->is_enabled = enable;
15322 if (stream_name_set != 0)
15323 {
15324 mp->stream_name_length = ntohl (name_len);
15325 clib_memcpy (mp->stream_name, stream_name, name_len);
15326 }
15327 vec_free (stream_name);
15328
15329 S;
15330 W;
15331 /* NOTREACHED */
15332 return 0;
15333}
15334
15335int
15336api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
15337{
15338 unformat_input_t *input = vam->input;
15339 vl_api_ip_source_and_port_range_check_add_del_t *mp;
15340 f64 timeout;
15341
15342 u16 *low_ports = 0;
15343 u16 *high_ports = 0;
15344 u16 this_low;
15345 u16 this_hi;
15346 ip4_address_t ip4_addr;
15347 ip6_address_t ip6_addr;
15348 u32 length;
15349 u32 tmp, tmp2;
15350 u8 prefix_set = 0;
15351 u32 vrf_id = ~0;
15352 u8 is_add = 1;
15353 u8 is_ipv6 = 0;
15354
15355 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15356 {
15357 if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length))
15358 {
15359 prefix_set = 1;
15360 }
15361 else
15362 if (unformat
15363 (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length))
15364 {
15365 prefix_set = 1;
15366 is_ipv6 = 1;
15367 }
15368 else if (unformat (input, "vrf %d", &vrf_id))
15369 ;
15370 else if (unformat (input, "del"))
15371 is_add = 0;
15372 else if (unformat (input, "port %d", &tmp))
15373 {
15374 if (tmp == 0 || tmp > 65535)
15375 {
15376 errmsg ("port %d out of range", tmp);
15377 return -99;
15378 }
15379 this_low = tmp;
15380 this_hi = this_low + 1;
15381 vec_add1 (low_ports, this_low);
15382 vec_add1 (high_ports, this_hi);
15383 }
15384 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
15385 {
15386 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
15387 {
15388 errmsg ("incorrect range parameters\n");
15389 return -99;
15390 }
15391 this_low = tmp;
15392 /* Note: in debug CLI +1 is added to high before
15393 passing to real fn that does "the work"
15394 (ip_source_and_port_range_check_add_del).
15395 This fn is a wrapper around the binary API fn a
15396 control plane will call, which expects this increment
15397 to have occurred. Hence letting the binary API control
15398 plane fn do the increment for consistency between VAT
15399 and other control planes.
15400 */
15401 this_hi = tmp2;
15402 vec_add1 (low_ports, this_low);
15403 vec_add1 (high_ports, this_hi);
15404 }
15405 else
15406 break;
15407 }
15408
15409 if (prefix_set == 0)
15410 {
15411 errmsg ("<address>/<mask> not specified\n");
15412 return -99;
15413 }
15414
15415 if (vrf_id == ~0)
15416 {
15417 errmsg ("VRF ID required, not specified\n");
15418 return -99;
15419 }
15420
15421 if (vrf_id == 0)
15422 {
15423 errmsg
15424 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15425 return -99;
15426 }
15427
15428 if (vec_len (low_ports) == 0)
15429 {
15430 errmsg ("At least one port or port range required\n");
15431 return -99;
15432 }
15433
15434 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL,
15435 ip_source_and_port_range_check_add_del);
15436
15437 mp->is_add = is_add;
15438
15439 if (is_ipv6)
15440 {
15441 mp->is_ipv6 = 1;
15442 clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr));
15443 }
15444 else
15445 {
15446 mp->is_ipv6 = 0;
15447 clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr));
15448 }
15449
15450 mp->mask_length = length;
15451 mp->number_of_ranges = vec_len (low_ports);
15452
15453 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
15454 vec_free (low_ports);
15455
15456 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
15457 vec_free (high_ports);
15458
15459 mp->vrf_id = ntohl (vrf_id);
15460
15461 S;
15462 W;
15463 /* NOTREACHED */
15464 return 0;
15465}
15466
15467int
15468api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
15469{
15470 unformat_input_t *input = vam->input;
15471 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
15472 f64 timeout;
15473 u32 sw_if_index = ~0;
15474 int vrf_set = 0;
15475 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
15476 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
15477 u8 is_add = 1;
15478
15479 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15480 {
15481 if (unformat (input, "%U", unformat_sw_if_index, vam, &sw_if_index))
15482 ;
15483 else if (unformat (input, "sw_if_index %d", &sw_if_index))
15484 ;
15485 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
15486 vrf_set = 1;
15487 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
15488 vrf_set = 1;
15489 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
15490 vrf_set = 1;
15491 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
15492 vrf_set = 1;
15493 else if (unformat (input, "del"))
15494 is_add = 0;
15495 else
15496 break;
15497 }
15498
15499 if (sw_if_index == ~0)
15500 {
15501 errmsg ("Interface required but not specified\n");
15502 return -99;
15503 }
15504
15505 if (vrf_set == 0)
15506 {
15507 errmsg ("VRF ID required but not specified\n");
15508 return -99;
15509 }
15510
15511 if (tcp_out_vrf_id == 0
15512 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
15513 {
15514 errmsg
15515 ("VRF ID should not be default. Should be distinct VRF for this purpose.\n");
15516 return -99;
15517 }
15518
15519 /* Construct the API message */
15520 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL,
15521 ip_source_and_port_range_check_interface_add_del);
15522
15523 mp->sw_if_index = ntohl (sw_if_index);
15524 mp->is_add = is_add;
15525 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
15526 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
15527 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
15528 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
15529
15530 /* send it... */
15531 S;
15532
15533 /* Wait for a reply... */
15534 W;
15535}
15536
15537static int
Matus Fabian694265d2016-08-10 01:55:36 -070015538api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
15539{
15540 unformat_input_t *i = vam->input;
15541 vl_api_ipsec_gre_add_del_tunnel_t *mp;
15542 f64 timeout;
15543 u32 local_sa_id = 0;
15544 u32 remote_sa_id = 0;
15545 ip4_address_t src_address;
15546 ip4_address_t dst_address;
15547 u8 is_add = 1;
15548
15549 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15550 {
15551 if (unformat (i, "local_sa %d", &local_sa_id))
15552 ;
15553 else if (unformat (i, "remote_sa %d", &remote_sa_id))
15554 ;
15555 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
15556 ;
15557 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
15558 ;
15559 else if (unformat (i, "del"))
15560 is_add = 0;
15561 else
15562 {
15563 clib_warning ("parse error '%U'", format_unformat_error, i);
15564 return -99;
15565 }
15566 }
15567
15568 M (IPSEC_GRE_ADD_DEL_TUNNEL, ipsec_gre_add_del_tunnel);
15569
15570 mp->local_sa_id = ntohl (local_sa_id);
15571 mp->remote_sa_id = ntohl (remote_sa_id);
15572 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
15573 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
15574 mp->is_add = is_add;
15575
15576 S;
15577 W;
15578 /* NOTREACHED */
15579 return 0;
15580}
15581
Alexander Popovsky (apopovsk)4a7e58b2016-10-05 22:31:23 -070015582static int
15583api_punt (vat_main_t * vam)
15584{
15585 unformat_input_t *i = vam->input;
15586 vl_api_punt_t *mp;
15587 f64 timeout;
15588 u32 ipv = ~0;
15589 u32 protocol = ~0;
15590 u32 port = ~0;
15591 int is_add = 1;
15592
15593 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15594 {
15595 if (unformat (i, "ip %d", &ipv))
15596 ;
15597 else if (unformat (i, "protocol %d", &protocol))
15598 ;
15599 else if (unformat (i, "port %d", &port))
15600 ;
15601 else if (unformat (i, "del"))
15602 is_add = 0;
15603 else
15604 {
15605 clib_warning ("parse error '%U'", format_unformat_error, i);
15606 return -99;
15607 }
15608 }
15609
15610 M (PUNT, punt);
15611
15612 mp->is_add = (u8) is_add;
15613 mp->ipv = (u8) ipv;
15614 mp->l4_protocol = (u8) protocol;
15615 mp->l4_port = htons ((u16) port);
15616
15617 S;
15618 W;
15619 /* NOTREACHED */
15620 return 0;
15621}
15622
Matus Fabian694265d2016-08-10 01:55:36 -070015623static void vl_api_ipsec_gre_tunnel_details_t_handler
15624 (vl_api_ipsec_gre_tunnel_details_t * mp)
15625{
15626 vat_main_t *vam = &vat_main;
15627
15628 fformat (vam->ofp, "%11d%15U%15U%14d%14d\n",
15629 ntohl (mp->sw_if_index),
15630 format_ip4_address, &mp->src_address,
15631 format_ip4_address, &mp->dst_address,
15632 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
15633}
15634
15635static void vl_api_ipsec_gre_tunnel_details_t_handler_json
15636 (vl_api_ipsec_gre_tunnel_details_t * mp)
15637{
15638 vat_main_t *vam = &vat_main;
15639 vat_json_node_t *node = NULL;
15640 struct in_addr ip4;
15641
15642 if (VAT_JSON_ARRAY != vam->json_tree.type)
15643 {
15644 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15645 vat_json_init_array (&vam->json_tree);
15646 }
15647 node = vat_json_array_add (&vam->json_tree);
15648
15649 vat_json_init_object (node);
15650 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
15651 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
15652 vat_json_object_add_ip4 (node, "src_address", ip4);
15653 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
15654 vat_json_object_add_ip4 (node, "dst_address", ip4);
15655 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
15656 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
15657}
15658
15659static int
15660api_ipsec_gre_tunnel_dump (vat_main_t * vam)
15661{
15662 unformat_input_t *i = vam->input;
15663 vl_api_ipsec_gre_tunnel_dump_t *mp;
15664 f64 timeout;
15665 u32 sw_if_index;
15666 u8 sw_if_index_set = 0;
15667
15668 /* Parse args required to build the message */
15669 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15670 {
15671 if (unformat (i, "sw_if_index %d", &sw_if_index))
15672 sw_if_index_set = 1;
15673 else
15674 break;
15675 }
15676
15677 if (sw_if_index_set == 0)
15678 {
15679 sw_if_index = ~0;
15680 }
15681
15682 if (!vam->json_output)
15683 {
15684 fformat (vam->ofp, "%11s%15s%15s%14s%14s\n",
15685 "sw_if_index", "src_address", "dst_address",
15686 "local_sa_id", "remote_sa_id");
15687 }
15688
15689 /* Get list of gre-tunnel interfaces */
15690 M (IPSEC_GRE_TUNNEL_DUMP, ipsec_gre_tunnel_dump);
15691
15692 mp->sw_if_index = htonl (sw_if_index);
15693
15694 S;
15695
15696 /* Use a control ping for synchronization */
15697 {
15698 vl_api_control_ping_t *mp;
15699 M (CONTROL_PING, control_ping);
15700 S;
15701 }
15702 W;
15703}
15704
15705static int
Pavel Kotucekd85590a2016-08-26 13:35:40 +020015706api_delete_subif (vat_main_t * vam)
15707{
15708 unformat_input_t *i = vam->input;
15709 vl_api_delete_subif_t *mp;
15710 f64 timeout;
15711 u32 sw_if_index = ~0;
15712
15713 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15714 {
15715 if (unformat (i, "sw_if_index %d", &sw_if_index))
15716 ;
15717 else
15718 break;
15719 }
15720
15721 if (sw_if_index == ~0)
15722 {
15723 errmsg ("missing sw_if_index\n");
15724 return -99;
15725 }
15726
15727 /* Construct the API message */
15728 M (DELETE_SUBIF, delete_subif);
15729 mp->sw_if_index = ntohl (sw_if_index);
15730
15731 S;
15732 W;
15733}
15734
Pavel Kotucek95300d12016-08-26 16:11:36 +020015735#define foreach_pbb_vtr_op \
15736_("disable", L2_VTR_DISABLED) \
15737_("pop", L2_VTR_POP_2) \
15738_("push", L2_VTR_PUSH_2)
15739
15740static int
15741api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
15742{
15743 unformat_input_t *i = vam->input;
15744 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
15745 f64 timeout;
15746 u32 sw_if_index = ~0, vtr_op = ~0;
15747 u16 outer_tag = ~0;
15748 u8 dmac[6], smac[6];
15749 u8 dmac_set = 0, smac_set = 0;
15750 u16 vlanid = 0;
15751 u32 sid = ~0;
15752 u32 tmp;
15753
15754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15755 {
15756 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15757 ;
15758 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15759 ;
15760 else if (unformat (i, "vtr_op %d", &vtr_op))
15761 ;
15762#define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
15763 foreach_pbb_vtr_op
15764#undef _
15765 else if (unformat (i, "translate_pbb_stag"))
15766 {
15767 if (unformat (i, "%d", &tmp))
15768 {
15769 vtr_op = L2_VTR_TRANSLATE_2_1;
15770 outer_tag = tmp;
15771 }
15772 else
15773 {
15774 errmsg
15775 ("translate_pbb_stag operation requires outer tag definition\n");
15776 return -99;
15777 }
15778 }
15779 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
15780 dmac_set++;
15781 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
15782 smac_set++;
15783 else if (unformat (i, "sid %d", &sid))
15784 ;
15785 else if (unformat (i, "vlanid %d", &tmp))
15786 vlanid = tmp;
15787 else
15788 {
15789 clib_warning ("parse error '%U'", format_unformat_error, i);
15790 return -99;
15791 }
15792 }
15793
15794 if ((sw_if_index == ~0) || (vtr_op == ~0))
15795 {
15796 errmsg ("missing sw_if_index or vtr operation\n");
15797 return -99;
15798 }
15799 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
15800 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
15801 {
15802 errmsg
15803 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid\n");
15804 return -99;
15805 }
15806
15807 M (L2_INTERFACE_PBB_TAG_REWRITE, l2_interface_pbb_tag_rewrite);
15808 mp->sw_if_index = ntohl (sw_if_index);
15809 mp->vtr_op = ntohl (vtr_op);
15810 mp->outer_tag = ntohs (outer_tag);
15811 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
15812 clib_memcpy (mp->b_smac, smac, sizeof (smac));
15813 mp->b_vlanid = ntohs (vlanid);
15814 mp->i_sid = ntohl (sid);
15815
15816 S;
15817 W;
15818 /* NOTREACHED */
15819 return 0;
15820}
15821
Pavel Kotucekd85590a2016-08-26 13:35:40 +020015822static int
Juraj Sloboda506b2452016-08-07 23:45:24 -070015823api_flow_classify_set_interface (vat_main_t * vam)
15824{
15825 unformat_input_t *i = vam->input;
15826 vl_api_flow_classify_set_interface_t *mp;
15827 f64 timeout;
15828 u32 sw_if_index;
15829 int sw_if_index_set;
15830 u32 ip4_table_index = ~0;
15831 u32 ip6_table_index = ~0;
15832 u8 is_add = 1;
15833
15834 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15835 {
15836 if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index))
15837 sw_if_index_set = 1;
15838 else if (unformat (i, "sw_if_index %d", &sw_if_index))
15839 sw_if_index_set = 1;
15840 else if (unformat (i, "del"))
15841 is_add = 0;
15842 else if (unformat (i, "ip4-table %d", &ip4_table_index))
15843 ;
15844 else if (unformat (i, "ip6-table %d", &ip6_table_index))
15845 ;
15846 else
15847 {
15848 clib_warning ("parse error '%U'", format_unformat_error, i);
15849 return -99;
15850 }
15851 }
15852
15853 if (sw_if_index_set == 0)
15854 {
15855 errmsg ("missing interface name or sw_if_index\n");
15856 return -99;
15857 }
15858
15859 M (FLOW_CLASSIFY_SET_INTERFACE, flow_classify_set_interface);
15860
15861 mp->sw_if_index = ntohl (sw_if_index);
15862 mp->ip4_table_index = ntohl (ip4_table_index);
15863 mp->ip6_table_index = ntohl (ip6_table_index);
15864 mp->is_add = is_add;
15865
15866 S;
15867 W;
15868 /* NOTREACHED */
15869 return 0;
15870}
15871
15872static int
15873api_flow_classify_dump (vat_main_t * vam)
15874{
15875 unformat_input_t *i = vam->input;
15876 vl_api_flow_classify_dump_t *mp;
15877 f64 timeout = ~0;
15878 u8 type = FLOW_CLASSIFY_N_TABLES;
15879
15880 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
15881 ;
15882 else
15883 {
15884 errmsg ("classify table type must be specified\n");
15885 return -99;
15886 }
15887
15888 if (!vam->json_output)
15889 {
15890 fformat (vam->ofp, "%10s%20s\n", "Intfc idx", "Classify table");
15891 }
15892
15893 M (FLOW_CLASSIFY_DUMP, flow_classify_dump);
15894 mp->type = type;
15895 /* send it... */
15896 S;
15897
15898 /* Use a control ping for synchronization */
15899 {
15900 vl_api_control_ping_t *mp;
15901 M (CONTROL_PING, control_ping);
15902 S;
15903 }
15904 /* Wait for a reply... */
15905 W;
15906
15907 /* NOTREACHED */
15908 return 0;
15909}
15910
15911static int
Dave Barach72d72232016-08-04 10:15:08 -040015912q_or_quit (vat_main_t * vam)
15913{
15914 longjmp (vam->jump_buf, 1);
15915 return 0; /* not so much */
15916}
15917
15918static int
15919q (vat_main_t * vam)
15920{
15921 return q_or_quit (vam);
15922}
15923
15924static int
15925quit (vat_main_t * vam)
15926{
15927 return q_or_quit (vam);
15928}
15929
15930static int
15931comment (vat_main_t * vam)
15932{
15933 return 0;
15934}
15935
15936static int
15937cmd_cmp (void *a1, void *a2)
15938{
15939 u8 **c1 = a1;
15940 u8 **c2 = a2;
15941
15942 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
15943}
15944
15945static int
15946help (vat_main_t * vam)
15947{
15948 u8 **cmds = 0;
15949 u8 *name = 0;
15950 hash_pair_t *p;
15951 unformat_input_t *i = vam->input;
15952 int j;
15953
15954 if (unformat (i, "%s", &name))
15955 {
15956 uword *hs;
15957
15958 vec_add1 (name, 0);
15959
15960 hs = hash_get_mem (vam->help_by_name, name);
15961 if (hs)
15962 fformat (vam->ofp, "usage: %s %s\n", name, hs[0]);
15963 else
15964 fformat (vam->ofp, "No such msg / command '%s'\n", name);
15965 vec_free (name);
15966 return 0;
15967 }
15968
15969 fformat (vam->ofp, "Help is available for the following:\n");
15970
15971 /* *INDENT-OFF* */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080015972 hash_foreach_pair (p, vam->function_by_name,
Ed Warnickecb9cada2015-12-08 15:45:58 -070015973 ({
Dave Barach72d72232016-08-04 10:15:08 -040015974 vec_add1 (cmds, (u8 *)(p->key));
Ed Warnickecb9cada2015-12-08 15:45:58 -070015975 }));
Dave Barach72d72232016-08-04 10:15:08 -040015976 /* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -070015977
Dave Barach72d72232016-08-04 10:15:08 -040015978 vec_sort_with_function (cmds, cmd_cmp);
Ed Warnickecb9cada2015-12-08 15:45:58 -070015979
Dave Barach72d72232016-08-04 10:15:08 -040015980 for (j = 0; j < vec_len (cmds); j++)
15981 fformat (vam->ofp, "%s\n", cmds[j]);
Ed Warnickecb9cada2015-12-08 15:45:58 -070015982
Dave Barach72d72232016-08-04 10:15:08 -040015983 vec_free (cmds);
15984 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015985}
15986
Dave Barach72d72232016-08-04 10:15:08 -040015987static int
15988set (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070015989{
Dave Barach72d72232016-08-04 10:15:08 -040015990 u8 *name = 0, *value = 0;
15991 unformat_input_t *i = vam->input;
Ed Warnickecb9cada2015-12-08 15:45:58 -070015992
Dave Barach72d72232016-08-04 10:15:08 -040015993 if (unformat (i, "%s", &name))
15994 {
15995 /* The input buffer is a vector, not a string. */
15996 value = vec_dup (i->buffer);
15997 vec_delete (value, i->index, 0);
15998 /* Almost certainly has a trailing newline */
15999 if (value[vec_len (value) - 1] == '\n')
16000 value[vec_len (value) - 1] = 0;
16001 /* Make sure it's a proper string, one way or the other */
16002 vec_add1 (value, 0);
16003 (void) clib_macro_set_value (&vam->macro_main,
16004 (char *) name, (char *) value);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016005 }
Dave Barach72d72232016-08-04 10:15:08 -040016006 else
16007 errmsg ("usage: set <name> <value>\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -070016008
Dave Barach72d72232016-08-04 10:15:08 -040016009 vec_free (name);
16010 vec_free (value);
16011 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016012}
16013
Dave Barach72d72232016-08-04 10:15:08 -040016014static int
16015unset (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016016{
Dave Barach72d72232016-08-04 10:15:08 -040016017 u8 *name = 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016018
Dave Barach72d72232016-08-04 10:15:08 -040016019 if (unformat (vam->input, "%s", &name))
16020 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
16021 errmsg ("unset: %s wasn't set\n", name);
16022 vec_free (name);
16023 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016024}
16025
Dave Barach72d72232016-08-04 10:15:08 -040016026typedef struct
16027{
16028 u8 *name;
16029 u8 *value;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016030} macro_sort_t;
16031
16032
Dave Barach72d72232016-08-04 10:15:08 -040016033static int
16034macro_sort_cmp (void *a1, void *a2)
Matus Fabiand2dc3df2015-12-14 10:31:33 -050016035{
Dave Barach72d72232016-08-04 10:15:08 -040016036 macro_sort_t *s1 = a1;
16037 macro_sort_t *s2 = a2;
Matus Fabiand2dc3df2015-12-14 10:31:33 -050016038
Dave Barach72d72232016-08-04 10:15:08 -040016039 return strcmp ((char *) (s1->name), (char *) (s2->name));
Matus Fabiand2dc3df2015-12-14 10:31:33 -050016040}
16041
Dave Barach72d72232016-08-04 10:15:08 -040016042static int
16043dump_macro_table (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016044{
Dave Barach72d72232016-08-04 10:15:08 -040016045 macro_sort_t *sort_me = 0, *sm;
16046 int i;
16047 hash_pair_t *p;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016048
Dave Barach72d72232016-08-04 10:15:08 -040016049 /* *INDENT-OFF* */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016050 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
Ed Warnickecb9cada2015-12-08 15:45:58 -070016051 ({
Dave Barach72d72232016-08-04 10:15:08 -040016052 vec_add2 (sort_me, sm, 1);
16053 sm->name = (u8 *)(p->key);
16054 sm->value = (u8 *) (p->value[0]);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016055 }));
Dave Barach72d72232016-08-04 10:15:08 -040016056 /* *INDENT-ON* */
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016057
Dave Barach72d72232016-08-04 10:15:08 -040016058 vec_sort_with_function (sort_me, macro_sort_cmp);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016059
Dave Barach72d72232016-08-04 10:15:08 -040016060 if (vec_len (sort_me))
16061 fformat (vam->ofp, "%-15s%s\n", "Name", "Value");
16062 else
16063 fformat (vam->ofp, "The macro table is empty...\n");
Ed Warnickecb9cada2015-12-08 15:45:58 -070016064
Dave Barach72d72232016-08-04 10:15:08 -040016065 for (i = 0; i < vec_len (sort_me); i++)
16066 fformat (vam->ofp, "%-15s%s\n", sort_me[i].name, sort_me[i].value);
16067 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016068}
16069
Dave Barach72d72232016-08-04 10:15:08 -040016070static int
16071dump_node_table (vat_main_t * vam)
Dave Barachb44e9bc2016-02-19 09:06:23 -050016072{
Dave Barach72d72232016-08-04 10:15:08 -040016073 int i, j;
16074 vlib_node_t *node, *next_node;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016075
Dave Barach72d72232016-08-04 10:15:08 -040016076 if (vec_len (vam->graph_nodes) == 0)
16077 {
16078 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16079 return 0;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016080 }
16081
Dave Barach72d72232016-08-04 10:15:08 -040016082 for (i = 0; i < vec_len (vam->graph_nodes); i++)
16083 {
16084 node = vam->graph_nodes[i];
16085 fformat (vam->ofp, "[%d] %s\n", i, node->name);
16086 for (j = 0; j < vec_len (node->next_nodes); j++)
16087 {
16088 if (node->next_nodes[j] != ~0)
16089 {
16090 next_node = vam->graph_nodes[node->next_nodes[j]];
16091 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16092 }
16093 }
Dave Barachb44e9bc2016-02-19 09:06:23 -050016094 }
Dave Barach72d72232016-08-04 10:15:08 -040016095 return 0;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016096}
16097
Dave Barach72d72232016-08-04 10:15:08 -040016098static int
16099search_node_table (vat_main_t * vam)
Dave Barachb44e9bc2016-02-19 09:06:23 -050016100{
Dave Barach72d72232016-08-04 10:15:08 -040016101 unformat_input_t *line_input = vam->input;
16102 u8 *node_to_find;
16103 int j;
16104 vlib_node_t *node, *next_node;
16105 uword *p;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016106
Dave Barach72d72232016-08-04 10:15:08 -040016107 if (vam->graph_node_index_by_name == 0)
16108 {
16109 fformat (vam->ofp, "Node table empty, issue get_node_graph...\n");
16110 return 0;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016111 }
16112
Dave Barach72d72232016-08-04 10:15:08 -040016113 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
16114 {
16115 if (unformat (line_input, "%s", &node_to_find))
16116 {
16117 vec_add1 (node_to_find, 0);
16118 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
16119 if (p == 0)
16120 {
16121 fformat (vam->ofp, "%s not found...\n", node_to_find);
16122 goto out;
16123 }
16124 node = vam->graph_nodes[p[0]];
16125 fformat (vam->ofp, "[%d] %s\n", p[0], node->name);
16126 for (j = 0; j < vec_len (node->next_nodes); j++)
16127 {
16128 if (node->next_nodes[j] != ~0)
16129 {
16130 next_node = vam->graph_nodes[node->next_nodes[j]];
16131 fformat (vam->ofp, " [%d] %s\n", j, next_node->name);
16132 }
16133 }
16134 }
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016135
Dave Barach72d72232016-08-04 10:15:08 -040016136 else
16137 {
16138 clib_warning ("parse error '%U'", format_unformat_error,
16139 line_input);
16140 return -99;
16141 }
Dave Barachb44e9bc2016-02-19 09:06:23 -050016142
16143 out:
Dave Barach72d72232016-08-04 10:15:08 -040016144 vec_free (node_to_find);
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016145
Dave Barachb44e9bc2016-02-19 09:06:23 -050016146 }
16147
Dave Barach72d72232016-08-04 10:15:08 -040016148 return 0;
Dave Barachb44e9bc2016-02-19 09:06:23 -050016149}
16150
16151
Dave Barach72d72232016-08-04 10:15:08 -040016152static int
16153script (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016154{
Dave Barach72d72232016-08-04 10:15:08 -040016155 u8 *s = 0;
16156 char *save_current_file;
16157 unformat_input_t save_input;
16158 jmp_buf save_jump_buf;
16159 u32 save_line_number;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016160
Dave Barach72d72232016-08-04 10:15:08 -040016161 FILE *new_fp, *save_ifp;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016162
Dave Barach72d72232016-08-04 10:15:08 -040016163 if (unformat (vam->input, "%s", &s))
16164 {
16165 new_fp = fopen ((char *) s, "r");
16166 if (new_fp == 0)
16167 {
16168 errmsg ("Couldn't open script file %s\n", s);
16169 vec_free (s);
16170 return -99;
16171 }
16172 }
16173 else
16174 {
16175 errmsg ("Missing script name\n");
16176 return -99;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016177 }
16178
Dave Barach72d72232016-08-04 10:15:08 -040016179 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
16180 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
16181 save_ifp = vam->ifp;
16182 save_line_number = vam->input_line_number;
16183 save_current_file = (char *) vam->current_file;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016184
Dave Barach72d72232016-08-04 10:15:08 -040016185 vam->input_line_number = 0;
16186 vam->ifp = new_fp;
16187 vam->current_file = s;
16188 do_one_file (vam);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016189
Dave Barach72d72232016-08-04 10:15:08 -040016190 clib_memcpy (&vam->input, &save_input, sizeof (vam->input));
16191 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
16192 vam->ifp = save_ifp;
16193 vam->input_line_number = save_line_number;
16194 vam->current_file = (u8 *) save_current_file;
16195 vec_free (s);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016196
Dave Barach72d72232016-08-04 10:15:08 -040016197 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016198}
16199
Dave Barach72d72232016-08-04 10:15:08 -040016200static int
16201echo (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016202{
Dave Barach72d72232016-08-04 10:15:08 -040016203 fformat (vam->ofp, "%v", vam->input->buffer);
16204 return 0;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016205}
16206
16207/* List of API message constructors, CLI names map to api_xxx */
16208#define foreach_vpe_api_msg \
16209_(create_loopback,"[mac <mac-addr>]") \
16210_(sw_interface_dump,"") \
16211_(sw_interface_set_flags, \
16212 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
16213_(sw_interface_add_del_address, \
16214 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
16215_(sw_interface_set_table, \
16216 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
John Lo06b14b92016-10-24 20:20:11 -040016217_(sw_interface_set_mpls_enable, \
16218 "<intfc> | sw_if_index [disable | dis]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016219_(sw_interface_set_vpath, \
16220 "<intfc> | sw_if_index <id> enable | disable") \
16221_(sw_interface_set_l2_xconnect, \
16222 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16223 "enable | disable") \
16224_(sw_interface_set_l2_bridge, \
Calvine2c987e2016-08-03 16:53:13 -040016225 "<intfc> | sw_if_index <id> bd_id <bridge-domain-id>\n" \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016226 "[shg <split-horizon-group>] [bvi]\n" \
16227 "enable | disable") \
Jasvinder Singh85ecc812016-07-21 17:02:19 +010016228_(sw_interface_set_dpdk_hqos_pipe, \
16229 "rx <intfc> | sw_if_index <id> subport <subport-id> pipe <pipe-id>\n" \
16230 "profile <profile-id>\n") \
16231_(sw_interface_set_dpdk_hqos_subport, \
16232 "rx <intfc> | sw_if_index <id> subport <subport-id> [rate <n>]\n" \
16233 "[bktsize <n>] [tc0 <n>] [tc1 <n>] [tc2 <n>] [tc3 <n>] [period <n>]\n") \
16234_(sw_interface_set_dpdk_hqos_tctbl, \
16235 "rx <intfc> | sw_if_index <id> entry <n> tc <n> queue <n>\n") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016236_(bridge_domain_add_del, \
16237 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [del]\n")\
16238_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
16239_(l2fib_add_del, \
Dave Barach41da02d2016-07-11 16:48:42 -070016240 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016241_(l2_flags, \
16242 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood]\n") \
16243_(bridge_flags, \
16244 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
16245_(tap_connect, \
16246 "tapname <name> mac <mac-addr> | random-mac") \
16247_(tap_modify, \
16248 "<vpp-if-name> | sw_if_index <id> tapname <name> mac <mac-addr> | random-mac") \
16249_(tap_delete, \
16250 "<vpp-if-name> | sw_if_index <id>") \
16251_(sw_interface_tap_dump, "") \
16252_(ip_add_del_route, \
Neale Ranns1357f3b2016-10-16 12:01:42 -070016253 "<addr>/<mask> via <addr> [table-id <n>]\n" \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016254 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16255 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16256 "[multipath] [count <n>]") \
Neale Ranns1357f3b2016-10-16 12:01:42 -070016257_(mpls_route_add_del, \
16258 "<label> <eos> via <addr> [table-id <n>]\n" \
16259 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n" \
16260 "[weight <n>] [drop] [local] [classify <n>] [del]\n" \
16261 "[multipath] [count <n>]") \
16262_(mpls_ip_bind_unbind, \
16263 "<label> <addr/len>") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016264_(proxy_arp_add_del, \
16265 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
16266_(proxy_arp_intfc_enable_disable, \
16267 "<intfc> | sw_if_index <id> enable | disable") \
16268_(mpls_add_del_encap, \
16269 "label <n> dst <ip4-addr> [vrf <n>] [del]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016270_(sw_interface_set_unnumbered, \
16271 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
16272_(ip_neighbor_add_del, \
Chris Luke49a69632016-07-08 10:34:00 -040016273 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
16274 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016275_(reset_vrf, "vrf <id> [ipv6]") \
16276_(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
16277_(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
16278 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
16279 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
16280 "[outer_vlan_id_any][inner_vlan_id_any]") \
16281_(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
16282_(reset_fib, "vrf <n> [ipv6]") \
16283_(dhcp_proxy_config, \
16284 "svr <v46-address> src <v46-address>\n" \
16285 "insert-cid <n> [del]") \
16286_(dhcp_proxy_config_2, \
16287 "svr <v46-address> src <v46-address>\n" \
16288 "rx_vrf_id <nn> server_vrf_id <nn> insert-cid <n> [del]") \
16289_(dhcp_proxy_set_vss, \
16290 "tbl_id <n> fib_id <n> oui <n> [ipv6] [del]") \
16291_(dhcp_client_config, \
16292 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
16293_(set_ip_flow_hash, \
16294 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
16295_(sw_interface_ip6_enable_disable, \
16296 "<intfc> | sw_if_index <id> enable | disable") \
16297_(sw_interface_ip6_set_link_local_address, \
16298 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>") \
16299_(sw_interface_ip6nd_ra_prefix, \
16300 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
16301 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
16302 "[nolink] [isno]") \
16303_(sw_interface_ip6nd_ra_config, \
16304 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
Chris Luke33879c92016-06-28 19:54:21 -040016305 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016306 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
16307_(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
16308_(l2_patch_add_del, \
16309 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
16310 "enable | disable") \
16311_(mpls_ethernet_add_del_tunnel, \
16312 "tx <intfc> | tx_sw_if_index <n> dst <mac-addr>\n" \
16313 "adj <ip4-addr>/<mw> dst <mac-addr> [del]") \
16314_(mpls_ethernet_add_del_tunnel_2, \
16315 "inner_vrf_id <n> outer_vrf_id <n> next-hop <ip4-addr>\n" \
16316 "resolve-attempts <n> resolve-if-needed 0 | 1 [del]") \
16317_(sr_tunnel_add_del, \
Keith Burns (alagalah)52fc44d2016-03-25 09:38:50 -070016318 "[name <name>] src <ip6-addr> dst <ip6-addr>/<mw> \n" \
16319 "(next <ip6-addr>)+ [tag <ip6-addr>]* [clean] [reroute] \n" \
16320 "[policy <policy_name>]") \
16321_(sr_policy_add_del, \
16322 "name <name> tunnel <tunnel-name> [tunnel <tunnel-name>]* [del]") \
16323_(sr_multicast_map_add_del, \
16324 "address [ip6 multicast address] sr-policy [policy name] [del]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016325_(classify_add_del_table, \
16326 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
16327 "[del] mask <mask-value>\n" \
16328 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>") \
16329_(classify_add_del_session, \
Matus Fabian70e6a8d2016-06-20 08:10:42 -070016330 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
16331 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
16332 " [l3 [ip4|ip6]]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016333_(classify_set_interface_ip_table, \
16334 "<intfc> | sw_if_index <nn> table <nn>") \
16335_(classify_set_interface_l2_tables, \
16336 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16337 " [other-table <nn>]") \
16338_(get_node_index, "node <node-name") \
16339_(add_node_next, "node <node-name> next <next-node-name>") \
16340_(l2tpv3_create_tunnel, \
16341 "client_address <ip6-addr> our_address <ip6-addr>\n" \
16342 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n"\
16343 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
16344_(l2tpv3_set_tunnel_cookies, \
16345 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
16346 "[new_remote_cookie <nn>]\n") \
16347_(l2tpv3_interface_enable_disable, \
16348 "<intfc> | sw_if_index <nn> enable | disable") \
16349_(l2tpv3_set_lookup_key, \
16350 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
16351_(sw_if_l2tpv3_tunnel_dump, "") \
16352_(vxlan_add_del_tunnel, \
Chris Luke404be662016-05-27 12:11:24 -040016353 "src <ip-addr> dst <ip-addr> vni <vni> [encap-vrf-id <nn>]\n" \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016354 " [decap-next l2|ip4|ip6] [del]") \
Dave Wallace60231f32015-12-17 21:04:30 -050016355_(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
Chris Luke27fe48f2016-04-28 13:44:38 -040016356_(gre_add_del_tunnel, \
David Hothama8cd3092016-09-19 09:55:07 -070016357 "src <ip4-addr> dst <ip4-addr> [outer-fib-id <nn>] [teb] [del]\n") \
Chris Luke27fe48f2016-04-28 13:44:38 -040016358_(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016359_(l2_fib_clear_table, "") \
16360_(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
16361_(l2_interface_vlan_tag_rewrite, \
16362 "<intfc> | sw_if_index <nn> \n" \
16363 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
16364 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
16365_(create_vhost_user_if, \
Pierre Pfisteref65cb02016-02-19 13:52:44 +000016366 "socket <filename> [server] [renumber <dev_instance>] " \
16367 "[mac <mac_address>]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016368_(modify_vhost_user_if, \
16369 "<intfc> | sw_if_index <nn> socket <filename>\n" \
16370 "[server] [renumber <dev_instance>]") \
16371_(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
16372_(sw_interface_vhost_user_dump, "") \
16373_(show_version, "") \
Hongjun Ni0e06e2b2016-05-30 19:45:51 +080016374_(vxlan_gpe_add_del_tunnel, \
16375 "local <addr> remote <addr> vni <nn>\n" \
16376 "[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
16377 "[next-ethernet] [next-nsh]\n") \
16378_(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016379_(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016380_(interface_name_renumber, \
16381 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
16382_(input_acl_set_interface, \
16383 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16384 " [l2-table <nn>] [del]") \
16385_(want_ip4_arp_events, "address <ip4-address> [del]") \
John Lo1edfba92016-08-27 01:11:57 -040016386_(want_ip6_nd_events, "address <ip6-address> [del]") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016387_(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
16388_(ip_dump, "ipv4 | ipv6") \
16389_(ipsec_spd_add_del, "spd_id <n> [del]") \
16390_(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
16391 " spid_id <n> ") \
16392_(ipsec_sad_add_del_entry, "sad_id <n> spi <n> crypto_alg <alg>\n" \
16393 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
16394 " integ_alg <alg> integ_key <hex>") \
16395_(ipsec_spd_add_del_entry, "spd_id <n> priority <n> action <action>\n" \
16396 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
16397 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
16398 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" )\
16399_(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
Matus Fabiane5f42fe2016-04-08 11:18:08 +020016400_(ikev2_profile_add_del, "name <profile_name> [del]") \
16401_(ikev2_profile_set_auth, "name <profile_name> auth_method <method>\n" \
16402 "(auth_data 0x<data> | auth_data <data>)") \
16403_(ikev2_profile_set_id, "name <profile_name> id_type <type>\n" \
16404 "(id_data 0x<data> | id_data <data>) (local|remote)") \
16405_(ikev2_profile_set_ts, "name <profile_name> protocol <proto>\n" \
16406 "start_port <port> end_port <port> start_addr <ip4> end_addr <ip4>\n" \
16407 "(local|remote)") \
16408_(ikev2_set_local_key, "file <absolute_file_path>") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016409_(delete_loopback,"sw_if_index <nn>") \
16410_(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
16411_(map_add_domain, \
16412 "ip4-pfx <ip4pfx> ip6-pfx <ip6pfx> " \
16413 "ip6-src <ip6addr> " \
16414 "ea-bits-len <n> psid-offset <n> psid-len <n>") \
16415_(map_del_domain, "index <n>") \
16416_(map_add_del_rule, \
16417 "index <n> psid <n> dst <ip6addr> [del]") \
16418_(map_domain_dump, "") \
16419_(map_rule_dump, "index <map-domain>") \
16420_(want_interface_events, "enable|disable") \
16421_(want_stats,"enable|disable") \
Dave Barachc07bf5d2016-02-17 17:52:26 -050016422_(get_first_msg_id, "client <name>") \
16423_(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
16424_(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
Dave Barachb44e9bc2016-02-19 09:06:23 -050016425 "fib-id <nn> [ip4][ip6][default]") \
Pavel Kotucek00bbf272016-03-03 13:27:11 +010016426_(get_node_graph, " ") \
Shwetha20a64f52016-03-25 10:55:01 +000016427_(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
Vengada Govindan07d2f842016-08-25 10:34:34 -070016428_(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
16429_(ioam_disable, "") \
Andrej Kozemcaka8691752016-07-27 10:33:38 +020016430_(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
16431 " sw_if_index <sw_if_index> p <priority> " \
16432 "w <weight>] [del]") \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020016433_(lisp_add_del_locator, "locator-set <locator_name> " \
16434 "iface <intf> | sw_if_index <sw_if_index> " \
16435 "p <priority> w <weight> [del]") \
Andrej Kozemcakd9831182016-06-20 08:47:57 +020016436_(lisp_add_del_local_eid,"vni <vni> eid " \
16437 "<ipv4|ipv6>/<prefix> | <L2 address> " \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020016438 "locator-set <locator_name> [del]") \
Florin Coras429e7952016-08-02 02:31:03 +020016439_(lisp_gpe_add_del_fwd_entry, "rmt_eid <eid> [lcl_eid <eid>] vni <vni>" \
16440 "dp_table <table> loc-pair <lcl_loc> <rmt_loc> ... [del]") \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020016441_(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
Florin Coras577c3552016-04-21 00:45:40 +020016442_(lisp_gpe_enable_disable, "enable|disable") \
Filip Tehlar46d4e362016-05-09 09:39:26 +020016443_(lisp_enable_disable, "enable|disable") \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020016444_(lisp_gpe_add_del_iface, "up|down") \
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020016445_(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
16446 "[seid <seid>] " \
Andrej Kozemcak438109d2016-07-22 12:54:12 +020016447 "rloc <locator> p <prio> " \
Filip Tehlar4d5cabd2016-07-07 15:40:36 +020016448 "w <weight> [rloc <loc> ... ] " \
Andrej Kozemcak438109d2016-07-22 12:54:12 +020016449 "action <action> [del-all]") \
Filip Tehlar2fdaece2016-09-28 14:27:59 +020016450_(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
16451 "<local-eid>") \
Filip Tehlar53f09e32016-05-19 14:25:44 +020016452_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
Florin Corasdca88042016-09-14 16:01:38 +020016453_(lisp_map_request_mode, "src-dst|dst-only") \
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020016454_(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
Filip Tehlar324112f2016-06-02 16:07:38 +020016455_(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
Filip Tehlarc5bb0d62016-09-02 12:14:31 +020016456_(lisp_locator_set_dump, "[local | remote]") \
16457_(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
Andrej Kozemcak6cc6f912016-07-13 13:01:01 +020016458_(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
16459 "[local] | [remote]") \
Filip Tehlar50a4e142016-08-24 11:28:02 +020016460_(lisp_eid_table_vni_dump, "") \
Filip Tehlarc0681792016-08-24 14:11:07 +020016461_(lisp_eid_table_map_dump, "l2|l3") \
Andrej Kozemcakb92feb62016-03-31 13:51:42 +020016462_(lisp_gpe_tunnel_dump, "") \
Andrej Kozemcaka9edd852016-05-02 12:14:33 +020016463_(lisp_map_resolver_dump, "") \
Filip Tehlar69a9b762016-09-23 10:00:52 +020016464_(lisp_adjacencies_get, "vni <vni>") \
Andrej Kozemcakd9831182016-06-20 08:47:57 +020016465_(show_lisp_status, "") \
Andrej Kozemcakb6e4d392016-06-14 13:55:57 +020016466_(lisp_get_map_request_itr_rlocs, "") \
Andrej Kozemcak914f91b2016-07-18 13:55:37 +020016467_(show_lisp_pitr, "") \
Florin Corasdca88042016-09-14 16:01:38 +020016468_(show_lisp_map_request_mode, "") \
Matus Fabian8a95a482016-05-06 15:14:13 +020016469_(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
Matus Fabian65fcd4d2016-05-13 05:44:48 -070016470_(af_packet_delete, "name <host interface name>") \
Matus Fabian82e29c42016-05-11 04:49:46 -070016471_(policer_add_del, "name <policer name> <params> [del]") \
Matus Fabiane8554802016-05-18 23:40:37 -070016472_(policer_dump, "[name <policer name>]") \
Matus Fabian70e6a8d2016-06-20 08:10:42 -070016473_(policer_classify_set_interface, \
16474 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
16475 " [l2-table <nn>] [del]") \
16476_(policer_classify_dump, "type [ip4|ip6|l2]") \
Matus Fabian82e29c42016-05-11 04:49:46 -070016477_(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
16478 "[master|slave]") \
marek zavodsky2c21a9a2016-06-21 05:35:16 +020016479_(netmap_delete, "name <interface name>") \
marek zavodsky2c21a9a2016-06-21 05:35:16 +020016480_(mpls_eth_tunnel_dump, "tunnel_index <tunnel-id>") \
16481_(mpls_fib_encap_dump, "") \
Neale Ranns1357f3b2016-10-16 12:01:42 -070016482_(mpls_fib_dump, "") \
Pavel Kotucek20c90f72016-06-07 14:44:26 +020016483_(classify_table_ids, "") \
16484_(classify_table_by_interface, "sw_if_index <sw_if_index>") \
16485_(classify_table_info, "table_id <nn>") \
Juraj Slobodaac645ad2016-07-07 00:18:57 -070016486_(classify_session_dump, "table_id <nn>") \
Juraj Slobodaffa652a2016-08-07 23:43:42 -070016487_(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
16488 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
16489 "[template_interval <nn>] [udp_checksum]") \
16490_(ipfix_exporter_dump, "") \
16491_(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
16492_(ipfix_classify_stream_dump, "") \
16493_(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]")\
16494_(ipfix_classify_table_dump, "") \
Pavel Kotucek9e6ed6e2016-07-12 10:18:26 +020016495_(get_next_index, "node-name <node-name> next-node-name <node-name>") \
16496_(pg_create_interface, "if_id <nn>") \
16497_(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
Dave Barach6f9bca22016-04-30 10:25:32 -040016498_(pg_enable_disable, "[stream <id>] disable") \
16499_(ip_source_and_port_range_check_add_del, \
16500 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
16501_(ip_source_and_port_range_check_interface_add_del, \
Keith Burns (alagalah)9d3a8792016-08-02 11:57:37 -070016502 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
Matus Fabian694265d2016-08-10 01:55:36 -070016503 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
16504_(ipsec_gre_add_del_tunnel, \
16505 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
Pavel Kotucekd85590a2016-08-26 13:35:40 +020016506_(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
Pavel Kotucek95300d12016-08-26 16:11:36 +020016507_(delete_subif,"sub_sw_if_index <nn> sub_if_id <nn>") \
16508_(l2_interface_pbb_tag_rewrite, \
16509 "<intfc> | sw_if_index <nn> \n" \
Alexander Popovsky (apopovsk)4a7e58b2016-10-05 22:31:23 -070016510 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
16511 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
Juraj Sloboda506b2452016-08-07 23:45:24 -070016512_(punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
16513_(flow_classify_set_interface, \
16514 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
16515_(flow_classify_dump, "type [ip4|ip6]")
Ed Warnickecb9cada2015-12-08 15:45:58 -070016516
16517/* List of command functions, CLI names map directly to functions */
16518#define foreach_cli_function \
16519_(comment, "usage: comment <ignore-rest-of-line>") \
16520_(dump_interface_table, "usage: dump_interface_table") \
16521_(dump_sub_interface_table, "usage: dump_sub_interface_table") \
16522_(dump_ipv4_table, "usage: dump_ipv4_table") \
16523_(dump_ipv6_table, "usage: dump_ipv6_table") \
16524_(dump_stats_table, "usage: dump_stats_table") \
16525_(dump_macro_table, "usage: dump_macro_table ") \
Dave Barachb44e9bc2016-02-19 09:06:23 -050016526_(dump_node_table, "usage: dump_node_table") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016527_(echo, "usage: echo <message>") \
16528_(exec, "usage: exec <vpe-debug-CLI-command>") \
Ole Troanc27213a2016-08-31 14:50:49 +020016529_(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016530_(help, "usage: help") \
16531_(q, "usage: quit") \
16532_(quit, "usage: quit") \
Dave Barachb44e9bc2016-02-19 09:06:23 -050016533_(search_node_table, "usage: search_node_table <name>...") \
Ed Warnickecb9cada2015-12-08 15:45:58 -070016534_(set, "usage: set <variable-name> <value>") \
16535_(script, "usage: script <file-name>") \
16536_(unset, "usage: unset <variable-name>")
16537
16538#define _(N,n) \
16539 static void vl_api_##n##_t_handler_uni \
16540 (vl_api_##n##_t * mp) \
16541 { \
16542 vat_main_t * vam = &vat_main; \
16543 if (vam->json_output) { \
16544 vl_api_##n##_t_handler_json(mp); \
16545 } else { \
16546 vl_api_##n##_t_handler(mp); \
16547 } \
16548 }
16549foreach_vpe_api_reply_msg;
16550#undef _
16551
Dave Barach72d72232016-08-04 10:15:08 -040016552void
16553vat_api_hookup (vat_main_t * vam)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016554{
16555#define _(N,n) \
16556 vl_msg_api_set_handlers(VL_API_##N, #n, \
16557 vl_api_##n##_t_handler_uni, \
16558 vl_noop_handler, \
16559 vl_api_##n##_t_endian, \
16560 vl_api_##n##_t_print, \
Hongjun Ni11bfc2f2016-07-22 18:19:19 +080016561 sizeof(vl_api_##n##_t), 1);
Dave Barach72d72232016-08-04 10:15:08 -040016562 foreach_vpe_api_reply_msg;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016563#undef _
16564
Dave Barach72d72232016-08-04 10:15:08 -040016565 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016566
Dave Barach72d72232016-08-04 10:15:08 -040016567 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
Ed Warnickecb9cada2015-12-08 15:45:58 -070016568
Dave Barach72d72232016-08-04 10:15:08 -040016569 vam->function_by_name = hash_create_string (0, sizeof (uword));
Ed Warnickecb9cada2015-12-08 15:45:58 -070016570
Dave Barach72d72232016-08-04 10:15:08 -040016571 vam->help_by_name = hash_create_string (0, sizeof (uword));
Ed Warnickecb9cada2015-12-08 15:45:58 -070016572
Dave Barach72d72232016-08-04 10:15:08 -040016573 /* API messages we can send */
Ed Warnickecb9cada2015-12-08 15:45:58 -070016574#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
Dave Barach72d72232016-08-04 10:15:08 -040016575 foreach_vpe_api_msg;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016576#undef _
16577
Dave Barach72d72232016-08-04 10:15:08 -040016578 /* Help strings */
Ed Warnickecb9cada2015-12-08 15:45:58 -070016579#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
Dave Barach72d72232016-08-04 10:15:08 -040016580 foreach_vpe_api_msg;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016581#undef _
16582
Dave Barach72d72232016-08-04 10:15:08 -040016583 /* CLI functions */
Ed Warnickecb9cada2015-12-08 15:45:58 -070016584#define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
Dave Barach72d72232016-08-04 10:15:08 -040016585 foreach_cli_function;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016586#undef _
16587
Dave Barach72d72232016-08-04 10:15:08 -040016588 /* Help strings */
Ed Warnickecb9cada2015-12-08 15:45:58 -070016589#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
Dave Barach72d72232016-08-04 10:15:08 -040016590 foreach_cli_function;
Ed Warnickecb9cada2015-12-08 15:45:58 -070016591#undef _
16592}
16593
16594#undef vl_api_version
16595#define vl_api_version(n,v) static u32 vpe_api_version = v;
Dave Barachaa6920e2016-06-27 09:25:13 -040016596#include <vpp-api/vpe.api.h>
Ed Warnickecb9cada2015-12-08 15:45:58 -070016597#undef vl_api_version
16598
Dave Barach72d72232016-08-04 10:15:08 -040016599void
16600vl_client_add_api_signatures (vl_api_memclnt_create_t * mp)
Ed Warnickecb9cada2015-12-08 15:45:58 -070016601{
Dave Barach72d72232016-08-04 10:15:08 -040016602 /*
16603 * Send the main API signature in slot 0. This bit of code must
16604 * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
16605 */
16606 mp->api_versions[0] = clib_host_to_net_u32 (vpe_api_version);
Ed Warnickecb9cada2015-12-08 15:45:58 -070016607}
Dave Barach72d72232016-08-04 10:15:08 -040016608
16609/*
16610 * fd.io coding-style-patch-verification: ON
16611 *
16612 * Local Variables:
16613 * eval: (c-set-style "gnu")
16614 * End:
16615 */