blob: 46974d2d299bb0a080dc1a4c819f2ce552e9935d [file] [log] [blame]
Damjan Marion7cd468a2016-12-19 23:05:39 +01001/*
2 *------------------------------------------------------------------
3 * api_format.c
4 *
5 * Copyright (c) 2014-2016 Cisco and/or its affiliates.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *------------------------------------------------------------------
18 */
19
20#include <vat/vat.h>
Neale Ranns86327be2018-11-02 09:14:01 -070021#include <vpp/api/types.h>
Dave Barach59b25652017-09-10 15:04:27 -040022#include <vppinfra/socket.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010023#include <vlibapi/api.h>
24#include <vlibmemory/api.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010025#include <vnet/ip/ip.h>
John Lo7f358b32018-04-28 01:19:24 -040026#include <vnet/ip/ip_neighbor.h>
Neale Ranns37029302018-08-10 05:30:06 -070027#include <vnet/ip/ip_types_api.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010028#include <vnet/l2/l2_input.h>
29#include <vnet/l2tp/l2tp.h>
30#include <vnet/vxlan/vxlan.h>
Marco Varleseb598f1d2017-09-19 14:25:28 +020031#include <vnet/geneve/geneve.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010032#include <vnet/gre/gre.h>
33#include <vnet/vxlan-gpe/vxlan_gpe.h>
34#include <vnet/lisp-gpe/lisp_gpe.h>
35
36#include <vpp/api/vpe_msg_enum.h>
37#include <vnet/l2/l2_classify.h>
38#include <vnet/l2/l2_vtr.h>
Andrew Yourtchenko815d7d52018-02-07 11:37:02 +010039#include <vnet/classify/in_out_acl.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010040#include <vnet/classify/policer_classify.h>
41#include <vnet/classify/flow_classify.h>
42#include <vnet/mpls/mpls.h>
43#include <vnet/ipsec/ipsec.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010044#include <inttypes.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010045#include <vnet/cop/cop.h>
46#include <vnet/ip/ip6_hop_by_hop.h>
47#include <vnet/ip/ip_source_and_port_range_check.h>
48#include <vnet/policer/xlate.h>
49#include <vnet/span/span.h>
50#include <vnet/policer/policer.h>
51#include <vnet/policer/police.h>
Neale Ranns32e1c012016-11-22 17:07:28 +000052#include <vnet/mfib/mfib_types.h>
John Lo70bfcaf2017-11-14 13:19:26 -050053#include <vnet/dhcp/dhcp_proxy.h>
Steven9cd2d7a2017-12-20 12:43:01 -080054#include <vnet/bonding/node.h>
Igor Mikhailov (imichail)582caa32018-04-26 21:33:02 -070055#include <vnet/qos/qos_types.h>
Neale Ranns37029302018-08-10 05:30:06 -070056#include <vnet/ethernet/ethernet_types_api.h>
57#include <vnet/ip/ip_types_api.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010058#include "vat/json_format.h"
Neale Ranns86327be2018-11-02 09:14:01 -070059#include <vnet/ip/ip_types_api.h>
60#include <vnet/ethernet/ethernet_types_api.h>
Damjan Marion7cd468a2016-12-19 23:05:39 +010061
62#include <inttypes.h>
63#include <sys/stat.h>
64
65#define vl_typedefs /* define message structures */
66#include <vpp/api/vpe_all_api_h.h>
67#undef vl_typedefs
68
69/* declare message handlers for each api */
70
71#define vl_endianfun /* define message structures */
72#include <vpp/api/vpe_all_api_h.h>
73#undef vl_endianfun
74
75/* instantiate all the print functions we know about */
76#define vl_print(handle, ...)
77#define vl_printfun
78#include <vpp/api/vpe_all_api_h.h>
79#undef vl_printfun
80
Dave Barach2d6b2d62017-01-25 16:32:08 -050081#define __plugin_msg_base 0
Dave Barachfe6bdfd2017-01-20 19:50:09 -050082#include <vlibapi/vat_helper_macros.h>
83
Dave Barach59b25652017-09-10 15:04:27 -040084#if VPP_API_TEST_BUILTIN == 0
85#include <netdb.h>
86
87u32
88vl (void *p)
89{
90 return vec_len (p);
91}
92
93int
94vat_socket_connect (vat_main_t * vam)
95{
Florin Coras66a10032018-12-21 16:23:09 -080096 int rv;
Florin Coras90a63982017-12-19 04:50:01 -080097 vam->socket_client_main = &socket_client_main;
Florin Coras66a10032018-12-21 16:23:09 -080098 if ((rv = vl_socket_client_connect ((char *) vam->socket_name,
99 "vpp_api_test",
100 0 /* default socket rx, tx buffer */ )))
101 return rv;
102 /* vpp expects the client index in network order */
103 vam->my_client_index = htonl (socket_client_main.client_index);
104 return 0;
Dave Barach59b25652017-09-10 15:04:27 -0400105}
106#else /* vpp built-in case, we don't do sockets... */
107int
108vat_socket_connect (vat_main_t * vam)
109{
110 return 0;
111}
112
Florin Coras90a63982017-12-19 04:50:01 -0800113int
114vl_socket_client_read (int wait)
Dave Barach59b25652017-09-10 15:04:27 -0400115{
Florin Coras90a63982017-12-19 04:50:01 -0800116 return -1;
Dave Barach59b25652017-09-10 15:04:27 -0400117};
Florin Coras90a63982017-12-19 04:50:01 -0800118
119int
120vl_socket_client_write ()
121{
122 return -1;
123};
124
125void *
126vl_socket_client_msg_alloc (int nbytes)
127{
128 return 0;
129}
Dave Barach59b25652017-09-10 15:04:27 -0400130#endif
131
132
Dave Barachfe6bdfd2017-01-20 19:50:09 -0500133f64
134vat_time_now (vat_main_t * vam)
135{
136#if VPP_API_TEST_BUILTIN
137 return vlib_time_now (vam->vlib_main);
138#else
139 return clib_time_now (&vam->clib_time);
140#endif
141}
142
143void
144errmsg (char *fmt, ...)
145{
146 vat_main_t *vam = &vat_main;
147 va_list va;
148 u8 *s;
149
150 va_start (va, fmt);
151 s = va_format (0, fmt, &va);
152 va_end (va);
153
154 vec_add1 (s, 0);
155
156#if VPP_API_TEST_BUILTIN
157 vlib_cli_output (vam->vlib_main, (char *) s);
158#else
159 {
160 if (vam->ifp != stdin)
161 fformat (vam->ofp, "%s(%d): \n", vam->current_file,
162 vam->input_line_number);
163 fformat (vam->ofp, (char *) s);
164 fflush (vam->ofp);
165 }
166#endif
167
168 vec_free (s);
169}
170
Dave Barach4a3f69c2017-02-22 12:44:56 -0500171#if VPP_API_TEST_BUILTIN == 0
Damjan Marion7cd468a2016-12-19 23:05:39 +0100172static uword
173api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
174{
175 vat_main_t *vam = va_arg (*args, vat_main_t *);
176 u32 *result = va_arg (*args, u32 *);
177 u8 *if_name;
178 uword *p;
179
180 if (!unformat (input, "%s", &if_name))
181 return 0;
182
183 p = hash_get_mem (vam->sw_if_index_by_interface_name, if_name);
184 if (p == 0)
185 return 0;
186 *result = p[0];
187 return 1;
188}
189
eyal bariaf86a482018-04-17 11:20:27 +0300190static uword
191api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
192{
193 return 0;
194}
195
Damjan Marion7cd468a2016-12-19 23:05:39 +0100196/* Parse an IP4 address %d.%d.%d.%d. */
197uword
198unformat_ip4_address (unformat_input_t * input, va_list * args)
199{
200 u8 *result = va_arg (*args, u8 *);
201 unsigned a[4];
202
203 if (!unformat (input, "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]))
204 return 0;
205
206 if (a[0] >= 256 || a[1] >= 256 || a[2] >= 256 || a[3] >= 256)
207 return 0;
208
209 result[0] = a[0];
210 result[1] = a[1];
211 result[2] = a[2];
212 result[3] = a[3];
213
214 return 1;
215}
216
217uword
218unformat_ethernet_address (unformat_input_t * input, va_list * args)
219{
220 u8 *result = va_arg (*args, u8 *);
221 u32 i, a[6];
222
223 if (!unformat (input, "%_%x:%x:%x:%x:%x:%x%_",
224 &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]))
225 return 0;
226
227 /* Check range. */
228 for (i = 0; i < 6; i++)
229 if (a[i] >= (1 << 8))
230 return 0;
231
232 for (i = 0; i < 6; i++)
233 result[i] = a[i];
234
235 return 1;
236}
237
238/* Returns ethernet type as an int in host byte order. */
239uword
240unformat_ethernet_type_host_byte_order (unformat_input_t * input,
241 va_list * args)
242{
243 u16 *result = va_arg (*args, u16 *);
244 int type;
245
246 /* Numeric type. */
247 if (unformat (input, "0x%x", &type) || unformat (input, "%d", &type))
248 {
249 if (type >= (1 << 16))
250 return 0;
251 *result = type;
252 return 1;
253 }
254 return 0;
255}
256
257/* Parse an IP6 address. */
258uword
259unformat_ip6_address (unformat_input_t * input, va_list * args)
260{
261 ip6_address_t *result = va_arg (*args, ip6_address_t *);
262 u16 hex_quads[8];
263 uword hex_quad, n_hex_quads, hex_digit, n_hex_digits;
264 uword c, n_colon, double_colon_index;
265
266 n_hex_quads = hex_quad = n_hex_digits = n_colon = 0;
267 double_colon_index = ARRAY_LEN (hex_quads);
268 while ((c = unformat_get_input (input)) != UNFORMAT_END_OF_INPUT)
269 {
270 hex_digit = 16;
271 if (c >= '0' && c <= '9')
272 hex_digit = c - '0';
273 else if (c >= 'a' && c <= 'f')
274 hex_digit = c + 10 - 'a';
275 else if (c >= 'A' && c <= 'F')
276 hex_digit = c + 10 - 'A';
277 else if (c == ':' && n_colon < 2)
278 n_colon++;
279 else
280 {
281 unformat_put_input (input);
282 break;
283 }
284
285 /* Too many hex quads. */
286 if (n_hex_quads >= ARRAY_LEN (hex_quads))
287 return 0;
288
289 if (hex_digit < 16)
290 {
291 hex_quad = (hex_quad << 4) | hex_digit;
292
293 /* Hex quad must fit in 16 bits. */
294 if (n_hex_digits >= 4)
295 return 0;
296
297 n_colon = 0;
298 n_hex_digits++;
299 }
300
301 /* Save position of :: */
302 if (n_colon == 2)
303 {
304 /* More than one :: ? */
305 if (double_colon_index < ARRAY_LEN (hex_quads))
306 return 0;
307 double_colon_index = n_hex_quads;
308 }
309
310 if (n_colon > 0 && n_hex_digits > 0)
311 {
312 hex_quads[n_hex_quads++] = hex_quad;
313 hex_quad = 0;
314 n_hex_digits = 0;
315 }
316 }
317
318 if (n_hex_digits > 0)
319 hex_quads[n_hex_quads++] = hex_quad;
320
321 {
322 word i;
323
324 /* Expand :: to appropriate number of zero hex quads. */
325 if (double_colon_index < ARRAY_LEN (hex_quads))
326 {
327 word n_zero = ARRAY_LEN (hex_quads) - n_hex_quads;
328
329 for (i = n_hex_quads - 1; i >= (signed) double_colon_index; i--)
330 hex_quads[n_zero + i] = hex_quads[i];
331
332 for (i = 0; i < n_zero; i++)
333 hex_quads[double_colon_index + i] = 0;
334
335 n_hex_quads = ARRAY_LEN (hex_quads);
336 }
337
338 /* Too few hex quads given. */
339 if (n_hex_quads < ARRAY_LEN (hex_quads))
340 return 0;
341
342 for (i = 0; i < ARRAY_LEN (hex_quads); i++)
343 result->as_u16[i] = clib_host_to_net_u16 (hex_quads[i]);
344
345 return 1;
346 }
347}
348
349uword
350unformat_ipsec_policy_action (unformat_input_t * input, va_list * args)
351{
352 u32 *r = va_arg (*args, u32 *);
353
354 if (0);
355#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_POLICY_ACTION_##f;
356 foreach_ipsec_policy_action
357#undef _
358 else
359 return 0;
360 return 1;
361}
362
Damjan Marion7cd468a2016-12-19 23:05:39 +0100363u8 *
364format_ipsec_crypto_alg (u8 * s, va_list * args)
365{
366 u32 i = va_arg (*args, u32);
367 u8 *t = 0;
368
369 switch (i)
370 {
371#define _(v,f,str) case IPSEC_CRYPTO_ALG_##f: t = (u8 *) str; break;
372 foreach_ipsec_crypto_alg
373#undef _
374 default:
375 return format (s, "unknown");
376 }
377 return format (s, "%s", t);
378}
379
Damjan Marion7cd468a2016-12-19 23:05:39 +0100380u8 *
381format_ipsec_integ_alg (u8 * s, va_list * args)
382{
383 u32 i = va_arg (*args, u32);
384 u8 *t = 0;
385
386 switch (i)
387 {
388#define _(v,f,str) case IPSEC_INTEG_ALG_##f: t = (u8 *) str; break;
389 foreach_ipsec_integ_alg
390#undef _
391 default:
392 return format (s, "unknown");
393 }
394 return format (s, "%s", t);
395}
396
Dave Barach4a3f69c2017-02-22 12:44:56 -0500397#else /* VPP_API_TEST_BUILTIN == 1 */
398static uword
399api_unformat_sw_if_index (unformat_input_t * input, va_list * args)
400{
401 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
402 vnet_main_t *vnm = vnet_get_main ();
403 u32 *result = va_arg (*args, u32 *);
Dave Barach4a3f69c2017-02-22 12:44:56 -0500404
eyal bariaf86a482018-04-17 11:20:27 +0300405 return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result);
Dave Barach4a3f69c2017-02-22 12:44:56 -0500406}
eyal bariaf86a482018-04-17 11:20:27 +0300407
408static uword
409api_unformat_hw_if_index (unformat_input_t * input, va_list * args)
410{
411 vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *);
412 vnet_main_t *vnm = vnet_get_main ();
413 u32 *result = va_arg (*args, u32 *);
414
415 return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result);
416}
417
Damjan Marion7cd468a2016-12-19 23:05:39 +0100418#endif /* VPP_API_TEST_BUILTIN */
419
Neale Ranns17dcec02019-01-09 21:22:20 -0800420uword
421unformat_ipsec_api_crypto_alg (unformat_input_t * input, va_list * args)
422{
423 u32 *r = va_arg (*args, u32 *);
424
425 if (0);
426#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_CRYPTO_ALG_##f;
427 foreach_ipsec_crypto_alg
428#undef _
429 else
430 return 0;
431 return 1;
432}
433
434uword
435unformat_ipsec_api_integ_alg (unformat_input_t * input, va_list * args)
436{
437 u32 *r = va_arg (*args, u32 *);
438
439 if (0);
440#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_INTEG_ALG_##f;
441 foreach_ipsec_integ_alg
442#undef _
443 else
444 return 0;
445 return 1;
446}
447
Damjan Marion7cd468a2016-12-19 23:05:39 +0100448static uword
449unformat_policer_rate_type (unformat_input_t * input, va_list * args)
450{
451 u8 *r = va_arg (*args, u8 *);
452
453 if (unformat (input, "kbps"))
454 *r = SSE2_QOS_RATE_KBPS;
455 else if (unformat (input, "pps"))
456 *r = SSE2_QOS_RATE_PPS;
457 else
458 return 0;
459 return 1;
460}
461
462static uword
463unformat_policer_round_type (unformat_input_t * input, va_list * args)
464{
465 u8 *r = va_arg (*args, u8 *);
466
467 if (unformat (input, "closest"))
468 *r = SSE2_QOS_ROUND_TO_CLOSEST;
469 else if (unformat (input, "up"))
470 *r = SSE2_QOS_ROUND_TO_UP;
471 else if (unformat (input, "down"))
472 *r = SSE2_QOS_ROUND_TO_DOWN;
473 else
474 return 0;
475 return 1;
476}
477
478static uword
479unformat_policer_type (unformat_input_t * input, va_list * args)
480{
481 u8 *r = va_arg (*args, u8 *);
482
483 if (unformat (input, "1r2c"))
484 *r = SSE2_QOS_POLICER_TYPE_1R2C;
485 else if (unformat (input, "1r3c"))
486 *r = SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697;
487 else if (unformat (input, "2r3c-2698"))
488 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698;
489 else if (unformat (input, "2r3c-4115"))
490 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115;
491 else if (unformat (input, "2r3c-mef5cf1"))
492 *r = SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1;
493 else
494 return 0;
495 return 1;
496}
497
498static uword
499unformat_dscp (unformat_input_t * input, va_list * va)
500{
501 u8 *r = va_arg (*va, u8 *);
502
503 if (0);
504#define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
505 foreach_vnet_dscp
506#undef _
507 else
508 return 0;
509 return 1;
510}
511
512static uword
513unformat_policer_action_type (unformat_input_t * input, va_list * va)
514{
515 sse2_qos_pol_action_params_st *a
516 = va_arg (*va, sse2_qos_pol_action_params_st *);
517
518 if (unformat (input, "drop"))
519 a->action_type = SSE2_QOS_ACTION_DROP;
520 else if (unformat (input, "transmit"))
521 a->action_type = SSE2_QOS_ACTION_TRANSMIT;
522 else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
523 a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
524 else
525 return 0;
526 return 1;
527}
528
529static uword
530unformat_policer_classify_table_type (unformat_input_t * input, va_list * va)
531{
532 u32 *r = va_arg (*va, u32 *);
533 u32 tid;
534
535 if (unformat (input, "ip4"))
536 tid = POLICER_CLASSIFY_TABLE_IP4;
537 else if (unformat (input, "ip6"))
538 tid = POLICER_CLASSIFY_TABLE_IP6;
539 else if (unformat (input, "l2"))
540 tid = POLICER_CLASSIFY_TABLE_L2;
541 else
542 return 0;
543
544 *r = tid;
545 return 1;
546}
547
548static uword
549unformat_flow_classify_table_type (unformat_input_t * input, va_list * va)
550{
551 u32 *r = va_arg (*va, u32 *);
552 u32 tid;
553
554 if (unformat (input, "ip4"))
555 tid = FLOW_CLASSIFY_TABLE_IP4;
556 else if (unformat (input, "ip6"))
557 tid = FLOW_CLASSIFY_TABLE_IP6;
558 else
559 return 0;
560
561 *r = tid;
562 return 1;
563}
564
Neale Ranns32e1c012016-11-22 17:07:28 +0000565static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT;
566static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG;
567static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG;
568static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT;
569
Dave Barach4a3f69c2017-02-22 12:44:56 -0500570#if (VPP_API_TEST_BUILTIN==0)
Neale Ranns32e1c012016-11-22 17:07:28 +0000571uword
572unformat_mfib_itf_flags (unformat_input_t * input, va_list * args)
573{
574 mfib_itf_flags_t old, *iflags = va_arg (*args, mfib_itf_flags_t *);
575 mfib_itf_attribute_t attr;
576
577 old = *iflags;
578 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
579 {
580 if (unformat (input, mfib_itf_flag_long_names[attr]))
581 *iflags |= (1 << attr);
582 }
583 FOR_EACH_MFIB_ITF_ATTRIBUTE (attr)
584 {
585 if (unformat (input, mfib_itf_flag_names[attr]))
586 *iflags |= (1 << attr);
587 }
588
589 return (old == *iflags ? 0 : 1);
590}
591
592uword
593unformat_mfib_entry_flags (unformat_input_t * input, va_list * args)
594{
595 mfib_entry_flags_t old, *eflags = va_arg (*args, mfib_entry_flags_t *);
596 mfib_entry_attribute_t attr;
597
598 old = *eflags;
599 FOR_EACH_MFIB_ATTRIBUTE (attr)
600 {
601 if (unformat (input, mfib_flag_long_names[attr]))
602 *eflags |= (1 << attr);
603 }
604 FOR_EACH_MFIB_ATTRIBUTE (attr)
605 {
606 if (unformat (input, mfib_flag_names[attr]))
607 *eflags |= (1 << attr);
608 }
609
610 return (old == *eflags ? 0 : 1);
611}
612
Damjan Marion7cd468a2016-12-19 23:05:39 +0100613u8 *
614format_ip4_address (u8 * s, va_list * args)
615{
616 u8 *a = va_arg (*args, u8 *);
617 return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
618}
619
620u8 *
621format_ip6_address (u8 * s, va_list * args)
622{
623 ip6_address_t *a = va_arg (*args, ip6_address_t *);
624 u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
625
626 i_max_n_zero = ARRAY_LEN (a->as_u16);
627 max_n_zeros = 0;
628 i_first_zero = i_max_n_zero;
629 n_zeros = 0;
630 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
631 {
632 u32 is_zero = a->as_u16[i] == 0;
633 if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
634 {
635 i_first_zero = i;
636 n_zeros = 0;
637 }
638 n_zeros += is_zero;
639 if ((!is_zero && n_zeros > max_n_zeros)
640 || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
641 {
642 i_max_n_zero = i_first_zero;
643 max_n_zeros = n_zeros;
644 i_first_zero = ARRAY_LEN (a->as_u16);
645 n_zeros = 0;
646 }
647 }
648
649 last_double_colon = 0;
650 for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
651 {
652 if (i == i_max_n_zero && max_n_zeros > 1)
653 {
654 s = format (s, "::");
655 i += max_n_zeros - 1;
656 last_double_colon = 1;
657 }
658 else
659 {
660 s = format (s, "%s%x",
661 (last_double_colon || i == 0) ? "" : ":",
662 clib_net_to_host_u16 (a->as_u16[i]));
663 last_double_colon = 0;
664 }
665 }
666
667 return s;
668}
669
670/* Format an IP46 address. */
671u8 *
672format_ip46_address (u8 * s, va_list * args)
673{
674 ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
675 ip46_type_t type = va_arg (*args, ip46_type_t);
676 int is_ip4 = 1;
677
678 switch (type)
679 {
680 case IP46_TYPE_ANY:
681 is_ip4 = ip46_address_is_ip4 (ip46);
682 break;
683 case IP46_TYPE_IP4:
684 is_ip4 = 1;
685 break;
686 case IP46_TYPE_IP6:
687 is_ip4 = 0;
688 break;
689 }
690
691 return is_ip4 ?
692 format (s, "%U", format_ip4_address, &ip46->ip4) :
693 format (s, "%U", format_ip6_address, &ip46->ip6);
694}
695
696u8 *
697format_ethernet_address (u8 * s, va_list * args)
698{
699 u8 *a = va_arg (*args, u8 *);
700
701 return format (s, "%02x:%02x:%02x:%02x:%02x:%02x",
702 a[0], a[1], a[2], a[3], a[4], a[5]);
703}
704#endif
705
706static void
707increment_v4_address (ip4_address_t * a)
708{
709 u32 v;
710
711 v = ntohl (a->as_u32) + 1;
712 a->as_u32 = ntohl (v);
713}
714
715static void
716increment_v6_address (ip6_address_t * a)
717{
718 u64 v0, v1;
719
720 v0 = clib_net_to_host_u64 (a->as_u64[0]);
721 v1 = clib_net_to_host_u64 (a->as_u64[1]);
722
723 v1 += 1;
724 if (v1 == 0)
725 v0 += 1;
726 a->as_u64[0] = clib_net_to_host_u64 (v0);
727 a->as_u64[1] = clib_net_to_host_u64 (v1);
728}
729
730static void
Mohsin Kazmi57938f62017-10-27 21:28:07 +0200731increment_mac_address (u8 * mac)
Damjan Marion7cd468a2016-12-19 23:05:39 +0100732{
Mohsin Kazmi57938f62017-10-27 21:28:07 +0200733 u64 tmp = *((u64 *) mac);
Damjan Marion7cd468a2016-12-19 23:05:39 +0100734 tmp = clib_net_to_host_u64 (tmp);
735 tmp += 1 << 16; /* skip unused (least significant) octets */
736 tmp = clib_host_to_net_u64 (tmp);
Mohsin Kazmi57938f62017-10-27 21:28:07 +0200737
738 clib_memcpy (mac, &tmp, 6);
Damjan Marion7cd468a2016-12-19 23:05:39 +0100739}
740
741static void vl_api_create_loopback_reply_t_handler
742 (vl_api_create_loopback_reply_t * mp)
743{
744 vat_main_t *vam = &vat_main;
745 i32 retval = ntohl (mp->retval);
746
747 vam->retval = retval;
748 vam->regenerate_interface_table = 1;
749 vam->sw_if_index = ntohl (mp->sw_if_index);
750 vam->result_ready = 1;
751}
752
753static void vl_api_create_loopback_reply_t_handler_json
754 (vl_api_create_loopback_reply_t * mp)
755{
756 vat_main_t *vam = &vat_main;
757 vat_json_node_t node;
758
759 vat_json_init_object (&node);
760 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
761 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
762
763 vat_json_print (vam->ofp, &node);
764 vat_json_free (&node);
765 vam->retval = ntohl (mp->retval);
766 vam->result_ready = 1;
767}
768
Jon Loeligerc83c3b72017-02-23 13:57:35 -0600769static void vl_api_create_loopback_instance_reply_t_handler
770 (vl_api_create_loopback_instance_reply_t * mp)
771{
772 vat_main_t *vam = &vat_main;
773 i32 retval = ntohl (mp->retval);
774
775 vam->retval = retval;
776 vam->regenerate_interface_table = 1;
777 vam->sw_if_index = ntohl (mp->sw_if_index);
778 vam->result_ready = 1;
779}
780
781static void vl_api_create_loopback_instance_reply_t_handler_json
782 (vl_api_create_loopback_instance_reply_t * mp)
783{
784 vat_main_t *vam = &vat_main;
785 vat_json_node_t node;
786
787 vat_json_init_object (&node);
788 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
789 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
790
791 vat_json_print (vam->ofp, &node);
792 vat_json_free (&node);
793 vam->retval = ntohl (mp->retval);
794 vam->result_ready = 1;
795}
796
Damjan Marion7cd468a2016-12-19 23:05:39 +0100797static void vl_api_af_packet_create_reply_t_handler
798 (vl_api_af_packet_create_reply_t * mp)
799{
800 vat_main_t *vam = &vat_main;
801 i32 retval = ntohl (mp->retval);
802
803 vam->retval = retval;
804 vam->regenerate_interface_table = 1;
805 vam->sw_if_index = ntohl (mp->sw_if_index);
806 vam->result_ready = 1;
807}
808
809static void vl_api_af_packet_create_reply_t_handler_json
810 (vl_api_af_packet_create_reply_t * mp)
811{
812 vat_main_t *vam = &vat_main;
813 vat_json_node_t node;
814
815 vat_json_init_object (&node);
816 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
817 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
818
819 vat_json_print (vam->ofp, &node);
820 vat_json_free (&node);
821
822 vam->retval = ntohl (mp->retval);
823 vam->result_ready = 1;
824}
825
826static void vl_api_create_vlan_subif_reply_t_handler
827 (vl_api_create_vlan_subif_reply_t * mp)
828{
829 vat_main_t *vam = &vat_main;
830 i32 retval = ntohl (mp->retval);
831
832 vam->retval = retval;
833 vam->regenerate_interface_table = 1;
834 vam->sw_if_index = ntohl (mp->sw_if_index);
835 vam->result_ready = 1;
836}
837
838static void vl_api_create_vlan_subif_reply_t_handler_json
839 (vl_api_create_vlan_subif_reply_t * mp)
840{
841 vat_main_t *vam = &vat_main;
842 vat_json_node_t node;
843
844 vat_json_init_object (&node);
845 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
846 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
847
848 vat_json_print (vam->ofp, &node);
849 vat_json_free (&node);
850
851 vam->retval = ntohl (mp->retval);
852 vam->result_ready = 1;
853}
854
855static void vl_api_create_subif_reply_t_handler
856 (vl_api_create_subif_reply_t * mp)
857{
858 vat_main_t *vam = &vat_main;
859 i32 retval = ntohl (mp->retval);
860
861 vam->retval = retval;
862 vam->regenerate_interface_table = 1;
863 vam->sw_if_index = ntohl (mp->sw_if_index);
864 vam->result_ready = 1;
865}
866
867static void vl_api_create_subif_reply_t_handler_json
868 (vl_api_create_subif_reply_t * mp)
869{
870 vat_main_t *vam = &vat_main;
871 vat_json_node_t node;
872
873 vat_json_init_object (&node);
874 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
875 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
876
877 vat_json_print (vam->ofp, &node);
878 vat_json_free (&node);
879
880 vam->retval = ntohl (mp->retval);
881 vam->result_ready = 1;
882}
883
884static void vl_api_interface_name_renumber_reply_t_handler
885 (vl_api_interface_name_renumber_reply_t * mp)
886{
887 vat_main_t *vam = &vat_main;
888 i32 retval = ntohl (mp->retval);
889
890 vam->retval = retval;
891 vam->regenerate_interface_table = 1;
892 vam->result_ready = 1;
893}
894
895static void vl_api_interface_name_renumber_reply_t_handler_json
896 (vl_api_interface_name_renumber_reply_t * mp)
897{
898 vat_main_t *vam = &vat_main;
899 vat_json_node_t node;
900
901 vat_json_init_object (&node);
902 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
903
904 vat_json_print (vam->ofp, &node);
905 vat_json_free (&node);
906
907 vam->retval = ntohl (mp->retval);
908 vam->result_ready = 1;
909}
910
911/*
912 * Special-case: build the interface table, maintain
913 * the next loopback sw_if_index vbl.
914 */
915static void vl_api_sw_interface_details_t_handler
916 (vl_api_sw_interface_details_t * mp)
917{
918 vat_main_t *vam = &vat_main;
919 u8 *s = format (0, "%s%c", mp->interface_name, 0);
920
921 hash_set_mem (vam->sw_if_index_by_interface_name, s,
922 ntohl (mp->sw_if_index));
923
924 /* In sub interface case, fill the sub interface table entry */
925 if (mp->sw_if_index != mp->sup_sw_if_index)
926 {
927 sw_interface_subif_t *sub = NULL;
928
929 vec_add2 (vam->sw_if_subif_table, sub, 1);
930
931 vec_validate (sub->interface_name, strlen ((char *) s) + 1);
932 strncpy ((char *) sub->interface_name, (char *) s,
933 vec_len (sub->interface_name));
934 sub->sw_if_index = ntohl (mp->sw_if_index);
935 sub->sub_id = ntohl (mp->sub_id);
936
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000937 sub->sub_dot1ad = mp->sub_dot1ad;
Damjan Marion7cd468a2016-12-19 23:05:39 +0100938 sub->sub_number_of_tags = mp->sub_number_of_tags;
939 sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
940 sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000941 sub->sub_exact_match = mp->sub_exact_match;
942 sub->sub_default = mp->sub_default;
943 sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any;
944 sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any;
Damjan Marion7cd468a2016-12-19 23:05:39 +0100945
946 /* vlan tag rewrite */
947 sub->vtr_op = ntohl (mp->vtr_op);
948 sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
949 sub->vtr_tag1 = ntohl (mp->vtr_tag1);
950 sub->vtr_tag2 = ntohl (mp->vtr_tag2);
951 }
952}
953
954static void vl_api_sw_interface_details_t_handler_json
955 (vl_api_sw_interface_details_t * mp)
956{
957 vat_main_t *vam = &vat_main;
958 vat_json_node_t *node = NULL;
959
960 if (VAT_JSON_ARRAY != vam->json_tree.type)
961 {
962 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
963 vat_json_init_array (&vam->json_tree);
964 }
965 node = vat_json_array_add (&vam->json_tree);
966
967 vat_json_init_object (node);
968 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
969 vat_json_object_add_uint (node, "sup_sw_if_index",
970 ntohl (mp->sup_sw_if_index));
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000971 vat_json_object_add_uint (node, "l2_address_length",
972 ntohl (mp->l2_address_length));
Damjan Marion7cd468a2016-12-19 23:05:39 +0100973 vat_json_object_add_bytes (node, "l2_address", mp->l2_address,
974 sizeof (mp->l2_address));
975 vat_json_object_add_string_copy (node, "interface_name",
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000976 mp->interface_name);
977 vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down);
978 vat_json_object_add_uint (node, "link_up_down", mp->link_up_down);
Damjan Marion7cd468a2016-12-19 23:05:39 +0100979 vat_json_object_add_uint (node, "link_duplex", mp->link_duplex);
980 vat_json_object_add_uint (node, "link_speed", mp->link_speed);
Damjan Marionfe7d4a22018-04-13 19:43:39 +0200981 vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu));
Damjan Marion7cd468a2016-12-19 23:05:39 +0100982 vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id));
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000983 vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad);
Damjan Marion7cd468a2016-12-19 23:05:39 +0100984 vat_json_object_add_uint (node, "sub_number_of_tags",
985 mp->sub_number_of_tags);
986 vat_json_object_add_uint (node, "sub_outer_vlan_id",
987 ntohs (mp->sub_outer_vlan_id));
988 vat_json_object_add_uint (node, "sub_inner_vlan_id",
989 ntohs (mp->sub_inner_vlan_id));
Ole Trøan3b0d7e42019-03-15 16:14:41 +0000990 vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match);
991 vat_json_object_add_uint (node, "sub_default", mp->sub_default);
992 vat_json_object_add_uint (node, "sub_outer_vlan_id_any",
993 mp->sub_outer_vlan_id_any);
994 vat_json_object_add_uint (node, "sub_inner_vlan_id_any",
995 mp->sub_inner_vlan_id_any);
Damjan Marion7cd468a2016-12-19 23:05:39 +0100996 vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op));
997 vat_json_object_add_uint (node, "vtr_push_dot1q",
998 ntohl (mp->vtr_push_dot1q));
999 vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1));
1000 vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2));
Ole Trøan3b0d7e42019-03-15 16:14:41 +00001001 if (mp->sub_dot1ah)
Pavel Kotucek65e84572017-01-16 17:01:56 +01001002 {
1003 vat_json_object_add_string_copy (node, "pbb_vtr_dmac",
1004 format (0, "%U",
1005 format_ethernet_address,
1006 &mp->b_dmac));
1007 vat_json_object_add_string_copy (node, "pbb_vtr_smac",
1008 format (0, "%U",
1009 format_ethernet_address,
1010 &mp->b_smac));
1011 vat_json_object_add_uint (node, "pbb_vtr_b_vlanid", mp->b_vlanid);
1012 vat_json_object_add_uint (node, "pbb_vtr_i_sid", mp->i_sid);
1013 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01001014}
1015
Dave Baracha1a093d2017-03-02 13:13:23 -05001016#if VPP_API_TEST_BUILTIN == 0
Neale Rannsa07bd702017-08-07 07:53:49 -07001017static void vl_api_sw_interface_event_t_handler
1018 (vl_api_sw_interface_event_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01001019{
1020 vat_main_t *vam = &vat_main;
1021 if (vam->interface_event_display)
1022 errmsg ("interface flags: sw_if_index %d %s %s",
1023 ntohl (mp->sw_if_index),
Ole Trøan3b0d7e42019-03-15 16:14:41 +00001024 mp->admin_up_down ? "admin-up" : "admin-down",
1025 mp->link_up_down ? "link-up" : "link-down");
Damjan Marion7cd468a2016-12-19 23:05:39 +01001026}
Dave Baracha1a093d2017-03-02 13:13:23 -05001027#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +01001028
Neale Rannsa07bd702017-08-07 07:53:49 -07001029static void vl_api_sw_interface_event_t_handler_json
1030 (vl_api_sw_interface_event_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01001031{
1032 /* JSON output not supported */
1033}
1034
1035static void
1036vl_api_cli_reply_t_handler (vl_api_cli_reply_t * mp)
1037{
1038 vat_main_t *vam = &vat_main;
1039 i32 retval = ntohl (mp->retval);
1040
1041 vam->retval = retval;
Damjan Marion7bee80c2017-04-26 15:32:12 +02001042 vam->shmem_result = uword_to_pointer (mp->reply_in_shmem, u8 *);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001043 vam->result_ready = 1;
1044}
1045
1046static void
1047vl_api_cli_reply_t_handler_json (vl_api_cli_reply_t * mp)
1048{
1049 vat_main_t *vam = &vat_main;
1050 vat_json_node_t node;
1051 api_main_t *am = &api_main;
1052 void *oldheap;
1053 u8 *reply;
1054
1055 vat_json_init_object (&node);
1056 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1057 vat_json_object_add_uint (&node, "reply_in_shmem",
1058 ntohl (mp->reply_in_shmem));
1059 /* Toss the shared-memory original... */
1060 pthread_mutex_lock (&am->vlib_rp->mutex);
1061 oldheap = svm_push_data_heap (am->vlib_rp);
1062
Damjan Marion7bee80c2017-04-26 15:32:12 +02001063 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001064 vec_free (reply);
1065
1066 svm_pop_heap (oldheap);
1067 pthread_mutex_unlock (&am->vlib_rp->mutex);
1068
1069 vat_json_print (vam->ofp, &node);
1070 vat_json_free (&node);
1071
1072 vam->retval = ntohl (mp->retval);
1073 vam->result_ready = 1;
1074}
1075
1076static void
1077vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp)
1078{
1079 vat_main_t *vam = &vat_main;
1080 i32 retval = ntohl (mp->retval);
Ole Troan413f4a52018-11-28 11:36:05 +01001081 u32 length = vl_api_string_len (&mp->reply);
Dave Barach59b25652017-09-10 15:04:27 -04001082
1083 vec_reset_length (vam->cmd_reply);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001084
1085 vam->retval = retval;
Dave Barach59b25652017-09-10 15:04:27 -04001086 if (retval == 0)
1087 {
1088 vec_validate (vam->cmd_reply, length);
Ole Troan413f4a52018-11-28 11:36:05 +01001089 clib_memcpy ((char *) (vam->cmd_reply),
1090 vl_api_from_api_string (&mp->reply), length);
Dave Barach59b25652017-09-10 15:04:27 -04001091 vam->cmd_reply[length] = 0;
1092 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01001093 vam->result_ready = 1;
1094}
1095
1096static void
1097vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp)
1098{
1099 vat_main_t *vam = &vat_main;
1100 vat_json_node_t node;
1101
Dave Barach59b25652017-09-10 15:04:27 -04001102 vec_reset_length (vam->cmd_reply);
1103
Damjan Marion7cd468a2016-12-19 23:05:39 +01001104 vat_json_init_object (&node);
1105 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
Ole Troan413f4a52018-11-28 11:36:05 +01001106 vat_json_object_add_string_copy (&node, "reply",
1107 vl_api_from_api_string (&mp->reply));
Damjan Marion7cd468a2016-12-19 23:05:39 +01001108
1109 vat_json_print (vam->ofp, &node);
1110 vat_json_free (&node);
1111
1112 vam->retval = ntohl (mp->retval);
1113 vam->result_ready = 1;
1114}
1115
1116static void vl_api_classify_add_del_table_reply_t_handler
1117 (vl_api_classify_add_del_table_reply_t * mp)
1118{
1119 vat_main_t *vam = &vat_main;
1120 i32 retval = ntohl (mp->retval);
1121 if (vam->async_mode)
1122 {
1123 vam->async_errors += (retval < 0);
1124 }
1125 else
1126 {
1127 vam->retval = retval;
1128 if (retval == 0 &&
1129 ((mp->new_table_index != 0xFFFFFFFF) ||
1130 (mp->skip_n_vectors != 0xFFFFFFFF) ||
1131 (mp->match_n_vectors != 0xFFFFFFFF)))
1132 /*
1133 * Note: this is just barely thread-safe, depends on
1134 * the main thread spinning waiting for an answer...
1135 */
1136 errmsg ("new index %d, skip_n_vectors %d, match_n_vectors %d",
1137 ntohl (mp->new_table_index),
1138 ntohl (mp->skip_n_vectors), ntohl (mp->match_n_vectors));
1139 vam->result_ready = 1;
1140 }
1141}
1142
1143static void vl_api_classify_add_del_table_reply_t_handler_json
1144 (vl_api_classify_add_del_table_reply_t * mp)
1145{
1146 vat_main_t *vam = &vat_main;
1147 vat_json_node_t node;
1148
1149 vat_json_init_object (&node);
1150 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1151 vat_json_object_add_uint (&node, "new_table_index",
1152 ntohl (mp->new_table_index));
1153 vat_json_object_add_uint (&node, "skip_n_vectors",
1154 ntohl (mp->skip_n_vectors));
1155 vat_json_object_add_uint (&node, "match_n_vectors",
1156 ntohl (mp->match_n_vectors));
1157
1158 vat_json_print (vam->ofp, &node);
1159 vat_json_free (&node);
1160
1161 vam->retval = ntohl (mp->retval);
1162 vam->result_ready = 1;
1163}
1164
1165static void vl_api_get_node_index_reply_t_handler
1166 (vl_api_get_node_index_reply_t * mp)
1167{
1168 vat_main_t *vam = &vat_main;
1169 i32 retval = ntohl (mp->retval);
1170 if (vam->async_mode)
1171 {
1172 vam->async_errors += (retval < 0);
1173 }
1174 else
1175 {
1176 vam->retval = retval;
1177 if (retval == 0)
1178 errmsg ("node index %d", ntohl (mp->node_index));
1179 vam->result_ready = 1;
1180 }
1181}
1182
1183static void vl_api_get_node_index_reply_t_handler_json
1184 (vl_api_get_node_index_reply_t * mp)
1185{
1186 vat_main_t *vam = &vat_main;
1187 vat_json_node_t node;
1188
1189 vat_json_init_object (&node);
1190 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1191 vat_json_object_add_uint (&node, "node_index", ntohl (mp->node_index));
1192
1193 vat_json_print (vam->ofp, &node);
1194 vat_json_free (&node);
1195
1196 vam->retval = ntohl (mp->retval);
1197 vam->result_ready = 1;
1198}
1199
1200static void vl_api_get_next_index_reply_t_handler
1201 (vl_api_get_next_index_reply_t * mp)
1202{
1203 vat_main_t *vam = &vat_main;
1204 i32 retval = ntohl (mp->retval);
1205 if (vam->async_mode)
1206 {
1207 vam->async_errors += (retval < 0);
1208 }
1209 else
1210 {
1211 vam->retval = retval;
1212 if (retval == 0)
1213 errmsg ("next node index %d", ntohl (mp->next_index));
1214 vam->result_ready = 1;
1215 }
1216}
1217
1218static void vl_api_get_next_index_reply_t_handler_json
1219 (vl_api_get_next_index_reply_t * mp)
1220{
1221 vat_main_t *vam = &vat_main;
1222 vat_json_node_t node;
1223
1224 vat_json_init_object (&node);
1225 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1226 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1227
1228 vat_json_print (vam->ofp, &node);
1229 vat_json_free (&node);
1230
1231 vam->retval = ntohl (mp->retval);
1232 vam->result_ready = 1;
1233}
1234
1235static void vl_api_add_node_next_reply_t_handler
1236 (vl_api_add_node_next_reply_t * mp)
1237{
1238 vat_main_t *vam = &vat_main;
1239 i32 retval = ntohl (mp->retval);
1240 if (vam->async_mode)
1241 {
1242 vam->async_errors += (retval < 0);
1243 }
1244 else
1245 {
1246 vam->retval = retval;
1247 if (retval == 0)
1248 errmsg ("next index %d", ntohl (mp->next_index));
1249 vam->result_ready = 1;
1250 }
1251}
1252
1253static void vl_api_add_node_next_reply_t_handler_json
1254 (vl_api_add_node_next_reply_t * mp)
1255{
1256 vat_main_t *vam = &vat_main;
1257 vat_json_node_t node;
1258
1259 vat_json_init_object (&node);
1260 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1261 vat_json_object_add_uint (&node, "next_index", ntohl (mp->next_index));
1262
1263 vat_json_print (vam->ofp, &node);
1264 vat_json_free (&node);
1265
1266 vam->retval = ntohl (mp->retval);
1267 vam->result_ready = 1;
1268}
1269
1270static void vl_api_show_version_reply_t_handler
1271 (vl_api_show_version_reply_t * mp)
1272{
1273 vat_main_t *vam = &vat_main;
1274 i32 retval = ntohl (mp->retval);
1275
1276 if (retval >= 0)
1277 {
Ole Troand6e9aec2018-12-16 23:44:54 +01001278 char *s;
Ole Troan413f4a52018-11-28 11:36:05 +01001279 char *p = (char *) &mp->program;
Ole Troand6e9aec2018-12-16 23:44:54 +01001280
1281 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1282 errmsg (" program: %s\n", s);
1283 free (s);
1284
1285 p +=
1286 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1287 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1288 errmsg (" version: %s\n", s);
1289 free (s);
1290
1291 p +=
1292 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1293 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1294 errmsg (" build date: %s\n", s);
1295 free (s);
1296
1297 p +=
1298 vl_api_string_len ((vl_api_string_t *) p) + sizeof (vl_api_string_t);
1299 s = vl_api_from_api_string_c ((vl_api_string_t *) p);
1300 errmsg ("build directory: %s\n", s);
1301 free (s);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001302 }
1303 vam->retval = retval;
1304 vam->result_ready = 1;
1305}
1306
1307static void vl_api_show_version_reply_t_handler_json
1308 (vl_api_show_version_reply_t * mp)
1309{
1310 vat_main_t *vam = &vat_main;
1311 vat_json_node_t node;
1312
1313 vat_json_init_object (&node);
1314 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
Ole Troan413f4a52018-11-28 11:36:05 +01001315 char *p = (char *) &mp->program;
1316 vat_json_object_add_string_copy (&node, "program",
1317 vl_api_from_api_string ((vl_api_string_t *)
1318 p));
1319 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1320 vat_json_object_add_string_copy (&node, "version",
1321 vl_api_from_api_string ((vl_api_string_t *)
1322 p));
1323 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
1324 vat_json_object_add_string_copy (&node, "build_date",
1325 vl_api_from_api_string ((vl_api_string_t *)
1326 p));
1327 p += vl_api_string_len ((vl_api_string_t *) p) + sizeof (u32);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001328 vat_json_object_add_string_copy (&node, "build_directory",
Ole Troan413f4a52018-11-28 11:36:05 +01001329 vl_api_from_api_string ((vl_api_string_t *)
1330 p));
Damjan Marion7cd468a2016-12-19 23:05:39 +01001331
1332 vat_json_print (vam->ofp, &node);
1333 vat_json_free (&node);
1334
1335 vam->retval = ntohl (mp->retval);
1336 vam->result_ready = 1;
1337}
1338
Mohsin Kazmi5d64c782018-09-11 20:27:09 +02001339static void vl_api_show_threads_reply_t_handler
1340 (vl_api_show_threads_reply_t * mp)
1341{
1342 vat_main_t *vam = &vat_main;
1343 i32 retval = ntohl (mp->retval);
1344 int i, count = 0;
1345
1346 if (retval >= 0)
1347 count = ntohl (mp->count);
1348
1349 for (i = 0; i < count; i++)
1350 print (vam->ofp,
1351 "\n%-2d %-11s %-11s %-5d %-6d %-4d %-6d",
1352 ntohl (mp->thread_data[i].id), mp->thread_data[i].name,
1353 mp->thread_data[i].type, ntohl (mp->thread_data[i].pid),
1354 ntohl (mp->thread_data[i].cpu_id), ntohl (mp->thread_data[i].core),
1355 ntohl (mp->thread_data[i].cpu_socket));
1356
1357 vam->retval = retval;
1358 vam->result_ready = 1;
1359}
1360
1361static void vl_api_show_threads_reply_t_handler_json
1362 (vl_api_show_threads_reply_t * mp)
1363{
1364 vat_main_t *vam = &vat_main;
1365 vat_json_node_t node;
1366 vl_api_thread_data_t *td;
Mohsin Kazmi5df628b2018-10-01 17:41:08 +02001367 i32 retval = ntohl (mp->retval);
1368 int i, count = 0;
1369
1370 if (retval >= 0)
1371 count = ntohl (mp->count);
Mohsin Kazmi5d64c782018-09-11 20:27:09 +02001372
1373 vat_json_init_object (&node);
Mohsin Kazmi5df628b2018-10-01 17:41:08 +02001374 vat_json_object_add_int (&node, "retval", retval);
Mohsin Kazmi5d64c782018-09-11 20:27:09 +02001375 vat_json_object_add_uint (&node, "count", count);
1376
1377 for (i = 0; i < count; i++)
1378 {
1379 td = &mp->thread_data[i];
1380 vat_json_object_add_uint (&node, "id", ntohl (td->id));
1381 vat_json_object_add_string_copy (&node, "name", td->name);
1382 vat_json_object_add_string_copy (&node, "type", td->type);
1383 vat_json_object_add_uint (&node, "pid", ntohl (td->pid));
1384 vat_json_object_add_int (&node, "cpu_id", ntohl (td->cpu_id));
1385 vat_json_object_add_int (&node, "core", ntohl (td->id));
1386 vat_json_object_add_int (&node, "cpu_socket", ntohl (td->cpu_socket));
1387 }
1388
1389 vat_json_print (vam->ofp, &node);
1390 vat_json_free (&node);
1391
Mohsin Kazmi5df628b2018-10-01 17:41:08 +02001392 vam->retval = retval;
Mohsin Kazmi5d64c782018-09-11 20:27:09 +02001393 vam->result_ready = 1;
1394}
1395
1396static int
1397api_show_threads (vat_main_t * vam)
1398{
1399 vl_api_show_threads_t *mp;
1400 int ret;
1401
1402 print (vam->ofp,
1403 "\n%-2s %-11s %-11s %-5s %-6s %-4s %-6s",
1404 "ID", "Name", "Type", "LWP", "cpu_id", "Core", "Socket");
1405
1406 M (SHOW_THREADS, mp);
1407
1408 S (mp);
1409 W (ret);
1410 return ret;
1411}
1412
Damjan Marion7cd468a2016-12-19 23:05:39 +01001413static void
1414vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp)
1415{
Wojciech Dec09a38a62017-03-07 19:30:39 +01001416 u32 sw_if_index = ntohl (mp->sw_if_index);
John Lo20e1f2a2017-03-29 13:35:43 -04001417 errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n",
Damjan Marion7cd468a2016-12-19 23:05:39 +01001418 mp->mac_ip ? "mac/ip binding" : "address resolution",
Neale Ranns37029302018-08-10 05:30:06 -07001419 ntohl (mp->pid), format_ip4_address, mp->ip,
1420 format_vl_api_mac_address, &mp->mac, sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001421}
1422
1423static void
1424vl_api_ip4_arp_event_t_handler_json (vl_api_ip4_arp_event_t * mp)
1425{
1426 /* JSON output not supported */
1427}
1428
1429static void
1430vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp)
1431{
Wojciech Dec09a38a62017-03-07 19:30:39 +01001432 u32 sw_if_index = ntohl (mp->sw_if_index);
John Lo20e1f2a2017-03-29 13:35:43 -04001433 errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n",
Damjan Marion7cd468a2016-12-19 23:05:39 +01001434 mp->mac_ip ? "mac/ip binding" : "address resolution",
Neale Ranns37029302018-08-10 05:30:06 -07001435 ntohl (mp->pid), format_vl_api_ip6_address, mp->ip,
1436 format_vl_api_mac_address, mp->mac, sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001437}
1438
1439static void
1440vl_api_ip6_nd_event_t_handler_json (vl_api_ip6_nd_event_t * mp)
1441{
1442 /* JSON output not supported */
1443}
1444
John Lo8d00fff2017-08-03 00:35:36 -04001445static void
1446vl_api_l2_macs_event_t_handler (vl_api_l2_macs_event_t * mp)
1447{
1448 u32 n_macs = ntohl (mp->n_macs);
Paul Vinciguerraec11b132018-09-24 05:25:00 -07001449 errmsg ("L2MAC event received with pid %d cl-idx %d for %d macs: \n",
John Lo8d00fff2017-08-03 00:35:36 -04001450 ntohl (mp->pid), mp->client_index, n_macs);
1451 int i;
1452 for (i = 0; i < n_macs; i++)
1453 {
1454 vl_api_mac_entry_t *mac = &mp->mac[i];
John Loe23c99e2018-03-13 21:53:18 -04001455 errmsg (" [%d] sw_if_index %d mac_addr %U action %d \n",
John Lo8d00fff2017-08-03 00:35:36 -04001456 i + 1, ntohl (mac->sw_if_index),
John Loe23c99e2018-03-13 21:53:18 -04001457 format_ethernet_address, mac->mac_addr, mac->action);
John Lo8d00fff2017-08-03 00:35:36 -04001458 if (i == 1000)
1459 break;
1460 }
1461}
1462
1463static void
1464vl_api_l2_macs_event_t_handler_json (vl_api_l2_macs_event_t * mp)
1465{
1466 /* JSON output not supported */
1467}
1468
Ole Troan01384fe2017-05-12 11:55:35 +02001469#define vl_api_bridge_domain_details_t_endian vl_noop_handler
1470#define vl_api_bridge_domain_details_t_print vl_noop_handler
1471
Damjan Marion7cd468a2016-12-19 23:05:39 +01001472/*
1473 * Special-case: build the bridge domain table, maintain
1474 * the next bd id vbl.
1475 */
1476static void vl_api_bridge_domain_details_t_handler
1477 (vl_api_bridge_domain_details_t * mp)
1478{
1479 vat_main_t *vam = &vat_main;
1480 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
Ole Troan01384fe2017-05-12 11:55:35 +02001481 int i;
Damjan Marion7cd468a2016-12-19 23:05:39 +01001482
Mohsin Kazmi762d83c2018-09-27 15:00:32 +02001483 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-6s %-3s",
1484 " ID", "LRN", "FWD", "FLD", "BVI", "UU-FWD", "#IF");
Damjan Marion7cd468a2016-12-19 23:05:39 +01001485
Mohsin Kazmi762d83c2018-09-27 15:00:32 +02001486 print (vam->ofp, "%3d %3d %3d %3d %3d %6d %3d",
Damjan Marion7cd468a2016-12-19 23:05:39 +01001487 ntohl (mp->bd_id), mp->learn, mp->forward,
Mohsin Kazmi762d83c2018-09-27 15:00:32 +02001488 mp->flood, ntohl (mp->bvi_sw_if_index),
1489 ntohl (mp->uu_fwd_sw_if_index), n_sw_ifs);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001490
1491 if (n_sw_ifs)
Ole Troan01384fe2017-05-12 11:55:35 +02001492 {
1493 vl_api_bridge_domain_sw_if_t *sw_ifs;
1494 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1495 "Interface Name");
1496
1497 sw_ifs = mp->sw_if_details;
1498 for (i = 0; i < n_sw_ifs; i++)
1499 {
1500 u8 *sw_if_name = 0;
1501 u32 sw_if_index;
1502 hash_pair_t *p;
1503
1504 sw_if_index = ntohl (sw_ifs->sw_if_index);
1505
1506 /* *INDENT-OFF* */
1507 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
1508 ({
1509 if ((u32) p->value[0] == sw_if_index)
1510 {
1511 sw_if_name = (u8 *)(p->key);
1512 break;
1513 }
1514 }));
1515 /* *INDENT-ON* */
1516 print (vam->ofp, "%7d %3d %s", sw_if_index,
1517 sw_ifs->shg, sw_if_name ? (char *) sw_if_name :
1518 "sw_if_index not found!");
1519
1520 sw_ifs++;
1521 }
1522 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01001523}
1524
1525static void vl_api_bridge_domain_details_t_handler_json
1526 (vl_api_bridge_domain_details_t * mp)
1527{
1528 vat_main_t *vam = &vat_main;
1529 vat_json_node_t *node, *array = NULL;
Ole Troan01384fe2017-05-12 11:55:35 +02001530 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001531
1532 if (VAT_JSON_ARRAY != vam->json_tree.type)
1533 {
1534 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
1535 vat_json_init_array (&vam->json_tree);
1536 }
1537 node = vat_json_array_add (&vam->json_tree);
1538
1539 vat_json_init_object (node);
1540 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
1541 vat_json_object_add_uint (node, "flood", mp->flood);
1542 vat_json_object_add_uint (node, "forward", mp->forward);
1543 vat_json_object_add_uint (node, "learn", mp->learn);
1544 vat_json_object_add_uint (node, "bvi_sw_if_index",
1545 ntohl (mp->bvi_sw_if_index));
Ole Troan01384fe2017-05-12 11:55:35 +02001546 vat_json_object_add_uint (node, "n_sw_ifs", n_sw_ifs);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001547 array = vat_json_object_add (node, "sw_if");
1548 vat_json_init_array (array);
Damjan Marion7cd468a2016-12-19 23:05:39 +01001549
Damjan Marion7cd468a2016-12-19 23:05:39 +01001550
Damjan Marion7cd468a2016-12-19 23:05:39 +01001551
Ole Troan01384fe2017-05-12 11:55:35 +02001552 if (n_sw_ifs)
1553 {
1554 vl_api_bridge_domain_sw_if_t *sw_ifs;
1555 int i;
Damjan Marion7cd468a2016-12-19 23:05:39 +01001556
Ole Troan01384fe2017-05-12 11:55:35 +02001557 sw_ifs = mp->sw_if_details;
1558 for (i = 0; i < n_sw_ifs; i++)
1559 {
1560 node = vat_json_array_add (array);
1561 vat_json_init_object (node);
1562 vat_json_object_add_uint (node, "sw_if_index",
1563 ntohl (sw_ifs->sw_if_index));
1564 vat_json_object_add_uint (node, "shg", sw_ifs->shg);
1565 sw_ifs++;
1566 }
1567 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01001568}
1569
1570static void vl_api_control_ping_reply_t_handler
1571 (vl_api_control_ping_reply_t * mp)
1572{
1573 vat_main_t *vam = &vat_main;
1574 i32 retval = ntohl (mp->retval);
1575 if (vam->async_mode)
1576 {
1577 vam->async_errors += (retval < 0);
1578 }
1579 else
1580 {
1581 vam->retval = retval;
1582 vam->result_ready = 1;
1583 }
Florin Coras90a63982017-12-19 04:50:01 -08001584 if (vam->socket_client_main)
1585 vam->socket_client_main->control_pings_outstanding--;
Damjan Marion7cd468a2016-12-19 23:05:39 +01001586}
1587
1588static void vl_api_control_ping_reply_t_handler_json
1589 (vl_api_control_ping_reply_t * mp)
1590{
1591 vat_main_t *vam = &vat_main;
1592 i32 retval = ntohl (mp->retval);
1593
1594 if (VAT_JSON_NONE != vam->json_tree.type)
1595 {
1596 vat_json_print (vam->ofp, &vam->json_tree);
1597 vat_json_free (&vam->json_tree);
1598 vam->json_tree.type = VAT_JSON_NONE;
1599 }
1600 else
1601 {
1602 /* just print [] */
1603 vat_json_init_array (&vam->json_tree);
1604 vat_json_print (vam->ofp, &vam->json_tree);
1605 vam->json_tree.type = VAT_JSON_NONE;
1606 }
1607
1608 vam->retval = retval;
1609 vam->result_ready = 1;
1610}
1611
1612static void
Eyal Barifead6702017-04-04 04:46:32 +03001613 vl_api_bridge_domain_set_mac_age_reply_t_handler
1614 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1615{
1616 vat_main_t *vam = &vat_main;
1617 i32 retval = ntohl (mp->retval);
1618 if (vam->async_mode)
1619 {
1620 vam->async_errors += (retval < 0);
1621 }
1622 else
1623 {
1624 vam->retval = retval;
1625 vam->result_ready = 1;
1626 }
1627}
1628
1629static void vl_api_bridge_domain_set_mac_age_reply_t_handler_json
1630 (vl_api_bridge_domain_set_mac_age_reply_t * mp)
1631{
1632 vat_main_t *vam = &vat_main;
1633 vat_json_node_t node;
1634
1635 vat_json_init_object (&node);
1636 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1637
1638 vat_json_print (vam->ofp, &node);
1639 vat_json_free (&node);
1640
1641 vam->retval = ntohl (mp->retval);
1642 vam->result_ready = 1;
1643}
1644
1645static void
Damjan Marion7cd468a2016-12-19 23:05:39 +01001646vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp)
1647{
1648 vat_main_t *vam = &vat_main;
1649 i32 retval = ntohl (mp->retval);
1650 if (vam->async_mode)
1651 {
1652 vam->async_errors += (retval < 0);
1653 }
1654 else
1655 {
1656 vam->retval = retval;
1657 vam->result_ready = 1;
1658 }
1659}
1660
1661static void vl_api_l2_flags_reply_t_handler_json
1662 (vl_api_l2_flags_reply_t * mp)
1663{
1664 vat_main_t *vam = &vat_main;
1665 vat_json_node_t node;
1666
1667 vat_json_init_object (&node);
1668 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1669 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1670 ntohl (mp->resulting_feature_bitmap));
1671
1672 vat_json_print (vam->ofp, &node);
1673 vat_json_free (&node);
1674
1675 vam->retval = ntohl (mp->retval);
1676 vam->result_ready = 1;
1677}
1678
1679static void vl_api_bridge_flags_reply_t_handler
1680 (vl_api_bridge_flags_reply_t * mp)
1681{
1682 vat_main_t *vam = &vat_main;
1683 i32 retval = ntohl (mp->retval);
1684 if (vam->async_mode)
1685 {
1686 vam->async_errors += (retval < 0);
1687 }
1688 else
1689 {
1690 vam->retval = retval;
1691 vam->result_ready = 1;
1692 }
1693}
1694
1695static void vl_api_bridge_flags_reply_t_handler_json
1696 (vl_api_bridge_flags_reply_t * mp)
1697{
1698 vat_main_t *vam = &vat_main;
1699 vat_json_node_t node;
1700
1701 vat_json_init_object (&node);
1702 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1703 vat_json_object_add_uint (&node, "resulting_feature_bitmap",
1704 ntohl (mp->resulting_feature_bitmap));
1705
1706 vat_json_print (vam->ofp, &node);
1707 vat_json_free (&node);
1708
1709 vam->retval = ntohl (mp->retval);
1710 vam->result_ready = 1;
1711}
1712
Damjan Marion8389fb92017-10-13 18:29:53 +02001713static void
1714vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp)
1715{
1716 vat_main_t *vam = &vat_main;
1717 i32 retval = ntohl (mp->retval);
1718 if (vam->async_mode)
1719 {
1720 vam->async_errors += (retval < 0);
1721 }
1722 else
1723 {
1724 vam->retval = retval;
1725 vam->sw_if_index = ntohl (mp->sw_if_index);
1726 vam->result_ready = 1;
1727 }
1728
1729}
1730
1731static void vl_api_tap_create_v2_reply_t_handler_json
1732 (vl_api_tap_create_v2_reply_t * mp)
1733{
1734 vat_main_t *vam = &vat_main;
1735 vat_json_node_t node;
1736
1737 vat_json_init_object (&node);
1738 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1739 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1740
1741 vat_json_print (vam->ofp, &node);
1742 vat_json_free (&node);
1743
1744 vam->retval = ntohl (mp->retval);
1745 vam->result_ready = 1;
1746
1747}
1748
1749static void
1750vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp)
1751{
1752 vat_main_t *vam = &vat_main;
1753 i32 retval = ntohl (mp->retval);
1754 if (vam->async_mode)
1755 {
1756 vam->async_errors += (retval < 0);
1757 }
1758 else
1759 {
1760 vam->retval = retval;
1761 vam->result_ready = 1;
1762 }
1763}
1764
1765static void vl_api_tap_delete_v2_reply_t_handler_json
1766 (vl_api_tap_delete_v2_reply_t * mp)
1767{
1768 vat_main_t *vam = &vat_main;
1769 vat_json_node_t node;
1770
1771 vat_json_init_object (&node);
1772 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1773
1774 vat_json_print (vam->ofp, &node);
1775 vat_json_free (&node);
1776
1777 vam->retval = ntohl (mp->retval);
1778 vam->result_ready = 1;
1779}
1780
Steven9cd2d7a2017-12-20 12:43:01 -08001781static void
Mohsin Kazmi03ae24b2019-01-18 11:50:00 +01001782vl_api_virtio_pci_create_reply_t_handler (vl_api_virtio_pci_create_reply_t *
1783 mp)
1784{
1785 vat_main_t *vam = &vat_main;
1786 i32 retval = ntohl (mp->retval);
1787 if (vam->async_mode)
1788 {
1789 vam->async_errors += (retval < 0);
1790 }
1791 else
1792 {
1793 vam->retval = retval;
1794 vam->sw_if_index = ntohl (mp->sw_if_index);
1795 vam->result_ready = 1;
1796 }
1797}
1798
1799static void vl_api_virtio_pci_create_reply_t_handler_json
1800 (vl_api_virtio_pci_create_reply_t * mp)
1801{
1802 vat_main_t *vam = &vat_main;
1803 vat_json_node_t node;
1804
1805 vat_json_init_object (&node);
1806 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1807 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1808
1809 vat_json_print (vam->ofp, &node);
1810 vat_json_free (&node);
1811
1812 vam->retval = ntohl (mp->retval);
1813 vam->result_ready = 1;
1814
1815}
1816
1817static void
1818vl_api_virtio_pci_delete_reply_t_handler (vl_api_virtio_pci_delete_reply_t *
1819 mp)
1820{
1821 vat_main_t *vam = &vat_main;
1822 i32 retval = ntohl (mp->retval);
1823 if (vam->async_mode)
1824 {
1825 vam->async_errors += (retval < 0);
1826 }
1827 else
1828 {
1829 vam->retval = retval;
1830 vam->result_ready = 1;
1831 }
1832}
1833
1834static void vl_api_virtio_pci_delete_reply_t_handler_json
1835 (vl_api_virtio_pci_delete_reply_t * mp)
1836{
1837 vat_main_t *vam = &vat_main;
1838 vat_json_node_t node;
1839
1840 vat_json_init_object (&node);
1841 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1842
1843 vat_json_print (vam->ofp, &node);
1844 vat_json_free (&node);
1845
1846 vam->retval = ntohl (mp->retval);
1847 vam->result_ready = 1;
1848}
1849
1850static void
Steven9cd2d7a2017-12-20 12:43:01 -08001851vl_api_bond_create_reply_t_handler (vl_api_bond_create_reply_t * mp)
1852{
1853 vat_main_t *vam = &vat_main;
1854 i32 retval = ntohl (mp->retval);
1855
1856 if (vam->async_mode)
1857 {
1858 vam->async_errors += (retval < 0);
1859 }
1860 else
1861 {
1862 vam->retval = retval;
1863 vam->sw_if_index = ntohl (mp->sw_if_index);
1864 vam->result_ready = 1;
1865 }
1866}
1867
1868static void vl_api_bond_create_reply_t_handler_json
1869 (vl_api_bond_create_reply_t * mp)
1870{
1871 vat_main_t *vam = &vat_main;
1872 vat_json_node_t node;
1873
1874 vat_json_init_object (&node);
1875 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1876 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
1877
1878 vat_json_print (vam->ofp, &node);
1879 vat_json_free (&node);
1880
1881 vam->retval = ntohl (mp->retval);
1882 vam->result_ready = 1;
1883}
1884
1885static void
1886vl_api_bond_delete_reply_t_handler (vl_api_bond_delete_reply_t * mp)
1887{
1888 vat_main_t *vam = &vat_main;
1889 i32 retval = ntohl (mp->retval);
1890
1891 if (vam->async_mode)
1892 {
1893 vam->async_errors += (retval < 0);
1894 }
1895 else
1896 {
1897 vam->retval = retval;
1898 vam->result_ready = 1;
1899 }
1900}
1901
1902static void vl_api_bond_delete_reply_t_handler_json
1903 (vl_api_bond_delete_reply_t * mp)
1904{
1905 vat_main_t *vam = &vat_main;
1906 vat_json_node_t node;
1907
1908 vat_json_init_object (&node);
1909 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1910
1911 vat_json_print (vam->ofp, &node);
1912 vat_json_free (&node);
1913
1914 vam->retval = ntohl (mp->retval);
1915 vam->result_ready = 1;
1916}
1917
1918static void
1919vl_api_bond_enslave_reply_t_handler (vl_api_bond_enslave_reply_t * mp)
1920{
1921 vat_main_t *vam = &vat_main;
1922 i32 retval = ntohl (mp->retval);
1923
1924 if (vam->async_mode)
1925 {
1926 vam->async_errors += (retval < 0);
1927 }
1928 else
1929 {
1930 vam->retval = retval;
1931 vam->result_ready = 1;
1932 }
1933}
1934
1935static void vl_api_bond_enslave_reply_t_handler_json
1936 (vl_api_bond_enslave_reply_t * mp)
1937{
1938 vat_main_t *vam = &vat_main;
1939 vat_json_node_t node;
1940
1941 vat_json_init_object (&node);
1942 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1943
1944 vat_json_print (vam->ofp, &node);
1945 vat_json_free (&node);
1946
1947 vam->retval = ntohl (mp->retval);
1948 vam->result_ready = 1;
1949}
1950
1951static void
1952vl_api_bond_detach_slave_reply_t_handler (vl_api_bond_detach_slave_reply_t *
1953 mp)
1954{
1955 vat_main_t *vam = &vat_main;
1956 i32 retval = ntohl (mp->retval);
1957
1958 if (vam->async_mode)
1959 {
1960 vam->async_errors += (retval < 0);
1961 }
1962 else
1963 {
1964 vam->retval = retval;
1965 vam->result_ready = 1;
1966 }
1967}
1968
1969static void vl_api_bond_detach_slave_reply_t_handler_json
1970 (vl_api_bond_detach_slave_reply_t * mp)
1971{
1972 vat_main_t *vam = &vat_main;
1973 vat_json_node_t node;
1974
1975 vat_json_init_object (&node);
1976 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
1977
1978 vat_json_print (vam->ofp, &node);
1979 vat_json_free (&node);
1980
1981 vam->retval = ntohl (mp->retval);
1982 vam->result_ready = 1;
1983}
1984
1985static void vl_api_sw_interface_bond_details_t_handler
1986 (vl_api_sw_interface_bond_details_t * mp)
1987{
1988 vat_main_t *vam = &vat_main;
1989
1990 print (vam->ofp,
1991 "%-16s %-12d %-12U %-13U %-14u %-14u",
1992 mp->interface_name, ntohl (mp->sw_if_index),
1993 format_bond_mode, mp->mode, format_bond_load_balance, mp->lb,
1994 ntohl (mp->active_slaves), ntohl (mp->slaves));
1995}
1996
1997static void vl_api_sw_interface_bond_details_t_handler_json
1998 (vl_api_sw_interface_bond_details_t * mp)
1999{
2000 vat_main_t *vam = &vat_main;
2001 vat_json_node_t *node = NULL;
2002
2003 if (VAT_JSON_ARRAY != vam->json_tree.type)
2004 {
2005 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2006 vat_json_init_array (&vam->json_tree);
2007 }
2008 node = vat_json_array_add (&vam->json_tree);
2009
2010 vat_json_init_object (node);
2011 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2012 vat_json_object_add_string_copy (node, "interface_name",
2013 mp->interface_name);
2014 vat_json_object_add_uint (node, "mode", mp->mode);
2015 vat_json_object_add_uint (node, "load_balance", mp->lb);
2016 vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves));
2017 vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves));
2018}
2019
2020static int
2021api_sw_interface_bond_dump (vat_main_t * vam)
2022{
2023 vl_api_sw_interface_bond_dump_t *mp;
2024 vl_api_control_ping_t *mp_ping;
2025 int ret;
2026
2027 print (vam->ofp,
2028 "\n%-16s %-12s %-12s %-13s %-14s %-14s",
2029 "interface name", "sw_if_index", "mode", "load balance",
2030 "active slaves", "slaves");
2031
2032 /* Get list of bond interfaces */
2033 M (SW_INTERFACE_BOND_DUMP, mp);
2034 S (mp);
2035
2036 /* Use a control ping for synchronization */
2037 MPING (CONTROL_PING, mp_ping);
2038 S (mp_ping);
2039
2040 W (ret);
2041 return ret;
2042}
2043
2044static void vl_api_sw_interface_slave_details_t_handler
2045 (vl_api_sw_interface_slave_details_t * mp)
2046{
2047 vat_main_t *vam = &vat_main;
2048
2049 print (vam->ofp,
2050 "%-25s %-12d %-12d %d", mp->interface_name,
2051 ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout);
2052}
2053
2054static void vl_api_sw_interface_slave_details_t_handler_json
2055 (vl_api_sw_interface_slave_details_t * mp)
2056{
2057 vat_main_t *vam = &vat_main;
2058 vat_json_node_t *node = NULL;
2059
2060 if (VAT_JSON_ARRAY != vam->json_tree.type)
2061 {
2062 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2063 vat_json_init_array (&vam->json_tree);
2064 }
2065 node = vat_json_array_add (&vam->json_tree);
2066
2067 vat_json_init_object (node);
2068 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
2069 vat_json_object_add_string_copy (node, "interface_name",
2070 mp->interface_name);
2071 vat_json_object_add_uint (node, "passive", mp->is_passive);
2072 vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout);
2073}
2074
2075static int
2076api_sw_interface_slave_dump (vat_main_t * vam)
2077{
2078 unformat_input_t *i = vam->input;
2079 vl_api_sw_interface_slave_dump_t *mp;
2080 vl_api_control_ping_t *mp_ping;
2081 u32 sw_if_index = ~0;
2082 u8 sw_if_index_set = 0;
2083 int ret;
2084
2085 /* Parse args required to build the message */
2086 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
2087 {
2088 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
2089 sw_if_index_set = 1;
2090 else if (unformat (i, "sw_if_index %d", &sw_if_index))
2091 sw_if_index_set = 1;
2092 else
2093 break;
2094 }
2095
2096 if (sw_if_index_set == 0)
2097 {
2098 errmsg ("missing vpp interface name. ");
2099 return -99;
2100 }
2101
2102 print (vam->ofp,
2103 "\n%-25s %-12s %-12s %s",
2104 "slave interface name", "sw_if_index", "passive", "long_timeout");
2105
2106 /* Get list of bond interfaces */
2107 M (SW_INTERFACE_SLAVE_DUMP, mp);
2108 mp->sw_if_index = ntohl (sw_if_index);
2109 S (mp);
2110
2111 /* Use a control ping for synchronization */
2112 MPING (CONTROL_PING, mp_ping);
2113 S (mp_ping);
2114
2115 W (ret);
2116 return ret;
2117}
2118
Damjan Marion7cd468a2016-12-19 23:05:39 +01002119static void vl_api_mpls_tunnel_add_del_reply_t_handler
2120 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2121{
2122 vat_main_t *vam = &vat_main;
2123 i32 retval = ntohl (mp->retval);
2124 if (vam->async_mode)
2125 {
2126 vam->async_errors += (retval < 0);
2127 }
2128 else
2129 {
2130 vam->retval = retval;
John Lo06fda9c2018-10-03 16:32:44 -04002131 vam->sw_if_index = ntohl (mp->sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002132 vam->result_ready = 1;
2133 }
John Lo06fda9c2018-10-03 16:32:44 -04002134 vam->regenerate_interface_table = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01002135}
2136
2137static void vl_api_mpls_tunnel_add_del_reply_t_handler_json
2138 (vl_api_mpls_tunnel_add_del_reply_t * mp)
2139{
2140 vat_main_t *vam = &vat_main;
2141 vat_json_node_t node;
2142
2143 vat_json_init_object (&node);
2144 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2145 vat_json_object_add_uint (&node, "tunnel_sw_if_index",
2146 ntohl (mp->sw_if_index));
2147
2148 vat_json_print (vam->ofp, &node);
2149 vat_json_free (&node);
2150
2151 vam->retval = ntohl (mp->retval);
2152 vam->result_ready = 1;
2153}
2154
2155static void vl_api_l2tpv3_create_tunnel_reply_t_handler
2156 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2157{
2158 vat_main_t *vam = &vat_main;
2159 i32 retval = ntohl (mp->retval);
2160 if (vam->async_mode)
2161 {
2162 vam->async_errors += (retval < 0);
2163 }
2164 else
2165 {
2166 vam->retval = retval;
2167 vam->sw_if_index = ntohl (mp->sw_if_index);
2168 vam->result_ready = 1;
2169 }
2170}
2171
2172static void vl_api_l2tpv3_create_tunnel_reply_t_handler_json
2173 (vl_api_l2tpv3_create_tunnel_reply_t * mp)
2174{
2175 vat_main_t *vam = &vat_main;
2176 vat_json_node_t node;
2177
2178 vat_json_init_object (&node);
2179 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2180 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2181
2182 vat_json_print (vam->ofp, &node);
2183 vat_json_free (&node);
2184
2185 vam->retval = ntohl (mp->retval);
2186 vam->result_ready = 1;
2187}
2188
Filip Tehlar560274d2017-06-05 13:40:13 +02002189static void vl_api_gpe_add_del_fwd_entry_reply_t_handler
2190 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2191{
2192 vat_main_t *vam = &vat_main;
2193 i32 retval = ntohl (mp->retval);
2194 if (vam->async_mode)
2195 {
2196 vam->async_errors += (retval < 0);
2197 }
2198 else
2199 {
2200 vam->retval = retval;
2201 vam->result_ready = 1;
2202 }
2203}
2204
2205static void vl_api_gpe_add_del_fwd_entry_reply_t_handler_json
2206 (vl_api_gpe_add_del_fwd_entry_reply_t * mp)
2207{
2208 vat_main_t *vam = &vat_main;
2209 vat_json_node_t node;
2210
2211 vat_json_init_object (&node);
2212 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2213 vat_json_object_add_uint (&node, "fwd_entry_index",
2214 clib_net_to_host_u32 (mp->fwd_entry_index));
2215
2216 vat_json_print (vam->ofp, &node);
2217 vat_json_free (&node);
2218
2219 vam->retval = ntohl (mp->retval);
2220 vam->result_ready = 1;
2221}
Damjan Marion7cd468a2016-12-19 23:05:39 +01002222
Filip Tehlara4980b82017-09-27 14:32:02 +02002223u8 *
2224format_lisp_transport_protocol (u8 * s, va_list * args)
2225{
2226 u32 proto = va_arg (*args, u32);
2227
2228 switch (proto)
2229 {
2230 case 1:
2231 return format (s, "udp");
2232 case 2:
2233 return format (s, "api");
2234 default:
2235 return 0;
2236 }
2237 return 0;
2238}
2239
2240static void vl_api_one_get_transport_protocol_reply_t_handler
2241 (vl_api_one_get_transport_protocol_reply_t * mp)
2242{
2243 vat_main_t *vam = &vat_main;
2244 i32 retval = ntohl (mp->retval);
2245 if (vam->async_mode)
2246 {
2247 vam->async_errors += (retval < 0);
2248 }
2249 else
2250 {
2251 u32 proto = mp->protocol;
2252 print (vam->ofp, "Transport protocol: %U",
2253 format_lisp_transport_protocol, proto);
2254 vam->retval = retval;
2255 vam->result_ready = 1;
2256 }
2257}
2258
2259static void vl_api_one_get_transport_protocol_reply_t_handler_json
2260 (vl_api_one_get_transport_protocol_reply_t * mp)
2261{
2262 vat_main_t *vam = &vat_main;
2263 vat_json_node_t node;
2264 u8 *s;
2265
2266 s = format (0, "%U", format_lisp_transport_protocol, mp->protocol);
2267 vec_add1 (s, 0);
2268
2269 vat_json_init_object (&node);
2270 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2271 vat_json_object_add_string_copy (&node, "transport-protocol", s);
2272
2273 vec_free (s);
2274 vat_json_print (vam->ofp, &node);
2275 vat_json_free (&node);
2276
2277 vam->retval = ntohl (mp->retval);
2278 vam->result_ready = 1;
2279}
2280
Filip Tehlar694396d2017-02-17 14:29:11 +01002281static void vl_api_one_add_del_locator_set_reply_t_handler
2282 (vl_api_one_add_del_locator_set_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002283{
2284 vat_main_t *vam = &vat_main;
2285 i32 retval = ntohl (mp->retval);
2286 if (vam->async_mode)
2287 {
2288 vam->async_errors += (retval < 0);
2289 }
2290 else
2291 {
2292 vam->retval = retval;
2293 vam->result_ready = 1;
2294 }
2295}
2296
Filip Tehlar694396d2017-02-17 14:29:11 +01002297static void vl_api_one_add_del_locator_set_reply_t_handler_json
2298 (vl_api_one_add_del_locator_set_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002299{
2300 vat_main_t *vam = &vat_main;
2301 vat_json_node_t node;
2302
2303 vat_json_init_object (&node);
2304 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2305 vat_json_object_add_uint (&node, "locator_set_index", ntohl (mp->ls_index));
2306
2307 vat_json_print (vam->ofp, &node);
2308 vat_json_free (&node);
2309
2310 vam->retval = ntohl (mp->retval);
2311 vam->result_ready = 1;
2312}
2313
2314static void vl_api_vxlan_add_del_tunnel_reply_t_handler
2315 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2316{
2317 vat_main_t *vam = &vat_main;
2318 i32 retval = ntohl (mp->retval);
2319 if (vam->async_mode)
2320 {
2321 vam->async_errors += (retval < 0);
2322 }
2323 else
2324 {
2325 vam->retval = retval;
2326 vam->sw_if_index = ntohl (mp->sw_if_index);
2327 vam->result_ready = 1;
2328 }
Dave Barachf72212e2018-01-11 10:25:07 -05002329 vam->regenerate_interface_table = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01002330}
2331
2332static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
2333 (vl_api_vxlan_add_del_tunnel_reply_t * mp)
2334{
2335 vat_main_t *vam = &vat_main;
2336 vat_json_node_t node;
2337
2338 vat_json_init_object (&node);
2339 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2340 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2341
2342 vat_json_print (vam->ofp, &node);
2343 vat_json_free (&node);
2344
2345 vam->retval = ntohl (mp->retval);
2346 vam->result_ready = 1;
2347}
2348
eyal bariaf86a482018-04-17 11:20:27 +03002349static void vl_api_vxlan_offload_rx_reply_t_handler
2350 (vl_api_vxlan_offload_rx_reply_t * mp)
2351{
2352 vat_main_t *vam = &vat_main;
2353 i32 retval = ntohl (mp->retval);
2354 if (vam->async_mode)
2355 {
2356 vam->async_errors += (retval < 0);
2357 }
2358 else
2359 {
2360 vam->retval = retval;
2361 vam->result_ready = 1;
2362 }
2363}
2364
2365static void vl_api_vxlan_offload_rx_reply_t_handler_json
2366 (vl_api_vxlan_offload_rx_reply_t * mp)
2367{
2368 vat_main_t *vam = &vat_main;
2369 vat_json_node_t node;
2370
2371 vat_json_init_object (&node);
2372 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2373
2374 vat_json_print (vam->ofp, &node);
2375 vat_json_free (&node);
2376
2377 vam->retval = ntohl (mp->retval);
2378 vam->result_ready = 1;
2379}
2380
Marco Varleseb598f1d2017-09-19 14:25:28 +02002381static void vl_api_geneve_add_del_tunnel_reply_t_handler
2382 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2383{
2384 vat_main_t *vam = &vat_main;
2385 i32 retval = ntohl (mp->retval);
2386 if (vam->async_mode)
2387 {
2388 vam->async_errors += (retval < 0);
2389 }
2390 else
2391 {
2392 vam->retval = retval;
2393 vam->sw_if_index = ntohl (mp->sw_if_index);
2394 vam->result_ready = 1;
2395 }
2396}
2397
2398static void vl_api_geneve_add_del_tunnel_reply_t_handler_json
2399 (vl_api_geneve_add_del_tunnel_reply_t * mp)
2400{
2401 vat_main_t *vam = &vat_main;
2402 vat_json_node_t node;
2403
2404 vat_json_init_object (&node);
2405 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2406 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2407
2408 vat_json_print (vam->ofp, &node);
2409 vat_json_free (&node);
2410
2411 vam->retval = ntohl (mp->retval);
2412 vam->result_ready = 1;
2413}
2414
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +08002415static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
2416 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2417{
2418 vat_main_t *vam = &vat_main;
2419 i32 retval = ntohl (mp->retval);
2420 if (vam->async_mode)
2421 {
2422 vam->async_errors += (retval < 0);
2423 }
2424 else
2425 {
2426 vam->retval = retval;
2427 vam->sw_if_index = ntohl (mp->sw_if_index);
2428 vam->result_ready = 1;
2429 }
Dave Barachf72212e2018-01-11 10:25:07 -05002430 vam->regenerate_interface_table = 1;
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +08002431}
2432
2433static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
2434 (vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
2435{
2436 vat_main_t *vam = &vat_main;
2437 vat_json_node_t node;
2438
2439 vat_json_init_object (&node);
2440 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2441 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2442
2443 vat_json_print (vam->ofp, &node);
2444 vat_json_free (&node);
2445
2446 vam->retval = ntohl (mp->retval);
2447 vam->result_ready = 1;
2448}
2449
Damjan Marion7cd468a2016-12-19 23:05:39 +01002450static void vl_api_gre_add_del_tunnel_reply_t_handler
2451 (vl_api_gre_add_del_tunnel_reply_t * mp)
2452{
2453 vat_main_t *vam = &vat_main;
2454 i32 retval = ntohl (mp->retval);
2455 if (vam->async_mode)
2456 {
2457 vam->async_errors += (retval < 0);
2458 }
2459 else
2460 {
2461 vam->retval = retval;
2462 vam->sw_if_index = ntohl (mp->sw_if_index);
2463 vam->result_ready = 1;
2464 }
2465}
2466
2467static void vl_api_gre_add_del_tunnel_reply_t_handler_json
2468 (vl_api_gre_add_del_tunnel_reply_t * mp)
2469{
2470 vat_main_t *vam = &vat_main;
2471 vat_json_node_t node;
2472
2473 vat_json_init_object (&node);
2474 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2475 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2476
2477 vat_json_print (vam->ofp, &node);
2478 vat_json_free (&node);
2479
2480 vam->retval = ntohl (mp->retval);
2481 vam->result_ready = 1;
2482}
2483
2484static void vl_api_create_vhost_user_if_reply_t_handler
2485 (vl_api_create_vhost_user_if_reply_t * mp)
2486{
2487 vat_main_t *vam = &vat_main;
2488 i32 retval = ntohl (mp->retval);
2489 if (vam->async_mode)
2490 {
2491 vam->async_errors += (retval < 0);
2492 }
2493 else
2494 {
2495 vam->retval = retval;
2496 vam->sw_if_index = ntohl (mp->sw_if_index);
2497 vam->result_ready = 1;
2498 }
Dave Barachf72212e2018-01-11 10:25:07 -05002499 vam->regenerate_interface_table = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01002500}
2501
2502static void vl_api_create_vhost_user_if_reply_t_handler_json
2503 (vl_api_create_vhost_user_if_reply_t * mp)
2504{
2505 vat_main_t *vam = &vat_main;
2506 vat_json_node_t node;
2507
2508 vat_json_init_object (&node);
2509 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2510 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
2511
2512 vat_json_print (vam->ofp, &node);
2513 vat_json_free (&node);
2514
2515 vam->retval = ntohl (mp->retval);
2516 vam->result_ready = 1;
2517}
2518
Dave Barach65457162017-10-10 17:53:14 -04002519static void vl_api_dns_resolve_name_reply_t_handler
2520 (vl_api_dns_resolve_name_reply_t * mp)
2521{
2522 vat_main_t *vam = &vat_main;
2523 i32 retval = ntohl (mp->retval);
2524 if (vam->async_mode)
2525 {
2526 vam->async_errors += (retval < 0);
2527 }
2528 else
2529 {
2530 vam->retval = retval;
2531 vam->result_ready = 1;
2532
2533 if (retval == 0)
2534 {
2535 if (mp->ip4_set)
2536 clib_warning ("ip4 address %U", format_ip4_address,
2537 (ip4_address_t *) mp->ip4_address);
2538 if (mp->ip6_set)
2539 clib_warning ("ip6 address %U", format_ip6_address,
2540 (ip6_address_t *) mp->ip6_address);
2541 }
2542 else
2543 clib_warning ("retval %d", retval);
2544 }
2545}
2546
2547static void vl_api_dns_resolve_name_reply_t_handler_json
2548 (vl_api_dns_resolve_name_reply_t * mp)
2549{
Dave Barachd2080152017-10-20 09:21:35 -04002550 clib_warning ("not implemented");
Dave Barach65457162017-10-10 17:53:14 -04002551}
Dave Barach59b25652017-09-10 15:04:27 -04002552
Dave Barachd2080152017-10-20 09:21:35 -04002553static void vl_api_dns_resolve_ip_reply_t_handler
2554 (vl_api_dns_resolve_ip_reply_t * mp)
2555{
2556 vat_main_t *vam = &vat_main;
2557 i32 retval = ntohl (mp->retval);
2558 if (vam->async_mode)
2559 {
2560 vam->async_errors += (retval < 0);
2561 }
2562 else
2563 {
2564 vam->retval = retval;
2565 vam->result_ready = 1;
2566
2567 if (retval == 0)
2568 {
2569 clib_warning ("canonical name %s", mp->name);
2570 }
2571 else
2572 clib_warning ("retval %d", retval);
2573 }
2574}
2575
2576static void vl_api_dns_resolve_ip_reply_t_handler_json
2577 (vl_api_dns_resolve_ip_reply_t * mp)
2578{
2579 clib_warning ("not implemented");
2580}
2581
2582
Damjan Marion7cd468a2016-12-19 23:05:39 +01002583static void vl_api_ip_address_details_t_handler
2584 (vl_api_ip_address_details_t * mp)
2585{
2586 vat_main_t *vam = &vat_main;
2587 static ip_address_details_t empty_ip_address_details = { {0} };
2588 ip_address_details_t *address = NULL;
2589 ip_details_t *current_ip_details = NULL;
2590 ip_details_t *details = NULL;
2591
2592 details = vam->ip_details_by_sw_if_index[vam->is_ipv6];
2593
2594 if (!details || vam->current_sw_if_index >= vec_len (details)
2595 || !details[vam->current_sw_if_index].present)
2596 {
2597 errmsg ("ip address details arrived but not stored");
2598 errmsg ("ip_dump should be called first");
2599 return;
2600 }
2601
2602 current_ip_details = vec_elt_at_index (details, vam->current_sw_if_index);
2603
2604#define addresses (current_ip_details->addr)
2605
2606 vec_validate_init_empty (addresses, vec_len (addresses),
2607 empty_ip_address_details);
2608
2609 address = vec_elt_at_index (addresses, vec_len (addresses) - 1);
2610
2611 clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip));
2612 address->prefix_length = mp->prefix_length;
2613#undef addresses
2614}
2615
2616static void vl_api_ip_address_details_t_handler_json
2617 (vl_api_ip_address_details_t * mp)
2618{
2619 vat_main_t *vam = &vat_main;
2620 vat_json_node_t *node = NULL;
2621 struct in6_addr ip6;
2622 struct in_addr ip4;
2623
2624 if (VAT_JSON_ARRAY != vam->json_tree.type)
2625 {
2626 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2627 vat_json_init_array (&vam->json_tree);
2628 }
2629 node = vat_json_array_add (&vam->json_tree);
2630
2631 vat_json_init_object (node);
2632 if (vam->is_ipv6)
2633 {
2634 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
2635 vat_json_object_add_ip6 (node, "ip", ip6);
2636 }
2637 else
2638 {
2639 clib_memcpy (&ip4, mp->ip, sizeof (ip4));
2640 vat_json_object_add_ip4 (node, "ip", ip4);
2641 }
2642 vat_json_object_add_uint (node, "prefix_length", mp->prefix_length);
2643}
2644
2645static void
2646vl_api_ip_details_t_handler (vl_api_ip_details_t * mp)
2647{
2648 vat_main_t *vam = &vat_main;
2649 static ip_details_t empty_ip_details = { 0 };
2650 ip_details_t *ip = NULL;
2651 u32 sw_if_index = ~0;
2652
2653 sw_if_index = ntohl (mp->sw_if_index);
2654
2655 vec_validate_init_empty (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2656 sw_if_index, empty_ip_details);
2657
2658 ip = vec_elt_at_index (vam->ip_details_by_sw_if_index[vam->is_ipv6],
2659 sw_if_index);
2660
2661 ip->present = 1;
2662}
2663
2664static void
2665vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp)
2666{
2667 vat_main_t *vam = &vat_main;
2668
2669 if (VAT_JSON_ARRAY != vam->json_tree.type)
2670 {
2671 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2672 vat_json_init_array (&vam->json_tree);
2673 }
2674 vat_json_array_add_uint (&vam->json_tree,
2675 clib_net_to_host_u32 (mp->sw_if_index));
2676}
2677
Damjan Marion7cd468a2016-12-19 23:05:39 +01002678static void
2679vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp)
2680{
2681 errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U "
2682 "router_addr %U host_mac %U",
Neale Rannsdaff1782018-05-16 04:12:18 -07002683 ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4",
2684 mp->lease.hostname,
2685 format_ip4_address, &mp->lease.host_address,
2686 format_ip4_address, &mp->lease.router_address,
2687 format_ethernet_address, mp->lease.host_mac);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002688}
2689
2690static void vl_api_dhcp_compl_event_t_handler_json
2691 (vl_api_dhcp_compl_event_t * mp)
2692{
2693 /* JSON output not supported */
2694}
2695
Damjan Marion7cd468a2016-12-19 23:05:39 +01002696static void vl_api_get_first_msg_id_reply_t_handler
2697 (vl_api_get_first_msg_id_reply_t * mp)
2698{
2699 vat_main_t *vam = &vat_main;
2700 i32 retval = ntohl (mp->retval);
2701
2702 if (vam->async_mode)
2703 {
2704 vam->async_errors += (retval < 0);
2705 }
2706 else
2707 {
2708 vam->retval = retval;
2709 vam->result_ready = 1;
2710 }
2711 if (retval >= 0)
2712 {
2713 errmsg ("first message id %d", ntohs (mp->first_msg_id));
2714 }
2715}
2716
2717static void vl_api_get_first_msg_id_reply_t_handler_json
2718 (vl_api_get_first_msg_id_reply_t * mp)
2719{
2720 vat_main_t *vam = &vat_main;
2721 vat_json_node_t node;
2722
2723 vat_json_init_object (&node);
2724 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2725 vat_json_object_add_uint (&node, "first_msg_id",
2726 (uint) ntohs (mp->first_msg_id));
2727
2728 vat_json_print (vam->ofp, &node);
2729 vat_json_free (&node);
2730
2731 vam->retval = ntohl (mp->retval);
2732 vam->result_ready = 1;
2733}
2734
2735static void vl_api_get_node_graph_reply_t_handler
2736 (vl_api_get_node_graph_reply_t * mp)
2737{
2738 vat_main_t *vam = &vat_main;
2739 api_main_t *am = &api_main;
2740 i32 retval = ntohl (mp->retval);
2741 u8 *pvt_copy, *reply;
2742 void *oldheap;
2743 vlib_node_t *node;
2744 int i;
2745
2746 if (vam->async_mode)
2747 {
2748 vam->async_errors += (retval < 0);
2749 }
2750 else
2751 {
2752 vam->retval = retval;
2753 vam->result_ready = 1;
2754 }
2755
2756 /* "Should never happen..." */
2757 if (retval != 0)
2758 return;
2759
Damjan Marion7bee80c2017-04-26 15:32:12 +02002760 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002761 pvt_copy = vec_dup (reply);
2762
2763 /* Toss the shared-memory original... */
2764 pthread_mutex_lock (&am->vlib_rp->mutex);
2765 oldheap = svm_push_data_heap (am->vlib_rp);
2766
2767 vec_free (reply);
2768
2769 svm_pop_heap (oldheap);
2770 pthread_mutex_unlock (&am->vlib_rp->mutex);
2771
2772 if (vam->graph_nodes)
2773 {
2774 hash_free (vam->graph_node_index_by_name);
2775
Dave Barach1ddbc012018-06-13 09:26:05 -04002776 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002777 {
Dave Barach1ddbc012018-06-13 09:26:05 -04002778 node = vam->graph_nodes[0][i];
Damjan Marion7cd468a2016-12-19 23:05:39 +01002779 vec_free (node->name);
2780 vec_free (node->next_nodes);
2781 vec_free (node);
2782 }
Dave Barach1ddbc012018-06-13 09:26:05 -04002783 vec_free (vam->graph_nodes[0]);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002784 vec_free (vam->graph_nodes);
2785 }
2786
2787 vam->graph_node_index_by_name = hash_create_string (0, sizeof (uword));
2788 vam->graph_nodes = vlib_node_unserialize (pvt_copy);
2789 vec_free (pvt_copy);
2790
Dave Barach1ddbc012018-06-13 09:26:05 -04002791 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002792 {
Dave Barach1ddbc012018-06-13 09:26:05 -04002793 node = vam->graph_nodes[0][i];
Damjan Marion7cd468a2016-12-19 23:05:39 +01002794 hash_set_mem (vam->graph_node_index_by_name, node->name, i);
2795 }
2796}
2797
2798static void vl_api_get_node_graph_reply_t_handler_json
2799 (vl_api_get_node_graph_reply_t * mp)
2800{
2801 vat_main_t *vam = &vat_main;
2802 api_main_t *am = &api_main;
2803 void *oldheap;
2804 vat_json_node_t node;
2805 u8 *reply;
2806
2807 /* $$$$ make this real? */
2808 vat_json_init_object (&node);
2809 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
2810 vat_json_object_add_uint (&node, "reply_in_shmem", mp->reply_in_shmem);
2811
Damjan Marion7bee80c2017-04-26 15:32:12 +02002812 reply = uword_to_pointer (mp->reply_in_shmem, u8 *);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002813
2814 /* Toss the shared-memory original... */
2815 pthread_mutex_lock (&am->vlib_rp->mutex);
2816 oldheap = svm_push_data_heap (am->vlib_rp);
2817
2818 vec_free (reply);
2819
2820 svm_pop_heap (oldheap);
2821 pthread_mutex_unlock (&am->vlib_rp->mutex);
2822
2823 vat_json_print (vam->ofp, &node);
2824 vat_json_free (&node);
2825
2826 vam->retval = ntohl (mp->retval);
2827 vam->result_ready = 1;
2828}
2829
2830static void
Filip Tehlar694396d2017-02-17 14:29:11 +01002831vl_api_one_locator_details_t_handler (vl_api_one_locator_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002832{
2833 vat_main_t *vam = &vat_main;
2834 u8 *s = 0;
2835
2836 if (mp->local)
2837 {
2838 s = format (s, "%=16d%=16d%=16d",
2839 ntohl (mp->sw_if_index), mp->priority, mp->weight);
2840 }
2841 else
2842 {
2843 s = format (s, "%=16U%=16d%=16d",
2844 mp->is_ipv6 ? format_ip6_address :
2845 format_ip4_address,
2846 mp->ip_address, mp->priority, mp->weight);
2847 }
2848
2849 print (vam->ofp, "%v", s);
2850 vec_free (s);
2851}
2852
2853static void
Filip Tehlar694396d2017-02-17 14:29:11 +01002854vl_api_one_locator_details_t_handler_json (vl_api_one_locator_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002855{
2856 vat_main_t *vam = &vat_main;
2857 vat_json_node_t *node = NULL;
2858 struct in6_addr ip6;
2859 struct in_addr ip4;
2860
2861 if (VAT_JSON_ARRAY != vam->json_tree.type)
2862 {
2863 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2864 vat_json_init_array (&vam->json_tree);
2865 }
2866 node = vat_json_array_add (&vam->json_tree);
2867 vat_json_init_object (node);
2868
2869 vat_json_object_add_uint (node, "local", mp->local ? 1 : 0);
2870 vat_json_object_add_uint (node, "priority", mp->priority);
2871 vat_json_object_add_uint (node, "weight", mp->weight);
2872
2873 if (mp->local)
2874 vat_json_object_add_uint (node, "sw_if_index",
2875 clib_net_to_host_u32 (mp->sw_if_index));
2876 else
2877 {
2878 if (mp->is_ipv6)
2879 {
2880 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
2881 vat_json_object_add_ip6 (node, "address", ip6);
2882 }
2883 else
2884 {
2885 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
2886 vat_json_object_add_ip4 (node, "address", ip4);
2887 }
2888 }
2889}
2890
2891static void
Filip Tehlar694396d2017-02-17 14:29:11 +01002892vl_api_one_locator_set_details_t_handler (vl_api_one_locator_set_details_t *
2893 mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002894{
2895 vat_main_t *vam = &vat_main;
2896 u8 *ls_name = 0;
2897
2898 ls_name = format (0, "%s", mp->ls_name);
2899
2900 print (vam->ofp, "%=10d%=15v", clib_net_to_host_u32 (mp->ls_index),
2901 ls_name);
2902 vec_free (ls_name);
2903}
2904
2905static void
Filip Tehlar694396d2017-02-17 14:29:11 +01002906 vl_api_one_locator_set_details_t_handler_json
2907 (vl_api_one_locator_set_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002908{
2909 vat_main_t *vam = &vat_main;
2910 vat_json_node_t *node = 0;
2911 u8 *ls_name = 0;
2912
2913 ls_name = format (0, "%s", mp->ls_name);
2914 vec_add1 (ls_name, 0);
2915
2916 if (VAT_JSON_ARRAY != vam->json_tree.type)
2917 {
2918 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
2919 vat_json_init_array (&vam->json_tree);
2920 }
2921 node = vat_json_array_add (&vam->json_tree);
2922
2923 vat_json_init_object (node);
2924 vat_json_object_add_string_copy (node, "ls_name", ls_name);
2925 vat_json_object_add_uint (node, "ls_index",
2926 clib_net_to_host_u32 (mp->ls_index));
2927 vec_free (ls_name);
2928}
2929
Filip Tehlaref2a5bf2017-05-30 07:14:46 +02002930typedef struct
2931{
2932 u32 spi;
2933 u8 si;
2934} __attribute__ ((__packed__)) lisp_nsh_api_t;
2935
2936uword
2937unformat_nsh_address (unformat_input_t * input, va_list * args)
2938{
2939 lisp_nsh_api_t *nsh = va_arg (*args, lisp_nsh_api_t *);
2940 return unformat (input, "SPI:%d SI:%d", &nsh->spi, &nsh->si);
2941}
2942
2943u8 *
2944format_nsh_address_vat (u8 * s, va_list * args)
2945{
2946 nsh_t *a = va_arg (*args, nsh_t *);
2947 return format (s, "SPI:%d SI:%d", clib_net_to_host_u32 (a->spi), a->si);
2948}
2949
Damjan Marion7cd468a2016-12-19 23:05:39 +01002950static u8 *
2951format_lisp_flat_eid (u8 * s, va_list * args)
2952{
2953 u32 type = va_arg (*args, u32);
2954 u8 *eid = va_arg (*args, u8 *);
2955 u32 eid_len = va_arg (*args, u32);
2956
2957 switch (type)
2958 {
2959 case 0:
2960 return format (s, "%U/%d", format_ip4_address, eid, eid_len);
2961 case 1:
2962 return format (s, "%U/%d", format_ip6_address, eid, eid_len);
2963 case 2:
2964 return format (s, "%U", format_ethernet_address, eid);
Filip Tehlaref2a5bf2017-05-30 07:14:46 +02002965 case 3:
2966 return format (s, "%U", format_nsh_address_vat, eid);
Damjan Marion7cd468a2016-12-19 23:05:39 +01002967 }
2968 return 0;
2969}
2970
2971static u8 *
2972format_lisp_eid_vat (u8 * s, va_list * args)
2973{
2974 u32 type = va_arg (*args, u32);
2975 u8 *eid = va_arg (*args, u8 *);
2976 u32 eid_len = va_arg (*args, u32);
2977 u8 *seid = va_arg (*args, u8 *);
2978 u32 seid_len = va_arg (*args, u32);
2979 u32 is_src_dst = va_arg (*args, u32);
2980
2981 if (is_src_dst)
2982 s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len);
2983
2984 s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len);
2985
2986 return s;
2987}
2988
2989static void
Filip Tehlar694396d2017-02-17 14:29:11 +01002990vl_api_one_eid_table_details_t_handler (vl_api_one_eid_table_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01002991{
2992 vat_main_t *vam = &vat_main;
2993 u8 *s = 0, *eid = 0;
2994
2995 if (~0 == mp->locator_set_index)
2996 s = format (0, "action: %d", mp->action);
2997 else
2998 s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index));
2999
3000 eid = format (0, "%U", format_lisp_eid_vat,
3001 mp->eid_type,
3002 mp->eid,
3003 mp->eid_prefix_len,
3004 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3005 vec_add1 (eid, 0);
3006
3007 print (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s",
3008 clib_net_to_host_u32 (mp->vni),
3009 eid,
3010 mp->is_local ? "local" : "remote",
3011 s, clib_net_to_host_u32 (mp->ttl), mp->authoritative,
3012 clib_net_to_host_u16 (mp->key_id), mp->key);
3013
3014 vec_free (s);
3015 vec_free (eid);
3016}
3017
3018static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003019vl_api_one_eid_table_details_t_handler_json (vl_api_one_eid_table_details_t
3020 * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003021{
3022 vat_main_t *vam = &vat_main;
3023 vat_json_node_t *node = 0;
3024 u8 *eid = 0;
3025
3026 if (VAT_JSON_ARRAY != vam->json_tree.type)
3027 {
3028 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3029 vat_json_init_array (&vam->json_tree);
3030 }
3031 node = vat_json_array_add (&vam->json_tree);
3032
3033 vat_json_init_object (node);
3034 if (~0 == mp->locator_set_index)
3035 vat_json_object_add_uint (node, "action", mp->action);
3036 else
3037 vat_json_object_add_uint (node, "locator_set_index",
3038 clib_net_to_host_u32 (mp->locator_set_index));
3039
3040 vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0);
Filip Tehlaref2a5bf2017-05-30 07:14:46 +02003041 if (mp->eid_type == 3)
3042 {
3043 vat_json_node_t *nsh_json = vat_json_object_add (node, "eid");
3044 vat_json_init_object (nsh_json);
3045 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) mp->eid;
3046 vat_json_object_add_uint (nsh_json, "spi",
3047 clib_net_to_host_u32 (nsh->spi));
3048 vat_json_object_add_uint (nsh_json, "si", nsh->si);
3049 }
3050 else
3051 {
3052 eid = format (0, "%U", format_lisp_eid_vat,
3053 mp->eid_type,
3054 mp->eid,
3055 mp->eid_prefix_len,
3056 mp->seid, mp->seid_prefix_len, mp->is_src_dst);
3057 vec_add1 (eid, 0);
3058 vat_json_object_add_string_copy (node, "eid", eid);
3059 vec_free (eid);
3060 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01003061 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3062 vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl));
3063 vat_json_object_add_uint (node, "authoritative", (mp->authoritative));
3064
3065 if (mp->key_id)
3066 {
3067 vat_json_object_add_uint (node, "key_id",
3068 clib_net_to_host_u16 (mp->key_id));
3069 vat_json_object_add_string_copy (node, "key", mp->key);
3070 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01003071}
3072
3073static void
Filip Tehlar4868ff62017-03-09 16:48:39 +01003074vl_api_one_stats_details_t_handler (vl_api_one_stats_details_t * mp)
3075{
3076 vat_main_t *vam = &vat_main;
3077 u8 *seid = 0, *deid = 0;
3078 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3079
3080 deid = format (0, "%U", format_lisp_eid_vat,
3081 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3082
3083 seid = format (0, "%U", format_lisp_eid_vat,
3084 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3085
3086 vec_add1 (deid, 0);
3087 vec_add1 (seid, 0);
3088
3089 if (mp->is_ip4)
3090 format_ip_address_fcn = format_ip4_address;
3091 else
3092 format_ip_address_fcn = format_ip6_address;
3093
3094
3095 print (vam->ofp, "([%d] %s %s) (%U %U) %u %u",
3096 clib_net_to_host_u32 (mp->vni),
3097 seid, deid,
3098 format_ip_address_fcn, mp->lloc,
3099 format_ip_address_fcn, mp->rloc,
3100 clib_net_to_host_u32 (mp->pkt_count),
3101 clib_net_to_host_u32 (mp->bytes));
3102
3103 vec_free (deid);
3104 vec_free (seid);
3105}
3106
3107static void
3108vl_api_one_stats_details_t_handler_json (vl_api_one_stats_details_t * mp)
3109{
3110 struct in6_addr ip6;
3111 struct in_addr ip4;
3112 vat_main_t *vam = &vat_main;
3113 vat_json_node_t *node = 0;
3114 u8 *deid = 0, *seid = 0;
3115
3116 if (VAT_JSON_ARRAY != vam->json_tree.type)
3117 {
3118 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3119 vat_json_init_array (&vam->json_tree);
3120 }
3121 node = vat_json_array_add (&vam->json_tree);
3122
3123 vat_json_init_object (node);
3124 deid = format (0, "%U", format_lisp_eid_vat,
3125 mp->eid_type, mp->deid, mp->deid_pref_len, 0, 0, 0);
3126
3127 seid = format (0, "%U", format_lisp_eid_vat,
3128 mp->eid_type, mp->seid, mp->seid_pref_len, 0, 0, 0);
3129
3130 vec_add1 (deid, 0);
3131 vec_add1 (seid, 0);
3132
3133 vat_json_object_add_string_copy (node, "seid", seid);
3134 vat_json_object_add_string_copy (node, "deid", deid);
3135 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3136
3137 if (mp->is_ip4)
3138 {
3139 clib_memcpy (&ip4, mp->lloc, sizeof (ip4));
3140 vat_json_object_add_ip4 (node, "lloc", ip4);
3141 clib_memcpy (&ip4, mp->rloc, sizeof (ip4));
3142 vat_json_object_add_ip4 (node, "rloc", ip4);
3143 }
3144 else
3145 {
3146 clib_memcpy (&ip6, mp->lloc, sizeof (ip6));
3147 vat_json_object_add_ip6 (node, "lloc", ip6);
3148 clib_memcpy (&ip6, mp->rloc, sizeof (ip6));
3149 vat_json_object_add_ip6 (node, "rloc", ip6);
3150 }
3151 vat_json_object_add_uint (node, "pkt_count",
3152 clib_net_to_host_u32 (mp->pkt_count));
3153 vat_json_object_add_uint (node, "bytes", clib_net_to_host_u32 (mp->bytes));
3154
3155 vec_free (deid);
3156 vec_free (seid);
3157}
3158
3159static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003160 vl_api_one_eid_table_map_details_t_handler
3161 (vl_api_one_eid_table_map_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003162{
3163 vat_main_t *vam = &vat_main;
3164
3165 u8 *line = format (0, "%=10d%=10d",
3166 clib_net_to_host_u32 (mp->vni),
3167 clib_net_to_host_u32 (mp->dp_table));
3168 print (vam->ofp, "%v", line);
3169 vec_free (line);
3170}
3171
3172static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003173 vl_api_one_eid_table_map_details_t_handler_json
3174 (vl_api_one_eid_table_map_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003175{
3176 vat_main_t *vam = &vat_main;
3177 vat_json_node_t *node = NULL;
3178
3179 if (VAT_JSON_ARRAY != vam->json_tree.type)
3180 {
3181 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3182 vat_json_init_array (&vam->json_tree);
3183 }
3184 node = vat_json_array_add (&vam->json_tree);
3185 vat_json_init_object (node);
3186 vat_json_object_add_uint (node, "dp_table",
3187 clib_net_to_host_u32 (mp->dp_table));
3188 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3189}
3190
3191static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003192 vl_api_one_eid_table_vni_details_t_handler
3193 (vl_api_one_eid_table_vni_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003194{
3195 vat_main_t *vam = &vat_main;
3196
3197 u8 *line = format (0, "%d", clib_net_to_host_u32 (mp->vni));
3198 print (vam->ofp, "%v", line);
3199 vec_free (line);
3200}
3201
3202static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003203 vl_api_one_eid_table_vni_details_t_handler_json
3204 (vl_api_one_eid_table_vni_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003205{
3206 vat_main_t *vam = &vat_main;
3207 vat_json_node_t *node = NULL;
3208
3209 if (VAT_JSON_ARRAY != vam->json_tree.type)
3210 {
3211 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3212 vat_json_init_array (&vam->json_tree);
3213 }
3214 node = vat_json_array_add (&vam->json_tree);
3215 vat_json_init_object (node);
3216 vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni));
3217}
3218
Damjan Marion7cd468a2016-12-19 23:05:39 +01003219static void
Filip Tehlar7048ff12017-07-27 08:09:14 +02003220 vl_api_show_one_map_register_fallback_threshold_reply_t_handler
3221 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3222{
3223 vat_main_t *vam = &vat_main;
3224 int retval = clib_net_to_host_u32 (mp->retval);
3225
3226 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3227 print (vam->ofp, "fallback threshold value: %d", mp->value);
3228
3229 vam->retval = retval;
3230 vam->result_ready = 1;
3231}
3232
3233static void
3234 vl_api_show_one_map_register_fallback_threshold_reply_t_handler_json
3235 (vl_api_show_one_map_register_fallback_threshold_reply_t * mp)
3236{
3237 vat_main_t *vam = &vat_main;
3238 vat_json_node_t _node, *node = &_node;
3239 int retval = clib_net_to_host_u32 (mp->retval);
3240
3241 vl_api_show_one_map_register_fallback_threshold_reply_t_endian (mp);
3242 vat_json_init_object (node);
3243 vat_json_object_add_uint (node, "value", mp->value);
3244
3245 vat_json_print (vam->ofp, node);
3246 vat_json_free (node);
3247
3248 vam->retval = retval;
3249 vam->result_ready = 1;
3250}
3251
3252static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003253 vl_api_show_one_map_register_state_reply_t_handler
3254 (vl_api_show_one_map_register_state_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003255{
3256 vat_main_t *vam = &vat_main;
3257 int retval = clib_net_to_host_u32 (mp->retval);
3258
3259 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3260
3261 vam->retval = retval;
3262 vam->result_ready = 1;
3263}
3264
3265static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003266 vl_api_show_one_map_register_state_reply_t_handler_json
3267 (vl_api_show_one_map_register_state_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003268{
3269 vat_main_t *vam = &vat_main;
3270 vat_json_node_t _node, *node = &_node;
3271 int retval = clib_net_to_host_u32 (mp->retval);
3272
3273 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3274
3275 vat_json_init_object (node);
3276 vat_json_object_add_string_copy (node, "state", s);
3277
3278 vat_json_print (vam->ofp, node);
3279 vat_json_free (node);
3280
3281 vam->retval = retval;
3282 vam->result_ready = 1;
3283 vec_free (s);
3284}
3285
3286static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003287 vl_api_show_one_rloc_probe_state_reply_t_handler
3288 (vl_api_show_one_rloc_probe_state_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003289{
3290 vat_main_t *vam = &vat_main;
3291 int retval = clib_net_to_host_u32 (mp->retval);
3292
3293 if (retval)
3294 goto end;
3295
3296 print (vam->ofp, "%s", mp->is_enabled ? "enabled" : "disabled");
3297end:
3298 vam->retval = retval;
3299 vam->result_ready = 1;
3300}
3301
3302static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003303 vl_api_show_one_rloc_probe_state_reply_t_handler_json
3304 (vl_api_show_one_rloc_probe_state_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003305{
3306 vat_main_t *vam = &vat_main;
3307 vat_json_node_t _node, *node = &_node;
3308 int retval = clib_net_to_host_u32 (mp->retval);
3309
3310 u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled");
3311 vat_json_init_object (node);
3312 vat_json_object_add_string_copy (node, "state", s);
3313
3314 vat_json_print (vam->ofp, node);
3315 vat_json_free (node);
3316
3317 vam->retval = retval;
3318 vam->result_ready = 1;
3319 vec_free (s);
3320}
3321
3322static void
Filip Tehlar4868ff62017-03-09 16:48:39 +01003323 vl_api_show_one_stats_enable_disable_reply_t_handler
3324 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3325{
3326 vat_main_t *vam = &vat_main;
3327 int retval = clib_net_to_host_u32 (mp->retval);
3328
3329 if (retval)
3330 goto end;
3331
3332 print (vam->ofp, "%s", mp->is_en ? "enabled" : "disabled");
3333end:
3334 vam->retval = retval;
3335 vam->result_ready = 1;
3336}
3337
3338static void
3339 vl_api_show_one_stats_enable_disable_reply_t_handler_json
3340 (vl_api_show_one_stats_enable_disable_reply_t * mp)
3341{
3342 vat_main_t *vam = &vat_main;
3343 vat_json_node_t _node, *node = &_node;
3344 int retval = clib_net_to_host_u32 (mp->retval);
3345
3346 u8 *s = format (0, "%s", mp->is_en ? "enabled" : "disabled");
3347 vat_json_init_object (node);
3348 vat_json_object_add_string_copy (node, "state", s);
3349
3350 vat_json_print (vam->ofp, node);
3351 vat_json_free (node);
3352
3353 vam->retval = retval;
3354 vam->result_ready = 1;
3355 vec_free (s);
3356}
3357
3358static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003359api_gpe_fwd_entry_net_to_host (vl_api_gpe_fwd_entry_t * e)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003360{
3361 e->dp_table = clib_net_to_host_u32 (e->dp_table);
3362 e->fwd_entry_index = clib_net_to_host_u32 (e->fwd_entry_index);
Filip Tehlar0eb874e2017-05-18 14:23:32 +02003363 e->vni = clib_net_to_host_u32 (e->vni);
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003364}
3365
3366static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003367 gpe_fwd_entries_get_reply_t_net_to_host
3368 (vl_api_gpe_fwd_entries_get_reply_t * mp)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003369{
3370 u32 i;
3371
3372 mp->count = clib_net_to_host_u32 (mp->count);
3373 for (i = 0; i < mp->count; i++)
3374 {
Filip Tehlar82786c42017-02-20 15:20:37 +01003375 api_gpe_fwd_entry_net_to_host (&mp->entries[i]);
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003376 }
3377}
3378
Filip Tehlar3e7b56932017-02-21 18:28:34 +01003379static u8 *
3380format_gpe_encap_mode (u8 * s, va_list * args)
3381{
3382 u32 mode = va_arg (*args, u32);
3383
3384 switch (mode)
3385 {
3386 case 0:
3387 return format (s, "lisp");
3388 case 1:
3389 return format (s, "vxlan");
3390 }
3391 return 0;
3392}
3393
3394static void
3395 vl_api_gpe_get_encap_mode_reply_t_handler
3396 (vl_api_gpe_get_encap_mode_reply_t * mp)
3397{
3398 vat_main_t *vam = &vat_main;
3399
3400 print (vam->ofp, "gpe mode: %U", format_gpe_encap_mode, mp->encap_mode);
3401 vam->retval = ntohl (mp->retval);
3402 vam->result_ready = 1;
3403}
3404
3405static void
3406 vl_api_gpe_get_encap_mode_reply_t_handler_json
3407 (vl_api_gpe_get_encap_mode_reply_t * mp)
3408{
3409 vat_main_t *vam = &vat_main;
3410 vat_json_node_t node;
3411
3412 u8 *encap_mode = format (0, "%U", format_gpe_encap_mode, mp->encap_mode);
3413 vec_add1 (encap_mode, 0);
3414
3415 vat_json_init_object (&node);
3416 vat_json_object_add_string_copy (&node, "gpe_mode", encap_mode);
3417
3418 vec_free (encap_mode);
3419 vat_json_print (vam->ofp, &node);
3420 vat_json_free (&node);
3421
3422 vam->retval = ntohl (mp->retval);
3423 vam->result_ready = 1;
3424}
3425
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003426static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003427 vl_api_gpe_fwd_entry_path_details_t_handler
3428 (vl_api_gpe_fwd_entry_path_details_t * mp)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003429{
3430 vat_main_t *vam = &vat_main;
3431 u8 *(*format_ip_address_fcn) (u8 *, va_list *) = 0;
3432
3433 if (mp->lcl_loc.is_ip4)
3434 format_ip_address_fcn = format_ip4_address;
3435 else
3436 format_ip_address_fcn = format_ip6_address;
3437
3438 print (vam->ofp, "w:%d %30U %30U", mp->rmt_loc.weight,
3439 format_ip_address_fcn, &mp->lcl_loc,
3440 format_ip_address_fcn, &mp->rmt_loc);
3441}
3442
3443static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003444lisp_fill_locator_node (vat_json_node_t * n, vl_api_gpe_locator_t * loc)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003445{
3446 struct in6_addr ip6;
3447 struct in_addr ip4;
3448
3449 if (loc->is_ip4)
3450 {
3451 clib_memcpy (&ip4, loc->addr, sizeof (ip4));
3452 vat_json_object_add_ip4 (n, "address", ip4);
3453 }
3454 else
3455 {
3456 clib_memcpy (&ip6, loc->addr, sizeof (ip6));
3457 vat_json_object_add_ip6 (n, "address", ip6);
3458 }
3459 vat_json_object_add_uint (n, "weight", loc->weight);
3460}
3461
3462static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003463 vl_api_gpe_fwd_entry_path_details_t_handler_json
3464 (vl_api_gpe_fwd_entry_path_details_t * mp)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003465{
3466 vat_main_t *vam = &vat_main;
3467 vat_json_node_t *node = NULL;
3468 vat_json_node_t *loc_node;
3469
3470 if (VAT_JSON_ARRAY != vam->json_tree.type)
3471 {
3472 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
3473 vat_json_init_array (&vam->json_tree);
3474 }
3475 node = vat_json_array_add (&vam->json_tree);
3476 vat_json_init_object (node);
3477
3478 loc_node = vat_json_object_add (node, "local_locator");
3479 vat_json_init_object (loc_node);
3480 lisp_fill_locator_node (loc_node, &mp->lcl_loc);
3481
3482 loc_node = vat_json_object_add (node, "remote_locator");
3483 vat_json_init_object (loc_node);
3484 lisp_fill_locator_node (loc_node, &mp->rmt_loc);
3485}
3486
3487static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003488 vl_api_gpe_fwd_entries_get_reply_t_handler
3489 (vl_api_gpe_fwd_entries_get_reply_t * mp)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003490{
3491 vat_main_t *vam = &vat_main;
3492 u32 i;
3493 int retval = clib_net_to_host_u32 (mp->retval);
Filip Tehlar82786c42017-02-20 15:20:37 +01003494 vl_api_gpe_fwd_entry_t *e;
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003495
3496 if (retval)
3497 goto end;
3498
Filip Tehlar82786c42017-02-20 15:20:37 +01003499 gpe_fwd_entries_get_reply_t_net_to_host (mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003500
3501 for (i = 0; i < mp->count; i++)
3502 {
3503 e = &mp->entries[i];
3504 print (vam->ofp, "%10d %10d %U %40U", e->fwd_entry_index, e->dp_table,
3505 format_lisp_flat_eid, e->eid_type, e->leid, e->leid_prefix_len,
3506 format_lisp_flat_eid, e->eid_type, e->reid, e->reid_prefix_len);
3507 }
3508
3509end:
3510 vam->retval = retval;
3511 vam->result_ready = 1;
3512}
3513
3514static void
Filip Tehlar82786c42017-02-20 15:20:37 +01003515 vl_api_gpe_fwd_entries_get_reply_t_handler_json
3516 (vl_api_gpe_fwd_entries_get_reply_t * mp)
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003517{
3518 u8 *s = 0;
3519 vat_main_t *vam = &vat_main;
3520 vat_json_node_t *e = 0, root;
3521 u32 i;
3522 int retval = clib_net_to_host_u32 (mp->retval);
Filip Tehlar82786c42017-02-20 15:20:37 +01003523 vl_api_gpe_fwd_entry_t *fwd;
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003524
3525 if (retval)
3526 goto end;
3527
Filip Tehlar82786c42017-02-20 15:20:37 +01003528 gpe_fwd_entries_get_reply_t_net_to_host (mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003529 vat_json_init_array (&root);
3530
3531 for (i = 0; i < mp->count; i++)
3532 {
3533 e = vat_json_array_add (&root);
3534 fwd = &mp->entries[i];
3535
3536 vat_json_init_object (e);
3537 vat_json_object_add_int (e, "fwd_entry_index", fwd->fwd_entry_index);
3538 vat_json_object_add_int (e, "dp_table", fwd->dp_table);
Filip Tehlar0eb874e2017-05-18 14:23:32 +02003539 vat_json_object_add_int (e, "vni", fwd->vni);
3540 vat_json_object_add_int (e, "action", fwd->action);
Filip Tehlar5fae99c2017-01-18 12:57:37 +01003541
3542 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->leid,
3543 fwd->leid_prefix_len);
3544 vec_add1 (s, 0);
3545 vat_json_object_add_string_copy (e, "leid", s);
3546 vec_free (s);
3547
3548 s = format (0, "%U", format_lisp_flat_eid, fwd->eid_type, fwd->reid,
3549 fwd->reid_prefix_len);
3550 vec_add1 (s, 0);
3551 vat_json_object_add_string_copy (e, "reid", s);
3552 vec_free (s);
3553 }
3554
3555 vat_json_print (vam->ofp, &root);
3556 vat_json_free (&root);
3557
3558end:
3559 vam->retval = retval;
3560 vam->result_ready = 1;
3561}
3562
3563static void
Filip Tehlarb4243aa2017-06-14 14:39:42 +02003564 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler
3565 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3566{
3567 vat_main_t *vam = &vat_main;
3568 u32 i, n;
3569 int retval = clib_net_to_host_u32 (mp->retval);
3570 vl_api_gpe_native_fwd_rpath_t *r;
3571
3572 if (retval)
3573 goto end;
3574
3575 n = clib_net_to_host_u32 (mp->count);
3576
3577 for (i = 0; i < n; i++)
3578 {
3579 r = &mp->entries[i];
3580 print (vam->ofp, "fib_index: %d sw_if_index %d nh %U",
3581 clib_net_to_host_u32 (r->fib_index),
3582 clib_net_to_host_u32 (r->nh_sw_if_index),
3583 r->is_ip4 ? format_ip4_address : format_ip6_address, r->nh_addr);
3584 }
3585
3586end:
3587 vam->retval = retval;
3588 vam->result_ready = 1;
3589}
3590
3591static void
3592 vl_api_gpe_native_fwd_rpaths_get_reply_t_handler_json
3593 (vl_api_gpe_native_fwd_rpaths_get_reply_t * mp)
3594{
3595 vat_main_t *vam = &vat_main;
3596 vat_json_node_t root, *e;
3597 u32 i, n;
3598 int retval = clib_net_to_host_u32 (mp->retval);
3599 vl_api_gpe_native_fwd_rpath_t *r;
3600 u8 *s;
3601
3602 if (retval)
3603 goto end;
3604
3605 n = clib_net_to_host_u32 (mp->count);
3606 vat_json_init_array (&root);
3607
3608 for (i = 0; i < n; i++)
3609 {
3610 e = vat_json_array_add (&root);
3611 vat_json_init_object (e);
3612 r = &mp->entries[i];
3613 s =
3614 format (0, "%U", r->is_ip4 ? format_ip4_address : format_ip6_address,
3615 r->nh_addr);
3616 vec_add1 (s, 0);
3617 vat_json_object_add_string_copy (e, "ip4", s);
3618 vec_free (s);
3619
3620 vat_json_object_add_uint (e, "fib_index",
3621 clib_net_to_host_u32 (r->fib_index));
3622 vat_json_object_add_uint (e, "nh_sw_if_index",
3623 clib_net_to_host_u32 (r->nh_sw_if_index));
3624 }
3625
3626 vat_json_print (vam->ofp, &root);
3627 vat_json_free (&root);
3628
3629end:
3630 vam->retval = retval;
3631 vam->result_ready = 1;
3632}
3633
3634static void
Filip Tehlar0eb874e2017-05-18 14:23:32 +02003635 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler
3636 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3637{
3638 vat_main_t *vam = &vat_main;
3639 u32 i, n;
3640 int retval = clib_net_to_host_u32 (mp->retval);
3641
3642 if (retval)
3643 goto end;
3644
3645 n = clib_net_to_host_u32 (mp->count);
3646
3647 for (i = 0; i < n; i++)
3648 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->vnis[i]));
3649
3650end:
3651 vam->retval = retval;
3652 vam->result_ready = 1;
3653}
3654
3655static void
3656 vl_api_gpe_fwd_entry_vnis_get_reply_t_handler_json
3657 (vl_api_gpe_fwd_entry_vnis_get_reply_t * mp)
3658{
3659 vat_main_t *vam = &vat_main;
3660 vat_json_node_t root;
3661 u32 i, n;
3662 int retval = clib_net_to_host_u32 (mp->retval);
3663
3664 if (retval)
3665 goto end;
3666
3667 n = clib_net_to_host_u32 (mp->count);
3668 vat_json_init_array (&root);
3669
3670 for (i = 0; i < n; i++)
3671 vat_json_array_add_uint (&root, clib_net_to_host_u32 (mp->vnis[i]));
3672
3673 vat_json_print (vam->ofp, &root);
3674 vat_json_free (&root);
3675
3676end:
3677 vam->retval = retval;
3678 vam->result_ready = 1;
3679}
3680
3681static void
Filip Tehlar05879992017-09-05 15:46:09 +02003682 vl_api_one_ndp_entries_get_reply_t_handler
3683 (vl_api_one_ndp_entries_get_reply_t * mp)
3684{
3685 vat_main_t *vam = &vat_main;
3686 u32 i, n;
3687 int retval = clib_net_to_host_u32 (mp->retval);
3688
3689 if (retval)
3690 goto end;
3691
3692 n = clib_net_to_host_u32 (mp->count);
3693
3694 for (i = 0; i < n; i++)
3695 print (vam->ofp, "%U -> %U", format_ip6_address, &mp->entries[i].ip6,
3696 format_ethernet_address, mp->entries[i].mac);
3697
3698end:
3699 vam->retval = retval;
3700 vam->result_ready = 1;
3701}
3702
3703static void
3704 vl_api_one_ndp_entries_get_reply_t_handler_json
3705 (vl_api_one_ndp_entries_get_reply_t * mp)
3706{
3707 u8 *s = 0;
3708 vat_main_t *vam = &vat_main;
3709 vat_json_node_t *e = 0, root;
3710 u32 i, n;
3711 int retval = clib_net_to_host_u32 (mp->retval);
3712 vl_api_one_ndp_entry_t *arp_entry;
3713
3714 if (retval)
3715 goto end;
3716
3717 n = clib_net_to_host_u32 (mp->count);
3718 vat_json_init_array (&root);
3719
3720 for (i = 0; i < n; i++)
3721 {
3722 e = vat_json_array_add (&root);
3723 arp_entry = &mp->entries[i];
3724
3725 vat_json_init_object (e);
3726 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3727 vec_add1 (s, 0);
3728
3729 vat_json_object_add_string_copy (e, "mac", s);
3730 vec_free (s);
3731
3732 s = format (0, "%U", format_ip6_address, &arp_entry->ip6);
3733 vec_add1 (s, 0);
3734 vat_json_object_add_string_copy (e, "ip6", s);
3735 vec_free (s);
3736 }
3737
3738 vat_json_print (vam->ofp, &root);
3739 vat_json_free (&root);
3740
3741end:
3742 vam->retval = retval;
3743 vam->result_ready = 1;
3744}
3745
3746static void
Filip Tehlard5a65db2017-05-17 17:21:10 +02003747 vl_api_one_l2_arp_entries_get_reply_t_handler
3748 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3749{
3750 vat_main_t *vam = &vat_main;
3751 u32 i, n;
3752 int retval = clib_net_to_host_u32 (mp->retval);
3753
3754 if (retval)
3755 goto end;
3756
3757 n = clib_net_to_host_u32 (mp->count);
3758
3759 for (i = 0; i < n; i++)
3760 print (vam->ofp, "%U -> %U", format_ip4_address, &mp->entries[i].ip4,
3761 format_ethernet_address, mp->entries[i].mac);
3762
3763end:
3764 vam->retval = retval;
3765 vam->result_ready = 1;
3766}
3767
3768static void
3769 vl_api_one_l2_arp_entries_get_reply_t_handler_json
3770 (vl_api_one_l2_arp_entries_get_reply_t * mp)
3771{
3772 u8 *s = 0;
3773 vat_main_t *vam = &vat_main;
3774 vat_json_node_t *e = 0, root;
3775 u32 i, n;
3776 int retval = clib_net_to_host_u32 (mp->retval);
3777 vl_api_one_l2_arp_entry_t *arp_entry;
3778
3779 if (retval)
3780 goto end;
3781
3782 n = clib_net_to_host_u32 (mp->count);
3783 vat_json_init_array (&root);
3784
3785 for (i = 0; i < n; i++)
3786 {
3787 e = vat_json_array_add (&root);
3788 arp_entry = &mp->entries[i];
3789
3790 vat_json_init_object (e);
3791 s = format (0, "%U", format_ethernet_address, arp_entry->mac);
3792 vec_add1 (s, 0);
3793
3794 vat_json_object_add_string_copy (e, "mac", s);
3795 vec_free (s);
3796
3797 s = format (0, "%U", format_ip4_address, &arp_entry->ip4);
3798 vec_add1 (s, 0);
3799 vat_json_object_add_string_copy (e, "ip4", s);
3800 vec_free (s);
3801 }
3802
3803 vat_json_print (vam->ofp, &root);
3804 vat_json_free (&root);
3805
3806end:
3807 vam->retval = retval;
3808 vam->result_ready = 1;
3809}
3810
3811static void
Filip Tehlar05879992017-09-05 15:46:09 +02003812vl_api_one_ndp_bd_get_reply_t_handler (vl_api_one_ndp_bd_get_reply_t * mp)
3813{
3814 vat_main_t *vam = &vat_main;
3815 u32 i, n;
3816 int retval = clib_net_to_host_u32 (mp->retval);
3817
3818 if (retval)
3819 goto end;
3820
3821 n = clib_net_to_host_u32 (mp->count);
3822
3823 for (i = 0; i < n; i++)
3824 {
3825 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3826 }
3827
3828end:
3829 vam->retval = retval;
3830 vam->result_ready = 1;
3831}
3832
3833static void
3834 vl_api_one_ndp_bd_get_reply_t_handler_json
3835 (vl_api_one_ndp_bd_get_reply_t * mp)
3836{
3837 vat_main_t *vam = &vat_main;
3838 vat_json_node_t root;
3839 u32 i, n;
3840 int retval = clib_net_to_host_u32 (mp->retval);
3841
3842 if (retval)
3843 goto end;
3844
3845 n = clib_net_to_host_u32 (mp->count);
3846 vat_json_init_array (&root);
3847
3848 for (i = 0; i < n; i++)
3849 {
3850 vat_json_array_add_uint (&root,
3851 clib_net_to_host_u32 (mp->bridge_domains[i]));
3852 }
3853
3854 vat_json_print (vam->ofp, &root);
3855 vat_json_free (&root);
3856
3857end:
3858 vam->retval = retval;
3859 vam->result_ready = 1;
3860}
3861
3862static void
Filip Tehlard5a65db2017-05-17 17:21:10 +02003863 vl_api_one_l2_arp_bd_get_reply_t_handler
3864 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3865{
3866 vat_main_t *vam = &vat_main;
3867 u32 i, n;
3868 int retval = clib_net_to_host_u32 (mp->retval);
3869
3870 if (retval)
3871 goto end;
3872
3873 n = clib_net_to_host_u32 (mp->count);
3874
3875 for (i = 0; i < n; i++)
3876 {
3877 print (vam->ofp, "%d", clib_net_to_host_u32 (mp->bridge_domains[i]));
3878 }
3879
3880end:
3881 vam->retval = retval;
3882 vam->result_ready = 1;
3883}
3884
3885static void
3886 vl_api_one_l2_arp_bd_get_reply_t_handler_json
3887 (vl_api_one_l2_arp_bd_get_reply_t * mp)
3888{
3889 vat_main_t *vam = &vat_main;
3890 vat_json_node_t root;
3891 u32 i, n;
3892 int retval = clib_net_to_host_u32 (mp->retval);
3893
3894 if (retval)
3895 goto end;
3896
3897 n = clib_net_to_host_u32 (mp->count);
3898 vat_json_init_array (&root);
3899
3900 for (i = 0; i < n; i++)
3901 {
3902 vat_json_array_add_uint (&root,
3903 clib_net_to_host_u32 (mp->bridge_domains[i]));
3904 }
3905
3906 vat_json_print (vam->ofp, &root);
3907 vat_json_free (&root);
3908
3909end:
3910 vam->retval = retval;
3911 vam->result_ready = 1;
3912}
3913
3914static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003915 vl_api_one_adjacencies_get_reply_t_handler
3916 (vl_api_one_adjacencies_get_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003917{
3918 vat_main_t *vam = &vat_main;
3919 u32 i, n;
3920 int retval = clib_net_to_host_u32 (mp->retval);
Filip Tehlar694396d2017-02-17 14:29:11 +01003921 vl_api_one_adjacency_t *a;
Damjan Marion7cd468a2016-12-19 23:05:39 +01003922
3923 if (retval)
3924 goto end;
3925
3926 n = clib_net_to_host_u32 (mp->count);
3927
3928 for (i = 0; i < n; i++)
3929 {
3930 a = &mp->adjacencies[i];
3931 print (vam->ofp, "%U %40U",
3932 format_lisp_flat_eid, a->eid_type, a->leid, a->leid_prefix_len,
3933 format_lisp_flat_eid, a->eid_type, a->reid, a->reid_prefix_len);
3934 }
3935
3936end:
3937 vam->retval = retval;
3938 vam->result_ready = 1;
3939}
3940
3941static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003942 vl_api_one_adjacencies_get_reply_t_handler_json
3943 (vl_api_one_adjacencies_get_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003944{
3945 u8 *s = 0;
3946 vat_main_t *vam = &vat_main;
3947 vat_json_node_t *e = 0, root;
3948 u32 i, n;
3949 int retval = clib_net_to_host_u32 (mp->retval);
Filip Tehlar694396d2017-02-17 14:29:11 +01003950 vl_api_one_adjacency_t *a;
Damjan Marion7cd468a2016-12-19 23:05:39 +01003951
3952 if (retval)
3953 goto end;
3954
3955 n = clib_net_to_host_u32 (mp->count);
3956 vat_json_init_array (&root);
3957
3958 for (i = 0; i < n; i++)
3959 {
3960 e = vat_json_array_add (&root);
3961 a = &mp->adjacencies[i];
3962
3963 vat_json_init_object (e);
3964 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->leid,
3965 a->leid_prefix_len);
3966 vec_add1 (s, 0);
3967 vat_json_object_add_string_copy (e, "leid", s);
3968 vec_free (s);
3969
3970 s = format (0, "%U", format_lisp_flat_eid, a->eid_type, a->reid,
3971 a->reid_prefix_len);
3972 vec_add1 (s, 0);
3973 vat_json_object_add_string_copy (e, "reid", s);
3974 vec_free (s);
3975 }
3976
3977 vat_json_print (vam->ofp, &root);
3978 vat_json_free (&root);
3979
3980end:
3981 vam->retval = retval;
3982 vam->result_ready = 1;
3983}
3984
3985static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003986vl_api_one_map_server_details_t_handler (vl_api_one_map_server_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003987{
3988 vat_main_t *vam = &vat_main;
3989
3990 print (vam->ofp, "%=20U",
3991 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
3992 mp->ip_address);
3993}
3994
3995static void
Filip Tehlar694396d2017-02-17 14:29:11 +01003996 vl_api_one_map_server_details_t_handler_json
3997 (vl_api_one_map_server_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01003998{
3999 vat_main_t *vam = &vat_main;
4000 vat_json_node_t *node = NULL;
4001 struct in6_addr ip6;
4002 struct in_addr ip4;
4003
4004 if (VAT_JSON_ARRAY != vam->json_tree.type)
4005 {
4006 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4007 vat_json_init_array (&vam->json_tree);
4008 }
4009 node = vat_json_array_add (&vam->json_tree);
4010
4011 vat_json_init_object (node);
4012 if (mp->is_ipv6)
4013 {
4014 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4015 vat_json_object_add_ip6 (node, "map-server", ip6);
4016 }
4017 else
4018 {
4019 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4020 vat_json_object_add_ip4 (node, "map-server", ip4);
4021 }
4022}
4023
4024static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004025vl_api_one_map_resolver_details_t_handler (vl_api_one_map_resolver_details_t
4026 * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004027{
4028 vat_main_t *vam = &vat_main;
4029
4030 print (vam->ofp, "%=20U",
4031 mp->is_ipv6 ? format_ip6_address : format_ip4_address,
4032 mp->ip_address);
4033}
4034
4035static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004036 vl_api_one_map_resolver_details_t_handler_json
4037 (vl_api_one_map_resolver_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004038{
4039 vat_main_t *vam = &vat_main;
4040 vat_json_node_t *node = NULL;
4041 struct in6_addr ip6;
4042 struct in_addr ip4;
4043
4044 if (VAT_JSON_ARRAY != vam->json_tree.type)
4045 {
4046 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4047 vat_json_init_array (&vam->json_tree);
4048 }
4049 node = vat_json_array_add (&vam->json_tree);
4050
4051 vat_json_init_object (node);
4052 if (mp->is_ipv6)
4053 {
4054 clib_memcpy (&ip6, mp->ip_address, sizeof (ip6));
4055 vat_json_object_add_ip6 (node, "map resolver", ip6);
4056 }
4057 else
4058 {
4059 clib_memcpy (&ip4, mp->ip_address, sizeof (ip4));
4060 vat_json_object_add_ip4 (node, "map resolver", ip4);
4061 }
4062}
4063
4064static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004065vl_api_show_one_status_reply_t_handler (vl_api_show_one_status_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004066{
4067 vat_main_t *vam = &vat_main;
4068 i32 retval = ntohl (mp->retval);
4069
4070 if (0 <= retval)
4071 {
4072 print (vam->ofp, "feature: %s\ngpe: %s",
4073 mp->feature_status ? "enabled" : "disabled",
4074 mp->gpe_status ? "enabled" : "disabled");
4075 }
4076
4077 vam->retval = retval;
4078 vam->result_ready = 1;
4079}
4080
4081static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004082 vl_api_show_one_status_reply_t_handler_json
4083 (vl_api_show_one_status_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004084{
4085 vat_main_t *vam = &vat_main;
4086 vat_json_node_t node;
4087 u8 *gpe_status = NULL;
4088 u8 *feature_status = NULL;
4089
4090 gpe_status = format (0, "%s", mp->gpe_status ? "enabled" : "disabled");
4091 feature_status = format (0, "%s",
4092 mp->feature_status ? "enabled" : "disabled");
4093 vec_add1 (gpe_status, 0);
4094 vec_add1 (feature_status, 0);
4095
4096 vat_json_init_object (&node);
4097 vat_json_object_add_string_copy (&node, "gpe_status", gpe_status);
4098 vat_json_object_add_string_copy (&node, "feature_status", feature_status);
4099
4100 vec_free (gpe_status);
4101 vec_free (feature_status);
4102
4103 vat_json_print (vam->ofp, &node);
4104 vat_json_free (&node);
4105
4106 vam->retval = ntohl (mp->retval);
4107 vam->result_ready = 1;
4108}
4109
4110static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004111 vl_api_one_get_map_request_itr_rlocs_reply_t_handler
4112 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004113{
4114 vat_main_t *vam = &vat_main;
4115 i32 retval = ntohl (mp->retval);
4116
4117 if (retval >= 0)
4118 {
4119 print (vam->ofp, "%=20s", mp->locator_set_name);
4120 }
4121
4122 vam->retval = retval;
4123 vam->result_ready = 1;
4124}
4125
4126static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004127 vl_api_one_get_map_request_itr_rlocs_reply_t_handler_json
4128 (vl_api_one_get_map_request_itr_rlocs_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004129{
4130 vat_main_t *vam = &vat_main;
4131 vat_json_node_t *node = NULL;
4132
4133 if (VAT_JSON_ARRAY != vam->json_tree.type)
4134 {
4135 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4136 vat_json_init_array (&vam->json_tree);
4137 }
4138 node = vat_json_array_add (&vam->json_tree);
4139
4140 vat_json_init_object (node);
4141 vat_json_object_add_string_copy (node, "itr-rlocs", mp->locator_set_name);
4142
4143 vat_json_print (vam->ofp, node);
4144 vat_json_free (node);
4145
4146 vam->retval = ntohl (mp->retval);
4147 vam->result_ready = 1;
4148}
4149
4150static u8 *
4151format_lisp_map_request_mode (u8 * s, va_list * args)
4152{
4153 u32 mode = va_arg (*args, u32);
4154
4155 switch (mode)
4156 {
4157 case 0:
4158 return format (0, "dst-only");
4159 case 1:
4160 return format (0, "src-dst");
4161 }
4162 return 0;
4163}
4164
4165static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004166 vl_api_show_one_map_request_mode_reply_t_handler
4167 (vl_api_show_one_map_request_mode_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004168{
4169 vat_main_t *vam = &vat_main;
4170 i32 retval = ntohl (mp->retval);
4171
4172 if (0 <= retval)
4173 {
4174 u32 mode = mp->mode;
4175 print (vam->ofp, "map_request_mode: %U",
4176 format_lisp_map_request_mode, mode);
4177 }
4178
4179 vam->retval = retval;
4180 vam->result_ready = 1;
4181}
4182
4183static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004184 vl_api_show_one_map_request_mode_reply_t_handler_json
4185 (vl_api_show_one_map_request_mode_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004186{
4187 vat_main_t *vam = &vat_main;
4188 vat_json_node_t node;
4189 u8 *s = 0;
4190 u32 mode;
4191
4192 mode = mp->mode;
4193 s = format (0, "%U", format_lisp_map_request_mode, mode);
4194 vec_add1 (s, 0);
4195
4196 vat_json_init_object (&node);
4197 vat_json_object_add_string_copy (&node, "map_request_mode", s);
4198 vat_json_print (vam->ofp, &node);
4199 vat_json_free (&node);
4200
4201 vec_free (s);
4202 vam->retval = ntohl (mp->retval);
4203 vam->result_ready = 1;
4204}
4205
4206static void
Filip Tehlar0a8840d2017-10-16 05:48:23 -07004207 vl_api_one_show_xtr_mode_reply_t_handler
4208 (vl_api_one_show_xtr_mode_reply_t * mp)
4209{
4210 vat_main_t *vam = &vat_main;
4211 i32 retval = ntohl (mp->retval);
4212
4213 if (0 <= retval)
4214 {
4215 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4216 }
4217
4218 vam->retval = retval;
4219 vam->result_ready = 1;
4220}
4221
4222static void
4223 vl_api_one_show_xtr_mode_reply_t_handler_json
4224 (vl_api_one_show_xtr_mode_reply_t * mp)
4225{
4226 vat_main_t *vam = &vat_main;
4227 vat_json_node_t node;
4228 u8 *status = 0;
4229
4230 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4231 vec_add1 (status, 0);
4232
4233 vat_json_init_object (&node);
4234 vat_json_object_add_string_copy (&node, "status", status);
4235
4236 vec_free (status);
4237
4238 vat_json_print (vam->ofp, &node);
4239 vat_json_free (&node);
4240
4241 vam->retval = ntohl (mp->retval);
4242 vam->result_ready = 1;
4243}
4244
4245static void
4246 vl_api_one_show_pitr_mode_reply_t_handler
4247 (vl_api_one_show_pitr_mode_reply_t * mp)
4248{
4249 vat_main_t *vam = &vat_main;
4250 i32 retval = ntohl (mp->retval);
4251
4252 if (0 <= retval)
4253 {
4254 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4255 }
4256
4257 vam->retval = retval;
4258 vam->result_ready = 1;
4259}
4260
4261static void
4262 vl_api_one_show_pitr_mode_reply_t_handler_json
4263 (vl_api_one_show_pitr_mode_reply_t * mp)
4264{
4265 vat_main_t *vam = &vat_main;
4266 vat_json_node_t node;
4267 u8 *status = 0;
4268
4269 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4270 vec_add1 (status, 0);
4271
4272 vat_json_init_object (&node);
4273 vat_json_object_add_string_copy (&node, "status", status);
4274
4275 vec_free (status);
4276
4277 vat_json_print (vam->ofp, &node);
4278 vat_json_free (&node);
4279
4280 vam->retval = ntohl (mp->retval);
4281 vam->result_ready = 1;
4282}
4283
4284static void
4285 vl_api_one_show_petr_mode_reply_t_handler
4286 (vl_api_one_show_petr_mode_reply_t * mp)
4287{
4288 vat_main_t *vam = &vat_main;
4289 i32 retval = ntohl (mp->retval);
4290
4291 if (0 <= retval)
4292 {
4293 print (vam->ofp, "%s\n", mp->is_en ? "enabled" : "disabled");
4294 }
4295
4296 vam->retval = retval;
4297 vam->result_ready = 1;
4298}
4299
4300static void
4301 vl_api_one_show_petr_mode_reply_t_handler_json
4302 (vl_api_one_show_petr_mode_reply_t * mp)
4303{
4304 vat_main_t *vam = &vat_main;
4305 vat_json_node_t node;
4306 u8 *status = 0;
4307
4308 status = format (0, "%s", mp->is_en ? "enabled" : "disabled");
4309 vec_add1 (status, 0);
4310
4311 vat_json_init_object (&node);
4312 vat_json_object_add_string_copy (&node, "status", status);
4313
4314 vec_free (status);
4315
4316 vat_json_print (vam->ofp, &node);
4317 vat_json_free (&node);
4318
4319 vam->retval = ntohl (mp->retval);
4320 vam->result_ready = 1;
4321}
4322
4323static void
Filip Tehlar67a99f82017-03-10 13:18:02 +01004324 vl_api_show_one_use_petr_reply_t_handler
4325 (vl_api_show_one_use_petr_reply_t * mp)
4326{
4327 vat_main_t *vam = &vat_main;
4328 i32 retval = ntohl (mp->retval);
4329
4330 if (0 <= retval)
4331 {
4332 print (vam->ofp, "%s\n", mp->status ? "enabled" : "disabled");
4333 if (mp->status)
4334 {
4335 print (vam->ofp, "Proxy-ETR address; %U",
4336 mp->is_ip4 ? format_ip4_address : format_ip6_address,
4337 mp->address);
4338 }
4339 }
4340
4341 vam->retval = retval;
4342 vam->result_ready = 1;
4343}
4344
4345static void
4346 vl_api_show_one_use_petr_reply_t_handler_json
4347 (vl_api_show_one_use_petr_reply_t * mp)
4348{
4349 vat_main_t *vam = &vat_main;
4350 vat_json_node_t node;
4351 u8 *status = 0;
4352 struct in_addr ip4;
4353 struct in6_addr ip6;
4354
4355 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4356 vec_add1 (status, 0);
4357
4358 vat_json_init_object (&node);
4359 vat_json_object_add_string_copy (&node, "status", status);
4360 if (mp->status)
4361 {
4362 if (mp->is_ip4)
4363 {
4364 clib_memcpy (&ip6, mp->address, sizeof (ip6));
4365 vat_json_object_add_ip6 (&node, "address", ip6);
4366 }
4367 else
4368 {
4369 clib_memcpy (&ip4, mp->address, sizeof (ip4));
4370 vat_json_object_add_ip4 (&node, "address", ip4);
4371 }
4372 }
4373
4374 vec_free (status);
4375
4376 vat_json_print (vam->ofp, &node);
4377 vat_json_free (&node);
4378
4379 vam->retval = ntohl (mp->retval);
4380 vam->result_ready = 1;
4381}
4382
4383static void
Filip Tehlaref2a5bf2017-05-30 07:14:46 +02004384 vl_api_show_one_nsh_mapping_reply_t_handler
4385 (vl_api_show_one_nsh_mapping_reply_t * mp)
4386{
4387 vat_main_t *vam = &vat_main;
4388 i32 retval = ntohl (mp->retval);
4389
4390 if (0 <= retval)
4391 {
4392 print (vam->ofp, "%-20s%-16s",
4393 mp->is_set ? "set" : "not-set",
4394 mp->is_set ? (char *) mp->locator_set_name : "");
4395 }
4396
4397 vam->retval = retval;
4398 vam->result_ready = 1;
4399}
4400
4401static void
4402 vl_api_show_one_nsh_mapping_reply_t_handler_json
4403 (vl_api_show_one_nsh_mapping_reply_t * mp)
4404{
4405 vat_main_t *vam = &vat_main;
4406 vat_json_node_t node;
4407 u8 *status = 0;
4408
4409 status = format (0, "%s", mp->is_set ? "yes" : "no");
4410 vec_add1 (status, 0);
4411
4412 vat_json_init_object (&node);
4413 vat_json_object_add_string_copy (&node, "is_set", status);
4414 if (mp->is_set)
4415 {
4416 vat_json_object_add_string_copy (&node, "locator_set",
4417 mp->locator_set_name);
4418 }
4419
4420 vec_free (status);
4421
4422 vat_json_print (vam->ofp, &node);
4423 vat_json_free (&node);
4424
4425 vam->retval = ntohl (mp->retval);
4426 vam->result_ready = 1;
4427}
4428
4429static void
Filip Tehlar1e553a02017-08-02 12:45:07 +02004430 vl_api_show_one_map_register_ttl_reply_t_handler
4431 (vl_api_show_one_map_register_ttl_reply_t * mp)
4432{
4433 vat_main_t *vam = &vat_main;
4434 i32 retval = ntohl (mp->retval);
4435
4436 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4437
4438 if (0 <= retval)
4439 {
4440 print (vam->ofp, "ttl: %u", mp->ttl);
4441 }
4442
4443 vam->retval = retval;
4444 vam->result_ready = 1;
4445}
4446
4447static void
4448 vl_api_show_one_map_register_ttl_reply_t_handler_json
4449 (vl_api_show_one_map_register_ttl_reply_t * mp)
4450{
4451 vat_main_t *vam = &vat_main;
4452 vat_json_node_t node;
4453
4454 vl_api_show_one_map_register_ttl_reply_t_endian (mp);
4455 vat_json_init_object (&node);
4456 vat_json_object_add_uint (&node, "ttl", mp->ttl);
4457
4458 vat_json_print (vam->ofp, &node);
4459 vat_json_free (&node);
4460
4461 vam->retval = ntohl (mp->retval);
4462 vam->result_ready = 1;
4463}
4464
4465static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004466vl_api_show_one_pitr_reply_t_handler (vl_api_show_one_pitr_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004467{
4468 vat_main_t *vam = &vat_main;
4469 i32 retval = ntohl (mp->retval);
4470
4471 if (0 <= retval)
4472 {
4473 print (vam->ofp, "%-20s%-16s",
4474 mp->status ? "enabled" : "disabled",
4475 mp->status ? (char *) mp->locator_set_name : "");
4476 }
4477
4478 vam->retval = retval;
4479 vam->result_ready = 1;
4480}
4481
4482static void
Filip Tehlar694396d2017-02-17 14:29:11 +01004483vl_api_show_one_pitr_reply_t_handler_json (vl_api_show_one_pitr_reply_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01004484{
4485 vat_main_t *vam = &vat_main;
4486 vat_json_node_t node;
4487 u8 *status = 0;
4488
4489 status = format (0, "%s", mp->status ? "enabled" : "disabled");
4490 vec_add1 (status, 0);
4491
4492 vat_json_init_object (&node);
4493 vat_json_object_add_string_copy (&node, "status", status);
4494 if (mp->status)
4495 {
4496 vat_json_object_add_string_copy (&node, "locator_set",
4497 mp->locator_set_name);
4498 }
4499
4500 vec_free (status);
4501
4502 vat_json_print (vam->ofp, &node);
4503 vat_json_free (&node);
4504
4505 vam->retval = ntohl (mp->retval);
4506 vam->result_ready = 1;
4507}
4508
4509static u8 *
4510format_policer_type (u8 * s, va_list * va)
4511{
4512 u32 i = va_arg (*va, u32);
4513
4514 if (i == SSE2_QOS_POLICER_TYPE_1R2C)
4515 s = format (s, "1r2c");
4516 else if (i == SSE2_QOS_POLICER_TYPE_1R3C_RFC_2697)
4517 s = format (s, "1r3c");
4518 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_2698)
4519 s = format (s, "2r3c-2698");
4520 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_4115)
4521 s = format (s, "2r3c-4115");
4522 else if (i == SSE2_QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1)
4523 s = format (s, "2r3c-mef5cf1");
4524 else
4525 s = format (s, "ILLEGAL");
4526 return s;
4527}
4528
4529static u8 *
4530format_policer_rate_type (u8 * s, va_list * va)
4531{
4532 u32 i = va_arg (*va, u32);
4533
4534 if (i == SSE2_QOS_RATE_KBPS)
4535 s = format (s, "kbps");
4536 else if (i == SSE2_QOS_RATE_PPS)
4537 s = format (s, "pps");
4538 else
4539 s = format (s, "ILLEGAL");
4540 return s;
4541}
4542
4543static u8 *
4544format_policer_round_type (u8 * s, va_list * va)
4545{
4546 u32 i = va_arg (*va, u32);
4547
4548 if (i == SSE2_QOS_ROUND_TO_CLOSEST)
4549 s = format (s, "closest");
4550 else if (i == SSE2_QOS_ROUND_TO_UP)
4551 s = format (s, "up");
4552 else if (i == SSE2_QOS_ROUND_TO_DOWN)
4553 s = format (s, "down");
4554 else
4555 s = format (s, "ILLEGAL");
4556 return s;
4557}
4558
4559static u8 *
4560format_policer_action_type (u8 * s, va_list * va)
4561{
4562 u32 i = va_arg (*va, u32);
4563
4564 if (i == SSE2_QOS_ACTION_DROP)
4565 s = format (s, "drop");
4566 else if (i == SSE2_QOS_ACTION_TRANSMIT)
4567 s = format (s, "transmit");
4568 else if (i == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4569 s = format (s, "mark-and-transmit");
4570 else
4571 s = format (s, "ILLEGAL");
4572 return s;
4573}
4574
4575static u8 *
4576format_dscp (u8 * s, va_list * va)
4577{
4578 u32 i = va_arg (*va, u32);
4579 char *t = 0;
4580
4581 switch (i)
4582 {
4583#define _(v,f,str) case VNET_DSCP_##f: t = str; break;
4584 foreach_vnet_dscp
4585#undef _
4586 default:
4587 return format (s, "ILLEGAL");
4588 }
4589 s = format (s, "%s", t);
4590 return s;
4591}
4592
4593static void
4594vl_api_policer_details_t_handler (vl_api_policer_details_t * mp)
4595{
4596 vat_main_t *vam = &vat_main;
4597 u8 *conform_dscp_str, *exceed_dscp_str, *violate_dscp_str;
4598
4599 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4600 conform_dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4601 else
4602 conform_dscp_str = format (0, "");
4603
4604 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4605 exceed_dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4606 else
4607 exceed_dscp_str = format (0, "");
4608
4609 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4610 violate_dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4611 else
4612 violate_dscp_str = format (0, "");
4613
4614 print (vam->ofp, "Name \"%s\", type %U, cir %u, eir %u, cb %u, eb %u, "
4615 "rate type %U, round type %U, %s rate, %s color-aware, "
4616 "cir %u tok/period, pir %u tok/period, scale %u, cur lim %u, "
4617 "cur bkt %u, ext lim %u, ext bkt %u, last update %llu"
4618 "conform action %U%s, exceed action %U%s, violate action %U%s",
4619 mp->name,
4620 format_policer_type, mp->type,
4621 ntohl (mp->cir),
4622 ntohl (mp->eir),
4623 clib_net_to_host_u64 (mp->cb),
4624 clib_net_to_host_u64 (mp->eb),
4625 format_policer_rate_type, mp->rate_type,
4626 format_policer_round_type, mp->round_type,
4627 mp->single_rate ? "single" : "dual",
4628 mp->color_aware ? "is" : "not",
4629 ntohl (mp->cir_tokens_per_period),
4630 ntohl (mp->pir_tokens_per_period),
4631 ntohl (mp->scale),
4632 ntohl (mp->current_limit),
4633 ntohl (mp->current_bucket),
4634 ntohl (mp->extended_limit),
4635 ntohl (mp->extended_bucket),
4636 clib_net_to_host_u64 (mp->last_update_time),
4637 format_policer_action_type, mp->conform_action_type,
4638 conform_dscp_str,
4639 format_policer_action_type, mp->exceed_action_type,
4640 exceed_dscp_str,
4641 format_policer_action_type, mp->violate_action_type,
4642 violate_dscp_str);
4643
4644 vec_free (conform_dscp_str);
4645 vec_free (exceed_dscp_str);
4646 vec_free (violate_dscp_str);
4647}
4648
4649static void vl_api_policer_details_t_handler_json
4650 (vl_api_policer_details_t * mp)
4651{
4652 vat_main_t *vam = &vat_main;
4653 vat_json_node_t *node;
4654 u8 *rate_type_str, *round_type_str, *type_str;
4655 u8 *conform_action_str, *exceed_action_str, *violate_action_str;
4656
4657 rate_type_str = format (0, "%U", format_policer_rate_type, mp->rate_type);
4658 round_type_str =
4659 format (0, "%U", format_policer_round_type, mp->round_type);
4660 type_str = format (0, "%U", format_policer_type, mp->type);
4661 conform_action_str = format (0, "%U", format_policer_action_type,
4662 mp->conform_action_type);
4663 exceed_action_str = format (0, "%U", format_policer_action_type,
4664 mp->exceed_action_type);
4665 violate_action_str = format (0, "%U", format_policer_action_type,
4666 mp->violate_action_type);
4667
4668 if (VAT_JSON_ARRAY != vam->json_tree.type)
4669 {
4670 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4671 vat_json_init_array (&vam->json_tree);
4672 }
4673 node = vat_json_array_add (&vam->json_tree);
4674
4675 vat_json_init_object (node);
4676 vat_json_object_add_string_copy (node, "name", mp->name);
4677 vat_json_object_add_uint (node, "cir", ntohl (mp->cir));
4678 vat_json_object_add_uint (node, "eir", ntohl (mp->eir));
Marek Gradzki59ed4902017-03-21 11:51:54 +01004679 vat_json_object_add_uint (node, "cb", clib_net_to_host_u64 (mp->cb));
4680 vat_json_object_add_uint (node, "eb", clib_net_to_host_u64 (mp->eb));
Damjan Marion7cd468a2016-12-19 23:05:39 +01004681 vat_json_object_add_string_copy (node, "rate_type", rate_type_str);
4682 vat_json_object_add_string_copy (node, "round_type", round_type_str);
4683 vat_json_object_add_string_copy (node, "type", type_str);
4684 vat_json_object_add_uint (node, "single_rate", mp->single_rate);
4685 vat_json_object_add_uint (node, "color_aware", mp->color_aware);
4686 vat_json_object_add_uint (node, "scale", ntohl (mp->scale));
4687 vat_json_object_add_uint (node, "cir_tokens_per_period",
4688 ntohl (mp->cir_tokens_per_period));
4689 vat_json_object_add_uint (node, "eir_tokens_per_period",
4690 ntohl (mp->pir_tokens_per_period));
4691 vat_json_object_add_uint (node, "current_limit", ntohl (mp->current_limit));
4692 vat_json_object_add_uint (node, "current_bucket",
4693 ntohl (mp->current_bucket));
4694 vat_json_object_add_uint (node, "extended_limit",
4695 ntohl (mp->extended_limit));
4696 vat_json_object_add_uint (node, "extended_bucket",
4697 ntohl (mp->extended_bucket));
4698 vat_json_object_add_uint (node, "last_update_time",
4699 ntohl (mp->last_update_time));
4700 vat_json_object_add_string_copy (node, "conform_action",
4701 conform_action_str);
4702 if (mp->conform_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4703 {
4704 u8 *dscp_str = format (0, "%U", format_dscp, mp->conform_dscp);
4705 vat_json_object_add_string_copy (node, "conform_dscp", dscp_str);
4706 vec_free (dscp_str);
4707 }
4708 vat_json_object_add_string_copy (node, "exceed_action", exceed_action_str);
4709 if (mp->exceed_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4710 {
4711 u8 *dscp_str = format (0, "%U", format_dscp, mp->exceed_dscp);
4712 vat_json_object_add_string_copy (node, "exceed_dscp", dscp_str);
4713 vec_free (dscp_str);
4714 }
4715 vat_json_object_add_string_copy (node, "violate_action",
4716 violate_action_str);
4717 if (mp->violate_action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
4718 {
4719 u8 *dscp_str = format (0, "%U", format_dscp, mp->violate_dscp);
4720 vat_json_object_add_string_copy (node, "violate_dscp", dscp_str);
4721 vec_free (dscp_str);
4722 }
4723
4724 vec_free (rate_type_str);
4725 vec_free (round_type_str);
4726 vec_free (type_str);
4727 vec_free (conform_action_str);
4728 vec_free (exceed_action_str);
4729 vec_free (violate_action_str);
4730}
4731
4732static void
4733vl_api_classify_table_ids_reply_t_handler (vl_api_classify_table_ids_reply_t *
4734 mp)
4735{
4736 vat_main_t *vam = &vat_main;
4737 int i, count = ntohl (mp->count);
4738
4739 if (count > 0)
4740 print (vam->ofp, "classify table ids (%d) : ", count);
4741 for (i = 0; i < count; i++)
4742 {
4743 print (vam->ofp, "%d", ntohl (mp->ids[i]));
4744 print (vam->ofp, (i < count - 1) ? "," : "");
4745 }
4746 vam->retval = ntohl (mp->retval);
4747 vam->result_ready = 1;
4748}
4749
4750static void
4751 vl_api_classify_table_ids_reply_t_handler_json
4752 (vl_api_classify_table_ids_reply_t * mp)
4753{
4754 vat_main_t *vam = &vat_main;
4755 int i, count = ntohl (mp->count);
4756
4757 if (count > 0)
4758 {
4759 vat_json_node_t node;
4760
4761 vat_json_init_object (&node);
4762 for (i = 0; i < count; i++)
4763 {
4764 vat_json_object_add_uint (&node, "table_id", ntohl (mp->ids[i]));
4765 }
4766 vat_json_print (vam->ofp, &node);
4767 vat_json_free (&node);
4768 }
4769 vam->retval = ntohl (mp->retval);
4770 vam->result_ready = 1;
4771}
4772
4773static void
4774 vl_api_classify_table_by_interface_reply_t_handler
4775 (vl_api_classify_table_by_interface_reply_t * mp)
4776{
4777 vat_main_t *vam = &vat_main;
4778 u32 table_id;
4779
4780 table_id = ntohl (mp->l2_table_id);
4781 if (table_id != ~0)
4782 print (vam->ofp, "l2 table id : %d", table_id);
4783 else
4784 print (vam->ofp, "l2 table id : No input ACL tables configured");
4785 table_id = ntohl (mp->ip4_table_id);
4786 if (table_id != ~0)
4787 print (vam->ofp, "ip4 table id : %d", table_id);
4788 else
4789 print (vam->ofp, "ip4 table id : No input ACL tables configured");
4790 table_id = ntohl (mp->ip6_table_id);
4791 if (table_id != ~0)
4792 print (vam->ofp, "ip6 table id : %d", table_id);
4793 else
4794 print (vam->ofp, "ip6 table id : No input ACL tables configured");
4795 vam->retval = ntohl (mp->retval);
4796 vam->result_ready = 1;
4797}
4798
4799static void
4800 vl_api_classify_table_by_interface_reply_t_handler_json
4801 (vl_api_classify_table_by_interface_reply_t * mp)
4802{
4803 vat_main_t *vam = &vat_main;
4804 vat_json_node_t node;
4805
4806 vat_json_init_object (&node);
4807
4808 vat_json_object_add_int (&node, "l2_table_id", ntohl (mp->l2_table_id));
4809 vat_json_object_add_int (&node, "ip4_table_id", ntohl (mp->ip4_table_id));
4810 vat_json_object_add_int (&node, "ip6_table_id", ntohl (mp->ip6_table_id));
4811
4812 vat_json_print (vam->ofp, &node);
4813 vat_json_free (&node);
4814
4815 vam->retval = ntohl (mp->retval);
4816 vam->result_ready = 1;
4817}
4818
4819static void vl_api_policer_add_del_reply_t_handler
4820 (vl_api_policer_add_del_reply_t * mp)
4821{
4822 vat_main_t *vam = &vat_main;
4823 i32 retval = ntohl (mp->retval);
4824 if (vam->async_mode)
4825 {
4826 vam->async_errors += (retval < 0);
4827 }
4828 else
4829 {
4830 vam->retval = retval;
4831 vam->result_ready = 1;
4832 if (retval == 0 && mp->policer_index != 0xFFFFFFFF)
4833 /*
4834 * Note: this is just barely thread-safe, depends on
4835 * the main thread spinning waiting for an answer...
4836 */
4837 errmsg ("policer index %d", ntohl (mp->policer_index));
4838 }
4839}
4840
4841static void vl_api_policer_add_del_reply_t_handler_json
4842 (vl_api_policer_add_del_reply_t * mp)
4843{
4844 vat_main_t *vam = &vat_main;
4845 vat_json_node_t node;
4846
4847 vat_json_init_object (&node);
4848 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
4849 vat_json_object_add_uint (&node, "policer_index",
4850 ntohl (mp->policer_index));
4851
4852 vat_json_print (vam->ofp, &node);
4853 vat_json_free (&node);
4854
4855 vam->retval = ntohl (mp->retval);
4856 vam->result_ready = 1;
4857}
4858
4859/* Format hex dump. */
4860u8 *
4861format_hex_bytes (u8 * s, va_list * va)
4862{
4863 u8 *bytes = va_arg (*va, u8 *);
4864 int n_bytes = va_arg (*va, int);
4865 uword i;
4866
4867 /* Print short or long form depending on byte count. */
4868 uword short_form = n_bytes <= 32;
Christophe Fontained3c008d2017-10-02 18:10:54 +02004869 u32 indent = format_get_indent (s);
Damjan Marion7cd468a2016-12-19 23:05:39 +01004870
4871 if (n_bytes == 0)
4872 return s;
4873
4874 for (i = 0; i < n_bytes; i++)
4875 {
4876 if (!short_form && (i % 32) == 0)
4877 s = format (s, "%08x: ", i);
4878 s = format (s, "%02x", bytes[i]);
4879 if (!short_form && ((i + 1) % 32) == 0 && (i + 1) < n_bytes)
4880 s = format (s, "\n%U", format_white_space, indent);
4881 }
4882
4883 return s;
4884}
4885
4886static void
4887vl_api_classify_table_info_reply_t_handler (vl_api_classify_table_info_reply_t
4888 * mp)
4889{
4890 vat_main_t *vam = &vat_main;
4891 i32 retval = ntohl (mp->retval);
4892 if (retval == 0)
4893 {
4894 print (vam->ofp, "classify table info :");
4895 print (vam->ofp, "sessions: %d nexttbl: %d nextnode: %d",
4896 ntohl (mp->active_sessions), ntohl (mp->next_table_index),
4897 ntohl (mp->miss_next_index));
4898 print (vam->ofp, "nbuckets: %d skip: %d match: %d",
4899 ntohl (mp->nbuckets), ntohl (mp->skip_n_vectors),
4900 ntohl (mp->match_n_vectors));
4901 print (vam->ofp, "mask: %U", format_hex_bytes, mp->mask,
4902 ntohl (mp->mask_length));
4903 }
4904 vam->retval = retval;
4905 vam->result_ready = 1;
4906}
4907
4908static void
4909 vl_api_classify_table_info_reply_t_handler_json
4910 (vl_api_classify_table_info_reply_t * mp)
4911{
4912 vat_main_t *vam = &vat_main;
4913 vat_json_node_t node;
4914
4915 i32 retval = ntohl (mp->retval);
4916 if (retval == 0)
4917 {
4918 vat_json_init_object (&node);
4919
4920 vat_json_object_add_int (&node, "sessions",
4921 ntohl (mp->active_sessions));
4922 vat_json_object_add_int (&node, "nexttbl",
4923 ntohl (mp->next_table_index));
4924 vat_json_object_add_int (&node, "nextnode",
4925 ntohl (mp->miss_next_index));
4926 vat_json_object_add_int (&node, "nbuckets", ntohl (mp->nbuckets));
4927 vat_json_object_add_int (&node, "skip", ntohl (mp->skip_n_vectors));
4928 vat_json_object_add_int (&node, "match", ntohl (mp->match_n_vectors));
4929 u8 *s = format (0, "%U%c", format_hex_bytes, mp->mask,
4930 ntohl (mp->mask_length), 0);
4931 vat_json_object_add_string_copy (&node, "mask", s);
4932
4933 vat_json_print (vam->ofp, &node);
4934 vat_json_free (&node);
4935 }
4936 vam->retval = ntohl (mp->retval);
4937 vam->result_ready = 1;
4938}
4939
4940static void
4941vl_api_classify_session_details_t_handler (vl_api_classify_session_details_t *
4942 mp)
4943{
4944 vat_main_t *vam = &vat_main;
4945
4946 print (vam->ofp, "next_index: %d advance: %d opaque: %d ",
4947 ntohl (mp->hit_next_index), ntohl (mp->advance),
4948 ntohl (mp->opaque_index));
4949 print (vam->ofp, "mask: %U", format_hex_bytes, mp->match,
4950 ntohl (mp->match_length));
4951}
4952
4953static void
4954 vl_api_classify_session_details_t_handler_json
4955 (vl_api_classify_session_details_t * mp)
4956{
4957 vat_main_t *vam = &vat_main;
4958 vat_json_node_t *node = NULL;
4959
4960 if (VAT_JSON_ARRAY != vam->json_tree.type)
4961 {
4962 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
4963 vat_json_init_array (&vam->json_tree);
4964 }
4965 node = vat_json_array_add (&vam->json_tree);
4966
4967 vat_json_init_object (node);
4968 vat_json_object_add_int (node, "next_index", ntohl (mp->hit_next_index));
4969 vat_json_object_add_int (node, "advance", ntohl (mp->advance));
4970 vat_json_object_add_int (node, "opaque", ntohl (mp->opaque_index));
4971 u8 *s =
4972 format (0, "%U%c", format_hex_bytes, mp->match, ntohl (mp->match_length),
4973 0);
4974 vat_json_object_add_string_copy (node, "match", s);
4975}
4976
4977static void vl_api_pg_create_interface_reply_t_handler
4978 (vl_api_pg_create_interface_reply_t * mp)
4979{
4980 vat_main_t *vam = &vat_main;
4981
4982 vam->retval = ntohl (mp->retval);
4983 vam->result_ready = 1;
4984}
4985
4986static void vl_api_pg_create_interface_reply_t_handler_json
4987 (vl_api_pg_create_interface_reply_t * mp)
4988{
4989 vat_main_t *vam = &vat_main;
4990 vat_json_node_t node;
4991
4992 i32 retval = ntohl (mp->retval);
4993 if (retval == 0)
4994 {
4995 vat_json_init_object (&node);
4996
4997 vat_json_object_add_int (&node, "sw_if_index", ntohl (mp->sw_if_index));
4998
4999 vat_json_print (vam->ofp, &node);
5000 vat_json_free (&node);
5001 }
5002 vam->retval = ntohl (mp->retval);
5003 vam->result_ready = 1;
5004}
5005
5006static void vl_api_policer_classify_details_t_handler
5007 (vl_api_policer_classify_details_t * mp)
5008{
5009 vat_main_t *vam = &vat_main;
5010
5011 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5012 ntohl (mp->table_index));
5013}
5014
5015static void vl_api_policer_classify_details_t_handler_json
5016 (vl_api_policer_classify_details_t * mp)
5017{
5018 vat_main_t *vam = &vat_main;
5019 vat_json_node_t *node;
5020
5021 if (VAT_JSON_ARRAY != vam->json_tree.type)
5022 {
5023 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5024 vat_json_init_array (&vam->json_tree);
5025 }
5026 node = vat_json_array_add (&vam->json_tree);
5027
5028 vat_json_init_object (node);
5029 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5030 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5031}
5032
5033static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler
5034 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5035{
5036 vat_main_t *vam = &vat_main;
5037 i32 retval = ntohl (mp->retval);
5038 if (vam->async_mode)
5039 {
5040 vam->async_errors += (retval < 0);
5041 }
5042 else
5043 {
5044 vam->retval = retval;
5045 vam->sw_if_index = ntohl (mp->sw_if_index);
5046 vam->result_ready = 1;
5047 }
Dave Barachf72212e2018-01-11 10:25:07 -05005048 vam->regenerate_interface_table = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005049}
5050
5051static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json
5052 (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp)
5053{
5054 vat_main_t *vam = &vat_main;
5055 vat_json_node_t node;
5056
5057 vat_json_init_object (&node);
5058 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
5059 vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
5060
5061 vat_json_print (vam->ofp, &node);
5062 vat_json_free (&node);
5063
5064 vam->retval = ntohl (mp->retval);
5065 vam->result_ready = 1;
5066}
5067
5068static void vl_api_flow_classify_details_t_handler
5069 (vl_api_flow_classify_details_t * mp)
5070{
5071 vat_main_t *vam = &vat_main;
5072
5073 print (vam->ofp, "%10d%20d", ntohl (mp->sw_if_index),
5074 ntohl (mp->table_index));
5075}
5076
5077static void vl_api_flow_classify_details_t_handler_json
5078 (vl_api_flow_classify_details_t * mp)
5079{
5080 vat_main_t *vam = &vat_main;
5081 vat_json_node_t *node;
5082
5083 if (VAT_JSON_ARRAY != vam->json_tree.type)
5084 {
5085 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
5086 vat_json_init_array (&vam->json_tree);
5087 }
5088 node = vat_json_array_add (&vam->json_tree);
5089
5090 vat_json_init_object (node);
5091 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
5092 vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index));
5093}
5094
Filip Tehlar694396d2017-02-17 14:29:11 +01005095#define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler
5096#define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler
Filip Tehlard5a65db2017-05-17 17:21:10 +02005097#define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler
5098#define vl_api_one_l2_arp_entries_get_reply_t_endian vl_noop_handler
5099#define vl_api_one_l2_arp_entries_get_reply_t_print vl_noop_handler
5100#define vl_api_one_l2_arp_bd_get_reply_t_endian vl_noop_handler
Filip Tehlar05879992017-09-05 15:46:09 +02005101#define vl_api_one_ndp_bd_get_reply_t_endian vl_noop_handler
5102#define vl_api_one_ndp_bd_get_reply_t_print vl_noop_handler
5103#define vl_api_one_ndp_entries_get_reply_t_print vl_noop_handler
5104#define vl_api_one_ndp_entries_get_reply_t_endian vl_noop_handler
Damjan Marion7cd468a2016-12-19 23:05:39 +01005105
5106/*
5107 * Generate boilerplate reply handlers, which
5108 * dig the return value out of the xxx_reply_t API message,
5109 * stick it into vam->retval, and set vam->result_ready
5110 *
5111 * Could also do this by pointing N message decode slots at
5112 * a single function, but that could break in subtle ways.
5113 */
5114
5115#define foreach_standard_reply_retval_handler \
5116_(sw_interface_set_flags_reply) \
5117_(sw_interface_add_del_address_reply) \
Stevenad8015b2017-10-29 22:10:46 -07005118_(sw_interface_set_rx_mode_reply) \
Mohsin Kazmi54f7c512018-08-23 18:28:11 +02005119_(sw_interface_set_rx_placement_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005120_(sw_interface_set_table_reply) \
5121_(sw_interface_set_mpls_enable_reply) \
5122_(sw_interface_set_vpath_reply) \
5123_(sw_interface_set_vxlan_bypass_reply) \
Marco Varleseb598f1d2017-09-19 14:25:28 +02005124_(sw_interface_set_geneve_bypass_reply) \
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +08005125_(sw_interface_set_vxlan_gpe_bypass_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005126_(sw_interface_set_l2_bridge_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005127_(bridge_domain_add_del_reply) \
5128_(sw_interface_set_l2_xconnect_reply) \
5129_(l2fib_add_del_reply) \
Eyal Barif24991c2017-04-05 05:33:21 +03005130_(l2fib_flush_int_reply) \
5131_(l2fib_flush_bd_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005132_(ip_add_del_route_reply) \
Neale Ranns28ab9cc2017-08-14 07:18:42 -07005133_(ip_table_add_del_reply) \
Neale Ranns32e1c012016-11-22 17:07:28 +00005134_(ip_mroute_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005135_(mpls_route_add_del_reply) \
Neale Ranns28ab9cc2017-08-14 07:18:42 -07005136_(mpls_table_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005137_(mpls_ip_bind_unbind_reply) \
Neale Rannsd792d9c2017-10-21 10:53:20 -07005138_(bier_route_add_del_reply) \
5139_(bier_table_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005140_(proxy_arp_add_del_reply) \
5141_(proxy_arp_intfc_enable_disable_reply) \
5142_(sw_interface_set_unnumbered_reply) \
5143_(ip_neighbor_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005144_(oam_add_del_reply) \
5145_(reset_fib_reply) \
5146_(dhcp_proxy_config_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005147_(dhcp_proxy_set_vss_reply) \
5148_(dhcp_client_config_reply) \
5149_(set_ip_flow_hash_reply) \
5150_(sw_interface_ip6_enable_disable_reply) \
Neale Ranns3f844d02017-02-18 00:03:54 -08005151_(ip6nd_proxy_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005152_(sw_interface_ip6nd_ra_prefix_reply) \
5153_(sw_interface_ip6nd_ra_config_reply) \
5154_(set_arp_neighbor_limit_reply) \
5155_(l2_patch_add_del_reply) \
John Loe166fd92018-09-13 14:08:59 -04005156_(sr_mpls_policy_add_reply) \
5157_(sr_mpls_policy_mod_reply) \
5158_(sr_mpls_policy_del_reply) \
Pablo Camarillofb380952016-12-07 18:34:18 +01005159_(sr_policy_add_reply) \
5160_(sr_policy_mod_reply) \
5161_(sr_policy_del_reply) \
5162_(sr_localsid_add_del_reply) \
5163_(sr_steering_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005164_(classify_add_del_session_reply) \
5165_(classify_set_interface_ip_table_reply) \
5166_(classify_set_interface_l2_tables_reply) \
5167_(l2tpv3_set_tunnel_cookies_reply) \
5168_(l2tpv3_interface_enable_disable_reply) \
5169_(l2tpv3_set_lookup_key_reply) \
5170_(l2_fib_clear_table_reply) \
5171_(l2_interface_efp_filter_reply) \
5172_(l2_interface_vlan_tag_rewrite_reply) \
5173_(modify_vhost_user_if_reply) \
5174_(delete_vhost_user_if_reply) \
John Loc7b43042018-04-13 16:46:22 -04005175_(ip_probe_neighbor_reply) \
John Lo7f358b32018-04-28 01:19:24 -04005176_(ip_scan_neighbor_enable_disable_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005177_(want_ip4_arp_events_reply) \
5178_(want_ip6_nd_events_reply) \
John Lo8d00fff2017-08-03 00:35:36 -04005179_(want_l2_macs_events_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005180_(input_acl_set_interface_reply) \
5181_(ipsec_spd_add_del_reply) \
5182_(ipsec_interface_add_del_spd_reply) \
Neale Ranns17dcec02019-01-09 21:22:20 -08005183_(ipsec_spd_entry_add_del_reply) \
5184_(ipsec_sad_entry_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005185_(ipsec_sa_set_key_reply) \
Matthew Smithb0972cb2017-05-02 16:20:41 -05005186_(ipsec_tunnel_if_add_del_reply) \
Matthew Smith75d85602017-10-05 19:03:05 -05005187_(ipsec_tunnel_if_set_key_reply) \
Matthew Smithca514fd2017-10-12 12:06:59 -05005188_(ipsec_tunnel_if_set_sa_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005189_(delete_loopback_reply) \
5190_(bd_ip_mac_add_del_reply) \
John Loe26c81f2019-01-07 15:16:33 -05005191_(bd_ip_mac_flush_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005192_(want_interface_events_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005193_(cop_interface_enable_disable_reply) \
5194_(cop_whitelist_enable_disable_reply) \
5195_(sw_interface_clear_stats_reply) \
Dave Barach65457162017-10-10 17:53:14 -04005196_(ioam_enable_reply) \
5197_(ioam_disable_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005198_(one_add_del_locator_reply) \
5199_(one_add_del_local_eid_reply) \
5200_(one_add_del_remote_mapping_reply) \
5201_(one_add_del_adjacency_reply) \
5202_(one_add_del_map_resolver_reply) \
5203_(one_add_del_map_server_reply) \
5204_(one_enable_disable_reply) \
5205_(one_rloc_probe_enable_disable_reply) \
5206_(one_map_register_enable_disable_reply) \
Filip Tehlar1e553a02017-08-02 12:45:07 +02005207_(one_map_register_set_ttl_reply) \
Filip Tehlara4980b82017-09-27 14:32:02 +02005208_(one_set_transport_protocol_reply) \
Filip Tehlar7048ff12017-07-27 08:09:14 +02005209_(one_map_register_fallback_threshold_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005210_(one_pitr_set_locator_set_reply) \
5211_(one_map_request_mode_reply) \
5212_(one_add_del_map_request_itr_rlocs_reply) \
5213_(one_eid_table_add_del_map_reply) \
Filip Tehlar67a99f82017-03-10 13:18:02 +01005214_(one_use_petr_reply) \
Filip Tehlar4868ff62017-03-09 16:48:39 +01005215_(one_stats_enable_disable_reply) \
Filip Tehlard5a65db2017-05-17 17:21:10 +02005216_(one_add_del_l2_arp_entry_reply) \
Filip Tehlar05879992017-09-05 15:46:09 +02005217_(one_add_del_ndp_entry_reply) \
Filip Tehlar21511912017-04-07 10:41:42 +02005218_(one_stats_flush_reply) \
Filip Tehlar0a8840d2017-10-16 05:48:23 -07005219_(one_enable_disable_xtr_mode_reply) \
5220_(one_enable_disable_pitr_mode_reply) \
5221_(one_enable_disable_petr_mode_reply) \
Filip Tehlar82786c42017-02-20 15:20:37 +01005222_(gpe_enable_disable_reply) \
Filip Tehlar3e7b56932017-02-21 18:28:34 +01005223_(gpe_set_encap_mode_reply) \
Filip Tehlar82786c42017-02-20 15:20:37 +01005224_(gpe_add_del_iface_reply) \
Filip Tehlarb4243aa2017-06-14 14:39:42 +02005225_(gpe_add_del_native_fwd_rpath_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005226_(af_packet_delete_reply) \
5227_(policer_classify_set_interface_reply) \
5228_(netmap_create_reply) \
5229_(netmap_delete_reply) \
5230_(set_ipfix_exporter_reply) \
5231_(set_ipfix_classify_stream_reply) \
5232_(ipfix_classify_table_add_del_reply) \
5233_(flow_classify_set_interface_reply) \
5234_(sw_interface_span_enable_disable_reply) \
5235_(pg_capture_reply) \
5236_(pg_enable_disable_reply) \
5237_(ip_source_and_port_range_check_add_del_reply) \
5238_(ip_source_and_port_range_check_interface_add_del_reply)\
5239_(delete_subif_reply) \
5240_(l2_interface_pbb_tag_rewrite_reply) \
Pavel Kotuceke88865d2018-11-28 07:42:11 +01005241_(set_punt_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005242_(feature_enable_disable_reply) \
5243_(sw_interface_tag_add_del_reply) \
Ole Troand7231612018-06-07 10:17:57 +02005244_(hw_interface_set_mtu_reply) \
Pavel Kotucek6899a302017-06-08 08:46:10 +02005245_(p2p_ethernet_add_reply) \
Steve Shin99a0e602017-07-01 04:16:20 +00005246_(p2p_ethernet_del_reply) \
5247_(lldp_config_reply) \
Dave Barach3bbcfab2017-08-15 19:03:44 -04005248_(sw_interface_set_lldp_reply) \
Florin Corascea194d2017-10-02 00:18:51 -07005249_(tcp_configure_src_addresses_reply) \
Dave Barach65457162017-10-10 17:53:14 -04005250_(dns_enable_disable_reply) \
Florin Coras1c710452017-10-17 00:03:13 -07005251_(dns_name_server_add_del_reply) \
Florin Coras595992c2017-11-06 17:17:08 -08005252_(session_rule_add_del_reply) \
Andrew Yourtchenko815d7d52018-02-07 11:37:02 +01005253_(ip_container_proxy_add_del_reply) \
Igor Mikhailov (imichail)582caa32018-04-26 21:33:02 -07005254_(output_acl_set_interface_reply) \
5255_(qos_record_enable_disable_reply)
Damjan Marion7cd468a2016-12-19 23:05:39 +01005256
5257#define _(n) \
5258 static void vl_api_##n##_t_handler \
5259 (vl_api_##n##_t * mp) \
5260 { \
5261 vat_main_t * vam = &vat_main; \
5262 i32 retval = ntohl(mp->retval); \
5263 if (vam->async_mode) { \
5264 vam->async_errors += (retval < 0); \
5265 } else { \
5266 vam->retval = retval; \
5267 vam->result_ready = 1; \
5268 } \
5269 }
5270foreach_standard_reply_retval_handler;
5271#undef _
5272
5273#define _(n) \
5274 static void vl_api_##n##_t_handler_json \
5275 (vl_api_##n##_t * mp) \
5276 { \
5277 vat_main_t * vam = &vat_main; \
5278 vat_json_node_t node; \
5279 vat_json_init_object(&node); \
5280 vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); \
5281 vat_json_print(vam->ofp, &node); \
5282 vam->retval = ntohl(mp->retval); \
5283 vam->result_ready = 1; \
5284 }
5285foreach_standard_reply_retval_handler;
5286#undef _
5287
5288/*
5289 * Table of message reply handlers, must include boilerplate handlers
5290 * we just generated
5291 */
5292
5293#define foreach_vpe_api_reply_msg \
5294_(CREATE_LOOPBACK_REPLY, create_loopback_reply) \
Jon Loeligerc83c3b72017-02-23 13:57:35 -06005295_(CREATE_LOOPBACK_INSTANCE_REPLY, create_loopback_instance_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005296_(SW_INTERFACE_DETAILS, sw_interface_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005297_(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \
5298_(CONTROL_PING_REPLY, control_ping_reply) \
5299_(CLI_REPLY, cli_reply) \
5300_(CLI_INBAND_REPLY, cli_inband_reply) \
5301_(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \
5302 sw_interface_add_del_address_reply) \
Stevenad8015b2017-10-29 22:10:46 -07005303_(SW_INTERFACE_SET_RX_MODE_REPLY, sw_interface_set_rx_mode_reply) \
Mohsin Kazmi54f7c512018-08-23 18:28:11 +02005304_(SW_INTERFACE_SET_RX_PLACEMENT_REPLY, sw_interface_set_rx_placement_reply) \
Mohsin Kazmif0b42f42018-09-10 18:11:00 +02005305_(SW_INTERFACE_RX_PLACEMENT_DETAILS, sw_interface_rx_placement_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005306_(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
5307_(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
5308_(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
5309_(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
Marco Varleseb598f1d2017-09-19 14:25:28 +02005310_(SW_INTERFACE_SET_GENEVE_BYPASS_REPLY, sw_interface_set_geneve_bypass_reply) \
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +08005311_(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005312_(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
5313 sw_interface_set_l2_xconnect_reply) \
5314_(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
5315 sw_interface_set_l2_bridge_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005316_(BRIDGE_DOMAIN_ADD_DEL_REPLY, bridge_domain_add_del_reply) \
5317_(BRIDGE_DOMAIN_DETAILS, bridge_domain_details) \
Eyal Barifead6702017-04-04 04:46:32 +03005318_(BRIDGE_DOMAIN_SET_MAC_AGE_REPLY, bridge_domain_set_mac_age_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005319_(L2FIB_ADD_DEL_REPLY, l2fib_add_del_reply) \
Eyal Barif24991c2017-04-05 05:33:21 +03005320_(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \
5321_(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005322_(L2_FLAGS_REPLY, l2_flags_reply) \
5323_(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \
Damjan Marion8389fb92017-10-13 18:29:53 +02005324_(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \
5325_(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \
5326_(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \
Mohsin Kazmi03ae24b2019-01-18 11:50:00 +01005327_(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \
5328_(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \
5329_(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \
Steven9cd2d7a2017-12-20 12:43:01 -08005330_(BOND_CREATE_REPLY, bond_create_reply) \
5331_(BOND_DELETE_REPLY, bond_delete_reply) \
5332_(BOND_ENSLAVE_REPLY, bond_enslave_reply) \
5333_(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \
5334_(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \
5335_(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005336_(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \
Neale Ranns28ab9cc2017-08-14 07:18:42 -07005337_(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \
Neale Ranns32e1c012016-11-22 17:07:28 +00005338_(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \
Neale Ranns28ab9cc2017-08-14 07:18:42 -07005339_(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005340_(MPLS_ROUTE_ADD_DEL_REPLY, mpls_route_add_del_reply) \
5341_(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \
Neale Rannsd792d9c2017-10-21 10:53:20 -07005342_(BIER_ROUTE_ADD_DEL_REPLY, bier_route_add_del_reply) \
5343_(BIER_TABLE_ADD_DEL_REPLY, bier_table_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005344_(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
5345_(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \
5346 proxy_arp_intfc_enable_disable_reply) \
5347_(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \
5348_(SW_INTERFACE_SET_UNNUMBERED_REPLY, \
5349 sw_interface_set_unnumbered_reply) \
5350_(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005351_(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
5352_(CREATE_SUBIF_REPLY, create_subif_reply) \
5353_(OAM_ADD_DEL_REPLY, oam_add_del_reply) \
5354_(RESET_FIB_REPLY, reset_fib_reply) \
5355_(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005356_(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \
Neale Ranns20a175a2017-02-14 07:28:41 -08005357_(DHCP_PROXY_DETAILS, dhcp_proxy_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005358_(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \
5359_(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \
5360_(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \
5361 sw_interface_ip6_enable_disable_reply) \
Neale Ranns3f844d02017-02-18 00:03:54 -08005362_(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \
5363_(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005364_(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \
5365 sw_interface_ip6nd_ra_prefix_reply) \
5366_(SW_INTERFACE_IP6ND_RA_CONFIG_REPLY, \
5367 sw_interface_ip6nd_ra_config_reply) \
5368_(SET_ARP_NEIGHBOR_LIMIT_REPLY, set_arp_neighbor_limit_reply) \
5369_(L2_PATCH_ADD_DEL_REPLY, l2_patch_add_del_reply) \
John Loe166fd92018-09-13 14:08:59 -04005370_(SR_MPLS_POLICY_ADD_REPLY, sr_mpls_policy_add_reply) \
5371_(SR_MPLS_POLICY_MOD_REPLY, sr_mpls_policy_mod_reply) \
5372_(SR_MPLS_POLICY_DEL_REPLY, sr_mpls_policy_del_reply) \
Pablo Camarillofb380952016-12-07 18:34:18 +01005373_(SR_POLICY_ADD_REPLY, sr_policy_add_reply) \
5374_(SR_POLICY_MOD_REPLY, sr_policy_mod_reply) \
5375_(SR_POLICY_DEL_REPLY, sr_policy_del_reply) \
5376_(SR_LOCALSID_ADD_DEL_REPLY, sr_localsid_add_del_reply) \
5377_(SR_STEERING_ADD_DEL_REPLY, sr_steering_add_del_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005378_(CLASSIFY_ADD_DEL_TABLE_REPLY, classify_add_del_table_reply) \
5379_(CLASSIFY_ADD_DEL_SESSION_REPLY, classify_add_del_session_reply) \
5380_(CLASSIFY_SET_INTERFACE_IP_TABLE_REPLY, \
5381classify_set_interface_ip_table_reply) \
5382_(CLASSIFY_SET_INTERFACE_L2_TABLES_REPLY, \
5383 classify_set_interface_l2_tables_reply) \
5384_(GET_NODE_INDEX_REPLY, get_node_index_reply) \
5385_(ADD_NODE_NEXT_REPLY, add_node_next_reply) \
5386_(L2TPV3_CREATE_TUNNEL_REPLY, l2tpv3_create_tunnel_reply) \
5387_(L2TPV3_SET_TUNNEL_COOKIES_REPLY, l2tpv3_set_tunnel_cookies_reply) \
5388_(L2TPV3_INTERFACE_ENABLE_DISABLE_REPLY, \
5389 l2tpv3_interface_enable_disable_reply) \
5390_(L2TPV3_SET_LOOKUP_KEY_REPLY, l2tpv3_set_lookup_key_reply) \
5391_(SW_IF_L2TPV3_TUNNEL_DETAILS, sw_if_l2tpv3_tunnel_details) \
5392_(VXLAN_ADD_DEL_TUNNEL_REPLY, vxlan_add_del_tunnel_reply) \
eyal bariaf86a482018-04-17 11:20:27 +03005393_(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \
Marco Varleseb598f1d2017-09-19 14:25:28 +02005394_(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005395_(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \
Marco Varleseb598f1d2017-09-19 14:25:28 +02005396_(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005397_(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \
5398_(GRE_TUNNEL_DETAILS, gre_tunnel_details) \
5399_(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \
5400_(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \
5401_(L2_INTERFACE_VLAN_TAG_REWRITE_REPLY, l2_interface_vlan_tag_rewrite_reply) \
5402_(SW_INTERFACE_VHOST_USER_DETAILS, sw_interface_vhost_user_details) \
5403_(CREATE_VHOST_USER_IF_REPLY, create_vhost_user_if_reply) \
5404_(MODIFY_VHOST_USER_IF_REPLY, modify_vhost_user_if_reply) \
5405_(DELETE_VHOST_USER_IF_REPLY, delete_vhost_user_if_reply) \
5406_(SHOW_VERSION_REPLY, show_version_reply) \
Mohsin Kazmi5d64c782018-09-11 20:27:09 +02005407_(SHOW_THREADS_REPLY, show_threads_reply) \
Ole Troan01384fe2017-05-12 11:55:35 +02005408_(L2_FIB_TABLE_DETAILS, l2_fib_table_details) \
John Loc7b43042018-04-13 16:46:22 -04005409_(VXLAN_GPE_ADD_DEL_TUNNEL_REPLY, vxlan_gpe_add_del_tunnel_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005410_(VXLAN_GPE_TUNNEL_DETAILS, vxlan_gpe_tunnel_details) \
5411_(INTERFACE_NAME_RENUMBER_REPLY, interface_name_renumber_reply) \
John Loc7b43042018-04-13 16:46:22 -04005412_(IP_PROBE_NEIGHBOR_REPLY, ip_probe_neighbor_reply) \
John Lo7f358b32018-04-28 01:19:24 -04005413_(IP_SCAN_NEIGHBOR_ENABLE_DISABLE_REPLY, ip_scan_neighbor_enable_disable_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005414_(WANT_IP4_ARP_EVENTS_REPLY, want_ip4_arp_events_reply) \
5415_(IP4_ARP_EVENT, ip4_arp_event) \
5416_(WANT_IP6_ND_EVENTS_REPLY, want_ip6_nd_events_reply) \
5417_(IP6_ND_EVENT, ip6_nd_event) \
John Lo8d00fff2017-08-03 00:35:36 -04005418_(WANT_L2_MACS_EVENTS_REPLY, want_l2_macs_events_reply) \
5419_(L2_MACS_EVENT, l2_macs_event) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005420_(INPUT_ACL_SET_INTERFACE_REPLY, input_acl_set_interface_reply) \
5421_(IP_ADDRESS_DETAILS, ip_address_details) \
5422_(IP_DETAILS, ip_details) \
5423_(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \
5424_(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \
Neale Ranns17dcec02019-01-09 21:22:20 -08005425_(IPSEC_SPD_ENTRY_ADD_DEL_REPLY, ipsec_spd_entry_add_del_reply) \
5426_(IPSEC_SAD_ENTRY_ADD_DEL_REPLY, ipsec_sad_entry_add_del_reply) \
Matthew Smith28029532017-09-26 13:33:44 -05005427_(IPSEC_SA_DETAILS, ipsec_sa_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005428_(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \
Matthew Smithb0972cb2017-05-02 16:20:41 -05005429_(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \
Matthew Smith75d85602017-10-05 19:03:05 -05005430_(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \
Matthew Smithca514fd2017-10-12 12:06:59 -05005431_(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005432_(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \
5433_(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \
John Loe26c81f2019-01-07 15:16:33 -05005434_(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \
Mohsin Kazmi5d82d2f2018-08-13 19:17:54 +02005435_(BD_IP_MAC_DETAILS, bd_ip_mac_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005436_(DHCP_COMPL_EVENT, dhcp_compl_event) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005437_(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005438_(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \
5439_(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \
5440_(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \
5441_(GET_NODE_GRAPH_REPLY, get_node_graph_reply) \
5442_(SW_INTERFACE_CLEAR_STATS_REPLY, sw_interface_clear_stats_reply) \
5443_(IOAM_ENABLE_REPLY, ioam_enable_reply) \
5444_(IOAM_DISABLE_REPLY, ioam_disable_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005445_(ONE_ADD_DEL_LOCATOR_SET_REPLY, one_add_del_locator_set_reply) \
5446_(ONE_ADD_DEL_LOCATOR_REPLY, one_add_del_locator_reply) \
5447_(ONE_ADD_DEL_LOCAL_EID_REPLY, one_add_del_local_eid_reply) \
5448_(ONE_ADD_DEL_REMOTE_MAPPING_REPLY, one_add_del_remote_mapping_reply) \
5449_(ONE_ADD_DEL_ADJACENCY_REPLY, one_add_del_adjacency_reply) \
5450_(ONE_ADD_DEL_MAP_RESOLVER_REPLY, one_add_del_map_resolver_reply) \
5451_(ONE_ADD_DEL_MAP_SERVER_REPLY, one_add_del_map_server_reply) \
5452_(ONE_ENABLE_DISABLE_REPLY, one_enable_disable_reply) \
5453_(ONE_MAP_REGISTER_ENABLE_DISABLE_REPLY, \
5454 one_map_register_enable_disable_reply) \
Filip Tehlar1e553a02017-08-02 12:45:07 +02005455_(ONE_MAP_REGISTER_SET_TTL_REPLY, one_map_register_set_ttl_reply) \
Filip Tehlara4980b82017-09-27 14:32:02 +02005456_(ONE_SET_TRANSPORT_PROTOCOL_REPLY, one_set_transport_protocol_reply) \
5457_(ONE_GET_TRANSPORT_PROTOCOL_REPLY, one_get_transport_protocol_reply) \
Filip Tehlar7048ff12017-07-27 08:09:14 +02005458_(ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5459 one_map_register_fallback_threshold_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005460_(ONE_RLOC_PROBE_ENABLE_DISABLE_REPLY, \
5461 one_rloc_probe_enable_disable_reply) \
5462_(ONE_PITR_SET_LOCATOR_SET_REPLY, one_pitr_set_locator_set_reply) \
Filip Tehlar67a99f82017-03-10 13:18:02 +01005463_(ONE_USE_PETR_REPLY, one_use_petr_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005464_(ONE_MAP_REQUEST_MODE_REPLY, one_map_request_mode_reply) \
5465_(ONE_EID_TABLE_ADD_DEL_MAP_REPLY, one_eid_table_add_del_map_reply) \
5466_(ONE_LOCATOR_SET_DETAILS, one_locator_set_details) \
5467_(ONE_LOCATOR_DETAILS, one_locator_details) \
5468_(ONE_EID_TABLE_DETAILS, one_eid_table_details) \
5469_(ONE_EID_TABLE_MAP_DETAILS, one_eid_table_map_details) \
5470_(ONE_EID_TABLE_VNI_DETAILS, one_eid_table_vni_details) \
5471_(ONE_MAP_RESOLVER_DETAILS, one_map_resolver_details) \
5472_(ONE_MAP_SERVER_DETAILS, one_map_server_details) \
5473_(ONE_ADJACENCIES_GET_REPLY, one_adjacencies_get_reply) \
Filip Tehlar4868ff62017-03-09 16:48:39 +01005474_(ONE_STATS_DETAILS, one_stats_details) \
Filip Tehlar21511912017-04-07 10:41:42 +02005475_(ONE_STATS_FLUSH_REPLY, one_stats_flush_reply) \
Filip Tehlar4868ff62017-03-09 16:48:39 +01005476_(ONE_STATS_ENABLE_DISABLE_REPLY, one_stats_enable_disable_reply) \
5477_(SHOW_ONE_STATS_ENABLE_DISABLE_REPLY, \
5478 show_one_stats_enable_disable_reply) \
Filip Tehlar05879992017-09-05 15:46:09 +02005479_(ONE_ADD_DEL_NDP_ENTRY_REPLY, one_add_del_ndp_entry_reply) \
5480_(ONE_NDP_BD_GET_REPLY, one_ndp_bd_get_reply) \
5481_(ONE_NDP_ENTRIES_GET_REPLY, one_ndp_entries_get_reply) \
Filip Tehlard5a65db2017-05-17 17:21:10 +02005482_(ONE_ADD_DEL_L2_ARP_ENTRY_REPLY, one_add_del_l2_arp_entry_reply) \
5483_(ONE_L2_ARP_BD_GET_REPLY, one_l2_arp_bd_get_reply) \
5484_(ONE_L2_ARP_ENTRIES_GET_REPLY, one_l2_arp_entries_get_reply) \
Filip Tehlar0a8840d2017-10-16 05:48:23 -07005485_(ONE_ENABLE_DISABLE_XTR_MODE_REPLY, one_enable_disable_xtr_mode_reply) \
5486_(ONE_ENABLE_DISABLE_PITR_MODE_REPLY, \
5487 one_enable_disable_pitr_mode_reply) \
5488_(ONE_ENABLE_DISABLE_PETR_MODE_REPLY, \
5489 one_enable_disable_petr_mode_reply) \
5490_(ONE_SHOW_XTR_MODE_REPLY, one_show_xtr_mode_reply) \
5491_(ONE_SHOW_PITR_MODE_REPLY, one_show_pitr_mode_reply) \
5492_(ONE_SHOW_PETR_MODE_REPLY, one_show_petr_mode_reply) \
Filip Tehlar3e7b56932017-02-21 18:28:34 +01005493_(GPE_SET_ENCAP_MODE_REPLY, gpe_set_encap_mode_reply) \
5494_(GPE_GET_ENCAP_MODE_REPLY, gpe_get_encap_mode_reply) \
Filip Tehlar82786c42017-02-20 15:20:37 +01005495_(GPE_ADD_DEL_IFACE_REPLY, gpe_add_del_iface_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005496_(GPE_ENABLE_DISABLE_REPLY, gpe_enable_disable_reply) \
5497_(GPE_ADD_DEL_FWD_ENTRY_REPLY, gpe_add_del_fwd_entry_reply) \
Filip Tehlar0eb874e2017-05-18 14:23:32 +02005498_(GPE_FWD_ENTRY_VNIS_GET_REPLY, gpe_fwd_entry_vnis_get_reply) \
Filip Tehlar82786c42017-02-20 15:20:37 +01005499_(GPE_FWD_ENTRIES_GET_REPLY, gpe_fwd_entries_get_reply) \
Filip Tehlarb4243aa2017-06-14 14:39:42 +02005500_(GPE_NATIVE_FWD_RPATHS_GET_REPLY, gpe_native_fwd_rpaths_get_reply) \
5501_(GPE_ADD_DEL_NATIVE_FWD_RPATH_REPLY, \
5502 gpe_add_del_native_fwd_rpath_reply) \
Filip Tehlar82786c42017-02-20 15:20:37 +01005503_(GPE_FWD_ENTRY_PATH_DETAILS, \
5504 gpe_fwd_entry_path_details) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005505_(SHOW_ONE_STATUS_REPLY, show_one_status_reply) \
5506_(ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \
5507 one_add_del_map_request_itr_rlocs_reply) \
5508_(ONE_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \
5509 one_get_map_request_itr_rlocs_reply) \
Filip Tehlaref2a5bf2017-05-30 07:14:46 +02005510_(SHOW_ONE_NSH_MAPPING_REPLY, show_one_nsh_mapping_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005511_(SHOW_ONE_PITR_REPLY, show_one_pitr_reply) \
Filip Tehlar67a99f82017-03-10 13:18:02 +01005512_(SHOW_ONE_USE_PETR_REPLY, show_one_use_petr_reply) \
Filip Tehlar694396d2017-02-17 14:29:11 +01005513_(SHOW_ONE_MAP_REQUEST_MODE_REPLY, show_one_map_request_mode_reply) \
5514_(SHOW_ONE_RLOC_PROBE_STATE_REPLY, show_one_rloc_probe_state_reply) \
5515_(SHOW_ONE_MAP_REGISTER_STATE_REPLY, \
5516 show_one_map_register_state_reply) \
Filip Tehlar1e553a02017-08-02 12:45:07 +02005517_(SHOW_ONE_MAP_REGISTER_TTL_REPLY, show_one_map_register_ttl_reply) \
Filip Tehlar7048ff12017-07-27 08:09:14 +02005518_(SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD_REPLY, \
5519 show_one_map_register_fallback_threshold_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005520_(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
5521_(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +02005522_(AF_PACKET_DETAILS, af_packet_details) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005523_(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \
5524_(POLICER_DETAILS, policer_details) \
5525_(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \
5526_(POLICER_CLASSIFY_DETAILS, policer_classify_details) \
5527_(NETMAP_CREATE_REPLY, netmap_create_reply) \
5528_(NETMAP_DELETE_REPLY, netmap_delete_reply) \
5529_(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \
5530_(MPLS_FIB_DETAILS, mpls_fib_details) \
5531_(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \
5532_(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \
5533_(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \
5534_(CLASSIFY_SESSION_DETAILS, classify_session_details) \
5535_(SET_IPFIX_EXPORTER_REPLY, set_ipfix_exporter_reply) \
5536_(IPFIX_EXPORTER_DETAILS, ipfix_exporter_details) \
5537_(SET_IPFIX_CLASSIFY_STREAM_REPLY, set_ipfix_classify_stream_reply) \
5538_(IPFIX_CLASSIFY_STREAM_DETAILS, ipfix_classify_stream_details) \
5539_(IPFIX_CLASSIFY_TABLE_ADD_DEL_REPLY, ipfix_classify_table_add_del_reply) \
5540_(IPFIX_CLASSIFY_TABLE_DETAILS, ipfix_classify_table_details) \
5541_(FLOW_CLASSIFY_SET_INTERFACE_REPLY, flow_classify_set_interface_reply) \
5542_(FLOW_CLASSIFY_DETAILS, flow_classify_details) \
5543_(SW_INTERFACE_SPAN_ENABLE_DISABLE_REPLY, sw_interface_span_enable_disable_reply) \
5544_(SW_INTERFACE_SPAN_DETAILS, sw_interface_span_details) \
5545_(GET_NEXT_INDEX_REPLY, get_next_index_reply) \
5546_(PG_CREATE_INTERFACE_REPLY, pg_create_interface_reply) \
5547_(PG_CAPTURE_REPLY, pg_capture_reply) \
5548_(PG_ENABLE_DISABLE_REPLY, pg_enable_disable_reply) \
5549_(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \
5550 ip_source_and_port_range_check_add_del_reply) \
5551_(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \
5552 ip_source_and_port_range_check_interface_add_del_reply) \
5553_(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \
5554_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \
5555_(DELETE_SUBIF_REPLY, delete_subif_reply) \
5556_(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \
Pavel Kotuceke88865d2018-11-28 07:42:11 +01005557_(SET_PUNT_REPLY, set_punt_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005558_(IP_FIB_DETAILS, ip_fib_details) \
5559_(IP6_FIB_DETAILS, ip6_fib_details) \
5560_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \
5561_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \
5562_(L2_XCONNECT_DETAILS, l2_xconnect_details) \
Ole Troand7231612018-06-07 10:17:57 +02005563_(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \
Damjan Marion7cd468a2016-12-19 23:05:39 +01005564_(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \
Pavel Kotucek6899a302017-06-08 08:46:10 +02005565_(SW_INTERFACE_GET_TABLE_REPLY, sw_interface_get_table_reply) \
5566_(P2P_ETHERNET_ADD_REPLY, p2p_ethernet_add_reply) \
Steve Shin99a0e602017-07-01 04:16:20 +00005567_(P2P_ETHERNET_DEL_REPLY, p2p_ethernet_del_reply) \
5568_(LLDP_CONFIG_REPLY, lldp_config_reply) \
Dave Barach3bbcfab2017-08-15 19:03:44 -04005569_(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \
Florin Corascea194d2017-10-02 00:18:51 -07005570_(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \
Dave Barach65457162017-10-10 17:53:14 -04005571_(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \
5572_(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \
5573_(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \
Dave Barachd2080152017-10-20 09:21:35 -04005574_(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \
Florin Coras1c710452017-10-17 00:03:13 -07005575_(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \
Florin Coras6c36f532017-11-03 18:32:34 -07005576_(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \
Florin Coras595992c2017-11-06 17:17:08 -08005577_(SESSION_RULES_DETAILS, session_rules_details) \
5578_(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \
Andrew Yourtchenko815d7d52018-02-07 11:37:02 +01005579_(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \
Ole Troane906aac2018-06-14 14:42:14 +02005580_(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply)
Damjan Marion7cd468a2016-12-19 23:05:39 +01005581
Dave Baracha1a093d2017-03-02 13:13:23 -05005582#define foreach_standalone_reply_msg \
Ole Troanf49ba0e2018-11-13 14:04:50 +01005583_(SW_INTERFACE_EVENT, sw_interface_event)
Dave Baracha1a093d2017-03-02 13:13:23 -05005584
Damjan Marion7cd468a2016-12-19 23:05:39 +01005585typedef struct
5586{
5587 u8 *name;
5588 u32 value;
5589} name_sort_t;
5590
Damjan Marion7cd468a2016-12-19 23:05:39 +01005591#define STR_VTR_OP_CASE(op) \
5592 case L2_VTR_ ## op: \
5593 return "" # op;
5594
5595static const char *
5596str_vtr_op (u32 vtr_op)
5597{
5598 switch (vtr_op)
5599 {
5600 STR_VTR_OP_CASE (DISABLED);
5601 STR_VTR_OP_CASE (PUSH_1);
5602 STR_VTR_OP_CASE (PUSH_2);
5603 STR_VTR_OP_CASE (POP_1);
5604 STR_VTR_OP_CASE (POP_2);
5605 STR_VTR_OP_CASE (TRANSLATE_1_1);
5606 STR_VTR_OP_CASE (TRANSLATE_1_2);
5607 STR_VTR_OP_CASE (TRANSLATE_2_1);
5608 STR_VTR_OP_CASE (TRANSLATE_2_2);
5609 }
5610
5611 return "UNKNOWN";
5612}
5613
5614static int
5615dump_sub_interface_table (vat_main_t * vam)
5616{
5617 const sw_interface_subif_t *sub = NULL;
5618
5619 if (vam->json_output)
5620 {
5621 clib_warning
5622 ("JSON output supported only for VPE API calls and dump_stats_table");
5623 return -99;
5624 }
5625
5626 print (vam->ofp,
5627 "%-30s%-12s%-11s%-7s%-5s%-9s%-9s%-6s%-8s%-10s%-10s",
5628 "Interface", "sw_if_index",
5629 "sub id", "dot1ad", "tags", "outer id",
5630 "inner id", "exact", "default", "outer any", "inner any");
5631
5632 vec_foreach (sub, vam->sw_if_subif_table)
5633 {
5634 print (vam->ofp,
5635 "%-30s%-12d%-11d%-7s%-5d%-9d%-9d%-6d%-8d%-10d%-10d",
5636 sub->interface_name,
5637 sub->sw_if_index,
5638 sub->sub_id, sub->sub_dot1ad ? "dot1ad" : "dot1q",
5639 sub->sub_number_of_tags, sub->sub_outer_vlan_id,
5640 sub->sub_inner_vlan_id, sub->sub_exact_match, sub->sub_default,
5641 sub->sub_outer_vlan_id_any, sub->sub_inner_vlan_id_any);
5642 if (sub->vtr_op != L2_VTR_DISABLED)
5643 {
5644 print (vam->ofp,
5645 " vlan-tag-rewrite - op: %-14s [ dot1q: %d "
5646 "tag1: %d tag2: %d ]",
5647 str_vtr_op (sub->vtr_op), sub->vtr_push_dot1q,
5648 sub->vtr_tag1, sub->vtr_tag2);
5649 }
5650 }
5651
5652 return 0;
5653}
5654
5655static int
5656name_sort_cmp (void *a1, void *a2)
5657{
5658 name_sort_t *n1 = a1;
5659 name_sort_t *n2 = a2;
5660
5661 return strcmp ((char *) n1->name, (char *) n2->name);
5662}
5663
5664static int
5665dump_interface_table (vat_main_t * vam)
5666{
5667 hash_pair_t *p;
5668 name_sort_t *nses = 0, *ns;
5669
5670 if (vam->json_output)
5671 {
5672 clib_warning
5673 ("JSON output supported only for VPE API calls and dump_stats_table");
5674 return -99;
5675 }
5676
5677 /* *INDENT-OFF* */
5678 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5679 ({
5680 vec_add2 (nses, ns, 1);
5681 ns->name = (u8 *)(p->key);
5682 ns->value = (u32) p->value[0];
5683 }));
5684 /* *INDENT-ON* */
5685
5686 vec_sort_with_function (nses, name_sort_cmp);
5687
5688 print (vam->ofp, "%-25s%-15s", "Interface", "sw_if_index");
5689 vec_foreach (ns, nses)
5690 {
5691 print (vam->ofp, "%-25s%-15d", ns->name, ns->value);
5692 }
5693 vec_free (nses);
5694 return 0;
5695}
5696
5697static int
5698dump_ip_table (vat_main_t * vam, int is_ipv6)
5699{
5700 const ip_details_t *det = NULL;
5701 const ip_address_details_t *address = NULL;
5702 u32 i = ~0;
5703
5704 print (vam->ofp, "%-12s", "sw_if_index");
5705
5706 vec_foreach (det, vam->ip_details_by_sw_if_index[is_ipv6])
5707 {
5708 i++;
5709 if (!det->present)
5710 {
5711 continue;
5712 }
5713 print (vam->ofp, "%-12d", i);
5714 print (vam->ofp, " %-30s%-13s", "Address", "Prefix length");
5715 if (!det->addr)
5716 {
5717 continue;
5718 }
5719 vec_foreach (address, det->addr)
5720 {
5721 print (vam->ofp,
5722 " %-30U%-13d",
5723 is_ipv6 ? format_ip6_address : format_ip4_address,
5724 address->ip, address->prefix_length);
5725 }
5726 }
5727
5728 return 0;
5729}
5730
5731static int
5732dump_ipv4_table (vat_main_t * vam)
5733{
5734 if (vam->json_output)
5735 {
5736 clib_warning
5737 ("JSON output supported only for VPE API calls and dump_stats_table");
5738 return -99;
5739 }
5740
5741 return dump_ip_table (vam, 0);
5742}
5743
5744static int
5745dump_ipv6_table (vat_main_t * vam)
5746{
5747 if (vam->json_output)
5748 {
5749 clib_warning
5750 ("JSON output supported only for VPE API calls and dump_stats_table");
5751 return -99;
5752 }
5753
5754 return dump_ip_table (vam, 1);
5755}
5756
Damjan Marion7cd468a2016-12-19 23:05:39 +01005757/*
Dave Barach59b25652017-09-10 15:04:27 -04005758 * Pass CLI buffers directly in the CLI_INBAND API message,
5759 * instead of an additional shared memory area.
Damjan Marion7cd468a2016-12-19 23:05:39 +01005760 */
5761static int
5762exec_inband (vat_main_t * vam)
5763{
5764 vl_api_cli_inband_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005765 unformat_input_t *i = vam->input;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005766 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005767
5768 if (vec_len (i->buffer) == 0)
5769 return -1;
5770
5771 if (vam->exec_mode == 0 && unformat (i, "mode"))
5772 {
5773 vam->exec_mode = 1;
5774 return 0;
5775 }
5776 if (vam->exec_mode == 1 && (unformat (i, "exit") || unformat (i, "quit")))
5777 {
5778 vam->exec_mode = 0;
5779 return 0;
5780 }
5781
5782 /*
5783 * In order for the CLI command to work, it
5784 * must be a vector ending in \n, not a C-string ending
5785 * in \n\0.
5786 */
5787 u32 len = vec_len (vam->input->buffer);
Jon Loeliger8a2aea32017-01-31 13:19:40 -06005788 M2 (CLI_INBAND, mp, len);
Ole Troan884f0af2018-12-14 20:34:29 +01005789 vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd);
Damjan Marion7cd468a2016-12-19 23:05:39 +01005790
Jon Loeliger7bc770c2017-01-31 14:03:33 -06005791 S (mp);
Dave Barach59b25652017-09-10 15:04:27 -04005792 W (ret);
5793 /* json responses may or may not include a useful reply... */
5794 if (vec_len (vam->cmd_reply))
Dave Barachcf5e8482017-10-17 11:48:29 -04005795 print (vam->ofp, "%v", (char *) (vam->cmd_reply));
Jon Loeliger56c7b012017-02-01 12:31:41 -06005796 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005797}
5798
Dave Barach59b25652017-09-10 15:04:27 -04005799int
5800exec (vat_main_t * vam)
5801{
5802 return exec_inband (vam);
5803}
5804
Damjan Marion7cd468a2016-12-19 23:05:39 +01005805static int
5806api_create_loopback (vat_main_t * vam)
5807{
5808 unformat_input_t *i = vam->input;
5809 vl_api_create_loopback_t *mp;
Jon Loeligerc83c3b72017-02-23 13:57:35 -06005810 vl_api_create_loopback_instance_t *mp_lbi;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005811 u8 mac_address[6];
5812 u8 mac_set = 0;
Jon Loeligerc83c3b72017-02-23 13:57:35 -06005813 u8 is_specified = 0;
5814 u32 user_instance = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005815 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005816
Dave Barachb7b92992018-10-17 10:38:51 -04005817 clib_memset (mac_address, 0, sizeof (mac_address));
Damjan Marion7cd468a2016-12-19 23:05:39 +01005818
5819 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5820 {
5821 if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
5822 mac_set = 1;
Jon Loeligerc83c3b72017-02-23 13:57:35 -06005823 if (unformat (i, "instance %d", &user_instance))
5824 is_specified = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005825 else
5826 break;
5827 }
5828
Jon Loeligerc83c3b72017-02-23 13:57:35 -06005829 if (is_specified)
5830 {
5831 M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
5832 mp_lbi->is_specified = is_specified;
5833 if (is_specified)
5834 mp_lbi->user_instance = htonl (user_instance);
5835 if (mac_set)
5836 clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
5837 S (mp_lbi);
5838 }
5839 else
5840 {
5841 /* Construct the API message */
5842 M (CREATE_LOOPBACK, mp);
5843 if (mac_set)
5844 clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
5845 S (mp);
5846 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01005847
Jon Loeliger56c7b012017-02-01 12:31:41 -06005848 W (ret);
5849 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005850}
5851
5852static int
5853api_delete_loopback (vat_main_t * vam)
5854{
5855 unformat_input_t *i = vam->input;
5856 vl_api_delete_loopback_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005857 u32 sw_if_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005858 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005859
5860 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5861 {
5862 if (unformat (i, "sw_if_index %d", &sw_if_index))
5863 ;
5864 else
5865 break;
5866 }
5867
5868 if (sw_if_index == ~0)
5869 {
5870 errmsg ("missing sw_if_index");
5871 return -99;
5872 }
5873
5874 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06005875 M (DELETE_LOOPBACK, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01005876 mp->sw_if_index = ntohl (sw_if_index);
5877
Jon Loeliger7bc770c2017-01-31 14:03:33 -06005878 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06005879 W (ret);
5880 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005881}
5882
5883static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01005884api_want_interface_events (vat_main_t * vam)
5885{
5886 unformat_input_t *i = vam->input;
5887 vl_api_want_interface_events_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005888 int enable = -1;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005889 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005890
5891 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5892 {
5893 if (unformat (i, "enable"))
5894 enable = 1;
5895 else if (unformat (i, "disable"))
5896 enable = 0;
5897 else
5898 break;
5899 }
5900
5901 if (enable == -1)
5902 {
5903 errmsg ("missing enable|disable");
5904 return -99;
5905 }
5906
Jon Loeliger8a2aea32017-01-31 13:19:40 -06005907 M (WANT_INTERFACE_EVENTS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01005908 mp->enable_disable = enable;
5909
5910 vam->interface_event_display = enable;
5911
Jon Loeliger7bc770c2017-01-31 14:03:33 -06005912 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06005913 W (ret);
5914 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005915}
5916
5917
5918/* Note: non-static, called once to set up the initial intfc table */
5919int
5920api_sw_interface_dump (vat_main_t * vam)
5921{
5922 vl_api_sw_interface_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -06005923 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005924 hash_pair_t *p;
5925 name_sort_t *nses = 0, *ns;
5926 sw_interface_subif_t *sub = NULL;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005927 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005928
5929 /* Toss the old name table */
5930 /* *INDENT-OFF* */
5931 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
5932 ({
5933 vec_add2 (nses, ns, 1);
5934 ns->name = (u8 *)(p->key);
5935 ns->value = (u32) p->value[0];
5936 }));
5937 /* *INDENT-ON* */
5938
5939 hash_free (vam->sw_if_index_by_interface_name);
5940
5941 vec_foreach (ns, nses) vec_free (ns->name);
5942
5943 vec_free (nses);
5944
5945 vec_foreach (sub, vam->sw_if_subif_table)
5946 {
5947 vec_free (sub->interface_name);
5948 }
5949 vec_free (vam->sw_if_subif_table);
5950
5951 /* recreate the interface name hash table */
5952 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
5953
Dave Barachf72212e2018-01-11 10:25:07 -05005954 /*
5955 * Ask for all interface names. Otherwise, the epic catalog of
5956 * name filters becomes ridiculously long, and vat ends up needing
5957 * to be taught about new interface types.
5958 */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06005959 M (SW_INTERFACE_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -06005960 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01005961
5962 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -04005963 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -06005964 S (mp_ping);
5965
Jon Loeliger56c7b012017-02-01 12:31:41 -06005966 W (ret);
5967 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005968}
5969
5970static int
5971api_sw_interface_set_flags (vat_main_t * vam)
5972{
5973 unformat_input_t *i = vam->input;
5974 vl_api_sw_interface_set_flags_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005975 u32 sw_if_index;
5976 u8 sw_if_index_set = 0;
Neale Rannsa07bd702017-08-07 07:53:49 -07005977 u8 admin_up = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06005978 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005979
5980 /* Parse args required to build the message */
5981 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
5982 {
5983 if (unformat (i, "admin-up"))
5984 admin_up = 1;
5985 else if (unformat (i, "admin-down"))
5986 admin_up = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01005987 else
5988 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
5989 sw_if_index_set = 1;
5990 else if (unformat (i, "sw_if_index %d", &sw_if_index))
5991 sw_if_index_set = 1;
5992 else
5993 break;
5994 }
5995
5996 if (sw_if_index_set == 0)
5997 {
5998 errmsg ("missing interface name or sw_if_index");
5999 return -99;
6000 }
6001
6002 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006003 M (SW_INTERFACE_SET_FLAGS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006004 mp->sw_if_index = ntohl (sw_if_index);
Ole Trøan3b0d7e42019-03-15 16:14:41 +00006005 mp->admin_up_down = admin_up;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006006
6007 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006008 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006009
6010 /* Wait for a reply, return the good/bad news... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006011 W (ret);
6012 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006013}
6014
6015static int
Stevenad8015b2017-10-29 22:10:46 -07006016api_sw_interface_set_rx_mode (vat_main_t * vam)
6017{
6018 unformat_input_t *i = vam->input;
6019 vl_api_sw_interface_set_rx_mode_t *mp;
6020 u32 sw_if_index;
6021 u8 sw_if_index_set = 0;
6022 int ret;
6023 u8 queue_id_valid = 0;
6024 u32 queue_id;
6025 vnet_hw_interface_rx_mode mode = VNET_HW_INTERFACE_RX_MODE_UNKNOWN;
6026
6027 /* Parse args required to build the message */
6028 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6029 {
6030 if (unformat (i, "queue %d", &queue_id))
6031 queue_id_valid = 1;
6032 else if (unformat (i, "polling"))
6033 mode = VNET_HW_INTERFACE_RX_MODE_POLLING;
6034 else if (unformat (i, "interrupt"))
6035 mode = VNET_HW_INTERFACE_RX_MODE_INTERRUPT;
6036 else if (unformat (i, "adaptive"))
6037 mode = VNET_HW_INTERFACE_RX_MODE_ADAPTIVE;
6038 else
6039 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6040 sw_if_index_set = 1;
6041 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6042 sw_if_index_set = 1;
6043 else
6044 break;
6045 }
6046
6047 if (sw_if_index_set == 0)
6048 {
6049 errmsg ("missing interface name or sw_if_index");
6050 return -99;
6051 }
6052 if (mode == VNET_HW_INTERFACE_RX_MODE_UNKNOWN)
6053 {
6054 errmsg ("missing rx-mode");
6055 return -99;
6056 }
6057
6058 /* Construct the API message */
6059 M (SW_INTERFACE_SET_RX_MODE, mp);
6060 mp->sw_if_index = ntohl (sw_if_index);
6061 mp->mode = mode;
6062 mp->queue_id_valid = queue_id_valid;
6063 mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
6064
6065 /* send it... */
6066 S (mp);
6067
6068 /* Wait for a reply, return the good/bad news... */
6069 W (ret);
6070 return ret;
6071}
6072
6073static int
Mohsin Kazmi54f7c512018-08-23 18:28:11 +02006074api_sw_interface_set_rx_placement (vat_main_t * vam)
6075{
6076 unformat_input_t *i = vam->input;
6077 vl_api_sw_interface_set_rx_placement_t *mp;
6078 u32 sw_if_index;
6079 u8 sw_if_index_set = 0;
6080 int ret;
6081 u8 is_main = 0;
6082 u32 queue_id, thread_index;
6083
6084 /* Parse args required to build the message */
6085 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6086 {
6087 if (unformat (i, "queue %d", &queue_id))
6088 ;
6089 else if (unformat (i, "main"))
6090 is_main = 1;
6091 else if (unformat (i, "worker %d", &thread_index))
6092 ;
6093 else
6094 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6095 sw_if_index_set = 1;
6096 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6097 sw_if_index_set = 1;
6098 else
6099 break;
6100 }
6101
6102 if (sw_if_index_set == 0)
6103 {
6104 errmsg ("missing interface name or sw_if_index");
6105 return -99;
6106 }
6107
6108 if (is_main)
6109 thread_index = 0;
6110 /* Construct the API message */
6111 M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
6112 mp->sw_if_index = ntohl (sw_if_index);
6113 mp->worker_id = ntohl (thread_index);
6114 mp->queue_id = ntohl (queue_id);
6115 mp->is_main = is_main;
6116
6117 /* send it... */
6118 S (mp);
6119 /* Wait for a reply, return the good/bad news... */
6120 W (ret);
6121 return ret;
6122}
6123
Mohsin Kazmif0b42f42018-09-10 18:11:00 +02006124static void vl_api_sw_interface_rx_placement_details_t_handler
6125 (vl_api_sw_interface_rx_placement_details_t * mp)
6126{
6127 vat_main_t *vam = &vat_main;
6128 u32 worker_id = ntohl (mp->worker_id);
6129
6130 print (vam->ofp,
6131 "\n%-11d %-11s %-6d %-5d %-9s",
6132 ntohl (mp->sw_if_index), (worker_id == 0) ? "main" : "worker",
6133 worker_id, ntohl (mp->queue_id),
6134 (mp->mode ==
6135 1) ? "polling" : ((mp->mode == 2) ? "interrupt" : "adaptive"));
6136}
6137
6138static void vl_api_sw_interface_rx_placement_details_t_handler_json
6139 (vl_api_sw_interface_rx_placement_details_t * mp)
6140{
6141 vat_main_t *vam = &vat_main;
6142 vat_json_node_t *node = NULL;
6143
6144 if (VAT_JSON_ARRAY != vam->json_tree.type)
6145 {
6146 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
6147 vat_json_init_array (&vam->json_tree);
6148 }
6149 node = vat_json_array_add (&vam->json_tree);
6150
6151 vat_json_init_object (node);
6152 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
6153 vat_json_object_add_uint (node, "worker_id", ntohl (mp->worker_id));
6154 vat_json_object_add_uint (node, "queue_id", ntohl (mp->queue_id));
6155 vat_json_object_add_uint (node, "mode", mp->mode);
6156}
6157
6158static int
6159api_sw_interface_rx_placement_dump (vat_main_t * vam)
6160{
6161 unformat_input_t *i = vam->input;
6162 vl_api_sw_interface_rx_placement_dump_t *mp;
6163 vl_api_control_ping_t *mp_ping;
6164 int ret;
6165 u32 sw_if_index;
6166 u8 sw_if_index_set = 0;
6167
6168 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6169 {
6170 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6171 sw_if_index_set++;
6172 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6173 sw_if_index_set++;
6174 else
6175 break;
6176 }
6177
6178 print (vam->ofp,
6179 "\n%-11s %-11s %-6s %-5s %-4s",
6180 "sw_if_index", "main/worker", "thread", "queue", "mode");
6181
6182 /* Dump Interface rx placement */
6183 M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
6184
6185 if (sw_if_index_set)
6186 mp->sw_if_index = htonl (sw_if_index);
6187 else
6188 mp->sw_if_index = ~0;
6189
6190 S (mp);
6191
6192 /* Use a control ping for synchronization */
6193 MPING (CONTROL_PING, mp_ping);
6194 S (mp_ping);
6195
6196 W (ret);
6197 return ret;
6198}
6199
Mohsin Kazmi54f7c512018-08-23 18:28:11 +02006200static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01006201api_sw_interface_clear_stats (vat_main_t * vam)
6202{
6203 unformat_input_t *i = vam->input;
6204 vl_api_sw_interface_clear_stats_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006205 u32 sw_if_index;
6206 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006207 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006208
6209 /* Parse args required to build the message */
6210 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6211 {
6212 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6213 sw_if_index_set = 1;
6214 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6215 sw_if_index_set = 1;
6216 else
6217 break;
6218 }
6219
6220 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006221 M (SW_INTERFACE_CLEAR_STATS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006222
6223 if (sw_if_index_set == 1)
6224 mp->sw_if_index = ntohl (sw_if_index);
6225 else
6226 mp->sw_if_index = ~0;
6227
6228 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006229 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006230
6231 /* Wait for a reply, return the good/bad news... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006232 W (ret);
6233 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006234}
6235
Damjan Marion7cd468a2016-12-19 23:05:39 +01006236static int
6237api_sw_interface_add_del_address (vat_main_t * vam)
6238{
6239 unformat_input_t *i = vam->input;
6240 vl_api_sw_interface_add_del_address_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006241 u32 sw_if_index;
6242 u8 sw_if_index_set = 0;
6243 u8 is_add = 1, del_all = 0;
6244 u32 address_length = 0;
6245 u8 v4_address_set = 0;
6246 u8 v6_address_set = 0;
6247 ip4_address_t v4address;
6248 ip6_address_t v6address;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006249 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006250
6251 /* Parse args required to build the message */
6252 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6253 {
6254 if (unformat (i, "del-all"))
6255 del_all = 1;
6256 else if (unformat (i, "del"))
6257 is_add = 0;
6258 else
6259 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6260 sw_if_index_set = 1;
6261 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6262 sw_if_index_set = 1;
6263 else if (unformat (i, "%U/%d",
6264 unformat_ip4_address, &v4address, &address_length))
6265 v4_address_set = 1;
6266 else if (unformat (i, "%U/%d",
6267 unformat_ip6_address, &v6address, &address_length))
6268 v6_address_set = 1;
6269 else
6270 break;
6271 }
6272
6273 if (sw_if_index_set == 0)
6274 {
6275 errmsg ("missing interface name or sw_if_index");
6276 return -99;
6277 }
6278 if (v4_address_set && v6_address_set)
6279 {
6280 errmsg ("both v4 and v6 addresses set");
6281 return -99;
6282 }
6283 if (!v4_address_set && !v6_address_set && !del_all)
6284 {
6285 errmsg ("no addresses set");
6286 return -99;
6287 }
6288
6289 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006290 M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006291
6292 mp->sw_if_index = ntohl (sw_if_index);
6293 mp->is_add = is_add;
6294 mp->del_all = del_all;
6295 if (v6_address_set)
6296 {
Ole Trøan3b0d7e42019-03-15 16:14:41 +00006297 mp->is_ipv6 = 1;
6298 clib_memcpy (mp->address, &v6address, sizeof (v6address));
Damjan Marion7cd468a2016-12-19 23:05:39 +01006299 }
6300 else
6301 {
Ole Trøan3b0d7e42019-03-15 16:14:41 +00006302 clib_memcpy (mp->address, &v4address, sizeof (v4address));
Damjan Marion7cd468a2016-12-19 23:05:39 +01006303 }
Ole Trøan3b0d7e42019-03-15 16:14:41 +00006304 mp->address_length = address_length;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006305
6306 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006307 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006308
6309 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006310 W (ret);
6311 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006312}
6313
6314static int
6315api_sw_interface_set_mpls_enable (vat_main_t * vam)
6316{
6317 unformat_input_t *i = vam->input;
6318 vl_api_sw_interface_set_mpls_enable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006319 u32 sw_if_index;
6320 u8 sw_if_index_set = 0;
6321 u8 enable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006322 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006323
6324 /* Parse args required to build the message */
6325 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6326 {
6327 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6328 sw_if_index_set = 1;
6329 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6330 sw_if_index_set = 1;
6331 else if (unformat (i, "disable"))
6332 enable = 0;
6333 else if (unformat (i, "dis"))
6334 enable = 0;
6335 else
6336 break;
6337 }
6338
6339 if (sw_if_index_set == 0)
6340 {
6341 errmsg ("missing interface name or sw_if_index");
6342 return -99;
6343 }
6344
6345 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006346 M (SW_INTERFACE_SET_MPLS_ENABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006347
6348 mp->sw_if_index = ntohl (sw_if_index);
6349 mp->enable = enable;
6350
6351 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006352 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006353
6354 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006355 W (ret);
6356 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006357}
6358
6359static int
6360api_sw_interface_set_table (vat_main_t * vam)
6361{
6362 unformat_input_t *i = vam->input;
6363 vl_api_sw_interface_set_table_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006364 u32 sw_if_index, vrf_id = 0;
6365 u8 sw_if_index_set = 0;
6366 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006367 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006368
6369 /* Parse args required to build the message */
6370 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6371 {
6372 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6373 sw_if_index_set = 1;
6374 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6375 sw_if_index_set = 1;
6376 else if (unformat (i, "vrf %d", &vrf_id))
6377 ;
6378 else if (unformat (i, "ipv6"))
6379 is_ipv6 = 1;
6380 else
6381 break;
6382 }
6383
6384 if (sw_if_index_set == 0)
6385 {
6386 errmsg ("missing interface name or sw_if_index");
6387 return -99;
6388 }
6389
6390 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006391 M (SW_INTERFACE_SET_TABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006392
6393 mp->sw_if_index = ntohl (sw_if_index);
6394 mp->is_ipv6 = is_ipv6;
6395 mp->vrf_id = ntohl (vrf_id);
6396
6397 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006398 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006399
6400 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006401 W (ret);
6402 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006403}
6404
6405static void vl_api_sw_interface_get_table_reply_t_handler
6406 (vl_api_sw_interface_get_table_reply_t * mp)
6407{
6408 vat_main_t *vam = &vat_main;
6409
6410 print (vam->ofp, "%d", ntohl (mp->vrf_id));
6411
6412 vam->retval = ntohl (mp->retval);
6413 vam->result_ready = 1;
6414
6415}
6416
6417static void vl_api_sw_interface_get_table_reply_t_handler_json
6418 (vl_api_sw_interface_get_table_reply_t * mp)
6419{
6420 vat_main_t *vam = &vat_main;
6421 vat_json_node_t node;
6422
6423 vat_json_init_object (&node);
6424 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
6425 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
6426
6427 vat_json_print (vam->ofp, &node);
6428 vat_json_free (&node);
6429
6430 vam->retval = ntohl (mp->retval);
6431 vam->result_ready = 1;
6432}
6433
6434static int
6435api_sw_interface_get_table (vat_main_t * vam)
6436{
6437 unformat_input_t *i = vam->input;
6438 vl_api_sw_interface_get_table_t *mp;
6439 u32 sw_if_index;
6440 u8 sw_if_index_set = 0;
6441 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006442 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006443
6444 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6445 {
6446 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6447 sw_if_index_set = 1;
6448 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6449 sw_if_index_set = 1;
6450 else if (unformat (i, "ipv6"))
6451 is_ipv6 = 1;
6452 else
6453 break;
6454 }
6455
6456 if (sw_if_index_set == 0)
6457 {
6458 errmsg ("missing interface name or sw_if_index");
6459 return -99;
6460 }
6461
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006462 M (SW_INTERFACE_GET_TABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006463 mp->sw_if_index = htonl (sw_if_index);
6464 mp->is_ipv6 = is_ipv6;
6465
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006466 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06006467 W (ret);
6468 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006469}
6470
6471static int
6472api_sw_interface_set_vpath (vat_main_t * vam)
6473{
6474 unformat_input_t *i = vam->input;
6475 vl_api_sw_interface_set_vpath_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006476 u32 sw_if_index = 0;
6477 u8 sw_if_index_set = 0;
6478 u8 is_enable = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006479 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006480
6481 /* Parse args required to build the message */
6482 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6483 {
6484 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6485 sw_if_index_set = 1;
6486 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6487 sw_if_index_set = 1;
6488 else if (unformat (i, "enable"))
6489 is_enable = 1;
6490 else if (unformat (i, "disable"))
6491 is_enable = 0;
6492 else
6493 break;
6494 }
6495
6496 if (sw_if_index_set == 0)
6497 {
6498 errmsg ("missing interface name or sw_if_index");
6499 return -99;
6500 }
6501
6502 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006503 M (SW_INTERFACE_SET_VPATH, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006504
6505 mp->sw_if_index = ntohl (sw_if_index);
6506 mp->enable = is_enable;
6507
6508 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006509 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006510
6511 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006512 W (ret);
6513 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006514}
6515
6516static int
6517api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
6518{
6519 unformat_input_t *i = vam->input;
6520 vl_api_sw_interface_set_vxlan_bypass_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006521 u32 sw_if_index = 0;
6522 u8 sw_if_index_set = 0;
John Lo2b81eb82017-01-30 13:12:10 -05006523 u8 is_enable = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006524 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006525 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006526
6527 /* Parse args required to build the message */
6528 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6529 {
6530 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6531 sw_if_index_set = 1;
6532 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6533 sw_if_index_set = 1;
6534 else if (unformat (i, "enable"))
6535 is_enable = 1;
6536 else if (unformat (i, "disable"))
6537 is_enable = 0;
6538 else if (unformat (i, "ip4"))
6539 is_ipv6 = 0;
6540 else if (unformat (i, "ip6"))
6541 is_ipv6 = 1;
6542 else
6543 break;
6544 }
6545
6546 if (sw_if_index_set == 0)
6547 {
6548 errmsg ("missing interface name or sw_if_index");
6549 return -99;
6550 }
6551
6552 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006553 M (SW_INTERFACE_SET_VXLAN_BYPASS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006554
6555 mp->sw_if_index = ntohl (sw_if_index);
6556 mp->enable = is_enable;
6557 mp->is_ipv6 = is_ipv6;
6558
6559 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006560 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006561
6562 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06006563 W (ret);
6564 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006565}
6566
Marco Varleseb598f1d2017-09-19 14:25:28 +02006567static int
6568api_sw_interface_set_geneve_bypass (vat_main_t * vam)
6569{
6570 unformat_input_t *i = vam->input;
6571 vl_api_sw_interface_set_geneve_bypass_t *mp;
6572 u32 sw_if_index = 0;
6573 u8 sw_if_index_set = 0;
6574 u8 is_enable = 1;
6575 u8 is_ipv6 = 0;
6576 int ret;
6577
6578 /* Parse args required to build the message */
6579 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6580 {
6581 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6582 sw_if_index_set = 1;
6583 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6584 sw_if_index_set = 1;
6585 else if (unformat (i, "enable"))
6586 is_enable = 1;
6587 else if (unformat (i, "disable"))
6588 is_enable = 0;
6589 else if (unformat (i, "ip4"))
6590 is_ipv6 = 0;
6591 else if (unformat (i, "ip6"))
6592 is_ipv6 = 1;
6593 else
6594 break;
6595 }
6596
6597 if (sw_if_index_set == 0)
6598 {
6599 errmsg ("missing interface name or sw_if_index");
6600 return -99;
6601 }
6602
6603 /* Construct the API message */
6604 M (SW_INTERFACE_SET_GENEVE_BYPASS, mp);
6605
6606 mp->sw_if_index = ntohl (sw_if_index);
6607 mp->enable = is_enable;
6608 mp->is_ipv6 = is_ipv6;
6609
6610 /* send it... */
6611 S (mp);
6612
6613 /* Wait for a reply... */
6614 W (ret);
6615 return ret;
6616}
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +08006617
Damjan Marion7cd468a2016-12-19 23:05:39 +01006618static int
6619api_sw_interface_set_l2_xconnect (vat_main_t * vam)
6620{
6621 unformat_input_t *i = vam->input;
6622 vl_api_sw_interface_set_l2_xconnect_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006623 u32 rx_sw_if_index;
6624 u8 rx_sw_if_index_set = 0;
6625 u32 tx_sw_if_index;
6626 u8 tx_sw_if_index_set = 0;
6627 u8 enable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006628 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006629
6630 /* Parse args required to build the message */
6631 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6632 {
6633 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
6634 rx_sw_if_index_set = 1;
6635 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
6636 tx_sw_if_index_set = 1;
6637 else if (unformat (i, "rx"))
6638 {
6639 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6640 {
6641 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6642 &rx_sw_if_index))
6643 rx_sw_if_index_set = 1;
6644 }
6645 else
6646 break;
6647 }
6648 else if (unformat (i, "tx"))
6649 {
6650 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6651 {
6652 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
6653 &tx_sw_if_index))
6654 tx_sw_if_index_set = 1;
6655 }
6656 else
6657 break;
6658 }
6659 else if (unformat (i, "enable"))
6660 enable = 1;
6661 else if (unformat (i, "disable"))
6662 enable = 0;
6663 else
6664 break;
6665 }
6666
6667 if (rx_sw_if_index_set == 0)
6668 {
6669 errmsg ("missing rx interface name or rx_sw_if_index");
6670 return -99;
6671 }
6672
6673 if (enable && (tx_sw_if_index_set == 0))
6674 {
6675 errmsg ("missing tx interface name or tx_sw_if_index");
6676 return -99;
6677 }
6678
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006679 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006680
6681 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6682 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
6683 mp->enable = enable;
6684
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006685 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06006686 W (ret);
6687 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006688}
6689
6690static int
6691api_sw_interface_set_l2_bridge (vat_main_t * vam)
6692{
6693 unformat_input_t *i = vam->input;
6694 vl_api_sw_interface_set_l2_bridge_t *mp;
Neale Rannsb4743802018-09-05 09:13:57 -07006695 vl_api_l2_port_type_t port_type;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006696 u32 rx_sw_if_index;
6697 u8 rx_sw_if_index_set = 0;
6698 u32 bd_id;
6699 u8 bd_id_set = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006700 u32 shg = 0;
6701 u8 enable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006702 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006703
Neale Rannsb4743802018-09-05 09:13:57 -07006704 port_type = L2_API_PORT_TYPE_NORMAL;
6705
Damjan Marion7cd468a2016-12-19 23:05:39 +01006706 /* Parse args required to build the message */
6707 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6708 {
6709 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
6710 rx_sw_if_index_set = 1;
6711 else if (unformat (i, "bd_id %d", &bd_id))
6712 bd_id_set = 1;
6713 else
6714 if (unformat
6715 (i, "%U", api_unformat_sw_if_index, vam, &rx_sw_if_index))
6716 rx_sw_if_index_set = 1;
6717 else if (unformat (i, "shg %d", &shg))
6718 ;
6719 else if (unformat (i, "bvi"))
Neale Rannsb4743802018-09-05 09:13:57 -07006720 port_type = L2_API_PORT_TYPE_BVI;
6721 else if (unformat (i, "uu-fwd"))
6722 port_type = L2_API_PORT_TYPE_UU_FWD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006723 else if (unformat (i, "enable"))
6724 enable = 1;
6725 else if (unformat (i, "disable"))
6726 enable = 0;
6727 else
6728 break;
6729 }
6730
6731 if (rx_sw_if_index_set == 0)
6732 {
6733 errmsg ("missing rx interface name or sw_if_index");
6734 return -99;
6735 }
6736
6737 if (enable && (bd_id_set == 0))
6738 {
6739 errmsg ("missing bridge domain");
6740 return -99;
6741 }
6742
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006743 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006744
6745 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
6746 mp->bd_id = ntohl (bd_id);
6747 mp->shg = (u8) shg;
Neale Rannsb4743802018-09-05 09:13:57 -07006748 mp->port_type = ntohl (port_type);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006749 mp->enable = enable;
6750
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006751 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06006752 W (ret);
6753 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006754}
6755
6756static int
6757api_bridge_domain_dump (vat_main_t * vam)
6758{
6759 unformat_input_t *i = vam->input;
6760 vl_api_bridge_domain_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -06006761 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006762 u32 bd_id = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006763 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006764
6765 /* Parse args required to build the message */
6766 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6767 {
6768 if (unformat (i, "bd_id %d", &bd_id))
6769 ;
6770 else
6771 break;
6772 }
6773
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006774 M (BRIDGE_DOMAIN_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006775 mp->bd_id = ntohl (bd_id);
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006776 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006777
6778 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -04006779 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -06006780 S (mp_ping);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006781
Jon Loeliger56c7b012017-02-01 12:31:41 -06006782 W (ret);
6783 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006784}
6785
6786static int
6787api_bridge_domain_add_del (vat_main_t * vam)
6788{
6789 unformat_input_t *i = vam->input;
6790 vl_api_bridge_domain_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006791 u32 bd_id = ~0;
6792 u8 is_add = 1;
6793 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
Jerome Tollet50570ec2017-09-14 12:53:56 +01006794 u8 *bd_tag = NULL;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006795 u32 mac_age = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06006796 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006797
6798 /* Parse args required to build the message */
6799 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6800 {
6801 if (unformat (i, "bd_id %d", &bd_id))
6802 ;
6803 else if (unformat (i, "flood %d", &flood))
6804 ;
6805 else if (unformat (i, "uu-flood %d", &uu_flood))
6806 ;
6807 else if (unformat (i, "forward %d", &forward))
6808 ;
6809 else if (unformat (i, "learn %d", &learn))
6810 ;
6811 else if (unformat (i, "arp-term %d", &arp_term))
6812 ;
6813 else if (unformat (i, "mac-age %d", &mac_age))
6814 ;
Jerome Tollet50570ec2017-09-14 12:53:56 +01006815 else if (unformat (i, "bd-tag %s", &bd_tag))
6816 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006817 else if (unformat (i, "del"))
6818 {
6819 is_add = 0;
6820 flood = uu_flood = forward = learn = 0;
6821 }
6822 else
6823 break;
6824 }
6825
6826 if (bd_id == ~0)
6827 {
6828 errmsg ("missing bridge domain");
Jerome Tollet50570ec2017-09-14 12:53:56 +01006829 ret = -99;
6830 goto done;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006831 }
6832
6833 if (mac_age > 255)
6834 {
6835 errmsg ("mac age must be less than 256 ");
Jerome Tollet50570ec2017-09-14 12:53:56 +01006836 ret = -99;
6837 goto done;
6838 }
6839
John Lo70bfcaf2017-11-14 13:19:26 -05006840 if ((bd_tag) && (vec_len (bd_tag) > 63))
Jerome Tollet50570ec2017-09-14 12:53:56 +01006841 {
6842 errmsg ("bd-tag cannot be longer than 63");
6843 ret = -99;
6844 goto done;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006845 }
6846
Jon Loeliger8a2aea32017-01-31 13:19:40 -06006847 M (BRIDGE_DOMAIN_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01006848
6849 mp->bd_id = ntohl (bd_id);
6850 mp->flood = flood;
6851 mp->uu_flood = uu_flood;
6852 mp->forward = forward;
6853 mp->learn = learn;
6854 mp->arp_term = arp_term;
6855 mp->is_add = is_add;
6856 mp->mac_age = (u8) mac_age;
Jerome Tollet50570ec2017-09-14 12:53:56 +01006857 if (bd_tag)
John Lo70bfcaf2017-11-14 13:19:26 -05006858 {
6859 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
6860 mp->bd_tag[vec_len (bd_tag)] = 0;
6861 }
Jon Loeliger7bc770c2017-01-31 14:03:33 -06006862 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06006863 W (ret);
Jerome Tollet50570ec2017-09-14 12:53:56 +01006864
6865done:
6866 vec_free (bd_tag);
Jon Loeliger56c7b012017-02-01 12:31:41 -06006867 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006868}
6869
6870static int
Eyal Barif24991c2017-04-05 05:33:21 +03006871api_l2fib_flush_bd (vat_main_t * vam)
6872{
6873 unformat_input_t *i = vam->input;
6874 vl_api_l2fib_flush_bd_t *mp;
6875 u32 bd_id = ~0;
6876 int ret;
6877
6878 /* Parse args required to build the message */
6879 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6880 {
6881 if (unformat (i, "bd_id %d", &bd_id));
6882 else
6883 break;
6884 }
6885
6886 if (bd_id == ~0)
6887 {
6888 errmsg ("missing bridge domain");
6889 return -99;
6890 }
6891
6892 M (L2FIB_FLUSH_BD, mp);
6893
6894 mp->bd_id = htonl (bd_id);
6895
6896 S (mp);
6897 W (ret);
6898 return ret;
6899}
6900
6901static int
6902api_l2fib_flush_int (vat_main_t * vam)
6903{
6904 unformat_input_t *i = vam->input;
6905 vl_api_l2fib_flush_int_t *mp;
6906 u32 sw_if_index = ~0;
6907 int ret;
6908
6909 /* Parse args required to build the message */
6910 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6911 {
6912 if (unformat (i, "sw_if_index %d", &sw_if_index));
6913 else
6914 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index));
6915 else
6916 break;
6917 }
6918
6919 if (sw_if_index == ~0)
6920 {
6921 errmsg ("missing interface name or sw_if_index");
6922 return -99;
6923 }
6924
6925 M (L2FIB_FLUSH_INT, mp);
6926
6927 mp->sw_if_index = ntohl (sw_if_index);
6928
6929 S (mp);
6930 W (ret);
6931 return ret;
6932}
6933
6934static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01006935api_l2fib_add_del (vat_main_t * vam)
6936{
6937 unformat_input_t *i = vam->input;
6938 vl_api_l2fib_add_del_t *mp;
6939 f64 timeout;
Mohsin Kazmi57938f62017-10-27 21:28:07 +02006940 u8 mac[6] = { 0 };
Damjan Marion7cd468a2016-12-19 23:05:39 +01006941 u8 mac_set = 0;
6942 u32 bd_id;
6943 u8 bd_id_set = 0;
John Lo7dbd7262018-05-31 10:25:18 -04006944 u32 sw_if_index = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01006945 u8 sw_if_index_set = 0;
6946 u8 is_add = 1;
6947 u8 static_mac = 0;
6948 u8 filter_mac = 0;
6949 u8 bvi_mac = 0;
6950 int count = 1;
6951 f64 before = 0;
6952 int j;
6953
6954 /* Parse args required to build the message */
6955 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6956 {
Mohsin Kazmi57938f62017-10-27 21:28:07 +02006957 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
Damjan Marion7cd468a2016-12-19 23:05:39 +01006958 mac_set = 1;
6959 else if (unformat (i, "bd_id %d", &bd_id))
6960 bd_id_set = 1;
6961 else if (unformat (i, "sw_if_index %d", &sw_if_index))
6962 sw_if_index_set = 1;
6963 else if (unformat (i, "sw_if"))
6964 {
6965 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
6966 {
6967 if (unformat
6968 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
6969 sw_if_index_set = 1;
6970 }
6971 else
6972 break;
6973 }
6974 else if (unformat (i, "static"))
6975 static_mac = 1;
6976 else if (unformat (i, "filter"))
6977 {
6978 filter_mac = 1;
6979 static_mac = 1;
6980 }
6981 else if (unformat (i, "bvi"))
6982 {
6983 bvi_mac = 1;
6984 static_mac = 1;
6985 }
6986 else if (unformat (i, "del"))
6987 is_add = 0;
6988 else if (unformat (i, "count %d", &count))
6989 ;
6990 else
6991 break;
6992 }
6993
6994 if (mac_set == 0)
6995 {
6996 errmsg ("missing mac address");
6997 return -99;
6998 }
6999
7000 if (bd_id_set == 0)
7001 {
7002 errmsg ("missing bridge domain");
7003 return -99;
7004 }
7005
7006 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
7007 {
7008 errmsg ("missing interface name or sw_if_index");
7009 return -99;
7010 }
7011
7012 if (count > 1)
7013 {
7014 /* Turn on async mode */
7015 vam->async_mode = 1;
7016 vam->async_errors = 0;
7017 before = vat_time_now (vam);
7018 }
7019
7020 for (j = 0; j < count; j++)
7021 {
Jon Loeliger8a2aea32017-01-31 13:19:40 -06007022 M (L2FIB_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007023
Mohsin Kazmi57938f62017-10-27 21:28:07 +02007024 clib_memcpy (mp->mac, mac, 6);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007025 mp->bd_id = ntohl (bd_id);
7026 mp->is_add = is_add;
John Lo7dbd7262018-05-31 10:25:18 -04007027 mp->sw_if_index = ntohl (sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007028
7029 if (is_add)
7030 {
Damjan Marion7cd468a2016-12-19 23:05:39 +01007031 mp->static_mac = static_mac;
7032 mp->filter_mac = filter_mac;
7033 mp->bvi_mac = bvi_mac;
7034 }
Mohsin Kazmi57938f62017-10-27 21:28:07 +02007035 increment_mac_address (mac);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007036 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06007037 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007038 }
7039
7040 if (count > 1)
7041 {
Jon Loeliger2d23eca2017-02-01 13:09:58 -06007042 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007043 f64 after;
7044
7045 /* Shut off async mode */
7046 vam->async_mode = 0;
7047
Dave Barach59b25652017-09-10 15:04:27 -04007048 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -06007049 S (mp_ping);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007050
7051 timeout = vat_time_now (vam) + 1.0;
7052 while (vat_time_now (vam) < timeout)
7053 if (vam->result_ready == 1)
7054 goto out;
7055 vam->retval = -99;
7056
7057 out:
7058 if (vam->retval == -99)
7059 errmsg ("timeout");
7060
7061 if (vam->async_errors > 0)
7062 {
7063 errmsg ("%d asynchronous errors", vam->async_errors);
7064 vam->retval = -98;
7065 }
7066 vam->async_errors = 0;
7067 after = vat_time_now (vam);
7068
7069 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
7070 count, after - before, count / (after - before));
7071 }
7072 else
7073 {
Jon Loeliger56c7b012017-02-01 12:31:41 -06007074 int ret;
7075
Damjan Marion7cd468a2016-12-19 23:05:39 +01007076 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06007077 W (ret);
7078 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007079 }
7080 /* Return the good/bad news */
7081 return (vam->retval);
7082}
7083
7084static int
Eyal Barifead6702017-04-04 04:46:32 +03007085api_bridge_domain_set_mac_age (vat_main_t * vam)
7086{
7087 unformat_input_t *i = vam->input;
7088 vl_api_bridge_domain_set_mac_age_t *mp;
7089 u32 bd_id = ~0;
7090 u32 mac_age = 0;
7091 int ret;
7092
7093 /* Parse args required to build the message */
7094 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7095 {
7096 if (unformat (i, "bd_id %d", &bd_id));
7097 else if (unformat (i, "mac-age %d", &mac_age));
7098 else
7099 break;
7100 }
7101
7102 if (bd_id == ~0)
7103 {
7104 errmsg ("missing bridge domain");
7105 return -99;
7106 }
7107
7108 if (mac_age > 255)
7109 {
7110 errmsg ("mac age must be less than 256 ");
7111 return -99;
7112 }
7113
7114 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
7115
7116 mp->bd_id = htonl (bd_id);
7117 mp->mac_age = (u8) mac_age;
7118
7119 S (mp);
7120 W (ret);
7121 return ret;
7122}
7123
7124static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01007125api_l2_flags (vat_main_t * vam)
7126{
7127 unformat_input_t *i = vam->input;
7128 vl_api_l2_flags_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007129 u32 sw_if_index;
John Lo8d00fff2017-08-03 00:35:36 -04007130 u32 flags = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007131 u8 sw_if_index_set = 0;
John Lo8d00fff2017-08-03 00:35:36 -04007132 u8 is_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06007133 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007134
7135 /* Parse args required to build the message */
7136 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7137 {
7138 if (unformat (i, "sw_if_index %d", &sw_if_index))
7139 sw_if_index_set = 1;
7140 else if (unformat (i, "sw_if"))
7141 {
7142 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7143 {
7144 if (unformat
7145 (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7146 sw_if_index_set = 1;
7147 }
7148 else
7149 break;
7150 }
7151 else if (unformat (i, "learn"))
John Lo8d00fff2017-08-03 00:35:36 -04007152 flags |= L2_LEARN;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007153 else if (unformat (i, "forward"))
John Lo8d00fff2017-08-03 00:35:36 -04007154 flags |= L2_FWD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007155 else if (unformat (i, "flood"))
John Lo8d00fff2017-08-03 00:35:36 -04007156 flags |= L2_FLOOD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007157 else if (unformat (i, "uu-flood"))
John Lo8d00fff2017-08-03 00:35:36 -04007158 flags |= L2_UU_FLOOD;
7159 else if (unformat (i, "arp-term"))
7160 flags |= L2_ARP_TERM;
7161 else if (unformat (i, "off"))
7162 is_set = 0;
7163 else if (unformat (i, "disable"))
7164 is_set = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007165 else
7166 break;
7167 }
7168
7169 if (sw_if_index_set == 0)
7170 {
7171 errmsg ("missing interface name or sw_if_index");
7172 return -99;
7173 }
7174
Jon Loeliger8a2aea32017-01-31 13:19:40 -06007175 M (L2_FLAGS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007176
7177 mp->sw_if_index = ntohl (sw_if_index);
John Lo8d00fff2017-08-03 00:35:36 -04007178 mp->feature_bitmap = ntohl (flags);
7179 mp->is_set = is_set;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007180
Jon Loeliger7bc770c2017-01-31 14:03:33 -06007181 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06007182 W (ret);
7183 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007184}
7185
7186static int
7187api_bridge_flags (vat_main_t * vam)
7188{
7189 unformat_input_t *i = vam->input;
7190 vl_api_bridge_flags_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007191 u32 bd_id;
7192 u8 bd_id_set = 0;
7193 u8 is_set = 1;
Neale Rannsb4743802018-09-05 09:13:57 -07007194 bd_flags_t flags = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06007195 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007196
7197 /* Parse args required to build the message */
7198 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7199 {
7200 if (unformat (i, "bd_id %d", &bd_id))
7201 bd_id_set = 1;
7202 else if (unformat (i, "learn"))
Neale Rannsb4743802018-09-05 09:13:57 -07007203 flags |= BRIDGE_API_FLAG_LEARN;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007204 else if (unformat (i, "forward"))
Neale Rannsb4743802018-09-05 09:13:57 -07007205 flags |= BRIDGE_API_FLAG_FWD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007206 else if (unformat (i, "flood"))
Neale Rannsb4743802018-09-05 09:13:57 -07007207 flags |= BRIDGE_API_FLAG_FLOOD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007208 else if (unformat (i, "uu-flood"))
Neale Rannsb4743802018-09-05 09:13:57 -07007209 flags |= BRIDGE_API_FLAG_UU_FLOOD;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007210 else if (unformat (i, "arp-term"))
Neale Rannsb4743802018-09-05 09:13:57 -07007211 flags |= BRIDGE_API_FLAG_ARP_TERM;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007212 else if (unformat (i, "off"))
7213 is_set = 0;
7214 else if (unformat (i, "disable"))
7215 is_set = 0;
7216 else
7217 break;
7218 }
7219
7220 if (bd_id_set == 0)
7221 {
7222 errmsg ("missing bridge domain");
7223 return -99;
7224 }
7225
Jon Loeliger8a2aea32017-01-31 13:19:40 -06007226 M (BRIDGE_FLAGS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007227
7228 mp->bd_id = ntohl (bd_id);
Neale Rannsb4743802018-09-05 09:13:57 -07007229 mp->flags = ntohl (flags);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007230 mp->is_set = is_set;
7231
Jon Loeliger7bc770c2017-01-31 14:03:33 -06007232 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06007233 W (ret);
7234 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007235}
7236
7237static int
7238api_bd_ip_mac_add_del (vat_main_t * vam)
7239{
Neale Ranns4d5b9172018-10-24 02:57:49 -07007240 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
Ole Troan8006c6a2018-12-17 12:02:26 +01007241 vl_api_mac_address_t mac = { 0 };
Damjan Marion7cd468a2016-12-19 23:05:39 +01007242 unformat_input_t *i = vam->input;
7243 vl_api_bd_ip_mac_add_del_t *mp;
Neale Ranns4d5b9172018-10-24 02:57:49 -07007244 ip46_type_t type;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007245 u32 bd_id;
7246 u8 is_ipv6 = 0;
7247 u8 is_add = 1;
7248 u8 bd_id_set = 0;
7249 u8 ip_set = 0;
7250 u8 mac_set = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007251 u8 macaddr[6];
Jon Loeliger56c7b012017-02-01 12:31:41 -06007252 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007253
7254
7255 /* Parse args required to build the message */
7256 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7257 {
7258 if (unformat (i, "bd_id %d", &bd_id))
7259 {
7260 bd_id_set++;
7261 }
Neale Ranns4d5b9172018-10-24 02:57:49 -07007262 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
Damjan Marion7cd468a2016-12-19 23:05:39 +01007263 {
7264 ip_set++;
7265 }
Neale Ranns4d5b9172018-10-24 02:57:49 -07007266 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
Damjan Marion7cd468a2016-12-19 23:05:39 +01007267 {
7268 mac_set++;
7269 }
7270 else if (unformat (i, "del"))
7271 is_add = 0;
7272 else
7273 break;
7274 }
7275
7276 if (bd_id_set == 0)
7277 {
7278 errmsg ("missing bridge domain");
7279 return -99;
7280 }
7281 else if (ip_set == 0)
7282 {
7283 errmsg ("missing IP address");
7284 return -99;
7285 }
7286 else if (mac_set == 0)
7287 {
7288 errmsg ("missing MAC address");
7289 return -99;
7290 }
7291
Jon Loeliger8a2aea32017-01-31 13:19:40 -06007292 M (BD_IP_MAC_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007293
7294 mp->bd_id = ntohl (bd_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01007295 mp->is_add = is_add;
Neale Ranns4d5b9172018-10-24 02:57:49 -07007296
7297 clib_memcpy (&mp->ip, &ip, sizeof (ip));
7298 clib_memcpy (&mp->mac, &mac, sizeof (mac));
7299
Jon Loeliger7bc770c2017-01-31 14:03:33 -06007300 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06007301 W (ret);
7302 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01007303}
7304
John Loe26c81f2019-01-07 15:16:33 -05007305static int
7306api_bd_ip_mac_flush (vat_main_t * vam)
7307{
7308 unformat_input_t *i = vam->input;
7309 vl_api_bd_ip_mac_flush_t *mp;
7310 u32 bd_id;
7311 u8 bd_id_set = 0;
7312 int ret;
7313
7314 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7315 {
7316 if (unformat (i, "bd_id %d", &bd_id))
7317 {
7318 bd_id_set++;
7319 }
7320 else
7321 break;
7322 }
7323
7324 if (bd_id_set == 0)
7325 {
7326 errmsg ("missing bridge domain");
7327 return -99;
7328 }
7329
7330 M (BD_IP_MAC_FLUSH, mp);
7331
7332 mp->bd_id = ntohl (bd_id);
7333
7334 S (mp);
7335 W (ret);
7336 return ret;
7337}
7338
Mohsin Kazmi5d82d2f2018-08-13 19:17:54 +02007339static void vl_api_bd_ip_mac_details_t_handler
7340 (vl_api_bd_ip_mac_details_t * mp)
7341{
7342 vat_main_t *vam = &vat_main;
7343 u8 *ip = 0;
7344
7345 if (!mp->is_ipv6)
7346 ip =
7347 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7348 else
7349 ip =
7350 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7351
7352 print (vam->ofp,
7353 "\n%-5d %-7s %-20U %-30s",
7354 ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4",
7355 format_ethernet_address, mp->mac_address, ip);
7356
7357 vec_free (ip);
7358}
7359
7360static void vl_api_bd_ip_mac_details_t_handler_json
7361 (vl_api_bd_ip_mac_details_t * mp)
7362{
7363 vat_main_t *vam = &vat_main;
7364 vat_json_node_t *node = NULL;
7365
7366 if (VAT_JSON_ARRAY != vam->json_tree.type)
7367 {
7368 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
7369 vat_json_init_array (&vam->json_tree);
7370 }
7371 node = vat_json_array_add (&vam->json_tree);
7372
7373 vat_json_init_object (node);
7374 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
Mohsin Kazmi0d8cbc12018-09-11 13:06:42 +02007375 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
Mohsin Kazmi5d82d2f2018-08-13 19:17:54 +02007376 vat_json_object_add_string_copy (node, "mac_address",
7377 format (0, "%U", format_ethernet_address,
7378 &mp->mac_address));
7379 u8 *ip = 0;
7380
7381 if (!mp->is_ipv6)
7382 ip =
7383 format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address);
7384 else
7385 ip =
7386 format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address);
7387 vat_json_object_add_string_copy (node, "ip_address", ip);
7388 vec_free (ip);
7389}
7390
7391static int
7392api_bd_ip_mac_dump (vat_main_t * vam)
7393{
7394 unformat_input_t *i = vam->input;
7395 vl_api_bd_ip_mac_dump_t *mp;
7396 vl_api_control_ping_t *mp_ping;
7397 int ret;
7398 u32 bd_id;
7399 u8 bd_id_set = 0;
7400
7401 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7402 {
7403 if (unformat (i, "bd_id %d", &bd_id))
7404 {
7405 bd_id_set++;
7406 }
7407 else
7408 break;
7409 }
7410
7411 print (vam->ofp,
7412 "\n%-5s %-7s %-20s %-30s",
7413 "bd_id", "is_ipv6", "mac_address", "ip_address");
7414
7415 /* Dump Bridge Domain Ip to Mac entries */
7416 M (BD_IP_MAC_DUMP, mp);
7417
7418 if (bd_id_set)
7419 mp->bd_id = htonl (bd_id);
7420 else
7421 mp->bd_id = ~0;
7422
7423 S (mp);
7424
7425 /* Use a control ping for synchronization */
7426 MPING (CONTROL_PING, mp_ping);
7427 S (mp_ping);
7428
7429 W (ret);
7430 return ret;
7431}
7432
Damjan Marion7cd468a2016-12-19 23:05:39 +01007433static int
Damjan Marion8389fb92017-10-13 18:29:53 +02007434api_tap_create_v2 (vat_main_t * vam)
7435{
7436 unformat_input_t *i = vam->input;
7437 vl_api_tap_create_v2_t *mp;
7438 u8 mac_address[6];
7439 u8 random_mac = 1;
Damjan Marion2df39092017-12-04 20:03:37 +01007440 u32 id = ~0;
7441 u8 *host_if_name = 0;
7442 u8 *host_ns = 0;
7443 u8 host_mac_addr[6];
7444 u8 host_mac_addr_set = 0;
Damjan Marion91c6ef72017-12-01 13:34:24 +01007445 u8 *host_bridge = 0;
7446 ip4_address_t host_ip4_addr;
Damjan Marion7866c452018-01-18 13:35:11 +01007447 ip4_address_t host_ip4_gw;
7448 u8 host_ip4_gw_set = 0;
Damjan Marion91c6ef72017-12-01 13:34:24 +01007449 u32 host_ip4_prefix_len = 0;
7450 ip6_address_t host_ip6_addr;
Damjan Marion7866c452018-01-18 13:35:11 +01007451 ip6_address_t host_ip6_gw;
7452 u8 host_ip6_gw_set = 0;
Damjan Marion91c6ef72017-12-01 13:34:24 +01007453 u32 host_ip6_prefix_len = 0;
Damjan Marion8389fb92017-10-13 18:29:53 +02007454 int ret;
Steven9e635692018-03-01 09:36:01 -08007455 u32 rx_ring_sz = 0, tx_ring_sz = 0;
Damjan Marion8389fb92017-10-13 18:29:53 +02007456
Dave Barachb7b92992018-10-17 10:38:51 -04007457 clib_memset (mac_address, 0, sizeof (mac_address));
Damjan Marion8389fb92017-10-13 18:29:53 +02007458
7459 /* Parse args required to build the message */
7460 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7461 {
7462 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7463 {
7464 random_mac = 0;
7465 }
Steven9e635692018-03-01 09:36:01 -08007466 else if (unformat (i, "id %u", &id))
Damjan Marion91c6ef72017-12-01 13:34:24 +01007467 ;
Damjan Marion2df39092017-12-04 20:03:37 +01007468 else if (unformat (i, "host-if-name %s", &host_if_name))
Damjan Marion91c6ef72017-12-01 13:34:24 +01007469 ;
Damjan Marion2df39092017-12-04 20:03:37 +01007470 else if (unformat (i, "host-ns %s", &host_ns))
7471 ;
7472 else if (unformat (i, "host-mac-addr %U", unformat_ethernet_address,
7473 host_mac_addr))
7474 host_mac_addr_set = 1;
Damjan Marion91c6ef72017-12-01 13:34:24 +01007475 else if (unformat (i, "host-bridge %s", &host_bridge))
7476 ;
7477 else if (unformat (i, "host-ip4-addr %U/%d", unformat_ip4_address,
7478 &host_ip4_addr, &host_ip4_prefix_len))
7479 ;
7480 else if (unformat (i, "host-ip6-addr %U/%d", unformat_ip6_address,
7481 &host_ip6_addr, &host_ip6_prefix_len))
7482 ;
Damjan Marion7866c452018-01-18 13:35:11 +01007483 else if (unformat (i, "host-ip4-gw %U", unformat_ip4_address,
7484 &host_ip4_gw))
7485 host_ip4_gw_set = 1;
7486 else if (unformat (i, "host-ip6-gw %U", unformat_ip6_address,
7487 &host_ip6_gw))
7488 host_ip6_gw_set = 1;
Damjan Marion8389fb92017-10-13 18:29:53 +02007489 else if (unformat (i, "rx-ring-size %d", &rx_ring_sz))
7490 ;
7491 else if (unformat (i, "tx-ring-size %d", &tx_ring_sz))
7492 ;
7493 else
7494 break;
7495 }
7496
Damjan Marion2df39092017-12-04 20:03:37 +01007497 if (vec_len (host_if_name) > 63)
Damjan Marion8389fb92017-10-13 18:29:53 +02007498 {
7499 errmsg ("tap name too long. ");
7500 return -99;
7501 }
Damjan Marion2df39092017-12-04 20:03:37 +01007502 if (vec_len (host_ns) > 63)
Damjan Marion8389fb92017-10-13 18:29:53 +02007503 {
7504 errmsg ("host name space too long. ");
7505 return -99;
7506 }
Damjan Marion91c6ef72017-12-01 13:34:24 +01007507 if (vec_len (host_bridge) > 63)
7508 {
7509 errmsg ("host bridge name too long. ");
7510 return -99;
7511 }
7512 if (host_ip4_prefix_len > 32)
7513 {
7514 errmsg ("host ip4 prefix length not valid. ");
7515 return -99;
7516 }
7517 if (host_ip6_prefix_len > 128)
7518 {
7519 errmsg ("host ip6 prefix length not valid. ");
7520 return -99;
7521 }
Damjan Marion8389fb92017-10-13 18:29:53 +02007522 if (!is_pow2 (rx_ring_sz))
7523 {
7524 errmsg ("rx ring size must be power of 2. ");
7525 return -99;
7526 }
7527 if (rx_ring_sz > 32768)
7528 {
7529 errmsg ("rx ring size must be 32768 or lower. ");
7530 return -99;
7531 }
7532 if (!is_pow2 (tx_ring_sz))
7533 {
7534 errmsg ("tx ring size must be power of 2. ");
7535 return -99;
7536 }
7537 if (tx_ring_sz > 32768)
7538 {
7539 errmsg ("tx ring size must be 32768 or lower. ");
7540 return -99;
7541 }
7542
Damjan Marion8389fb92017-10-13 18:29:53 +02007543 /* Construct the API message */
7544 M (TAP_CREATE_V2, mp);
7545
7546 mp->use_random_mac = random_mac;
Damjan Marion2df39092017-12-04 20:03:37 +01007547
Steven9e635692018-03-01 09:36:01 -08007548 mp->id = ntohl (id);
Damjan Marion2df39092017-12-04 20:03:37 +01007549 mp->host_namespace_set = host_ns != 0;
Damjan Marion91c6ef72017-12-01 13:34:24 +01007550 mp->host_bridge_set = host_bridge != 0;
7551 mp->host_ip4_addr_set = host_ip4_prefix_len != 0;
7552 mp->host_ip6_addr_set = host_ip6_prefix_len != 0;
Steven9e635692018-03-01 09:36:01 -08007553 mp->rx_ring_sz = ntohs (rx_ring_sz);
7554 mp->tx_ring_sz = ntohs (tx_ring_sz);
Damjan Marion2df39092017-12-04 20:03:37 +01007555
Steven9e635692018-03-01 09:36:01 -08007556 if (random_mac == 0)
Damjan Marion2df39092017-12-04 20:03:37 +01007557 clib_memcpy (mp->mac_address, mac_address, 6);
7558 if (host_mac_addr_set)
7559 clib_memcpy (mp->host_mac_addr, host_mac_addr, 6);
7560 if (host_if_name)
7561 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
7562 if (host_ns)
7563 clib_memcpy (mp->host_namespace, host_ns, vec_len (host_ns));
Damjan Marion91c6ef72017-12-01 13:34:24 +01007564 if (host_bridge)
7565 clib_memcpy (mp->host_bridge, host_bridge, vec_len (host_bridge));
7566 if (host_ip4_prefix_len)
7567 clib_memcpy (mp->host_ip4_addr, &host_ip4_addr, 4);
Michal Cmarada87460d02018-10-17 13:40:32 +02007568 if (host_ip6_prefix_len)
Damjan Marion91c6ef72017-12-01 13:34:24 +01007569 clib_memcpy (mp->host_ip6_addr, &host_ip6_addr, 16);
Damjan Marion7866c452018-01-18 13:35:11 +01007570 if (host_ip4_gw_set)
7571 clib_memcpy (mp->host_ip4_gw, &host_ip4_gw, 4);
7572 if (host_ip6_gw_set)
7573 clib_memcpy (mp->host_ip6_gw, &host_ip6_gw, 16);
Damjan Marion8389fb92017-10-13 18:29:53 +02007574
Damjan Marion2df39092017-12-04 20:03:37 +01007575 vec_free (host_ns);
7576 vec_free (host_if_name);
7577 vec_free (host_bridge);
Damjan Marion8389fb92017-10-13 18:29:53 +02007578
7579 /* send it... */
7580 S (mp);
7581
7582 /* Wait for a reply... */
7583 W (ret);
7584 return ret;
7585}
7586
7587static int
7588api_tap_delete_v2 (vat_main_t * vam)
7589{
7590 unformat_input_t *i = vam->input;
7591 vl_api_tap_delete_v2_t *mp;
7592 u32 sw_if_index = ~0;
7593 u8 sw_if_index_set = 0;
7594 int ret;
7595
7596 /* Parse args required to build the message */
7597 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7598 {
7599 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7600 sw_if_index_set = 1;
7601 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7602 sw_if_index_set = 1;
7603 else
7604 break;
7605 }
7606
7607 if (sw_if_index_set == 0)
7608 {
7609 errmsg ("missing vpp interface name. ");
7610 return -99;
7611 }
7612
7613 /* Construct the API message */
7614 M (TAP_DELETE_V2, mp);
7615
7616 mp->sw_if_index = ntohl (sw_if_index);
7617
7618 /* send it... */
7619 S (mp);
7620
7621 /* Wait for a reply... */
7622 W (ret);
7623 return ret;
7624}
7625
Mohsin Kazmi03ae24b2019-01-18 11:50:00 +01007626uword
7627unformat_pci_addr (unformat_input_t * input, va_list * args)
7628{
7629 struct pci_addr_t
7630 {
7631 u16 domain;
7632 u8 bus;
7633 u8 slot:5;
7634 u8 function:3;
7635 } *addr;
7636 addr = va_arg (*args, struct pci_addr_t *);
7637 u32 x[4];
7638
7639 if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3]))
7640 return 0;
7641
7642 addr->domain = x[0];
7643 addr->bus = x[1];
7644 addr->slot = x[2];
7645 addr->function = x[3];
7646
7647 return 1;
7648}
7649
7650static int
7651api_virtio_pci_create (vat_main_t * vam)
7652{
7653 unformat_input_t *i = vam->input;
7654 vl_api_virtio_pci_create_t *mp;
7655 u8 mac_address[6];
7656 u8 random_mac = 1;
7657 u32 pci_addr = 0;
7658 u64 features = (u64) ~ (0ULL);
7659 u32 rx_ring_sz = 0, tx_ring_sz = 0;
7660 int ret;
7661
7662 clib_memset (mac_address, 0, sizeof (mac_address));
7663
7664 /* Parse args required to build the message */
7665 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7666 {
7667 if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address))
7668 {
7669 random_mac = 0;
7670 }
7671 else if (unformat (i, "pci-addr %U", unformat_pci_addr, &pci_addr))
7672 ;
7673 else if (unformat (i, "features 0x%llx", &features))
7674 ;
7675 else if (unformat (i, "rx-ring-size %u", &rx_ring_sz))
7676 ;
7677 else if (unformat (i, "tx-ring-size %u", &tx_ring_sz))
7678 ;
7679 else
7680 break;
7681 }
7682
7683 if (pci_addr == 0)
7684 {
7685 errmsg ("pci address must be non zero. ");
7686 return -99;
7687 }
7688 if (!is_pow2 (rx_ring_sz))
7689 {
7690 errmsg ("rx ring size must be power of 2. ");
7691 return -99;
7692 }
7693 if (rx_ring_sz > 32768)
7694 {
7695 errmsg ("rx ring size must be 32768 or lower. ");
7696 return -99;
7697 }
7698 if (!is_pow2 (tx_ring_sz))
7699 {
7700 errmsg ("tx ring size must be power of 2. ");
7701 return -99;
7702 }
7703 if (tx_ring_sz > 32768)
7704 {
7705 errmsg ("tx ring size must be 32768 or lower. ");
7706 return -99;
7707 }
7708
7709 /* Construct the API message */
7710 M (VIRTIO_PCI_CREATE, mp);
7711
7712 mp->use_random_mac = random_mac;
7713
7714 mp->pci_addr = htonl (pci_addr);
7715 mp->features = clib_host_to_net_u64 (features);
7716 mp->rx_ring_sz = htons (rx_ring_sz);
7717 mp->tx_ring_sz = htons (tx_ring_sz);
7718
7719 if (random_mac == 0)
7720 clib_memcpy (mp->mac_address, mac_address, 6);
7721
7722 /* send it... */
7723 S (mp);
7724
7725 /* Wait for a reply... */
7726 W (ret);
7727 return ret;
7728}
7729
7730static int
7731api_virtio_pci_delete (vat_main_t * vam)
7732{
7733 unformat_input_t *i = vam->input;
7734 vl_api_virtio_pci_delete_t *mp;
7735 u32 sw_if_index = ~0;
7736 u8 sw_if_index_set = 0;
7737 int ret;
7738
7739 /* Parse args required to build the message */
7740 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7741 {
7742 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7743 sw_if_index_set = 1;
7744 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7745 sw_if_index_set = 1;
7746 else
7747 break;
7748 }
7749
7750 if (sw_if_index_set == 0)
7751 {
7752 errmsg ("missing vpp interface name. ");
7753 return -99;
7754 }
7755
7756 /* Construct the API message */
7757 M (VIRTIO_PCI_DELETE, mp);
7758
7759 mp->sw_if_index = htonl (sw_if_index);
7760
7761 /* send it... */
7762 S (mp);
7763
7764 /* Wait for a reply... */
7765 W (ret);
7766 return ret;
7767}
7768
Damjan Marion8389fb92017-10-13 18:29:53 +02007769static int
Steven9cd2d7a2017-12-20 12:43:01 -08007770api_bond_create (vat_main_t * vam)
7771{
7772 unformat_input_t *i = vam->input;
7773 vl_api_bond_create_t *mp;
7774 u8 mac_address[6];
7775 u8 custom_mac = 0;
7776 int ret;
7777 u8 mode;
7778 u8 lb;
7779 u8 mode_is_set = 0;
Alexander Chernavinad9d5282018-12-13 09:08:09 -05007780 u32 id = ~0;
Steven9cd2d7a2017-12-20 12:43:01 -08007781
Dave Barachb7b92992018-10-17 10:38:51 -04007782 clib_memset (mac_address, 0, sizeof (mac_address));
Steven9cd2d7a2017-12-20 12:43:01 -08007783 lb = BOND_LB_L2;
7784
7785 /* Parse args required to build the message */
7786 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7787 {
7788 if (unformat (i, "mode %U", unformat_bond_mode, &mode))
7789 mode_is_set = 1;
7790 else if (((mode == BOND_MODE_LACP) || (mode == BOND_MODE_XOR))
7791 && unformat (i, "lb %U", unformat_bond_load_balance, &lb))
7792 ;
7793 else if (unformat (i, "hw-addr %U", unformat_ethernet_address,
7794 mac_address))
7795 custom_mac = 1;
Alexander Chernavinad9d5282018-12-13 09:08:09 -05007796 else if (unformat (i, "id %u", &id))
7797 ;
Steven9cd2d7a2017-12-20 12:43:01 -08007798 else
7799 break;
7800 }
7801
7802 if (mode_is_set == 0)
7803 {
7804 errmsg ("Missing bond mode. ");
7805 return -99;
7806 }
7807
7808 /* Construct the API message */
7809 M (BOND_CREATE, mp);
7810
7811 mp->use_custom_mac = custom_mac;
7812
7813 mp->mode = mode;
7814 mp->lb = lb;
Alexander Chernavinad9d5282018-12-13 09:08:09 -05007815 mp->id = htonl (id);
Steven9cd2d7a2017-12-20 12:43:01 -08007816
7817 if (custom_mac)
7818 clib_memcpy (mp->mac_address, mac_address, 6);
7819
7820 /* send it... */
7821 S (mp);
7822
7823 /* Wait for a reply... */
7824 W (ret);
7825 return ret;
7826}
7827
7828static int
7829api_bond_delete (vat_main_t * vam)
7830{
7831 unformat_input_t *i = vam->input;
7832 vl_api_bond_delete_t *mp;
7833 u32 sw_if_index = ~0;
7834 u8 sw_if_index_set = 0;
7835 int ret;
7836
7837 /* Parse args required to build the message */
7838 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7839 {
7840 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7841 sw_if_index_set = 1;
7842 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7843 sw_if_index_set = 1;
7844 else
7845 break;
7846 }
7847
7848 if (sw_if_index_set == 0)
7849 {
7850 errmsg ("missing vpp interface name. ");
7851 return -99;
7852 }
7853
7854 /* Construct the API message */
7855 M (BOND_DELETE, mp);
7856
7857 mp->sw_if_index = ntohl (sw_if_index);
7858
7859 /* send it... */
7860 S (mp);
7861
7862 /* Wait for a reply... */
7863 W (ret);
7864 return ret;
7865}
7866
7867static int
7868api_bond_enslave (vat_main_t * vam)
7869{
7870 unformat_input_t *i = vam->input;
7871 vl_api_bond_enslave_t *mp;
7872 u32 bond_sw_if_index;
7873 int ret;
7874 u8 is_passive;
7875 u8 is_long_timeout;
7876 u32 bond_sw_if_index_is_set = 0;
7877 u32 sw_if_index;
7878 u8 sw_if_index_is_set = 0;
7879
7880 /* Parse args required to build the message */
7881 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7882 {
7883 if (unformat (i, "sw_if_index %d", &sw_if_index))
7884 sw_if_index_is_set = 1;
7885 else if (unformat (i, "bond %u", &bond_sw_if_index))
7886 bond_sw_if_index_is_set = 1;
7887 else if (unformat (i, "passive %d", &is_passive))
7888 ;
7889 else if (unformat (i, "long-timeout %d", &is_long_timeout))
7890 ;
7891 else
7892 break;
7893 }
7894
7895 if (bond_sw_if_index_is_set == 0)
7896 {
7897 errmsg ("Missing bond sw_if_index. ");
7898 return -99;
7899 }
7900 if (sw_if_index_is_set == 0)
7901 {
7902 errmsg ("Missing slave sw_if_index. ");
7903 return -99;
7904 }
7905
7906 /* Construct the API message */
7907 M (BOND_ENSLAVE, mp);
7908
7909 mp->bond_sw_if_index = ntohl (bond_sw_if_index);
7910 mp->sw_if_index = ntohl (sw_if_index);
7911 mp->is_long_timeout = is_long_timeout;
7912 mp->is_passive = is_passive;
7913
7914 /* send it... */
7915 S (mp);
7916
7917 /* Wait for a reply... */
7918 W (ret);
7919 return ret;
7920}
7921
7922static int
7923api_bond_detach_slave (vat_main_t * vam)
7924{
7925 unformat_input_t *i = vam->input;
7926 vl_api_bond_detach_slave_t *mp;
7927 u32 sw_if_index = ~0;
7928 u8 sw_if_index_set = 0;
7929 int ret;
7930
7931 /* Parse args required to build the message */
7932 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7933 {
7934 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
7935 sw_if_index_set = 1;
7936 else if (unformat (i, "sw_if_index %d", &sw_if_index))
7937 sw_if_index_set = 1;
7938 else
7939 break;
7940 }
7941
7942 if (sw_if_index_set == 0)
7943 {
7944 errmsg ("missing vpp interface name. ");
7945 return -99;
7946 }
7947
7948 /* Construct the API message */
7949 M (BOND_DETACH_SLAVE, mp);
7950
7951 mp->sw_if_index = ntohl (sw_if_index);
7952
7953 /* send it... */
7954 S (mp);
7955
7956 /* Wait for a reply... */
7957 W (ret);
7958 return ret;
7959}
7960
7961static int
Neale Ranns28ab9cc2017-08-14 07:18:42 -07007962api_ip_table_add_del (vat_main_t * vam)
7963{
7964 unformat_input_t *i = vam->input;
7965 vl_api_ip_table_add_del_t *mp;
7966 u32 table_id = ~0;
7967 u8 is_ipv6 = 0;
7968 u8 is_add = 1;
7969 int ret = 0;
7970
7971 /* Parse args required to build the message */
7972 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
7973 {
7974 if (unformat (i, "ipv6"))
7975 is_ipv6 = 1;
7976 else if (unformat (i, "del"))
7977 is_add = 0;
7978 else if (unformat (i, "add"))
7979 is_add = 1;
7980 else if (unformat (i, "table %d", &table_id))
7981 ;
7982 else
7983 {
7984 clib_warning ("parse error '%U'", format_unformat_error, i);
7985 return -99;
7986 }
7987 }
7988
7989 if (~0 == table_id)
7990 {
7991 errmsg ("missing table-ID");
7992 return -99;
7993 }
7994
7995 /* Construct the API message */
7996 M (IP_TABLE_ADD_DEL, mp);
7997
7998 mp->table_id = ntohl (table_id);
7999 mp->is_ipv6 = is_ipv6;
8000 mp->is_add = is_add;
8001
8002 /* send it... */
8003 S (mp);
8004
8005 /* Wait for a reply... */
8006 W (ret);
8007
8008 return ret;
8009}
8010
8011static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01008012api_ip_add_del_route (vat_main_t * vam)
8013{
8014 unformat_input_t *i = vam->input;
8015 vl_api_ip_add_del_route_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008016 u32 sw_if_index = ~0, vrf_id = 0;
8017 u8 is_ipv6 = 0;
8018 u8 is_local = 0, is_drop = 0;
8019 u8 is_unreach = 0, is_prohibit = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008020 u8 is_add = 1;
8021 u32 next_hop_weight = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008022 u8 is_multipath = 0;
8023 u8 address_set = 0;
8024 u8 address_length_set = 0;
8025 u32 next_hop_table_id = 0;
8026 u32 resolve_attempts = 0;
8027 u32 dst_address_length = 0;
8028 u8 next_hop_set = 0;
8029 ip4_address_t v4_dst_address, v4_next_hop_address;
8030 ip6_address_t v6_dst_address, v6_next_hop_address;
8031 int count = 1;
8032 int j;
8033 f64 before = 0;
8034 u32 random_add_del = 0;
8035 u32 *random_vector = 0;
8036 uword *random_hash;
8037 u32 random_seed = 0xdeaddabe;
8038 u32 classify_table_index = ~0;
8039 u8 is_classify = 0;
8040 u8 resolve_host = 0, resolve_attached = 0;
John Loe166fd92018-09-13 14:08:59 -04008041 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008042 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8043 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8044
Dave Barachb7b92992018-10-17 10:38:51 -04008045 clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t));
8046 clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t));
Damjan Marion7cd468a2016-12-19 23:05:39 +01008047 /* Parse args required to build the message */
8048 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8049 {
8050 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8051 ;
8052 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8053 ;
8054 else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address))
8055 {
8056 address_set = 1;
8057 is_ipv6 = 0;
8058 }
8059 else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address))
8060 {
8061 address_set = 1;
8062 is_ipv6 = 1;
8063 }
8064 else if (unformat (i, "/%d", &dst_address_length))
8065 {
8066 address_length_set = 1;
8067 }
8068
8069 else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address,
8070 &v4_next_hop_address))
8071 {
8072 next_hop_set = 1;
8073 }
8074 else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address,
8075 &v6_next_hop_address))
8076 {
8077 next_hop_set = 1;
8078 }
John Lo22030432018-09-20 16:07:00 -04008079 else
8080 if (unformat
8081 (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index))
8082 {
8083 next_hop_set = 1;
8084 }
8085 else if (unformat (i, "via sw_if_index %d", &sw_if_index))
8086 {
8087 next_hop_set = 1;
8088 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01008089 else if (unformat (i, "resolve-attempts %d", &resolve_attempts))
8090 ;
8091 else if (unformat (i, "weight %d", &next_hop_weight))
8092 ;
8093 else if (unformat (i, "drop"))
8094 {
8095 is_drop = 1;
8096 }
8097 else if (unformat (i, "null-send-unreach"))
8098 {
8099 is_unreach = 1;
8100 }
8101 else if (unformat (i, "null-send-prohibit"))
8102 {
8103 is_prohibit = 1;
8104 }
8105 else if (unformat (i, "local"))
8106 {
8107 is_local = 1;
8108 }
8109 else if (unformat (i, "classify %d", &classify_table_index))
8110 {
8111 is_classify = 1;
8112 }
8113 else if (unformat (i, "del"))
8114 is_add = 0;
8115 else if (unformat (i, "add"))
8116 is_add = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008117 else if (unformat (i, "resolve-via-host"))
8118 resolve_host = 1;
8119 else if (unformat (i, "resolve-via-attached"))
8120 resolve_attached = 1;
8121 else if (unformat (i, "multipath"))
8122 is_multipath = 1;
8123 else if (unformat (i, "vrf %d", &vrf_id))
8124 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008125 else if (unformat (i, "count %d", &count))
8126 ;
8127 else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id))
8128 ;
8129 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
8130 ;
8131 else if (unformat (i, "out-label %d", &next_hop_out_label))
John Loe166fd92018-09-13 14:08:59 -04008132 {
8133 vl_api_fib_mpls_label_t fib_label = {
8134 .label = ntohl (next_hop_out_label),
8135 .ttl = 64,
8136 .exp = 0,
8137 };
8138 vec_add1 (next_hop_out_label_stack, fib_label);
8139 }
8140 else if (unformat (i, "via via-label %d", &next_hop_via_label))
Damjan Marion7cd468a2016-12-19 23:05:39 +01008141 ;
8142 else if (unformat (i, "random"))
8143 random_add_del = 1;
8144 else if (unformat (i, "seed %d", &random_seed))
8145 ;
8146 else
8147 {
8148 clib_warning ("parse error '%U'", format_unformat_error, i);
8149 return -99;
8150 }
8151 }
8152
8153 if (!next_hop_set && !is_drop && !is_local &&
8154 !is_classify && !is_unreach && !is_prohibit &&
8155 MPLS_LABEL_INVALID == next_hop_via_label)
8156 {
8157 errmsg
8158 ("next hop / local / drop / unreach / prohibit / classify not set");
8159 return -99;
8160 }
8161
8162 if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label)
8163 {
8164 errmsg ("next hop and next-hop via label set");
8165 return -99;
8166 }
8167 if (address_set == 0)
8168 {
8169 errmsg ("missing addresses");
8170 return -99;
8171 }
8172
8173 if (address_length_set == 0)
8174 {
8175 errmsg ("missing address length");
8176 return -99;
8177 }
8178
8179 /* Generate a pile of unique, random routes */
8180 if (random_add_del)
8181 {
8182 u32 this_random_address;
8183 random_hash = hash_create (count, sizeof (uword));
8184
8185 hash_set (random_hash, v4_next_hop_address.as_u32, 1);
8186 for (j = 0; j <= count; j++)
8187 {
8188 do
8189 {
8190 this_random_address = random_u32 (&random_seed);
8191 this_random_address =
8192 clib_host_to_net_u32 (this_random_address);
8193 }
8194 while (hash_get (random_hash, this_random_address));
8195 vec_add1 (random_vector, this_random_address);
8196 hash_set (random_hash, this_random_address, 1);
8197 }
8198 hash_free (random_hash);
8199 v4_dst_address.as_u32 = random_vector[0];
8200 }
8201
8202 if (count > 1)
8203 {
8204 /* Turn on async mode */
8205 vam->async_mode = 1;
8206 vam->async_errors = 0;
8207 before = vat_time_now (vam);
8208 }
8209
8210 for (j = 0; j < count; j++)
8211 {
8212 /* Construct the API message */
John Loe166fd92018-09-13 14:08:59 -04008213 M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) *
8214 vec_len (next_hop_out_label_stack));
Damjan Marion7cd468a2016-12-19 23:05:39 +01008215
8216 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8217 mp->table_id = ntohl (vrf_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008218
8219 mp->is_add = is_add;
8220 mp->is_drop = is_drop;
8221 mp->is_unreach = is_unreach;
8222 mp->is_prohibit = is_prohibit;
8223 mp->is_ipv6 = is_ipv6;
8224 mp->is_local = is_local;
8225 mp->is_classify = is_classify;
8226 mp->is_multipath = is_multipath;
8227 mp->is_resolve_host = resolve_host;
8228 mp->is_resolve_attached = resolve_attached;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008229 mp->next_hop_weight = next_hop_weight;
John Lo06fda9c2018-10-03 16:32:44 -04008230 mp->next_hop_preference = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008231 mp->dst_address_length = dst_address_length;
8232 mp->next_hop_table_id = ntohl (next_hop_table_id);
8233 mp->classify_table_index = ntohl (classify_table_index);
8234 mp->next_hop_via_label = ntohl (next_hop_via_label);
8235 mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8236 if (0 != mp->next_hop_n_out_labels)
8237 {
8238 memcpy (mp->next_hop_out_label_stack,
8239 next_hop_out_label_stack,
John Loe166fd92018-09-13 14:08:59 -04008240 (vec_len (next_hop_out_label_stack) *
8241 sizeof (vl_api_fib_mpls_label_t)));
Damjan Marion7cd468a2016-12-19 23:05:39 +01008242 vec_free (next_hop_out_label_stack);
8243 }
8244
8245 if (is_ipv6)
8246 {
8247 clib_memcpy (mp->dst_address, &v6_dst_address,
8248 sizeof (v6_dst_address));
8249 if (next_hop_set)
8250 clib_memcpy (mp->next_hop_address, &v6_next_hop_address,
8251 sizeof (v6_next_hop_address));
8252 increment_v6_address (&v6_dst_address);
8253 }
8254 else
8255 {
8256 clib_memcpy (mp->dst_address, &v4_dst_address,
8257 sizeof (v4_dst_address));
8258 if (next_hop_set)
8259 clib_memcpy (mp->next_hop_address, &v4_next_hop_address,
8260 sizeof (v4_next_hop_address));
8261 if (random_add_del)
8262 v4_dst_address.as_u32 = random_vector[j + 1];
8263 else
8264 increment_v4_address (&v4_dst_address);
8265 }
8266 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06008267 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008268 /* If we receive SIGTERM, stop now... */
8269 if (vam->do_exit)
8270 break;
8271 }
8272
8273 /* When testing multiple add/del ops, use a control-ping to sync */
8274 if (count > 1)
8275 {
Jon Loeliger2d23eca2017-02-01 13:09:58 -06008276 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008277 f64 after;
Jon Loeliger1f9191f2017-01-31 15:27:19 -06008278 f64 timeout;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008279
8280 /* Shut off async mode */
8281 vam->async_mode = 0;
8282
Dave Barach59b25652017-09-10 15:04:27 -04008283 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -06008284 S (mp_ping);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008285
8286 timeout = vat_time_now (vam) + 1.0;
8287 while (vat_time_now (vam) < timeout)
8288 if (vam->result_ready == 1)
8289 goto out;
8290 vam->retval = -99;
8291
8292 out:
8293 if (vam->retval == -99)
8294 errmsg ("timeout");
8295
8296 if (vam->async_errors > 0)
8297 {
8298 errmsg ("%d asynchronous errors", vam->async_errors);
8299 vam->retval = -98;
8300 }
8301 vam->async_errors = 0;
8302 after = vat_time_now (vam);
8303
8304 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8305 if (j > 0)
8306 count = j;
8307
8308 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8309 count, after - before, count / (after - before));
8310 }
8311 else
8312 {
Jon Loeliger56c7b012017-02-01 12:31:41 -06008313 int ret;
8314
Damjan Marion7cd468a2016-12-19 23:05:39 +01008315 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06008316 W (ret);
8317 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008318 }
8319
8320 /* Return the good/bad news */
8321 return (vam->retval);
8322}
8323
8324static int
Neale Ranns32e1c012016-11-22 17:07:28 +00008325api_ip_mroute_add_del (vat_main_t * vam)
8326{
8327 unformat_input_t *i = vam->input;
8328 vl_api_ip_mroute_add_del_t *mp;
Neale Ranns32e1c012016-11-22 17:07:28 +00008329 u32 sw_if_index = ~0, vrf_id = 0;
8330 u8 is_ipv6 = 0;
8331 u8 is_local = 0;
Neale Ranns32e1c012016-11-22 17:07:28 +00008332 u8 is_add = 1;
8333 u8 address_set = 0;
8334 u32 grp_address_length = 0;
8335 ip4_address_t v4_grp_address, v4_src_address;
8336 ip6_address_t v6_grp_address, v6_src_address;
8337 mfib_itf_flags_t iflags = 0;
8338 mfib_entry_flags_t eflags = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06008339 int ret;
Neale Ranns32e1c012016-11-22 17:07:28 +00008340
8341 /* Parse args required to build the message */
8342 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8343 {
8344 if (unformat (i, "sw_if_index %d", &sw_if_index))
8345 ;
8346 else if (unformat (i, "%U %U",
8347 unformat_ip4_address, &v4_src_address,
8348 unformat_ip4_address, &v4_grp_address))
8349 {
8350 grp_address_length = 64;
8351 address_set = 1;
8352 is_ipv6 = 0;
8353 }
8354 else if (unformat (i, "%U %U",
8355 unformat_ip6_address, &v6_src_address,
8356 unformat_ip6_address, &v6_grp_address))
8357 {
8358 grp_address_length = 256;
8359 address_set = 1;
8360 is_ipv6 = 1;
8361 }
8362 else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address))
8363 {
Dave Barachb7b92992018-10-17 10:38:51 -04008364 clib_memset (&v4_src_address, 0, sizeof (v4_src_address));
Neale Ranns32e1c012016-11-22 17:07:28 +00008365 grp_address_length = 32;
8366 address_set = 1;
8367 is_ipv6 = 0;
8368 }
8369 else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address))
8370 {
Dave Barachb7b92992018-10-17 10:38:51 -04008371 clib_memset (&v6_src_address, 0, sizeof (v6_src_address));
Neale Ranns32e1c012016-11-22 17:07:28 +00008372 grp_address_length = 128;
8373 address_set = 1;
8374 is_ipv6 = 1;
8375 }
8376 else if (unformat (i, "/%d", &grp_address_length))
8377 ;
8378 else if (unformat (i, "local"))
8379 {
8380 is_local = 1;
8381 }
8382 else if (unformat (i, "del"))
8383 is_add = 0;
8384 else if (unformat (i, "add"))
8385 is_add = 1;
8386 else if (unformat (i, "vrf %d", &vrf_id))
8387 ;
Neale Ranns32e1c012016-11-22 17:07:28 +00008388 else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags))
8389 ;
8390 else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags))
8391 ;
8392 else
8393 {
8394 clib_warning ("parse error '%U'", format_unformat_error, i);
8395 return -99;
8396 }
8397 }
8398
8399 if (address_set == 0)
8400 {
8401 errmsg ("missing addresses\n");
8402 return -99;
8403 }
8404
8405 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06008406 M (IP_MROUTE_ADD_DEL, mp);
Neale Ranns32e1c012016-11-22 17:07:28 +00008407
8408 mp->next_hop_sw_if_index = ntohl (sw_if_index);
8409 mp->table_id = ntohl (vrf_id);
Neale Ranns32e1c012016-11-22 17:07:28 +00008410
8411 mp->is_add = is_add;
8412 mp->is_ipv6 = is_ipv6;
8413 mp->is_local = is_local;
8414 mp->itf_flags = ntohl (iflags);
8415 mp->entry_flags = ntohl (eflags);
8416 mp->grp_address_length = grp_address_length;
8417 mp->grp_address_length = ntohs (mp->grp_address_length);
8418
8419 if (is_ipv6)
8420 {
8421 clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address));
8422 clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address));
8423 }
8424 else
8425 {
8426 clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address));
8427 clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address));
8428
8429 }
8430
8431 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06008432 S (mp);
Neale Ranns32e1c012016-11-22 17:07:28 +00008433 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06008434 W (ret);
8435 return ret;
Neale Ranns32e1c012016-11-22 17:07:28 +00008436}
8437
8438static int
Neale Ranns28ab9cc2017-08-14 07:18:42 -07008439api_mpls_table_add_del (vat_main_t * vam)
8440{
8441 unformat_input_t *i = vam->input;
8442 vl_api_mpls_table_add_del_t *mp;
8443 u32 table_id = ~0;
8444 u8 is_add = 1;
8445 int ret = 0;
8446
8447 /* Parse args required to build the message */
8448 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8449 {
Florin Corasd0a59722017-10-15 17:41:21 +00008450 if (unformat (i, "table %d", &table_id))
8451 ;
8452 else if (unformat (i, "del"))
Neale Ranns28ab9cc2017-08-14 07:18:42 -07008453 is_add = 0;
8454 else if (unformat (i, "add"))
8455 is_add = 1;
8456 else
8457 {
8458 clib_warning ("parse error '%U'", format_unformat_error, i);
8459 return -99;
8460 }
8461 }
8462
8463 if (~0 == table_id)
8464 {
8465 errmsg ("missing table-ID");
8466 return -99;
8467 }
8468
8469 /* Construct the API message */
8470 M (MPLS_TABLE_ADD_DEL, mp);
8471
8472 mp->mt_table_id = ntohl (table_id);
8473 mp->mt_is_add = is_add;
8474
8475 /* send it... */
8476 S (mp);
8477
8478 /* Wait for a reply... */
8479 W (ret);
8480
8481 return ret;
8482}
8483
8484static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01008485api_mpls_route_add_del (vat_main_t * vam)
8486{
8487 unformat_input_t *i = vam->input;
8488 vl_api_mpls_route_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008489 u32 sw_if_index = ~0, table_id = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008490 u8 is_add = 1;
8491 u32 next_hop_weight = 1;
8492 u8 is_multipath = 0;
8493 u32 next_hop_table_id = 0;
8494 u8 next_hop_set = 0;
8495 ip4_address_t v4_next_hop_address = {
8496 .as_u32 = 0,
8497 };
8498 ip6_address_t v6_next_hop_address = { {0} };
8499 int count = 1;
8500 int j;
8501 f64 before = 0;
8502 u32 classify_table_index = ~0;
8503 u8 is_classify = 0;
8504 u8 resolve_host = 0, resolve_attached = 0;
John Loe166fd92018-09-13 14:08:59 -04008505 u8 is_interface_rx = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008506 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
8507 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
John Loe166fd92018-09-13 14:08:59 -04008508 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008509 mpls_label_t local_label = MPLS_LABEL_INVALID;
8510 u8 is_eos = 0;
John Loe166fd92018-09-13 14:08:59 -04008511 dpo_proto_t next_hop_proto = DPO_PROTO_MPLS;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008512
8513 /* Parse args required to build the message */
8514 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8515 {
8516 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
8517 ;
8518 else if (unformat (i, "sw_if_index %d", &sw_if_index))
8519 ;
8520 else if (unformat (i, "%d", &local_label))
8521 ;
8522 else if (unformat (i, "eos"))
8523 is_eos = 1;
8524 else if (unformat (i, "non-eos"))
8525 is_eos = 0;
8526 else if (unformat (i, "via %U", unformat_ip4_address,
8527 &v4_next_hop_address))
8528 {
8529 next_hop_set = 1;
Neale Rannsda78f952017-05-24 09:15:43 -07008530 next_hop_proto = DPO_PROTO_IP4;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008531 }
8532 else if (unformat (i, "via %U", unformat_ip6_address,
8533 &v6_next_hop_address))
8534 {
8535 next_hop_set = 1;
Neale Rannsda78f952017-05-24 09:15:43 -07008536 next_hop_proto = DPO_PROTO_IP6;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008537 }
8538 else if (unformat (i, "weight %d", &next_hop_weight))
8539 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008540 else if (unformat (i, "classify %d", &classify_table_index))
8541 {
8542 is_classify = 1;
8543 }
8544 else if (unformat (i, "del"))
8545 is_add = 0;
8546 else if (unformat (i, "add"))
8547 is_add = 1;
8548 else if (unformat (i, "resolve-via-host"))
8549 resolve_host = 1;
8550 else if (unformat (i, "resolve-via-attached"))
8551 resolve_attached = 1;
8552 else if (unformat (i, "multipath"))
8553 is_multipath = 1;
8554 else if (unformat (i, "count %d", &count))
8555 ;
John Loe166fd92018-09-13 14:08:59 -04008556 else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id))
Damjan Marion7cd468a2016-12-19 23:05:39 +01008557 {
8558 next_hop_set = 1;
Neale Rannsda78f952017-05-24 09:15:43 -07008559 next_hop_proto = DPO_PROTO_IP4;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008560 }
John Loe166fd92018-09-13 14:08:59 -04008561 else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id))
Damjan Marion7cd468a2016-12-19 23:05:39 +01008562 {
8563 next_hop_set = 1;
Neale Rannsda78f952017-05-24 09:15:43 -07008564 next_hop_proto = DPO_PROTO_IP6;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008565 }
John Loe166fd92018-09-13 14:08:59 -04008566 else
8567 if (unformat
8568 (i, "via l2-input-on %U", api_unformat_sw_if_index, vam,
8569 &sw_if_index))
8570 {
8571 next_hop_set = 1;
8572 next_hop_proto = DPO_PROTO_ETHERNET;
8573 is_interface_rx = 1;
8574 }
8575 else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index))
8576 {
8577 next_hop_set = 1;
8578 next_hop_proto = DPO_PROTO_ETHERNET;
8579 is_interface_rx = 1;
8580 }
8581 else if (unformat (i, "via next-hop-table %d", &next_hop_table_id))
8582 next_hop_set = 1;
8583 else if (unformat (i, "via via-label %d", &next_hop_via_label))
8584 next_hop_set = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008585 else if (unformat (i, "out-label %d", &next_hop_out_label))
John Loe166fd92018-09-13 14:08:59 -04008586 {
8587 vl_api_fib_mpls_label_t fib_label = {
8588 .label = ntohl (next_hop_out_label),
8589 .ttl = 64,
8590 .exp = 0,
8591 };
8592 vec_add1 (next_hop_out_label_stack, fib_label);
8593 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01008594 else
8595 {
8596 clib_warning ("parse error '%U'", format_unformat_error, i);
8597 return -99;
8598 }
8599 }
8600
8601 if (!next_hop_set && !is_classify)
8602 {
8603 errmsg ("next hop / classify not set");
8604 return -99;
8605 }
8606
8607 if (MPLS_LABEL_INVALID == local_label)
8608 {
8609 errmsg ("missing label");
8610 return -99;
8611 }
8612
8613 if (count > 1)
8614 {
8615 /* Turn on async mode */
8616 vam->async_mode = 1;
8617 vam->async_errors = 0;
8618 before = vat_time_now (vam);
8619 }
8620
8621 for (j = 0; j < count; j++)
8622 {
8623 /* Construct the API message */
John Loe166fd92018-09-13 14:08:59 -04008624 M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
8625 vec_len (next_hop_out_label_stack));
Damjan Marion7cd468a2016-12-19 23:05:39 +01008626
8627 mp->mr_next_hop_sw_if_index = ntohl (sw_if_index);
8628 mp->mr_table_id = ntohl (table_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008629
8630 mp->mr_is_add = is_add;
Neale Rannsda78f952017-05-24 09:15:43 -07008631 mp->mr_next_hop_proto = next_hop_proto;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008632 mp->mr_is_classify = is_classify;
8633 mp->mr_is_multipath = is_multipath;
8634 mp->mr_is_resolve_host = resolve_host;
8635 mp->mr_is_resolve_attached = resolve_attached;
John Loe166fd92018-09-13 14:08:59 -04008636 mp->mr_is_interface_rx = is_interface_rx;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008637 mp->mr_next_hop_weight = next_hop_weight;
John Lo06fda9c2018-10-03 16:32:44 -04008638 mp->mr_next_hop_preference = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008639 mp->mr_next_hop_table_id = ntohl (next_hop_table_id);
8640 mp->mr_classify_table_index = ntohl (classify_table_index);
8641 mp->mr_next_hop_via_label = ntohl (next_hop_via_label);
8642 mp->mr_label = ntohl (local_label);
8643 mp->mr_eos = is_eos;
8644
8645 mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
8646 if (0 != mp->mr_next_hop_n_out_labels)
8647 {
8648 memcpy (mp->mr_next_hop_out_label_stack,
8649 next_hop_out_label_stack,
John Loe166fd92018-09-13 14:08:59 -04008650 vec_len (next_hop_out_label_stack) *
8651 sizeof (vl_api_fib_mpls_label_t));
Damjan Marion7cd468a2016-12-19 23:05:39 +01008652 vec_free (next_hop_out_label_stack);
8653 }
8654
8655 if (next_hop_set)
8656 {
Neale Rannsda78f952017-05-24 09:15:43 -07008657 if (DPO_PROTO_IP4 == next_hop_proto)
Damjan Marion7cd468a2016-12-19 23:05:39 +01008658 {
8659 clib_memcpy (mp->mr_next_hop,
8660 &v4_next_hop_address,
8661 sizeof (v4_next_hop_address));
8662 }
Neale Rannsda78f952017-05-24 09:15:43 -07008663 else if (DPO_PROTO_IP6 == next_hop_proto)
8664
Damjan Marion7cd468a2016-12-19 23:05:39 +01008665 {
8666 clib_memcpy (mp->mr_next_hop,
8667 &v6_next_hop_address,
8668 sizeof (v6_next_hop_address));
8669 }
8670 }
8671 local_label++;
8672
8673 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06008674 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008675 /* If we receive SIGTERM, stop now... */
8676 if (vam->do_exit)
8677 break;
8678 }
8679
8680 /* When testing multiple add/del ops, use a control-ping to sync */
8681 if (count > 1)
8682 {
Jon Loeliger2d23eca2017-02-01 13:09:58 -06008683 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008684 f64 after;
Jon Loeliger1f9191f2017-01-31 15:27:19 -06008685 f64 timeout;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008686
8687 /* Shut off async mode */
8688 vam->async_mode = 0;
8689
Dave Barach59b25652017-09-10 15:04:27 -04008690 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -06008691 S (mp_ping);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008692
8693 timeout = vat_time_now (vam) + 1.0;
8694 while (vat_time_now (vam) < timeout)
8695 if (vam->result_ready == 1)
8696 goto out;
8697 vam->retval = -99;
8698
8699 out:
8700 if (vam->retval == -99)
8701 errmsg ("timeout");
8702
8703 if (vam->async_errors > 0)
8704 {
8705 errmsg ("%d asynchronous errors", vam->async_errors);
8706 vam->retval = -98;
8707 }
8708 vam->async_errors = 0;
8709 after = vat_time_now (vam);
8710
8711 /* slim chance, but we might have eaten SIGTERM on the first iteration */
8712 if (j > 0)
8713 count = j;
8714
8715 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec",
8716 count, after - before, count / (after - before));
8717 }
8718 else
8719 {
Jon Loeliger56c7b012017-02-01 12:31:41 -06008720 int ret;
8721
Damjan Marion7cd468a2016-12-19 23:05:39 +01008722 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06008723 W (ret);
8724 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008725 }
8726
8727 /* Return the good/bad news */
8728 return (vam->retval);
8729}
8730
8731static int
8732api_mpls_ip_bind_unbind (vat_main_t * vam)
8733{
8734 unformat_input_t *i = vam->input;
8735 vl_api_mpls_ip_bind_unbind_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008736 u32 ip_table_id = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008737 u8 is_bind = 1;
8738 u8 is_ip4 = 1;
8739 ip4_address_t v4_address;
8740 ip6_address_t v6_address;
8741 u32 address_length;
8742 u8 address_set = 0;
8743 mpls_label_t local_label = MPLS_LABEL_INVALID;
Jon Loeliger56c7b012017-02-01 12:31:41 -06008744 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008745
8746 /* Parse args required to build the message */
8747 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8748 {
8749 if (unformat (i, "%U/%d", unformat_ip4_address,
8750 &v4_address, &address_length))
8751 {
8752 is_ip4 = 1;
8753 address_set = 1;
8754 }
8755 else if (unformat (i, "%U/%d", unformat_ip6_address,
8756 &v6_address, &address_length))
8757 {
8758 is_ip4 = 0;
8759 address_set = 1;
8760 }
8761 else if (unformat (i, "%d", &local_label))
8762 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008763 else if (unformat (i, "table-id %d", &ip_table_id))
8764 ;
8765 else if (unformat (i, "unbind"))
8766 is_bind = 0;
8767 else if (unformat (i, "bind"))
8768 is_bind = 1;
8769 else
8770 {
8771 clib_warning ("parse error '%U'", format_unformat_error, i);
8772 return -99;
8773 }
8774 }
8775
8776 if (!address_set)
8777 {
Paul Vinciguerraec11b132018-09-24 05:25:00 -07008778 errmsg ("IP address not set");
Damjan Marion7cd468a2016-12-19 23:05:39 +01008779 return -99;
8780 }
8781
8782 if (MPLS_LABEL_INVALID == local_label)
8783 {
8784 errmsg ("missing label");
8785 return -99;
8786 }
8787
8788 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06008789 M (MPLS_IP_BIND_UNBIND, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008790
Damjan Marion7cd468a2016-12-19 23:05:39 +01008791 mp->mb_is_bind = is_bind;
8792 mp->mb_is_ip4 = is_ip4;
8793 mp->mb_ip_table_id = ntohl (ip_table_id);
8794 mp->mb_mpls_table_id = 0;
8795 mp->mb_label = ntohl (local_label);
8796 mp->mb_address_length = address_length;
8797
8798 if (is_ip4)
8799 clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address));
8800 else
8801 clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address));
8802
8803 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06008804 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01008805
8806 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -06008807 W (ret);
8808 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01008809}
8810
8811static int
John Loe166fd92018-09-13 14:08:59 -04008812api_sr_mpls_policy_add (vat_main_t * vam)
8813{
8814 unformat_input_t *i = vam->input;
8815 vl_api_sr_mpls_policy_add_t *mp;
8816 u32 bsid = 0;
8817 u32 weight = 1;
8818 u8 type = 0;
8819 u8 n_segments = 0;
8820 u32 sid;
8821 u32 *segments = NULL;
8822 int ret;
8823
8824 /* Parse args required to build the message */
8825 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8826 {
8827 if (unformat (i, "bsid %d", &bsid))
8828 ;
8829 else if (unformat (i, "weight %d", &weight))
8830 ;
8831 else if (unformat (i, "spray"))
8832 type = 1;
8833 else if (unformat (i, "next %d", &sid))
8834 {
8835 n_segments += 1;
8836 vec_add1 (segments, htonl (sid));
8837 }
8838 else
8839 {
8840 clib_warning ("parse error '%U'", format_unformat_error, i);
8841 return -99;
8842 }
8843 }
8844
8845 if (bsid == 0)
8846 {
8847 errmsg ("bsid not set");
8848 return -99;
8849 }
8850
8851 if (n_segments == 0)
8852 {
8853 errmsg ("no sid in segment stack");
8854 return -99;
8855 }
8856
8857 /* Construct the API message */
8858 M2 (SR_MPLS_POLICY_ADD, mp, sizeof (u32) * n_segments);
8859
8860 mp->bsid = htonl (bsid);
8861 mp->weight = htonl (weight);
8862 mp->type = type;
8863 mp->n_segments = n_segments;
8864 memcpy (mp->segments, segments, sizeof (u32) * n_segments);
8865 vec_free (segments);
8866
8867 /* send it... */
8868 S (mp);
8869
8870 /* Wait for a reply... */
8871 W (ret);
8872 return ret;
8873}
8874
8875static int
8876api_sr_mpls_policy_del (vat_main_t * vam)
8877{
8878 unformat_input_t *i = vam->input;
8879 vl_api_sr_mpls_policy_del_t *mp;
8880 u32 bsid = 0;
8881 int ret;
8882
8883 /* Parse args required to build the message */
8884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8885 {
8886 if (unformat (i, "bsid %d", &bsid))
8887 ;
8888 else
8889 {
8890 clib_warning ("parse error '%U'", format_unformat_error, i);
8891 return -99;
8892 }
8893 }
8894
8895 if (bsid == 0)
8896 {
8897 errmsg ("bsid not set");
8898 return -99;
8899 }
8900
8901 /* Construct the API message */
8902 M (SR_MPLS_POLICY_DEL, mp);
8903
8904 mp->bsid = htonl (bsid);
8905
8906 /* send it... */
8907 S (mp);
8908
8909 /* Wait for a reply... */
8910 W (ret);
8911 return ret;
8912}
8913
8914static int
Neale Rannsd792d9c2017-10-21 10:53:20 -07008915api_bier_table_add_del (vat_main_t * vam)
8916{
8917 unformat_input_t *i = vam->input;
8918 vl_api_bier_table_add_del_t *mp;
8919 u8 is_add = 1;
8920 u32 set = 0, sub_domain = 0, hdr_len = 3;
8921 mpls_label_t local_label = MPLS_LABEL_INVALID;
8922 int ret;
8923
8924 /* Parse args required to build the message */
8925 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8926 {
8927 if (unformat (i, "sub-domain %d", &sub_domain))
8928 ;
8929 else if (unformat (i, "set %d", &set))
8930 ;
8931 else if (unformat (i, "label %d", &local_label))
8932 ;
8933 else if (unformat (i, "hdr-len %d", &hdr_len))
8934 ;
8935 else if (unformat (i, "add"))
8936 is_add = 1;
8937 else if (unformat (i, "del"))
8938 is_add = 0;
8939 else
8940 {
8941 clib_warning ("parse error '%U'", format_unformat_error, i);
8942 return -99;
8943 }
8944 }
8945
8946 if (MPLS_LABEL_INVALID == local_label)
8947 {
8948 errmsg ("missing label\n");
8949 return -99;
8950 }
8951
8952 /* Construct the API message */
8953 M (BIER_TABLE_ADD_DEL, mp);
8954
8955 mp->bt_is_add = is_add;
8956 mp->bt_label = ntohl (local_label);
8957 mp->bt_tbl_id.bt_set = set;
8958 mp->bt_tbl_id.bt_sub_domain = sub_domain;
8959 mp->bt_tbl_id.bt_hdr_len_id = hdr_len;
8960
8961 /* send it... */
8962 S (mp);
8963
8964 /* Wait for a reply... */
8965 W (ret);
8966
8967 return (ret);
8968}
8969
8970static int
8971api_bier_route_add_del (vat_main_t * vam)
8972{
8973 unformat_input_t *i = vam->input;
8974 vl_api_bier_route_add_del_t *mp;
8975 u8 is_add = 1;
8976 u32 set = 0, sub_domain = 0, hdr_len = 3, bp = 0;
8977 ip4_address_t v4_next_hop_address;
8978 ip6_address_t v6_next_hop_address;
8979 u8 next_hop_set = 0;
8980 u8 next_hop_proto_is_ip4 = 1;
8981 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
8982 int ret;
8983
8984 /* Parse args required to build the message */
8985 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
8986 {
8987 if (unformat (i, "%U", unformat_ip4_address, &v4_next_hop_address))
8988 {
8989 next_hop_proto_is_ip4 = 1;
8990 next_hop_set = 1;
8991 }
8992 else if (unformat (i, "%U", unformat_ip6_address, &v6_next_hop_address))
8993 {
8994 next_hop_proto_is_ip4 = 0;
8995 next_hop_set = 1;
8996 }
8997 if (unformat (i, "sub-domain %d", &sub_domain))
8998 ;
8999 else if (unformat (i, "set %d", &set))
9000 ;
9001 else if (unformat (i, "hdr-len %d", &hdr_len))
9002 ;
9003 else if (unformat (i, "bp %d", &bp))
9004 ;
9005 else if (unformat (i, "add"))
9006 is_add = 1;
9007 else if (unformat (i, "del"))
9008 is_add = 0;
9009 else if (unformat (i, "out-label %d", &next_hop_out_label))
9010 ;
9011 else
9012 {
9013 clib_warning ("parse error '%U'", format_unformat_error, i);
9014 return -99;
9015 }
9016 }
9017
9018 if (!next_hop_set || (MPLS_LABEL_INVALID == next_hop_out_label))
9019 {
9020 errmsg ("next hop / label set\n");
9021 return -99;
9022 }
9023 if (0 == bp)
9024 {
9025 errmsg ("bit=position not set\n");
9026 return -99;
9027 }
9028
9029 /* Construct the API message */
Neale Ranns31ed7442018-02-23 05:29:09 -08009030 M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t));
Neale Rannsd792d9c2017-10-21 10:53:20 -07009031
9032 mp->br_is_add = is_add;
9033 mp->br_tbl_id.bt_set = set;
9034 mp->br_tbl_id.bt_sub_domain = sub_domain;
9035 mp->br_tbl_id.bt_hdr_len_id = hdr_len;
9036 mp->br_bp = ntohs (bp);
9037 mp->br_n_paths = 1;
9038 mp->br_paths[0].n_labels = 1;
Neale Ranns31ed7442018-02-23 05:29:09 -08009039 mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label);
Neale Rannsd792d9c2017-10-21 10:53:20 -07009040 mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1);
9041
9042 if (next_hop_proto_is_ip4)
9043 {
9044 clib_memcpy (mp->br_paths[0].next_hop,
9045 &v4_next_hop_address, sizeof (v4_next_hop_address));
9046 }
9047 else
9048 {
9049 clib_memcpy (mp->br_paths[0].next_hop,
9050 &v6_next_hop_address, sizeof (v6_next_hop_address));
9051 }
9052
9053 /* send it... */
9054 S (mp);
9055
9056 /* Wait for a reply... */
9057 W (ret);
9058
9059 return (ret);
9060}
9061
9062static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01009063api_proxy_arp_add_del (vat_main_t * vam)
9064{
9065 unformat_input_t *i = vam->input;
9066 vl_api_proxy_arp_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009067 u32 vrf_id = 0;
9068 u8 is_add = 1;
Neale Ranns37029302018-08-10 05:30:06 -07009069 vl_api_ip4_address_t lo, hi;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009070 u8 range_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009071 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009072
9073 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9074 {
9075 if (unformat (i, "vrf %d", &vrf_id))
9076 ;
Neale Ranns37029302018-08-10 05:30:06 -07009077 else if (unformat (i, "%U - %U", unformat_vl_api_ip4_address, &lo,
9078 unformat_vl_api_ip4_address, &hi))
Damjan Marion7cd468a2016-12-19 23:05:39 +01009079 range_set = 1;
9080 else if (unformat (i, "del"))
9081 is_add = 0;
9082 else
9083 {
9084 clib_warning ("parse error '%U'", format_unformat_error, i);
9085 return -99;
9086 }
9087 }
9088
9089 if (range_set == 0)
9090 {
9091 errmsg ("address range not set");
9092 return -99;
9093 }
9094
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009095 M (PROXY_ARP_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009096
Neale Ranns37029302018-08-10 05:30:06 -07009097 mp->proxy.table_id = ntohl (vrf_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009098 mp->is_add = is_add;
Neale Ranns37029302018-08-10 05:30:06 -07009099 clib_memcpy (mp->proxy.low, &lo, sizeof (lo));
9100 clib_memcpy (mp->proxy.hi, &hi, sizeof (hi));
Damjan Marion7cd468a2016-12-19 23:05:39 +01009101
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009102 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009103 W (ret);
9104 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009105}
9106
9107static int
9108api_proxy_arp_intfc_enable_disable (vat_main_t * vam)
9109{
9110 unformat_input_t *i = vam->input;
9111 vl_api_proxy_arp_intfc_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009112 u32 sw_if_index;
9113 u8 enable = 1;
9114 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009115 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009116
9117 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9118 {
9119 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9120 sw_if_index_set = 1;
9121 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9122 sw_if_index_set = 1;
9123 else if (unformat (i, "enable"))
9124 enable = 1;
9125 else if (unformat (i, "disable"))
9126 enable = 0;
9127 else
9128 {
9129 clib_warning ("parse error '%U'", format_unformat_error, i);
9130 return -99;
9131 }
9132 }
9133
9134 if (sw_if_index_set == 0)
9135 {
9136 errmsg ("missing interface name or sw_if_index");
9137 return -99;
9138 }
9139
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009140 M (PROXY_ARP_INTFC_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009141
9142 mp->sw_if_index = ntohl (sw_if_index);
9143 mp->enable_disable = enable;
9144
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009145 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009146 W (ret);
9147 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009148}
9149
9150static int
9151api_mpls_tunnel_add_del (vat_main_t * vam)
9152{
9153 unformat_input_t *i = vam->input;
9154 vl_api_mpls_tunnel_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009155
9156 u8 is_add = 1;
9157 u8 l2_only = 0;
9158 u32 sw_if_index = ~0;
9159 u32 next_hop_sw_if_index = ~0;
9160 u32 next_hop_proto_is_ip4 = 1;
9161
9162 u32 next_hop_table_id = 0;
9163 ip4_address_t v4_next_hop_address = {
9164 .as_u32 = 0,
9165 };
9166 ip6_address_t v6_next_hop_address = { {0} };
John Lo06fda9c2018-10-03 16:32:44 -04009167 vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL;
John Loe166fd92018-09-13 14:08:59 -04009168 mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID;
John Lo06fda9c2018-10-03 16:32:44 -04009169 mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009170 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009171
9172 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9173 {
9174 if (unformat (i, "add"))
9175 is_add = 1;
John Lo06fda9c2018-10-03 16:32:44 -04009176 else
9177 if (unformat
9178 (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
9179 is_add = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009180 else if (unformat (i, "del sw_if_index %d", &sw_if_index))
9181 is_add = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009182 else if (unformat (i, "via %U",
9183 unformat_ip4_address, &v4_next_hop_address))
9184 {
9185 next_hop_proto_is_ip4 = 1;
9186 }
9187 else if (unformat (i, "via %U",
9188 unformat_ip6_address, &v6_next_hop_address))
9189 {
9190 next_hop_proto_is_ip4 = 0;
9191 }
John Loe166fd92018-09-13 14:08:59 -04009192 else if (unformat (i, "via-label %d", &next_hop_via_label))
9193 ;
John Lo06fda9c2018-10-03 16:32:44 -04009194 else
9195 if (unformat
9196 (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index))
9197 ;
9198 else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index))
9199 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009200 else if (unformat (i, "l2-only"))
9201 l2_only = 1;
9202 else if (unformat (i, "next-hop-table %d", &next_hop_table_id))
9203 ;
9204 else if (unformat (i, "out-label %d", &next_hop_out_label))
John Lo06fda9c2018-10-03 16:32:44 -04009205 {
9206 vl_api_fib_mpls_label_t fib_label = {
9207 .label = ntohl (next_hop_out_label),
9208 .ttl = 64,
9209 .exp = 0,
9210 };
9211 vec_add1 (next_hop_out_label_stack, fib_label);
9212 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01009213 else
9214 {
9215 clib_warning ("parse error '%U'", format_unformat_error, i);
9216 return -99;
9217 }
9218 }
9219
John Lo06fda9c2018-10-03 16:32:44 -04009220 M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
9221 vec_len (next_hop_out_label_stack));
Damjan Marion7cd468a2016-12-19 23:05:39 +01009222
9223 mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index);
9224 mp->mt_sw_if_index = ntohl (sw_if_index);
9225 mp->mt_is_add = is_add;
9226 mp->mt_l2_only = l2_only;
9227 mp->mt_next_hop_table_id = ntohl (next_hop_table_id);
9228 mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4;
John Loe166fd92018-09-13 14:08:59 -04009229 mp->mt_next_hop_via_label = ntohl (next_hop_via_label);
John Lo06fda9c2018-10-03 16:32:44 -04009230 mp->mt_next_hop_weight = 1;
9231 mp->mt_next_hop_preference = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009232
John Lo06fda9c2018-10-03 16:32:44 -04009233 mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009234
9235 if (0 != mp->mt_next_hop_n_out_labels)
9236 {
John Lo06fda9c2018-10-03 16:32:44 -04009237 clib_memcpy (mp->mt_next_hop_out_label_stack,
9238 next_hop_out_label_stack,
9239 (vec_len (next_hop_out_label_stack) *
9240 sizeof (vl_api_fib_mpls_label_t)));
9241 vec_free (next_hop_out_label_stack);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009242 }
9243
9244 if (next_hop_proto_is_ip4)
9245 {
9246 clib_memcpy (mp->mt_next_hop,
9247 &v4_next_hop_address, sizeof (v4_next_hop_address));
9248 }
9249 else
9250 {
9251 clib_memcpy (mp->mt_next_hop,
9252 &v6_next_hop_address, sizeof (v6_next_hop_address));
9253 }
9254
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009255 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009256 W (ret);
9257 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009258}
9259
9260static int
9261api_sw_interface_set_unnumbered (vat_main_t * vam)
9262{
9263 unformat_input_t *i = vam->input;
9264 vl_api_sw_interface_set_unnumbered_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009265 u32 sw_if_index;
9266 u32 unnum_sw_index = ~0;
9267 u8 is_add = 1;
9268 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009269 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009270
9271 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9272 {
9273 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9274 sw_if_index_set = 1;
9275 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9276 sw_if_index_set = 1;
9277 else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
9278 ;
9279 else if (unformat (i, "del"))
9280 is_add = 0;
9281 else
9282 {
9283 clib_warning ("parse error '%U'", format_unformat_error, i);
9284 return -99;
9285 }
9286 }
9287
9288 if (sw_if_index_set == 0)
9289 {
9290 errmsg ("missing interface name or sw_if_index");
9291 return -99;
9292 }
9293
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009294 M (SW_INTERFACE_SET_UNNUMBERED, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009295
9296 mp->sw_if_index = ntohl (sw_if_index);
9297 mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
9298 mp->is_add = is_add;
9299
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009300 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009301 W (ret);
9302 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009303}
9304
9305static int
9306api_ip_neighbor_add_del (vat_main_t * vam)
9307{
Neale Ranns37029302018-08-10 05:30:06 -07009308 vl_api_mac_address_t mac_address;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009309 unformat_input_t *i = vam->input;
9310 vl_api_ip_neighbor_add_del_t *mp;
Neale Ranns37029302018-08-10 05:30:06 -07009311 vl_api_address_t ip_address;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009312 u32 sw_if_index;
9313 u8 sw_if_index_set = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009314 u8 is_add = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009315 u8 mac_set = 0;
Neale Ranns37029302018-08-10 05:30:06 -07009316 u8 address_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009317 int ret;
Neale Ranns37029302018-08-10 05:30:06 -07009318 ip_neighbor_flags_t flags;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009319
Neale Ranns37029302018-08-10 05:30:06 -07009320 flags = IP_NEIGHBOR_FLAG_NONE;
9321 clib_memset (&ip_address, 0, sizeof (ip_address));
9322 clib_memset (&mac_address, 0, sizeof (mac_address));
Damjan Marion7cd468a2016-12-19 23:05:39 +01009323 /* Parse args required to build the message */
9324 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9325 {
Neale Ranns37029302018-08-10 05:30:06 -07009326 if (unformat (i, "mac %U", unformat_vl_api_mac_address, &mac_address))
Damjan Marion7cd468a2016-12-19 23:05:39 +01009327 {
9328 mac_set = 1;
9329 }
9330 else if (unformat (i, "del"))
9331 is_add = 0;
9332 else
9333 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9334 sw_if_index_set = 1;
9335 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9336 sw_if_index_set = 1;
Neale Ranns37029302018-08-10 05:30:06 -07009337 else if (unformat (i, "static"))
9338 flags |= IP_NEIGHBOR_FLAG_STATIC;
Neale Rannsb3b2de72017-03-08 05:17:22 -08009339 else if (unformat (i, "no-fib-entry"))
Neale Ranns37029302018-08-10 05:30:06 -07009340 flags |= IP_NEIGHBOR_FLAG_NO_FIB_ENTRY;
9341 else if (unformat (i, "dst %U", unformat_vl_api_address, &ip_address))
9342 address_set = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009343 else
9344 {
9345 clib_warning ("parse error '%U'", format_unformat_error, i);
9346 return -99;
9347 }
9348 }
9349
9350 if (sw_if_index_set == 0)
9351 {
9352 errmsg ("missing interface name or sw_if_index");
9353 return -99;
9354 }
Neale Ranns37029302018-08-10 05:30:06 -07009355 if (!address_set)
Damjan Marion7cd468a2016-12-19 23:05:39 +01009356 {
9357 errmsg ("no address set");
9358 return -99;
9359 }
9360
9361 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009362 M (IP_NEIGHBOR_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009363
Neale Ranns37029302018-08-10 05:30:06 -07009364 mp->neighbor.sw_if_index = ntohl (sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009365 mp->is_add = is_add;
Neale Ranns37029302018-08-10 05:30:06 -07009366 mp->neighbor.flags = htonl (flags);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009367 if (mac_set)
Neale Ranns37029302018-08-10 05:30:06 -07009368 clib_memcpy (&mp->neighbor.mac_address, &mac_address,
9369 sizeof (mac_address));
9370 if (address_set)
9371 clib_memcpy (&mp->neighbor.ip_address, &ip_address, sizeof (ip_address));
Damjan Marion7cd468a2016-12-19 23:05:39 +01009372
9373 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009374 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009375
9376 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -06009377 W (ret);
9378 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009379}
9380
9381static int
Damjan Marion7cd468a2016-12-19 23:05:39 +01009382api_create_vlan_subif (vat_main_t * vam)
9383{
9384 unformat_input_t *i = vam->input;
9385 vl_api_create_vlan_subif_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009386 u32 sw_if_index;
9387 u8 sw_if_index_set = 0;
9388 u32 vlan_id;
9389 u8 vlan_id_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009390 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009391
9392 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9393 {
9394 if (unformat (i, "sw_if_index %d", &sw_if_index))
9395 sw_if_index_set = 1;
9396 else
9397 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9398 sw_if_index_set = 1;
9399 else if (unformat (i, "vlan %d", &vlan_id))
9400 vlan_id_set = 1;
9401 else
9402 {
9403 clib_warning ("parse error '%U'", format_unformat_error, i);
9404 return -99;
9405 }
9406 }
9407
9408 if (sw_if_index_set == 0)
9409 {
9410 errmsg ("missing interface name or sw_if_index");
9411 return -99;
9412 }
9413
9414 if (vlan_id_set == 0)
9415 {
9416 errmsg ("missing vlan_id");
9417 return -99;
9418 }
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009419 M (CREATE_VLAN_SUBIF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009420
9421 mp->sw_if_index = ntohl (sw_if_index);
9422 mp->vlan_id = ntohl (vlan_id);
9423
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009424 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009425 W (ret);
9426 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009427}
9428
9429#define foreach_create_subif_bit \
9430_(no_tags) \
9431_(one_tag) \
9432_(two_tags) \
9433_(dot1ad) \
9434_(exact_match) \
9435_(default_sub) \
9436_(outer_vlan_id_any) \
9437_(inner_vlan_id_any)
9438
9439static int
9440api_create_subif (vat_main_t * vam)
9441{
9442 unformat_input_t *i = vam->input;
9443 vl_api_create_subif_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009444 u32 sw_if_index;
9445 u8 sw_if_index_set = 0;
9446 u32 sub_id;
9447 u8 sub_id_set = 0;
9448 u32 no_tags = 0;
9449 u32 one_tag = 0;
9450 u32 two_tags = 0;
9451 u32 dot1ad = 0;
9452 u32 exact_match = 0;
9453 u32 default_sub = 0;
9454 u32 outer_vlan_id_any = 0;
9455 u32 inner_vlan_id_any = 0;
9456 u32 tmp;
9457 u16 outer_vlan_id = 0;
9458 u16 inner_vlan_id = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009459 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009460
9461 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9462 {
9463 if (unformat (i, "sw_if_index %d", &sw_if_index))
9464 sw_if_index_set = 1;
9465 else
9466 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9467 sw_if_index_set = 1;
9468 else if (unformat (i, "sub_id %d", &sub_id))
9469 sub_id_set = 1;
9470 else if (unformat (i, "outer_vlan_id %d", &tmp))
9471 outer_vlan_id = tmp;
9472 else if (unformat (i, "inner_vlan_id %d", &tmp))
9473 inner_vlan_id = tmp;
9474
9475#define _(a) else if (unformat (i, #a)) a = 1 ;
9476 foreach_create_subif_bit
9477#undef _
9478 else
9479 {
9480 clib_warning ("parse error '%U'", format_unformat_error, i);
9481 return -99;
9482 }
9483 }
9484
9485 if (sw_if_index_set == 0)
9486 {
9487 errmsg ("missing interface name or sw_if_index");
9488 return -99;
9489 }
9490
9491 if (sub_id_set == 0)
9492 {
9493 errmsg ("missing sub_id");
9494 return -99;
9495 }
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009496 M (CREATE_SUBIF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009497
9498 mp->sw_if_index = ntohl (sw_if_index);
9499 mp->sub_id = ntohl (sub_id);
9500
Ole Trøan3b0d7e42019-03-15 16:14:41 +00009501#define _(a) mp->a = a;
9502 foreach_create_subif_bit;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009503#undef _
9504
9505 mp->outer_vlan_id = ntohs (outer_vlan_id);
9506 mp->inner_vlan_id = ntohs (inner_vlan_id);
9507
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009508 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009509 W (ret);
9510 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009511}
9512
9513static int
9514api_oam_add_del (vat_main_t * vam)
9515{
9516 unformat_input_t *i = vam->input;
9517 vl_api_oam_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009518 u32 vrf_id = 0;
9519 u8 is_add = 1;
9520 ip4_address_t src, dst;
9521 u8 src_set = 0;
9522 u8 dst_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009523 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009524
9525 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9526 {
9527 if (unformat (i, "vrf %d", &vrf_id))
9528 ;
9529 else if (unformat (i, "src %U", unformat_ip4_address, &src))
9530 src_set = 1;
9531 else if (unformat (i, "dst %U", unformat_ip4_address, &dst))
9532 dst_set = 1;
9533 else if (unformat (i, "del"))
9534 is_add = 0;
9535 else
9536 {
9537 clib_warning ("parse error '%U'", format_unformat_error, i);
9538 return -99;
9539 }
9540 }
9541
9542 if (src_set == 0)
9543 {
9544 errmsg ("missing src addr");
9545 return -99;
9546 }
9547
9548 if (dst_set == 0)
9549 {
9550 errmsg ("missing dst addr");
9551 return -99;
9552 }
9553
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009554 M (OAM_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009555
9556 mp->vrf_id = ntohl (vrf_id);
9557 mp->is_add = is_add;
9558 clib_memcpy (mp->src_address, &src, sizeof (mp->src_address));
9559 clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address));
9560
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009561 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009562 W (ret);
9563 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009564}
9565
9566static int
9567api_reset_fib (vat_main_t * vam)
9568{
9569 unformat_input_t *i = vam->input;
9570 vl_api_reset_fib_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009571 u32 vrf_id = 0;
9572 u8 is_ipv6 = 0;
9573 u8 vrf_id_set = 0;
9574
Jon Loeliger56c7b012017-02-01 12:31:41 -06009575 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009576 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9577 {
9578 if (unformat (i, "vrf %d", &vrf_id))
9579 vrf_id_set = 1;
9580 else if (unformat (i, "ipv6"))
9581 is_ipv6 = 1;
9582 else
9583 {
9584 clib_warning ("parse error '%U'", format_unformat_error, i);
9585 return -99;
9586 }
9587 }
9588
9589 if (vrf_id_set == 0)
9590 {
9591 errmsg ("missing vrf id");
9592 return -99;
9593 }
9594
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009595 M (RESET_FIB, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009596
9597 mp->vrf_id = ntohl (vrf_id);
9598 mp->is_ipv6 = is_ipv6;
9599
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009600 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009601 W (ret);
9602 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009603}
9604
9605static int
9606api_dhcp_proxy_config (vat_main_t * vam)
9607{
9608 unformat_input_t *i = vam->input;
9609 vl_api_dhcp_proxy_config_t *mp;
Neale Ranns20a175a2017-02-14 07:28:41 -08009610 u32 rx_vrf_id = 0;
9611 u32 server_vrf_id = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009612 u8 is_add = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009613 u8 v4_address_set = 0;
9614 u8 v6_address_set = 0;
9615 ip4_address_t v4address;
9616 ip6_address_t v6address;
9617 u8 v4_src_address_set = 0;
9618 u8 v6_src_address_set = 0;
9619 ip4_address_t v4srcaddress;
9620 ip6_address_t v6srcaddress;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009621 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009622
9623 /* Parse args required to build the message */
9624 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9625 {
9626 if (unformat (i, "del"))
9627 is_add = 0;
Neale Ranns20a175a2017-02-14 07:28:41 -08009628 else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id))
Damjan Marion7cd468a2016-12-19 23:05:39 +01009629 ;
Neale Ranns20a175a2017-02-14 07:28:41 -08009630 else if (unformat (i, "server_vrf_id %d", &server_vrf_id))
Damjan Marion7cd468a2016-12-19 23:05:39 +01009631 ;
9632 else if (unformat (i, "svr %U", unformat_ip4_address, &v4address))
9633 v4_address_set = 1;
9634 else if (unformat (i, "svr %U", unformat_ip6_address, &v6address))
9635 v6_address_set = 1;
9636 else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress))
9637 v4_src_address_set = 1;
9638 else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress))
9639 v6_src_address_set = 1;
9640 else
9641 break;
9642 }
9643
9644 if (v4_address_set && v6_address_set)
9645 {
9646 errmsg ("both v4 and v6 server addresses set");
9647 return -99;
9648 }
9649 if (!v4_address_set && !v6_address_set)
9650 {
9651 errmsg ("no server addresses set");
9652 return -99;
9653 }
9654
9655 if (v4_src_address_set && v6_src_address_set)
9656 {
9657 errmsg ("both v4 and v6 src addresses set");
9658 return -99;
9659 }
9660 if (!v4_src_address_set && !v6_src_address_set)
9661 {
9662 errmsg ("no src addresses set");
9663 return -99;
9664 }
9665
9666 if (!(v4_src_address_set && v4_address_set) &&
9667 !(v6_src_address_set && v6_address_set))
9668 {
9669 errmsg ("no matching server and src addresses set");
9670 return -99;
9671 }
9672
9673 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009674 M (DHCP_PROXY_CONFIG, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009675
Damjan Marion7cd468a2016-12-19 23:05:39 +01009676 mp->is_add = is_add;
Neale Ranns20a175a2017-02-14 07:28:41 -08009677 mp->rx_vrf_id = ntohl (rx_vrf_id);
9678 mp->server_vrf_id = ntohl (server_vrf_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009679 if (v6_address_set)
9680 {
9681 mp->is_ipv6 = 1;
9682 clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address));
9683 clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address));
9684 }
9685 else
9686 {
9687 clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address));
9688 clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address));
9689 }
9690
9691 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009692 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009693
9694 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -06009695 W (ret);
9696 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009697}
9698
Neale Ranns20a175a2017-02-14 07:28:41 -08009699#define vl_api_dhcp_proxy_details_t_endian vl_noop_handler
9700#define vl_api_dhcp_proxy_details_t_print vl_noop_handler
9701
9702static void
9703vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +01009704{
Neale Ranns20a175a2017-02-14 07:28:41 -08009705 vat_main_t *vam = &vat_main;
Neale Ranns3466c302017-02-16 07:45:03 -08009706 u32 i, count = mp->count;
9707 vl_api_dhcp_server_t *s;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009708
Neale Ranns20a175a2017-02-14 07:28:41 -08009709 if (mp->is_ipv6)
9710 print (vam->ofp,
John Lo70bfcaf2017-11-14 13:19:26 -05009711 "RX Table-ID %d, Source Address %U, VSS Type %d, "
Igor Mikhailov (imichail)26f341a2018-02-12 13:45:51 -08009712 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
Neale Ranns20a175a2017-02-14 07:28:41 -08009713 ntohl (mp->rx_vrf_id),
Neale Ranns20a175a2017-02-14 07:28:41 -08009714 format_ip6_address, mp->dhcp_src_address,
John Lo70bfcaf2017-11-14 13:19:26 -05009715 mp->vss_type, mp->vss_vpn_ascii_id,
Neale Ranns20a175a2017-02-14 07:28:41 -08009716 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
9717 else
9718 print (vam->ofp,
John Lo70bfcaf2017-11-14 13:19:26 -05009719 "RX Table-ID %d, Source Address %U, VSS Type %d, "
Igor Mikhailov (imichail)26f341a2018-02-12 13:45:51 -08009720 "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d",
Neale Ranns20a175a2017-02-14 07:28:41 -08009721 ntohl (mp->rx_vrf_id),
Neale Ranns20a175a2017-02-14 07:28:41 -08009722 format_ip4_address, mp->dhcp_src_address,
John Lo70bfcaf2017-11-14 13:19:26 -05009723 mp->vss_type, mp->vss_vpn_ascii_id,
Neale Ranns20a175a2017-02-14 07:28:41 -08009724 ntohl (mp->vss_oui), ntohl (mp->vss_fib_id));
Neale Ranns3466c302017-02-16 07:45:03 -08009725
9726 for (i = 0; i < count; i++)
9727 {
9728 s = &mp->servers[i];
9729
9730 if (mp->is_ipv6)
9731 print (vam->ofp,
9732 " Server Table-ID %d, Server Address %U",
9733 ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server);
9734 else
9735 print (vam->ofp,
9736 " Server Table-ID %d, Server Address %U",
9737 ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server);
9738 }
Neale Ranns20a175a2017-02-14 07:28:41 -08009739}
Damjan Marion7cd468a2016-12-19 23:05:39 +01009740
Neale Ranns20a175a2017-02-14 07:28:41 -08009741static void vl_api_dhcp_proxy_details_t_handler_json
9742 (vl_api_dhcp_proxy_details_t * mp)
9743{
9744 vat_main_t *vam = &vat_main;
9745 vat_json_node_t *node = NULL;
Neale Ranns3466c302017-02-16 07:45:03 -08009746 u32 i, count = mp->count;
Neale Ranns20a175a2017-02-14 07:28:41 -08009747 struct in_addr ip4;
9748 struct in6_addr ip6;
Neale Ranns3466c302017-02-16 07:45:03 -08009749 vl_api_dhcp_server_t *s;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009750
Neale Ranns20a175a2017-02-14 07:28:41 -08009751 if (VAT_JSON_ARRAY != vam->json_tree.type)
Damjan Marion7cd468a2016-12-19 23:05:39 +01009752 {
Neale Ranns20a175a2017-02-14 07:28:41 -08009753 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
9754 vat_json_init_array (&vam->json_tree);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009755 }
Neale Ranns20a175a2017-02-14 07:28:41 -08009756 node = vat_json_array_add (&vam->json_tree);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009757
Neale Ranns20a175a2017-02-14 07:28:41 -08009758 vat_json_init_object (node);
9759 vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id));
John Lo70bfcaf2017-11-14 13:19:26 -05009760 vat_json_object_add_bytes (node, "vss-type", &mp->vss_type,
9761 sizeof (mp->vss_type));
9762 vat_json_object_add_string_copy (node, "vss-vpn-ascii-id",
9763 mp->vss_vpn_ascii_id);
Neale Ranns3466c302017-02-16 07:45:03 -08009764 vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id));
9765 vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui));
9766
Neale Ranns20a175a2017-02-14 07:28:41 -08009767 if (mp->is_ipv6)
Damjan Marion7cd468a2016-12-19 23:05:39 +01009768 {
Neale Ranns20a175a2017-02-14 07:28:41 -08009769 clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6));
9770 vat_json_object_add_ip6 (node, "src_address", ip6);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009771 }
9772 else
9773 {
Neale Ranns20a175a2017-02-14 07:28:41 -08009774 clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4));
9775 vat_json_object_add_ip4 (node, "src_address", ip4);
9776 }
Neale Ranns3466c302017-02-16 07:45:03 -08009777
9778 for (i = 0; i < count; i++)
9779 {
9780 s = &mp->servers[i];
9781
9782 vat_json_object_add_uint (node, "server-table-id",
9783 ntohl (s->server_vrf_id));
9784
9785 if (mp->is_ipv6)
9786 {
9787 clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4));
9788 vat_json_object_add_ip4 (node, "src_address", ip4);
9789 }
9790 else
9791 {
9792 clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6));
9793 vat_json_object_add_ip6 (node, "server_address", ip6);
9794 }
9795 }
Neale Ranns20a175a2017-02-14 07:28:41 -08009796}
9797
9798static int
9799api_dhcp_proxy_dump (vat_main_t * vam)
9800{
9801 unformat_input_t *i = vam->input;
9802 vl_api_control_ping_t *mp_ping;
9803 vl_api_dhcp_proxy_dump_t *mp;
9804 u8 is_ipv6 = 0;
9805 int ret;
9806
9807 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9808 {
9809 if (unformat (i, "ipv6"))
9810 is_ipv6 = 1;
9811 else
9812 {
9813 clib_warning ("parse error '%U'", format_unformat_error, i);
9814 return -99;
9815 }
Damjan Marion7cd468a2016-12-19 23:05:39 +01009816 }
9817
Neale Ranns20a175a2017-02-14 07:28:41 -08009818 M (DHCP_PROXY_DUMP, mp);
9819
9820 mp->is_ip6 = is_ipv6;
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009821 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009822
Neale Ranns20a175a2017-02-14 07:28:41 -08009823 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -04009824 MPING (CONTROL_PING, mp_ping);
Neale Ranns20a175a2017-02-14 07:28:41 -08009825 S (mp_ping);
9826
Jon Loeliger56c7b012017-02-01 12:31:41 -06009827 W (ret);
9828 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009829}
9830
9831static int
9832api_dhcp_proxy_set_vss (vat_main_t * vam)
9833{
9834 unformat_input_t *i = vam->input;
9835 vl_api_dhcp_proxy_set_vss_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009836 u8 is_ipv6 = 0;
9837 u8 is_add = 1;
John Lo70bfcaf2017-11-14 13:19:26 -05009838 u32 tbl_id = ~0;
9839 u8 vss_type = VSS_TYPE_DEFAULT;
9840 u8 *vpn_ascii_id = 0;
9841 u32 oui = 0;
9842 u32 fib_id = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009843 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009844
9845 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9846 {
9847 if (unformat (i, "tbl_id %d", &tbl_id))
John Lo70bfcaf2017-11-14 13:19:26 -05009848 ;
9849 else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id))
9850 vss_type = VSS_TYPE_ASCII;
9851 else if (unformat (i, "fib_id %d", &fib_id))
9852 vss_type = VSS_TYPE_VPN_ID;
9853 else if (unformat (i, "oui %d", &oui))
9854 vss_type = VSS_TYPE_VPN_ID;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009855 else if (unformat (i, "ipv6"))
9856 is_ipv6 = 1;
9857 else if (unformat (i, "del"))
9858 is_add = 0;
9859 else
John Lo70bfcaf2017-11-14 13:19:26 -05009860 break;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009861 }
9862
John Lo70bfcaf2017-11-14 13:19:26 -05009863 if (tbl_id == ~0)
Damjan Marion7cd468a2016-12-19 23:05:39 +01009864 {
John Lo70bfcaf2017-11-14 13:19:26 -05009865 errmsg ("missing tbl_id ");
9866 vec_free (vpn_ascii_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009867 return -99;
9868 }
9869
John Lo70bfcaf2017-11-14 13:19:26 -05009870 if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128))
Damjan Marion7cd468a2016-12-19 23:05:39 +01009871 {
John Lo70bfcaf2017-11-14 13:19:26 -05009872 errmsg ("vpn_ascii_id cannot be longer than 128 ");
9873 vec_free (vpn_ascii_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009874 return -99;
9875 }
9876
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009877 M (DHCP_PROXY_SET_VSS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009878 mp->tbl_id = ntohl (tbl_id);
John Lo70bfcaf2017-11-14 13:19:26 -05009879 mp->vss_type = vss_type;
9880 if (vpn_ascii_id)
9881 {
9882 clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id));
9883 mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0;
9884 }
9885 mp->vpn_index = ntohl (fib_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009886 mp->oui = ntohl (oui);
9887 mp->is_ipv6 = is_ipv6;
9888 mp->is_add = is_add;
9889
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009890 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009891 W (ret);
John Lo70bfcaf2017-11-14 13:19:26 -05009892
9893 vec_free (vpn_ascii_id);
Jon Loeliger56c7b012017-02-01 12:31:41 -06009894 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009895}
9896
9897static int
9898api_dhcp_client_config (vat_main_t * vam)
9899{
9900 unformat_input_t *i = vam->input;
9901 vl_api_dhcp_client_config_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009902 u32 sw_if_index;
9903 u8 sw_if_index_set = 0;
9904 u8 is_add = 1;
9905 u8 *hostname = 0;
9906 u8 disable_event = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009907 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009908
9909 /* Parse args required to build the message */
9910 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9911 {
9912 if (unformat (i, "del"))
9913 is_add = 0;
9914 else
9915 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
9916 sw_if_index_set = 1;
9917 else if (unformat (i, "sw_if_index %d", &sw_if_index))
9918 sw_if_index_set = 1;
9919 else if (unformat (i, "hostname %s", &hostname))
9920 ;
9921 else if (unformat (i, "disable_event"))
9922 disable_event = 1;
9923 else
9924 break;
9925 }
9926
9927 if (sw_if_index_set == 0)
9928 {
9929 errmsg ("missing interface name or sw_if_index");
9930 return -99;
9931 }
9932
9933 if (vec_len (hostname) > 63)
9934 {
9935 errmsg ("hostname too long");
9936 }
9937 vec_add1 (hostname, 0);
9938
9939 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -06009940 M (DHCP_CLIENT_CONFIG, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009941
Damjan Marion7cd468a2016-12-19 23:05:39 +01009942 mp->is_add = is_add;
Neale Rannsdaff1782018-05-16 04:12:18 -07009943 mp->client.sw_if_index = htonl (sw_if_index);
9944 clib_memcpy (mp->client.hostname, hostname, vec_len (hostname));
9945 vec_free (hostname);
9946 mp->client.want_dhcp_event = disable_event ? 0 : 1;
9947 mp->client.pid = htonl (getpid ());
Damjan Marion7cd468a2016-12-19 23:05:39 +01009948
9949 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -06009950 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +01009951
9952 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -06009953 W (ret);
9954 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009955}
9956
9957static int
9958api_set_ip_flow_hash (vat_main_t * vam)
9959{
9960 unformat_input_t *i = vam->input;
9961 vl_api_set_ip_flow_hash_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009962 u32 vrf_id = 0;
9963 u8 is_ipv6 = 0;
9964 u8 vrf_id_set = 0;
9965 u8 src = 0;
9966 u8 dst = 0;
9967 u8 sport = 0;
9968 u8 dport = 0;
9969 u8 proto = 0;
9970 u8 reverse = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -06009971 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +01009972
9973 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
9974 {
9975 if (unformat (i, "vrf %d", &vrf_id))
9976 vrf_id_set = 1;
9977 else if (unformat (i, "ipv6"))
9978 is_ipv6 = 1;
9979 else if (unformat (i, "src"))
9980 src = 1;
9981 else if (unformat (i, "dst"))
9982 dst = 1;
9983 else if (unformat (i, "sport"))
9984 sport = 1;
9985 else if (unformat (i, "dport"))
9986 dport = 1;
9987 else if (unformat (i, "proto"))
9988 proto = 1;
9989 else if (unformat (i, "reverse"))
9990 reverse = 1;
9991
9992 else
9993 {
9994 clib_warning ("parse error '%U'", format_unformat_error, i);
9995 return -99;
9996 }
9997 }
9998
9999 if (vrf_id_set == 0)
10000 {
10001 errmsg ("missing vrf id");
10002 return -99;
10003 }
10004
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010005 M (SET_IP_FLOW_HASH, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010006 mp->src = src;
10007 mp->dst = dst;
10008 mp->sport = sport;
10009 mp->dport = dport;
10010 mp->proto = proto;
10011 mp->reverse = reverse;
10012 mp->vrf_id = ntohl (vrf_id);
10013 mp->is_ipv6 = is_ipv6;
10014
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010015 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010016 W (ret);
10017 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010018}
10019
10020static int
10021api_sw_interface_ip6_enable_disable (vat_main_t * vam)
10022{
10023 unformat_input_t *i = vam->input;
10024 vl_api_sw_interface_ip6_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010025 u32 sw_if_index;
10026 u8 sw_if_index_set = 0;
10027 u8 enable = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010028 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010029
10030 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10031 {
10032 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10033 sw_if_index_set = 1;
10034 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10035 sw_if_index_set = 1;
10036 else if (unformat (i, "enable"))
10037 enable = 1;
10038 else if (unformat (i, "disable"))
10039 enable = 0;
10040 else
10041 {
10042 clib_warning ("parse error '%U'", format_unformat_error, i);
10043 return -99;
10044 }
10045 }
10046
10047 if (sw_if_index_set == 0)
10048 {
10049 errmsg ("missing interface name or sw_if_index");
10050 return -99;
10051 }
10052
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010053 M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010054
10055 mp->sw_if_index = ntohl (sw_if_index);
10056 mp->enable = enable;
10057
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010058 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010059 W (ret);
10060 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010061}
10062
10063static int
Neale Ranns3f844d02017-02-18 00:03:54 -080010064api_ip6nd_proxy_add_del (vat_main_t * vam)
10065{
10066 unformat_input_t *i = vam->input;
10067 vl_api_ip6nd_proxy_add_del_t *mp;
10068 u32 sw_if_index = ~0;
10069 u8 v6_address_set = 0;
Neale Ranns37029302018-08-10 05:30:06 -070010070 vl_api_ip6_address_t v6address;
Neale Ranns3f844d02017-02-18 00:03:54 -080010071 u8 is_del = 0;
10072 int ret;
10073
10074 /* Parse args required to build the message */
10075 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10076 {
10077 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10078 ;
10079 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10080 ;
Neale Ranns37029302018-08-10 05:30:06 -070010081 else if (unformat (i, "%U", unformat_vl_api_ip6_address, &v6address))
Neale Ranns3f844d02017-02-18 00:03:54 -080010082 v6_address_set = 1;
10083 if (unformat (i, "del"))
10084 is_del = 1;
10085 else
10086 {
10087 clib_warning ("parse error '%U'", format_unformat_error, i);
10088 return -99;
10089 }
10090 }
10091
10092 if (sw_if_index == ~0)
10093 {
10094 errmsg ("missing interface name or sw_if_index");
10095 return -99;
10096 }
10097 if (!v6_address_set)
10098 {
10099 errmsg ("no address set");
10100 return -99;
10101 }
10102
10103 /* Construct the API message */
10104 M (IP6ND_PROXY_ADD_DEL, mp);
10105
10106 mp->is_del = is_del;
10107 mp->sw_if_index = ntohl (sw_if_index);
Neale Ranns37029302018-08-10 05:30:06 -070010108 clib_memcpy (mp->ip, v6address, sizeof (v6address));
Neale Ranns3f844d02017-02-18 00:03:54 -080010109
10110 /* send it... */
10111 S (mp);
10112
10113 /* Wait for a reply, return good/bad news */
10114 W (ret);
10115 return ret;
10116}
10117
10118static int
10119api_ip6nd_proxy_dump (vat_main_t * vam)
10120{
10121 vl_api_ip6nd_proxy_dump_t *mp;
10122 vl_api_control_ping_t *mp_ping;
10123 int ret;
10124
10125 M (IP6ND_PROXY_DUMP, mp);
10126
10127 S (mp);
10128
10129 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040010130 MPING (CONTROL_PING, mp_ping);
Neale Ranns3f844d02017-02-18 00:03:54 -080010131 S (mp_ping);
10132
10133 W (ret);
10134 return ret;
10135}
10136
10137static void vl_api_ip6nd_proxy_details_t_handler
10138 (vl_api_ip6nd_proxy_details_t * mp)
10139{
10140 vat_main_t *vam = &vat_main;
10141
10142 print (vam->ofp, "host %U sw_if_index %d",
Neale Ranns37029302018-08-10 05:30:06 -070010143 format_vl_api_ip6_address, mp->ip, ntohl (mp->sw_if_index));
Neale Ranns3f844d02017-02-18 00:03:54 -080010144}
10145
10146static void vl_api_ip6nd_proxy_details_t_handler_json
10147 (vl_api_ip6nd_proxy_details_t * mp)
10148{
10149 vat_main_t *vam = &vat_main;
10150 struct in6_addr ip6;
10151 vat_json_node_t *node = NULL;
10152
10153 if (VAT_JSON_ARRAY != vam->json_tree.type)
10154 {
10155 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
10156 vat_json_init_array (&vam->json_tree);
10157 }
10158 node = vat_json_array_add (&vam->json_tree);
10159
10160 vat_json_init_object (node);
10161 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
10162
Neale Ranns37029302018-08-10 05:30:06 -070010163 clib_memcpy (&ip6, mp->ip, sizeof (ip6));
Neale Ranns3f844d02017-02-18 00:03:54 -080010164 vat_json_object_add_ip6 (node, "host", ip6);
10165}
Damjan Marion7cd468a2016-12-19 23:05:39 +010010166
10167static int
10168api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam)
10169{
10170 unformat_input_t *i = vam->input;
10171 vl_api_sw_interface_ip6nd_ra_prefix_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010172 u32 sw_if_index;
10173 u8 sw_if_index_set = 0;
10174 u32 address_length = 0;
10175 u8 v6_address_set = 0;
Neale Ranns37029302018-08-10 05:30:06 -070010176 vl_api_prefix_t pfx;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010177 u8 use_default = 0;
10178 u8 no_advertise = 0;
10179 u8 off_link = 0;
10180 u8 no_autoconfig = 0;
10181 u8 no_onlink = 0;
10182 u8 is_no = 0;
10183 u32 val_lifetime = 0;
10184 u32 pref_lifetime = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010185 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010186
10187 /* Parse args required to build the message */
10188 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10189 {
10190 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10191 sw_if_index_set = 1;
10192 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10193 sw_if_index_set = 1;
Neale Ranns37029302018-08-10 05:30:06 -070010194 else if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
Damjan Marion7cd468a2016-12-19 23:05:39 +010010195 v6_address_set = 1;
10196 else if (unformat (i, "val_life %d", &val_lifetime))
10197 ;
10198 else if (unformat (i, "pref_life %d", &pref_lifetime))
10199 ;
10200 else if (unformat (i, "def"))
10201 use_default = 1;
10202 else if (unformat (i, "noadv"))
10203 no_advertise = 1;
10204 else if (unformat (i, "offl"))
10205 off_link = 1;
10206 else if (unformat (i, "noauto"))
10207 no_autoconfig = 1;
10208 else if (unformat (i, "nolink"))
10209 no_onlink = 1;
10210 else if (unformat (i, "isno"))
10211 is_no = 1;
10212 else
10213 {
10214 clib_warning ("parse error '%U'", format_unformat_error, i);
10215 return -99;
10216 }
10217 }
10218
10219 if (sw_if_index_set == 0)
10220 {
10221 errmsg ("missing interface name or sw_if_index");
10222 return -99;
10223 }
10224 if (!v6_address_set)
10225 {
10226 errmsg ("no address set");
10227 return -99;
10228 }
10229
10230 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010231 M (SW_INTERFACE_IP6ND_RA_PREFIX, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010232
10233 mp->sw_if_index = ntohl (sw_if_index);
Neale Ranns37029302018-08-10 05:30:06 -070010234 clib_memcpy (&mp->prefix, &pfx, sizeof (pfx));
Damjan Marion7cd468a2016-12-19 23:05:39 +010010235 mp->use_default = use_default;
10236 mp->no_advertise = no_advertise;
10237 mp->off_link = off_link;
10238 mp->no_autoconfig = no_autoconfig;
10239 mp->no_onlink = no_onlink;
10240 mp->is_no = is_no;
10241 mp->val_lifetime = ntohl (val_lifetime);
10242 mp->pref_lifetime = ntohl (pref_lifetime);
10243
10244 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010245 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010246
10247 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -060010248 W (ret);
10249 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010250}
10251
10252static int
10253api_sw_interface_ip6nd_ra_config (vat_main_t * vam)
10254{
10255 unformat_input_t *i = vam->input;
10256 vl_api_sw_interface_ip6nd_ra_config_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010257 u32 sw_if_index;
10258 u8 sw_if_index_set = 0;
10259 u8 suppress = 0;
10260 u8 managed = 0;
10261 u8 other = 0;
10262 u8 ll_option = 0;
10263 u8 send_unicast = 0;
10264 u8 cease = 0;
10265 u8 is_no = 0;
10266 u8 default_router = 0;
10267 u32 max_interval = 0;
10268 u32 min_interval = 0;
10269 u32 lifetime = 0;
10270 u32 initial_count = 0;
10271 u32 initial_interval = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010272 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010273
10274
10275 /* Parse args required to build the message */
10276 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10277 {
10278 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
10279 sw_if_index_set = 1;
10280 else if (unformat (i, "sw_if_index %d", &sw_if_index))
10281 sw_if_index_set = 1;
10282 else if (unformat (i, "maxint %d", &max_interval))
10283 ;
10284 else if (unformat (i, "minint %d", &min_interval))
10285 ;
10286 else if (unformat (i, "life %d", &lifetime))
10287 ;
10288 else if (unformat (i, "count %d", &initial_count))
10289 ;
10290 else if (unformat (i, "interval %d", &initial_interval))
10291 ;
10292 else if (unformat (i, "suppress") || unformat (i, "surpress"))
10293 suppress = 1;
10294 else if (unformat (i, "managed"))
10295 managed = 1;
10296 else if (unformat (i, "other"))
10297 other = 1;
10298 else if (unformat (i, "ll"))
10299 ll_option = 1;
10300 else if (unformat (i, "send"))
10301 send_unicast = 1;
10302 else if (unformat (i, "cease"))
10303 cease = 1;
10304 else if (unformat (i, "isno"))
10305 is_no = 1;
10306 else if (unformat (i, "def"))
10307 default_router = 1;
10308 else
10309 {
10310 clib_warning ("parse error '%U'", format_unformat_error, i);
10311 return -99;
10312 }
10313 }
10314
10315 if (sw_if_index_set == 0)
10316 {
10317 errmsg ("missing interface name or sw_if_index");
10318 return -99;
10319 }
10320
10321 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010322 M (SW_INTERFACE_IP6ND_RA_CONFIG, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010323
10324 mp->sw_if_index = ntohl (sw_if_index);
10325 mp->max_interval = ntohl (max_interval);
10326 mp->min_interval = ntohl (min_interval);
10327 mp->lifetime = ntohl (lifetime);
10328 mp->initial_count = ntohl (initial_count);
10329 mp->initial_interval = ntohl (initial_interval);
10330 mp->suppress = suppress;
10331 mp->managed = managed;
10332 mp->other = other;
10333 mp->ll_option = ll_option;
10334 mp->send_unicast = send_unicast;
10335 mp->cease = cease;
10336 mp->is_no = is_no;
10337 mp->default_router = default_router;
10338
10339 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010340 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010341
10342 /* Wait for a reply, return good/bad news */
Jon Loeliger56c7b012017-02-01 12:31:41 -060010343 W (ret);
10344 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010345}
10346
10347static int
10348api_set_arp_neighbor_limit (vat_main_t * vam)
10349{
10350 unformat_input_t *i = vam->input;
10351 vl_api_set_arp_neighbor_limit_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010352 u32 arp_nbr_limit;
10353 u8 limit_set = 0;
10354 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010355 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010356
10357 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10358 {
10359 if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit))
10360 limit_set = 1;
10361 else if (unformat (i, "ipv6"))
10362 is_ipv6 = 1;
10363 else
10364 {
10365 clib_warning ("parse error '%U'", format_unformat_error, i);
10366 return -99;
10367 }
10368 }
10369
10370 if (limit_set == 0)
10371 {
10372 errmsg ("missing limit value");
10373 return -99;
10374 }
10375
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010376 M (SET_ARP_NEIGHBOR_LIMIT, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010377
10378 mp->arp_neighbor_limit = ntohl (arp_nbr_limit);
10379 mp->is_ipv6 = is_ipv6;
10380
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010381 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010382 W (ret);
10383 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010384}
10385
10386static int
10387api_l2_patch_add_del (vat_main_t * vam)
10388{
10389 unformat_input_t *i = vam->input;
10390 vl_api_l2_patch_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010391 u32 rx_sw_if_index;
10392 u8 rx_sw_if_index_set = 0;
10393 u32 tx_sw_if_index;
10394 u8 tx_sw_if_index_set = 0;
10395 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010396 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010397
10398 /* Parse args required to build the message */
10399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10400 {
10401 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
10402 rx_sw_if_index_set = 1;
10403 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
10404 tx_sw_if_index_set = 1;
10405 else if (unformat (i, "rx"))
10406 {
10407 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10408 {
10409 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10410 &rx_sw_if_index))
10411 rx_sw_if_index_set = 1;
10412 }
10413 else
10414 break;
10415 }
10416 else if (unformat (i, "tx"))
10417 {
10418 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10419 {
10420 if (unformat (i, "%U", api_unformat_sw_if_index, vam,
10421 &tx_sw_if_index))
10422 tx_sw_if_index_set = 1;
10423 }
10424 else
10425 break;
10426 }
10427 else if (unformat (i, "del"))
10428 is_add = 0;
10429 else
10430 break;
10431 }
10432
10433 if (rx_sw_if_index_set == 0)
10434 {
10435 errmsg ("missing rx interface name or rx_sw_if_index");
10436 return -99;
10437 }
10438
10439 if (tx_sw_if_index_set == 0)
10440 {
10441 errmsg ("missing tx interface name or tx_sw_if_index");
10442 return -99;
10443 }
10444
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010445 M (L2_PATCH_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010446
10447 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
10448 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
10449 mp->is_add = is_add;
10450
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010451 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010452 W (ret);
10453 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010454}
10455
Pablo Camarillofb380952016-12-07 18:34:18 +010010456u8 is_del;
10457u8 localsid_addr[16];
10458u8 end_psp;
10459u8 behavior;
10460u32 sw_if_index;
10461u32 vlan_index;
10462u32 fib_table;
10463u8 nh_addr[16];
10464
10465static int
10466api_sr_localsid_add_del (vat_main_t * vam)
10467{
10468 unformat_input_t *i = vam->input;
10469 vl_api_sr_localsid_add_del_t *mp;
10470
10471 u8 is_del;
10472 ip6_address_t localsid;
10473 u8 end_psp = 0;
10474 u8 behavior = ~0;
10475 u32 sw_if_index;
10476 u32 fib_table = ~(u32) 0;
Pablo Camarillo3337bd22018-06-19 15:49:02 +020010477 ip6_address_t nh_addr6;
10478 ip4_address_t nh_addr4;
Dave Barachb7b92992018-10-17 10:38:51 -040010479 clib_memset (&nh_addr6, 0, sizeof (ip6_address_t));
10480 clib_memset (&nh_addr4, 0, sizeof (ip4_address_t));
Pablo Camarillofb380952016-12-07 18:34:18 +010010481
10482 bool nexthop_set = 0;
10483
10484 int ret;
10485
10486 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
10487 {
10488 if (unformat (i, "del"))
10489 is_del = 1;
10490 else if (unformat (i, "address %U", unformat_ip6_address, &localsid));
Pablo Camarillo3337bd22018-06-19 15:49:02 +020010491 else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4))
10492 nexthop_set = 1;
10493 else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6))
Pablo Camarillofb380952016-12-07 18:34:18 +010010494 nexthop_set = 1;
10495 else if (unformat (i, "behavior %u", &behavior));
10496 else if (unformat (i, "sw_if_index %u", &sw_if_index));
10497 else if (unformat (i, "fib-table %u", &fib_table));
10498 else if (unformat (i, "end.psp %u", &behavior));
10499 else
10500 break;
10501 }
10502
10503 M (SR_LOCALSID_ADD_DEL, mp);
10504
Pablo Camarillo3337bd22018-06-19 15:49:02 +020010505 clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid));
Pablo Camarillofb380952016-12-07 18:34:18 +010010506 if (nexthop_set)
Pablo Camarillo3337bd22018-06-19 15:49:02 +020010507 {
Lijian Zhangec2a9bb2018-08-28 10:18:24 +080010508 clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6));
10509 clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4));
Pablo Camarillo3337bd22018-06-19 15:49:02 +020010510 }
Pablo Camarillofb380952016-12-07 18:34:18 +010010511 mp->behavior = behavior;
10512 mp->sw_if_index = ntohl (sw_if_index);
10513 mp->fib_table = ntohl (fib_table);
10514 mp->end_psp = end_psp;
10515 mp->is_del = is_del;
10516
10517 S (mp);
10518 W (ret);
10519 return ret;
10520}
10521
Damjan Marion7cd468a2016-12-19 23:05:39 +010010522static int
10523api_ioam_enable (vat_main_t * vam)
10524{
10525 unformat_input_t *input = vam->input;
10526 vl_api_ioam_enable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010527 u32 id = 0;
10528 int has_trace_option = 0;
10529 int has_pot_option = 0;
10530 int has_seqno_option = 0;
10531 int has_analyse_option = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010532 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010533
10534 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10535 {
10536 if (unformat (input, "trace"))
10537 has_trace_option = 1;
10538 else if (unformat (input, "pot"))
10539 has_pot_option = 1;
10540 else if (unformat (input, "seqno"))
10541 has_seqno_option = 1;
10542 else if (unformat (input, "analyse"))
10543 has_analyse_option = 1;
10544 else
10545 break;
10546 }
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010547 M (IOAM_ENABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010548 mp->id = htons (id);
10549 mp->seqno = has_seqno_option;
10550 mp->analyse = has_analyse_option;
10551 mp->pot_enable = has_pot_option;
10552 mp->trace_enable = has_trace_option;
10553
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010554 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010555 W (ret);
10556 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010557}
10558
10559
10560static int
10561api_ioam_disable (vat_main_t * vam)
10562{
10563 vl_api_ioam_disable_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060010564 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010565
Jon Loeliger8a2aea32017-01-31 13:19:40 -060010566 M (IOAM_DISABLE, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060010567 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060010568 W (ret);
10569 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010010570}
10571
Damjan Marion7cd468a2016-12-19 23:05:39 +010010572#define foreach_tcp_proto_field \
10573_(src_port) \
10574_(dst_port)
10575
10576#define foreach_udp_proto_field \
10577_(src_port) \
10578_(dst_port)
10579
10580#define foreach_ip4_proto_field \
10581_(src_address) \
10582_(dst_address) \
10583_(tos) \
10584_(length) \
10585_(fragment_id) \
10586_(ttl) \
10587_(protocol) \
10588_(checksum)
10589
Dave Barach4a3f69c2017-02-22 12:44:56 -050010590typedef struct
10591{
10592 u16 src_port, dst_port;
10593} tcpudp_header_t;
10594
10595#if VPP_API_TEST_BUILTIN == 0
Damjan Marion7cd468a2016-12-19 23:05:39 +010010596uword
10597unformat_tcp_mask (unformat_input_t * input, va_list * args)
10598{
10599 u8 **maskp = va_arg (*args, u8 **);
10600 u8 *mask = 0;
10601 u8 found_something = 0;
10602 tcp_header_t *tcp;
10603
10604#define _(a) u8 a=0;
10605 foreach_tcp_proto_field;
10606#undef _
10607
10608 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10609 {
10610 if (0);
10611#define _(a) else if (unformat (input, #a)) a=1;
10612 foreach_tcp_proto_field
10613#undef _
10614 else
10615 break;
10616 }
10617
10618#define _(a) found_something += a;
10619 foreach_tcp_proto_field;
10620#undef _
10621
10622 if (found_something == 0)
10623 return 0;
10624
10625 vec_validate (mask, sizeof (*tcp) - 1);
10626
10627 tcp = (tcp_header_t *) mask;
10628
Dave Barachb7b92992018-10-17 10:38:51 -040010629#define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a));
Damjan Marion7cd468a2016-12-19 23:05:39 +010010630 foreach_tcp_proto_field;
10631#undef _
10632
10633 *maskp = mask;
10634 return 1;
10635}
10636
10637uword
10638unformat_udp_mask (unformat_input_t * input, va_list * args)
10639{
10640 u8 **maskp = va_arg (*args, u8 **);
10641 u8 *mask = 0;
10642 u8 found_something = 0;
10643 udp_header_t *udp;
10644
10645#define _(a) u8 a=0;
10646 foreach_udp_proto_field;
10647#undef _
10648
10649 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10650 {
10651 if (0);
10652#define _(a) else if (unformat (input, #a)) a=1;
10653 foreach_udp_proto_field
10654#undef _
10655 else
10656 break;
10657 }
10658
10659#define _(a) found_something += a;
10660 foreach_udp_proto_field;
10661#undef _
10662
10663 if (found_something == 0)
10664 return 0;
10665
10666 vec_validate (mask, sizeof (*udp) - 1);
10667
10668 udp = (udp_header_t *) mask;
10669
Dave Barachb7b92992018-10-17 10:38:51 -040010670#define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a));
Damjan Marion7cd468a2016-12-19 23:05:39 +010010671 foreach_udp_proto_field;
10672#undef _
10673
10674 *maskp = mask;
10675 return 1;
10676}
10677
Damjan Marion7cd468a2016-12-19 23:05:39 +010010678uword
10679unformat_l4_mask (unformat_input_t * input, va_list * args)
10680{
10681 u8 **maskp = va_arg (*args, u8 **);
10682 u16 src_port = 0, dst_port = 0;
10683 tcpudp_header_t *tcpudp;
10684
10685 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10686 {
10687 if (unformat (input, "tcp %U", unformat_tcp_mask, maskp))
10688 return 1;
10689 else if (unformat (input, "udp %U", unformat_udp_mask, maskp))
10690 return 1;
10691 else if (unformat (input, "src_port"))
10692 src_port = 0xFFFF;
10693 else if (unformat (input, "dst_port"))
10694 dst_port = 0xFFFF;
10695 else
10696 return 0;
10697 }
10698
10699 if (!src_port && !dst_port)
10700 return 0;
10701
10702 u8 *mask = 0;
10703 vec_validate (mask, sizeof (tcpudp_header_t) - 1);
10704
10705 tcpudp = (tcpudp_header_t *) mask;
10706 tcpudp->src_port = src_port;
10707 tcpudp->dst_port = dst_port;
10708
10709 *maskp = mask;
10710
10711 return 1;
10712}
10713
10714uword
10715unformat_ip4_mask (unformat_input_t * input, va_list * args)
10716{
10717 u8 **maskp = va_arg (*args, u8 **);
10718 u8 *mask = 0;
10719 u8 found_something = 0;
10720 ip4_header_t *ip;
10721
10722#define _(a) u8 a=0;
10723 foreach_ip4_proto_field;
10724#undef _
10725 u8 version = 0;
10726 u8 hdr_length = 0;
10727
10728
10729 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10730 {
10731 if (unformat (input, "version"))
10732 version = 1;
10733 else if (unformat (input, "hdr_length"))
10734 hdr_length = 1;
10735 else if (unformat (input, "src"))
10736 src_address = 1;
10737 else if (unformat (input, "dst"))
10738 dst_address = 1;
10739 else if (unformat (input, "proto"))
10740 protocol = 1;
10741
10742#define _(a) else if (unformat (input, #a)) a=1;
10743 foreach_ip4_proto_field
10744#undef _
10745 else
10746 break;
10747 }
10748
10749#define _(a) found_something += a;
10750 foreach_ip4_proto_field;
10751#undef _
10752
10753 if (found_something == 0)
10754 return 0;
10755
10756 vec_validate (mask, sizeof (*ip) - 1);
10757
10758 ip = (ip4_header_t *) mask;
10759
Dave Barachb7b92992018-10-17 10:38:51 -040010760#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
Damjan Marion7cd468a2016-12-19 23:05:39 +010010761 foreach_ip4_proto_field;
10762#undef _
10763
10764 ip->ip_version_and_header_length = 0;
10765
10766 if (version)
10767 ip->ip_version_and_header_length |= 0xF0;
10768
10769 if (hdr_length)
10770 ip->ip_version_and_header_length |= 0x0F;
10771
10772 *maskp = mask;
10773 return 1;
10774}
10775
10776#define foreach_ip6_proto_field \
10777_(src_address) \
10778_(dst_address) \
10779_(payload_length) \
10780_(hop_limit) \
10781_(protocol)
10782
10783uword
10784unformat_ip6_mask (unformat_input_t * input, va_list * args)
10785{
10786 u8 **maskp = va_arg (*args, u8 **);
10787 u8 *mask = 0;
10788 u8 found_something = 0;
10789 ip6_header_t *ip;
10790 u32 ip_version_traffic_class_and_flow_label;
10791
10792#define _(a) u8 a=0;
10793 foreach_ip6_proto_field;
10794#undef _
10795 u8 version = 0;
10796 u8 traffic_class = 0;
10797 u8 flow_label = 0;
10798
10799 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10800 {
10801 if (unformat (input, "version"))
10802 version = 1;
10803 else if (unformat (input, "traffic-class"))
10804 traffic_class = 1;
10805 else if (unformat (input, "flow-label"))
10806 flow_label = 1;
10807 else if (unformat (input, "src"))
10808 src_address = 1;
10809 else if (unformat (input, "dst"))
10810 dst_address = 1;
10811 else if (unformat (input, "proto"))
10812 protocol = 1;
10813
10814#define _(a) else if (unformat (input, #a)) a=1;
10815 foreach_ip6_proto_field
10816#undef _
10817 else
10818 break;
10819 }
10820
10821#define _(a) found_something += a;
10822 foreach_ip6_proto_field;
10823#undef _
10824
10825 if (found_something == 0)
10826 return 0;
10827
10828 vec_validate (mask, sizeof (*ip) - 1);
10829
10830 ip = (ip6_header_t *) mask;
10831
Dave Barachb7b92992018-10-17 10:38:51 -040010832#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a));
Damjan Marion7cd468a2016-12-19 23:05:39 +010010833 foreach_ip6_proto_field;
10834#undef _
10835
10836 ip_version_traffic_class_and_flow_label = 0;
10837
10838 if (version)
10839 ip_version_traffic_class_and_flow_label |= 0xF0000000;
10840
10841 if (traffic_class)
10842 ip_version_traffic_class_and_flow_label |= 0x0FF00000;
10843
10844 if (flow_label)
10845 ip_version_traffic_class_and_flow_label |= 0x000FFFFF;
10846
10847 ip->ip_version_traffic_class_and_flow_label =
10848 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
10849
10850 *maskp = mask;
10851 return 1;
10852}
10853
10854uword
10855unformat_l3_mask (unformat_input_t * input, va_list * args)
10856{
10857 u8 **maskp = va_arg (*args, u8 **);
10858
10859 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10860 {
10861 if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp))
10862 return 1;
10863 else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp))
10864 return 1;
10865 else
10866 break;
10867 }
10868 return 0;
10869}
10870
10871uword
10872unformat_l2_mask (unformat_input_t * input, va_list * args)
10873{
10874 u8 **maskp = va_arg (*args, u8 **);
10875 u8 *mask = 0;
10876 u8 src = 0;
10877 u8 dst = 0;
10878 u8 proto = 0;
10879 u8 tag1 = 0;
10880 u8 tag2 = 0;
10881 u8 ignore_tag1 = 0;
10882 u8 ignore_tag2 = 0;
10883 u8 cos1 = 0;
10884 u8 cos2 = 0;
10885 u8 dot1q = 0;
10886 u8 dot1ad = 0;
10887 int len = 14;
10888
10889 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10890 {
10891 if (unformat (input, "src"))
10892 src = 1;
10893 else if (unformat (input, "dst"))
10894 dst = 1;
10895 else if (unformat (input, "proto"))
10896 proto = 1;
10897 else if (unformat (input, "tag1"))
10898 tag1 = 1;
10899 else if (unformat (input, "tag2"))
10900 tag2 = 1;
10901 else if (unformat (input, "ignore-tag1"))
10902 ignore_tag1 = 1;
10903 else if (unformat (input, "ignore-tag2"))
10904 ignore_tag2 = 1;
10905 else if (unformat (input, "cos1"))
10906 cos1 = 1;
10907 else if (unformat (input, "cos2"))
10908 cos2 = 1;
10909 else if (unformat (input, "dot1q"))
10910 dot1q = 1;
10911 else if (unformat (input, "dot1ad"))
10912 dot1ad = 1;
10913 else
10914 break;
10915 }
10916 if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad +
10917 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
10918 return 0;
10919
10920 if (tag1 || ignore_tag1 || cos1 || dot1q)
10921 len = 18;
10922 if (tag2 || ignore_tag2 || cos2 || dot1ad)
10923 len = 22;
10924
10925 vec_validate (mask, len - 1);
10926
10927 if (dst)
Dave Barachb7b92992018-10-17 10:38:51 -040010928 clib_memset (mask, 0xff, 6);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010929
10930 if (src)
Dave Barachb7b92992018-10-17 10:38:51 -040010931 clib_memset (mask + 6, 0xff, 6);
Damjan Marion7cd468a2016-12-19 23:05:39 +010010932
10933 if (tag2 || dot1ad)
10934 {
10935 /* inner vlan tag */
10936 if (tag2)
10937 {
10938 mask[19] = 0xff;
10939 mask[18] = 0x0f;
10940 }
10941 if (cos2)
10942 mask[18] |= 0xe0;
10943 if (proto)
10944 mask[21] = mask[20] = 0xff;
10945 if (tag1)
10946 {
10947 mask[15] = 0xff;
10948 mask[14] = 0x0f;
10949 }
10950 if (cos1)
10951 mask[14] |= 0xe0;
10952 *maskp = mask;
10953 return 1;
10954 }
10955 if (tag1 | dot1q)
10956 {
10957 if (tag1)
10958 {
10959 mask[15] = 0xff;
10960 mask[14] = 0x0f;
10961 }
10962 if (cos1)
10963 mask[14] |= 0xe0;
10964 if (proto)
10965 mask[16] = mask[17] = 0xff;
10966
10967 *maskp = mask;
10968 return 1;
10969 }
10970 if (cos2)
10971 mask[18] |= 0xe0;
10972 if (cos1)
10973 mask[14] |= 0xe0;
10974 if (proto)
10975 mask[12] = mask[13] = 0xff;
10976
10977 *maskp = mask;
10978 return 1;
10979}
10980
10981uword
10982unformat_classify_mask (unformat_input_t * input, va_list * args)
10983{
10984 u8 **maskp = va_arg (*args, u8 **);
10985 u32 *skipp = va_arg (*args, u32 *);
10986 u32 *matchp = va_arg (*args, u32 *);
10987 u32 match;
10988 u8 *mask = 0;
10989 u8 *l2 = 0;
10990 u8 *l3 = 0;
10991 u8 *l4 = 0;
10992 int i;
10993
10994 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
10995 {
10996 if (unformat (input, "hex %U", unformat_hex_string, &mask))
10997 ;
10998 else if (unformat (input, "l2 %U", unformat_l2_mask, &l2))
10999 ;
11000 else if (unformat (input, "l3 %U", unformat_l3_mask, &l3))
11001 ;
11002 else if (unformat (input, "l4 %U", unformat_l4_mask, &l4))
11003 ;
11004 else
11005 break;
11006 }
11007
11008 if (l4 && !l3)
11009 {
11010 vec_free (mask);
11011 vec_free (l2);
11012 vec_free (l4);
11013 return 0;
11014 }
11015
11016 if (mask || l2 || l3 || l4)
11017 {
11018 if (l2 || l3 || l4)
11019 {
11020 /* "With a free Ethernet header in every package" */
11021 if (l2 == 0)
11022 vec_validate (l2, 13);
11023 mask = l2;
11024 if (vec_len (l3))
11025 {
11026 vec_append (mask, l3);
11027 vec_free (l3);
11028 }
11029 if (vec_len (l4))
11030 {
11031 vec_append (mask, l4);
11032 vec_free (l4);
11033 }
11034 }
11035
11036 /* Scan forward looking for the first significant mask octet */
11037 for (i = 0; i < vec_len (mask); i++)
11038 if (mask[i])
11039 break;
11040
11041 /* compute (skip, match) params */
11042 *skipp = i / sizeof (u32x4);
11043 vec_delete (mask, *skipp * sizeof (u32x4), 0);
11044
11045 /* Pad mask to an even multiple of the vector size */
11046 while (vec_len (mask) % sizeof (u32x4))
11047 vec_add1 (mask, 0);
11048
11049 match = vec_len (mask) / sizeof (u32x4);
11050
11051 for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4))
11052 {
11053 u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4)));
11054 if (*tmp || *(tmp + 1))
11055 break;
11056 match--;
11057 }
11058 if (match == 0)
11059 clib_warning ("BUG: match 0");
11060
11061 _vec_len (mask) = match * sizeof (u32x4);
11062
11063 *matchp = match;
11064 *maskp = mask;
11065
11066 return 1;
11067 }
11068
11069 return 0;
11070}
Dave Barach4a3f69c2017-02-22 12:44:56 -050011071#endif /* VPP_API_TEST_BUILTIN */
Damjan Marion7cd468a2016-12-19 23:05:39 +010011072
11073#define foreach_l2_next \
11074_(drop, DROP) \
11075_(ethernet, ETHERNET_INPUT) \
11076_(ip4, IP4_INPUT) \
11077_(ip6, IP6_INPUT)
11078
11079uword
11080unformat_l2_next_index (unformat_input_t * input, va_list * args)
11081{
11082 u32 *miss_next_indexp = va_arg (*args, u32 *);
11083 u32 next_index = 0;
11084 u32 tmp;
11085
11086#define _(n,N) \
11087 if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;}
11088 foreach_l2_next;
11089#undef _
11090
11091 if (unformat (input, "%d", &tmp))
11092 {
11093 next_index = tmp;
11094 goto out;
11095 }
11096
11097 return 0;
11098
11099out:
11100 *miss_next_indexp = next_index;
11101 return 1;
11102}
11103
11104#define foreach_ip_next \
11105_(drop, DROP) \
11106_(local, LOCAL) \
11107_(rewrite, REWRITE)
11108
11109uword
Dave Barach4a3f69c2017-02-22 12:44:56 -050011110api_unformat_ip_next_index (unformat_input_t * input, va_list * args)
Damjan Marion7cd468a2016-12-19 23:05:39 +010011111{
11112 u32 *miss_next_indexp = va_arg (*args, u32 *);
11113 u32 next_index = 0;
11114 u32 tmp;
11115
11116#define _(n,N) \
11117 if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;}
11118 foreach_ip_next;
11119#undef _
11120
11121 if (unformat (input, "%d", &tmp))
11122 {
11123 next_index = tmp;
11124 goto out;
11125 }
11126
11127 return 0;
11128
11129out:
11130 *miss_next_indexp = next_index;
11131 return 1;
11132}
11133
11134#define foreach_acl_next \
11135_(deny, DENY)
11136
11137uword
Dave Barach4a3f69c2017-02-22 12:44:56 -050011138api_unformat_acl_next_index (unformat_input_t * input, va_list * args)
Damjan Marion7cd468a2016-12-19 23:05:39 +010011139{
11140 u32 *miss_next_indexp = va_arg (*args, u32 *);
11141 u32 next_index = 0;
11142 u32 tmp;
11143
11144#define _(n,N) \
11145 if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;}
11146 foreach_acl_next;
11147#undef _
11148
11149 if (unformat (input, "permit"))
11150 {
11151 next_index = ~0;
11152 goto out;
11153 }
11154 else if (unformat (input, "%d", &tmp))
11155 {
11156 next_index = tmp;
11157 goto out;
11158 }
11159
11160 return 0;
11161
11162out:
11163 *miss_next_indexp = next_index;
11164 return 1;
11165}
11166
11167uword
11168unformat_policer_precolor (unformat_input_t * input, va_list * args)
11169{
11170 u32 *r = va_arg (*args, u32 *);
11171
11172 if (unformat (input, "conform-color"))
11173 *r = POLICE_CONFORM;
11174 else if (unformat (input, "exceed-color"))
11175 *r = POLICE_EXCEED;
11176 else
11177 return 0;
11178
11179 return 1;
11180}
11181
11182static int
11183api_classify_add_del_table (vat_main_t * vam)
11184{
11185 unformat_input_t *i = vam->input;
11186 vl_api_classify_add_del_table_t *mp;
11187
11188 u32 nbuckets = 2;
11189 u32 skip = ~0;
11190 u32 match = ~0;
11191 int is_add = 1;
11192 int del_chain = 0;
11193 u32 table_index = ~0;
11194 u32 next_table_index = ~0;
11195 u32 miss_next_index = ~0;
11196 u32 memory_size = 32 << 20;
11197 u8 *mask = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011198 u32 current_data_flag = 0;
11199 int current_data_offset = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060011200 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011201
11202 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11203 {
11204 if (unformat (i, "del"))
11205 is_add = 0;
11206 else if (unformat (i, "del-chain"))
11207 {
11208 is_add = 0;
11209 del_chain = 1;
11210 }
11211 else if (unformat (i, "buckets %d", &nbuckets))
11212 ;
11213 else if (unformat (i, "memory_size %d", &memory_size))
11214 ;
11215 else if (unformat (i, "skip %d", &skip))
11216 ;
11217 else if (unformat (i, "match %d", &match))
11218 ;
11219 else if (unformat (i, "table %d", &table_index))
11220 ;
11221 else if (unformat (i, "mask %U", unformat_classify_mask,
11222 &mask, &skip, &match))
11223 ;
11224 else if (unformat (i, "next-table %d", &next_table_index))
11225 ;
Dave Barach4a3f69c2017-02-22 12:44:56 -050011226 else if (unformat (i, "miss-next %U", api_unformat_ip_next_index,
Damjan Marion7cd468a2016-12-19 23:05:39 +010011227 &miss_next_index))
11228 ;
11229 else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index,
11230 &miss_next_index))
11231 ;
Dave Barach4a3f69c2017-02-22 12:44:56 -050011232 else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index,
Damjan Marion7cd468a2016-12-19 23:05:39 +010011233 &miss_next_index))
11234 ;
11235 else if (unformat (i, "current-data-flag %d", &current_data_flag))
11236 ;
11237 else if (unformat (i, "current-data-offset %d", &current_data_offset))
11238 ;
11239 else
11240 break;
11241 }
11242
11243 if (is_add && mask == 0)
11244 {
11245 errmsg ("Mask required");
11246 return -99;
11247 }
11248
11249 if (is_add && skip == ~0)
11250 {
11251 errmsg ("skip count required");
11252 return -99;
11253 }
11254
11255 if (is_add && match == ~0)
11256 {
11257 errmsg ("match count required");
11258 return -99;
11259 }
11260
11261 if (!is_add && table_index == ~0)
11262 {
11263 errmsg ("table index required for delete");
11264 return -99;
11265 }
11266
Jon Loeliger8a2aea32017-01-31 13:19:40 -060011267 M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask));
Damjan Marion7cd468a2016-12-19 23:05:39 +010011268
11269 mp->is_add = is_add;
11270 mp->del_chain = del_chain;
11271 mp->table_index = ntohl (table_index);
11272 mp->nbuckets = ntohl (nbuckets);
11273 mp->memory_size = ntohl (memory_size);
11274 mp->skip_n_vectors = ntohl (skip);
11275 mp->match_n_vectors = ntohl (match);
11276 mp->next_table_index = ntohl (next_table_index);
11277 mp->miss_next_index = ntohl (miss_next_index);
11278 mp->current_data_flag = ntohl (current_data_flag);
11279 mp->current_data_offset = ntohl (current_data_offset);
Juraj Sloboda75282452018-06-12 14:20:49 +020011280 mp->mask_len = ntohl (vec_len (mask));
Damjan Marion7cd468a2016-12-19 23:05:39 +010011281 clib_memcpy (mp->mask, mask, vec_len (mask));
11282
11283 vec_free (mask);
11284
Jon Loeliger7bc770c2017-01-31 14:03:33 -060011285 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060011286 W (ret);
11287 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011288}
11289
Dave Barach4a3f69c2017-02-22 12:44:56 -050011290#if VPP_API_TEST_BUILTIN == 0
Damjan Marion7cd468a2016-12-19 23:05:39 +010011291uword
11292unformat_l4_match (unformat_input_t * input, va_list * args)
11293{
11294 u8 **matchp = va_arg (*args, u8 **);
11295
11296 u8 *proto_header = 0;
11297 int src_port = 0;
11298 int dst_port = 0;
11299
11300 tcpudp_header_t h;
11301
11302 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11303 {
11304 if (unformat (input, "src_port %d", &src_port))
11305 ;
11306 else if (unformat (input, "dst_port %d", &dst_port))
11307 ;
11308 else
11309 return 0;
11310 }
11311
11312 h.src_port = clib_host_to_net_u16 (src_port);
11313 h.dst_port = clib_host_to_net_u16 (dst_port);
11314 vec_validate (proto_header, sizeof (h) - 1);
11315 memcpy (proto_header, &h, sizeof (h));
11316
11317 *matchp = proto_header;
11318
11319 return 1;
11320}
11321
11322uword
11323unformat_ip4_match (unformat_input_t * input, va_list * args)
11324{
11325 u8 **matchp = va_arg (*args, u8 **);
11326 u8 *match = 0;
11327 ip4_header_t *ip;
11328 int version = 0;
11329 u32 version_val;
11330 int hdr_length = 0;
11331 u32 hdr_length_val;
11332 int src = 0, dst = 0;
11333 ip4_address_t src_val, dst_val;
11334 int proto = 0;
11335 u32 proto_val;
11336 int tos = 0;
11337 u32 tos_val;
11338 int length = 0;
11339 u32 length_val;
11340 int fragment_id = 0;
11341 u32 fragment_id_val;
11342 int ttl = 0;
11343 int ttl_val;
11344 int checksum = 0;
11345 u32 checksum_val;
11346
11347 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11348 {
11349 if (unformat (input, "version %d", &version_val))
11350 version = 1;
11351 else if (unformat (input, "hdr_length %d", &hdr_length_val))
11352 hdr_length = 1;
11353 else if (unformat (input, "src %U", unformat_ip4_address, &src_val))
11354 src = 1;
11355 else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val))
11356 dst = 1;
11357 else if (unformat (input, "proto %d", &proto_val))
11358 proto = 1;
11359 else if (unformat (input, "tos %d", &tos_val))
11360 tos = 1;
11361 else if (unformat (input, "length %d", &length_val))
11362 length = 1;
11363 else if (unformat (input, "fragment_id %d", &fragment_id_val))
11364 fragment_id = 1;
11365 else if (unformat (input, "ttl %d", &ttl_val))
11366 ttl = 1;
11367 else if (unformat (input, "checksum %d", &checksum_val))
11368 checksum = 1;
11369 else
11370 break;
11371 }
11372
11373 if (version + hdr_length + src + dst + proto + tos + length + fragment_id
11374 + ttl + checksum == 0)
11375 return 0;
11376
11377 /*
11378 * Aligned because we use the real comparison functions
11379 */
11380 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11381
11382 ip = (ip4_header_t *) match;
11383
11384 /* These are realistically matched in practice */
11385 if (src)
11386 ip->src_address.as_u32 = src_val.as_u32;
11387
11388 if (dst)
11389 ip->dst_address.as_u32 = dst_val.as_u32;
11390
11391 if (proto)
11392 ip->protocol = proto_val;
11393
11394
11395 /* These are not, but they're included for completeness */
11396 if (version)
11397 ip->ip_version_and_header_length |= (version_val & 0xF) << 4;
11398
11399 if (hdr_length)
11400 ip->ip_version_and_header_length |= (hdr_length_val & 0xF);
11401
11402 if (tos)
11403 ip->tos = tos_val;
11404
11405 if (length)
11406 ip->length = clib_host_to_net_u16 (length_val);
11407
11408 if (ttl)
11409 ip->ttl = ttl_val;
11410
11411 if (checksum)
11412 ip->checksum = clib_host_to_net_u16 (checksum_val);
11413
11414 *matchp = match;
11415 return 1;
11416}
11417
11418uword
11419unformat_ip6_match (unformat_input_t * input, va_list * args)
11420{
11421 u8 **matchp = va_arg (*args, u8 **);
11422 u8 *match = 0;
11423 ip6_header_t *ip;
11424 int version = 0;
11425 u32 version_val;
11426 u8 traffic_class = 0;
11427 u32 traffic_class_val = 0;
11428 u8 flow_label = 0;
11429 u8 flow_label_val;
11430 int src = 0, dst = 0;
11431 ip6_address_t src_val, dst_val;
11432 int proto = 0;
11433 u32 proto_val;
11434 int payload_length = 0;
11435 u32 payload_length_val;
11436 int hop_limit = 0;
11437 int hop_limit_val;
11438 u32 ip_version_traffic_class_and_flow_label;
11439
11440 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11441 {
11442 if (unformat (input, "version %d", &version_val))
11443 version = 1;
11444 else if (unformat (input, "traffic_class %d", &traffic_class_val))
11445 traffic_class = 1;
11446 else if (unformat (input, "flow_label %d", &flow_label_val))
11447 flow_label = 1;
11448 else if (unformat (input, "src %U", unformat_ip6_address, &src_val))
11449 src = 1;
11450 else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val))
11451 dst = 1;
11452 else if (unformat (input, "proto %d", &proto_val))
11453 proto = 1;
11454 else if (unformat (input, "payload_length %d", &payload_length_val))
11455 payload_length = 1;
11456 else if (unformat (input, "hop_limit %d", &hop_limit_val))
11457 hop_limit = 1;
11458 else
11459 break;
11460 }
11461
11462 if (version + traffic_class + flow_label + src + dst + proto +
11463 payload_length + hop_limit == 0)
11464 return 0;
11465
11466 /*
11467 * Aligned because we use the real comparison functions
11468 */
11469 vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4));
11470
11471 ip = (ip6_header_t *) match;
11472
11473 if (src)
11474 clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address));
11475
11476 if (dst)
11477 clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address));
11478
11479 if (proto)
11480 ip->protocol = proto_val;
11481
11482 ip_version_traffic_class_and_flow_label = 0;
11483
11484 if (version)
11485 ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28;
11486
11487 if (traffic_class)
11488 ip_version_traffic_class_and_flow_label |=
11489 (traffic_class_val & 0xFF) << 20;
11490
11491 if (flow_label)
11492 ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF);
11493
11494 ip->ip_version_traffic_class_and_flow_label =
11495 clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label);
11496
11497 if (payload_length)
11498 ip->payload_length = clib_host_to_net_u16 (payload_length_val);
11499
11500 if (hop_limit)
11501 ip->hop_limit = hop_limit_val;
11502
11503 *matchp = match;
11504 return 1;
11505}
11506
11507uword
11508unformat_l3_match (unformat_input_t * input, va_list * args)
11509{
11510 u8 **matchp = va_arg (*args, u8 **);
11511
11512 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11513 {
11514 if (unformat (input, "ip4 %U", unformat_ip4_match, matchp))
11515 return 1;
11516 else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp))
11517 return 1;
11518 else
11519 break;
11520 }
11521 return 0;
11522}
11523
11524uword
11525unformat_vlan_tag (unformat_input_t * input, va_list * args)
11526{
11527 u8 *tagp = va_arg (*args, u8 *);
11528 u32 tag;
11529
11530 if (unformat (input, "%d", &tag))
11531 {
11532 tagp[0] = (tag >> 8) & 0x0F;
11533 tagp[1] = tag & 0xFF;
11534 return 1;
11535 }
11536
11537 return 0;
11538}
11539
11540uword
11541unformat_l2_match (unformat_input_t * input, va_list * args)
11542{
11543 u8 **matchp = va_arg (*args, u8 **);
11544 u8 *match = 0;
11545 u8 src = 0;
11546 u8 src_val[6];
11547 u8 dst = 0;
11548 u8 dst_val[6];
11549 u8 proto = 0;
11550 u16 proto_val;
11551 u8 tag1 = 0;
11552 u8 tag1_val[2];
11553 u8 tag2 = 0;
11554 u8 tag2_val[2];
11555 int len = 14;
11556 u8 ignore_tag1 = 0;
11557 u8 ignore_tag2 = 0;
11558 u8 cos1 = 0;
11559 u8 cos2 = 0;
11560 u32 cos1_val = 0;
11561 u32 cos2_val = 0;
11562
11563 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11564 {
11565 if (unformat (input, "src %U", unformat_ethernet_address, &src_val))
11566 src = 1;
11567 else
11568 if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val))
11569 dst = 1;
11570 else if (unformat (input, "proto %U",
11571 unformat_ethernet_type_host_byte_order, &proto_val))
11572 proto = 1;
11573 else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val))
11574 tag1 = 1;
11575 else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val))
11576 tag2 = 1;
11577 else if (unformat (input, "ignore-tag1"))
11578 ignore_tag1 = 1;
11579 else if (unformat (input, "ignore-tag2"))
11580 ignore_tag2 = 1;
11581 else if (unformat (input, "cos1 %d", &cos1_val))
11582 cos1 = 1;
11583 else if (unformat (input, "cos2 %d", &cos2_val))
11584 cos2 = 1;
11585 else
11586 break;
11587 }
11588 if ((src + dst + proto + tag1 + tag2 +
11589 ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0)
11590 return 0;
11591
11592 if (tag1 || ignore_tag1 || cos1)
11593 len = 18;
11594 if (tag2 || ignore_tag2 || cos2)
11595 len = 22;
11596
11597 vec_validate_aligned (match, len - 1, sizeof (u32x4));
11598
11599 if (dst)
11600 clib_memcpy (match, dst_val, 6);
11601
11602 if (src)
11603 clib_memcpy (match + 6, src_val, 6);
11604
11605 if (tag2)
11606 {
11607 /* inner vlan tag */
11608 match[19] = tag2_val[1];
11609 match[18] = tag2_val[0];
11610 if (cos2)
11611 match[18] |= (cos2_val & 0x7) << 5;
11612 if (proto)
11613 {
11614 match[21] = proto_val & 0xff;
11615 match[20] = proto_val >> 8;
11616 }
11617 if (tag1)
11618 {
11619 match[15] = tag1_val[1];
11620 match[14] = tag1_val[0];
11621 }
11622 if (cos1)
11623 match[14] |= (cos1_val & 0x7) << 5;
11624 *matchp = match;
11625 return 1;
11626 }
11627 if (tag1)
11628 {
11629 match[15] = tag1_val[1];
11630 match[14] = tag1_val[0];
11631 if (proto)
11632 {
11633 match[17] = proto_val & 0xff;
11634 match[16] = proto_val >> 8;
11635 }
11636 if (cos1)
11637 match[14] |= (cos1_val & 0x7) << 5;
11638
11639 *matchp = match;
11640 return 1;
11641 }
11642 if (cos2)
11643 match[18] |= (cos2_val & 0x7) << 5;
11644 if (cos1)
11645 match[14] |= (cos1_val & 0x7) << 5;
11646 if (proto)
11647 {
11648 match[13] = proto_val & 0xff;
11649 match[12] = proto_val >> 8;
11650 }
11651
11652 *matchp = match;
11653 return 1;
11654}
Igor Mikhailov (imichail)582caa32018-04-26 21:33:02 -070011655
11656uword
11657unformat_qos_source (unformat_input_t * input, va_list * args)
11658{
11659 int *qs = va_arg (*args, int *);
11660
11661 if (unformat (input, "ip"))
11662 *qs = QOS_SOURCE_IP;
11663 else if (unformat (input, "mpls"))
11664 *qs = QOS_SOURCE_MPLS;
11665 else if (unformat (input, "ext"))
11666 *qs = QOS_SOURCE_EXT;
11667 else if (unformat (input, "vlan"))
11668 *qs = QOS_SOURCE_VLAN;
11669 else
11670 return 0;
11671
11672 return 1;
11673}
Dave Barach4a3f69c2017-02-22 12:44:56 -050011674#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +010011675
11676uword
Dave Barach4a3f69c2017-02-22 12:44:56 -050011677api_unformat_classify_match (unformat_input_t * input, va_list * args)
Damjan Marion7cd468a2016-12-19 23:05:39 +010011678{
11679 u8 **matchp = va_arg (*args, u8 **);
11680 u32 skip_n_vectors = va_arg (*args, u32);
11681 u32 match_n_vectors = va_arg (*args, u32);
11682
11683 u8 *match = 0;
11684 u8 *l2 = 0;
11685 u8 *l3 = 0;
11686 u8 *l4 = 0;
11687
11688 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
11689 {
11690 if (unformat (input, "hex %U", unformat_hex_string, &match))
11691 ;
11692 else if (unformat (input, "l2 %U", unformat_l2_match, &l2))
11693 ;
11694 else if (unformat (input, "l3 %U", unformat_l3_match, &l3))
11695 ;
11696 else if (unformat (input, "l4 %U", unformat_l4_match, &l4))
11697 ;
11698 else
11699 break;
11700 }
11701
11702 if (l4 && !l3)
11703 {
11704 vec_free (match);
11705 vec_free (l2);
11706 vec_free (l4);
11707 return 0;
11708 }
11709
11710 if (match || l2 || l3 || l4)
11711 {
11712 if (l2 || l3 || l4)
11713 {
11714 /* "Win a free Ethernet header in every packet" */
11715 if (l2 == 0)
11716 vec_validate_aligned (l2, 13, sizeof (u32x4));
11717 match = l2;
11718 if (vec_len (l3))
11719 {
11720 vec_append_aligned (match, l3, sizeof (u32x4));
11721 vec_free (l3);
11722 }
11723 if (vec_len (l4))
11724 {
11725 vec_append_aligned (match, l4, sizeof (u32x4));
11726 vec_free (l4);
11727 }
11728 }
11729
11730 /* Make sure the vector is big enough even if key is all 0's */
11731 vec_validate_aligned
11732 (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1,
11733 sizeof (u32x4));
11734
11735 /* Set size, include skipped vectors */
11736 _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4);
11737
11738 *matchp = match;
11739
11740 return 1;
11741 }
11742
11743 return 0;
11744}
11745
11746static int
11747api_classify_add_del_session (vat_main_t * vam)
11748{
11749 unformat_input_t *i = vam->input;
11750 vl_api_classify_add_del_session_t *mp;
11751 int is_add = 1;
11752 u32 table_index = ~0;
11753 u32 hit_next_index = ~0;
11754 u32 opaque_index = ~0;
11755 u8 *match = 0;
11756 i32 advance = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011757 u32 skip_n_vectors = 0;
11758 u32 match_n_vectors = 0;
11759 u32 action = 0;
11760 u32 metadata = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060011761 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011762
11763 /*
11764 * Warning: you have to supply skip_n and match_n
11765 * because the API client cant simply look at the classify
11766 * table object.
11767 */
11768
11769 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11770 {
11771 if (unformat (i, "del"))
11772 is_add = 0;
Dave Barach4a3f69c2017-02-22 12:44:56 -050011773 else if (unformat (i, "hit-next %U", api_unformat_ip_next_index,
Damjan Marion7cd468a2016-12-19 23:05:39 +010011774 &hit_next_index))
11775 ;
11776 else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index,
11777 &hit_next_index))
11778 ;
Dave Barach4a3f69c2017-02-22 12:44:56 -050011779 else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index,
Damjan Marion7cd468a2016-12-19 23:05:39 +010011780 &hit_next_index))
11781 ;
11782 else if (unformat (i, "policer-hit-next %d", &hit_next_index))
11783 ;
11784 else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index))
11785 ;
11786 else if (unformat (i, "opaque-index %d", &opaque_index))
11787 ;
11788 else if (unformat (i, "skip_n %d", &skip_n_vectors))
11789 ;
11790 else if (unformat (i, "match_n %d", &match_n_vectors))
11791 ;
Dave Barach4a3f69c2017-02-22 12:44:56 -050011792 else if (unformat (i, "match %U", api_unformat_classify_match,
Damjan Marion7cd468a2016-12-19 23:05:39 +010011793 &match, skip_n_vectors, match_n_vectors))
11794 ;
11795 else if (unformat (i, "advance %d", &advance))
11796 ;
11797 else if (unformat (i, "table-index %d", &table_index))
11798 ;
11799 else if (unformat (i, "action set-ip4-fib-id %d", &metadata))
11800 action = 1;
11801 else if (unformat (i, "action set-ip6-fib-id %d", &metadata))
11802 action = 2;
11803 else if (unformat (i, "action %d", &action))
11804 ;
11805 else if (unformat (i, "metadata %d", &metadata))
11806 ;
11807 else
11808 break;
11809 }
11810
11811 if (table_index == ~0)
11812 {
11813 errmsg ("Table index required");
11814 return -99;
11815 }
11816
11817 if (is_add && match == 0)
11818 {
11819 errmsg ("Match value required");
11820 return -99;
11821 }
11822
Jon Loeliger8a2aea32017-01-31 13:19:40 -060011823 M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match));
Damjan Marion7cd468a2016-12-19 23:05:39 +010011824
11825 mp->is_add = is_add;
11826 mp->table_index = ntohl (table_index);
11827 mp->hit_next_index = ntohl (hit_next_index);
11828 mp->opaque_index = ntohl (opaque_index);
11829 mp->advance = ntohl (advance);
11830 mp->action = action;
11831 mp->metadata = ntohl (metadata);
Juraj Sloboda75282452018-06-12 14:20:49 +020011832 mp->match_len = ntohl (vec_len (match));
Damjan Marion7cd468a2016-12-19 23:05:39 +010011833 clib_memcpy (mp->match, match, vec_len (match));
11834 vec_free (match);
11835
Jon Loeliger7bc770c2017-01-31 14:03:33 -060011836 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060011837 W (ret);
11838 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011839}
11840
11841static int
11842api_classify_set_interface_ip_table (vat_main_t * vam)
11843{
11844 unformat_input_t *i = vam->input;
11845 vl_api_classify_set_interface_ip_table_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011846 u32 sw_if_index;
11847 int sw_if_index_set;
11848 u32 table_index = ~0;
11849 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060011850 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011851
11852 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11853 {
11854 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11855 sw_if_index_set = 1;
11856 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11857 sw_if_index_set = 1;
11858 else if (unformat (i, "table %d", &table_index))
11859 ;
11860 else
11861 {
11862 clib_warning ("parse error '%U'", format_unformat_error, i);
11863 return -99;
11864 }
11865 }
11866
11867 if (sw_if_index_set == 0)
11868 {
11869 errmsg ("missing interface name or sw_if_index");
11870 return -99;
11871 }
11872
11873
Jon Loeliger8a2aea32017-01-31 13:19:40 -060011874 M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010011875
11876 mp->sw_if_index = ntohl (sw_if_index);
11877 mp->table_index = ntohl (table_index);
11878 mp->is_ipv6 = is_ipv6;
11879
Jon Loeliger7bc770c2017-01-31 14:03:33 -060011880 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060011881 W (ret);
11882 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011883}
11884
11885static int
11886api_classify_set_interface_l2_tables (vat_main_t * vam)
11887{
11888 unformat_input_t *i = vam->input;
11889 vl_api_classify_set_interface_l2_tables_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011890 u32 sw_if_index;
11891 int sw_if_index_set;
11892 u32 ip4_table_index = ~0;
11893 u32 ip6_table_index = ~0;
11894 u32 other_table_index = ~0;
11895 u32 is_input = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060011896 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011897
11898 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11899 {
11900 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
11901 sw_if_index_set = 1;
11902 else if (unformat (i, "sw_if_index %d", &sw_if_index))
11903 sw_if_index_set = 1;
11904 else if (unformat (i, "ip4-table %d", &ip4_table_index))
11905 ;
11906 else if (unformat (i, "ip6-table %d", &ip6_table_index))
11907 ;
11908 else if (unformat (i, "other-table %d", &other_table_index))
11909 ;
11910 else if (unformat (i, "is-input %d", &is_input))
11911 ;
11912 else
11913 {
11914 clib_warning ("parse error '%U'", format_unformat_error, i);
11915 return -99;
11916 }
11917 }
11918
11919 if (sw_if_index_set == 0)
11920 {
11921 errmsg ("missing interface name or sw_if_index");
11922 return -99;
11923 }
11924
11925
Jon Loeliger8a2aea32017-01-31 13:19:40 -060011926 M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010011927
11928 mp->sw_if_index = ntohl (sw_if_index);
11929 mp->ip4_table_index = ntohl (ip4_table_index);
11930 mp->ip6_table_index = ntohl (ip6_table_index);
11931 mp->other_table_index = ntohl (other_table_index);
11932 mp->is_input = (u8) is_input;
11933
Jon Loeliger7bc770c2017-01-31 14:03:33 -060011934 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060011935 W (ret);
11936 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011937}
11938
11939static int
11940api_set_ipfix_exporter (vat_main_t * vam)
11941{
11942 unformat_input_t *i = vam->input;
11943 vl_api_set_ipfix_exporter_t *mp;
11944 ip4_address_t collector_address;
11945 u8 collector_address_set = 0;
11946 u32 collector_port = ~0;
11947 ip4_address_t src_address;
11948 u8 src_address_set = 0;
11949 u32 vrf_id = ~0;
11950 u32 path_mtu = ~0;
11951 u32 template_interval = ~0;
11952 u8 udp_checksum = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060011953 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010011954
11955 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
11956 {
11957 if (unformat (i, "collector_address %U", unformat_ip4_address,
11958 &collector_address))
11959 collector_address_set = 1;
11960 else if (unformat (i, "collector_port %d", &collector_port))
11961 ;
11962 else if (unformat (i, "src_address %U", unformat_ip4_address,
11963 &src_address))
11964 src_address_set = 1;
11965 else if (unformat (i, "vrf_id %d", &vrf_id))
11966 ;
11967 else if (unformat (i, "path_mtu %d", &path_mtu))
11968 ;
11969 else if (unformat (i, "template_interval %d", &template_interval))
11970 ;
11971 else if (unformat (i, "udp_checksum"))
11972 udp_checksum = 1;
11973 else
11974 break;
11975 }
11976
11977 if (collector_address_set == 0)
11978 {
11979 errmsg ("collector_address required");
11980 return -99;
11981 }
11982
11983 if (src_address_set == 0)
11984 {
11985 errmsg ("src_address required");
11986 return -99;
11987 }
11988
Jon Loeliger8a2aea32017-01-31 13:19:40 -060011989 M (SET_IPFIX_EXPORTER, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010011990
11991 memcpy (mp->collector_address, collector_address.data,
11992 sizeof (collector_address.data));
11993 mp->collector_port = htons ((u16) collector_port);
11994 memcpy (mp->src_address, src_address.data, sizeof (src_address.data));
11995 mp->vrf_id = htonl (vrf_id);
11996 mp->path_mtu = htonl (path_mtu);
11997 mp->template_interval = htonl (template_interval);
11998 mp->udp_checksum = udp_checksum;
11999
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012000 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012001 W (ret);
12002 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012003}
12004
12005static int
12006api_set_ipfix_classify_stream (vat_main_t * vam)
12007{
12008 unformat_input_t *i = vam->input;
12009 vl_api_set_ipfix_classify_stream_t *mp;
12010 u32 domain_id = 0;
12011 u32 src_port = UDP_DST_PORT_ipfix;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012012 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012013
12014 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12015 {
12016 if (unformat (i, "domain %d", &domain_id))
12017 ;
12018 else if (unformat (i, "src_port %d", &src_port))
12019 ;
12020 else
12021 {
12022 errmsg ("unknown input `%U'", format_unformat_error, i);
12023 return -99;
12024 }
12025 }
12026
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012027 M (SET_IPFIX_CLASSIFY_STREAM, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012028
12029 mp->domain_id = htonl (domain_id);
12030 mp->src_port = htons ((u16) src_port);
12031
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012032 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012033 W (ret);
12034 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012035}
12036
12037static int
12038api_ipfix_classify_table_add_del (vat_main_t * vam)
12039{
12040 unformat_input_t *i = vam->input;
12041 vl_api_ipfix_classify_table_add_del_t *mp;
12042 int is_add = -1;
12043 u32 classify_table_index = ~0;
12044 u8 ip_version = 0;
12045 u8 transport_protocol = 255;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012046 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012047
12048 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12049 {
12050 if (unformat (i, "add"))
12051 is_add = 1;
12052 else if (unformat (i, "del"))
12053 is_add = 0;
12054 else if (unformat (i, "table %d", &classify_table_index))
12055 ;
12056 else if (unformat (i, "ip4"))
12057 ip_version = 4;
12058 else if (unformat (i, "ip6"))
12059 ip_version = 6;
12060 else if (unformat (i, "tcp"))
12061 transport_protocol = 6;
12062 else if (unformat (i, "udp"))
12063 transport_protocol = 17;
12064 else
12065 {
12066 errmsg ("unknown input `%U'", format_unformat_error, i);
12067 return -99;
12068 }
12069 }
12070
12071 if (is_add == -1)
12072 {
12073 errmsg ("expecting: add|del");
12074 return -99;
12075 }
12076 if (classify_table_index == ~0)
12077 {
12078 errmsg ("classifier table not specified");
12079 return -99;
12080 }
12081 if (ip_version == 0)
12082 {
12083 errmsg ("IP version not specified");
12084 return -99;
12085 }
12086
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012087 M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012088
12089 mp->is_add = is_add;
12090 mp->table_id = htonl (classify_table_index);
12091 mp->ip_version = ip_version;
12092 mp->transport_protocol = transport_protocol;
12093
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012094 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012095 W (ret);
12096 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012097}
12098
12099static int
12100api_get_node_index (vat_main_t * vam)
12101{
12102 unformat_input_t *i = vam->input;
12103 vl_api_get_node_index_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012104 u8 *name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012105 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012106
12107 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12108 {
12109 if (unformat (i, "node %s", &name))
12110 ;
12111 else
12112 break;
12113 }
12114 if (name == 0)
12115 {
12116 errmsg ("node name required");
12117 return -99;
12118 }
12119 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12120 {
12121 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12122 return -99;
12123 }
12124
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012125 M (GET_NODE_INDEX, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012126 clib_memcpy (mp->node_name, name, vec_len (name));
12127 vec_free (name);
12128
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012129 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012130 W (ret);
12131 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012132}
12133
12134static int
12135api_get_next_index (vat_main_t * vam)
12136{
12137 unformat_input_t *i = vam->input;
12138 vl_api_get_next_index_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012139 u8 *node_name = 0, *next_node_name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012140 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012141
12142 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12143 {
12144 if (unformat (i, "node-name %s", &node_name))
12145 ;
12146 else if (unformat (i, "next-node-name %s", &next_node_name))
12147 break;
12148 }
12149
12150 if (node_name == 0)
12151 {
12152 errmsg ("node name required");
12153 return -99;
12154 }
12155 if (vec_len (node_name) >= ARRAY_LEN (mp->node_name))
12156 {
12157 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12158 return -99;
12159 }
12160
12161 if (next_node_name == 0)
12162 {
12163 errmsg ("next node name required");
12164 return -99;
12165 }
12166 if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name))
12167 {
12168 errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name));
12169 return -99;
12170 }
12171
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012172 M (GET_NEXT_INDEX, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012173 clib_memcpy (mp->node_name, node_name, vec_len (node_name));
12174 clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name));
12175 vec_free (node_name);
12176 vec_free (next_node_name);
12177
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012178 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012179 W (ret);
12180 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012181}
12182
12183static int
12184api_add_node_next (vat_main_t * vam)
12185{
12186 unformat_input_t *i = vam->input;
12187 vl_api_add_node_next_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012188 u8 *name = 0;
12189 u8 *next = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012190 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012191
12192 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12193 {
12194 if (unformat (i, "node %s", &name))
12195 ;
12196 else if (unformat (i, "next %s", &next))
12197 ;
12198 else
12199 break;
12200 }
12201 if (name == 0)
12202 {
12203 errmsg ("node name required");
12204 return -99;
12205 }
12206 if (vec_len (name) >= ARRAY_LEN (mp->node_name))
12207 {
12208 errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name));
12209 return -99;
12210 }
12211 if (next == 0)
12212 {
12213 errmsg ("next node required");
12214 return -99;
12215 }
12216 if (vec_len (next) >= ARRAY_LEN (mp->next_name))
12217 {
12218 errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name));
12219 return -99;
12220 }
12221
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012222 M (ADD_NODE_NEXT, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012223 clib_memcpy (mp->node_name, name, vec_len (name));
12224 clib_memcpy (mp->next_name, next, vec_len (next));
12225 vec_free (name);
12226 vec_free (next);
12227
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012228 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012229 W (ret);
12230 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012231}
12232
12233static int
12234api_l2tpv3_create_tunnel (vat_main_t * vam)
12235{
12236 unformat_input_t *i = vam->input;
12237 ip6_address_t client_address, our_address;
12238 int client_address_set = 0;
12239 int our_address_set = 0;
12240 u32 local_session_id = 0;
12241 u32 remote_session_id = 0;
12242 u64 local_cookie = 0;
12243 u64 remote_cookie = 0;
12244 u8 l2_sublayer_present = 0;
12245 vl_api_l2tpv3_create_tunnel_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012246 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012247
12248 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12249 {
12250 if (unformat (i, "client_address %U", unformat_ip6_address,
12251 &client_address))
12252 client_address_set = 1;
12253 else if (unformat (i, "our_address %U", unformat_ip6_address,
12254 &our_address))
12255 our_address_set = 1;
12256 else if (unformat (i, "local_session_id %d", &local_session_id))
12257 ;
12258 else if (unformat (i, "remote_session_id %d", &remote_session_id))
12259 ;
12260 else if (unformat (i, "local_cookie %lld", &local_cookie))
12261 ;
12262 else if (unformat (i, "remote_cookie %lld", &remote_cookie))
12263 ;
12264 else if (unformat (i, "l2-sublayer-present"))
12265 l2_sublayer_present = 1;
12266 else
12267 break;
12268 }
12269
12270 if (client_address_set == 0)
12271 {
12272 errmsg ("client_address required");
12273 return -99;
12274 }
12275
12276 if (our_address_set == 0)
12277 {
12278 errmsg ("our_address required");
12279 return -99;
12280 }
12281
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012282 M (L2TPV3_CREATE_TUNNEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012283
12284 clib_memcpy (mp->client_address, client_address.as_u8,
12285 sizeof (mp->client_address));
12286
12287 clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address));
12288
12289 mp->local_session_id = ntohl (local_session_id);
12290 mp->remote_session_id = ntohl (remote_session_id);
12291 mp->local_cookie = clib_host_to_net_u64 (local_cookie);
12292 mp->remote_cookie = clib_host_to_net_u64 (remote_cookie);
12293 mp->l2_sublayer_present = l2_sublayer_present;
12294 mp->is_ipv6 = 1;
12295
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012296 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012297 W (ret);
12298 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012299}
12300
12301static int
12302api_l2tpv3_set_tunnel_cookies (vat_main_t * vam)
12303{
12304 unformat_input_t *i = vam->input;
12305 u32 sw_if_index;
12306 u8 sw_if_index_set = 0;
12307 u64 new_local_cookie = 0;
12308 u64 new_remote_cookie = 0;
12309 vl_api_l2tpv3_set_tunnel_cookies_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012310 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012311
12312 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12313 {
12314 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12315 sw_if_index_set = 1;
12316 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12317 sw_if_index_set = 1;
12318 else if (unformat (i, "new_local_cookie %lld", &new_local_cookie))
12319 ;
12320 else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie))
12321 ;
12322 else
12323 break;
12324 }
12325
12326 if (sw_if_index_set == 0)
12327 {
12328 errmsg ("missing interface name or sw_if_index");
12329 return -99;
12330 }
12331
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012332 M (L2TPV3_SET_TUNNEL_COOKIES, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012333
12334 mp->sw_if_index = ntohl (sw_if_index);
12335 mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie);
12336 mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie);
12337
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012338 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012339 W (ret);
12340 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012341}
12342
12343static int
12344api_l2tpv3_interface_enable_disable (vat_main_t * vam)
12345{
12346 unformat_input_t *i = vam->input;
12347 vl_api_l2tpv3_interface_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012348 u32 sw_if_index;
12349 u8 sw_if_index_set = 0;
12350 u8 enable_disable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012351 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012352
12353 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12354 {
12355 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
12356 sw_if_index_set = 1;
12357 else if (unformat (i, "sw_if_index %d", &sw_if_index))
12358 sw_if_index_set = 1;
12359 else if (unformat (i, "enable"))
12360 enable_disable = 1;
12361 else if (unformat (i, "disable"))
12362 enable_disable = 0;
12363 else
12364 break;
12365 }
12366
12367 if (sw_if_index_set == 0)
12368 {
12369 errmsg ("missing interface name or sw_if_index");
12370 return -99;
12371 }
12372
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012373 M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012374
12375 mp->sw_if_index = ntohl (sw_if_index);
12376 mp->enable_disable = enable_disable;
12377
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012378 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012379 W (ret);
12380 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012381}
12382
12383static int
12384api_l2tpv3_set_lookup_key (vat_main_t * vam)
12385{
12386 unformat_input_t *i = vam->input;
12387 vl_api_l2tpv3_set_lookup_key_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012388 u8 key = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012389 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012390
12391 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12392 {
12393 if (unformat (i, "lookup_v6_src"))
12394 key = L2T_LOOKUP_SRC_ADDRESS;
12395 else if (unformat (i, "lookup_v6_dst"))
12396 key = L2T_LOOKUP_DST_ADDRESS;
12397 else if (unformat (i, "lookup_session_id"))
12398 key = L2T_LOOKUP_SESSION_ID;
12399 else
12400 break;
12401 }
12402
12403 if (key == (u8) ~ 0)
12404 {
12405 errmsg ("l2tp session lookup key unset");
12406 return -99;
12407 }
12408
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012409 M (L2TPV3_SET_LOOKUP_KEY, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012410
12411 mp->key = key;
12412
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012413 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012414 W (ret);
12415 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012416}
12417
12418static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler
12419 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12420{
12421 vat_main_t *vam = &vat_main;
12422
12423 print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)",
12424 format_ip6_address, mp->our_address,
12425 format_ip6_address, mp->client_address,
12426 clib_net_to_host_u32 (mp->sw_if_index));
12427
12428 print (vam->ofp,
12429 " local cookies %016llx %016llx remote cookie %016llx",
12430 clib_net_to_host_u64 (mp->local_cookie[0]),
12431 clib_net_to_host_u64 (mp->local_cookie[1]),
12432 clib_net_to_host_u64 (mp->remote_cookie));
12433
12434 print (vam->ofp, " local session-id %d remote session-id %d",
12435 clib_net_to_host_u32 (mp->local_session_id),
12436 clib_net_to_host_u32 (mp->remote_session_id));
12437
12438 print (vam->ofp, " l2 specific sublayer %s\n",
12439 mp->l2_sublayer_present ? "preset" : "absent");
12440
12441}
12442
12443static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json
12444 (vl_api_sw_if_l2tpv3_tunnel_details_t * mp)
12445{
12446 vat_main_t *vam = &vat_main;
12447 vat_json_node_t *node = NULL;
12448 struct in6_addr addr;
12449
12450 if (VAT_JSON_ARRAY != vam->json_tree.type)
12451 {
12452 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12453 vat_json_init_array (&vam->json_tree);
12454 }
12455 node = vat_json_array_add (&vam->json_tree);
12456
12457 vat_json_init_object (node);
12458
12459 clib_memcpy (&addr, mp->our_address, sizeof (addr));
12460 vat_json_object_add_ip6 (node, "our_address", addr);
12461 clib_memcpy (&addr, mp->client_address, sizeof (addr));
12462 vat_json_object_add_ip6 (node, "client_address", addr);
12463
12464 vat_json_node_t *lc = vat_json_object_add (node, "local_cookie");
12465 vat_json_init_array (lc);
12466 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0]));
12467 vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1]));
12468 vat_json_object_add_uint (node, "remote_cookie",
12469 clib_net_to_host_u64 (mp->remote_cookie));
12470
12471 printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id));
12472 vat_json_object_add_uint (node, "local_session_id",
12473 clib_net_to_host_u32 (mp->local_session_id));
12474 vat_json_object_add_uint (node, "remote_session_id",
12475 clib_net_to_host_u32 (mp->remote_session_id));
12476 vat_json_object_add_string_copy (node, "l2_sublayer",
12477 mp->l2_sublayer_present ? (u8 *) "present"
12478 : (u8 *) "absent");
12479}
12480
12481static int
12482api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam)
12483{
12484 vl_api_sw_if_l2tpv3_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060012485 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012486 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012487
12488 /* Get list of l2tpv3-tunnel interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012489 M (SW_IF_L2TPV3_TUNNEL_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012490 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012491
12492 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040012493 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060012494 S (mp_ping);
12495
Jon Loeliger56c7b012017-02-01 12:31:41 -060012496 W (ret);
12497 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012498}
12499
12500
Damjan Marion8389fb92017-10-13 18:29:53 +020012501static void vl_api_sw_interface_tap_v2_details_t_handler
12502 (vl_api_sw_interface_tap_v2_details_t * mp)
12503{
12504 vat_main_t *vam = &vat_main;
12505
Milan Lenco73e7f422017-12-14 10:04:25 +010012506 u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr,
12507 mp->host_ip4_prefix_len);
12508 u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr,
12509 mp->host_ip6_prefix_len);
12510
12511 print (vam->ofp,
Andrew Yourtchenko754f24b2019-01-07 20:56:46 +010012512 "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s 0x%-08x",
Milan Lenco73e7f422017-12-14 10:04:25 +010012513 mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id),
12514 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12515 format_ethernet_address, mp->host_mac_addr, mp->host_namespace,
Andrew Yourtchenko754f24b2019-01-07 20:56:46 +010012516 mp->host_bridge, ip4, ip6, ntohl (mp->tap_flags));
Milan Lenco73e7f422017-12-14 10:04:25 +010012517
12518 vec_free (ip4);
12519 vec_free (ip6);
Damjan Marion8389fb92017-10-13 18:29:53 +020012520}
12521
12522static void vl_api_sw_interface_tap_v2_details_t_handler_json
12523 (vl_api_sw_interface_tap_v2_details_t * mp)
12524{
12525 vat_main_t *vam = &vat_main;
12526 vat_json_node_t *node = NULL;
12527
12528 if (VAT_JSON_ARRAY != vam->json_tree.type)
12529 {
12530 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12531 vat_json_init_array (&vam->json_tree);
12532 }
12533 node = vat_json_array_add (&vam->json_tree);
12534
12535 vat_json_init_object (node);
Milan Lenco73e7f422017-12-14 10:04:25 +010012536 vat_json_object_add_uint (node, "id", ntohl (mp->id));
Damjan Marion8389fb92017-10-13 18:29:53 +020012537 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
Andrew Yourtchenko754f24b2019-01-07 20:56:46 +010012538 vat_json_object_add_uint (node, "tap_flags", ntohl (mp->tap_flags));
Damjan Marion8389fb92017-10-13 18:29:53 +020012539 vat_json_object_add_string_copy (node, "dev_name", mp->dev_name);
Milan Lenco73e7f422017-12-14 10:04:25 +010012540 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12541 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12542 vat_json_object_add_string_copy (node, "host_mac_addr",
12543 format (0, "%U", format_ethernet_address,
12544 &mp->host_mac_addr));
12545 vat_json_object_add_string_copy (node, "host_namespace",
12546 mp->host_namespace);
12547 vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge);
12548 vat_json_object_add_string_copy (node, "host_ip4_addr",
12549 format (0, "%U/%d", format_ip4_address,
12550 mp->host_ip4_addr,
12551 mp->host_ip4_prefix_len));
12552 vat_json_object_add_string_copy (node, "host_ip6_addr",
12553 format (0, "%U/%d", format_ip6_address,
12554 mp->host_ip6_addr,
12555 mp->host_ip6_prefix_len));
12556
Damjan Marion8389fb92017-10-13 18:29:53 +020012557}
12558
12559static int
12560api_sw_interface_tap_v2_dump (vat_main_t * vam)
12561{
12562 vl_api_sw_interface_tap_v2_dump_t *mp;
12563 vl_api_control_ping_t *mp_ping;
12564 int ret;
12565
Milan Lenco73e7f422017-12-14 10:04:25 +010012566 print (vam->ofp,
12567 "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s",
12568 "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz",
12569 "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr",
12570 "host_ip6_addr");
12571
Damjan Marion8389fb92017-10-13 18:29:53 +020012572 /* Get list of tap interfaces */
12573 M (SW_INTERFACE_TAP_V2_DUMP, mp);
12574 S (mp);
12575
12576 /* Use a control ping for synchronization */
12577 MPING (CONTROL_PING, mp_ping);
12578 S (mp_ping);
12579
12580 W (ret);
12581 return ret;
12582}
12583
Mohsin Kazmi03ae24b2019-01-18 11:50:00 +010012584static void vl_api_sw_interface_virtio_pci_details_t_handler
12585 (vl_api_sw_interface_virtio_pci_details_t * mp)
12586{
12587 vat_main_t *vam = &vat_main;
12588
12589 typedef union
12590 {
12591 struct
12592 {
12593 u16 domain;
12594 u8 bus;
12595 u8 slot:5;
12596 u8 function:3;
12597 };
12598 u32 as_u32;
12599 } pci_addr_t;
12600 pci_addr_t addr;
12601 addr.as_u32 = ntohl (mp->pci_addr);
12602 u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus,
12603 addr.slot, addr.function);
12604
12605 print (vam->ofp,
12606 "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx",
12607 pci_addr, ntohl (mp->sw_if_index),
12608 ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz),
12609 format_ethernet_address, mp->mac_addr,
12610 clib_net_to_host_u64 (mp->features));
12611 vec_free (pci_addr);
12612}
12613
12614static void vl_api_sw_interface_virtio_pci_details_t_handler_json
12615 (vl_api_sw_interface_virtio_pci_details_t * mp)
12616{
12617 vat_main_t *vam = &vat_main;
12618 vat_json_node_t *node = NULL;
12619
12620 if (VAT_JSON_ARRAY != vam->json_tree.type)
12621 {
12622 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12623 vat_json_init_array (&vam->json_tree);
12624 }
12625 node = vat_json_array_add (&vam->json_tree);
12626
12627 vat_json_init_object (node);
12628 vat_json_object_add_uint (node, "pci-addr", ntohl (mp->pci_addr));
12629 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
12630 vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz));
12631 vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz));
12632 vat_json_object_add_uint (node, "features",
12633 clib_net_to_host_u64 (mp->features));
12634 vat_json_object_add_string_copy (node, "mac_addr",
12635 format (0, "%U", format_ethernet_address,
12636 &mp->mac_addr));
12637}
12638
12639static int
12640api_sw_interface_virtio_pci_dump (vat_main_t * vam)
12641{
12642 vl_api_sw_interface_virtio_pci_dump_t *mp;
12643 vl_api_control_ping_t *mp_ping;
12644 int ret;
12645
12646 print (vam->ofp,
12647 "\n%-12s %-12s %-12s %-12s %-17s %-08s",
12648 "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz",
12649 "mac_addr", "features");
12650
12651 /* Get list of tap interfaces */
12652 M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp);
12653 S (mp);
12654
12655 /* Use a control ping for synchronization */
12656 MPING (CONTROL_PING, mp_ping);
12657 S (mp_ping);
12658
12659 W (ret);
12660 return ret;
12661}
12662
eyal bariaf86a482018-04-17 11:20:27 +030012663static int
12664api_vxlan_offload_rx (vat_main_t * vam)
12665{
12666 unformat_input_t *line_input = vam->input;
12667 vl_api_vxlan_offload_rx_t *mp;
12668 u32 hw_if_index = ~0, rx_if_index = ~0;
12669 u8 is_add = 1;
12670 int ret;
12671
12672 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12673 {
12674 if (unformat (line_input, "del"))
12675 is_add = 0;
12676 else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam,
12677 &hw_if_index))
12678 ;
12679 else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index))
12680 ;
12681 else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam,
12682 &rx_if_index))
12683 ;
12684 else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index))
12685 ;
12686 else
12687 {
12688 errmsg ("parse error '%U'", format_unformat_error, line_input);
12689 return -99;
12690 }
12691 }
12692
12693 if (hw_if_index == ~0)
12694 {
12695 errmsg ("no hw interface");
12696 return -99;
12697 }
12698
12699 if (rx_if_index == ~0)
12700 {
12701 errmsg ("no rx tunnel");
12702 return -99;
12703 }
12704
12705 M (VXLAN_OFFLOAD_RX, mp);
12706
12707 mp->hw_if_index = ntohl (hw_if_index);
12708 mp->sw_if_index = ntohl (rx_if_index);
12709 mp->enable = is_add;
12710
12711 S (mp);
12712 W (ret);
12713 return ret;
12714}
12715
Damjan Marion7cd468a2016-12-19 23:05:39 +010012716static uword unformat_vxlan_decap_next
12717 (unformat_input_t * input, va_list * args)
12718{
12719 u32 *result = va_arg (*args, u32 *);
12720 u32 tmp;
12721
12722 if (unformat (input, "l2"))
12723 *result = VXLAN_INPUT_NEXT_L2_INPUT;
12724 else if (unformat (input, "%d", &tmp))
12725 *result = tmp;
12726 else
12727 return 0;
12728 return 1;
12729}
12730
12731static int
12732api_vxlan_add_del_tunnel (vat_main_t * vam)
12733{
12734 unformat_input_t *line_input = vam->input;
12735 vl_api_vxlan_add_del_tunnel_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012736 ip46_address_t src, dst;
12737 u8 is_add = 1;
12738 u8 ipv4_set = 0, ipv6_set = 0;
12739 u8 src_set = 0;
12740 u8 dst_set = 0;
12741 u8 grp_set = 0;
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012742 u32 instance = ~0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012743 u32 mcast_sw_if_index = ~0;
12744 u32 encap_vrf_id = 0;
12745 u32 decap_next_index = ~0;
12746 u32 vni = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012747 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012748
12749 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
Dave Barachb7b92992018-10-17 10:38:51 -040012750 clib_memset (&src, 0, sizeof src);
12751 clib_memset (&dst, 0, sizeof dst);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012752
12753 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
12754 {
12755 if (unformat (line_input, "del"))
12756 is_add = 0;
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012757 else if (unformat (line_input, "instance %d", &instance))
12758 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012759 else
12760 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
12761 {
12762 ipv4_set = 1;
12763 src_set = 1;
12764 }
12765 else
12766 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
12767 {
12768 ipv4_set = 1;
12769 dst_set = 1;
12770 }
12771 else
12772 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
12773 {
12774 ipv6_set = 1;
12775 src_set = 1;
12776 }
12777 else
12778 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
12779 {
12780 ipv6_set = 1;
12781 dst_set = 1;
12782 }
12783 else if (unformat (line_input, "group %U %U",
12784 unformat_ip4_address, &dst.ip4,
12785 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12786 {
12787 grp_set = dst_set = 1;
12788 ipv4_set = 1;
12789 }
12790 else if (unformat (line_input, "group %U",
12791 unformat_ip4_address, &dst.ip4))
12792 {
12793 grp_set = dst_set = 1;
12794 ipv4_set = 1;
12795 }
12796 else if (unformat (line_input, "group %U %U",
12797 unformat_ip6_address, &dst.ip6,
12798 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
12799 {
12800 grp_set = dst_set = 1;
12801 ipv6_set = 1;
12802 }
12803 else if (unformat (line_input, "group %U",
12804 unformat_ip6_address, &dst.ip6))
12805 {
12806 grp_set = dst_set = 1;
12807 ipv6_set = 1;
12808 }
12809 else
12810 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
12811 ;
12812 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
12813 ;
12814 else if (unformat (line_input, "decap-next %U",
12815 unformat_vxlan_decap_next, &decap_next_index))
12816 ;
12817 else if (unformat (line_input, "vni %d", &vni))
12818 ;
12819 else
12820 {
12821 errmsg ("parse error '%U'", format_unformat_error, line_input);
12822 return -99;
12823 }
12824 }
12825
12826 if (src_set == 0)
12827 {
12828 errmsg ("tunnel src address not specified");
12829 return -99;
12830 }
12831 if (dst_set == 0)
12832 {
12833 errmsg ("tunnel dst address not specified");
12834 return -99;
12835 }
12836
12837 if (grp_set && !ip46_address_is_multicast (&dst))
12838 {
12839 errmsg ("tunnel group address not multicast");
12840 return -99;
12841 }
12842 if (grp_set && mcast_sw_if_index == ~0)
12843 {
12844 errmsg ("tunnel nonexistent multicast device");
12845 return -99;
12846 }
12847 if (grp_set == 0 && ip46_address_is_multicast (&dst))
12848 {
12849 errmsg ("tunnel dst address must be unicast");
12850 return -99;
12851 }
12852
12853
12854 if (ipv4_set && ipv6_set)
12855 {
12856 errmsg ("both IPv4 and IPv6 addresses specified");
12857 return -99;
12858 }
12859
12860 if ((vni == 0) || (vni >> 24))
12861 {
12862 errmsg ("vni not specified or out of range");
12863 return -99;
12864 }
12865
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012866 M (VXLAN_ADD_DEL_TUNNEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012867
12868 if (ipv6_set)
12869 {
12870 clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6));
12871 clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6));
12872 }
12873 else
12874 {
12875 clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4));
12876 clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4));
12877 }
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012878
12879 mp->instance = htonl (instance);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012880 mp->encap_vrf_id = ntohl (encap_vrf_id);
12881 mp->decap_next_index = ntohl (decap_next_index);
12882 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
12883 mp->vni = ntohl (vni);
12884 mp->is_add = is_add;
12885 mp->is_ipv6 = ipv6_set;
12886
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012887 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060012888 W (ret);
12889 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012890}
12891
12892static void vl_api_vxlan_tunnel_details_t_handler
12893 (vl_api_vxlan_tunnel_details_t * mp)
12894{
12895 vat_main_t *vam = &vat_main;
Eyal Barie101e1f2017-03-15 08:23:42 +020012896 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
12897 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012898
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012899 print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010012900 ntohl (mp->sw_if_index),
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012901 ntohl (mp->instance),
Damjan Marion7cd468a2016-12-19 23:05:39 +010012902 format_ip46_address, &src, IP46_TYPE_ANY,
12903 format_ip46_address, &dst, IP46_TYPE_ANY,
12904 ntohl (mp->encap_vrf_id),
12905 ntohl (mp->decap_next_index), ntohl (mp->vni),
12906 ntohl (mp->mcast_sw_if_index));
12907}
12908
12909static void vl_api_vxlan_tunnel_details_t_handler_json
12910 (vl_api_vxlan_tunnel_details_t * mp)
12911{
12912 vat_main_t *vam = &vat_main;
12913 vat_json_node_t *node = NULL;
12914
12915 if (VAT_JSON_ARRAY != vam->json_tree.type)
12916 {
12917 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
12918 vat_json_init_array (&vam->json_tree);
12919 }
12920 node = vat_json_array_add (&vam->json_tree);
12921
12922 vat_json_init_object (node);
12923 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012924
12925 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
12926
Damjan Marion7cd468a2016-12-19 23:05:39 +010012927 if (mp->is_ipv6)
12928 {
12929 struct in6_addr ip6;
12930
12931 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
12932 vat_json_object_add_ip6 (node, "src_address", ip6);
12933 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
12934 vat_json_object_add_ip6 (node, "dst_address", ip6);
12935 }
12936 else
12937 {
12938 struct in_addr ip4;
12939
12940 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
12941 vat_json_object_add_ip4 (node, "src_address", ip4);
12942 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
12943 vat_json_object_add_ip4 (node, "dst_address", ip4);
12944 }
12945 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
12946 vat_json_object_add_uint (node, "decap_next_index",
12947 ntohl (mp->decap_next_index));
12948 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
12949 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
12950 vat_json_object_add_uint (node, "mcast_sw_if_index",
12951 ntohl (mp->mcast_sw_if_index));
12952}
12953
12954static int
12955api_vxlan_tunnel_dump (vat_main_t * vam)
12956{
12957 unformat_input_t *i = vam->input;
12958 vl_api_vxlan_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060012959 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012960 u32 sw_if_index;
12961 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060012962 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012963
12964 /* Parse args required to build the message */
12965 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
12966 {
12967 if (unformat (i, "sw_if_index %d", &sw_if_index))
12968 sw_if_index_set = 1;
12969 else
12970 break;
12971 }
12972
12973 if (sw_if_index_set == 0)
12974 {
12975 sw_if_index = ~0;
12976 }
12977
12978 if (!vam->json_output)
12979 {
Jon Loeliger3d460bd2018-02-01 16:36:12 -060012980 print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s",
12981 "sw_if_index", "instance", "src_address", "dst_address",
Damjan Marion7cd468a2016-12-19 23:05:39 +010012982 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
12983 }
12984
12985 /* Get list of vxlan-tunnel interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060012986 M (VXLAN_TUNNEL_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012987
12988 mp->sw_if_index = htonl (sw_if_index);
12989
Jon Loeliger7bc770c2017-01-31 14:03:33 -060012990 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010012991
12992 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040012993 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060012994 S (mp_ping);
12995
Jon Loeliger56c7b012017-02-01 12:31:41 -060012996 W (ret);
12997 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010012998}
12999
Marco Varleseb598f1d2017-09-19 14:25:28 +020013000static uword unformat_geneve_decap_next
13001 (unformat_input_t * input, va_list * args)
13002{
13003 u32 *result = va_arg (*args, u32 *);
13004 u32 tmp;
13005
13006 if (unformat (input, "l2"))
13007 *result = GENEVE_INPUT_NEXT_L2_INPUT;
13008 else if (unformat (input, "%d", &tmp))
13009 *result = tmp;
13010 else
13011 return 0;
13012 return 1;
13013}
13014
13015static int
13016api_geneve_add_del_tunnel (vat_main_t * vam)
13017{
13018 unformat_input_t *line_input = vam->input;
13019 vl_api_geneve_add_del_tunnel_t *mp;
13020 ip46_address_t src, dst;
13021 u8 is_add = 1;
13022 u8 ipv4_set = 0, ipv6_set = 0;
13023 u8 src_set = 0;
13024 u8 dst_set = 0;
13025 u8 grp_set = 0;
13026 u32 mcast_sw_if_index = ~0;
13027 u32 encap_vrf_id = 0;
13028 u32 decap_next_index = ~0;
13029 u32 vni = 0;
13030 int ret;
13031
13032 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
Dave Barachb7b92992018-10-17 10:38:51 -040013033 clib_memset (&src, 0, sizeof src);
13034 clib_memset (&dst, 0, sizeof dst);
Marco Varleseb598f1d2017-09-19 14:25:28 +020013035
13036 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13037 {
13038 if (unformat (line_input, "del"))
13039 is_add = 0;
13040 else
13041 if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4))
13042 {
13043 ipv4_set = 1;
13044 src_set = 1;
13045 }
13046 else
13047 if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4))
13048 {
13049 ipv4_set = 1;
13050 dst_set = 1;
13051 }
13052 else
13053 if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6))
13054 {
13055 ipv6_set = 1;
13056 src_set = 1;
13057 }
13058 else
13059 if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6))
13060 {
13061 ipv6_set = 1;
13062 dst_set = 1;
13063 }
13064 else if (unformat (line_input, "group %U %U",
13065 unformat_ip4_address, &dst.ip4,
13066 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13067 {
13068 grp_set = dst_set = 1;
13069 ipv4_set = 1;
13070 }
13071 else if (unformat (line_input, "group %U",
13072 unformat_ip4_address, &dst.ip4))
13073 {
13074 grp_set = dst_set = 1;
13075 ipv4_set = 1;
13076 }
13077 else if (unformat (line_input, "group %U %U",
13078 unformat_ip6_address, &dst.ip6,
13079 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13080 {
13081 grp_set = dst_set = 1;
13082 ipv6_set = 1;
13083 }
13084 else if (unformat (line_input, "group %U",
13085 unformat_ip6_address, &dst.ip6))
13086 {
13087 grp_set = dst_set = 1;
13088 ipv6_set = 1;
13089 }
13090 else
13091 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13092 ;
13093 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13094 ;
13095 else if (unformat (line_input, "decap-next %U",
13096 unformat_geneve_decap_next, &decap_next_index))
13097 ;
13098 else if (unformat (line_input, "vni %d", &vni))
13099 ;
13100 else
13101 {
13102 errmsg ("parse error '%U'", format_unformat_error, line_input);
13103 return -99;
13104 }
13105 }
13106
13107 if (src_set == 0)
13108 {
13109 errmsg ("tunnel src address not specified");
13110 return -99;
13111 }
13112 if (dst_set == 0)
13113 {
13114 errmsg ("tunnel dst address not specified");
13115 return -99;
13116 }
13117
13118 if (grp_set && !ip46_address_is_multicast (&dst))
13119 {
13120 errmsg ("tunnel group address not multicast");
13121 return -99;
13122 }
13123 if (grp_set && mcast_sw_if_index == ~0)
13124 {
13125 errmsg ("tunnel nonexistent multicast device");
13126 return -99;
13127 }
13128 if (grp_set == 0 && ip46_address_is_multicast (&dst))
13129 {
13130 errmsg ("tunnel dst address must be unicast");
13131 return -99;
13132 }
13133
13134
13135 if (ipv4_set && ipv6_set)
13136 {
13137 errmsg ("both IPv4 and IPv6 addresses specified");
13138 return -99;
13139 }
13140
13141 if ((vni == 0) || (vni >> 24))
13142 {
13143 errmsg ("vni not specified or out of range");
13144 return -99;
13145 }
13146
13147 M (GENEVE_ADD_DEL_TUNNEL, mp);
13148
13149 if (ipv6_set)
13150 {
13151 clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6));
13152 clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6));
13153 }
13154 else
13155 {
13156 clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4));
13157 clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4));
13158 }
13159 mp->encap_vrf_id = ntohl (encap_vrf_id);
13160 mp->decap_next_index = ntohl (decap_next_index);
13161 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
13162 mp->vni = ntohl (vni);
13163 mp->is_add = is_add;
13164 mp->is_ipv6 = ipv6_set;
13165
13166 S (mp);
13167 W (ret);
13168 return ret;
13169}
13170
13171static void vl_api_geneve_tunnel_details_t_handler
13172 (vl_api_geneve_tunnel_details_t * mp)
13173{
13174 vat_main_t *vam = &vat_main;
13175 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address);
13176 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address);
13177
13178 print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d",
13179 ntohl (mp->sw_if_index),
13180 format_ip46_address, &src, IP46_TYPE_ANY,
13181 format_ip46_address, &dst, IP46_TYPE_ANY,
13182 ntohl (mp->encap_vrf_id),
13183 ntohl (mp->decap_next_index), ntohl (mp->vni),
13184 ntohl (mp->mcast_sw_if_index));
13185}
13186
13187static void vl_api_geneve_tunnel_details_t_handler_json
13188 (vl_api_geneve_tunnel_details_t * mp)
13189{
13190 vat_main_t *vam = &vat_main;
13191 vat_json_node_t *node = NULL;
13192
13193 if (VAT_JSON_ARRAY != vam->json_tree.type)
13194 {
13195 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13196 vat_json_init_array (&vam->json_tree);
13197 }
13198 node = vat_json_array_add (&vam->json_tree);
13199
13200 vat_json_init_object (node);
13201 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13202 if (mp->is_ipv6)
13203 {
13204 struct in6_addr ip6;
13205
13206 clib_memcpy (&ip6, mp->src_address, sizeof (ip6));
13207 vat_json_object_add_ip6 (node, "src_address", ip6);
13208 clib_memcpy (&ip6, mp->dst_address, sizeof (ip6));
13209 vat_json_object_add_ip6 (node, "dst_address", ip6);
13210 }
13211 else
13212 {
13213 struct in_addr ip4;
13214
13215 clib_memcpy (&ip4, mp->src_address, sizeof (ip4));
13216 vat_json_object_add_ip4 (node, "src_address", ip4);
13217 clib_memcpy (&ip4, mp->dst_address, sizeof (ip4));
13218 vat_json_object_add_ip4 (node, "dst_address", ip4);
13219 }
13220 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
13221 vat_json_object_add_uint (node, "decap_next_index",
13222 ntohl (mp->decap_next_index));
13223 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
13224 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
13225 vat_json_object_add_uint (node, "mcast_sw_if_index",
13226 ntohl (mp->mcast_sw_if_index));
13227}
13228
13229static int
13230api_geneve_tunnel_dump (vat_main_t * vam)
13231{
13232 unformat_input_t *i = vam->input;
13233 vl_api_geneve_tunnel_dump_t *mp;
13234 vl_api_control_ping_t *mp_ping;
13235 u32 sw_if_index;
13236 u8 sw_if_index_set = 0;
13237 int ret;
13238
13239 /* Parse args required to build the message */
13240 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13241 {
13242 if (unformat (i, "sw_if_index %d", &sw_if_index))
13243 sw_if_index_set = 1;
13244 else
13245 break;
13246 }
13247
13248 if (sw_if_index_set == 0)
13249 {
13250 sw_if_index = ~0;
13251 }
13252
13253 if (!vam->json_output)
13254 {
13255 print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s",
13256 "sw_if_index", "local_address", "remote_address",
13257 "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index");
13258 }
13259
13260 /* Get list of geneve-tunnel interfaces */
13261 M (GENEVE_TUNNEL_DUMP, mp);
13262
13263 mp->sw_if_index = htonl (sw_if_index);
13264
13265 S (mp);
13266
13267 /* Use a control ping for synchronization */
13268 M (CONTROL_PING, mp_ping);
13269 S (mp_ping);
13270
13271 W (ret);
13272 return ret;
13273}
13274
Damjan Marion7cd468a2016-12-19 23:05:39 +010013275static int
13276api_gre_add_del_tunnel (vat_main_t * vam)
13277{
13278 unformat_input_t *line_input = vam->input;
13279 vl_api_gre_add_del_tunnel_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013280 ip4_address_t src4, dst4;
Ciara Loftus7eac9162016-09-30 15:47:03 +010013281 ip6_address_t src6, dst6;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013282 u8 is_add = 1;
Ciara Loftus7eac9162016-09-30 15:47:03 +010013283 u8 ipv4_set = 0;
13284 u8 ipv6_set = 0;
John Loa43ccae2018-02-13 17:15:23 -050013285 u8 t_type = GRE_TUNNEL_TYPE_L3;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013286 u8 src_set = 0;
13287 u8 dst_set = 0;
13288 u32 outer_fib_id = 0;
John Loa43ccae2018-02-13 17:15:23 -050013289 u32 session_id = 0;
13290 u32 instance = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013291 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013292
Dave Barachb7b92992018-10-17 10:38:51 -040013293 clib_memset (&src4, 0, sizeof src4);
13294 clib_memset (&dst4, 0, sizeof dst4);
13295 clib_memset (&src6, 0, sizeof src6);
13296 clib_memset (&dst6, 0, sizeof dst6);
Ciara Loftus7eac9162016-09-30 15:47:03 +010013297
Damjan Marion7cd468a2016-12-19 23:05:39 +010013298 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13299 {
13300 if (unformat (line_input, "del"))
13301 is_add = 0;
John Loa43ccae2018-02-13 17:15:23 -050013302 else if (unformat (line_input, "instance %d", &instance))
13303 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013304 else if (unformat (line_input, "src %U", unformat_ip4_address, &src4))
Ciara Loftus7eac9162016-09-30 15:47:03 +010013305 {
13306 src_set = 1;
13307 ipv4_set = 1;
13308 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010013309 else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4))
Ciara Loftus7eac9162016-09-30 15:47:03 +010013310 {
13311 dst_set = 1;
13312 ipv4_set = 1;
13313 }
13314 else if (unformat (line_input, "src %U", unformat_ip6_address, &src6))
13315 {
13316 src_set = 1;
13317 ipv6_set = 1;
13318 }
13319 else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6))
13320 {
13321 dst_set = 1;
13322 ipv6_set = 1;
13323 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010013324 else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id))
13325 ;
13326 else if (unformat (line_input, "teb"))
John Loa43ccae2018-02-13 17:15:23 -050013327 t_type = GRE_TUNNEL_TYPE_TEB;
13328 else if (unformat (line_input, "erspan %d", &session_id))
13329 t_type = GRE_TUNNEL_TYPE_ERSPAN;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013330 else
13331 {
13332 errmsg ("parse error '%U'", format_unformat_error, line_input);
13333 return -99;
13334 }
13335 }
13336
13337 if (src_set == 0)
13338 {
13339 errmsg ("tunnel src address not specified");
13340 return -99;
13341 }
13342 if (dst_set == 0)
13343 {
13344 errmsg ("tunnel dst address not specified");
13345 return -99;
13346 }
Ciara Loftus7eac9162016-09-30 15:47:03 +010013347 if (ipv4_set && ipv6_set)
13348 {
13349 errmsg ("both IPv4 and IPv6 addresses specified");
13350 return -99;
13351 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010013352
13353
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013354 M (GRE_ADD_DEL_TUNNEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013355
Ciara Loftus7eac9162016-09-30 15:47:03 +010013356 if (ipv4_set)
13357 {
13358 clib_memcpy (&mp->src_address, &src4, 4);
13359 clib_memcpy (&mp->dst_address, &dst4, 4);
13360 }
13361 else
13362 {
13363 clib_memcpy (&mp->src_address, &src6, 16);
13364 clib_memcpy (&mp->dst_address, &dst6, 16);
13365 }
John Loa43ccae2018-02-13 17:15:23 -050013366 mp->instance = htonl (instance);
13367 mp->outer_fib_id = htonl (outer_fib_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013368 mp->is_add = is_add;
John Loa43ccae2018-02-13 17:15:23 -050013369 mp->session_id = htons ((u16) session_id);
13370 mp->tunnel_type = t_type;
Ciara Loftus7eac9162016-09-30 15:47:03 +010013371 mp->is_ipv6 = ipv6_set;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013372
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013373 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013374 W (ret);
13375 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013376}
13377
13378static void vl_api_gre_tunnel_details_t_handler
13379 (vl_api_gre_tunnel_details_t * mp)
13380{
13381 vat_main_t *vam = &vat_main;
Ciara Loftus7eac9162016-09-30 15:47:03 +010013382 ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address);
13383 ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013384
John Loa43ccae2018-02-13 17:15:23 -050013385 print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010013386 ntohl (mp->sw_if_index),
John Loa43ccae2018-02-13 17:15:23 -050013387 ntohl (mp->instance),
Ciara Loftus7eac9162016-09-30 15:47:03 +010013388 format_ip46_address, &src, IP46_TYPE_ANY,
13389 format_ip46_address, &dst, IP46_TYPE_ANY,
John Loa43ccae2018-02-13 17:15:23 -050013390 mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id));
Damjan Marion7cd468a2016-12-19 23:05:39 +010013391}
13392
13393static void vl_api_gre_tunnel_details_t_handler_json
13394 (vl_api_gre_tunnel_details_t * mp)
13395{
13396 vat_main_t *vam = &vat_main;
13397 vat_json_node_t *node = NULL;
13398 struct in_addr ip4;
Ciara Loftus7eac9162016-09-30 15:47:03 +010013399 struct in6_addr ip6;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013400
13401 if (VAT_JSON_ARRAY != vam->json_tree.type)
13402 {
13403 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13404 vat_json_init_array (&vam->json_tree);
13405 }
13406 node = vat_json_array_add (&vam->json_tree);
13407
13408 vat_json_init_object (node);
13409 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
John Loa43ccae2018-02-13 17:15:23 -050013410 vat_json_object_add_uint (node, "instance", ntohl (mp->instance));
Ciara Loftus7eac9162016-09-30 15:47:03 +010013411 if (!mp->is_ipv6)
13412 {
13413 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
13414 vat_json_object_add_ip4 (node, "src_address", ip4);
13415 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
13416 vat_json_object_add_ip4 (node, "dst_address", ip4);
13417 }
13418 else
13419 {
13420 clib_memcpy (&ip6, &mp->src_address, sizeof (ip6));
13421 vat_json_object_add_ip6 (node, "src_address", ip6);
13422 clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6));
13423 vat_json_object_add_ip6 (node, "dst_address", ip6);
13424 }
John Loa43ccae2018-02-13 17:15:23 -050013425 vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013426 vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id));
Ciara Loftus7eac9162016-09-30 15:47:03 +010013427 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6);
John Loa43ccae2018-02-13 17:15:23 -050013428 vat_json_object_add_uint (node, "session_id", mp->session_id);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013429}
13430
13431static int
13432api_gre_tunnel_dump (vat_main_t * vam)
13433{
13434 unformat_input_t *i = vam->input;
13435 vl_api_gre_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060013436 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013437 u32 sw_if_index;
13438 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013439 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013440
13441 /* Parse args required to build the message */
13442 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13443 {
13444 if (unformat (i, "sw_if_index %d", &sw_if_index))
13445 sw_if_index_set = 1;
13446 else
13447 break;
13448 }
13449
13450 if (sw_if_index_set == 0)
13451 {
13452 sw_if_index = ~0;
13453 }
13454
13455 if (!vam->json_output)
13456 {
John Loa43ccae2018-02-13 17:15:23 -050013457 print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s",
13458 "sw_if_index", "instance", "src_address", "dst_address",
13459 "tunnel_type", "outer_fib_id", "session_id");
Damjan Marion7cd468a2016-12-19 23:05:39 +010013460 }
13461
13462 /* Get list of gre-tunnel interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013463 M (GRE_TUNNEL_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013464
13465 mp->sw_if_index = htonl (sw_if_index);
13466
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013467 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013468
13469 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040013470 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060013471 S (mp_ping);
13472
Jon Loeliger56c7b012017-02-01 12:31:41 -060013473 W (ret);
13474 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013475}
13476
13477static int
13478api_l2_fib_clear_table (vat_main_t * vam)
13479{
13480// unformat_input_t * i = vam->input;
13481 vl_api_l2_fib_clear_table_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013482 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013483
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013484 M (L2_FIB_CLEAR_TABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013485
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013486 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013487 W (ret);
13488 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013489}
13490
13491static int
13492api_l2_interface_efp_filter (vat_main_t * vam)
13493{
13494 unformat_input_t *i = vam->input;
13495 vl_api_l2_interface_efp_filter_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013496 u32 sw_if_index;
13497 u8 enable = 1;
13498 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013499 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013500
13501 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13502 {
13503 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13504 sw_if_index_set = 1;
13505 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13506 sw_if_index_set = 1;
13507 else if (unformat (i, "enable"))
13508 enable = 1;
13509 else if (unformat (i, "disable"))
13510 enable = 0;
13511 else
13512 {
13513 clib_warning ("parse error '%U'", format_unformat_error, i);
13514 return -99;
13515 }
13516 }
13517
13518 if (sw_if_index_set == 0)
13519 {
13520 errmsg ("missing sw_if_index");
13521 return -99;
13522 }
13523
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013524 M (L2_INTERFACE_EFP_FILTER, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013525
13526 mp->sw_if_index = ntohl (sw_if_index);
13527 mp->enable_disable = enable;
13528
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013529 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013530 W (ret);
13531 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013532}
13533
13534#define foreach_vtr_op \
13535_("disable", L2_VTR_DISABLED) \
13536_("push-1", L2_VTR_PUSH_1) \
13537_("push-2", L2_VTR_PUSH_2) \
13538_("pop-1", L2_VTR_POP_1) \
13539_("pop-2", L2_VTR_POP_2) \
13540_("translate-1-1", L2_VTR_TRANSLATE_1_1) \
13541_("translate-1-2", L2_VTR_TRANSLATE_1_2) \
13542_("translate-2-1", L2_VTR_TRANSLATE_2_1) \
13543_("translate-2-2", L2_VTR_TRANSLATE_2_2)
13544
13545static int
13546api_l2_interface_vlan_tag_rewrite (vat_main_t * vam)
13547{
13548 unformat_input_t *i = vam->input;
13549 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013550 u32 sw_if_index;
13551 u8 sw_if_index_set = 0;
13552 u8 vtr_op_set = 0;
13553 u32 vtr_op = 0;
13554 u32 push_dot1q = 1;
13555 u32 tag1 = ~0;
13556 u32 tag2 = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013557 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013558
13559 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13560 {
13561 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13562 sw_if_index_set = 1;
13563 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13564 sw_if_index_set = 1;
13565 else if (unformat (i, "vtr_op %d", &vtr_op))
13566 vtr_op_set = 1;
13567#define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;}
13568 foreach_vtr_op
13569#undef _
13570 else if (unformat (i, "push_dot1q %d", &push_dot1q))
13571 ;
13572 else if (unformat (i, "tag1 %d", &tag1))
13573 ;
13574 else if (unformat (i, "tag2 %d", &tag2))
13575 ;
13576 else
13577 {
13578 clib_warning ("parse error '%U'", format_unformat_error, i);
13579 return -99;
13580 }
13581 }
13582
13583 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
13584 {
13585 errmsg ("missing vtr operation or sw_if_index");
13586 return -99;
13587 }
13588
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013589 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
13590 mp->sw_if_index = ntohl (sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013591 mp->vtr_op = ntohl (vtr_op);
13592 mp->push_dot1q = ntohl (push_dot1q);
13593 mp->tag1 = ntohl (tag1);
13594 mp->tag2 = ntohl (tag2);
13595
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013596 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013597 W (ret);
13598 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013599}
13600
13601static int
13602api_create_vhost_user_if (vat_main_t * vam)
13603{
13604 unformat_input_t *i = vam->input;
13605 vl_api_create_vhost_user_if_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013606 u8 *file_name;
13607 u8 is_server = 0;
13608 u8 file_name_set = 0;
13609 u32 custom_dev_instance = ~0;
13610 u8 hwaddr[6];
13611 u8 use_custom_mac = 0;
Mohsin Kazmiee2e58f2018-08-21 16:07:03 +020013612 u8 disable_mrg_rxbuf = 0;
13613 u8 disable_indirect_desc = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013614 u8 *tag = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013615 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013616
13617 /* Shut up coverity */
Dave Barachb7b92992018-10-17 10:38:51 -040013618 clib_memset (hwaddr, 0, sizeof (hwaddr));
Damjan Marion7cd468a2016-12-19 23:05:39 +010013619
13620 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13621 {
13622 if (unformat (i, "socket %s", &file_name))
13623 {
13624 file_name_set = 1;
13625 }
13626 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13627 ;
13628 else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr))
13629 use_custom_mac = 1;
13630 else if (unformat (i, "server"))
13631 is_server = 1;
Mohsin Kazmiee2e58f2018-08-21 16:07:03 +020013632 else if (unformat (i, "disable_mrg_rxbuf"))
13633 disable_mrg_rxbuf = 1;
13634 else if (unformat (i, "disable_indirect_desc"))
13635 disable_indirect_desc = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013636 else if (unformat (i, "tag %s", &tag))
13637 ;
13638 else
13639 break;
13640 }
13641
13642 if (file_name_set == 0)
13643 {
13644 errmsg ("missing socket file name");
13645 return -99;
13646 }
13647
13648 if (vec_len (file_name) > 255)
13649 {
13650 errmsg ("socket file name too long");
13651 return -99;
13652 }
13653 vec_add1 (file_name, 0);
13654
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013655 M (CREATE_VHOST_USER_IF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013656
13657 mp->is_server = is_server;
Mohsin Kazmiee2e58f2018-08-21 16:07:03 +020013658 mp->disable_mrg_rxbuf = disable_mrg_rxbuf;
13659 mp->disable_indirect_desc = disable_indirect_desc;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013660 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13661 vec_free (file_name);
13662 if (custom_dev_instance != ~0)
13663 {
13664 mp->renumber = 1;
13665 mp->custom_dev_instance = ntohl (custom_dev_instance);
13666 }
Mohsin Kazmiee2e58f2018-08-21 16:07:03 +020013667
Damjan Marion7cd468a2016-12-19 23:05:39 +010013668 mp->use_custom_mac = use_custom_mac;
13669 clib_memcpy (mp->mac_address, hwaddr, 6);
13670 if (tag)
13671 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
13672 vec_free (tag);
13673
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013674 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013675 W (ret);
13676 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013677}
13678
13679static int
13680api_modify_vhost_user_if (vat_main_t * vam)
13681{
13682 unformat_input_t *i = vam->input;
13683 vl_api_modify_vhost_user_if_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013684 u8 *file_name;
13685 u8 is_server = 0;
13686 u8 file_name_set = 0;
13687 u32 custom_dev_instance = ~0;
13688 u8 sw_if_index_set = 0;
13689 u32 sw_if_index = (u32) ~ 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013690 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013691
13692 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13693 {
13694 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13695 sw_if_index_set = 1;
13696 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13697 sw_if_index_set = 1;
13698 else if (unformat (i, "socket %s", &file_name))
13699 {
13700 file_name_set = 1;
13701 }
13702 else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance))
13703 ;
13704 else if (unformat (i, "server"))
13705 is_server = 1;
13706 else
13707 break;
13708 }
13709
13710 if (sw_if_index_set == 0)
13711 {
13712 errmsg ("missing sw_if_index or interface name");
13713 return -99;
13714 }
13715
13716 if (file_name_set == 0)
13717 {
13718 errmsg ("missing socket file name");
13719 return -99;
13720 }
13721
13722 if (vec_len (file_name) > 255)
13723 {
13724 errmsg ("socket file name too long");
13725 return -99;
13726 }
13727 vec_add1 (file_name, 0);
13728
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013729 M (MODIFY_VHOST_USER_IF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013730
13731 mp->sw_if_index = ntohl (sw_if_index);
13732 mp->is_server = is_server;
13733 clib_memcpy (mp->sock_filename, file_name, vec_len (file_name));
13734 vec_free (file_name);
13735 if (custom_dev_instance != ~0)
13736 {
13737 mp->renumber = 1;
13738 mp->custom_dev_instance = ntohl (custom_dev_instance);
13739 }
13740
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013741 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013742 W (ret);
13743 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013744}
13745
13746static int
13747api_delete_vhost_user_if (vat_main_t * vam)
13748{
13749 unformat_input_t *i = vam->input;
13750 vl_api_delete_vhost_user_if_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013751 u32 sw_if_index = ~0;
13752 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013753 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013754
13755 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
13756 {
13757 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
13758 sw_if_index_set = 1;
13759 else if (unformat (i, "sw_if_index %d", &sw_if_index))
13760 sw_if_index_set = 1;
13761 else
13762 break;
13763 }
13764
13765 if (sw_if_index_set == 0)
13766 {
13767 errmsg ("missing sw_if_index or interface name");
13768 return -99;
13769 }
13770
13771
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013772 M (DELETE_VHOST_USER_IF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013773
13774 mp->sw_if_index = ntohl (sw_if_index);
13775
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013776 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013777 W (ret);
13778 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013779}
13780
13781static void vl_api_sw_interface_vhost_user_details_t_handler
13782 (vl_api_sw_interface_vhost_user_details_t * mp)
13783{
13784 vat_main_t *vam = &vat_main;
13785
Stevenf3b53642017-05-01 14:03:02 -070013786 print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s",
Damjan Marion7cd468a2016-12-19 23:05:39 +010013787 (char *) mp->interface_name,
13788 ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz),
13789 clib_net_to_host_u64 (mp->features), mp->is_server,
Stevenf3b53642017-05-01 14:03:02 -070013790 ntohl (mp->num_regions), (char *) mp->sock_filename);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013791 print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno)));
13792}
13793
13794static void vl_api_sw_interface_vhost_user_details_t_handler_json
13795 (vl_api_sw_interface_vhost_user_details_t * mp)
13796{
13797 vat_main_t *vam = &vat_main;
13798 vat_json_node_t *node = NULL;
13799
13800 if (VAT_JSON_ARRAY != vam->json_tree.type)
13801 {
13802 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
13803 vat_json_init_array (&vam->json_tree);
13804 }
13805 node = vat_json_array_add (&vam->json_tree);
13806
13807 vat_json_init_object (node);
13808 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
13809 vat_json_object_add_string_copy (node, "interface_name",
13810 mp->interface_name);
13811 vat_json_object_add_uint (node, "virtio_net_hdr_sz",
13812 ntohl (mp->virtio_net_hdr_sz));
13813 vat_json_object_add_uint (node, "features",
13814 clib_net_to_host_u64 (mp->features));
13815 vat_json_object_add_uint (node, "is_server", mp->is_server);
13816 vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename);
13817 vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions));
13818 vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno));
13819}
13820
13821static int
13822api_sw_interface_vhost_user_dump (vat_main_t * vam)
13823{
13824 vl_api_sw_interface_vhost_user_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060013825 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013826 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013827 print (vam->ofp,
Stevenf3b53642017-05-01 14:03:02 -070013828 "Interface name idx hdr_sz features server regions filename");
Damjan Marion7cd468a2016-12-19 23:05:39 +010013829
13830 /* Get list of vhost-user interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013831 M (SW_INTERFACE_VHOST_USER_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013832 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013833
13834 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040013835 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060013836 S (mp_ping);
13837
Jon Loeliger56c7b012017-02-01 12:31:41 -060013838 W (ret);
13839 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013840}
13841
13842static int
13843api_show_version (vat_main_t * vam)
13844{
13845 vl_api_show_version_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013846 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013847
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013848 M (SHOW_VERSION, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013849
Jon Loeliger7bc770c2017-01-31 14:03:33 -060013850 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060013851 W (ret);
13852 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013853}
13854
13855
13856static int
13857api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
13858{
13859 unformat_input_t *line_input = vam->input;
13860 vl_api_vxlan_gpe_add_del_tunnel_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013861 ip4_address_t local4, remote4;
13862 ip6_address_t local6, remote6;
13863 u8 is_add = 1;
13864 u8 ipv4_set = 0, ipv6_set = 0;
13865 u8 local_set = 0;
13866 u8 remote_set = 0;
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080013867 u8 grp_set = 0;
13868 u32 mcast_sw_if_index = ~0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013869 u32 encap_vrf_id = 0;
13870 u32 decap_vrf_id = 0;
13871 u8 protocol = ~0;
13872 u32 vni;
13873 u8 vni_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060013874 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013875
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080013876 /* Can't "universally zero init" (={0}) due to GCC bug 53119 */
Dave Barachb7b92992018-10-17 10:38:51 -040013877 clib_memset (&local4, 0, sizeof local4);
13878 clib_memset (&remote4, 0, sizeof remote4);
13879 clib_memset (&local6, 0, sizeof local6);
13880 clib_memset (&remote6, 0, sizeof remote6);
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080013881
Damjan Marion7cd468a2016-12-19 23:05:39 +010013882 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
13883 {
13884 if (unformat (line_input, "del"))
13885 is_add = 0;
13886 else if (unformat (line_input, "local %U",
13887 unformat_ip4_address, &local4))
13888 {
13889 local_set = 1;
13890 ipv4_set = 1;
13891 }
13892 else if (unformat (line_input, "remote %U",
13893 unformat_ip4_address, &remote4))
13894 {
13895 remote_set = 1;
13896 ipv4_set = 1;
13897 }
13898 else if (unformat (line_input, "local %U",
13899 unformat_ip6_address, &local6))
13900 {
13901 local_set = 1;
13902 ipv6_set = 1;
13903 }
13904 else if (unformat (line_input, "remote %U",
13905 unformat_ip6_address, &remote6))
13906 {
13907 remote_set = 1;
13908 ipv6_set = 1;
13909 }
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080013910 else if (unformat (line_input, "group %U %U",
13911 unformat_ip4_address, &remote4,
13912 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13913 {
13914 grp_set = remote_set = 1;
13915 ipv4_set = 1;
13916 }
13917 else if (unformat (line_input, "group %U",
13918 unformat_ip4_address, &remote4))
13919 {
13920 grp_set = remote_set = 1;
13921 ipv4_set = 1;
13922 }
13923 else if (unformat (line_input, "group %U %U",
13924 unformat_ip6_address, &remote6,
13925 api_unformat_sw_if_index, vam, &mcast_sw_if_index))
13926 {
13927 grp_set = remote_set = 1;
13928 ipv6_set = 1;
13929 }
13930 else if (unformat (line_input, "group %U",
13931 unformat_ip6_address, &remote6))
13932 {
13933 grp_set = remote_set = 1;
13934 ipv6_set = 1;
13935 }
13936 else
13937 if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
13938 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010013939 else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
13940 ;
13941 else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
13942 ;
13943 else if (unformat (line_input, "vni %d", &vni))
13944 vni_set = 1;
13945 else if (unformat (line_input, "next-ip4"))
13946 protocol = 1;
13947 else if (unformat (line_input, "next-ip6"))
13948 protocol = 2;
13949 else if (unformat (line_input, "next-ethernet"))
13950 protocol = 3;
13951 else if (unformat (line_input, "next-nsh"))
13952 protocol = 4;
13953 else
13954 {
13955 errmsg ("parse error '%U'", format_unformat_error, line_input);
13956 return -99;
13957 }
13958 }
13959
13960 if (local_set == 0)
13961 {
13962 errmsg ("tunnel local address not specified");
13963 return -99;
13964 }
13965 if (remote_set == 0)
13966 {
13967 errmsg ("tunnel remote address not specified");
13968 return -99;
13969 }
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080013970 if (grp_set && mcast_sw_if_index == ~0)
13971 {
13972 errmsg ("tunnel nonexistent multicast device");
13973 return -99;
13974 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010013975 if (ipv4_set && ipv6_set)
13976 {
13977 errmsg ("both IPv4 and IPv6 addresses specified");
13978 return -99;
13979 }
13980
13981 if (vni_set == 0)
13982 {
13983 errmsg ("vni not specified");
13984 return -99;
13985 }
13986
Jon Loeliger8a2aea32017-01-31 13:19:40 -060013987 M (VXLAN_GPE_ADD_DEL_TUNNEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010013988
13989
13990 if (ipv6_set)
13991 {
13992 clib_memcpy (&mp->local, &local6, sizeof (local6));
13993 clib_memcpy (&mp->remote, &remote6, sizeof (remote6));
13994 }
13995 else
13996 {
13997 clib_memcpy (&mp->local, &local4, sizeof (local4));
13998 clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
13999 }
14000
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014001 mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014002 mp->encap_vrf_id = ntohl (encap_vrf_id);
14003 mp->decap_vrf_id = ntohl (decap_vrf_id);
14004 mp->protocol = protocol;
14005 mp->vni = ntohl (vni);
14006 mp->is_add = is_add;
14007 mp->is_ipv6 = ipv6_set;
14008
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014009 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014010 W (ret);
14011 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014012}
14013
14014static void vl_api_vxlan_gpe_tunnel_details_t_handler
14015 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14016{
14017 vat_main_t *vam = &vat_main;
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014018 ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
14019 ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014020
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014021 print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010014022 ntohl (mp->sw_if_index),
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014023 format_ip46_address, &local, IP46_TYPE_ANY,
14024 format_ip46_address, &remote, IP46_TYPE_ANY,
14025 ntohl (mp->vni), mp->protocol,
14026 ntohl (mp->mcast_sw_if_index),
Damjan Marion7cd468a2016-12-19 23:05:39 +010014027 ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
14028}
14029
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014030
Damjan Marion7cd468a2016-12-19 23:05:39 +010014031static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
14032 (vl_api_vxlan_gpe_tunnel_details_t * mp)
14033{
14034 vat_main_t *vam = &vat_main;
14035 vat_json_node_t *node = NULL;
14036 struct in_addr ip4;
14037 struct in6_addr ip6;
14038
14039 if (VAT_JSON_ARRAY != vam->json_tree.type)
14040 {
14041 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14042 vat_json_init_array (&vam->json_tree);
14043 }
14044 node = vat_json_array_add (&vam->json_tree);
14045
14046 vat_json_init_object (node);
14047 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14048 if (mp->is_ipv6)
14049 {
14050 clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6));
14051 vat_json_object_add_ip6 (node, "local", ip6);
14052 clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6));
14053 vat_json_object_add_ip6 (node, "remote", ip6);
14054 }
14055 else
14056 {
14057 clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4));
14058 vat_json_object_add_ip4 (node, "local", ip4);
14059 clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4));
14060 vat_json_object_add_ip4 (node, "remote", ip4);
14061 }
14062 vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
14063 vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014064 vat_json_object_add_uint (node, "mcast_sw_if_index",
14065 ntohl (mp->mcast_sw_if_index));
Damjan Marion7cd468a2016-12-19 23:05:39 +010014066 vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
14067 vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
14068 vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
14069}
14070
14071static int
14072api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
14073{
14074 unformat_input_t *i = vam->input;
14075 vl_api_vxlan_gpe_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014076 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014077 u32 sw_if_index;
14078 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014079 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014080
14081 /* Parse args required to build the message */
14082 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14083 {
14084 if (unformat (i, "sw_if_index %d", &sw_if_index))
14085 sw_if_index_set = 1;
14086 else
14087 break;
14088 }
14089
14090 if (sw_if_index_set == 0)
14091 {
14092 sw_if_index = ~0;
14093 }
14094
14095 if (!vam->json_output)
14096 {
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014097 print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
Damjan Marion7cd468a2016-12-19 23:05:39 +010014098 "sw_if_index", "local", "remote", "vni",
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080014099 "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
Damjan Marion7cd468a2016-12-19 23:05:39 +010014100 }
14101
14102 /* Get list of vxlan-tunnel interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014103 M (VXLAN_GPE_TUNNEL_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014104
14105 mp->sw_if_index = htonl (sw_if_index);
14106
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014107 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014108
14109 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040014110 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014111 S (mp_ping);
14112
Jon Loeliger56c7b012017-02-01 12:31:41 -060014113 W (ret);
14114 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014115}
14116
Ole Troan01384fe2017-05-12 11:55:35 +020014117static void vl_api_l2_fib_table_details_t_handler
14118 (vl_api_l2_fib_table_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +010014119{
14120 vat_main_t *vam = &vat_main;
14121
14122 print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32
14123 " %d %d %d",
Mohsin Kazmi57938f62017-10-27 21:28:07 +020014124 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
Damjan Marion7cd468a2016-12-19 23:05:39 +010014125 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac,
14126 mp->bvi_mac);
14127}
14128
Ole Troan01384fe2017-05-12 11:55:35 +020014129static void vl_api_l2_fib_table_details_t_handler_json
14130 (vl_api_l2_fib_table_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +010014131{
14132 vat_main_t *vam = &vat_main;
14133 vat_json_node_t *node = NULL;
14134
14135 if (VAT_JSON_ARRAY != vam->json_tree.type)
14136 {
14137 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
14138 vat_json_init_array (&vam->json_tree);
14139 }
14140 node = vat_json_array_add (&vam->json_tree);
14141
14142 vat_json_init_object (node);
14143 vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id));
Mohsin Kazmi57938f62017-10-27 21:28:07 +020014144 vat_json_object_add_bytes (node, "mac", mp->mac, 6);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014145 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
14146 vat_json_object_add_uint (node, "static_mac", mp->static_mac);
14147 vat_json_object_add_uint (node, "filter_mac", mp->filter_mac);
14148 vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac);
14149}
14150
14151static int
14152api_l2_fib_table_dump (vat_main_t * vam)
14153{
14154 unformat_input_t *i = vam->input;
14155 vl_api_l2_fib_table_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014156 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014157 u32 bd_id;
14158 u8 bd_id_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014159 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014160
14161 /* Parse args required to build the message */
14162 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14163 {
14164 if (unformat (i, "bd_id %d", &bd_id))
14165 bd_id_set = 1;
14166 else
14167 break;
14168 }
14169
14170 if (bd_id_set == 0)
14171 {
14172 errmsg ("missing bridge domain");
14173 return -99;
14174 }
14175
14176 print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
14177
14178 /* Get list of l2 fib entries */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014179 M (L2_FIB_TABLE_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014180
14181 mp->bd_id = ntohl (bd_id);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014182 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014183
14184 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040014185 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014186 S (mp_ping);
14187
Jon Loeliger56c7b012017-02-01 12:31:41 -060014188 W (ret);
14189 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014190}
14191
14192
14193static int
14194api_interface_name_renumber (vat_main_t * vam)
14195{
14196 unformat_input_t *line_input = vam->input;
14197 vl_api_interface_name_renumber_t *mp;
14198 u32 sw_if_index = ~0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014199 u32 new_show_dev_instance = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014200 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014201
14202 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14203 {
14204 if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
14205 &sw_if_index))
14206 ;
14207 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
14208 ;
14209 else if (unformat (line_input, "new_show_dev_instance %d",
14210 &new_show_dev_instance))
14211 ;
14212 else
14213 break;
14214 }
14215
14216 if (sw_if_index == ~0)
14217 {
14218 errmsg ("missing interface name or sw_if_index");
14219 return -99;
14220 }
14221
14222 if (new_show_dev_instance == ~0)
14223 {
14224 errmsg ("missing new_show_dev_instance");
14225 return -99;
14226 }
14227
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014228 M (INTERFACE_NAME_RENUMBER, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014229
14230 mp->sw_if_index = ntohl (sw_if_index);
14231 mp->new_show_dev_instance = ntohl (new_show_dev_instance);
14232
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014233 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014234 W (ret);
14235 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014236}
14237
14238static int
John Loc7b43042018-04-13 16:46:22 -040014239api_ip_probe_neighbor (vat_main_t * vam)
14240{
14241 unformat_input_t *i = vam->input;
14242 vl_api_ip_probe_neighbor_t *mp;
Neale Ranns37029302018-08-10 05:30:06 -070014243 vl_api_address_t dst_adr;
John Loc7b43042018-04-13 16:46:22 -040014244 u8 int_set = 0;
14245 u8 adr_set = 0;
John Loc7b43042018-04-13 16:46:22 -040014246 u32 sw_if_index;
14247 int ret;
14248
14249 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14250 {
14251 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14252 int_set = 1;
14253 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14254 int_set = 1;
Neale Ranns37029302018-08-10 05:30:06 -070014255 else if (unformat (i, "address %U", unformat_vl_api_address, dst_adr))
John Loc7b43042018-04-13 16:46:22 -040014256 adr_set = 1;
John Loc7b43042018-04-13 16:46:22 -040014257 else
14258 break;
14259 }
14260
14261 if (int_set == 0)
14262 {
14263 errmsg ("missing interface");
14264 return -99;
14265 }
14266
14267 if (adr_set == 0)
14268 {
14269 errmsg ("missing addresses");
14270 return -99;
14271 }
14272
14273 M (IP_PROBE_NEIGHBOR, mp);
14274
14275 mp->sw_if_index = ntohl (sw_if_index);
Neale Ranns37029302018-08-10 05:30:06 -070014276 clib_memcpy (&mp->dst, &dst_adr, sizeof (dst_adr));
John Loc7b43042018-04-13 16:46:22 -040014277
14278 S (mp);
14279 W (ret);
14280 return ret;
14281}
14282
14283static int
John Lo7f358b32018-04-28 01:19:24 -040014284api_ip_scan_neighbor_enable_disable (vat_main_t * vam)
14285{
14286 unformat_input_t *i = vam->input;
14287 vl_api_ip_scan_neighbor_enable_disable_t *mp;
14288 u8 mode = IP_SCAN_V46_NEIGHBORS;
14289 u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0;
14290 int ret;
14291
14292 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14293 {
14294 if (unformat (i, "ip4"))
14295 mode = IP_SCAN_V4_NEIGHBORS;
14296 else if (unformat (i, "ip6"))
14297 mode = IP_SCAN_V6_NEIGHBORS;
14298 if (unformat (i, "both"))
14299 mode = IP_SCAN_V46_NEIGHBORS;
14300 else if (unformat (i, "disable"))
14301 mode = IP_SCAN_DISABLED;
14302 else if (unformat (i, "interval %d", &interval))
14303 ;
14304 else if (unformat (i, "max-time %d", &time))
14305 ;
14306 else if (unformat (i, "max-update %d", &update))
14307 ;
14308 else if (unformat (i, "delay %d", &delay))
14309 ;
14310 else if (unformat (i, "stale %d", &stale))
14311 ;
14312 else
14313 break;
14314 }
14315
14316 if (interval > 255)
14317 {
14318 errmsg ("interval cannot exceed 255 minutes.");
14319 return -99;
14320 }
14321 if (time > 255)
14322 {
14323 errmsg ("max-time cannot exceed 255 usec.");
14324 return -99;
14325 }
14326 if (update > 255)
14327 {
14328 errmsg ("max-update cannot exceed 255.");
14329 return -99;
14330 }
14331 if (delay > 255)
14332 {
14333 errmsg ("delay cannot exceed 255 msec.");
14334 return -99;
14335 }
14336 if (stale > 255)
14337 {
14338 errmsg ("stale cannot exceed 255 minutes.");
14339 return -99;
14340 }
14341
14342 M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp);
14343 mp->mode = mode;
14344 mp->scan_interval = interval;
14345 mp->max_proc_time = time;
14346 mp->max_update = update;
14347 mp->scan_int_delay = delay;
14348 mp->stale_threshold = stale;
14349
14350 S (mp);
14351 W (ret);
14352 return ret;
14353}
14354
14355static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010014356api_want_ip4_arp_events (vat_main_t * vam)
14357{
14358 unformat_input_t *line_input = vam->input;
14359 vl_api_want_ip4_arp_events_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014360 ip4_address_t address;
14361 int address_set = 0;
14362 u32 enable_disable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014363 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014364
14365 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14366 {
14367 if (unformat (line_input, "address %U", unformat_ip4_address, &address))
14368 address_set = 1;
14369 else if (unformat (line_input, "del"))
14370 enable_disable = 0;
14371 else
14372 break;
14373 }
14374
14375 if (address_set == 0)
14376 {
14377 errmsg ("missing addresses");
14378 return -99;
14379 }
14380
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014381 M (WANT_IP4_ARP_EVENTS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014382 mp->enable_disable = enable_disable;
John Lo20e1f2a2017-03-29 13:35:43 -040014383 mp->pid = htonl (getpid ());
Neale Ranns37029302018-08-10 05:30:06 -070014384 clib_memcpy (mp->ip, &address, sizeof (address));
Damjan Marion7cd468a2016-12-19 23:05:39 +010014385
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014386 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014387 W (ret);
14388 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014389}
14390
14391static int
14392api_want_ip6_nd_events (vat_main_t * vam)
14393{
14394 unformat_input_t *line_input = vam->input;
14395 vl_api_want_ip6_nd_events_t *mp;
Neale Ranns37029302018-08-10 05:30:06 -070014396 vl_api_ip6_address_t address;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014397 int address_set = 0;
14398 u32 enable_disable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014399 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014400
14401 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14402 {
Neale Ranns37029302018-08-10 05:30:06 -070014403 if (unformat
14404 (line_input, "address %U", unformat_vl_api_ip6_address, &address))
Damjan Marion7cd468a2016-12-19 23:05:39 +010014405 address_set = 1;
14406 else if (unformat (line_input, "del"))
14407 enable_disable = 0;
14408 else
14409 break;
14410 }
14411
14412 if (address_set == 0)
14413 {
14414 errmsg ("missing addresses");
14415 return -99;
14416 }
14417
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014418 M (WANT_IP6_ND_EVENTS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014419 mp->enable_disable = enable_disable;
John Lo20e1f2a2017-03-29 13:35:43 -040014420 mp->pid = htonl (getpid ());
Neale Ranns37029302018-08-10 05:30:06 -070014421 clib_memcpy (&mp->ip, &address, sizeof (address));
Damjan Marion7cd468a2016-12-19 23:05:39 +010014422
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014423 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014424 W (ret);
14425 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014426}
14427
14428static int
John Lo8d00fff2017-08-03 00:35:36 -040014429api_want_l2_macs_events (vat_main_t * vam)
14430{
14431 unformat_input_t *line_input = vam->input;
14432 vl_api_want_l2_macs_events_t *mp;
14433 u8 enable_disable = 1;
14434 u32 scan_delay = 0;
14435 u32 max_macs_in_event = 0;
14436 u32 learn_limit = 0;
14437 int ret;
14438
14439 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
14440 {
14441 if (unformat (line_input, "learn-limit %d", &learn_limit))
14442 ;
14443 else if (unformat (line_input, "scan-delay %d", &scan_delay))
14444 ;
14445 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
14446 ;
14447 else if (unformat (line_input, "disable"))
14448 enable_disable = 0;
14449 else
14450 break;
14451 }
14452
14453 M (WANT_L2_MACS_EVENTS, mp);
14454 mp->enable_disable = enable_disable;
14455 mp->pid = htonl (getpid ());
14456 mp->learn_limit = htonl (learn_limit);
14457 mp->scan_delay = (u8) scan_delay;
14458 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
14459 S (mp);
14460 W (ret);
14461 return ret;
14462}
14463
14464static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010014465api_input_acl_set_interface (vat_main_t * vam)
14466{
14467 unformat_input_t *i = vam->input;
14468 vl_api_input_acl_set_interface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014469 u32 sw_if_index;
14470 int sw_if_index_set;
14471 u32 ip4_table_index = ~0;
14472 u32 ip6_table_index = ~0;
14473 u32 l2_table_index = ~0;
14474 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014475 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014476
14477 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14478 {
14479 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14480 sw_if_index_set = 1;
14481 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14482 sw_if_index_set = 1;
14483 else if (unformat (i, "del"))
14484 is_add = 0;
14485 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14486 ;
14487 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14488 ;
14489 else if (unformat (i, "l2-table %d", &l2_table_index))
14490 ;
14491 else
14492 {
14493 clib_warning ("parse error '%U'", format_unformat_error, i);
14494 return -99;
14495 }
14496 }
14497
14498 if (sw_if_index_set == 0)
14499 {
14500 errmsg ("missing interface name or sw_if_index");
14501 return -99;
14502 }
14503
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014504 M (INPUT_ACL_SET_INTERFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014505
14506 mp->sw_if_index = ntohl (sw_if_index);
14507 mp->ip4_table_index = ntohl (ip4_table_index);
14508 mp->ip6_table_index = ntohl (ip6_table_index);
14509 mp->l2_table_index = ntohl (l2_table_index);
14510 mp->is_add = is_add;
14511
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014512 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014513 W (ret);
14514 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014515}
14516
14517static int
Andrew Yourtchenko815d7d52018-02-07 11:37:02 +010014518api_output_acl_set_interface (vat_main_t * vam)
14519{
14520 unformat_input_t *i = vam->input;
14521 vl_api_output_acl_set_interface_t *mp;
14522 u32 sw_if_index;
14523 int sw_if_index_set;
14524 u32 ip4_table_index = ~0;
14525 u32 ip6_table_index = ~0;
14526 u32 l2_table_index = ~0;
14527 u8 is_add = 1;
14528 int ret;
14529
14530 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14531 {
14532 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14533 sw_if_index_set = 1;
14534 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14535 sw_if_index_set = 1;
14536 else if (unformat (i, "del"))
14537 is_add = 0;
14538 else if (unformat (i, "ip4-table %d", &ip4_table_index))
14539 ;
14540 else if (unformat (i, "ip6-table %d", &ip6_table_index))
14541 ;
14542 else if (unformat (i, "l2-table %d", &l2_table_index))
14543 ;
14544 else
14545 {
14546 clib_warning ("parse error '%U'", format_unformat_error, i);
14547 return -99;
14548 }
14549 }
14550
14551 if (sw_if_index_set == 0)
14552 {
14553 errmsg ("missing interface name or sw_if_index");
14554 return -99;
14555 }
14556
14557 M (OUTPUT_ACL_SET_INTERFACE, mp);
14558
14559 mp->sw_if_index = ntohl (sw_if_index);
14560 mp->ip4_table_index = ntohl (ip4_table_index);
14561 mp->ip6_table_index = ntohl (ip6_table_index);
14562 mp->l2_table_index = ntohl (l2_table_index);
14563 mp->is_add = is_add;
14564
14565 S (mp);
14566 W (ret);
14567 return ret;
14568}
14569
14570static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010014571api_ip_address_dump (vat_main_t * vam)
14572{
14573 unformat_input_t *i = vam->input;
14574 vl_api_ip_address_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014575 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014576 u32 sw_if_index = ~0;
14577 u8 sw_if_index_set = 0;
14578 u8 ipv4_set = 0;
14579 u8 ipv6_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014580 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014581
14582 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14583 {
14584 if (unformat (i, "sw_if_index %d", &sw_if_index))
14585 sw_if_index_set = 1;
14586 else
14587 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14588 sw_if_index_set = 1;
14589 else if (unformat (i, "ipv4"))
14590 ipv4_set = 1;
14591 else if (unformat (i, "ipv6"))
14592 ipv6_set = 1;
14593 else
14594 break;
14595 }
14596
14597 if (ipv4_set && ipv6_set)
14598 {
14599 errmsg ("ipv4 and ipv6 flags cannot be both set");
14600 return -99;
14601 }
14602
14603 if ((!ipv4_set) && (!ipv6_set))
14604 {
14605 errmsg ("no ipv4 nor ipv6 flag set");
14606 return -99;
14607 }
14608
14609 if (sw_if_index_set == 0)
14610 {
14611 errmsg ("missing interface name or sw_if_index");
14612 return -99;
14613 }
14614
14615 vam->current_sw_if_index = sw_if_index;
14616 vam->is_ipv6 = ipv6_set;
14617
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014618 M (IP_ADDRESS_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014619 mp->sw_if_index = ntohl (sw_if_index);
14620 mp->is_ipv6 = ipv6_set;
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014621 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014622
14623 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040014624 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014625 S (mp_ping);
14626
Jon Loeliger56c7b012017-02-01 12:31:41 -060014627 W (ret);
14628 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014629}
14630
14631static int
14632api_ip_dump (vat_main_t * vam)
14633{
14634 vl_api_ip_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014635 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014636 unformat_input_t *in = vam->input;
14637 int ipv4_set = 0;
14638 int ipv6_set = 0;
14639 int is_ipv6;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014640 int i;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014641 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014642
14643 while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT)
14644 {
14645 if (unformat (in, "ipv4"))
14646 ipv4_set = 1;
14647 else if (unformat (in, "ipv6"))
14648 ipv6_set = 1;
14649 else
14650 break;
14651 }
14652
14653 if (ipv4_set && ipv6_set)
14654 {
14655 errmsg ("ipv4 and ipv6 flags cannot be both set");
14656 return -99;
14657 }
14658
14659 if ((!ipv4_set) && (!ipv6_set))
14660 {
14661 errmsg ("no ipv4 nor ipv6 flag set");
14662 return -99;
14663 }
14664
14665 is_ipv6 = ipv6_set;
14666 vam->is_ipv6 = is_ipv6;
14667
14668 /* free old data */
14669 for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++)
14670 {
14671 vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr);
14672 }
14673 vec_free (vam->ip_details_by_sw_if_index[is_ipv6]);
14674
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014675 M (IP_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014676 mp->is_ipv6 = ipv6_set;
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014677 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014678
14679 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040014680 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060014681 S (mp_ping);
14682
Jon Loeliger56c7b012017-02-01 12:31:41 -060014683 W (ret);
14684 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014685}
14686
14687static int
14688api_ipsec_spd_add_del (vat_main_t * vam)
14689{
14690 unformat_input_t *i = vam->input;
14691 vl_api_ipsec_spd_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014692 u32 spd_id = ~0;
14693 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014694 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014695
14696 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14697 {
14698 if (unformat (i, "spd_id %d", &spd_id))
14699 ;
14700 else if (unformat (i, "del"))
14701 is_add = 0;
14702 else
14703 {
14704 clib_warning ("parse error '%U'", format_unformat_error, i);
14705 return -99;
14706 }
14707 }
14708 if (spd_id == ~0)
14709 {
14710 errmsg ("spd_id must be set");
14711 return -99;
14712 }
14713
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014714 M (IPSEC_SPD_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014715
14716 mp->spd_id = ntohl (spd_id);
14717 mp->is_add = is_add;
14718
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014719 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014720 W (ret);
14721 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014722}
14723
14724static int
14725api_ipsec_interface_add_del_spd (vat_main_t * vam)
14726{
14727 unformat_input_t *i = vam->input;
14728 vl_api_ipsec_interface_add_del_spd_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014729 u32 sw_if_index;
14730 u8 sw_if_index_set = 0;
14731 u32 spd_id = (u32) ~ 0;
14732 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014733 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014734
14735 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14736 {
14737 if (unformat (i, "del"))
14738 is_add = 0;
14739 else if (unformat (i, "spd_id %d", &spd_id))
14740 ;
14741 else
14742 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
14743 sw_if_index_set = 1;
14744 else if (unformat (i, "sw_if_index %d", &sw_if_index))
14745 sw_if_index_set = 1;
14746 else
14747 {
14748 clib_warning ("parse error '%U'", format_unformat_error, i);
14749 return -99;
14750 }
14751
14752 }
14753
14754 if (spd_id == (u32) ~ 0)
14755 {
14756 errmsg ("spd_id must be set");
14757 return -99;
14758 }
14759
14760 if (sw_if_index_set == 0)
14761 {
14762 errmsg ("missing interface name or sw_if_index");
14763 return -99;
14764 }
14765
Jon Loeliger8a2aea32017-01-31 13:19:40 -060014766 M (IPSEC_INTERFACE_ADD_DEL_SPD, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014767
14768 mp->spd_id = ntohl (spd_id);
14769 mp->sw_if_index = ntohl (sw_if_index);
14770 mp->is_add = is_add;
14771
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014772 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014773 W (ret);
14774 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014775}
14776
14777static int
Neale Ranns17dcec02019-01-09 21:22:20 -080014778api_ipsec_spd_entry_add_del (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010014779{
14780 unformat_input_t *i = vam->input;
Neale Ranns17dcec02019-01-09 21:22:20 -080014781 vl_api_ipsec_spd_entry_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014782 u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1;
14783 u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0;
14784 i32 priority = 0;
14785 u32 rport_start = 0, rport_stop = (u32) ~ 0;
14786 u32 lport_start = 0, lport_stop = (u32) ~ 0;
Neale Ranns17dcec02019-01-09 21:22:20 -080014787 vl_api_address_t laddr_start = { }, laddr_stop =
14788 {
14789 }, raddr_start =
14790 {
14791 }, raddr_stop =
14792 {
14793 };
Jon Loeliger56c7b012017-02-01 12:31:41 -060014794 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014795
Damjan Marion7cd468a2016-12-19 23:05:39 +010014796 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14797 {
14798 if (unformat (i, "del"))
14799 is_add = 0;
14800 if (unformat (i, "outbound"))
14801 is_outbound = 1;
14802 if (unformat (i, "inbound"))
14803 is_outbound = 0;
14804 else if (unformat (i, "spd_id %d", &spd_id))
14805 ;
14806 else if (unformat (i, "sa_id %d", &sa_id))
14807 ;
14808 else if (unformat (i, "priority %d", &priority))
14809 ;
14810 else if (unformat (i, "protocol %d", &protocol))
14811 ;
14812 else if (unformat (i, "lport_start %d", &lport_start))
14813 ;
14814 else if (unformat (i, "lport_stop %d", &lport_stop))
14815 ;
14816 else if (unformat (i, "rport_start %d", &rport_start))
14817 ;
14818 else if (unformat (i, "rport_stop %d", &rport_stop))
14819 ;
Neale Ranns17dcec02019-01-09 21:22:20 -080014820 else if (unformat (i, "laddr_start %U",
14821 unformat_vl_api_address, &laddr_start))
14822 is_ip_any = 0;
14823 else if (unformat (i, "laddr_stop %U", unformat_vl_api_address,
14824 &laddr_stop))
14825 is_ip_any = 0;
14826 else if (unformat (i, "raddr_start %U", unformat_vl_api_address,
14827 &raddr_start))
14828 is_ip_any = 0;
14829 else if (unformat (i, "raddr_stop %U", unformat_vl_api_address,
14830 &raddr_stop))
14831 is_ip_any = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014832 else
14833 if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy))
14834 {
14835 if (policy == IPSEC_POLICY_ACTION_RESOLVE)
14836 {
14837 clib_warning ("unsupported action: 'resolve'");
14838 return -99;
14839 }
14840 }
14841 else
14842 {
14843 clib_warning ("parse error '%U'", format_unformat_error, i);
14844 return -99;
14845 }
14846
14847 }
14848
Neale Ranns17dcec02019-01-09 21:22:20 -080014849 M (IPSEC_SPD_ENTRY_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014850
Damjan Marion7cd468a2016-12-19 23:05:39 +010014851 mp->is_add = is_add;
Neale Ranns17dcec02019-01-09 21:22:20 -080014852
14853 mp->entry.spd_id = ntohl (spd_id);
14854 mp->entry.priority = ntohl (priority);
14855 mp->entry.is_outbound = is_outbound;
14856
14857 clib_memcpy (&mp->entry.remote_address_start, &raddr_start,
14858 sizeof (vl_api_address_t));
14859 clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop,
14860 sizeof (vl_api_address_t));
14861 clib_memcpy (&mp->entry.local_address_start, &laddr_start,
14862 sizeof (vl_api_address_t));
14863 clib_memcpy (&mp->entry.local_address_stop, &laddr_stop,
14864 sizeof (vl_api_address_t));
14865
14866 mp->entry.protocol = (u8) protocol;
14867 mp->entry.local_port_start = ntohs ((u16) lport_start);
14868 mp->entry.local_port_stop = ntohs ((u16) lport_stop);
14869 mp->entry.remote_port_start = ntohs ((u16) rport_start);
14870 mp->entry.remote_port_stop = ntohs ((u16) rport_stop);
14871 mp->entry.policy = (u8) policy;
14872 mp->entry.sa_id = ntohl (sa_id);
Neale Ranns17dcec02019-01-09 21:22:20 -080014873
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014874 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014875 W (ret);
14876 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014877}
14878
14879static int
Neale Ranns17dcec02019-01-09 21:22:20 -080014880api_ipsec_sad_entry_add_del (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010014881{
14882 unformat_input_t *i = vam->input;
Neale Ranns17dcec02019-01-09 21:22:20 -080014883 vl_api_ipsec_sad_entry_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014884 u32 sad_id = 0, spi = 0;
14885 u8 *ck = 0, *ik = 0;
14886 u8 is_add = 1;
14887
Neale Ranns17dcec02019-01-09 21:22:20 -080014888 vl_api_ipsec_crypto_alg_t crypto_alg = IPSEC_API_CRYPTO_ALG_NONE;
14889 vl_api_ipsec_integ_alg_t integ_alg = IPSEC_API_INTEG_ALG_NONE;
14890 vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE;
14891 vl_api_ipsec_proto_t protocol = IPSEC_API_PROTO_AH;
14892 vl_api_address_t tun_src, tun_dst;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014893 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014894
14895 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14896 {
14897 if (unformat (i, "del"))
14898 is_add = 0;
14899 else if (unformat (i, "sad_id %d", &sad_id))
14900 ;
14901 else if (unformat (i, "spi %d", &spi))
14902 ;
14903 else if (unformat (i, "esp"))
Neale Ranns17dcec02019-01-09 21:22:20 -080014904 protocol = IPSEC_API_PROTO_ESP;
14905 else
14906 if (unformat (i, "tunnel_src %U", unformat_vl_api_address, &tun_src))
Damjan Marion7cd468a2016-12-19 23:05:39 +010014907 {
Neale Ranns17dcec02019-01-09 21:22:20 -080014908 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14909 if (ADDRESS_IP6 == tun_src.af)
14910 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014911 }
14912 else
Neale Ranns17dcec02019-01-09 21:22:20 -080014913 if (unformat (i, "tunnel_dst %U", unformat_vl_api_address, &tun_dst))
Damjan Marion7cd468a2016-12-19 23:05:39 +010014914 {
Neale Ranns17dcec02019-01-09 21:22:20 -080014915 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL;
14916 if (ADDRESS_IP6 == tun_src.af)
14917 flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014918 }
Neale Ranns17dcec02019-01-09 21:22:20 -080014919 else
14920 if (unformat (i, "crypto_alg %U",
14921 unformat_ipsec_api_crypto_alg, &crypto_alg))
14922 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014923 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
14924 ;
Neale Ranns17dcec02019-01-09 21:22:20 -080014925 else if (unformat (i, "integ_alg %U",
14926 unformat_ipsec_api_integ_alg, &integ_alg))
14927 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014928 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
14929 ;
14930 else
14931 {
14932 clib_warning ("parse error '%U'", format_unformat_error, i);
14933 return -99;
14934 }
14935
14936 }
14937
Neale Ranns17dcec02019-01-09 21:22:20 -080014938 M (IPSEC_SAD_ENTRY_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014939
Damjan Marion7cd468a2016-12-19 23:05:39 +010014940 mp->is_add = is_add;
Neale Ranns17dcec02019-01-09 21:22:20 -080014941 mp->entry.sad_id = ntohl (sad_id);
14942 mp->entry.protocol = protocol;
14943 mp->entry.spi = ntohl (spi);
14944 mp->entry.flags = flags;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014945
Neale Ranns17dcec02019-01-09 21:22:20 -080014946 mp->entry.crypto_algorithm = crypto_alg;
14947 mp->entry.integrity_algorithm = integ_alg;
14948 mp->entry.crypto_key.length = vec_len (ck);
14949 mp->entry.integrity_key.length = vec_len (ik);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014950
Neale Ranns17dcec02019-01-09 21:22:20 -080014951 if (mp->entry.crypto_key.length > sizeof (mp->entry.crypto_key.data))
14952 mp->entry.crypto_key.length = sizeof (mp->entry.crypto_key.data);
14953
14954 if (mp->entry.integrity_key.length > sizeof (mp->entry.integrity_key.data))
14955 mp->entry.integrity_key.length = sizeof (mp->entry.integrity_key.data);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014956
14957 if (ck)
Neale Ranns17dcec02019-01-09 21:22:20 -080014958 clib_memcpy (mp->entry.crypto_key.data, ck, mp->entry.crypto_key.length);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014959 if (ik)
Neale Ranns17dcec02019-01-09 21:22:20 -080014960 clib_memcpy (mp->entry.integrity_key.data, ik,
14961 mp->entry.integrity_key.length);
Damjan Marion7cd468a2016-12-19 23:05:39 +010014962
Neale Ranns17dcec02019-01-09 21:22:20 -080014963 if (flags & IPSEC_API_SAD_FLAG_IS_TUNNEL)
Damjan Marion7cd468a2016-12-19 23:05:39 +010014964 {
Neale Ranns17dcec02019-01-09 21:22:20 -080014965 clib_memcpy (&mp->entry.tunnel_src, &tun_src,
14966 sizeof (mp->entry.tunnel_src));
14967 clib_memcpy (&mp->entry.tunnel_dst, &tun_dst,
14968 sizeof (mp->entry.tunnel_dst));
Damjan Marion7cd468a2016-12-19 23:05:39 +010014969 }
14970
Jon Loeliger7bc770c2017-01-31 14:03:33 -060014971 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060014972 W (ret);
14973 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014974}
14975
14976static int
14977api_ipsec_sa_set_key (vat_main_t * vam)
14978{
14979 unformat_input_t *i = vam->input;
14980 vl_api_ipsec_sa_set_key_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014981 u32 sa_id;
14982 u8 *ck = 0, *ik = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060014983 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010014984
14985 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
14986 {
14987 if (unformat (i, "sa_id %d", &sa_id))
14988 ;
14989 else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck))
14990 ;
14991 else if (unformat (i, "integ_key %U", unformat_hex_string, &ik))
14992 ;
14993 else
14994 {
14995 clib_warning ("parse error '%U'", format_unformat_error, i);
14996 return -99;
14997 }
14998 }
14999
Jon Loeliger8a2aea32017-01-31 13:19:40 -060015000 M (IPSEC_SA_SET_KEY, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015001
15002 mp->sa_id = ntohl (sa_id);
Neale Ranns17dcec02019-01-09 21:22:20 -080015003 mp->crypto_key.length = vec_len (ck);
15004 mp->integrity_key.length = vec_len (ik);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015005
Neale Ranns17dcec02019-01-09 21:22:20 -080015006 if (mp->crypto_key.length > sizeof (mp->crypto_key.data))
15007 mp->crypto_key.length = sizeof (mp->crypto_key.data);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015008
Neale Ranns17dcec02019-01-09 21:22:20 -080015009 if (mp->integrity_key.length > sizeof (mp->integrity_key.data))
15010 mp->integrity_key.length = sizeof (mp->integrity_key.data);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015011
15012 if (ck)
Neale Ranns17dcec02019-01-09 21:22:20 -080015013 clib_memcpy (mp->crypto_key.data, ck, mp->crypto_key.length);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015014 if (ik)
Neale Ranns17dcec02019-01-09 21:22:20 -080015015 clib_memcpy (mp->integrity_key.data, ik, mp->integrity_key.length);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015016
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015017 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060015018 W (ret);
15019 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015020}
15021
15022static int
Matthew Smithb0972cb2017-05-02 16:20:41 -050015023api_ipsec_tunnel_if_add_del (vat_main_t * vam)
15024{
15025 unformat_input_t *i = vam->input;
15026 vl_api_ipsec_tunnel_if_add_del_t *mp;
15027 u32 local_spi = 0, remote_spi = 0;
15028 u32 crypto_alg = 0, integ_alg = 0;
15029 u8 *lck = NULL, *rck = NULL;
15030 u8 *lik = NULL, *rik = NULL;
Kingwel Xie1ba5bc82019-03-20 07:21:58 -040015031 vl_api_address_t local_ip = { 0 };
15032 vl_api_address_t remote_ip = { 0 };
Matthew Smithb0972cb2017-05-02 16:20:41 -050015033 u8 is_add = 1;
15034 u8 esn = 0;
15035 u8 anti_replay = 0;
Matthew Smith8e1039a2018-04-12 07:32:56 -050015036 u8 renumber = 0;
15037 u32 instance = ~0;
Matthew Smithb0972cb2017-05-02 16:20:41 -050015038 int ret;
15039
15040 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15041 {
15042 if (unformat (i, "del"))
15043 is_add = 0;
15044 else if (unformat (i, "esn"))
15045 esn = 1;
15046 else if (unformat (i, "anti_replay"))
15047 anti_replay = 1;
15048 else if (unformat (i, "local_spi %d", &local_spi))
15049 ;
15050 else if (unformat (i, "remote_spi %d", &remote_spi))
15051 ;
Kingwel Xie1ba5bc82019-03-20 07:21:58 -040015052 else
15053 if (unformat (i, "local_ip %U", unformat_vl_api_address, &local_ip))
Matthew Smithb0972cb2017-05-02 16:20:41 -050015054 ;
Kingwel Xie1ba5bc82019-03-20 07:21:58 -040015055 else
15056 if (unformat (i, "remote_ip %U", unformat_vl_api_address, &remote_ip))
Matthew Smithb0972cb2017-05-02 16:20:41 -050015057 ;
15058 else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck))
15059 ;
15060 else
15061 if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck))
15062 ;
15063 else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik))
15064 ;
15065 else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik))
15066 ;
15067 else
15068 if (unformat
Neale Ranns17dcec02019-01-09 21:22:20 -080015069 (i, "crypto_alg %U", unformat_ipsec_api_crypto_alg, &crypto_alg))
Matthew Smithb0972cb2017-05-02 16:20:41 -050015070 {
Dave Baracha8d47642018-07-13 11:22:23 -040015071 if (crypto_alg >= IPSEC_CRYPTO_N_ALG)
Matthew Smithb0972cb2017-05-02 16:20:41 -050015072 {
15073 errmsg ("unsupported crypto-alg: '%U'\n",
15074 format_ipsec_crypto_alg, crypto_alg);
15075 return -99;
15076 }
15077 }
15078 else
15079 if (unformat
Neale Ranns17dcec02019-01-09 21:22:20 -080015080 (i, "integ_alg %U", unformat_ipsec_api_integ_alg, &integ_alg))
Matthew Smithb0972cb2017-05-02 16:20:41 -050015081 {
Dave Baracha8d47642018-07-13 11:22:23 -040015082 if (integ_alg >= IPSEC_INTEG_N_ALG)
Matthew Smithb0972cb2017-05-02 16:20:41 -050015083 {
15084 errmsg ("unsupported integ-alg: '%U'\n",
15085 format_ipsec_integ_alg, integ_alg);
15086 return -99;
15087 }
15088 }
Matthew Smith8e1039a2018-04-12 07:32:56 -050015089 else if (unformat (i, "instance %u", &instance))
15090 renumber = 1;
Matthew Smithb0972cb2017-05-02 16:20:41 -050015091 else
15092 {
15093 errmsg ("parse error '%U'\n", format_unformat_error, i);
15094 return -99;
15095 }
15096 }
15097
15098 M (IPSEC_TUNNEL_IF_ADD_DEL, mp);
15099
15100 mp->is_add = is_add;
15101 mp->esn = esn;
15102 mp->anti_replay = anti_replay;
15103
Kingwel Xie1ba5bc82019-03-20 07:21:58 -040015104 clib_memcpy (&mp->local_ip, &local_ip, sizeof (local_ip));
15105 clib_memcpy (&mp->remote_ip, &remote_ip, sizeof (remote_ip));
Matthew Smithb0972cb2017-05-02 16:20:41 -050015106
15107 mp->local_spi = htonl (local_spi);
15108 mp->remote_spi = htonl (remote_spi);
15109 mp->crypto_alg = (u8) crypto_alg;
15110
15111 mp->local_crypto_key_len = 0;
15112 if (lck)
15113 {
15114 mp->local_crypto_key_len = vec_len (lck);
15115 if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key))
15116 mp->local_crypto_key_len = sizeof (mp->local_crypto_key);
15117 clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len);
15118 }
15119
15120 mp->remote_crypto_key_len = 0;
15121 if (rck)
15122 {
15123 mp->remote_crypto_key_len = vec_len (rck);
15124 if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key))
15125 mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key);
15126 clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len);
15127 }
15128
15129 mp->integ_alg = (u8) integ_alg;
15130
15131 mp->local_integ_key_len = 0;
15132 if (lik)
15133 {
15134 mp->local_integ_key_len = vec_len (lik);
15135 if (mp->local_integ_key_len > sizeof (mp->local_integ_key))
15136 mp->local_integ_key_len = sizeof (mp->local_integ_key);
15137 clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len);
15138 }
15139
15140 mp->remote_integ_key_len = 0;
15141 if (rik)
15142 {
15143 mp->remote_integ_key_len = vec_len (rik);
15144 if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key))
15145 mp->remote_integ_key_len = sizeof (mp->remote_integ_key);
15146 clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len);
15147 }
15148
Matthew Smith8e1039a2018-04-12 07:32:56 -050015149 if (renumber)
15150 {
15151 mp->renumber = renumber;
15152 mp->show_instance = ntohl (instance);
15153 }
15154
Matthew Smithb0972cb2017-05-02 16:20:41 -050015155 S (mp);
15156 W (ret);
15157 return ret;
15158}
15159
Matthew Smith28029532017-09-26 13:33:44 -050015160static void
15161vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp)
15162{
15163 vat_main_t *vam = &vat_main;
15164
15165 print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u "
Neale Ranns8d7c5022019-02-06 01:41:05 -080015166 "crypto_key %U integ_alg %u integ_key %U flags %x "
Matthew Smith28029532017-09-26 13:33:44 -050015167 "tunnel_src_addr %U tunnel_dst_addr %U "
15168 "salt %u seq_outbound %lu last_seq_inbound %lu "
Neale Rannseba31ec2019-02-17 18:04:27 +000015169 "replay_window %lu\n",
Neale Ranns8d7c5022019-02-06 01:41:05 -080015170 ntohl (mp->entry.sad_id),
15171 ntohl (mp->sw_if_index),
15172 ntohl (mp->entry.spi),
15173 ntohl (mp->entry.protocol),
15174 ntohl (mp->entry.crypto_algorithm),
15175 format_hex_bytes, mp->entry.crypto_key.data,
15176 mp->entry.crypto_key.length, ntohl (mp->entry.integrity_algorithm),
15177 format_hex_bytes, mp->entry.integrity_key.data,
15178 mp->entry.integrity_key.length, ntohl (mp->entry.flags),
15179 format_vl_api_address, &mp->entry.tunnel_src, format_vl_api_address,
15180 &mp->entry.tunnel_dst, ntohl (mp->salt),
Matthew Smith28029532017-09-26 13:33:44 -050015181 clib_net_to_host_u64 (mp->seq_outbound),
15182 clib_net_to_host_u64 (mp->last_seq_inbound),
Neale Rannseba31ec2019-02-17 18:04:27 +000015183 clib_net_to_host_u64 (mp->replay_window));
Matthew Smith28029532017-09-26 13:33:44 -050015184}
15185
15186#define vl_api_ipsec_sa_details_t_endian vl_noop_handler
15187#define vl_api_ipsec_sa_details_t_print vl_noop_handler
15188
Neale Ranns8d7c5022019-02-06 01:41:05 -080015189static void
15190vat_json_object_add_address (vat_json_node_t * node,
15191 const vl_api_address_t * addr)
15192{
15193 if (ADDRESS_IP6 == addr->af)
15194 {
15195 struct in6_addr ip6;
15196
15197 clib_memcpy (&ip6, &addr->un.ip6, sizeof (ip6));
15198 vat_json_object_add_ip6 (node, "ip_address", ip6);
15199 }
15200 else
15201 {
15202 struct in_addr ip4;
15203
15204 clib_memcpy (&ip4, &addr->un.ip4, sizeof (ip4));
15205 vat_json_object_add_ip4 (node, "ip_address", ip4);
15206 }
15207}
15208
Matthew Smith28029532017-09-26 13:33:44 -050015209static void vl_api_ipsec_sa_details_t_handler_json
15210 (vl_api_ipsec_sa_details_t * mp)
15211{
15212 vat_main_t *vam = &vat_main;
15213 vat_json_node_t *node = NULL;
Neale Ranns8d7c5022019-02-06 01:41:05 -080015214 vl_api_ipsec_sad_flags_t flags;
Matthew Smith28029532017-09-26 13:33:44 -050015215
15216 if (VAT_JSON_ARRAY != vam->json_tree.type)
15217 {
15218 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
15219 vat_json_init_array (&vam->json_tree);
15220 }
15221 node = vat_json_array_add (&vam->json_tree);
15222
15223 vat_json_init_object (node);
Neale Ranns8d7c5022019-02-06 01:41:05 -080015224 vat_json_object_add_uint (node, "sa_id", ntohl (mp->entry.sad_id));
Matthew Smith28029532017-09-26 13:33:44 -050015225 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
Neale Ranns8d7c5022019-02-06 01:41:05 -080015226 vat_json_object_add_uint (node, "spi", ntohl (mp->entry.spi));
15227 vat_json_object_add_uint (node, "proto", ntohl (mp->entry.protocol));
15228 vat_json_object_add_uint (node, "crypto_alg",
15229 ntohl (mp->entry.crypto_algorithm));
15230 vat_json_object_add_uint (node, "integ_alg",
15231 ntohl (mp->entry.integrity_algorithm));
15232 flags = ntohl (mp->entry.flags);
15233 vat_json_object_add_uint (node, "use_esn",
15234 ! !(flags &
15235 IPSEC_API_SAD_FLAG_USE_EXTENDED_SEQ_NUM));
15236 vat_json_object_add_uint (node, "use_anti_replay",
15237 ! !(flags & IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY));
15238 vat_json_object_add_uint (node, "is_tunnel",
15239 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL));
15240 vat_json_object_add_uint (node, "is_tunnel_ip6",
15241 ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL_V6));
15242 vat_json_object_add_uint (node, "udp_encap",
15243 ! !(flags & IPSEC_API_SAD_FLAG_UDP_ENCAP));
15244 vat_json_object_add_bytes (node, "crypto_key", mp->entry.crypto_key.data,
15245 mp->entry.crypto_key.length);
15246 vat_json_object_add_bytes (node, "integ_key", mp->entry.integrity_key.data,
15247 mp->entry.integrity_key.length);
15248 vat_json_object_add_address (node, &mp->entry.tunnel_src);
15249 vat_json_object_add_address (node, &mp->entry.tunnel_dst);
Matthew Smith28029532017-09-26 13:33:44 -050015250 vat_json_object_add_uint (node, "replay_window",
15251 clib_net_to_host_u64 (mp->replay_window));
Matthew Smith28029532017-09-26 13:33:44 -050015252}
15253
15254static int
15255api_ipsec_sa_dump (vat_main_t * vam)
15256{
15257 unformat_input_t *i = vam->input;
15258 vl_api_ipsec_sa_dump_t *mp;
15259 vl_api_control_ping_t *mp_ping;
15260 u32 sa_id = ~0;
15261 int ret;
15262
15263 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15264 {
15265 if (unformat (i, "sa_id %d", &sa_id))
15266 ;
15267 else
15268 {
15269 clib_warning ("parse error '%U'", format_unformat_error, i);
15270 return -99;
15271 }
15272 }
15273
15274 M (IPSEC_SA_DUMP, mp);
15275
15276 mp->sa_id = ntohl (sa_id);
15277
15278 S (mp);
15279
15280 /* Use a control ping for synchronization */
15281 M (CONTROL_PING, mp_ping);
15282 S (mp_ping);
15283
15284 W (ret);
15285 return ret;
15286}
15287
Matthew Smithb0972cb2017-05-02 16:20:41 -050015288static int
Matthew Smith75d85602017-10-05 19:03:05 -050015289api_ipsec_tunnel_if_set_key (vat_main_t * vam)
15290{
15291 unformat_input_t *i = vam->input;
15292 vl_api_ipsec_tunnel_if_set_key_t *mp;
15293 u32 sw_if_index = ~0;
15294 u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE;
15295 u8 *key = 0;
15296 u32 alg = ~0;
15297 int ret;
15298
15299 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15300 {
15301 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15302 ;
15303 else
Neale Ranns17dcec02019-01-09 21:22:20 -080015304 if (unformat
15305 (i, "local crypto %U", unformat_ipsec_api_crypto_alg, &alg))
Matthew Smith75d85602017-10-05 19:03:05 -050015306 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO;
15307 else
Neale Ranns17dcec02019-01-09 21:22:20 -080015308 if (unformat
15309 (i, "remote crypto %U", unformat_ipsec_api_crypto_alg, &alg))
Matthew Smith75d85602017-10-05 19:03:05 -050015310 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO;
Neale Ranns17dcec02019-01-09 21:22:20 -080015311 else
15312 if (unformat
15313 (i, "local integ %U", unformat_ipsec_api_integ_alg, &alg))
Matthew Smith75d85602017-10-05 19:03:05 -050015314 key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG;
15315 else
Neale Ranns17dcec02019-01-09 21:22:20 -080015316 if (unformat
15317 (i, "remote integ %U", unformat_ipsec_api_integ_alg, &alg))
Matthew Smith75d85602017-10-05 19:03:05 -050015318 key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG;
15319 else if (unformat (i, "%U", unformat_hex_string, &key))
15320 ;
15321 else
15322 {
15323 clib_warning ("parse error '%U'", format_unformat_error, i);
15324 return -99;
15325 }
15326 }
15327
15328 if (sw_if_index == ~0)
15329 {
15330 errmsg ("interface must be specified");
15331 return -99;
15332 }
15333
15334 if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE)
15335 {
15336 errmsg ("key type must be specified");
15337 return -99;
15338 }
15339
15340 if (alg == ~0)
15341 {
15342 errmsg ("algorithm must be specified");
15343 return -99;
15344 }
15345
15346 if (vec_len (key) == 0)
15347 {
15348 errmsg ("key must be specified");
15349 return -99;
15350 }
15351
15352 M (IPSEC_TUNNEL_IF_SET_KEY, mp);
15353
15354 mp->sw_if_index = htonl (sw_if_index);
15355 mp->alg = alg;
15356 mp->key_type = key_type;
15357 mp->key_len = vec_len (key);
15358 clib_memcpy (mp->key, key, vec_len (key));
15359
15360 S (mp);
15361 W (ret);
15362
15363 return ret;
15364}
15365
15366static int
Matthew Smithca514fd2017-10-12 12:06:59 -050015367api_ipsec_tunnel_if_set_sa (vat_main_t * vam)
15368{
15369 unformat_input_t *i = vam->input;
15370 vl_api_ipsec_tunnel_if_set_sa_t *mp;
15371 u32 sw_if_index = ~0;
15372 u32 sa_id = ~0;
15373 u8 is_outbound = (u8) ~ 0;
15374 int ret;
15375
15376 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15377 {
15378 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
15379 ;
15380 else if (unformat (i, "sa_id %d", &sa_id))
15381 ;
15382 else if (unformat (i, "outbound"))
15383 is_outbound = 1;
15384 else if (unformat (i, "inbound"))
15385 is_outbound = 0;
15386 else
15387 {
15388 clib_warning ("parse error '%U'", format_unformat_error, i);
15389 return -99;
15390 }
15391 }
15392
15393 if (sw_if_index == ~0)
15394 {
15395 errmsg ("interface must be specified");
15396 return -99;
15397 }
15398
15399 if (sa_id == ~0)
15400 {
15401 errmsg ("SA ID must be specified");
15402 return -99;
15403 }
15404
15405 M (IPSEC_TUNNEL_IF_SET_SA, mp);
15406
15407 mp->sw_if_index = htonl (sw_if_index);
15408 mp->sa_id = htonl (sa_id);
15409 mp->is_outbound = is_outbound;
15410
15411 S (mp);
15412 W (ret);
15413
15414 return ret;
15415}
15416
15417static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010015418api_get_first_msg_id (vat_main_t * vam)
15419{
15420 vl_api_get_first_msg_id_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015421 unformat_input_t *i = vam->input;
15422 u8 *name;
15423 u8 name_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015424 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015425
15426 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
15427 {
15428 if (unformat (i, "client %s", &name))
15429 name_set = 1;
15430 else
15431 break;
15432 }
15433
15434 if (name_set == 0)
15435 {
15436 errmsg ("missing client name");
15437 return -99;
15438 }
15439 vec_add1 (name, 0);
15440
15441 if (vec_len (name) > 63)
15442 {
15443 errmsg ("client name too long");
15444 return -99;
15445 }
15446
Jon Loeliger8a2aea32017-01-31 13:19:40 -060015447 M (GET_FIRST_MSG_ID, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015448 clib_memcpy (mp->name, name, vec_len (name));
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015449 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060015450 W (ret);
15451 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015452}
15453
15454static int
15455api_cop_interface_enable_disable (vat_main_t * vam)
15456{
15457 unformat_input_t *line_input = vam->input;
15458 vl_api_cop_interface_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015459 u32 sw_if_index = ~0;
15460 u8 enable_disable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015461 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015462
15463 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15464 {
15465 if (unformat (line_input, "disable"))
15466 enable_disable = 0;
15467 if (unformat (line_input, "enable"))
15468 enable_disable = 1;
15469 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15470 vam, &sw_if_index))
15471 ;
15472 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15473 ;
15474 else
15475 break;
15476 }
15477
15478 if (sw_if_index == ~0)
15479 {
15480 errmsg ("missing interface name or sw_if_index");
15481 return -99;
15482 }
15483
15484 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060015485 M (COP_INTERFACE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015486 mp->sw_if_index = ntohl (sw_if_index);
15487 mp->enable_disable = enable_disable;
15488
15489 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015490 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015491 /* Wait for the reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015492 W (ret);
15493 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015494}
15495
15496static int
15497api_cop_whitelist_enable_disable (vat_main_t * vam)
15498{
15499 unformat_input_t *line_input = vam->input;
15500 vl_api_cop_whitelist_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015501 u32 sw_if_index = ~0;
15502 u8 ip4 = 0, ip6 = 0, default_cop = 0;
15503 u32 fib_id = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015504 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015505
15506 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
15507 {
15508 if (unformat (line_input, "ip4"))
15509 ip4 = 1;
15510 else if (unformat (line_input, "ip6"))
15511 ip6 = 1;
15512 else if (unformat (line_input, "default"))
15513 default_cop = 1;
15514 else if (unformat (line_input, "%U", api_unformat_sw_if_index,
15515 vam, &sw_if_index))
15516 ;
15517 else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
15518 ;
15519 else if (unformat (line_input, "fib-id %d", &fib_id))
15520 ;
15521 else
15522 break;
15523 }
15524
15525 if (sw_if_index == ~0)
15526 {
15527 errmsg ("missing interface name or sw_if_index");
15528 return -99;
15529 }
15530
15531 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060015532 M (COP_WHITELIST_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015533 mp->sw_if_index = ntohl (sw_if_index);
15534 mp->fib_id = ntohl (fib_id);
15535 mp->ip4 = ip4;
15536 mp->ip6 = ip6;
15537 mp->default_cop = default_cop;
15538
15539 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015540 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015541 /* Wait for the reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015542 W (ret);
15543 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015544}
15545
15546static int
15547api_get_node_graph (vat_main_t * vam)
15548{
15549 vl_api_get_node_graph_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015550 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015551
Jon Loeliger8a2aea32017-01-31 13:19:40 -060015552 M (GET_NODE_GRAPH, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015553
15554 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015555 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015556 /* Wait for the reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015557 W (ret);
15558 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015559}
15560
15561/* *INDENT-OFF* */
15562/** Used for parsing LISP eids */
15563typedef CLIB_PACKED(struct{
15564 u8 addr[16]; /**< eid address */
15565 u32 len; /**< prefix length if IP */
15566 u8 type; /**< type of eid */
15567}) lisp_eid_vat_t;
15568/* *INDENT-ON* */
15569
15570static uword
15571unformat_lisp_eid_vat (unformat_input_t * input, va_list * args)
15572{
15573 lisp_eid_vat_t *a = va_arg (*args, lisp_eid_vat_t *);
15574
Dave Barachb7b92992018-10-17 10:38:51 -040015575 clib_memset (a, 0, sizeof (a[0]));
Damjan Marion7cd468a2016-12-19 23:05:39 +010015576
15577 if (unformat (input, "%U/%d", unformat_ip4_address, a->addr, &a->len))
15578 {
15579 a->type = 0; /* ipv4 type */
15580 }
15581 else if (unformat (input, "%U/%d", unformat_ip6_address, a->addr, &a->len))
15582 {
15583 a->type = 1; /* ipv6 type */
15584 }
15585 else if (unformat (input, "%U", unformat_ethernet_address, a->addr))
15586 {
15587 a->type = 2; /* mac type */
15588 }
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020015589 else if (unformat (input, "%U", unformat_nsh_address, a->addr))
15590 {
15591 a->type = 3; /* NSH type */
15592 lisp_nsh_api_t *nsh = (lisp_nsh_api_t *) a->addr;
15593 nsh->spi = clib_host_to_net_u32 (nsh->spi);
15594 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010015595 else
15596 {
15597 return 0;
15598 }
15599
15600 if ((a->type == 0 && a->len > 32) || (a->type == 1 && a->len > 128))
15601 {
15602 return 0;
15603 }
15604
15605 return 1;
15606}
15607
15608static int
15609lisp_eid_size_vat (u8 type)
15610{
15611 switch (type)
15612 {
15613 case 0:
15614 return 4;
15615 case 1:
15616 return 16;
15617 case 2:
15618 return 6;
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020015619 case 3:
15620 return 5;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015621 }
15622 return 0;
15623}
15624
15625static void
15626lisp_eid_put_vat (u8 * dst, u8 eid[16], u8 type)
15627{
15628 clib_memcpy (dst, eid, lisp_eid_size_vat (type));
15629}
15630
Damjan Marion7cd468a2016-12-19 23:05:39 +010015631static int
Filip Tehlar694396d2017-02-17 14:29:11 +010015632api_one_add_del_locator_set (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010015633{
15634 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010015635 vl_api_one_add_del_locator_set_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015636 u8 is_add = 1;
15637 u8 *locator_set_name = NULL;
15638 u8 locator_set_name_set = 0;
Filip Tehlar05a057b2017-02-01 08:50:31 +010015639 vl_api_local_locator_t locator, *locators = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015640 u32 sw_if_index, priority, weight;
15641 u32 data_len = 0;
15642
Jon Loeliger56c7b012017-02-01 12:31:41 -060015643 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015644 /* Parse args required to build the message */
15645 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15646 {
15647 if (unformat (input, "del"))
15648 {
15649 is_add = 0;
15650 }
15651 else if (unformat (input, "locator-set %s", &locator_set_name))
15652 {
15653 locator_set_name_set = 1;
15654 }
15655 else if (unformat (input, "sw_if_index %u p %u w %u",
15656 &sw_if_index, &priority, &weight))
15657 {
15658 locator.sw_if_index = htonl (sw_if_index);
15659 locator.priority = priority;
15660 locator.weight = weight;
15661 vec_add1 (locators, locator);
15662 }
15663 else
15664 if (unformat
15665 (input, "iface %U p %u w %u", api_unformat_sw_if_index, vam,
15666 &sw_if_index, &priority, &weight))
15667 {
15668 locator.sw_if_index = htonl (sw_if_index);
15669 locator.priority = priority;
15670 locator.weight = weight;
15671 vec_add1 (locators, locator);
15672 }
15673 else
15674 break;
15675 }
15676
15677 if (locator_set_name_set == 0)
15678 {
15679 errmsg ("missing locator-set name");
15680 vec_free (locators);
15681 return -99;
15682 }
15683
15684 if (vec_len (locator_set_name) > 64)
15685 {
15686 errmsg ("locator-set name too long");
15687 vec_free (locator_set_name);
15688 vec_free (locators);
15689 return -99;
15690 }
15691 vec_add1 (locator_set_name, 0);
15692
Filip Tehlar05a057b2017-02-01 08:50:31 +010015693 data_len = sizeof (vl_api_local_locator_t) * vec_len (locators);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015694
15695 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010015696 M2 (ONE_ADD_DEL_LOCATOR_SET, mp, data_len);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015697
15698 mp->is_add = is_add;
15699 clib_memcpy (mp->locator_set_name, locator_set_name,
15700 vec_len (locator_set_name));
15701 vec_free (locator_set_name);
15702
15703 mp->locator_num = clib_host_to_net_u32 (vec_len (locators));
15704 if (locators)
15705 clib_memcpy (mp->locators, locators, data_len);
15706 vec_free (locators);
15707
15708 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015709 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015710
15711 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015712 W (ret);
15713 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015714}
15715
Filip Tehlar694396d2017-02-17 14:29:11 +010015716#define api_lisp_add_del_locator_set api_one_add_del_locator_set
15717
Damjan Marion7cd468a2016-12-19 23:05:39 +010015718static int
Filip Tehlar694396d2017-02-17 14:29:11 +010015719api_one_add_del_locator (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010015720{
15721 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010015722 vl_api_one_add_del_locator_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015723 u32 tmp_if_index = ~0;
15724 u32 sw_if_index = ~0;
15725 u8 sw_if_index_set = 0;
15726 u8 sw_if_index_if_name_set = 0;
15727 u32 priority = ~0;
15728 u8 priority_set = 0;
15729 u32 weight = ~0;
15730 u8 weight_set = 0;
15731 u8 is_add = 1;
15732 u8 *locator_set_name = NULL;
15733 u8 locator_set_name_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015734 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015735
15736 /* Parse args required to build the message */
15737 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15738 {
15739 if (unformat (input, "del"))
15740 {
15741 is_add = 0;
15742 }
15743 else if (unformat (input, "locator-set %s", &locator_set_name))
15744 {
15745 locator_set_name_set = 1;
15746 }
15747 else if (unformat (input, "iface %U", api_unformat_sw_if_index, vam,
15748 &tmp_if_index))
15749 {
15750 sw_if_index_if_name_set = 1;
15751 sw_if_index = tmp_if_index;
15752 }
15753 else if (unformat (input, "sw_if_index %d", &tmp_if_index))
15754 {
15755 sw_if_index_set = 1;
15756 sw_if_index = tmp_if_index;
15757 }
15758 else if (unformat (input, "p %d", &priority))
15759 {
15760 priority_set = 1;
15761 }
15762 else if (unformat (input, "w %d", &weight))
15763 {
15764 weight_set = 1;
15765 }
15766 else
15767 break;
15768 }
15769
15770 if (locator_set_name_set == 0)
15771 {
15772 errmsg ("missing locator-set name");
15773 return -99;
15774 }
15775
15776 if (sw_if_index_set == 0 && sw_if_index_if_name_set == 0)
15777 {
15778 errmsg ("missing sw_if_index");
15779 vec_free (locator_set_name);
15780 return -99;
15781 }
15782
15783 if (sw_if_index_set != 0 && sw_if_index_if_name_set != 0)
15784 {
15785 errmsg ("cannot use both params interface name and sw_if_index");
15786 vec_free (locator_set_name);
15787 return -99;
15788 }
15789
15790 if (priority_set == 0)
15791 {
15792 errmsg ("missing locator-set priority");
15793 vec_free (locator_set_name);
15794 return -99;
15795 }
15796
15797 if (weight_set == 0)
15798 {
15799 errmsg ("missing locator-set weight");
15800 vec_free (locator_set_name);
15801 return -99;
15802 }
15803
15804 if (vec_len (locator_set_name) > 64)
15805 {
15806 errmsg ("locator-set name too long");
15807 vec_free (locator_set_name);
15808 return -99;
15809 }
15810 vec_add1 (locator_set_name, 0);
15811
15812 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010015813 M (ONE_ADD_DEL_LOCATOR, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015814
15815 mp->is_add = is_add;
15816 mp->sw_if_index = ntohl (sw_if_index);
15817 mp->priority = priority;
15818 mp->weight = weight;
15819 clib_memcpy (mp->locator_set_name, locator_set_name,
15820 vec_len (locator_set_name));
15821 vec_free (locator_set_name);
15822
15823 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015824 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015825
15826 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015827 W (ret);
15828 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015829}
15830
Filip Tehlar694396d2017-02-17 14:29:11 +010015831#define api_lisp_add_del_locator api_one_add_del_locator
15832
Damjan Marion7cd468a2016-12-19 23:05:39 +010015833uword
15834unformat_hmac_key_id (unformat_input_t * input, va_list * args)
15835{
15836 u32 *key_id = va_arg (*args, u32 *);
15837 u8 *s = 0;
15838
15839 if (unformat (input, "%s", &s))
15840 {
15841 if (!strcmp ((char *) s, "sha1"))
15842 key_id[0] = HMAC_SHA_1_96;
15843 else if (!strcmp ((char *) s, "sha256"))
15844 key_id[0] = HMAC_SHA_256_128;
15845 else
15846 {
15847 clib_warning ("invalid key_id: '%s'", s);
15848 key_id[0] = HMAC_NO_KEY;
15849 }
15850 }
15851 else
15852 return 0;
15853
15854 vec_free (s);
15855 return 1;
15856}
15857
15858static int
Filip Tehlar694396d2017-02-17 14:29:11 +010015859api_one_add_del_local_eid (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010015860{
15861 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010015862 vl_api_one_add_del_local_eid_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015863 u8 is_add = 1;
15864 u8 eid_set = 0;
15865 lisp_eid_vat_t _eid, *eid = &_eid;
15866 u8 *locator_set_name = 0;
15867 u8 locator_set_name_set = 0;
15868 u32 vni = 0;
15869 u16 key_id = 0;
15870 u8 *key = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015871 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015872
15873 /* Parse args required to build the message */
15874 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15875 {
15876 if (unformat (input, "del"))
15877 {
15878 is_add = 0;
15879 }
15880 else if (unformat (input, "vni %d", &vni))
15881 {
15882 ;
15883 }
15884 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
15885 {
15886 eid_set = 1;
15887 }
15888 else if (unformat (input, "locator-set %s", &locator_set_name))
15889 {
15890 locator_set_name_set = 1;
15891 }
15892 else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id))
15893 ;
15894 else if (unformat (input, "secret-key %_%v%_", &key))
15895 ;
15896 else
15897 break;
15898 }
15899
15900 if (locator_set_name_set == 0)
15901 {
15902 errmsg ("missing locator-set name");
15903 return -99;
15904 }
15905
15906 if (0 == eid_set)
15907 {
15908 errmsg ("EID address not set!");
15909 vec_free (locator_set_name);
15910 return -99;
15911 }
15912
15913 if (key && (0 == key_id))
15914 {
15915 errmsg ("invalid key_id!");
15916 return -99;
15917 }
15918
15919 if (vec_len (key) > 64)
15920 {
15921 errmsg ("key too long");
15922 vec_free (key);
15923 return -99;
15924 }
15925
15926 if (vec_len (locator_set_name) > 64)
15927 {
15928 errmsg ("locator-set name too long");
15929 vec_free (locator_set_name);
15930 return -99;
15931 }
15932 vec_add1 (locator_set_name, 0);
15933
15934 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010015935 M (ONE_ADD_DEL_LOCAL_EID, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015936
15937 mp->is_add = is_add;
15938 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
15939 mp->eid_type = eid->type;
15940 mp->prefix_len = eid->len;
15941 mp->vni = clib_host_to_net_u32 (vni);
15942 mp->key_id = clib_host_to_net_u16 (key_id);
15943 clib_memcpy (mp->locator_set_name, locator_set_name,
15944 vec_len (locator_set_name));
15945 clib_memcpy (mp->key, key, vec_len (key));
15946
15947 vec_free (locator_set_name);
15948 vec_free (key);
15949
15950 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060015951 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010015952
15953 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060015954 W (ret);
15955 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015956}
15957
Filip Tehlar694396d2017-02-17 14:29:11 +010015958#define api_lisp_add_del_local_eid api_one_add_del_local_eid
Damjan Marion7cd468a2016-12-19 23:05:39 +010015959
15960static int
15961api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam)
15962{
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010015963 u32 dp_table = 0, vni = 0;;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015964 unformat_input_t *input = vam->input;
Filip Tehlar82786c42017-02-20 15:20:37 +010015965 vl_api_gpe_add_del_fwd_entry_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015966 u8 is_add = 1;
15967 lisp_eid_vat_t _rmt_eid, *rmt_eid = &_rmt_eid;
15968 lisp_eid_vat_t _lcl_eid, *lcl_eid = &_lcl_eid;
15969 u8 rmt_eid_set = 0, lcl_eid_set = 0;
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010015970 u32 action = ~0, w;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015971 ip4_address_t rmt_rloc4, lcl_rloc4;
15972 ip6_address_t rmt_rloc6, lcl_rloc6;
Filip Tehlar82786c42017-02-20 15:20:37 +010015973 vl_api_gpe_locator_t *rmt_locs = 0, *lcl_locs = 0, rloc, *curr_rloc = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060015974 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010015975
Dave Barachb7b92992018-10-17 10:38:51 -040015976 clib_memset (&rloc, 0, sizeof (rloc));
Damjan Marion7cd468a2016-12-19 23:05:39 +010015977
15978 /* Parse args required to build the message */
15979 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
15980 {
15981 if (unformat (input, "del"))
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010015982 is_add = 0;
15983 else if (unformat (input, "add"))
15984 is_add = 1;
15985 else if (unformat (input, "reid %U", unformat_lisp_eid_vat, rmt_eid))
Damjan Marion7cd468a2016-12-19 23:05:39 +010015986 {
15987 rmt_eid_set = 1;
15988 }
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010015989 else if (unformat (input, "leid %U", unformat_lisp_eid_vat, lcl_eid))
Damjan Marion7cd468a2016-12-19 23:05:39 +010015990 {
15991 lcl_eid_set = 1;
15992 }
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010015993 else if (unformat (input, "vrf %d", &dp_table))
15994 ;
15995 else if (unformat (input, "bd %d", &dp_table))
15996 ;
15997 else if (unformat (input, "vni %d", &vni))
15998 ;
15999 else if (unformat (input, "w %d", &w))
Damjan Marion7cd468a2016-12-19 23:05:39 +010016000 {
16001 if (!curr_rloc)
16002 {
16003 errmsg ("No RLOC configured for setting priority/weight!");
16004 return -99;
16005 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010016006 curr_rloc->weight = w;
16007 }
16008 else if (unformat (input, "loc-pair %U %U", unformat_ip4_address,
16009 &lcl_rloc4, unformat_ip4_address, &rmt_rloc4))
16010 {
16011 rloc.is_ip4 = 1;
16012
16013 clib_memcpy (&rloc.addr, &lcl_rloc4, sizeof (lcl_rloc4));
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016014 rloc.weight = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016015 vec_add1 (lcl_locs, rloc);
16016
16017 clib_memcpy (&rloc.addr, &rmt_rloc4, sizeof (rmt_rloc4));
16018 vec_add1 (rmt_locs, rloc);
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016019 /* weight saved in rmt loc */
Damjan Marion7cd468a2016-12-19 23:05:39 +010016020 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16021 }
16022 else if (unformat (input, "loc-pair %U %U", unformat_ip6_address,
16023 &lcl_rloc6, unformat_ip6_address, &rmt_rloc6))
16024 {
16025 rloc.is_ip4 = 0;
16026 clib_memcpy (&rloc.addr, &lcl_rloc6, sizeof (lcl_rloc6));
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016027 rloc.weight = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016028 vec_add1 (lcl_locs, rloc);
16029
16030 clib_memcpy (&rloc.addr, &rmt_rloc6, sizeof (rmt_rloc6));
16031 vec_add1 (rmt_locs, rloc);
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016032 /* weight saved in rmt loc */
Damjan Marion7cd468a2016-12-19 23:05:39 +010016033 curr_rloc = &rmt_locs[vec_len (rmt_locs) - 1];
16034 }
16035 else if (unformat (input, "action %d", &action))
16036 {
16037 ;
16038 }
16039 else
16040 {
16041 clib_warning ("parse error '%U'", format_unformat_error, input);
16042 return -99;
16043 }
16044 }
16045
16046 if (!rmt_eid_set)
16047 {
16048 errmsg ("remote eid addresses not set");
16049 return -99;
16050 }
16051
16052 if (lcl_eid_set && rmt_eid->type != lcl_eid->type)
16053 {
16054 errmsg ("eid types don't match");
16055 return -99;
16056 }
16057
16058 if (0 == rmt_locs && (u32) ~ 0 == action)
16059 {
16060 errmsg ("action not set for negative mapping");
16061 return -99;
16062 }
16063
16064 /* Construct the API message */
Filip Tehlar82786c42017-02-20 15:20:37 +010016065 M2 (GPE_ADD_DEL_FWD_ENTRY, mp,
16066 sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs) * 2);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016067
16068 mp->is_add = is_add;
16069 lisp_eid_put_vat (mp->rmt_eid, rmt_eid->addr, rmt_eid->type);
16070 lisp_eid_put_vat (mp->lcl_eid, lcl_eid->addr, lcl_eid->type);
16071 mp->eid_type = rmt_eid->type;
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016072 mp->dp_table = clib_host_to_net_u32 (dp_table);
16073 mp->vni = clib_host_to_net_u32 (vni);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016074 mp->rmt_len = rmt_eid->len;
16075 mp->lcl_len = lcl_eid->len;
16076 mp->action = action;
16077
16078 if (0 != rmt_locs && 0 != lcl_locs)
16079 {
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016080 mp->loc_num = clib_host_to_net_u32 (vec_len (rmt_locs) * 2);
16081 clib_memcpy (mp->locs, lcl_locs,
Filip Tehlar82786c42017-02-20 15:20:37 +010016082 (sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs)));
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016083
Filip Tehlar82786c42017-02-20 15:20:37 +010016084 u32 offset = sizeof (vl_api_gpe_locator_t) * vec_len (lcl_locs);
Filip Tehlarc3af7bf2017-01-13 14:13:09 +010016085 clib_memcpy (((u8 *) mp->locs) + offset, rmt_locs,
Filip Tehlar82786c42017-02-20 15:20:37 +010016086 (sizeof (vl_api_gpe_locator_t) * vec_len (rmt_locs)));
Damjan Marion7cd468a2016-12-19 23:05:39 +010016087 }
16088 vec_free (lcl_locs);
16089 vec_free (rmt_locs);
16090
16091 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016092 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016093
16094 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016095 W (ret);
16096 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016097}
16098
16099static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016100api_one_add_del_map_server (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016101{
16102 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016103 vl_api_one_add_del_map_server_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016104 u8 is_add = 1;
16105 u8 ipv4_set = 0;
16106 u8 ipv6_set = 0;
16107 ip4_address_t ipv4;
16108 ip6_address_t ipv6;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016109 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016110
16111 /* Parse args required to build the message */
16112 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16113 {
16114 if (unformat (input, "del"))
16115 {
16116 is_add = 0;
16117 }
16118 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16119 {
16120 ipv4_set = 1;
16121 }
16122 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16123 {
16124 ipv6_set = 1;
16125 }
16126 else
16127 break;
16128 }
16129
16130 if (ipv4_set && ipv6_set)
16131 {
16132 errmsg ("both eid v4 and v6 addresses set");
16133 return -99;
16134 }
16135
16136 if (!ipv4_set && !ipv6_set)
16137 {
16138 errmsg ("eid addresses not set");
16139 return -99;
16140 }
16141
16142 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010016143 M (ONE_ADD_DEL_MAP_SERVER, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016144
16145 mp->is_add = is_add;
16146 if (ipv6_set)
16147 {
16148 mp->is_ipv6 = 1;
16149 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16150 }
16151 else
16152 {
16153 mp->is_ipv6 = 0;
16154 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16155 }
16156
16157 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016158 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016159
16160 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016161 W (ret);
16162 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016163}
16164
Filip Tehlar694396d2017-02-17 14:29:11 +010016165#define api_lisp_add_del_map_server api_one_add_del_map_server
16166
Damjan Marion7cd468a2016-12-19 23:05:39 +010016167static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016168api_one_add_del_map_resolver (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016169{
16170 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016171 vl_api_one_add_del_map_resolver_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016172 u8 is_add = 1;
16173 u8 ipv4_set = 0;
16174 u8 ipv6_set = 0;
16175 ip4_address_t ipv4;
16176 ip6_address_t ipv6;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016177 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016178
16179 /* Parse args required to build the message */
16180 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16181 {
16182 if (unformat (input, "del"))
16183 {
16184 is_add = 0;
16185 }
16186 else if (unformat (input, "%U", unformat_ip4_address, &ipv4))
16187 {
16188 ipv4_set = 1;
16189 }
16190 else if (unformat (input, "%U", unformat_ip6_address, &ipv6))
16191 {
16192 ipv6_set = 1;
16193 }
16194 else
16195 break;
16196 }
16197
16198 if (ipv4_set && ipv6_set)
16199 {
16200 errmsg ("both eid v4 and v6 addresses set");
16201 return -99;
16202 }
16203
16204 if (!ipv4_set && !ipv6_set)
16205 {
16206 errmsg ("eid addresses not set");
16207 return -99;
16208 }
16209
16210 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010016211 M (ONE_ADD_DEL_MAP_RESOLVER, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016212
16213 mp->is_add = is_add;
16214 if (ipv6_set)
16215 {
16216 mp->is_ipv6 = 1;
16217 clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6));
16218 }
16219 else
16220 {
16221 mp->is_ipv6 = 0;
16222 clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4));
16223 }
16224
16225 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016226 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016227
16228 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016229 W (ret);
16230 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016231}
16232
Filip Tehlar694396d2017-02-17 14:29:11 +010016233#define api_lisp_add_del_map_resolver api_one_add_del_map_resolver
16234
Damjan Marion7cd468a2016-12-19 23:05:39 +010016235static int
16236api_lisp_gpe_enable_disable (vat_main_t * vam)
16237{
16238 unformat_input_t *input = vam->input;
Filip Tehlar82786c42017-02-20 15:20:37 +010016239 vl_api_gpe_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016240 u8 is_set = 0;
16241 u8 is_en = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016242 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016243
16244 /* Parse args required to build the message */
16245 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16246 {
16247 if (unformat (input, "enable"))
16248 {
16249 is_set = 1;
16250 is_en = 1;
16251 }
16252 else if (unformat (input, "disable"))
16253 {
16254 is_set = 1;
16255 is_en = 0;
16256 }
16257 else
16258 break;
16259 }
16260
16261 if (is_set == 0)
16262 {
16263 errmsg ("Value not set");
16264 return -99;
16265 }
16266
16267 /* Construct the API message */
Filip Tehlar82786c42017-02-20 15:20:37 +010016268 M (GPE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016269
16270 mp->is_en = is_en;
16271
16272 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016273 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016274
16275 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016276 W (ret);
16277 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016278}
16279
16280static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016281api_one_rloc_probe_enable_disable (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016282{
16283 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016284 vl_api_one_rloc_probe_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016285 u8 is_set = 0;
16286 u8 is_en = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016287 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016288
16289 /* Parse args required to build the message */
16290 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16291 {
16292 if (unformat (input, "enable"))
16293 {
16294 is_set = 1;
16295 is_en = 1;
16296 }
16297 else if (unformat (input, "disable"))
16298 is_set = 1;
16299 else
16300 break;
16301 }
16302
16303 if (!is_set)
16304 {
16305 errmsg ("Value not set");
16306 return -99;
16307 }
16308
16309 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010016310 M (ONE_RLOC_PROBE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016311
16312 mp->is_enabled = is_en;
16313
16314 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016315 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016316
16317 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016318 W (ret);
16319 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016320}
16321
Filip Tehlar694396d2017-02-17 14:29:11 +010016322#define api_lisp_rloc_probe_enable_disable api_one_rloc_probe_enable_disable
16323
Damjan Marion7cd468a2016-12-19 23:05:39 +010016324static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016325api_one_map_register_enable_disable (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016326{
16327 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016328 vl_api_one_map_register_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016329 u8 is_set = 0;
16330 u8 is_en = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016331 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016332
16333 /* Parse args required to build the message */
16334 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16335 {
16336 if (unformat (input, "enable"))
16337 {
16338 is_set = 1;
16339 is_en = 1;
16340 }
16341 else if (unformat (input, "disable"))
16342 is_set = 1;
16343 else
16344 break;
16345 }
16346
16347 if (!is_set)
16348 {
16349 errmsg ("Value not set");
16350 return -99;
16351 }
16352
16353 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010016354 M (ONE_MAP_REGISTER_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016355
16356 mp->is_enabled = is_en;
16357
16358 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016359 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016360
16361 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016362 W (ret);
16363 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016364}
16365
Filip Tehlar694396d2017-02-17 14:29:11 +010016366#define api_lisp_map_register_enable_disable api_one_map_register_enable_disable
16367
Damjan Marion7cd468a2016-12-19 23:05:39 +010016368static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016369api_one_enable_disable (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016370{
16371 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016372 vl_api_one_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016373 u8 is_set = 0;
16374 u8 is_en = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016375 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016376
16377 /* Parse args required to build the message */
16378 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16379 {
16380 if (unformat (input, "enable"))
16381 {
16382 is_set = 1;
16383 is_en = 1;
16384 }
16385 else if (unformat (input, "disable"))
16386 {
16387 is_set = 1;
16388 }
16389 else
16390 break;
16391 }
16392
16393 if (!is_set)
16394 {
16395 errmsg ("Value not set");
16396 return -99;
16397 }
16398
16399 /* Construct the API message */
Filip Tehlar694396d2017-02-17 14:29:11 +010016400 M (ONE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016401
16402 mp->is_en = is_en;
16403
16404 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016405 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016406
16407 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016408 W (ret);
16409 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016410}
16411
Filip Tehlar694396d2017-02-17 14:29:11 +010016412#define api_lisp_enable_disable api_one_enable_disable
16413
Damjan Marion7cd468a2016-12-19 23:05:39 +010016414static int
Filip Tehlar0a8840d2017-10-16 05:48:23 -070016415api_one_enable_disable_xtr_mode (vat_main_t * vam)
16416{
16417 unformat_input_t *input = vam->input;
16418 vl_api_one_enable_disable_xtr_mode_t *mp;
16419 u8 is_set = 0;
16420 u8 is_en = 0;
16421 int ret;
16422
16423 /* Parse args required to build the message */
16424 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16425 {
16426 if (unformat (input, "enable"))
16427 {
16428 is_set = 1;
16429 is_en = 1;
16430 }
16431 else if (unformat (input, "disable"))
16432 {
16433 is_set = 1;
16434 }
16435 else
16436 break;
16437 }
16438
16439 if (!is_set)
16440 {
16441 errmsg ("Value not set");
16442 return -99;
16443 }
16444
16445 /* Construct the API message */
16446 M (ONE_ENABLE_DISABLE_XTR_MODE, mp);
16447
16448 mp->is_en = is_en;
16449
16450 /* send it... */
16451 S (mp);
16452
16453 /* Wait for a reply... */
16454 W (ret);
16455 return ret;
16456}
16457
16458static int
16459api_one_show_xtr_mode (vat_main_t * vam)
16460{
16461 vl_api_one_show_xtr_mode_t *mp;
16462 int ret;
16463
16464 /* Construct the API message */
16465 M (ONE_SHOW_XTR_MODE, mp);
16466
16467 /* send it... */
16468 S (mp);
16469
16470 /* Wait for a reply... */
16471 W (ret);
16472 return ret;
16473}
16474
16475static int
16476api_one_enable_disable_pitr_mode (vat_main_t * vam)
16477{
16478 unformat_input_t *input = vam->input;
16479 vl_api_one_enable_disable_pitr_mode_t *mp;
16480 u8 is_set = 0;
16481 u8 is_en = 0;
16482 int ret;
16483
16484 /* Parse args required to build the message */
16485 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16486 {
16487 if (unformat (input, "enable"))
16488 {
16489 is_set = 1;
16490 is_en = 1;
16491 }
16492 else if (unformat (input, "disable"))
16493 {
16494 is_set = 1;
16495 }
16496 else
16497 break;
16498 }
16499
16500 if (!is_set)
16501 {
16502 errmsg ("Value not set");
16503 return -99;
16504 }
16505
16506 /* Construct the API message */
16507 M (ONE_ENABLE_DISABLE_PITR_MODE, mp);
16508
16509 mp->is_en = is_en;
16510
16511 /* send it... */
16512 S (mp);
16513
16514 /* Wait for a reply... */
16515 W (ret);
16516 return ret;
16517}
16518
16519static int
16520api_one_show_pitr_mode (vat_main_t * vam)
16521{
16522 vl_api_one_show_pitr_mode_t *mp;
16523 int ret;
16524
16525 /* Construct the API message */
16526 M (ONE_SHOW_PITR_MODE, mp);
16527
16528 /* send it... */
16529 S (mp);
16530
16531 /* Wait for a reply... */
16532 W (ret);
16533 return ret;
16534}
16535
16536static int
16537api_one_enable_disable_petr_mode (vat_main_t * vam)
16538{
16539 unformat_input_t *input = vam->input;
16540 vl_api_one_enable_disable_petr_mode_t *mp;
16541 u8 is_set = 0;
16542 u8 is_en = 0;
16543 int ret;
16544
16545 /* Parse args required to build the message */
16546 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16547 {
16548 if (unformat (input, "enable"))
16549 {
16550 is_set = 1;
16551 is_en = 1;
16552 }
16553 else if (unformat (input, "disable"))
16554 {
16555 is_set = 1;
16556 }
16557 else
16558 break;
16559 }
16560
16561 if (!is_set)
16562 {
16563 errmsg ("Value not set");
16564 return -99;
16565 }
16566
16567 /* Construct the API message */
16568 M (ONE_ENABLE_DISABLE_PETR_MODE, mp);
16569
16570 mp->is_en = is_en;
16571
16572 /* send it... */
16573 S (mp);
16574
16575 /* Wait for a reply... */
16576 W (ret);
16577 return ret;
16578}
16579
16580static int
16581api_one_show_petr_mode (vat_main_t * vam)
16582{
16583 vl_api_one_show_petr_mode_t *mp;
16584 int ret;
16585
16586 /* Construct the API message */
16587 M (ONE_SHOW_PETR_MODE, mp);
16588
16589 /* send it... */
16590 S (mp);
16591
16592 /* Wait for a reply... */
16593 W (ret);
16594 return ret;
16595}
16596
16597static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016598api_show_one_map_register_state (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016599{
Filip Tehlar694396d2017-02-17 14:29:11 +010016600 vl_api_show_one_map_register_state_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016601 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016602
Filip Tehlar694396d2017-02-17 14:29:11 +010016603 M (SHOW_ONE_MAP_REGISTER_STATE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016604
16605 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016606 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016607
16608 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016609 W (ret);
16610 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016611}
16612
Filip Tehlar694396d2017-02-17 14:29:11 +010016613#define api_show_lisp_map_register_state api_show_one_map_register_state
16614
Damjan Marion7cd468a2016-12-19 23:05:39 +010016615static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016616api_show_one_rloc_probe_state (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016617{
Filip Tehlar694396d2017-02-17 14:29:11 +010016618 vl_api_show_one_rloc_probe_state_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016619 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016620
Filip Tehlar694396d2017-02-17 14:29:11 +010016621 M (SHOW_ONE_RLOC_PROBE_STATE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016622
16623 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016624 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016625
16626 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016627 W (ret);
16628 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016629}
16630
Filip Tehlar694396d2017-02-17 14:29:11 +010016631#define api_show_lisp_rloc_probe_state api_show_one_rloc_probe_state
16632
Damjan Marion7cd468a2016-12-19 23:05:39 +010016633static int
Filip Tehlar05879992017-09-05 15:46:09 +020016634api_one_add_del_ndp_entry (vat_main_t * vam)
16635{
16636 vl_api_one_add_del_ndp_entry_t *mp;
16637 unformat_input_t *input = vam->input;
16638 u8 is_add = 1;
16639 u8 mac_set = 0;
16640 u8 bd_set = 0;
16641 u8 ip_set = 0;
16642 u8 mac[6] = { 0, };
16643 u8 ip6[16] = { 0, };
16644 u32 bd = ~0;
16645 int ret;
16646
16647 /* Parse args required to build the message */
16648 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16649 {
16650 if (unformat (input, "del"))
16651 is_add = 0;
16652 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16653 mac_set = 1;
16654 else if (unformat (input, "ip %U", unformat_ip6_address, ip6))
16655 ip_set = 1;
16656 else if (unformat (input, "bd %d", &bd))
16657 bd_set = 1;
16658 else
16659 {
16660 errmsg ("parse error '%U'", format_unformat_error, input);
16661 return -99;
16662 }
16663 }
16664
16665 if (!bd_set || !ip_set || (!mac_set && is_add))
16666 {
16667 errmsg ("Missing BD, IP or MAC!");
16668 return -99;
16669 }
16670
16671 M (ONE_ADD_DEL_NDP_ENTRY, mp);
16672 mp->is_add = is_add;
16673 clib_memcpy (mp->mac, mac, 6);
16674 mp->bd = clib_host_to_net_u32 (bd);
16675 clib_memcpy (mp->ip6, ip6, sizeof (mp->ip6));
16676
16677 /* send */
16678 S (mp);
16679
16680 /* wait for reply */
16681 W (ret);
16682 return ret;
16683}
16684
16685static int
Filip Tehlard5a65db2017-05-17 17:21:10 +020016686api_one_add_del_l2_arp_entry (vat_main_t * vam)
16687{
16688 vl_api_one_add_del_l2_arp_entry_t *mp;
16689 unformat_input_t *input = vam->input;
16690 u8 is_add = 1;
16691 u8 mac_set = 0;
16692 u8 bd_set = 0;
16693 u8 ip_set = 0;
16694 u8 mac[6] = { 0, };
16695 u32 ip4 = 0, bd = ~0;
16696 int ret;
16697
16698 /* Parse args required to build the message */
16699 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16700 {
16701 if (unformat (input, "del"))
16702 is_add = 0;
16703 else if (unformat (input, "mac %U", unformat_ethernet_address, mac))
16704 mac_set = 1;
16705 else if (unformat (input, "ip %U", unformat_ip4_address, &ip4))
16706 ip_set = 1;
16707 else if (unformat (input, "bd %d", &bd))
16708 bd_set = 1;
16709 else
16710 {
16711 errmsg ("parse error '%U'", format_unformat_error, input);
16712 return -99;
16713 }
16714 }
16715
16716 if (!bd_set || !ip_set || (!mac_set && is_add))
16717 {
16718 errmsg ("Missing BD, IP or MAC!");
16719 return -99;
16720 }
16721
16722 M (ONE_ADD_DEL_L2_ARP_ENTRY, mp);
16723 mp->is_add = is_add;
16724 clib_memcpy (mp->mac, mac, 6);
16725 mp->bd = clib_host_to_net_u32 (bd);
16726 mp->ip4 = ip4;
16727
16728 /* send */
16729 S (mp);
16730
16731 /* wait for reply */
16732 W (ret);
16733 return ret;
16734}
16735
16736static int
Filip Tehlar05879992017-09-05 15:46:09 +020016737api_one_ndp_bd_get (vat_main_t * vam)
16738{
16739 vl_api_one_ndp_bd_get_t *mp;
16740 int ret;
16741
16742 M (ONE_NDP_BD_GET, mp);
16743
16744 /* send */
16745 S (mp);
16746
16747 /* wait for reply */
16748 W (ret);
16749 return ret;
16750}
16751
16752static int
16753api_one_ndp_entries_get (vat_main_t * vam)
16754{
16755 vl_api_one_ndp_entries_get_t *mp;
16756 unformat_input_t *input = vam->input;
16757 u8 bd_set = 0;
16758 u32 bd = ~0;
16759 int ret;
16760
16761 /* Parse args required to build the message */
16762 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16763 {
16764 if (unformat (input, "bd %d", &bd))
16765 bd_set = 1;
16766 else
16767 {
16768 errmsg ("parse error '%U'", format_unformat_error, input);
16769 return -99;
16770 }
16771 }
16772
16773 if (!bd_set)
16774 {
16775 errmsg ("Expected bridge domain!");
16776 return -99;
16777 }
16778
16779 M (ONE_NDP_ENTRIES_GET, mp);
16780 mp->bd = clib_host_to_net_u32 (bd);
16781
16782 /* send */
16783 S (mp);
16784
16785 /* wait for reply */
16786 W (ret);
16787 return ret;
16788}
16789
16790static int
Filip Tehlard5a65db2017-05-17 17:21:10 +020016791api_one_l2_arp_bd_get (vat_main_t * vam)
16792{
16793 vl_api_one_l2_arp_bd_get_t *mp;
16794 int ret;
16795
16796 M (ONE_L2_ARP_BD_GET, mp);
16797
16798 /* send */
16799 S (mp);
16800
16801 /* wait for reply */
16802 W (ret);
16803 return ret;
16804}
16805
16806static int
16807api_one_l2_arp_entries_get (vat_main_t * vam)
16808{
16809 vl_api_one_l2_arp_entries_get_t *mp;
16810 unformat_input_t *input = vam->input;
16811 u8 bd_set = 0;
16812 u32 bd = ~0;
16813 int ret;
16814
16815 /* Parse args required to build the message */
16816 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16817 {
16818 if (unformat (input, "bd %d", &bd))
16819 bd_set = 1;
16820 else
16821 {
16822 errmsg ("parse error '%U'", format_unformat_error, input);
16823 return -99;
16824 }
16825 }
16826
16827 if (!bd_set)
16828 {
16829 errmsg ("Expected bridge domain!");
16830 return -99;
16831 }
16832
16833 M (ONE_L2_ARP_ENTRIES_GET, mp);
16834 mp->bd = clib_host_to_net_u32 (bd);
16835
16836 /* send */
16837 S (mp);
16838
16839 /* wait for reply */
16840 W (ret);
16841 return ret;
16842}
16843
16844static int
Filip Tehlar4868ff62017-03-09 16:48:39 +010016845api_one_stats_enable_disable (vat_main_t * vam)
16846{
16847 vl_api_one_stats_enable_disable_t *mp;
16848 unformat_input_t *input = vam->input;
16849 u8 is_set = 0;
16850 u8 is_en = 0;
16851 int ret;
16852
16853 /* Parse args required to build the message */
16854 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16855 {
16856 if (unformat (input, "enable"))
16857 {
16858 is_set = 1;
16859 is_en = 1;
16860 }
16861 else if (unformat (input, "disable"))
16862 {
16863 is_set = 1;
16864 }
16865 else
16866 break;
16867 }
16868
16869 if (!is_set)
16870 {
16871 errmsg ("Value not set");
16872 return -99;
16873 }
16874
16875 M (ONE_STATS_ENABLE_DISABLE, mp);
16876 mp->is_en = is_en;
16877
16878 /* send */
16879 S (mp);
16880
16881 /* wait for reply */
16882 W (ret);
16883 return ret;
16884}
16885
16886static int
16887api_show_one_stats_enable_disable (vat_main_t * vam)
16888{
16889 vl_api_show_one_stats_enable_disable_t *mp;
16890 int ret;
16891
16892 M (SHOW_ONE_STATS_ENABLE_DISABLE, mp);
16893
16894 /* send */
16895 S (mp);
16896
16897 /* wait for reply */
16898 W (ret);
16899 return ret;
16900}
16901
16902static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016903api_show_one_map_request_mode (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016904{
Filip Tehlar694396d2017-02-17 14:29:11 +010016905 vl_api_show_one_map_request_mode_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016906 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016907
Filip Tehlar694396d2017-02-17 14:29:11 +010016908 M (SHOW_ONE_MAP_REQUEST_MODE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016909
16910 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016911 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016912
16913 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016914 W (ret);
16915 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016916}
16917
Filip Tehlar694396d2017-02-17 14:29:11 +010016918#define api_show_lisp_map_request_mode api_show_one_map_request_mode
16919
Damjan Marion7cd468a2016-12-19 23:05:39 +010016920static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016921api_one_map_request_mode (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016922{
Damjan Marion7cd468a2016-12-19 23:05:39 +010016923 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016924 vl_api_one_map_request_mode_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016925 u8 mode = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016926 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016927
16928 /* Parse args required to build the message */
16929 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16930 {
16931 if (unformat (input, "dst-only"))
16932 mode = 0;
16933 else if (unformat (input, "src-dst"))
16934 mode = 1;
16935 else
16936 {
16937 errmsg ("parse error '%U'", format_unformat_error, input);
16938 return -99;
16939 }
16940 }
16941
Filip Tehlar694396d2017-02-17 14:29:11 +010016942 M (ONE_MAP_REQUEST_MODE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016943
16944 mp->mode = mode;
16945
16946 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016947 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016948
16949 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060016950 W (ret);
16951 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016952}
16953
Filip Tehlar694396d2017-02-17 14:29:11 +010016954#define api_lisp_map_request_mode api_one_map_request_mode
16955
Damjan Marion7cd468a2016-12-19 23:05:39 +010016956/**
Filip Tehlar694396d2017-02-17 14:29:11 +010016957 * Enable/disable ONE proxy ITR.
Damjan Marion7cd468a2016-12-19 23:05:39 +010016958 *
16959 * @param vam vpp API test context
16960 * @return return code
16961 */
16962static int
Filip Tehlar694396d2017-02-17 14:29:11 +010016963api_one_pitr_set_locator_set (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010016964{
Damjan Marion7cd468a2016-12-19 23:05:39 +010016965 u8 ls_name_set = 0;
16966 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010016967 vl_api_one_pitr_set_locator_set_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016968 u8 is_add = 1;
16969 u8 *ls_name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060016970 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010016971
16972 /* Parse args required to build the message */
16973 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
16974 {
16975 if (unformat (input, "del"))
16976 is_add = 0;
16977 else if (unformat (input, "locator-set %s", &ls_name))
16978 ls_name_set = 1;
16979 else
16980 {
16981 errmsg ("parse error '%U'", format_unformat_error, input);
16982 return -99;
16983 }
16984 }
16985
16986 if (!ls_name_set)
16987 {
16988 errmsg ("locator-set name not set!");
16989 return -99;
16990 }
16991
Filip Tehlar694396d2017-02-17 14:29:11 +010016992 M (ONE_PITR_SET_LOCATOR_SET, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010016993
16994 mp->is_add = is_add;
16995 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
16996 vec_free (ls_name);
16997
16998 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060016999 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017000
17001 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017002 W (ret);
17003 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017004}
17005
Filip Tehlar694396d2017-02-17 14:29:11 +010017006#define api_lisp_pitr_set_locator_set api_one_pitr_set_locator_set
17007
Damjan Marion7cd468a2016-12-19 23:05:39 +010017008static int
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020017009api_one_nsh_set_locator_set (vat_main_t * vam)
17010{
17011 u8 ls_name_set = 0;
17012 unformat_input_t *input = vam->input;
17013 vl_api_one_nsh_set_locator_set_t *mp;
17014 u8 is_add = 1;
17015 u8 *ls_name = 0;
17016 int ret;
17017
17018 /* Parse args required to build the message */
17019 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17020 {
17021 if (unformat (input, "del"))
17022 is_add = 0;
17023 else if (unformat (input, "ls %s", &ls_name))
17024 ls_name_set = 1;
17025 else
17026 {
17027 errmsg ("parse error '%U'", format_unformat_error, input);
17028 return -99;
17029 }
17030 }
17031
17032 if (!ls_name_set && is_add)
17033 {
17034 errmsg ("locator-set name not set!");
17035 return -99;
17036 }
17037
17038 M (ONE_NSH_SET_LOCATOR_SET, mp);
17039
17040 mp->is_add = is_add;
17041 clib_memcpy (mp->ls_name, ls_name, vec_len (ls_name));
17042 vec_free (ls_name);
17043
17044 /* send */
17045 S (mp);
17046
17047 /* wait for reply */
17048 W (ret);
17049 return ret;
17050}
17051
17052static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017053api_show_one_pitr (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017054{
Filip Tehlar694396d2017-02-17 14:29:11 +010017055 vl_api_show_one_pitr_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017056 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017057
17058 if (!vam->json_output)
17059 {
17060 print (vam->ofp, "%=20s", "lisp status:");
17061 }
17062
Filip Tehlar694396d2017-02-17 14:29:11 +010017063 M (SHOW_ONE_PITR, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017064 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017065 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017066
17067 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017068 W (ret);
17069 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017070}
17071
Filip Tehlar694396d2017-02-17 14:29:11 +010017072#define api_show_lisp_pitr api_show_one_pitr
17073
Filip Tehlar67a99f82017-03-10 13:18:02 +010017074static int
17075api_one_use_petr (vat_main_t * vam)
17076{
17077 unformat_input_t *input = vam->input;
17078 vl_api_one_use_petr_t *mp;
17079 u8 is_add = 0;
17080 ip_address_t ip;
17081 int ret;
17082
Dave Barachb7b92992018-10-17 10:38:51 -040017083 clib_memset (&ip, 0, sizeof (ip));
Filip Tehlar67a99f82017-03-10 13:18:02 +010017084
17085 /* Parse args required to build the message */
17086 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17087 {
17088 if (unformat (input, "disable"))
17089 is_add = 0;
17090 else
17091 if (unformat (input, "%U", unformat_ip4_address, &ip_addr_v4 (&ip)))
17092 {
17093 is_add = 1;
17094 ip_addr_version (&ip) = IP4;
17095 }
17096 else
17097 if (unformat (input, "%U", unformat_ip6_address, &ip_addr_v6 (&ip)))
17098 {
17099 is_add = 1;
17100 ip_addr_version (&ip) = IP6;
17101 }
17102 else
17103 {
17104 errmsg ("parse error '%U'", format_unformat_error, input);
17105 return -99;
17106 }
17107 }
17108
17109 M (ONE_USE_PETR, mp);
17110
17111 mp->is_add = is_add;
17112 if (is_add)
17113 {
17114 mp->is_ip4 = ip_addr_version (&ip) == IP4 ? 1 : 0;
17115 if (mp->is_ip4)
17116 clib_memcpy (mp->address, &ip, 4);
17117 else
17118 clib_memcpy (mp->address, &ip, 16);
17119 }
17120
17121 /* send */
17122 S (mp);
17123
17124 /* wait for reply */
17125 W (ret);
17126 return ret;
17127}
17128
17129#define api_lisp_use_petr api_one_use_petr
17130
17131static int
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020017132api_show_one_nsh_mapping (vat_main_t * vam)
17133{
17134 vl_api_show_one_use_petr_t *mp;
17135 int ret;
17136
17137 if (!vam->json_output)
17138 {
17139 print (vam->ofp, "%=20s", "local ONE NSH mapping:");
17140 }
17141
17142 M (SHOW_ONE_NSH_MAPPING, mp);
17143 /* send it... */
17144 S (mp);
17145
17146 /* Wait for a reply... */
17147 W (ret);
17148 return ret;
17149}
17150
17151static int
Filip Tehlar67a99f82017-03-10 13:18:02 +010017152api_show_one_use_petr (vat_main_t * vam)
17153{
17154 vl_api_show_one_use_petr_t *mp;
17155 int ret;
17156
17157 if (!vam->json_output)
17158 {
17159 print (vam->ofp, "%=20s", "Proxy-ETR status:");
17160 }
17161
17162 M (SHOW_ONE_USE_PETR, mp);
17163 /* send it... */
17164 S (mp);
17165
17166 /* Wait for a reply... */
17167 W (ret);
17168 return ret;
17169}
17170
17171#define api_show_lisp_use_petr api_show_one_use_petr
17172
Damjan Marion7cd468a2016-12-19 23:05:39 +010017173/**
17174 * Add/delete mapping between vni and vrf
17175 */
17176static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017177api_one_eid_table_add_del_map (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017178{
Damjan Marion7cd468a2016-12-19 23:05:39 +010017179 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010017180 vl_api_one_eid_table_add_del_map_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017181 u8 is_add = 1, vni_set = 0, vrf_set = 0, bd_index_set = 0;
17182 u32 vni, vrf, bd_index;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017183 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017184
17185 /* Parse args required to build the message */
17186 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17187 {
17188 if (unformat (input, "del"))
17189 is_add = 0;
17190 else if (unformat (input, "vrf %d", &vrf))
17191 vrf_set = 1;
17192 else if (unformat (input, "bd_index %d", &bd_index))
17193 bd_index_set = 1;
17194 else if (unformat (input, "vni %d", &vni))
17195 vni_set = 1;
17196 else
17197 break;
17198 }
17199
17200 if (!vni_set || (!vrf_set && !bd_index_set))
17201 {
17202 errmsg ("missing arguments!");
17203 return -99;
17204 }
17205
17206 if (vrf_set && bd_index_set)
17207 {
17208 errmsg ("error: both vrf and bd entered!");
17209 return -99;
17210 }
17211
Filip Tehlar694396d2017-02-17 14:29:11 +010017212 M (ONE_EID_TABLE_ADD_DEL_MAP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017213
17214 mp->is_add = is_add;
17215 mp->vni = htonl (vni);
17216 mp->dp_table = vrf_set ? htonl (vrf) : htonl (bd_index);
17217 mp->is_l2 = bd_index_set;
17218
17219 /* send */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017220 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017221
17222 /* wait for reply */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017223 W (ret);
17224 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017225}
17226
Filip Tehlar694396d2017-02-17 14:29:11 +010017227#define api_lisp_eid_table_add_del_map api_one_eid_table_add_del_map
17228
Damjan Marion7cd468a2016-12-19 23:05:39 +010017229uword
17230unformat_negative_mapping_action (unformat_input_t * input, va_list * args)
17231{
17232 u32 *action = va_arg (*args, u32 *);
17233 u8 *s = 0;
17234
17235 if (unformat (input, "%s", &s))
17236 {
17237 if (!strcmp ((char *) s, "no-action"))
17238 action[0] = 0;
17239 else if (!strcmp ((char *) s, "natively-forward"))
17240 action[0] = 1;
17241 else if (!strcmp ((char *) s, "send-map-request"))
17242 action[0] = 2;
17243 else if (!strcmp ((char *) s, "drop"))
17244 action[0] = 3;
17245 else
17246 {
17247 clib_warning ("invalid action: '%s'", s);
17248 action[0] = 3;
17249 }
17250 }
17251 else
17252 return 0;
17253
17254 vec_free (s);
17255 return 1;
17256}
17257
17258/**
Filip Tehlar694396d2017-02-17 14:29:11 +010017259 * Add/del remote mapping to/from ONE control plane
Damjan Marion7cd468a2016-12-19 23:05:39 +010017260 *
17261 * @param vam vpp API test context
17262 * @return return code
17263 */
17264static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017265api_one_add_del_remote_mapping (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017266{
17267 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010017268 vl_api_one_add_del_remote_mapping_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017269 u32 vni = 0;
17270 lisp_eid_vat_t _eid, *eid = &_eid;
17271 lisp_eid_vat_t _seid, *seid = &_seid;
17272 u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0;
17273 u32 action = ~0, p, w, data_len;
17274 ip4_address_t rloc4;
17275 ip6_address_t rloc6;
Filip Tehlar05a057b2017-02-01 08:50:31 +010017276 vl_api_remote_locator_t *rlocs = 0, rloc, *curr_rloc = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017277 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017278
Dave Barachb7b92992018-10-17 10:38:51 -040017279 clib_memset (&rloc, 0, sizeof (rloc));
Damjan Marion7cd468a2016-12-19 23:05:39 +010017280
17281 /* Parse args required to build the message */
17282 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17283 {
17284 if (unformat (input, "del-all"))
17285 {
17286 del_all = 1;
17287 }
17288 else if (unformat (input, "del"))
17289 {
17290 is_add = 0;
17291 }
17292 else if (unformat (input, "add"))
17293 {
17294 is_add = 1;
17295 }
17296 else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid))
17297 {
17298 eid_set = 1;
17299 }
17300 else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid))
17301 {
17302 seid_set = 1;
17303 }
17304 else if (unformat (input, "vni %d", &vni))
17305 {
17306 ;
17307 }
17308 else if (unformat (input, "p %d w %d", &p, &w))
17309 {
17310 if (!curr_rloc)
17311 {
17312 errmsg ("No RLOC configured for setting priority/weight!");
17313 return -99;
17314 }
17315 curr_rloc->priority = p;
17316 curr_rloc->weight = w;
17317 }
17318 else if (unformat (input, "rloc %U", unformat_ip4_address, &rloc4))
17319 {
17320 rloc.is_ip4 = 1;
17321 clib_memcpy (&rloc.addr, &rloc4, sizeof (rloc4));
17322 vec_add1 (rlocs, rloc);
17323 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17324 }
17325 else if (unformat (input, "rloc %U", unformat_ip6_address, &rloc6))
17326 {
17327 rloc.is_ip4 = 0;
17328 clib_memcpy (&rloc.addr, &rloc6, sizeof (rloc6));
17329 vec_add1 (rlocs, rloc);
17330 curr_rloc = &rlocs[vec_len (rlocs) - 1];
17331 }
17332 else if (unformat (input, "action %U",
17333 unformat_negative_mapping_action, &action))
17334 {
17335 ;
17336 }
17337 else
17338 {
17339 clib_warning ("parse error '%U'", format_unformat_error, input);
17340 return -99;
17341 }
17342 }
17343
17344 if (0 == eid_set)
17345 {
17346 errmsg ("missing params!");
17347 return -99;
17348 }
17349
17350 if (is_add && (~0 == action) && 0 == vec_len (rlocs))
17351 {
17352 errmsg ("no action set for negative map-reply!");
17353 return -99;
17354 }
17355
Filip Tehlar05a057b2017-02-01 08:50:31 +010017356 data_len = vec_len (rlocs) * sizeof (vl_api_remote_locator_t);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017357
Filip Tehlar694396d2017-02-17 14:29:11 +010017358 M2 (ONE_ADD_DEL_REMOTE_MAPPING, mp, data_len);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017359 mp->is_add = is_add;
17360 mp->vni = htonl (vni);
17361 mp->action = (u8) action;
17362 mp->is_src_dst = seid_set;
17363 mp->eid_len = eid->len;
17364 mp->seid_len = seid->len;
17365 mp->del_all = del_all;
17366 mp->eid_type = eid->type;
17367 lisp_eid_put_vat (mp->eid, eid->addr, eid->type);
17368 lisp_eid_put_vat (mp->seid, seid->addr, seid->type);
17369
17370 mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs));
17371 clib_memcpy (mp->rlocs, rlocs, data_len);
17372 vec_free (rlocs);
17373
17374 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017375 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017376
17377 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017378 W (ret);
17379 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017380}
17381
Filip Tehlar694396d2017-02-17 14:29:11 +010017382#define api_lisp_add_del_remote_mapping api_one_add_del_remote_mapping
17383
Damjan Marion7cd468a2016-12-19 23:05:39 +010017384/**
Filip Tehlar694396d2017-02-17 14:29:11 +010017385 * Add/del ONE adjacency. Saves mapping in ONE control plane and updates
Damjan Marion7cd468a2016-12-19 23:05:39 +010017386 * forwarding entries in data-plane accordingly.
17387 *
17388 * @param vam vpp API test context
17389 * @return return code
17390 */
17391static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017392api_one_add_del_adjacency (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017393{
17394 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010017395 vl_api_one_add_del_adjacency_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017396 u32 vni = 0;
17397 ip4_address_t leid4, reid4;
17398 ip6_address_t leid6, reid6;
17399 u8 reid_mac[6] = { 0 };
17400 u8 leid_mac[6] = { 0 };
17401 u8 reid_type, leid_type;
17402 u32 leid_len = 0, reid_len = 0, len;
17403 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017404 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017405
17406 leid_type = reid_type = (u8) ~ 0;
17407
17408 /* Parse args required to build the message */
17409 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17410 {
17411 if (unformat (input, "del"))
17412 {
17413 is_add = 0;
17414 }
17415 else if (unformat (input, "add"))
17416 {
17417 is_add = 1;
17418 }
17419 else if (unformat (input, "reid %U/%d", unformat_ip4_address,
17420 &reid4, &len))
17421 {
17422 reid_type = 0; /* ipv4 */
17423 reid_len = len;
17424 }
17425 else if (unformat (input, "reid %U/%d", unformat_ip6_address,
17426 &reid6, &len))
17427 {
17428 reid_type = 1; /* ipv6 */
17429 reid_len = len;
17430 }
17431 else if (unformat (input, "reid %U", unformat_ethernet_address,
17432 reid_mac))
17433 {
17434 reid_type = 2; /* mac */
17435 }
17436 else if (unformat (input, "leid %U/%d", unformat_ip4_address,
17437 &leid4, &len))
17438 {
17439 leid_type = 0; /* ipv4 */
17440 leid_len = len;
17441 }
17442 else if (unformat (input, "leid %U/%d", unformat_ip6_address,
17443 &leid6, &len))
17444 {
17445 leid_type = 1; /* ipv6 */
17446 leid_len = len;
17447 }
17448 else if (unformat (input, "leid %U", unformat_ethernet_address,
17449 leid_mac))
17450 {
17451 leid_type = 2; /* mac */
17452 }
17453 else if (unformat (input, "vni %d", &vni))
17454 {
17455 ;
17456 }
17457 else
17458 {
17459 errmsg ("parse error '%U'", format_unformat_error, input);
17460 return -99;
17461 }
17462 }
17463
17464 if ((u8) ~ 0 == reid_type)
17465 {
17466 errmsg ("missing params!");
17467 return -99;
17468 }
17469
17470 if (leid_type != reid_type)
17471 {
17472 errmsg ("remote and local EIDs are of different types!");
17473 return -99;
17474 }
17475
Filip Tehlar694396d2017-02-17 14:29:11 +010017476 M (ONE_ADD_DEL_ADJACENCY, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017477 mp->is_add = is_add;
17478 mp->vni = htonl (vni);
17479 mp->leid_len = leid_len;
17480 mp->reid_len = reid_len;
17481 mp->eid_type = reid_type;
17482
17483 switch (mp->eid_type)
17484 {
17485 case 0:
17486 clib_memcpy (mp->leid, &leid4, sizeof (leid4));
17487 clib_memcpy (mp->reid, &reid4, sizeof (reid4));
17488 break;
17489 case 1:
17490 clib_memcpy (mp->leid, &leid6, sizeof (leid6));
17491 clib_memcpy (mp->reid, &reid6, sizeof (reid6));
17492 break;
17493 case 2:
17494 clib_memcpy (mp->leid, leid_mac, 6);
17495 clib_memcpy (mp->reid, reid_mac, 6);
17496 break;
17497 default:
17498 errmsg ("unknown EID type %d!", mp->eid_type);
17499 return 0;
17500 }
17501
17502 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017503 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017504
17505 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017506 W (ret);
17507 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017508}
17509
Filip Tehlar694396d2017-02-17 14:29:11 +010017510#define api_lisp_add_del_adjacency api_one_add_del_adjacency
17511
Filip Tehlar3e7b56932017-02-21 18:28:34 +010017512uword
17513unformat_gpe_encap_mode (unformat_input_t * input, va_list * args)
17514{
17515 u32 *mode = va_arg (*args, u32 *);
17516
17517 if (unformat (input, "lisp"))
17518 *mode = 0;
17519 else if (unformat (input, "vxlan"))
17520 *mode = 1;
17521 else
17522 return 0;
17523
17524 return 1;
17525}
17526
17527static int
17528api_gpe_get_encap_mode (vat_main_t * vam)
17529{
17530 vl_api_gpe_get_encap_mode_t *mp;
17531 int ret;
17532
17533 /* Construct the API message */
17534 M (GPE_GET_ENCAP_MODE, mp);
17535
17536 /* send it... */
17537 S (mp);
17538
17539 /* Wait for a reply... */
17540 W (ret);
17541 return ret;
17542}
17543
17544static int
17545api_gpe_set_encap_mode (vat_main_t * vam)
17546{
17547 unformat_input_t *input = vam->input;
17548 vl_api_gpe_set_encap_mode_t *mp;
17549 int ret;
17550 u32 mode = 0;
17551
17552 /* Parse args required to build the message */
17553 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17554 {
17555 if (unformat (input, "%U", unformat_gpe_encap_mode, &mode))
17556 ;
17557 else
17558 break;
17559 }
17560
17561 /* Construct the API message */
17562 M (GPE_SET_ENCAP_MODE, mp);
17563
17564 mp->mode = mode;
17565
17566 /* send it... */
17567 S (mp);
17568
17569 /* Wait for a reply... */
17570 W (ret);
17571 return ret;
17572}
17573
Damjan Marion7cd468a2016-12-19 23:05:39 +010017574static int
17575api_lisp_gpe_add_del_iface (vat_main_t * vam)
17576{
17577 unformat_input_t *input = vam->input;
Filip Tehlar82786c42017-02-20 15:20:37 +010017578 vl_api_gpe_add_del_iface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017579 u8 action_set = 0, is_add = 1, is_l2 = 0, dp_table_set = 0, vni_set = 0;
17580 u32 dp_table = 0, vni = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017581 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017582
17583 /* Parse args required to build the message */
17584 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17585 {
17586 if (unformat (input, "up"))
17587 {
17588 action_set = 1;
17589 is_add = 1;
17590 }
17591 else if (unformat (input, "down"))
17592 {
17593 action_set = 1;
17594 is_add = 0;
17595 }
17596 else if (unformat (input, "table_id %d", &dp_table))
17597 {
17598 dp_table_set = 1;
17599 }
17600 else if (unformat (input, "bd_id %d", &dp_table))
17601 {
17602 dp_table_set = 1;
17603 is_l2 = 1;
17604 }
17605 else if (unformat (input, "vni %d", &vni))
17606 {
17607 vni_set = 1;
17608 }
17609 else
17610 break;
17611 }
17612
17613 if (action_set == 0)
17614 {
17615 errmsg ("Action not set");
17616 return -99;
17617 }
17618 if (dp_table_set == 0 || vni_set == 0)
17619 {
17620 errmsg ("vni and dp_table must be set");
17621 return -99;
17622 }
17623
17624 /* Construct the API message */
Filip Tehlar82786c42017-02-20 15:20:37 +010017625 M (GPE_ADD_DEL_IFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017626
17627 mp->is_add = is_add;
Florin Corasf53a8ad2017-06-15 15:07:32 -070017628 mp->dp_table = clib_host_to_net_u32 (dp_table);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017629 mp->is_l2 = is_l2;
Florin Corasf53a8ad2017-06-15 15:07:32 -070017630 mp->vni = clib_host_to_net_u32 (vni);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017631
17632 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017633 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017634
17635 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017636 W (ret);
17637 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017638}
17639
Filip Tehlar1e553a02017-08-02 12:45:07 +020017640static int
Filip Tehlar7048ff12017-07-27 08:09:14 +020017641api_one_map_register_fallback_threshold (vat_main_t * vam)
17642{
17643 unformat_input_t *input = vam->input;
17644 vl_api_one_map_register_fallback_threshold_t *mp;
17645 u32 value = 0;
17646 u8 is_set = 0;
17647 int ret;
17648
17649 /* Parse args required to build the message */
17650 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17651 {
17652 if (unformat (input, "%u", &value))
17653 is_set = 1;
17654 else
17655 {
17656 clib_warning ("parse error '%U'", format_unformat_error, input);
17657 return -99;
17658 }
17659 }
17660
17661 if (!is_set)
17662 {
17663 errmsg ("fallback threshold value is missing!");
17664 return -99;
17665 }
17666
17667 M (ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17668 mp->value = clib_host_to_net_u32 (value);
17669
17670 /* send it... */
17671 S (mp);
17672
17673 /* Wait for a reply... */
17674 W (ret);
17675 return ret;
17676}
17677
17678static int
17679api_show_one_map_register_fallback_threshold (vat_main_t * vam)
17680{
17681 vl_api_show_one_map_register_fallback_threshold_t *mp;
17682 int ret;
17683
17684 M (SHOW_ONE_MAP_REGISTER_FALLBACK_THRESHOLD, mp);
17685
17686 /* send it... */
17687 S (mp);
17688
17689 /* Wait for a reply... */
17690 W (ret);
17691 return ret;
17692}
17693
Filip Tehlara4980b82017-09-27 14:32:02 +020017694uword
17695unformat_lisp_transport_protocol (unformat_input_t * input, va_list * args)
17696{
17697 u32 *proto = va_arg (*args, u32 *);
17698
17699 if (unformat (input, "udp"))
17700 *proto = 1;
17701 else if (unformat (input, "api"))
17702 *proto = 2;
17703 else
17704 return 0;
17705
17706 return 1;
17707}
17708
17709static int
17710api_one_set_transport_protocol (vat_main_t * vam)
17711{
17712 unformat_input_t *input = vam->input;
17713 vl_api_one_set_transport_protocol_t *mp;
17714 u8 is_set = 0;
17715 u32 protocol = 0;
17716 int ret;
17717
17718 /* Parse args required to build the message */
17719 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17720 {
17721 if (unformat (input, "%U", unformat_lisp_transport_protocol, &protocol))
17722 is_set = 1;
17723 else
17724 {
17725 clib_warning ("parse error '%U'", format_unformat_error, input);
17726 return -99;
17727 }
17728 }
17729
17730 if (!is_set)
17731 {
17732 errmsg ("Transport protocol missing!");
17733 return -99;
17734 }
17735
17736 M (ONE_SET_TRANSPORT_PROTOCOL, mp);
17737 mp->protocol = (u8) protocol;
17738
17739 /* send it... */
17740 S (mp);
17741
17742 /* Wait for a reply... */
17743 W (ret);
17744 return ret;
17745}
17746
17747static int
17748api_one_get_transport_protocol (vat_main_t * vam)
17749{
17750 vl_api_one_get_transport_protocol_t *mp;
17751 int ret;
17752
17753 M (ONE_GET_TRANSPORT_PROTOCOL, mp);
17754
17755 /* send it... */
17756 S (mp);
17757
17758 /* Wait for a reply... */
17759 W (ret);
17760 return ret;
17761}
17762
Filip Tehlar7048ff12017-07-27 08:09:14 +020017763static int
Filip Tehlar1e553a02017-08-02 12:45:07 +020017764api_one_map_register_set_ttl (vat_main_t * vam)
17765{
17766 unformat_input_t *input = vam->input;
17767 vl_api_one_map_register_set_ttl_t *mp;
17768 u32 ttl = 0;
17769 u8 is_set = 0;
17770 int ret;
17771
17772 /* Parse args required to build the message */
17773 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17774 {
17775 if (unformat (input, "%u", &ttl))
17776 is_set = 1;
17777 else
17778 {
17779 clib_warning ("parse error '%U'", format_unformat_error, input);
17780 return -99;
17781 }
17782 }
17783
17784 if (!is_set)
17785 {
17786 errmsg ("TTL value missing!");
17787 return -99;
17788 }
17789
17790 M (ONE_MAP_REGISTER_SET_TTL, mp);
17791 mp->ttl = clib_host_to_net_u32 (ttl);
17792
17793 /* send it... */
17794 S (mp);
17795
17796 /* Wait for a reply... */
17797 W (ret);
17798 return ret;
17799}
17800
17801static int
17802api_show_one_map_register_ttl (vat_main_t * vam)
17803{
17804 vl_api_show_one_map_register_ttl_t *mp;
17805 int ret;
17806
17807 M (SHOW_ONE_MAP_REGISTER_TTL, mp);
17808
17809 /* send it... */
17810 S (mp);
17811
17812 /* Wait for a reply... */
17813 W (ret);
17814 return ret;
17815}
17816
Damjan Marion7cd468a2016-12-19 23:05:39 +010017817/**
Filip Tehlar694396d2017-02-17 14:29:11 +010017818 * Add/del map request itr rlocs from ONE control plane and updates
Damjan Marion7cd468a2016-12-19 23:05:39 +010017819 *
17820 * @param vam vpp API test context
17821 * @return return code
17822 */
17823static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017824api_one_add_del_map_request_itr_rlocs (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017825{
17826 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010017827 vl_api_one_add_del_map_request_itr_rlocs_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017828 u8 *locator_set_name = 0;
17829 u8 locator_set_name_set = 0;
17830 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017831 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017832
17833 /* Parse args required to build the message */
17834 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17835 {
17836 if (unformat (input, "del"))
17837 {
17838 is_add = 0;
17839 }
17840 else if (unformat (input, "%_%v%_", &locator_set_name))
17841 {
17842 locator_set_name_set = 1;
17843 }
17844 else
17845 {
17846 clib_warning ("parse error '%U'", format_unformat_error, input);
17847 return -99;
17848 }
17849 }
17850
17851 if (is_add && !locator_set_name_set)
17852 {
17853 errmsg ("itr-rloc is not set!");
17854 return -99;
17855 }
17856
17857 if (is_add && vec_len (locator_set_name) > 64)
17858 {
17859 errmsg ("itr-rloc locator-set name too long");
17860 vec_free (locator_set_name);
17861 return -99;
17862 }
17863
Filip Tehlar694396d2017-02-17 14:29:11 +010017864 M (ONE_ADD_DEL_MAP_REQUEST_ITR_RLOCS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017865 mp->is_add = is_add;
17866 if (is_add)
17867 {
17868 clib_memcpy (mp->locator_set_name, locator_set_name,
17869 vec_len (locator_set_name));
17870 }
17871 else
17872 {
Dave Barachb7b92992018-10-17 10:38:51 -040017873 clib_memset (mp->locator_set_name, 0, sizeof (mp->locator_set_name));
Damjan Marion7cd468a2016-12-19 23:05:39 +010017874 }
17875 vec_free (locator_set_name);
17876
17877 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017878 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017879
17880 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017881 W (ret);
17882 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017883}
17884
Filip Tehlar694396d2017-02-17 14:29:11 +010017885#define api_lisp_add_del_map_request_itr_rlocs api_one_add_del_map_request_itr_rlocs
17886
Damjan Marion7cd468a2016-12-19 23:05:39 +010017887static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017888api_one_locator_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017889{
17890 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010017891 vl_api_one_locator_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060017892 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017893 u8 is_index_set = 0, is_name_set = 0;
17894 u8 *ls_name = 0;
17895 u32 ls_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017896 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017897
17898 /* Parse args required to build the message */
17899 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17900 {
17901 if (unformat (input, "ls_name %_%v%_", &ls_name))
17902 {
17903 is_name_set = 1;
17904 }
17905 else if (unformat (input, "ls_index %d", &ls_index))
17906 {
17907 is_index_set = 1;
17908 }
17909 else
17910 {
17911 errmsg ("parse error '%U'", format_unformat_error, input);
17912 return -99;
17913 }
17914 }
17915
17916 if (!is_index_set && !is_name_set)
17917 {
17918 errmsg ("error: expected one of index or name!");
17919 return -99;
17920 }
17921
17922 if (is_index_set && is_name_set)
17923 {
17924 errmsg ("error: only one param expected!");
17925 return -99;
17926 }
17927
17928 if (vec_len (ls_name) > 62)
17929 {
17930 errmsg ("error: locator set name too long!");
17931 return -99;
17932 }
17933
17934 if (!vam->json_output)
17935 {
17936 print (vam->ofp, "%=16s%=16s%=16s", "locator", "priority", "weight");
17937 }
17938
Filip Tehlar694396d2017-02-17 14:29:11 +010017939 M (ONE_LOCATOR_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017940 mp->is_index_set = is_index_set;
17941
17942 if (is_index_set)
17943 mp->ls_index = clib_host_to_net_u32 (ls_index);
17944 else
17945 {
17946 vec_add1 (ls_name, 0);
17947 strncpy ((char *) mp->ls_name, (char *) ls_name,
17948 sizeof (mp->ls_name) - 1);
17949 }
17950
17951 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060017952 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017953
17954 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040017955 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060017956 S (mp_ping);
17957
Damjan Marion7cd468a2016-12-19 23:05:39 +010017958 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060017959 W (ret);
17960 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017961}
17962
Filip Tehlar694396d2017-02-17 14:29:11 +010017963#define api_lisp_locator_dump api_one_locator_dump
17964
Damjan Marion7cd468a2016-12-19 23:05:39 +010017965static int
Filip Tehlar694396d2017-02-17 14:29:11 +010017966api_one_locator_set_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010017967{
Filip Tehlar694396d2017-02-17 14:29:11 +010017968 vl_api_one_locator_set_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060017969 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017970 unformat_input_t *input = vam->input;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017971 u8 filter = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060017972 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010017973
17974 /* Parse args required to build the message */
17975 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
17976 {
17977 if (unformat (input, "local"))
17978 {
17979 filter = 1;
17980 }
17981 else if (unformat (input, "remote"))
17982 {
17983 filter = 2;
17984 }
17985 else
17986 {
17987 errmsg ("parse error '%U'", format_unformat_error, input);
17988 return -99;
17989 }
17990 }
17991
17992 if (!vam->json_output)
17993 {
17994 print (vam->ofp, "%=10s%=15s", "ls_index", "ls_name");
17995 }
17996
Filip Tehlar694396d2017-02-17 14:29:11 +010017997 M (ONE_LOCATOR_SET_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010017998
17999 mp->filter = filter;
18000
18001 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018002 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018003
18004 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018005 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018006 S (mp_ping);
18007
Damjan Marion7cd468a2016-12-19 23:05:39 +010018008 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018009 W (ret);
18010 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018011}
18012
Filip Tehlar694396d2017-02-17 14:29:11 +010018013#define api_lisp_locator_set_dump api_one_locator_set_dump
18014
Damjan Marion7cd468a2016-12-19 23:05:39 +010018015static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018016api_one_eid_table_map_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018017{
18018 u8 is_l2 = 0;
18019 u8 mode_set = 0;
18020 unformat_input_t *input = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010018021 vl_api_one_eid_table_map_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018022 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018023 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018024
18025 /* Parse args required to build the message */
18026 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
18027 {
18028 if (unformat (input, "l2"))
18029 {
18030 is_l2 = 1;
18031 mode_set = 1;
18032 }
18033 else if (unformat (input, "l3"))
18034 {
18035 is_l2 = 0;
18036 mode_set = 1;
18037 }
18038 else
18039 {
18040 errmsg ("parse error '%U'", format_unformat_error, input);
18041 return -99;
18042 }
18043 }
18044
18045 if (!mode_set)
18046 {
18047 errmsg ("expected one of 'l2' or 'l3' parameter!");
18048 return -99;
18049 }
18050
18051 if (!vam->json_output)
18052 {
18053 print (vam->ofp, "%=10s%=10s", "VNI", is_l2 ? "BD" : "VRF");
18054 }
18055
Filip Tehlar694396d2017-02-17 14:29:11 +010018056 M (ONE_EID_TABLE_MAP_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018057 mp->is_l2 = is_l2;
18058
18059 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018060 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018061
18062 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018063 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018064 S (mp_ping);
18065
Damjan Marion7cd468a2016-12-19 23:05:39 +010018066 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018067 W (ret);
18068 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018069}
18070
Filip Tehlar694396d2017-02-17 14:29:11 +010018071#define api_lisp_eid_table_map_dump api_one_eid_table_map_dump
18072
Damjan Marion7cd468a2016-12-19 23:05:39 +010018073static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018074api_one_eid_table_vni_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018075{
Filip Tehlar694396d2017-02-17 14:29:11 +010018076 vl_api_one_eid_table_vni_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018077 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018078 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018079
18080 if (!vam->json_output)
18081 {
18082 print (vam->ofp, "VNI");
18083 }
18084
Filip Tehlar694396d2017-02-17 14:29:11 +010018085 M (ONE_EID_TABLE_VNI_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018086
18087 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018088 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018089
18090 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018091 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018092 S (mp_ping);
18093
Damjan Marion7cd468a2016-12-19 23:05:39 +010018094 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018095 W (ret);
18096 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018097}
18098
Filip Tehlar694396d2017-02-17 14:29:11 +010018099#define api_lisp_eid_table_vni_dump api_one_eid_table_vni_dump
18100
Damjan Marion7cd468a2016-12-19 23:05:39 +010018101static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018102api_one_eid_table_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018103{
18104 unformat_input_t *i = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010018105 vl_api_one_eid_table_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018106 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018107 struct in_addr ip4;
18108 struct in6_addr ip6;
18109 u8 mac[6];
18110 u8 eid_type = ~0, eid_set = 0;
18111 u32 prefix_length = ~0, t, vni = 0;
18112 u8 filter = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018113 int ret;
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020018114 lisp_nsh_api_t nsh;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018115
18116 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18117 {
18118 if (unformat (i, "eid %U/%d", unformat_ip4_address, &ip4, &t))
18119 {
18120 eid_set = 1;
18121 eid_type = 0;
18122 prefix_length = t;
18123 }
18124 else if (unformat (i, "eid %U/%d", unformat_ip6_address, &ip6, &t))
18125 {
18126 eid_set = 1;
18127 eid_type = 1;
18128 prefix_length = t;
18129 }
18130 else if (unformat (i, "eid %U", unformat_ethernet_address, mac))
18131 {
18132 eid_set = 1;
18133 eid_type = 2;
18134 }
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020018135 else if (unformat (i, "eid %U", unformat_nsh_address, &nsh))
18136 {
18137 eid_set = 1;
18138 eid_type = 3;
18139 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010018140 else if (unformat (i, "vni %d", &t))
18141 {
18142 vni = t;
18143 }
18144 else if (unformat (i, "local"))
18145 {
18146 filter = 1;
18147 }
18148 else if (unformat (i, "remote"))
18149 {
18150 filter = 2;
18151 }
18152 else
18153 {
18154 errmsg ("parse error '%U'", format_unformat_error, i);
18155 return -99;
18156 }
18157 }
18158
18159 if (!vam->json_output)
18160 {
18161 print (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s", "EID",
18162 "type", "ls_index", "ttl", "authoritative", "key_id", "key");
18163 }
18164
Filip Tehlar694396d2017-02-17 14:29:11 +010018165 M (ONE_EID_TABLE_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018166
18167 mp->filter = filter;
18168 if (eid_set)
18169 {
18170 mp->eid_set = 1;
18171 mp->vni = htonl (vni);
18172 mp->eid_type = eid_type;
18173 switch (eid_type)
18174 {
18175 case 0:
18176 mp->prefix_length = prefix_length;
18177 clib_memcpy (mp->eid, &ip4, sizeof (ip4));
18178 break;
18179 case 1:
18180 mp->prefix_length = prefix_length;
18181 clib_memcpy (mp->eid, &ip6, sizeof (ip6));
18182 break;
18183 case 2:
18184 clib_memcpy (mp->eid, mac, sizeof (mac));
18185 break;
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020018186 case 3:
18187 clib_memcpy (mp->eid, &nsh, sizeof (nsh));
18188 break;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018189 default:
18190 errmsg ("unknown EID type %d!", eid_type);
18191 return -99;
18192 }
18193 }
18194
18195 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018196 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018197
18198 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018199 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018200 S (mp_ping);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018201
18202 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018203 W (ret);
18204 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018205}
18206
Filip Tehlar694396d2017-02-17 14:29:11 +010018207#define api_lisp_eid_table_dump api_one_eid_table_dump
18208
Damjan Marion7cd468a2016-12-19 23:05:39 +010018209static int
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018210api_lisp_gpe_fwd_entries_get (vat_main_t * vam)
18211{
18212 unformat_input_t *i = vam->input;
Filip Tehlar82786c42017-02-20 15:20:37 +010018213 vl_api_gpe_fwd_entries_get_t *mp;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018214 u8 vni_set = 0;
18215 u32 vni = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018216 int ret;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018217
18218 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18219 {
18220 if (unformat (i, "vni %d", &vni))
18221 {
18222 vni_set = 1;
18223 }
18224 else
18225 {
18226 errmsg ("parse error '%U'", format_unformat_error, i);
18227 return -99;
18228 }
18229 }
18230
18231 if (!vni_set)
18232 {
18233 errmsg ("vni not set!");
18234 return -99;
18235 }
18236
18237 if (!vam->json_output)
18238 {
18239 print (vam->ofp, "%10s %10s %s %40s", "fwd_index", "dp_table",
18240 "leid", "reid");
18241 }
18242
Filip Tehlar82786c42017-02-20 15:20:37 +010018243 M (GPE_FWD_ENTRIES_GET, mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018244 mp->vni = clib_host_to_net_u32 (vni);
18245
18246 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018247 S (mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018248
18249 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018250 W (ret);
18251 return ret;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018252}
18253
Filip Tehlarb4243aa2017-06-14 14:39:42 +020018254#define vl_api_gpe_native_fwd_rpaths_get_reply_t_endian vl_noop_handler
18255#define vl_api_gpe_native_fwd_rpaths_get_reply_t_print vl_noop_handler
Filip Tehlar0eb874e2017-05-18 14:23:32 +020018256#define vl_api_gpe_fwd_entry_vnis_get_reply_t_endian vl_noop_handler
18257#define vl_api_gpe_fwd_entry_vnis_get_reply_t_print vl_noop_handler
Filip Tehlar82786c42017-02-20 15:20:37 +010018258#define vl_api_gpe_fwd_entries_get_reply_t_endian vl_noop_handler
18259#define vl_api_gpe_fwd_entries_get_reply_t_print vl_noop_handler
18260#define vl_api_gpe_fwd_entry_path_details_t_endian vl_noop_handler
18261#define vl_api_gpe_fwd_entry_path_details_t_print vl_noop_handler
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018262
18263static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018264api_one_adjacencies_get (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018265{
18266 unformat_input_t *i = vam->input;
Filip Tehlar694396d2017-02-17 14:29:11 +010018267 vl_api_one_adjacencies_get_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018268 u8 vni_set = 0;
18269 u32 vni = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018270 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018271
18272 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18273 {
18274 if (unformat (i, "vni %d", &vni))
18275 {
18276 vni_set = 1;
18277 }
18278 else
18279 {
18280 errmsg ("parse error '%U'", format_unformat_error, i);
18281 return -99;
18282 }
18283 }
18284
18285 if (!vni_set)
18286 {
18287 errmsg ("vni not set!");
18288 return -99;
18289 }
18290
18291 if (!vam->json_output)
18292 {
18293 print (vam->ofp, "%s %40s", "leid", "reid");
18294 }
18295
Filip Tehlar694396d2017-02-17 14:29:11 +010018296 M (ONE_ADJACENCIES_GET, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018297 mp->vni = clib_host_to_net_u32 (vni);
18298
18299 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018300 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018301
18302 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018303 W (ret);
18304 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018305}
18306
Filip Tehlar694396d2017-02-17 14:29:11 +010018307#define api_lisp_adjacencies_get api_one_adjacencies_get
18308
Damjan Marion7cd468a2016-12-19 23:05:39 +010018309static int
Filip Tehlarb4243aa2017-06-14 14:39:42 +020018310api_gpe_native_fwd_rpaths_get (vat_main_t * vam)
18311{
18312 unformat_input_t *i = vam->input;
18313 vl_api_gpe_native_fwd_rpaths_get_t *mp;
18314 int ret;
18315 u8 ip_family_set = 0, is_ip4 = 1;
18316
18317 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18318 {
18319 if (unformat (i, "ip4"))
18320 {
18321 ip_family_set = 1;
18322 is_ip4 = 1;
18323 }
18324 else if (unformat (i, "ip6"))
18325 {
18326 ip_family_set = 1;
18327 is_ip4 = 0;
18328 }
18329 else
18330 {
18331 errmsg ("parse error '%U'", format_unformat_error, i);
18332 return -99;
18333 }
18334 }
18335
18336 if (!ip_family_set)
18337 {
18338 errmsg ("ip family not set!");
18339 return -99;
18340 }
18341
18342 M (GPE_NATIVE_FWD_RPATHS_GET, mp);
18343 mp->is_ip4 = is_ip4;
18344
18345 /* send it... */
18346 S (mp);
18347
18348 /* Wait for a reply... */
18349 W (ret);
18350 return ret;
18351}
18352
18353static int
Filip Tehlar0eb874e2017-05-18 14:23:32 +020018354api_gpe_fwd_entry_vnis_get (vat_main_t * vam)
18355{
18356 vl_api_gpe_fwd_entry_vnis_get_t *mp;
18357 int ret;
18358
18359 if (!vam->json_output)
18360 {
18361 print (vam->ofp, "VNIs");
18362 }
18363
18364 M (GPE_FWD_ENTRY_VNIS_GET, mp);
18365
18366 /* send it... */
18367 S (mp);
18368
18369 /* Wait for a reply... */
18370 W (ret);
18371 return ret;
18372}
18373
18374static int
Filip Tehlarb4243aa2017-06-14 14:39:42 +020018375api_gpe_add_del_native_fwd_rpath (vat_main_t * vam)
18376{
18377 unformat_input_t *i = vam->input;
18378 vl_api_gpe_add_del_native_fwd_rpath_t *mp;
18379 int ret = 0;
18380 u8 is_add = 1, ip_set = 0, is_ip4 = 1;
18381 struct in_addr ip4;
18382 struct in6_addr ip6;
18383 u32 table_id = 0, nh_sw_if_index = ~0;
18384
Dave Barachb7b92992018-10-17 10:38:51 -040018385 clib_memset (&ip4, 0, sizeof (ip4));
18386 clib_memset (&ip6, 0, sizeof (ip6));
Filip Tehlarb4243aa2017-06-14 14:39:42 +020018387
18388 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18389 {
18390 if (unformat (i, "del"))
18391 is_add = 0;
18392 else if (unformat (i, "via %U %U", unformat_ip4_address, &ip4,
18393 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18394 {
18395 ip_set = 1;
18396 is_ip4 = 1;
18397 }
18398 else if (unformat (i, "via %U %U", unformat_ip6_address, &ip6,
18399 api_unformat_sw_if_index, vam, &nh_sw_if_index))
18400 {
18401 ip_set = 1;
18402 is_ip4 = 0;
18403 }
18404 else if (unformat (i, "via %U", unformat_ip4_address, &ip4))
18405 {
18406 ip_set = 1;
18407 is_ip4 = 1;
18408 nh_sw_if_index = ~0;
18409 }
18410 else if (unformat (i, "via %U", unformat_ip6_address, &ip6))
18411 {
18412 ip_set = 1;
18413 is_ip4 = 0;
18414 nh_sw_if_index = ~0;
18415 }
18416 else if (unformat (i, "table %d", &table_id))
18417 ;
18418 else
18419 {
18420 errmsg ("parse error '%U'", format_unformat_error, i);
18421 return -99;
18422 }
18423 }
18424
18425 if (!ip_set)
18426 {
18427 errmsg ("nh addr not set!");
18428 return -99;
18429 }
18430
18431 M (GPE_ADD_DEL_NATIVE_FWD_RPATH, mp);
18432 mp->is_add = is_add;
18433 mp->table_id = clib_host_to_net_u32 (table_id);
18434 mp->nh_sw_if_index = clib_host_to_net_u32 (nh_sw_if_index);
18435 mp->is_ip4 = is_ip4;
18436 if (is_ip4)
18437 clib_memcpy (mp->nh_addr, &ip4, sizeof (ip4));
18438 else
18439 clib_memcpy (mp->nh_addr, &ip6, sizeof (ip6));
18440
18441 /* send it... */
18442 S (mp);
18443
18444 /* Wait for a reply... */
18445 W (ret);
18446 return ret;
18447}
18448
18449static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018450api_one_map_server_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018451{
Filip Tehlar694396d2017-02-17 14:29:11 +010018452 vl_api_one_map_server_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018453 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018454 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018455
18456 if (!vam->json_output)
18457 {
18458 print (vam->ofp, "%=20s", "Map server");
18459 }
18460
Filip Tehlar694396d2017-02-17 14:29:11 +010018461 M (ONE_MAP_SERVER_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018462 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018463 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018464
18465 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018466 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018467 S (mp_ping);
18468
Damjan Marion7cd468a2016-12-19 23:05:39 +010018469 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018470 W (ret);
18471 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018472}
18473
Filip Tehlar694396d2017-02-17 14:29:11 +010018474#define api_lisp_map_server_dump api_one_map_server_dump
18475
Damjan Marion7cd468a2016-12-19 23:05:39 +010018476static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018477api_one_map_resolver_dump (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018478{
Filip Tehlar694396d2017-02-17 14:29:11 +010018479 vl_api_one_map_resolver_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018480 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018481 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018482
18483 if (!vam->json_output)
18484 {
18485 print (vam->ofp, "%=20s", "Map resolver");
18486 }
18487
Filip Tehlar694396d2017-02-17 14:29:11 +010018488 M (ONE_MAP_RESOLVER_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018489 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018490 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018491
18492 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018493 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018494 S (mp_ping);
18495
Damjan Marion7cd468a2016-12-19 23:05:39 +010018496 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018497 W (ret);
18498 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018499}
18500
Filip Tehlar694396d2017-02-17 14:29:11 +010018501#define api_lisp_map_resolver_dump api_one_map_resolver_dump
18502
Damjan Marion7cd468a2016-12-19 23:05:39 +010018503static int
Filip Tehlar21511912017-04-07 10:41:42 +020018504api_one_stats_flush (vat_main_t * vam)
18505{
18506 vl_api_one_stats_flush_t *mp;
18507 int ret = 0;
18508
18509 M (ONE_STATS_FLUSH, mp);
18510 S (mp);
18511 W (ret);
18512 return ret;
18513}
18514
18515static int
Filip Tehlar4868ff62017-03-09 16:48:39 +010018516api_one_stats_dump (vat_main_t * vam)
18517{
18518 vl_api_one_stats_dump_t *mp;
18519 vl_api_control_ping_t *mp_ping;
18520 int ret;
18521
18522 M (ONE_STATS_DUMP, mp);
18523 /* send it... */
18524 S (mp);
18525
18526 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018527 MPING (CONTROL_PING, mp_ping);
Filip Tehlar4868ff62017-03-09 16:48:39 +010018528 S (mp_ping);
18529
18530 /* Wait for a reply... */
18531 W (ret);
18532 return ret;
18533}
18534
18535static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018536api_show_one_status (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018537{
Filip Tehlar694396d2017-02-17 14:29:11 +010018538 vl_api_show_one_status_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018539 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018540
18541 if (!vam->json_output)
18542 {
Filip Tehlar694396d2017-02-17 14:29:11 +010018543 print (vam->ofp, "%-20s%-16s", "ONE status", "locator-set");
Damjan Marion7cd468a2016-12-19 23:05:39 +010018544 }
18545
Filip Tehlar694396d2017-02-17 14:29:11 +010018546 M (SHOW_ONE_STATUS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018547 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018548 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018549 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018550 W (ret);
18551 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018552}
18553
Filip Tehlar694396d2017-02-17 14:29:11 +010018554#define api_show_lisp_status api_show_one_status
18555
Damjan Marion7cd468a2016-12-19 23:05:39 +010018556static int
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018557api_lisp_gpe_fwd_entry_path_dump (vat_main_t * vam)
18558{
Filip Tehlar82786c42017-02-20 15:20:37 +010018559 vl_api_gpe_fwd_entry_path_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018560 vl_api_control_ping_t *mp_ping;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018561 unformat_input_t *i = vam->input;
18562 u32 fwd_entry_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018563 int ret;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018564
18565 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18566 {
18567 if (unformat (i, "index %d", &fwd_entry_index))
18568 ;
18569 else
18570 break;
18571 }
18572
18573 if (~0 == fwd_entry_index)
18574 {
18575 errmsg ("no index specified!");
18576 return -99;
18577 }
18578
18579 if (!vam->json_output)
18580 {
18581 print (vam->ofp, "first line");
18582 }
18583
Filip Tehlar82786c42017-02-20 15:20:37 +010018584 M (GPE_FWD_ENTRY_PATH_DUMP, mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018585
18586 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018587 S (mp);
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018588 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018589 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018590 S (mp_ping);
18591
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018592 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018593 W (ret);
18594 return ret;
Filip Tehlar5fae99c2017-01-18 12:57:37 +010018595}
18596
18597static int
Filip Tehlar694396d2017-02-17 14:29:11 +010018598api_one_get_map_request_itr_rlocs (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010018599{
Filip Tehlar694396d2017-02-17 14:29:11 +010018600 vl_api_one_get_map_request_itr_rlocs_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018601 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018602
18603 if (!vam->json_output)
18604 {
18605 print (vam->ofp, "%=20s", "itr-rlocs:");
18606 }
18607
Filip Tehlar694396d2017-02-17 14:29:11 +010018608 M (ONE_GET_MAP_REQUEST_ITR_RLOCS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018609 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018610 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018611 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018612 W (ret);
18613 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018614}
18615
Filip Tehlar694396d2017-02-17 14:29:11 +010018616#define api_lisp_get_map_request_itr_rlocs api_one_get_map_request_itr_rlocs
18617
Damjan Marion7cd468a2016-12-19 23:05:39 +010018618static int
18619api_af_packet_create (vat_main_t * vam)
18620{
18621 unformat_input_t *i = vam->input;
18622 vl_api_af_packet_create_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018623 u8 *host_if_name = 0;
18624 u8 hw_addr[6];
18625 u8 random_hw_addr = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018626 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018627
Dave Barachb7b92992018-10-17 10:38:51 -040018628 clib_memset (hw_addr, 0, sizeof (hw_addr));
Damjan Marion7cd468a2016-12-19 23:05:39 +010018629
18630 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18631 {
18632 if (unformat (i, "name %s", &host_if_name))
18633 vec_add1 (host_if_name, 0);
18634 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
18635 random_hw_addr = 0;
18636 else
18637 break;
18638 }
18639
18640 if (!vec_len (host_if_name))
18641 {
18642 errmsg ("host-interface name must be specified");
18643 return -99;
18644 }
18645
18646 if (vec_len (host_if_name) > 64)
18647 {
18648 errmsg ("host-interface name too long");
18649 return -99;
18650 }
18651
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018652 M (AF_PACKET_CREATE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018653
18654 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18655 clib_memcpy (mp->hw_addr, hw_addr, 6);
18656 mp->use_random_hw_addr = random_hw_addr;
18657 vec_free (host_if_name);
18658
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018659 S (mp);
Dave Baracha1a093d2017-03-02 13:13:23 -050018660
18661 /* *INDENT-OFF* */
18662 W2 (ret,
18663 ({
18664 if (ret == 0)
18665 fprintf (vam->ofp ? vam->ofp : stderr,
18666 " new sw_if_index = %d\n", vam->sw_if_index);
18667 }));
18668 /* *INDENT-ON* */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018669 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018670}
18671
18672static int
18673api_af_packet_delete (vat_main_t * vam)
18674{
18675 unformat_input_t *i = vam->input;
18676 vl_api_af_packet_delete_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018677 u8 *host_if_name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018678 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018679
18680 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18681 {
18682 if (unformat (i, "name %s", &host_if_name))
18683 vec_add1 (host_if_name, 0);
18684 else
18685 break;
18686 }
18687
18688 if (!vec_len (host_if_name))
18689 {
18690 errmsg ("host-interface name must be specified");
18691 return -99;
18692 }
18693
18694 if (vec_len (host_if_name) > 64)
18695 {
18696 errmsg ("host-interface name too long");
18697 return -99;
18698 }
18699
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018700 M (AF_PACKET_DELETE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018701
18702 clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
18703 vec_free (host_if_name);
18704
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018705 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060018706 W (ret);
18707 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018708}
18709
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +020018710static void vl_api_af_packet_details_t_handler
18711 (vl_api_af_packet_details_t * mp)
18712{
18713 vat_main_t *vam = &vat_main;
18714
18715 print (vam->ofp, "%-16s %d",
18716 mp->host_if_name, clib_net_to_host_u32 (mp->sw_if_index));
18717}
18718
18719static void vl_api_af_packet_details_t_handler_json
18720 (vl_api_af_packet_details_t * mp)
18721{
18722 vat_main_t *vam = &vat_main;
18723 vat_json_node_t *node = NULL;
18724
18725 if (VAT_JSON_ARRAY != vam->json_tree.type)
18726 {
18727 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
18728 vat_json_init_array (&vam->json_tree);
18729 }
18730 node = vat_json_array_add (&vam->json_tree);
18731
18732 vat_json_init_object (node);
18733 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
18734 vat_json_object_add_string_copy (node, "dev_name", mp->host_if_name);
18735}
18736
18737static int
18738api_af_packet_dump (vat_main_t * vam)
18739{
18740 vl_api_af_packet_dump_t *mp;
18741 vl_api_control_ping_t *mp_ping;
18742 int ret;
18743
18744 print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index");
18745 /* Get list of tap interfaces */
18746 M (AF_PACKET_DUMP, mp);
18747 S (mp);
18748
18749 /* Use a control ping for synchronization */
18750 MPING (CONTROL_PING, mp_ping);
18751 S (mp_ping);
18752
18753 W (ret);
18754 return ret;
18755}
18756
Damjan Marion7cd468a2016-12-19 23:05:39 +010018757static int
18758api_policer_add_del (vat_main_t * vam)
18759{
18760 unformat_input_t *i = vam->input;
18761 vl_api_policer_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018762 u8 is_add = 1;
18763 u8 *name = 0;
18764 u32 cir = 0;
18765 u32 eir = 0;
18766 u64 cb = 0;
18767 u64 eb = 0;
18768 u8 rate_type = 0;
18769 u8 round_type = 0;
18770 u8 type = 0;
18771 u8 color_aware = 0;
18772 sse2_qos_pol_action_params_st conform_action, exceed_action, violate_action;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018773 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018774
18775 conform_action.action_type = SSE2_QOS_ACTION_TRANSMIT;
18776 conform_action.dscp = 0;
18777 exceed_action.action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
18778 exceed_action.dscp = 0;
18779 violate_action.action_type = SSE2_QOS_ACTION_DROP;
18780 violate_action.dscp = 0;
18781
18782 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18783 {
18784 if (unformat (i, "del"))
18785 is_add = 0;
18786 else if (unformat (i, "name %s", &name))
18787 vec_add1 (name, 0);
18788 else if (unformat (i, "cir %u", &cir))
18789 ;
18790 else if (unformat (i, "eir %u", &eir))
18791 ;
18792 else if (unformat (i, "cb %u", &cb))
18793 ;
18794 else if (unformat (i, "eb %u", &eb))
18795 ;
18796 else if (unformat (i, "rate_type %U", unformat_policer_rate_type,
18797 &rate_type))
18798 ;
18799 else if (unformat (i, "round_type %U", unformat_policer_round_type,
18800 &round_type))
18801 ;
18802 else if (unformat (i, "type %U", unformat_policer_type, &type))
18803 ;
18804 else if (unformat (i, "conform_action %U", unformat_policer_action_type,
18805 &conform_action))
18806 ;
18807 else if (unformat (i, "exceed_action %U", unformat_policer_action_type,
18808 &exceed_action))
18809 ;
18810 else if (unformat (i, "violate_action %U", unformat_policer_action_type,
18811 &violate_action))
18812 ;
18813 else if (unformat (i, "color-aware"))
18814 color_aware = 1;
18815 else
18816 break;
18817 }
18818
18819 if (!vec_len (name))
18820 {
18821 errmsg ("policer name must be specified");
18822 return -99;
18823 }
18824
18825 if (vec_len (name) > 64)
18826 {
18827 errmsg ("policer name too long");
18828 return -99;
18829 }
18830
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018831 M (POLICER_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018832
18833 clib_memcpy (mp->name, name, vec_len (name));
18834 vec_free (name);
18835 mp->is_add = is_add;
Neale Rannsd91c1db2017-07-31 02:30:50 -070018836 mp->cir = ntohl (cir);
18837 mp->eir = ntohl (eir);
18838 mp->cb = clib_net_to_host_u64 (cb);
18839 mp->eb = clib_net_to_host_u64 (eb);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018840 mp->rate_type = rate_type;
18841 mp->round_type = round_type;
18842 mp->type = type;
18843 mp->conform_action_type = conform_action.action_type;
18844 mp->conform_dscp = conform_action.dscp;
18845 mp->exceed_action_type = exceed_action.action_type;
18846 mp->exceed_dscp = exceed_action.dscp;
18847 mp->violate_action_type = violate_action.action_type;
18848 mp->violate_dscp = violate_action.dscp;
18849 mp->color_aware = color_aware;
18850
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018851 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060018852 W (ret);
18853 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018854}
18855
18856static int
18857api_policer_dump (vat_main_t * vam)
18858{
18859 unformat_input_t *i = vam->input;
18860 vl_api_policer_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018861 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018862 u8 *match_name = 0;
18863 u8 match_name_valid = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018864 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018865
18866 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18867 {
18868 if (unformat (i, "name %s", &match_name))
18869 {
18870 vec_add1 (match_name, 0);
18871 match_name_valid = 1;
18872 }
18873 else
18874 break;
18875 }
18876
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018877 M (POLICER_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018878 mp->match_name_valid = match_name_valid;
18879 clib_memcpy (mp->match_name, match_name, vec_len (match_name));
18880 vec_free (match_name);
18881 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018882 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018883
18884 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018885 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018886 S (mp_ping);
18887
Damjan Marion7cd468a2016-12-19 23:05:39 +010018888 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018889 W (ret);
18890 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018891}
18892
18893static int
18894api_policer_classify_set_interface (vat_main_t * vam)
18895{
18896 unformat_input_t *i = vam->input;
18897 vl_api_policer_classify_set_interface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018898 u32 sw_if_index;
18899 int sw_if_index_set;
18900 u32 ip4_table_index = ~0;
18901 u32 ip6_table_index = ~0;
18902 u32 l2_table_index = ~0;
18903 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018904 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018905
18906 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18907 {
18908 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
18909 sw_if_index_set = 1;
18910 else if (unformat (i, "sw_if_index %d", &sw_if_index))
18911 sw_if_index_set = 1;
18912 else if (unformat (i, "del"))
18913 is_add = 0;
18914 else if (unformat (i, "ip4-table %d", &ip4_table_index))
18915 ;
18916 else if (unformat (i, "ip6-table %d", &ip6_table_index))
18917 ;
18918 else if (unformat (i, "l2-table %d", &l2_table_index))
18919 ;
18920 else
18921 {
18922 clib_warning ("parse error '%U'", format_unformat_error, i);
18923 return -99;
18924 }
18925 }
18926
18927 if (sw_if_index_set == 0)
18928 {
18929 errmsg ("missing interface name or sw_if_index");
18930 return -99;
18931 }
18932
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018933 M (POLICER_CLASSIFY_SET_INTERFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018934
18935 mp->sw_if_index = ntohl (sw_if_index);
18936 mp->ip4_table_index = ntohl (ip4_table_index);
18937 mp->ip6_table_index = ntohl (ip6_table_index);
18938 mp->l2_table_index = ntohl (l2_table_index);
18939 mp->is_add = is_add;
18940
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018941 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060018942 W (ret);
18943 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018944}
18945
18946static int
18947api_policer_classify_dump (vat_main_t * vam)
18948{
18949 unformat_input_t *i = vam->input;
18950 vl_api_policer_classify_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018951 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018952 u8 type = POLICER_CLASSIFY_N_TABLES;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018953 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018954
18955 if (unformat (i, "type %U", unformat_policer_classify_table_type, &type))
18956 ;
18957 else
18958 {
18959 errmsg ("classify table type must be specified");
18960 return -99;
18961 }
18962
18963 if (!vam->json_output)
18964 {
18965 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
18966 }
18967
Jon Loeliger8a2aea32017-01-31 13:19:40 -060018968 M (POLICER_CLASSIFY_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018969 mp->type = type;
18970 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060018971 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010018972
18973 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040018974 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060018975 S (mp_ping);
18976
Damjan Marion7cd468a2016-12-19 23:05:39 +010018977 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060018978 W (ret);
18979 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018980}
18981
18982static int
18983api_netmap_create (vat_main_t * vam)
18984{
18985 unformat_input_t *i = vam->input;
18986 vl_api_netmap_create_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018987 u8 *if_name = 0;
18988 u8 hw_addr[6];
18989 u8 random_hw_addr = 1;
18990 u8 is_pipe = 0;
18991 u8 is_master = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060018992 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010018993
Dave Barachb7b92992018-10-17 10:38:51 -040018994 clib_memset (hw_addr, 0, sizeof (hw_addr));
Damjan Marion7cd468a2016-12-19 23:05:39 +010018995
18996 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
18997 {
18998 if (unformat (i, "name %s", &if_name))
18999 vec_add1 (if_name, 0);
19000 else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
19001 random_hw_addr = 0;
19002 else if (unformat (i, "pipe"))
19003 is_pipe = 1;
19004 else if (unformat (i, "master"))
19005 is_master = 1;
19006 else if (unformat (i, "slave"))
19007 is_master = 0;
19008 else
19009 break;
19010 }
19011
19012 if (!vec_len (if_name))
19013 {
19014 errmsg ("interface name must be specified");
19015 return -99;
19016 }
19017
19018 if (vec_len (if_name) > 64)
19019 {
19020 errmsg ("interface name too long");
19021 return -99;
19022 }
19023
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019024 M (NETMAP_CREATE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019025
19026 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19027 clib_memcpy (mp->hw_addr, hw_addr, 6);
19028 mp->use_random_hw_addr = random_hw_addr;
19029 mp->is_pipe = is_pipe;
19030 mp->is_master = is_master;
19031 vec_free (if_name);
19032
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019033 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019034 W (ret);
19035 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019036}
19037
19038static int
19039api_netmap_delete (vat_main_t * vam)
19040{
19041 unformat_input_t *i = vam->input;
19042 vl_api_netmap_delete_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019043 u8 *if_name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019044 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019045
19046 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19047 {
19048 if (unformat (i, "name %s", &if_name))
19049 vec_add1 (if_name, 0);
19050 else
19051 break;
19052 }
19053
19054 if (!vec_len (if_name))
19055 {
19056 errmsg ("interface name must be specified");
19057 return -99;
19058 }
19059
19060 if (vec_len (if_name) > 64)
19061 {
19062 errmsg ("interface name too long");
19063 return -99;
19064 }
19065
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019066 M (NETMAP_DELETE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019067
19068 clib_memcpy (mp->netmap_if_name, if_name, vec_len (if_name));
19069 vec_free (if_name);
19070
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019071 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019072 W (ret);
19073 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019074}
19075
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019076static void
Neale Ranns31ed7442018-02-23 05:29:09 -080019077vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019078{
19079 if (fp->afi == IP46_TYPE_IP6)
19080 print (vam->ofp,
19081 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19082 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
Neale Ranns44cea222018-12-04 09:39:40 +000019083 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019084 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19085 format_ip6_address, fp->next_hop);
19086 else if (fp->afi == IP46_TYPE_IP4)
19087 print (vam->ofp,
19088 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19089 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
Neale Ranns44cea222018-12-04 09:39:40 +000019090 fp->weight, ntohl (fp->sw_if_index), fp->is_local,
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019091 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19092 format_ip4_address, fp->next_hop);
19093}
19094
19095static void
19096vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
Neale Ranns31ed7442018-02-23 05:29:09 -080019097 vl_api_fib_path_t * fp)
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019098{
19099 struct in_addr ip4;
19100 struct in6_addr ip6;
19101
19102 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19103 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19104 vat_json_object_add_uint (node, "is_local", fp->is_local);
19105 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19106 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19107 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19108 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19109 if (fp->afi == IP46_TYPE_IP4)
19110 {
19111 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19112 vat_json_object_add_ip4 (node, "next_hop", ip4);
19113 }
19114 else if (fp->afi == IP46_TYPE_IP6)
19115 {
19116 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19117 vat_json_object_add_ip6 (node, "next_hop", ip6);
19118 }
19119}
19120
19121static void
19122vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +010019123{
19124 vat_main_t *vam = &vat_main;
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019125 int count = ntohl (mp->mt_count);
Neale Ranns31ed7442018-02-23 05:29:09 -080019126 vl_api_fib_path_t *fp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019127 i32 i;
19128
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019129 print (vam->ofp, "[%d]: sw_if_index %d via:",
19130 ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index));
19131 fp = mp->mt_paths;
19132 for (i = 0; i < count; i++)
Damjan Marion7cd468a2016-12-19 23:05:39 +010019133 {
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019134 vl_api_mpls_fib_path_print (vam, fp);
19135 fp++;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019136 }
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019137
Damjan Marion7cd468a2016-12-19 23:05:39 +010019138 print (vam->ofp, "");
19139}
19140
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019141#define vl_api_mpls_tunnel_details_t_endian vl_noop_handler
19142#define vl_api_mpls_tunnel_details_t_print vl_noop_handler
19143
19144static void
19145vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp)
Damjan Marion7cd468a2016-12-19 23:05:39 +010019146{
19147 vat_main_t *vam = &vat_main;
19148 vat_json_node_t *node = NULL;
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019149 int count = ntohl (mp->mt_count);
Neale Ranns31ed7442018-02-23 05:29:09 -080019150 vl_api_fib_path_t *fp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019151 i32 i;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019152
19153 if (VAT_JSON_ARRAY != vam->json_tree.type)
19154 {
19155 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19156 vat_json_init_array (&vam->json_tree);
19157 }
19158 node = vat_json_array_add (&vam->json_tree);
19159
19160 vat_json_init_object (node);
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019161 vat_json_object_add_uint (node, "tunnel_index",
19162 ntohl (mp->mt_tunnel_index));
19163 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index));
19164
19165 vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only);
19166
19167 fp = mp->mt_paths;
19168 for (i = 0; i < count; i++)
Damjan Marion7cd468a2016-12-19 23:05:39 +010019169 {
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019170 vl_api_mpls_fib_path_json_print (node, fp);
19171 fp++;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019172 }
19173}
19174
19175static int
19176api_mpls_tunnel_dump (vat_main_t * vam)
19177{
19178 vl_api_mpls_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019179 vl_api_control_ping_t *mp_ping;
Neale Rannsf5fa5ae2018-09-26 05:07:25 -070019180 u32 sw_if_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019181 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019182
19183 /* Parse args required to build the message */
19184 while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT)
19185 {
Neale Rannsf5fa5ae2018-09-26 05:07:25 -070019186 if (unformat (vam->input, "sw_if_index %d", &sw_if_index))
19187 ;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019188 }
19189
Neale Rannsf5fa5ae2018-09-26 05:07:25 -070019190 print (vam->ofp, " sw_if_index %d", sw_if_index);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019191
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019192 M (MPLS_TUNNEL_DUMP, mp);
Neale Rannsf5fa5ae2018-09-26 05:07:25 -070019193 mp->sw_if_index = htonl (sw_if_index);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019194 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019195
19196 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019197 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019198 S (mp_ping);
19199
Jon Loeliger56c7b012017-02-01 12:31:41 -060019200 W (ret);
19201 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019202}
19203
19204#define vl_api_mpls_fib_details_t_endian vl_noop_handler
19205#define vl_api_mpls_fib_details_t_print vl_noop_handler
19206
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019207
Damjan Marion7cd468a2016-12-19 23:05:39 +010019208static void
19209vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
19210{
19211 vat_main_t *vam = &vat_main;
19212 int count = ntohl (mp->count);
Neale Ranns31ed7442018-02-23 05:29:09 -080019213 vl_api_fib_path_t *fp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019214 int i;
19215
19216 print (vam->ofp,
19217 "table-id %d, label %u, ess_bit %u",
19218 ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit);
19219 fp = mp->path;
19220 for (i = 0; i < count; i++)
19221 {
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019222 vl_api_mpls_fib_path_print (vam, fp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019223 fp++;
19224 }
19225}
19226
19227static void vl_api_mpls_fib_details_t_handler_json
19228 (vl_api_mpls_fib_details_t * mp)
19229{
19230 vat_main_t *vam = &vat_main;
19231 int count = ntohl (mp->count);
19232 vat_json_node_t *node = NULL;
Neale Ranns31ed7442018-02-23 05:29:09 -080019233 vl_api_fib_path_t *fp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019234 int i;
19235
19236 if (VAT_JSON_ARRAY != vam->json_tree.type)
19237 {
19238 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19239 vat_json_init_array (&vam->json_tree);
19240 }
19241 node = vat_json_array_add (&vam->json_tree);
19242
19243 vat_json_init_object (node);
19244 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19245 vat_json_object_add_uint (node, "s_bit", mp->eos_bit);
19246 vat_json_object_add_uint (node, "label", ntohl (mp->label));
19247 vat_json_object_add_uint (node, "path_count", count);
19248 fp = mp->path;
19249 for (i = 0; i < count; i++)
19250 {
Neale Ranns0f26c5a2017-03-01 15:12:11 -080019251 vl_api_mpls_fib_path_json_print (node, fp);
19252 fp++;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019253 }
19254}
19255
19256static int
19257api_mpls_fib_dump (vat_main_t * vam)
19258{
19259 vl_api_mpls_fib_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019260 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019261 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019262
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019263 M (MPLS_FIB_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019264 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019265
19266 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019267 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019268 S (mp_ping);
19269
Jon Loeliger56c7b012017-02-01 12:31:41 -060019270 W (ret);
19271 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019272}
19273
19274#define vl_api_ip_fib_details_t_endian vl_noop_handler
19275#define vl_api_ip_fib_details_t_print vl_noop_handler
19276
19277static void
19278vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp)
19279{
19280 vat_main_t *vam = &vat_main;
19281 int count = ntohl (mp->count);
19282 vl_api_fib_path_t *fp;
19283 int i;
19284
19285 print (vam->ofp,
Neale Ranns008dbe12018-09-07 09:32:36 -070019286 "table-id %d, prefix %U/%d stats-index %d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010019287 ntohl (mp->table_id), format_ip4_address, mp->address,
Neale Ranns008dbe12018-09-07 09:32:36 -070019288 mp->address_length, ntohl (mp->stats_index));
Damjan Marion7cd468a2016-12-19 23:05:39 +010019289 fp = mp->path;
19290 for (i = 0; i < count; i++)
19291 {
19292 if (fp->afi == IP46_TYPE_IP6)
19293 print (vam->ofp,
19294 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
Neale Rannsde450cb2018-07-10 03:00:07 -070019295 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19296 "next_hop_table %d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010019297 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19298 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
Neale Rannsde450cb2018-07-10 03:00:07 -070019299 format_ip6_address, fp->next_hop, ntohl (fp->table_id));
Damjan Marion7cd468a2016-12-19 23:05:39 +010019300 else if (fp->afi == IP46_TYPE_IP4)
19301 print (vam->ofp,
19302 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
Neale Rannsde450cb2018-07-10 03:00:07 -070019303 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, "
19304 "next_hop_table %d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010019305 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19306 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
Neale Rannsde450cb2018-07-10 03:00:07 -070019307 format_ip4_address, fp->next_hop, ntohl (fp->table_id));
Damjan Marion7cd468a2016-12-19 23:05:39 +010019308 fp++;
19309 }
19310}
19311
19312static void vl_api_ip_fib_details_t_handler_json
19313 (vl_api_ip_fib_details_t * mp)
19314{
19315 vat_main_t *vam = &vat_main;
19316 int count = ntohl (mp->count);
19317 vat_json_node_t *node = NULL;
19318 struct in_addr ip4;
19319 struct in6_addr ip6;
19320 vl_api_fib_path_t *fp;
19321 int i;
19322
19323 if (VAT_JSON_ARRAY != vam->json_tree.type)
19324 {
19325 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19326 vat_json_init_array (&vam->json_tree);
19327 }
19328 node = vat_json_array_add (&vam->json_tree);
19329
19330 vat_json_init_object (node);
19331 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19332 clib_memcpy (&ip4, &mp->address, sizeof (ip4));
19333 vat_json_object_add_ip4 (node, "prefix", ip4);
19334 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19335 vat_json_object_add_uint (node, "path_count", count);
19336 fp = mp->path;
19337 for (i = 0; i < count; i++)
19338 {
19339 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19340 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19341 vat_json_object_add_uint (node, "is_local", fp->is_local);
19342 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19343 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19344 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19345 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19346 if (fp->afi == IP46_TYPE_IP4)
19347 {
19348 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19349 vat_json_object_add_ip4 (node, "next_hop", ip4);
19350 }
19351 else if (fp->afi == IP46_TYPE_IP6)
19352 {
19353 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19354 vat_json_object_add_ip6 (node, "next_hop", ip6);
19355 }
19356 }
19357}
19358
19359static int
19360api_ip_fib_dump (vat_main_t * vam)
19361{
19362 vl_api_ip_fib_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019363 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019364 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019365
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019366 M (IP_FIB_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019367 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019368
19369 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019370 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019371 S (mp_ping);
19372
Jon Loeliger56c7b012017-02-01 12:31:41 -060019373 W (ret);
19374 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019375}
19376
Neale Ranns5a8123b2017-01-26 01:18:23 -080019377static int
19378api_ip_mfib_dump (vat_main_t * vam)
19379{
19380 vl_api_ip_mfib_dump_t *mp;
19381 vl_api_control_ping_t *mp_ping;
19382 int ret;
19383
19384 M (IP_MFIB_DUMP, mp);
19385 S (mp);
19386
19387 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019388 MPING (CONTROL_PING, mp_ping);
Neale Ranns5a8123b2017-01-26 01:18:23 -080019389 S (mp_ping);
19390
19391 W (ret);
19392 return ret;
19393}
19394
Damjan Marion7cd468a2016-12-19 23:05:39 +010019395static void vl_api_ip_neighbor_details_t_handler
19396 (vl_api_ip_neighbor_details_t * mp)
19397{
19398 vat_main_t *vam = &vat_main;
19399
19400 print (vam->ofp, "%c %U %U",
Neale Ranns37029302018-08-10 05:30:06 -070019401 (ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ? 'S' : 'D',
19402 format_vl_api_mac_address, &mp->neighbor.mac_address,
19403 format_vl_api_address, &mp->neighbor.ip_address);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019404}
19405
19406static void vl_api_ip_neighbor_details_t_handler_json
19407 (vl_api_ip_neighbor_details_t * mp)
19408{
19409
19410 vat_main_t *vam = &vat_main;
19411 vat_json_node_t *node;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019412
19413 if (VAT_JSON_ARRAY != vam->json_tree.type)
19414 {
19415 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19416 vat_json_init_array (&vam->json_tree);
19417 }
19418 node = vat_json_array_add (&vam->json_tree);
19419
19420 vat_json_init_object (node);
Neale Ranns37029302018-08-10 05:30:06 -070019421 vat_json_object_add_string_copy
19422 (node, "flag",
19423 ((ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ?
19424 (u8 *) "static" : (u8 *) "dynamic"));
Damjan Marion7cd468a2016-12-19 23:05:39 +010019425
19426 vat_json_object_add_string_copy (node, "link_layer",
Neale Ranns37029302018-08-10 05:30:06 -070019427 format (0, "%U", format_vl_api_mac_address,
19428 &mp->neighbor.mac_address));
Neale Ranns8d7c5022019-02-06 01:41:05 -080019429 vat_json_object_add_address (node, &mp->neighbor.ip_address);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019430}
19431
19432static int
19433api_ip_neighbor_dump (vat_main_t * vam)
19434{
19435 unformat_input_t *i = vam->input;
19436 vl_api_ip_neighbor_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019437 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019438 u8 is_ipv6 = 0;
19439 u32 sw_if_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019440 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019441
19442 /* Parse args required to build the message */
19443 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19444 {
19445 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19446 ;
19447 else if (unformat (i, "sw_if_index %d", &sw_if_index))
19448 ;
19449 else if (unformat (i, "ip6"))
19450 is_ipv6 = 1;
19451 else
19452 break;
19453 }
19454
19455 if (sw_if_index == ~0)
19456 {
19457 errmsg ("missing interface name or sw_if_index");
19458 return -99;
19459 }
19460
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019461 M (IP_NEIGHBOR_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019462 mp->is_ipv6 = (u8) is_ipv6;
19463 mp->sw_if_index = ntohl (sw_if_index);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019464 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019465
19466 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019467 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019468 S (mp_ping);
19469
Jon Loeliger56c7b012017-02-01 12:31:41 -060019470 W (ret);
19471 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019472}
19473
19474#define vl_api_ip6_fib_details_t_endian vl_noop_handler
19475#define vl_api_ip6_fib_details_t_print vl_noop_handler
19476
19477static void
19478vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp)
19479{
19480 vat_main_t *vam = &vat_main;
19481 int count = ntohl (mp->count);
19482 vl_api_fib_path_t *fp;
19483 int i;
19484
19485 print (vam->ofp,
Neale Ranns008dbe12018-09-07 09:32:36 -070019486 "table-id %d, prefix %U/%d stats-index %d",
Damjan Marion7cd468a2016-12-19 23:05:39 +010019487 ntohl (mp->table_id), format_ip6_address, mp->address,
Neale Ranns008dbe12018-09-07 09:32:36 -070019488 mp->address_length, ntohl (mp->stats_index));
Damjan Marion7cd468a2016-12-19 23:05:39 +010019489 fp = mp->path;
19490 for (i = 0; i < count; i++)
19491 {
19492 if (fp->afi == IP46_TYPE_IP6)
19493 print (vam->ofp,
19494 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19495 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19496 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19497 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19498 format_ip6_address, fp->next_hop);
19499 else if (fp->afi == IP46_TYPE_IP4)
19500 print (vam->ofp,
19501 " weight %d, sw_if_index %d, is_local %d, is_drop %d, "
19502 "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U",
19503 ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local,
19504 fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi,
19505 format_ip4_address, fp->next_hop);
19506 fp++;
19507 }
19508}
19509
19510static void vl_api_ip6_fib_details_t_handler_json
19511 (vl_api_ip6_fib_details_t * mp)
19512{
19513 vat_main_t *vam = &vat_main;
19514 int count = ntohl (mp->count);
19515 vat_json_node_t *node = NULL;
19516 struct in_addr ip4;
19517 struct in6_addr ip6;
19518 vl_api_fib_path_t *fp;
19519 int i;
19520
19521 if (VAT_JSON_ARRAY != vam->json_tree.type)
19522 {
19523 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19524 vat_json_init_array (&vam->json_tree);
19525 }
19526 node = vat_json_array_add (&vam->json_tree);
19527
19528 vat_json_init_object (node);
19529 vat_json_object_add_uint (node, "table", ntohl (mp->table_id));
19530 clib_memcpy (&ip6, &mp->address, sizeof (ip6));
19531 vat_json_object_add_ip6 (node, "prefix", ip6);
19532 vat_json_object_add_uint (node, "mask_length", mp->address_length);
19533 vat_json_object_add_uint (node, "path_count", count);
19534 fp = mp->path;
19535 for (i = 0; i < count; i++)
19536 {
19537 vat_json_object_add_uint (node, "weight", ntohl (fp->weight));
19538 vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index));
19539 vat_json_object_add_uint (node, "is_local", fp->is_local);
19540 vat_json_object_add_uint (node, "is_drop", fp->is_drop);
19541 vat_json_object_add_uint (node, "is_unreach", fp->is_unreach);
19542 vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit);
19543 vat_json_object_add_uint (node, "next_hop_afi", fp->afi);
19544 if (fp->afi == IP46_TYPE_IP4)
19545 {
19546 clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4));
19547 vat_json_object_add_ip4 (node, "next_hop", ip4);
19548 }
19549 else if (fp->afi == IP46_TYPE_IP6)
19550 {
19551 clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6));
19552 vat_json_object_add_ip6 (node, "next_hop", ip6);
19553 }
19554 }
19555}
19556
19557static int
19558api_ip6_fib_dump (vat_main_t * vam)
19559{
19560 vl_api_ip6_fib_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019561 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019562 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019563
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019564 M (IP6_FIB_DUMP, mp);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019565 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019566
19567 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019568 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019569 S (mp_ping);
19570
Jon Loeliger56c7b012017-02-01 12:31:41 -060019571 W (ret);
19572 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019573}
19574
Neale Ranns5a8123b2017-01-26 01:18:23 -080019575static int
19576api_ip6_mfib_dump (vat_main_t * vam)
19577{
19578 vl_api_ip6_mfib_dump_t *mp;
19579 vl_api_control_ping_t *mp_ping;
19580 int ret;
19581
19582 M (IP6_MFIB_DUMP, mp);
19583 S (mp);
19584
19585 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019586 MPING (CONTROL_PING, mp_ping);
Neale Ranns5a8123b2017-01-26 01:18:23 -080019587 S (mp_ping);
19588
19589 W (ret);
19590 return ret;
19591}
19592
Damjan Marion7cd468a2016-12-19 23:05:39 +010019593int
19594api_classify_table_ids (vat_main_t * vam)
19595{
19596 vl_api_classify_table_ids_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019597 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019598
19599 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019600 M (CLASSIFY_TABLE_IDS, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019601 mp->context = 0;
19602
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019603 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019604 W (ret);
19605 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019606}
19607
19608int
19609api_classify_table_by_interface (vat_main_t * vam)
19610{
19611 unformat_input_t *input = vam->input;
19612 vl_api_classify_table_by_interface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019613
19614 u32 sw_if_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019615 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019616 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19617 {
19618 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
19619 ;
19620 else if (unformat (input, "sw_if_index %d", &sw_if_index))
19621 ;
19622 else
19623 break;
19624 }
19625 if (sw_if_index == ~0)
19626 {
19627 errmsg ("missing interface name or sw_if_index");
19628 return -99;
19629 }
19630
19631 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019632 M (CLASSIFY_TABLE_BY_INTERFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019633 mp->context = 0;
19634 mp->sw_if_index = ntohl (sw_if_index);
19635
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019636 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019637 W (ret);
19638 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019639}
19640
19641int
19642api_classify_table_info (vat_main_t * vam)
19643{
19644 unformat_input_t *input = vam->input;
19645 vl_api_classify_table_info_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019646
19647 u32 table_id = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019648 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019649 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19650 {
19651 if (unformat (input, "table_id %d", &table_id))
19652 ;
19653 else
19654 break;
19655 }
19656 if (table_id == ~0)
19657 {
19658 errmsg ("missing table id");
19659 return -99;
19660 }
19661
19662 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019663 M (CLASSIFY_TABLE_INFO, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019664 mp->context = 0;
19665 mp->table_id = ntohl (table_id);
19666
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019667 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019668 W (ret);
19669 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019670}
19671
19672int
19673api_classify_session_dump (vat_main_t * vam)
19674{
19675 unformat_input_t *input = vam->input;
19676 vl_api_classify_session_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019677 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019678
19679 u32 table_id = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019680 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019681 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
19682 {
19683 if (unformat (input, "table_id %d", &table_id))
19684 ;
19685 else
19686 break;
19687 }
19688 if (table_id == ~0)
19689 {
19690 errmsg ("missing table id");
19691 return -99;
19692 }
19693
19694 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019695 M (CLASSIFY_SESSION_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019696 mp->context = 0;
19697 mp->table_id = ntohl (table_id);
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019698 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019699
19700 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019701 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019702 S (mp_ping);
19703
Jon Loeliger56c7b012017-02-01 12:31:41 -060019704 W (ret);
19705 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019706}
19707
19708static void
19709vl_api_ipfix_exporter_details_t_handler (vl_api_ipfix_exporter_details_t * mp)
19710{
19711 vat_main_t *vam = &vat_main;
19712
19713 print (vam->ofp, "collector_address %U, collector_port %d, "
19714 "src_address %U, vrf_id %d, path_mtu %u, "
19715 "template_interval %u, udp_checksum %d",
19716 format_ip4_address, mp->collector_address,
19717 ntohs (mp->collector_port),
19718 format_ip4_address, mp->src_address,
19719 ntohl (mp->vrf_id), ntohl (mp->path_mtu),
19720 ntohl (mp->template_interval), mp->udp_checksum);
19721
19722 vam->retval = 0;
19723 vam->result_ready = 1;
19724}
19725
19726static void
19727 vl_api_ipfix_exporter_details_t_handler_json
19728 (vl_api_ipfix_exporter_details_t * mp)
19729{
19730 vat_main_t *vam = &vat_main;
19731 vat_json_node_t node;
19732 struct in_addr collector_address;
19733 struct in_addr src_address;
19734
19735 vat_json_init_object (&node);
19736 clib_memcpy (&collector_address, &mp->collector_address,
19737 sizeof (collector_address));
19738 vat_json_object_add_ip4 (&node, "collector_address", collector_address);
19739 vat_json_object_add_uint (&node, "collector_port",
19740 ntohs (mp->collector_port));
19741 clib_memcpy (&src_address, &mp->src_address, sizeof (src_address));
19742 vat_json_object_add_ip4 (&node, "src_address", src_address);
19743 vat_json_object_add_int (&node, "vrf_id", ntohl (mp->vrf_id));
19744 vat_json_object_add_uint (&node, "path_mtu", ntohl (mp->path_mtu));
19745 vat_json_object_add_uint (&node, "template_interval",
19746 ntohl (mp->template_interval));
19747 vat_json_object_add_int (&node, "udp_checksum", mp->udp_checksum);
19748
19749 vat_json_print (vam->ofp, &node);
19750 vat_json_free (&node);
19751 vam->retval = 0;
19752 vam->result_ready = 1;
19753}
19754
19755int
19756api_ipfix_exporter_dump (vat_main_t * vam)
19757{
19758 vl_api_ipfix_exporter_dump_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019759 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019760
19761 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019762 M (IPFIX_EXPORTER_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019763 mp->context = 0;
19764
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019765 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019766 W (ret);
19767 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019768}
19769
19770static int
19771api_ipfix_classify_stream_dump (vat_main_t * vam)
19772{
19773 vl_api_ipfix_classify_stream_dump_t *mp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019774 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019775
19776 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019777 M (IPFIX_CLASSIFY_STREAM_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019778 mp->context = 0;
19779
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019780 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019781 W (ret);
19782 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019783 /* NOTREACHED */
19784 return 0;
19785}
19786
19787static void
19788 vl_api_ipfix_classify_stream_details_t_handler
19789 (vl_api_ipfix_classify_stream_details_t * mp)
19790{
19791 vat_main_t *vam = &vat_main;
19792 print (vam->ofp, "domain_id %d, src_port %d",
19793 ntohl (mp->domain_id), ntohs (mp->src_port));
19794 vam->retval = 0;
19795 vam->result_ready = 1;
19796}
19797
19798static void
19799 vl_api_ipfix_classify_stream_details_t_handler_json
19800 (vl_api_ipfix_classify_stream_details_t * mp)
19801{
19802 vat_main_t *vam = &vat_main;
19803 vat_json_node_t node;
19804
19805 vat_json_init_object (&node);
19806 vat_json_object_add_uint (&node, "domain_id", ntohl (mp->domain_id));
19807 vat_json_object_add_uint (&node, "src_port", ntohs (mp->src_port));
19808
19809 vat_json_print (vam->ofp, &node);
19810 vat_json_free (&node);
19811 vam->retval = 0;
19812 vam->result_ready = 1;
19813}
19814
19815static int
19816api_ipfix_classify_table_dump (vat_main_t * vam)
19817{
19818 vl_api_ipfix_classify_table_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019819 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019820 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019821
19822 if (!vam->json_output)
19823 {
19824 print (vam->ofp, "%15s%15s%20s", "table_id", "ip_version",
19825 "transport_protocol");
19826 }
19827
19828 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019829 M (IPFIX_CLASSIFY_TABLE_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019830
19831 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019832 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019833
19834 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040019835 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060019836 S (mp_ping);
19837
Jon Loeliger56c7b012017-02-01 12:31:41 -060019838 W (ret);
19839 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019840}
19841
19842static void
19843 vl_api_ipfix_classify_table_details_t_handler
19844 (vl_api_ipfix_classify_table_details_t * mp)
19845{
19846 vat_main_t *vam = &vat_main;
19847 print (vam->ofp, "%15d%15d%20d", ntohl (mp->table_id), mp->ip_version,
19848 mp->transport_protocol);
19849}
19850
19851static void
19852 vl_api_ipfix_classify_table_details_t_handler_json
19853 (vl_api_ipfix_classify_table_details_t * mp)
19854{
19855 vat_json_node_t *node = NULL;
19856 vat_main_t *vam = &vat_main;
19857
19858 if (VAT_JSON_ARRAY != vam->json_tree.type)
19859 {
19860 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19861 vat_json_init_array (&vam->json_tree);
19862 }
19863
19864 node = vat_json_array_add (&vam->json_tree);
19865 vat_json_init_object (node);
19866
19867 vat_json_object_add_uint (node, "table_id", ntohl (mp->table_id));
19868 vat_json_object_add_uint (node, "ip_version", mp->ip_version);
19869 vat_json_object_add_uint (node, "transport_protocol",
19870 mp->transport_protocol);
19871}
19872
19873static int
19874api_sw_interface_span_enable_disable (vat_main_t * vam)
19875{
19876 unformat_input_t *i = vam->input;
19877 vl_api_sw_interface_span_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019878 u32 src_sw_if_index = ~0;
19879 u32 dst_sw_if_index = ~0;
19880 u8 state = 3;
Jon Loeliger56c7b012017-02-01 12:31:41 -060019881 int ret;
Eyal Bari001fd402017-07-16 09:34:53 +030019882 u8 is_l2 = 0;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019883
19884 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
19885 {
19886 if (unformat
19887 (i, "src %U", api_unformat_sw_if_index, vam, &src_sw_if_index))
19888 ;
19889 else if (unformat (i, "src_sw_if_index %d", &src_sw_if_index))
19890 ;
19891 else
19892 if (unformat
19893 (i, "dst %U", api_unformat_sw_if_index, vam, &dst_sw_if_index))
19894 ;
19895 else if (unformat (i, "dst_sw_if_index %d", &dst_sw_if_index))
19896 ;
19897 else if (unformat (i, "disable"))
19898 state = 0;
19899 else if (unformat (i, "rx"))
19900 state = 1;
19901 else if (unformat (i, "tx"))
19902 state = 2;
19903 else if (unformat (i, "both"))
19904 state = 3;
Eyal Bari001fd402017-07-16 09:34:53 +030019905 else if (unformat (i, "l2"))
19906 is_l2 = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019907 else
19908 break;
19909 }
19910
Jon Loeliger8a2aea32017-01-31 13:19:40 -060019911 M (SW_INTERFACE_SPAN_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010019912
19913 mp->sw_if_index_from = htonl (src_sw_if_index);
19914 mp->sw_if_index_to = htonl (dst_sw_if_index);
19915 mp->state = state;
Eyal Bari001fd402017-07-16 09:34:53 +030019916 mp->is_l2 = is_l2;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019917
Jon Loeliger7bc770c2017-01-31 14:03:33 -060019918 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060019919 W (ret);
19920 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010019921}
19922
19923static void
19924vl_api_sw_interface_span_details_t_handler (vl_api_sw_interface_span_details_t
19925 * mp)
19926{
19927 vat_main_t *vam = &vat_main;
19928 u8 *sw_if_from_name = 0;
19929 u8 *sw_if_to_name = 0;
19930 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19931 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19932 char *states[] = { "none", "rx", "tx", "both" };
19933 hash_pair_t *p;
19934
19935 /* *INDENT-OFF* */
19936 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19937 ({
19938 if ((u32) p->value[0] == sw_if_index_from)
19939 {
19940 sw_if_from_name = (u8 *)(p->key);
19941 if (sw_if_to_name)
19942 break;
19943 }
19944 if ((u32) p->value[0] == sw_if_index_to)
19945 {
19946 sw_if_to_name = (u8 *)(p->key);
19947 if (sw_if_from_name)
19948 break;
19949 }
19950 }));
19951 /* *INDENT-ON* */
Jon Loeliger179ab362018-03-12 14:50:08 -050019952 print (vam->ofp, "%20s => %20s (%s) %s",
19953 sw_if_from_name, sw_if_to_name, states[mp->state],
19954 mp->is_l2 ? "l2" : "device");
Damjan Marion7cd468a2016-12-19 23:05:39 +010019955}
19956
19957static void
19958 vl_api_sw_interface_span_details_t_handler_json
19959 (vl_api_sw_interface_span_details_t * mp)
19960{
19961 vat_main_t *vam = &vat_main;
19962 vat_json_node_t *node = NULL;
19963 u8 *sw_if_from_name = 0;
19964 u8 *sw_if_to_name = 0;
19965 u32 sw_if_index_from = ntohl (mp->sw_if_index_from);
19966 u32 sw_if_index_to = ntohl (mp->sw_if_index_to);
19967 hash_pair_t *p;
19968
19969 /* *INDENT-OFF* */
19970 hash_foreach_pair (p, vam->sw_if_index_by_interface_name,
19971 ({
19972 if ((u32) p->value[0] == sw_if_index_from)
19973 {
19974 sw_if_from_name = (u8 *)(p->key);
19975 if (sw_if_to_name)
19976 break;
19977 }
19978 if ((u32) p->value[0] == sw_if_index_to)
19979 {
19980 sw_if_to_name = (u8 *)(p->key);
19981 if (sw_if_from_name)
19982 break;
19983 }
19984 }));
19985 /* *INDENT-ON* */
19986
19987 if (VAT_JSON_ARRAY != vam->json_tree.type)
19988 {
19989 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
19990 vat_json_init_array (&vam->json_tree);
19991 }
19992 node = vat_json_array_add (&vam->json_tree);
19993
19994 vat_json_init_object (node);
19995 vat_json_object_add_uint (node, "src-if-index", sw_if_index_from);
19996 vat_json_object_add_string_copy (node, "src-if-name", sw_if_from_name);
19997 vat_json_object_add_uint (node, "dst-if-index", sw_if_index_to);
Neale Ranns05b2bf22017-01-30 06:44:58 -080019998 if (0 != sw_if_to_name)
19999 {
20000 vat_json_object_add_string_copy (node, "dst-if-name", sw_if_to_name);
20001 }
Damjan Marion7cd468a2016-12-19 23:05:39 +010020002 vat_json_object_add_uint (node, "state", mp->state);
Jon Loeliger179ab362018-03-12 14:50:08 -050020003 vat_json_object_add_uint (node, "is-l2", mp->is_l2);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020004}
20005
20006static int
20007api_sw_interface_span_dump (vat_main_t * vam)
20008{
Eyal Bari5b311202017-07-31 13:12:30 +030020009 unformat_input_t *input = vam->input;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020010 vl_api_sw_interface_span_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020011 vl_api_control_ping_t *mp_ping;
Eyal Bari5b311202017-07-31 13:12:30 +030020012 u8 is_l2 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020013 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020014
Eyal Bari5b311202017-07-31 13:12:30 +030020015 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20016 {
20017 if (unformat (input, "l2"))
20018 is_l2 = 1;
20019 else
20020 break;
20021 }
20022
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020023 M (SW_INTERFACE_SPAN_DUMP, mp);
Eyal Bari5b311202017-07-31 13:12:30 +030020024 mp->is_l2 = is_l2;
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020025 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020026
20027 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040020028 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020029 S (mp_ping);
20030
Jon Loeliger56c7b012017-02-01 12:31:41 -060020031 W (ret);
20032 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020033}
20034
20035int
20036api_pg_create_interface (vat_main_t * vam)
20037{
20038 unformat_input_t *input = vam->input;
20039 vl_api_pg_create_interface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020040
20041 u32 if_id = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020042 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020043 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20044 {
20045 if (unformat (input, "if_id %d", &if_id))
20046 ;
20047 else
20048 break;
20049 }
20050 if (if_id == ~0)
20051 {
20052 errmsg ("missing pg interface index");
20053 return -99;
20054 }
20055
20056 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020057 M (PG_CREATE_INTERFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020058 mp->context = 0;
20059 mp->interface_id = ntohl (if_id);
20060
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020061 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020062 W (ret);
20063 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020064}
20065
20066int
20067api_pg_capture (vat_main_t * vam)
20068{
20069 unformat_input_t *input = vam->input;
20070 vl_api_pg_capture_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020071
20072 u32 if_id = ~0;
20073 u8 enable = 1;
20074 u32 count = 1;
20075 u8 pcap_file_set = 0;
20076 u8 *pcap_file = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020077 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020078 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20079 {
20080 if (unformat (input, "if_id %d", &if_id))
20081 ;
20082 else if (unformat (input, "pcap %s", &pcap_file))
20083 pcap_file_set = 1;
20084 else if (unformat (input, "count %d", &count))
20085 ;
20086 else if (unformat (input, "disable"))
20087 enable = 0;
20088 else
20089 break;
20090 }
20091 if (if_id == ~0)
20092 {
20093 errmsg ("missing pg interface index");
20094 return -99;
20095 }
20096 if (pcap_file_set > 0)
20097 {
20098 if (vec_len (pcap_file) > 255)
20099 {
20100 errmsg ("pcap file name is too long");
20101 return -99;
20102 }
20103 }
20104
20105 u32 name_len = vec_len (pcap_file);
20106 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020107 M (PG_CAPTURE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020108 mp->context = 0;
20109 mp->interface_id = ntohl (if_id);
20110 mp->is_enabled = enable;
20111 mp->count = ntohl (count);
20112 mp->pcap_name_length = ntohl (name_len);
20113 if (pcap_file_set != 0)
20114 {
20115 clib_memcpy (mp->pcap_file_name, pcap_file, name_len);
20116 }
20117 vec_free (pcap_file);
20118
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020119 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020120 W (ret);
20121 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020122}
20123
20124int
20125api_pg_enable_disable (vat_main_t * vam)
20126{
20127 unformat_input_t *input = vam->input;
20128 vl_api_pg_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020129
20130 u8 enable = 1;
20131 u8 stream_name_set = 0;
20132 u8 *stream_name = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020133 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020134 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20135 {
20136 if (unformat (input, "stream %s", &stream_name))
20137 stream_name_set = 1;
20138 else if (unformat (input, "disable"))
20139 enable = 0;
20140 else
20141 break;
20142 }
20143
20144 if (stream_name_set > 0)
20145 {
20146 if (vec_len (stream_name) > 255)
20147 {
20148 errmsg ("stream name too long");
20149 return -99;
20150 }
20151 }
20152
20153 u32 name_len = vec_len (stream_name);
20154 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020155 M (PG_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020156 mp->context = 0;
20157 mp->is_enabled = enable;
20158 if (stream_name_set != 0)
20159 {
20160 mp->stream_name_length = ntohl (name_len);
20161 clib_memcpy (mp->stream_name, stream_name, name_len);
20162 }
20163 vec_free (stream_name);
20164
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020165 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020166 W (ret);
20167 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020168}
20169
20170int
20171api_ip_source_and_port_range_check_add_del (vat_main_t * vam)
20172{
20173 unformat_input_t *input = vam->input;
20174 vl_api_ip_source_and_port_range_check_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020175
20176 u16 *low_ports = 0;
20177 u16 *high_ports = 0;
20178 u16 this_low;
20179 u16 this_hi;
Neale Ranns37029302018-08-10 05:30:06 -070020180 vl_api_prefix_t prefix;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020181 u32 tmp, tmp2;
20182 u8 prefix_set = 0;
20183 u32 vrf_id = ~0;
20184 u8 is_add = 1;
20185 u8 is_ipv6 = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020186 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020187
20188 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20189 {
Neale Ranns37029302018-08-10 05:30:06 -070020190 if (unformat (input, "%U", unformat_vl_api_prefix, &prefix))
20191 prefix_set = 1;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020192 else if (unformat (input, "vrf %d", &vrf_id))
20193 ;
20194 else if (unformat (input, "del"))
20195 is_add = 0;
20196 else if (unformat (input, "port %d", &tmp))
20197 {
20198 if (tmp == 0 || tmp > 65535)
20199 {
20200 errmsg ("port %d out of range", tmp);
20201 return -99;
20202 }
20203 this_low = tmp;
20204 this_hi = this_low + 1;
20205 vec_add1 (low_ports, this_low);
20206 vec_add1 (high_ports, this_hi);
20207 }
20208 else if (unformat (input, "range %d - %d", &tmp, &tmp2))
20209 {
20210 if ((tmp > tmp2) || (tmp == 0) || (tmp2 > 65535))
20211 {
20212 errmsg ("incorrect range parameters");
20213 return -99;
20214 }
20215 this_low = tmp;
20216 /* Note: in debug CLI +1 is added to high before
20217 passing to real fn that does "the work"
20218 (ip_source_and_port_range_check_add_del).
20219 This fn is a wrapper around the binary API fn a
20220 control plane will call, which expects this increment
20221 to have occurred. Hence letting the binary API control
20222 plane fn do the increment for consistency between VAT
20223 and other control planes.
20224 */
20225 this_hi = tmp2;
20226 vec_add1 (low_ports, this_low);
20227 vec_add1 (high_ports, this_hi);
20228 }
20229 else
20230 break;
20231 }
20232
20233 if (prefix_set == 0)
20234 {
20235 errmsg ("<address>/<mask> not specified");
20236 return -99;
20237 }
20238
20239 if (vrf_id == ~0)
20240 {
20241 errmsg ("VRF ID required, not specified");
20242 return -99;
20243 }
20244
20245 if (vrf_id == 0)
20246 {
20247 errmsg
20248 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20249 return -99;
20250 }
20251
20252 if (vec_len (low_ports) == 0)
20253 {
20254 errmsg ("At least one port or port range required");
20255 return -99;
20256 }
20257
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020258 M (IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020259
20260 mp->is_add = is_add;
20261
Neale Ranns37029302018-08-10 05:30:06 -070020262 clib_memcpy (&mp->prefix, &prefix, sizeof (prefix));
Damjan Marion7cd468a2016-12-19 23:05:39 +010020263
Damjan Marion7cd468a2016-12-19 23:05:39 +010020264 mp->number_of_ranges = vec_len (low_ports);
20265
20266 clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports));
20267 vec_free (low_ports);
20268
20269 clib_memcpy (mp->high_ports, high_ports, vec_len (high_ports));
20270 vec_free (high_ports);
20271
20272 mp->vrf_id = ntohl (vrf_id);
20273
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020274 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020275 W (ret);
20276 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020277}
20278
20279int
20280api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam)
20281{
20282 unformat_input_t *input = vam->input;
20283 vl_api_ip_source_and_port_range_check_interface_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020284 u32 sw_if_index = ~0;
20285 int vrf_set = 0;
20286 u32 tcp_out_vrf_id = ~0, udp_out_vrf_id = ~0;
20287 u32 tcp_in_vrf_id = ~0, udp_in_vrf_id = ~0;
20288 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020289 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020290
20291 while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
20292 {
20293 if (unformat (input, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20294 ;
20295 else if (unformat (input, "sw_if_index %d", &sw_if_index))
20296 ;
20297 else if (unformat (input, "tcp-out-vrf %d", &tcp_out_vrf_id))
20298 vrf_set = 1;
20299 else if (unformat (input, "udp-out-vrf %d", &udp_out_vrf_id))
20300 vrf_set = 1;
20301 else if (unformat (input, "tcp-in-vrf %d", &tcp_in_vrf_id))
20302 vrf_set = 1;
20303 else if (unformat (input, "udp-in-vrf %d", &udp_in_vrf_id))
20304 vrf_set = 1;
20305 else if (unformat (input, "del"))
20306 is_add = 0;
20307 else
20308 break;
20309 }
20310
20311 if (sw_if_index == ~0)
20312 {
20313 errmsg ("Interface required but not specified");
20314 return -99;
20315 }
20316
20317 if (vrf_set == 0)
20318 {
20319 errmsg ("VRF ID required but not specified");
20320 return -99;
20321 }
20322
20323 if (tcp_out_vrf_id == 0
20324 || udp_out_vrf_id == 0 || tcp_in_vrf_id == 0 || udp_in_vrf_id == 0)
20325 {
20326 errmsg
20327 ("VRF ID should not be default. Should be distinct VRF for this purpose.");
20328 return -99;
20329 }
20330
20331 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020332 M (IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020333
20334 mp->sw_if_index = ntohl (sw_if_index);
20335 mp->is_add = is_add;
20336 mp->tcp_out_vrf_id = ntohl (tcp_out_vrf_id);
20337 mp->udp_out_vrf_id = ntohl (udp_out_vrf_id);
20338 mp->tcp_in_vrf_id = ntohl (tcp_in_vrf_id);
20339 mp->udp_in_vrf_id = ntohl (udp_in_vrf_id);
20340
20341 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020342 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020343
20344 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060020345 W (ret);
20346 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020347}
20348
20349static int
20350api_ipsec_gre_add_del_tunnel (vat_main_t * vam)
20351{
20352 unformat_input_t *i = vam->input;
20353 vl_api_ipsec_gre_add_del_tunnel_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020354 u32 local_sa_id = 0;
20355 u32 remote_sa_id = 0;
20356 ip4_address_t src_address;
20357 ip4_address_t dst_address;
20358 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020359 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020360
20361 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20362 {
20363 if (unformat (i, "local_sa %d", &local_sa_id))
20364 ;
20365 else if (unformat (i, "remote_sa %d", &remote_sa_id))
20366 ;
20367 else if (unformat (i, "src %U", unformat_ip4_address, &src_address))
20368 ;
20369 else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address))
20370 ;
20371 else if (unformat (i, "del"))
20372 is_add = 0;
20373 else
20374 {
20375 clib_warning ("parse error '%U'", format_unformat_error, i);
20376 return -99;
20377 }
20378 }
20379
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020380 M (IPSEC_GRE_ADD_DEL_TUNNEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020381
20382 mp->local_sa_id = ntohl (local_sa_id);
20383 mp->remote_sa_id = ntohl (remote_sa_id);
20384 clib_memcpy (mp->src_address, &src_address, sizeof (src_address));
20385 clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address));
20386 mp->is_add = is_add;
20387
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020388 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020389 W (ret);
20390 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020391}
20392
20393static int
Pavel Kotuceke88865d2018-11-28 07:42:11 +010020394api_set_punt (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010020395{
20396 unformat_input_t *i = vam->input;
Pavel Kotuceke88865d2018-11-28 07:42:11 +010020397 vl_api_set_punt_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020398 u32 ipv = ~0;
20399 u32 protocol = ~0;
20400 u32 port = ~0;
20401 int is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020402 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020403
20404 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20405 {
20406 if (unformat (i, "ip %d", &ipv))
20407 ;
20408 else if (unformat (i, "protocol %d", &protocol))
20409 ;
20410 else if (unformat (i, "port %d", &port))
20411 ;
20412 else if (unformat (i, "del"))
20413 is_add = 0;
20414 else
20415 {
20416 clib_warning ("parse error '%U'", format_unformat_error, i);
20417 return -99;
20418 }
20419 }
20420
Pavel Kotuceke88865d2018-11-28 07:42:11 +010020421 M (SET_PUNT, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020422
20423 mp->is_add = (u8) is_add;
Pavel Kotuceke88865d2018-11-28 07:42:11 +010020424 mp->punt.ipv = (u8) ipv;
20425 mp->punt.l4_protocol = (u8) protocol;
20426 mp->punt.l4_port = htons ((u16) port);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020427
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020428 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020429 W (ret);
20430 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020431}
20432
20433static void vl_api_ipsec_gre_tunnel_details_t_handler
20434 (vl_api_ipsec_gre_tunnel_details_t * mp)
20435{
20436 vat_main_t *vam = &vat_main;
20437
20438 print (vam->ofp, "%11d%15U%15U%14d%14d",
20439 ntohl (mp->sw_if_index),
20440 format_ip4_address, &mp->src_address,
20441 format_ip4_address, &mp->dst_address,
20442 ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id));
20443}
20444
20445static void vl_api_ipsec_gre_tunnel_details_t_handler_json
20446 (vl_api_ipsec_gre_tunnel_details_t * mp)
20447{
20448 vat_main_t *vam = &vat_main;
20449 vat_json_node_t *node = NULL;
20450 struct in_addr ip4;
20451
20452 if (VAT_JSON_ARRAY != vam->json_tree.type)
20453 {
20454 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20455 vat_json_init_array (&vam->json_tree);
20456 }
20457 node = vat_json_array_add (&vam->json_tree);
20458
20459 vat_json_init_object (node);
20460 vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index));
20461 clib_memcpy (&ip4, &mp->src_address, sizeof (ip4));
20462 vat_json_object_add_ip4 (node, "src_address", ip4);
20463 clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4));
20464 vat_json_object_add_ip4 (node, "dst_address", ip4);
20465 vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id));
20466 vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id));
20467}
20468
20469static int
20470api_ipsec_gre_tunnel_dump (vat_main_t * vam)
20471{
20472 unformat_input_t *i = vam->input;
20473 vl_api_ipsec_gre_tunnel_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020474 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020475 u32 sw_if_index;
20476 u8 sw_if_index_set = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020477 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020478
20479 /* Parse args required to build the message */
20480 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20481 {
20482 if (unformat (i, "sw_if_index %d", &sw_if_index))
20483 sw_if_index_set = 1;
20484 else
20485 break;
20486 }
20487
20488 if (sw_if_index_set == 0)
20489 {
20490 sw_if_index = ~0;
20491 }
20492
20493 if (!vam->json_output)
20494 {
20495 print (vam->ofp, "%11s%15s%15s%14s%14s",
20496 "sw_if_index", "src_address", "dst_address",
20497 "local_sa_id", "remote_sa_id");
20498 }
20499
20500 /* Get list of gre-tunnel interfaces */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020501 M (IPSEC_GRE_TUNNEL_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020502
20503 mp->sw_if_index = htonl (sw_if_index);
20504
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020505 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020506
20507 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040020508 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020509 S (mp_ping);
20510
Jon Loeliger56c7b012017-02-01 12:31:41 -060020511 W (ret);
20512 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020513}
20514
20515static int
20516api_delete_subif (vat_main_t * vam)
20517{
20518 unformat_input_t *i = vam->input;
20519 vl_api_delete_subif_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020520 u32 sw_if_index = ~0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020521 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020522
20523 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20524 {
20525 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20526 ;
20527 if (unformat (i, "sw_if_index %d", &sw_if_index))
20528 ;
20529 else
20530 break;
20531 }
20532
20533 if (sw_if_index == ~0)
20534 {
20535 errmsg ("missing sw_if_index");
20536 return -99;
20537 }
20538
20539 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020540 M (DELETE_SUBIF, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020541 mp->sw_if_index = ntohl (sw_if_index);
20542
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020543 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020544 W (ret);
20545 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020546}
20547
20548#define foreach_pbb_vtr_op \
20549_("disable", L2_VTR_DISABLED) \
20550_("pop", L2_VTR_POP_2) \
20551_("push", L2_VTR_PUSH_2)
20552
20553static int
20554api_l2_interface_pbb_tag_rewrite (vat_main_t * vam)
20555{
20556 unformat_input_t *i = vam->input;
20557 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020558 u32 sw_if_index = ~0, vtr_op = ~0;
20559 u16 outer_tag = ~0;
20560 u8 dmac[6], smac[6];
20561 u8 dmac_set = 0, smac_set = 0;
20562 u16 vlanid = 0;
20563 u32 sid = ~0;
20564 u32 tmp;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020565 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020566
20567 /* Shut up coverity */
Dave Barachb7b92992018-10-17 10:38:51 -040020568 clib_memset (dmac, 0, sizeof (dmac));
20569 clib_memset (smac, 0, sizeof (smac));
Damjan Marion7cd468a2016-12-19 23:05:39 +010020570
20571 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20572 {
20573 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20574 ;
20575 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20576 ;
20577 else if (unformat (i, "vtr_op %d", &vtr_op))
20578 ;
20579#define _(n,v) else if (unformat(i, n)) {vtr_op = v;}
20580 foreach_pbb_vtr_op
20581#undef _
20582 else if (unformat (i, "translate_pbb_stag"))
20583 {
20584 if (unformat (i, "%d", &tmp))
20585 {
20586 vtr_op = L2_VTR_TRANSLATE_2_1;
20587 outer_tag = tmp;
20588 }
20589 else
20590 {
20591 errmsg
20592 ("translate_pbb_stag operation requires outer tag definition");
20593 return -99;
20594 }
20595 }
20596 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
20597 dmac_set++;
20598 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
20599 smac_set++;
20600 else if (unformat (i, "sid %d", &sid))
20601 ;
20602 else if (unformat (i, "vlanid %d", &tmp))
20603 vlanid = tmp;
20604 else
20605 {
20606 clib_warning ("parse error '%U'", format_unformat_error, i);
20607 return -99;
20608 }
20609 }
20610
20611 if ((sw_if_index == ~0) || (vtr_op == ~0))
20612 {
20613 errmsg ("missing sw_if_index or vtr operation");
20614 return -99;
20615 }
20616 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2))
20617 && ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
20618 {
20619 errmsg
20620 ("push and translate_qinq operations require dmac, smac, sid and optionally vlanid");
20621 return -99;
20622 }
20623
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020624 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020625 mp->sw_if_index = ntohl (sw_if_index);
20626 mp->vtr_op = ntohl (vtr_op);
20627 mp->outer_tag = ntohs (outer_tag);
20628 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
20629 clib_memcpy (mp->b_smac, smac, sizeof (smac));
20630 mp->b_vlanid = ntohs (vlanid);
20631 mp->i_sid = ntohl (sid);
20632
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020633 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020634 W (ret);
20635 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020636}
20637
20638static int
20639api_flow_classify_set_interface (vat_main_t * vam)
20640{
20641 unformat_input_t *i = vam->input;
20642 vl_api_flow_classify_set_interface_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020643 u32 sw_if_index;
20644 int sw_if_index_set;
20645 u32 ip4_table_index = ~0;
20646 u32 ip6_table_index = ~0;
20647 u8 is_add = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020648 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020649
20650 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20651 {
20652 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20653 sw_if_index_set = 1;
20654 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20655 sw_if_index_set = 1;
20656 else if (unformat (i, "del"))
20657 is_add = 0;
20658 else if (unformat (i, "ip4-table %d", &ip4_table_index))
20659 ;
20660 else if (unformat (i, "ip6-table %d", &ip6_table_index))
20661 ;
20662 else
20663 {
20664 clib_warning ("parse error '%U'", format_unformat_error, i);
20665 return -99;
20666 }
20667 }
20668
20669 if (sw_if_index_set == 0)
20670 {
20671 errmsg ("missing interface name or sw_if_index");
20672 return -99;
20673 }
20674
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020675 M (FLOW_CLASSIFY_SET_INTERFACE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020676
20677 mp->sw_if_index = ntohl (sw_if_index);
20678 mp->ip4_table_index = ntohl (ip4_table_index);
20679 mp->ip6_table_index = ntohl (ip6_table_index);
20680 mp->is_add = is_add;
20681
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020682 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020683 W (ret);
20684 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020685}
20686
20687static int
20688api_flow_classify_dump (vat_main_t * vam)
20689{
20690 unformat_input_t *i = vam->input;
20691 vl_api_flow_classify_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020692 vl_api_control_ping_t *mp_ping;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020693 u8 type = FLOW_CLASSIFY_N_TABLES;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020694 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020695
20696 if (unformat (i, "type %U", unformat_flow_classify_table_type, &type))
20697 ;
20698 else
20699 {
20700 errmsg ("classify table type must be specified");
20701 return -99;
20702 }
20703
20704 if (!vam->json_output)
20705 {
20706 print (vam->ofp, "%10s%20s", "Intfc idx", "Classify table");
20707 }
20708
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020709 M (FLOW_CLASSIFY_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020710 mp->type = type;
20711 /* send it... */
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020712 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020713
20714 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040020715 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020716 S (mp_ping);
20717
Damjan Marion7cd468a2016-12-19 23:05:39 +010020718 /* Wait for a reply... */
Jon Loeliger56c7b012017-02-01 12:31:41 -060020719 W (ret);
20720 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020721}
20722
20723static int
20724api_feature_enable_disable (vat_main_t * vam)
20725{
20726 unformat_input_t *i = vam->input;
20727 vl_api_feature_enable_disable_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020728 u8 *arc_name = 0;
20729 u8 *feature_name = 0;
20730 u32 sw_if_index = ~0;
20731 u8 enable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020732 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020733
20734 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20735 {
20736 if (unformat (i, "arc_name %s", &arc_name))
20737 ;
20738 else if (unformat (i, "feature_name %s", &feature_name))
20739 ;
20740 else
20741 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20742 ;
20743 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20744 ;
20745 else if (unformat (i, "disable"))
20746 enable = 0;
20747 else
20748 break;
20749 }
20750
20751 if (arc_name == 0)
20752 {
20753 errmsg ("missing arc name");
20754 return -99;
20755 }
20756 if (vec_len (arc_name) > 63)
20757 {
20758 errmsg ("arc name too long");
20759 }
20760
20761 if (feature_name == 0)
20762 {
20763 errmsg ("missing feature name");
20764 return -99;
20765 }
20766 if (vec_len (feature_name) > 63)
20767 {
20768 errmsg ("feature name too long");
20769 }
20770
20771 if (sw_if_index == ~0)
20772 {
20773 errmsg ("missing interface name or sw_if_index");
20774 return -99;
20775 }
20776
20777 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020778 M (FEATURE_ENABLE_DISABLE, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020779 mp->sw_if_index = ntohl (sw_if_index);
20780 mp->enable = enable;
20781 clib_memcpy (mp->arc_name, arc_name, vec_len (arc_name));
20782 clib_memcpy (mp->feature_name, feature_name, vec_len (feature_name));
20783 vec_free (arc_name);
20784 vec_free (feature_name);
20785
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020786 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020787 W (ret);
20788 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020789}
20790
20791static int
20792api_sw_interface_tag_add_del (vat_main_t * vam)
20793{
20794 unformat_input_t *i = vam->input;
20795 vl_api_sw_interface_tag_add_del_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020796 u32 sw_if_index = ~0;
20797 u8 *tag = 0;
20798 u8 enable = 1;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020799 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020800
20801 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20802 {
20803 if (unformat (i, "tag %s", &tag))
20804 ;
20805 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20806 ;
20807 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20808 ;
20809 else if (unformat (i, "del"))
20810 enable = 0;
20811 else
20812 break;
20813 }
20814
20815 if (sw_if_index == ~0)
20816 {
20817 errmsg ("missing interface name or sw_if_index");
20818 return -99;
20819 }
20820
20821 if (enable && (tag == 0))
20822 {
20823 errmsg ("no tag specified");
20824 return -99;
20825 }
20826
20827 /* Construct the API message */
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020828 M (SW_INTERFACE_TAG_ADD_DEL, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020829 mp->sw_if_index = ntohl (sw_if_index);
20830 mp->is_add = enable;
20831 if (enable)
Ole Trøan3b0d7e42019-03-15 16:14:41 +000020832 strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020833 vec_free (tag);
20834
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020835 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020836 W (ret);
20837 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020838}
20839
20840static void vl_api_l2_xconnect_details_t_handler
20841 (vl_api_l2_xconnect_details_t * mp)
20842{
20843 vat_main_t *vam = &vat_main;
20844
20845 print (vam->ofp, "%15d%15d",
20846 ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index));
20847}
20848
20849static void vl_api_l2_xconnect_details_t_handler_json
20850 (vl_api_l2_xconnect_details_t * mp)
20851{
20852 vat_main_t *vam = &vat_main;
20853 vat_json_node_t *node = NULL;
20854
20855 if (VAT_JSON_ARRAY != vam->json_tree.type)
20856 {
20857 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
20858 vat_json_init_array (&vam->json_tree);
20859 }
20860 node = vat_json_array_add (&vam->json_tree);
20861
20862 vat_json_init_object (node);
20863 vat_json_object_add_uint (node, "rx_sw_if_index",
20864 ntohl (mp->rx_sw_if_index));
20865 vat_json_object_add_uint (node, "tx_sw_if_index",
20866 ntohl (mp->tx_sw_if_index));
20867}
20868
20869static int
20870api_l2_xconnect_dump (vat_main_t * vam)
20871{
20872 vl_api_l2_xconnect_dump_t *mp;
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020873 vl_api_control_ping_t *mp_ping;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020874 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020875
20876 if (!vam->json_output)
20877 {
20878 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
20879 }
20880
Jon Loeliger8a2aea32017-01-31 13:19:40 -060020881 M (L2_XCONNECT_DUMP, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020882
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020883 S (mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020884
20885 /* Use a control ping for synchronization */
Dave Barach59b25652017-09-10 15:04:27 -040020886 MPING (CONTROL_PING, mp_ping);
Jon Loeliger2d23eca2017-02-01 13:09:58 -060020887 S (mp_ping);
20888
Jon Loeliger56c7b012017-02-01 12:31:41 -060020889 W (ret);
20890 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020891}
20892
20893static int
Ole Troand7231612018-06-07 10:17:57 +020020894api_hw_interface_set_mtu (vat_main_t * vam)
Damjan Marion7cd468a2016-12-19 23:05:39 +010020895{
20896 unformat_input_t *i = vam->input;
Ole Troand7231612018-06-07 10:17:57 +020020897 vl_api_hw_interface_set_mtu_t *mp;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020898 u32 sw_if_index = ~0;
20899 u32 mtu = 0;
Jon Loeliger56c7b012017-02-01 12:31:41 -060020900 int ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020901
20902 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20903 {
20904 if (unformat (i, "mtu %d", &mtu))
20905 ;
20906 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
20907 ;
20908 else if (unformat (i, "sw_if_index %d", &sw_if_index))
20909 ;
20910 else
20911 break;
20912 }
20913
20914 if (sw_if_index == ~0)
20915 {
20916 errmsg ("missing interface name or sw_if_index");
20917 return -99;
20918 }
20919
20920 if (mtu == 0)
20921 {
20922 errmsg ("no mtu specified");
20923 return -99;
20924 }
20925
20926 /* Construct the API message */
Ole Troand7231612018-06-07 10:17:57 +020020927 M (HW_INTERFACE_SET_MTU, mp);
Damjan Marion7cd468a2016-12-19 23:05:39 +010020928 mp->sw_if_index = ntohl (sw_if_index);
20929 mp->mtu = ntohs ((u16) mtu);
20930
Jon Loeliger7bc770c2017-01-31 14:03:33 -060020931 S (mp);
Jon Loeliger56c7b012017-02-01 12:31:41 -060020932 W (ret);
20933 return ret;
Damjan Marion7cd468a2016-12-19 23:05:39 +010020934}
20935
Pavel Kotucek6899a302017-06-08 08:46:10 +020020936static int
20937api_p2p_ethernet_add (vat_main_t * vam)
20938{
20939 unformat_input_t *i = vam->input;
20940 vl_api_p2p_ethernet_add_t *mp;
20941 u32 parent_if_index = ~0;
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020020942 u32 sub_id = ~0;
Pavel Kotucek6899a302017-06-08 08:46:10 +020020943 u8 remote_mac[6];
20944 u8 mac_set = 0;
20945 int ret;
20946
Dave Barachb7b92992018-10-17 10:38:51 -040020947 clib_memset (remote_mac, 0, sizeof (remote_mac));
Pavel Kotucek6899a302017-06-08 08:46:10 +020020948 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
20949 {
20950 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
20951 ;
20952 else if (unformat (i, "sw_if_index %d", &parent_if_index))
20953 ;
20954 else
20955 if (unformat
20956 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
20957 mac_set++;
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020020958 else if (unformat (i, "sub_id %d", &sub_id))
20959 ;
Pavel Kotucek6899a302017-06-08 08:46:10 +020020960 else
20961 {
20962 clib_warning ("parse error '%U'", format_unformat_error, i);
20963 return -99;
20964 }
20965 }
20966
20967 if (parent_if_index == ~0)
20968 {
20969 errmsg ("missing interface name or sw_if_index");
20970 return -99;
20971 }
20972 if (mac_set == 0)
20973 {
20974 errmsg ("missing remote mac address");
20975 return -99;
20976 }
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020020977 if (sub_id == ~0)
20978 {
20979 errmsg ("missing sub-interface id");
20980 return -99;
20981 }
Pavel Kotucek6899a302017-06-08 08:46:10 +020020982
20983 M (P2P_ETHERNET_ADD, mp);
20984 mp->parent_if_index = ntohl (parent_if_index);
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020020985 mp->subif_id = ntohl (sub_id);
Pavel Kotucek6899a302017-06-08 08:46:10 +020020986 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
20987
20988 S (mp);
20989 W (ret);
20990 return ret;
20991}
20992
20993static int
20994api_p2p_ethernet_del (vat_main_t * vam)
20995{
20996 unformat_input_t *i = vam->input;
20997 vl_api_p2p_ethernet_del_t *mp;
20998 u32 parent_if_index = ~0;
20999 u8 remote_mac[6];
21000 u8 mac_set = 0;
21001 int ret;
21002
Dave Barachb7b92992018-10-17 10:38:51 -040021003 clib_memset (remote_mac, 0, sizeof (remote_mac));
Pavel Kotucek6899a302017-06-08 08:46:10 +020021004 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21005 {
21006 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &parent_if_index))
21007 ;
21008 else if (unformat (i, "sw_if_index %d", &parent_if_index))
21009 ;
21010 else
21011 if (unformat
21012 (i, "remote_mac %U", unformat_ethernet_address, remote_mac))
21013 mac_set++;
21014 else
21015 {
21016 clib_warning ("parse error '%U'", format_unformat_error, i);
21017 return -99;
21018 }
21019 }
21020
21021 if (parent_if_index == ~0)
21022 {
21023 errmsg ("missing interface name or sw_if_index");
21024 return -99;
21025 }
21026 if (mac_set == 0)
21027 {
21028 errmsg ("missing remote mac address");
21029 return -99;
21030 }
21031
21032 M (P2P_ETHERNET_DEL, mp);
21033 mp->parent_if_index = ntohl (parent_if_index);
21034 clib_memcpy (mp->remote_mac, remote_mac, sizeof (remote_mac));
21035
21036 S (mp);
21037 W (ret);
21038 return ret;
21039}
Damjan Marion7cd468a2016-12-19 23:05:39 +010021040
21041static int
Steve Shin99a0e602017-07-01 04:16:20 +000021042api_lldp_config (vat_main_t * vam)
21043{
21044 unformat_input_t *i = vam->input;
21045 vl_api_lldp_config_t *mp;
21046 int tx_hold = 0;
21047 int tx_interval = 0;
21048 u8 *sys_name = NULL;
21049 int ret;
21050
21051 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21052 {
21053 if (unformat (i, "system-name %s", &sys_name))
21054 ;
21055 else if (unformat (i, "tx-hold %d", &tx_hold))
21056 ;
21057 else if (unformat (i, "tx-interval %d", &tx_interval))
21058 ;
21059 else
21060 {
21061 clib_warning ("parse error '%U'", format_unformat_error, i);
21062 return -99;
21063 }
21064 }
21065
21066 vec_add1 (sys_name, 0);
21067
21068 M (LLDP_CONFIG, mp);
21069 mp->tx_hold = htonl (tx_hold);
21070 mp->tx_interval = htonl (tx_interval);
21071 clib_memcpy (mp->system_name, sys_name, vec_len (sys_name));
21072 vec_free (sys_name);
21073
21074 S (mp);
21075 W (ret);
21076 return ret;
21077}
21078
21079static int
21080api_sw_interface_set_lldp (vat_main_t * vam)
21081{
21082 unformat_input_t *i = vam->input;
21083 vl_api_sw_interface_set_lldp_t *mp;
21084 u32 sw_if_index = ~0;
21085 u32 enable = 1;
Steve Shin9a6fcef2017-10-11 13:55:16 -070021086 u8 *port_desc = NULL, *mgmt_oid = NULL;
21087 ip4_address_t ip4_addr;
21088 ip6_address_t ip6_addr;
Steve Shin99a0e602017-07-01 04:16:20 +000021089 int ret;
21090
Dave Barachb7b92992018-10-17 10:38:51 -040021091 clib_memset (&ip4_addr, 0, sizeof (ip4_addr));
21092 clib_memset (&ip6_addr, 0, sizeof (ip6_addr));
Steve Shin9a6fcef2017-10-11 13:55:16 -070021093
Steve Shin99a0e602017-07-01 04:16:20 +000021094 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21095 {
21096 if (unformat (i, "disable"))
21097 enable = 0;
21098 else
21099 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21100 ;
21101 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21102 ;
21103 else if (unformat (i, "port-desc %s", &port_desc))
21104 ;
Steve Shin9a6fcef2017-10-11 13:55:16 -070021105 else if (unformat (i, "mgmt-ip4 %U", unformat_ip4_address, &ip4_addr))
21106 ;
21107 else if (unformat (i, "mgmt-ip6 %U", unformat_ip6_address, &ip6_addr))
21108 ;
21109 else if (unformat (i, "mgmt-oid %s", &mgmt_oid))
21110 ;
Steve Shin99a0e602017-07-01 04:16:20 +000021111 else
21112 break;
21113 }
21114
21115 if (sw_if_index == ~0)
21116 {
21117 errmsg ("missing interface name or sw_if_index");
21118 return -99;
21119 }
21120
21121 /* Construct the API message */
21122 vec_add1 (port_desc, 0);
Steve Shin9a6fcef2017-10-11 13:55:16 -070021123 vec_add1 (mgmt_oid, 0);
Steve Shin99a0e602017-07-01 04:16:20 +000021124 M (SW_INTERFACE_SET_LLDP, mp);
21125 mp->sw_if_index = ntohl (sw_if_index);
21126 mp->enable = enable;
21127 clib_memcpy (mp->port_desc, port_desc, vec_len (port_desc));
Steve Shin9a6fcef2017-10-11 13:55:16 -070021128 clib_memcpy (mp->mgmt_oid, mgmt_oid, vec_len (mgmt_oid));
21129 clib_memcpy (mp->mgmt_ip4, &ip4_addr, sizeof (ip4_addr));
21130 clib_memcpy (mp->mgmt_ip6, &ip6_addr, sizeof (ip6_addr));
Steve Shin99a0e602017-07-01 04:16:20 +000021131 vec_free (port_desc);
Steve Shin9a6fcef2017-10-11 13:55:16 -070021132 vec_free (mgmt_oid);
Steve Shin99a0e602017-07-01 04:16:20 +000021133
21134 S (mp);
21135 W (ret);
21136 return ret;
21137}
21138
21139static int
Dave Barach3bbcfab2017-08-15 19:03:44 -040021140api_tcp_configure_src_addresses (vat_main_t * vam)
21141{
21142 vl_api_tcp_configure_src_addresses_t *mp;
21143 unformat_input_t *i = vam->input;
21144 ip4_address_t v4first, v4last;
21145 ip6_address_t v6first, v6last;
21146 u8 range_set = 0;
21147 u32 vrf_id = 0;
21148 int ret;
21149
21150 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21151 {
21152 if (unformat (i, "%U - %U",
21153 unformat_ip4_address, &v4first,
21154 unformat_ip4_address, &v4last))
21155 {
21156 if (range_set)
21157 {
21158 errmsg ("one range per message (range already set)");
21159 return -99;
21160 }
21161 range_set = 1;
21162 }
21163 else if (unformat (i, "%U - %U",
21164 unformat_ip6_address, &v6first,
21165 unformat_ip6_address, &v6last))
21166 {
21167 if (range_set)
21168 {
21169 errmsg ("one range per message (range already set)");
21170 return -99;
21171 }
21172 range_set = 2;
21173 }
21174 else if (unformat (i, "vrf %d", &vrf_id))
21175 ;
21176 else
21177 break;
21178 }
21179
21180 if (range_set == 0)
21181 {
21182 errmsg ("address range not set");
21183 return -99;
21184 }
21185
21186 M (TCP_CONFIGURE_SRC_ADDRESSES, mp);
21187 mp->vrf_id = ntohl (vrf_id);
21188 /* ipv6? */
21189 if (range_set == 2)
21190 {
21191 mp->is_ipv6 = 1;
21192 clib_memcpy (mp->first_address, &v6first, sizeof (v6first));
21193 clib_memcpy (mp->last_address, &v6last, sizeof (v6last));
21194 }
21195 else
21196 {
21197 mp->is_ipv6 = 0;
21198 clib_memcpy (mp->first_address, &v4first, sizeof (v4first));
21199 clib_memcpy (mp->last_address, &v4last, sizeof (v4last));
21200 }
21201 S (mp);
21202 W (ret);
21203 return ret;
21204}
21205
Florin Coras6e8c6672017-11-10 09:03:54 -080021206static void vl_api_app_namespace_add_del_reply_t_handler
21207 (vl_api_app_namespace_add_del_reply_t * mp)
21208{
21209 vat_main_t *vam = &vat_main;
21210 i32 retval = ntohl (mp->retval);
21211 if (vam->async_mode)
21212 {
21213 vam->async_errors += (retval < 0);
21214 }
21215 else
21216 {
21217 vam->retval = retval;
21218 if (retval == 0)
21219 errmsg ("app ns index %d\n", ntohl (mp->appns_index));
21220 vam->result_ready = 1;
21221 }
21222}
21223
21224static void vl_api_app_namespace_add_del_reply_t_handler_json
21225 (vl_api_app_namespace_add_del_reply_t * mp)
21226{
21227 vat_main_t *vam = &vat_main;
21228 vat_json_node_t node;
21229
21230 vat_json_init_object (&node);
21231 vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
21232 vat_json_object_add_uint (&node, "appns_index", ntohl (mp->appns_index));
21233
21234 vat_json_print (vam->ofp, &node);
21235 vat_json_free (&node);
21236
21237 vam->retval = ntohl (mp->retval);
21238 vam->result_ready = 1;
21239}
21240
Dave Barach3bbcfab2017-08-15 19:03:44 -040021241static int
Florin Corascea194d2017-10-02 00:18:51 -070021242api_app_namespace_add_del (vat_main_t * vam)
21243{
21244 vl_api_app_namespace_add_del_t *mp;
21245 unformat_input_t *i = vam->input;
21246 u8 *ns_id = 0, secret_set = 0, sw_if_index_set = 0;
21247 u32 sw_if_index, ip4_fib_id, ip6_fib_id;
21248 u64 secret;
21249 int ret;
21250
21251 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21252 {
21253 if (unformat (i, "id %_%v%_", &ns_id))
21254 ;
21255 else if (unformat (i, "secret %lu", &secret))
21256 secret_set = 1;
21257 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21258 sw_if_index_set = 1;
21259 else if (unformat (i, "ip4_fib_id %d", &ip4_fib_id))
21260 ;
21261 else if (unformat (i, "ip6_fib_id %d", &ip6_fib_id))
21262 ;
21263 else
21264 break;
21265 }
21266 if (!ns_id || !secret_set || !sw_if_index_set)
21267 {
21268 errmsg ("namespace id, secret and sw_if_index must be set");
21269 return -99;
21270 }
21271 if (vec_len (ns_id) > 64)
21272 {
21273 errmsg ("namespace id too long");
21274 return -99;
21275 }
21276 M (APP_NAMESPACE_ADD_DEL, mp);
21277
21278 clib_memcpy (mp->namespace_id, ns_id, vec_len (ns_id));
21279 mp->namespace_id_len = vec_len (ns_id);
Florin Coras9a9adb22017-10-26 08:16:59 -070021280 mp->secret = clib_host_to_net_u64 (secret);
Florin Corascea194d2017-10-02 00:18:51 -070021281 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
21282 mp->ip4_fib_id = clib_host_to_net_u32 (ip4_fib_id);
21283 mp->ip6_fib_id = clib_host_to_net_u32 (ip6_fib_id);
21284 vec_free (ns_id);
21285 S (mp);
21286 W (ret);
21287 return ret;
21288}
21289
21290static int
Florin Coras90a63982017-12-19 04:50:01 -080021291api_sock_init_shm (vat_main_t * vam)
21292{
21293#if VPP_API_TEST_BUILTIN == 0
21294 unformat_input_t *i = vam->input;
21295 vl_api_shm_elem_config_t *config = 0;
21296 u64 size = 64 << 20;
21297 int rv;
21298
21299 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21300 {
21301 if (unformat (i, "size %U", unformat_memory_size, &size))
21302 ;
21303 else
21304 break;
21305 }
21306
Dave Barach78958722018-05-10 16:44:27 -040021307 /*
21308 * Canned custom ring allocator config.
21309 * Should probably parse all of this
21310 */
21311 vec_validate (config, 6);
Florin Coras90a63982017-12-19 04:50:01 -080021312 config[0].type = VL_API_VLIB_RING;
Florin Coras90a63982017-12-19 04:50:01 -080021313 config[0].size = 256;
Dave Barach78958722018-05-10 16:44:27 -040021314 config[0].count = 32;
21315
21316 config[1].type = VL_API_VLIB_RING;
Florin Coras90a63982017-12-19 04:50:01 -080021317 config[1].size = 1024;
Dave Barach78958722018-05-10 16:44:27 -040021318 config[1].count = 16;
21319
21320 config[2].type = VL_API_VLIB_RING;
Florin Coras90a63982017-12-19 04:50:01 -080021321 config[2].size = 4096;
Dave Barach78958722018-05-10 16:44:27 -040021322 config[2].count = 2;
21323
21324 config[3].type = VL_API_CLIENT_RING;
21325 config[3].size = 256;
21326 config[3].count = 32;
21327
21328 config[4].type = VL_API_CLIENT_RING;
21329 config[4].size = 1024;
21330 config[4].count = 16;
21331
21332 config[5].type = VL_API_CLIENT_RING;
21333 config[5].size = 4096;
21334 config[5].count = 2;
21335
21336 config[6].type = VL_API_QUEUE;
21337 config[6].count = 128;
21338 config[6].size = sizeof (uword);
21339
Tomasz Kulasek97dcf5b2019-01-31 18:26:32 +010021340 rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ );
Florin Coras90a63982017-12-19 04:50:01 -080021341 if (!rv)
21342 vam->client_index_invalid = 1;
21343 return rv;
21344#else
21345 return -99;
21346#endif
21347}
21348
21349static int
Dave Barach65457162017-10-10 17:53:14 -040021350api_dns_enable_disable (vat_main_t * vam)
21351{
21352 unformat_input_t *line_input = vam->input;
21353 vl_api_dns_enable_disable_t *mp;
21354 u8 enable_disable = 1;
21355 int ret;
21356
21357 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21358 {
21359 if (unformat (line_input, "disable"))
21360 enable_disable = 0;
21361 if (unformat (line_input, "enable"))
21362 enable_disable = 1;
21363 else
21364 break;
21365 }
21366
21367 /* Construct the API message */
21368 M (DNS_ENABLE_DISABLE, mp);
21369 mp->enable = enable_disable;
21370
21371 /* send it... */
21372 S (mp);
21373 /* Wait for the reply */
21374 W (ret);
21375 return ret;
21376}
21377
21378static int
21379api_dns_resolve_name (vat_main_t * vam)
21380{
21381 unformat_input_t *line_input = vam->input;
21382 vl_api_dns_resolve_name_t *mp;
21383 u8 *name = 0;
21384 int ret;
21385
21386 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21387 {
21388 if (unformat (line_input, "%s", &name))
21389 ;
21390 else
21391 break;
21392 }
21393
21394 if (vec_len (name) > 127)
21395 {
21396 errmsg ("name too long");
21397 return -99;
21398 }
21399
21400 /* Construct the API message */
21401 M (DNS_RESOLVE_NAME, mp);
21402 memcpy (mp->name, name, vec_len (name));
21403 vec_free (name);
21404
21405 /* send it... */
21406 S (mp);
21407 /* Wait for the reply */
21408 W (ret);
21409 return ret;
21410}
21411
21412static int
Dave Barachd2080152017-10-20 09:21:35 -040021413api_dns_resolve_ip (vat_main_t * vam)
21414{
21415 unformat_input_t *line_input = vam->input;
21416 vl_api_dns_resolve_ip_t *mp;
21417 int is_ip6 = -1;
21418 ip4_address_t addr4;
21419 ip6_address_t addr6;
21420 int ret;
21421
21422 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
21423 {
21424 if (unformat (line_input, "%U", unformat_ip6_address, &addr6))
21425 is_ip6 = 1;
21426 else if (unformat (line_input, "%U", unformat_ip4_address, &addr4))
21427 is_ip6 = 0;
21428 else
21429 break;
21430 }
21431
21432 if (is_ip6 == -1)
21433 {
21434 errmsg ("missing address");
21435 return -99;
21436 }
21437
21438 /* Construct the API message */
21439 M (DNS_RESOLVE_IP, mp);
21440 mp->is_ip6 = is_ip6;
21441 if (is_ip6)
21442 memcpy (mp->address, &addr6, sizeof (addr6));
21443 else
21444 memcpy (mp->address, &addr4, sizeof (addr4));
21445
21446 /* send it... */
21447 S (mp);
21448 /* Wait for the reply */
21449 W (ret);
21450 return ret;
21451}
21452
21453static int
Dave Barach65457162017-10-10 17:53:14 -040021454api_dns_name_server_add_del (vat_main_t * vam)
21455{
21456 unformat_input_t *i = vam->input;
21457 vl_api_dns_name_server_add_del_t *mp;
21458 u8 is_add = 1;
21459 ip6_address_t ip6_server;
21460 ip4_address_t ip4_server;
21461 int ip6_set = 0;
21462 int ip4_set = 0;
21463 int ret = 0;
21464
21465 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21466 {
21467 if (unformat (i, "%U", unformat_ip6_address, &ip6_server))
21468 ip6_set = 1;
21469 else if (unformat (i, "%U", unformat_ip4_address, &ip4_server))
21470 ip4_set = 1;
21471 else if (unformat (i, "del"))
21472 is_add = 0;
21473 else
21474 {
21475 clib_warning ("parse error '%U'", format_unformat_error, i);
21476 return -99;
21477 }
21478 }
21479
21480 if (ip4_set && ip6_set)
21481 {
21482 errmsg ("Only one server address allowed per message");
21483 return -99;
21484 }
21485 if ((ip4_set + ip6_set) == 0)
21486 {
21487 errmsg ("Server address required");
21488 return -99;
21489 }
21490
21491 /* Construct the API message */
21492 M (DNS_NAME_SERVER_ADD_DEL, mp);
21493
21494 if (ip6_set)
21495 {
21496 memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t));
21497 mp->is_ip6 = 1;
21498 }
21499 else
21500 {
21501 memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t));
21502 mp->is_ip6 = 0;
21503 }
21504
21505 mp->is_add = is_add;
21506
21507 /* send it... */
21508 S (mp);
21509
21510 /* Wait for a reply, return good/bad news */
21511 W (ret);
21512 return ret;
21513}
21514
Florin Coras6c36f532017-11-03 18:32:34 -070021515static void
21516vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp)
21517{
21518 vat_main_t *vam = &vat_main;
21519
21520 if (mp->is_ip4)
21521 {
Florin Corasc97a7392017-11-05 23:07:07 -080021522 print (vam->ofp,
21523 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
Steven85dbac02017-11-07 16:29:53 -080021524 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21525 mp->scope, format_ip4_address, &mp->lcl_ip, mp->lcl_plen,
21526 clib_net_to_host_u16 (mp->lcl_port), format_ip4_address,
21527 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21528 clib_net_to_host_u32 (mp->action_index), mp->tag);
Florin Coras6c36f532017-11-03 18:32:34 -070021529 }
21530 else
21531 {
Florin Corasc97a7392017-11-05 23:07:07 -080021532 print (vam->ofp,
21533 "appns %u tp %u scope %d %U/%d %d %U/%d %d action: %d tag: %s",
Steven85dbac02017-11-07 16:29:53 -080021534 clib_net_to_host_u32 (mp->appns_index), mp->transport_proto,
21535 mp->scope, format_ip6_address, &mp->lcl_ip, mp->lcl_plen,
21536 clib_net_to_host_u16 (mp->lcl_port), format_ip6_address,
21537 &mp->rmt_ip, mp->rmt_plen, clib_net_to_host_u16 (mp->rmt_port),
21538 clib_net_to_host_u32 (mp->action_index), mp->tag);
Florin Coras6c36f532017-11-03 18:32:34 -070021539 }
21540}
21541
21542static void
21543vl_api_session_rules_details_t_handler_json (vl_api_session_rules_details_t *
21544 mp)
21545{
21546 vat_main_t *vam = &vat_main;
21547 vat_json_node_t *node = NULL;
21548 struct in6_addr ip6;
21549 struct in_addr ip4;
21550
21551 if (VAT_JSON_ARRAY != vam->json_tree.type)
21552 {
21553 ASSERT (VAT_JSON_NONE == vam->json_tree.type);
21554 vat_json_init_array (&vam->json_tree);
21555 }
21556 node = vat_json_array_add (&vam->json_tree);
21557 vat_json_init_object (node);
21558
21559 vat_json_object_add_uint (node, "is_ip4", mp->is_ip4 ? 1 : 0);
21560 vat_json_object_add_uint (node, "appns_index",
21561 clib_net_to_host_u32 (mp->appns_index));
21562 vat_json_object_add_uint (node, "transport_proto", mp->transport_proto);
21563 vat_json_object_add_uint (node, "scope", mp->scope);
21564 vat_json_object_add_uint (node, "action_index",
21565 clib_net_to_host_u32 (mp->action_index));
21566 vat_json_object_add_uint (node, "lcl_port",
21567 clib_net_to_host_u16 (mp->lcl_port));
21568 vat_json_object_add_uint (node, "rmt_port",
21569 clib_net_to_host_u16 (mp->rmt_port));
21570 vat_json_object_add_uint (node, "lcl_plen", mp->lcl_plen);
21571 vat_json_object_add_uint (node, "rmt_plen", mp->rmt_plen);
Florin Corasc97a7392017-11-05 23:07:07 -080021572 vat_json_object_add_string_copy (node, "tag", mp->tag);
Florin Coras6c36f532017-11-03 18:32:34 -070021573 if (mp->is_ip4)
21574 {
21575 clib_memcpy (&ip4, mp->lcl_ip, sizeof (ip4));
21576 vat_json_object_add_ip4 (node, "lcl_ip", ip4);
21577 clib_memcpy (&ip4, mp->rmt_ip, sizeof (ip4));
21578 vat_json_object_add_ip4 (node, "rmt_ip", ip4);
21579 }
21580 else
21581 {
21582 clib_memcpy (&ip6, mp->lcl_ip, sizeof (ip6));
21583 vat_json_object_add_ip6 (node, "lcl_ip", ip6);
21584 clib_memcpy (&ip6, mp->rmt_ip, sizeof (ip6));
21585 vat_json_object_add_ip6 (node, "rmt_ip", ip6);
21586 }
21587}
21588
Florin Coras1c710452017-10-17 00:03:13 -070021589static int
21590api_session_rule_add_del (vat_main_t * vam)
21591{
21592 vl_api_session_rule_add_del_t *mp;
21593 unformat_input_t *i = vam->input;
21594 u32 proto = ~0, lcl_port, rmt_port, action = 0, lcl_plen, rmt_plen;
21595 u32 appns_index = 0, scope = 0;
21596 ip4_address_t lcl_ip4, rmt_ip4;
21597 ip6_address_t lcl_ip6, rmt_ip6;
21598 u8 is_ip4 = 1, conn_set = 0;
Florin Corasc97a7392017-11-05 23:07:07 -080021599 u8 is_add = 1, *tag = 0;
Florin Coras1c710452017-10-17 00:03:13 -070021600 int ret;
21601
21602 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21603 {
21604 if (unformat (i, "del"))
21605 is_add = 0;
21606 else if (unformat (i, "add"))
21607 ;
21608 else if (unformat (i, "proto tcp"))
21609 proto = 0;
21610 else if (unformat (i, "proto udp"))
21611 proto = 1;
21612 else if (unformat (i, "appns %d", &appns_index))
21613 ;
21614 else if (unformat (i, "scope %d", &scope))
21615 ;
Florin Corasc97a7392017-11-05 23:07:07 -080021616 else if (unformat (i, "tag %_%v%_", &tag))
21617 ;
Florin Coras1c710452017-10-17 00:03:13 -070021618 else
21619 if (unformat
21620 (i, "%U/%d %d %U/%d %d", unformat_ip4_address, &lcl_ip4,
21621 &lcl_plen, &lcl_port, unformat_ip4_address, &rmt_ip4, &rmt_plen,
21622 &rmt_port))
21623 {
21624 is_ip4 = 1;
21625 conn_set = 1;
21626 }
21627 else
21628 if (unformat
21629 (i, "%U/%d %d %U/%d %d", unformat_ip6_address, &lcl_ip6,
21630 &lcl_plen, &lcl_port, unformat_ip6_address, &rmt_ip6, &rmt_plen,
21631 &rmt_port))
21632 {
21633 is_ip4 = 0;
21634 conn_set = 1;
21635 }
21636 else if (unformat (i, "action %d", &action))
21637 ;
21638 else
21639 break;
21640 }
21641 if (proto == ~0 || !conn_set || action == ~0)
21642 {
21643 errmsg ("transport proto, connection and action must be set");
21644 return -99;
21645 }
21646
21647 if (scope > 3)
21648 {
21649 errmsg ("scope should be 0-3");
21650 return -99;
21651 }
21652
21653 M (SESSION_RULE_ADD_DEL, mp);
21654
21655 mp->is_ip4 = is_ip4;
21656 mp->transport_proto = proto;
Florin Corasc97a7392017-11-05 23:07:07 -080021657 mp->lcl_port = clib_host_to_net_u16 ((u16) lcl_port);
21658 mp->rmt_port = clib_host_to_net_u16 ((u16) rmt_port);
21659 mp->lcl_plen = lcl_plen;
21660 mp->rmt_plen = rmt_plen;
Florin Coras1c710452017-10-17 00:03:13 -070021661 mp->action_index = clib_host_to_net_u32 (action);
21662 mp->appns_index = clib_host_to_net_u32 (appns_index);
21663 mp->scope = scope;
21664 mp->is_add = is_add;
21665 if (is_ip4)
21666 {
21667 clib_memcpy (mp->lcl_ip, &lcl_ip4, sizeof (lcl_ip4));
21668 clib_memcpy (mp->rmt_ip, &rmt_ip4, sizeof (rmt_ip4));
21669 }
21670 else
21671 {
21672 clib_memcpy (mp->lcl_ip, &lcl_ip6, sizeof (lcl_ip6));
21673 clib_memcpy (mp->rmt_ip, &rmt_ip6, sizeof (rmt_ip6));
21674 }
Florin Corasc97a7392017-11-05 23:07:07 -080021675 if (tag)
21676 {
21677 clib_memcpy (mp->tag, tag, vec_len (tag));
21678 vec_free (tag);
21679 }
Florin Coras1c710452017-10-17 00:03:13 -070021680
21681 S (mp);
21682 W (ret);
21683 return ret;
21684}
Dave Barach65457162017-10-10 17:53:14 -040021685
21686static int
Florin Coras6c36f532017-11-03 18:32:34 -070021687api_session_rules_dump (vat_main_t * vam)
21688{
21689 vl_api_session_rules_dump_t *mp;
21690 vl_api_control_ping_t *mp_ping;
21691 int ret;
21692
21693 if (!vam->json_output)
21694 {
21695 print (vam->ofp, "%=20s", "Session Rules");
21696 }
21697
21698 M (SESSION_RULES_DUMP, mp);
21699 /* send it... */
21700 S (mp);
21701
21702 /* Use a control ping for synchronization */
21703 MPING (CONTROL_PING, mp_ping);
21704 S (mp_ping);
21705
21706 /* Wait for a reply... */
21707 W (ret);
21708 return ret;
21709}
21710
21711static int
Florin Coras595992c2017-11-06 17:17:08 -080021712api_ip_container_proxy_add_del (vat_main_t * vam)
21713{
21714 vl_api_ip_container_proxy_add_del_t *mp;
21715 unformat_input_t *i = vam->input;
Neale Ranns37029302018-08-10 05:30:06 -070021716 u32 sw_if_index = ~0;
21717 vl_api_prefix_t pfx = { };
Florin Coras595992c2017-11-06 17:17:08 -080021718 u8 is_add = 1;
21719 int ret;
21720
21721 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21722 {
21723 if (unformat (i, "del"))
21724 is_add = 0;
21725 else if (unformat (i, "add"))
21726 ;
Neale Ranns37029302018-08-10 05:30:06 -070021727 if (unformat (i, "%U", unformat_vl_api_prefix, &pfx))
21728 ;
Florin Coras595992c2017-11-06 17:17:08 -080021729 else if (unformat (i, "sw_if_index %u", &sw_if_index))
21730 ;
21731 else
21732 break;
21733 }
Neale Ranns37029302018-08-10 05:30:06 -070021734 if (sw_if_index == ~0 || pfx.address_length == 0)
Florin Coras595992c2017-11-06 17:17:08 -080021735 {
21736 errmsg ("address and sw_if_index must be set");
21737 return -99;
21738 }
21739
21740 M (IP_CONTAINER_PROXY_ADD_DEL, mp);
21741
Florin Coras595992c2017-11-06 17:17:08 -080021742 mp->sw_if_index = clib_host_to_net_u32 (sw_if_index);
Florin Coras595992c2017-11-06 17:17:08 -080021743 mp->is_add = is_add;
Neale Ranns37029302018-08-10 05:30:06 -070021744 clib_memcpy (&mp->pfx, &pfx, sizeof (pfx));
Florin Coras595992c2017-11-06 17:17:08 -080021745
21746 S (mp);
21747 W (ret);
21748 return ret;
21749}
21750
21751static int
Igor Mikhailov (imichail)582caa32018-04-26 21:33:02 -070021752api_qos_record_enable_disable (vat_main_t * vam)
21753{
21754 unformat_input_t *i = vam->input;
21755 vl_api_qos_record_enable_disable_t *mp;
21756 u32 sw_if_index, qs = 0xff;
21757 u8 sw_if_index_set = 0;
21758 u8 enable = 1;
21759 int ret;
21760
21761 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
21762 {
21763 if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
21764 sw_if_index_set = 1;
21765 else if (unformat (i, "sw_if_index %d", &sw_if_index))
21766 sw_if_index_set = 1;
21767 else if (unformat (i, "%U", unformat_qos_source, &qs))
21768 ;
21769 else if (unformat (i, "disable"))
21770 enable = 0;
21771 else
21772 {
21773 clib_warning ("parse error '%U'", format_unformat_error, i);
21774 return -99;
21775 }
21776 }
21777
21778 if (sw_if_index_set == 0)
21779 {
21780 errmsg ("missing interface name or sw_if_index");
21781 return -99;
21782 }
21783 if (qs == 0xff)
21784 {
21785 errmsg ("input location must be specified");
21786 return -99;
21787 }
21788
21789 M (QOS_RECORD_ENABLE_DISABLE, mp);
21790
21791 mp->sw_if_index = ntohl (sw_if_index);
21792 mp->input_source = qs;
21793 mp->enable = enable;
21794
21795 S (mp);
21796 W (ret);
21797 return ret;
21798}
21799
Dave Barach048a4e52018-06-01 18:52:25 -040021800
Igor Mikhailov (imichail)582caa32018-04-26 21:33:02 -070021801static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010021802q_or_quit (vat_main_t * vam)
21803{
Dave Barachdef19da2017-02-22 17:29:20 -050021804#if VPP_API_TEST_BUILTIN == 0
Damjan Marion7cd468a2016-12-19 23:05:39 +010021805 longjmp (vam->jump_buf, 1);
Dave Barachdef19da2017-02-22 17:29:20 -050021806#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +010021807 return 0; /* not so much */
21808}
21809
21810static int
21811q (vat_main_t * vam)
21812{
21813 return q_or_quit (vam);
21814}
21815
21816static int
21817quit (vat_main_t * vam)
21818{
21819 return q_or_quit (vam);
21820}
21821
21822static int
21823comment (vat_main_t * vam)
21824{
21825 return 0;
21826}
21827
21828static int
Dave Barach048a4e52018-06-01 18:52:25 -040021829statseg (vat_main_t * vam)
21830{
21831 ssvm_private_t *ssvmp = &vam->stat_segment;
21832 ssvm_shared_header_t *shared_header = ssvmp->sh;
21833 vlib_counter_t **counters;
21834 u64 thread0_index1_packets;
21835 u64 thread0_index1_bytes;
21836 f64 vector_rate, input_rate;
21837 uword *p;
21838
21839 uword *counter_vector_by_name;
21840 if (vam->stat_segment_lockp == 0)
21841 {
21842 errmsg ("Stat segment not mapped...");
21843 return -99;
21844 }
21845
21846 /* look up "/if/rx for sw_if_index 1 as a test */
21847
21848 clib_spinlock_lock (vam->stat_segment_lockp);
21849
21850 counter_vector_by_name = (uword *) shared_header->opaque[1];
21851
21852 p = hash_get_mem (counter_vector_by_name, "/if/rx");
21853 if (p == 0)
21854 {
21855 clib_spinlock_unlock (vam->stat_segment_lockp);
21856 errmsg ("/if/tx not found?");
21857 return -99;
21858 }
21859
21860 /* Fish per-thread vector of combined counters from shared memory */
21861 counters = (vlib_counter_t **) p[0];
21862
21863 if (vec_len (counters[0]) < 2)
21864 {
21865 clib_spinlock_unlock (vam->stat_segment_lockp);
21866 errmsg ("/if/tx vector length %d", vec_len (counters[0]));
21867 return -99;
21868 }
21869
21870 /* Read thread 0 sw_if_index 1 counter */
21871 thread0_index1_packets = counters[0][1].packets;
21872 thread0_index1_bytes = counters[0][1].bytes;
21873
21874 p = hash_get_mem (counter_vector_by_name, "vector_rate");
21875 if (p == 0)
21876 {
21877 clib_spinlock_unlock (vam->stat_segment_lockp);
21878 errmsg ("vector_rate not found?");
21879 return -99;
21880 }
21881
21882 vector_rate = *(f64 *) (p[0]);
21883 p = hash_get_mem (counter_vector_by_name, "input_rate");
21884 if (p == 0)
21885 {
21886 clib_spinlock_unlock (vam->stat_segment_lockp);
21887 errmsg ("input_rate not found?");
21888 return -99;
21889 }
21890 input_rate = *(f64 *) (p[0]);
21891
21892 clib_spinlock_unlock (vam->stat_segment_lockp);
21893
21894 print (vam->ofp, "vector_rate %.2f input_rate %.2f",
21895 vector_rate, input_rate);
21896 print (vam->ofp, "thread 0 sw_if_index 1 rx pkts %lld, bytes %lld",
21897 thread0_index1_packets, thread0_index1_bytes);
21898
21899 return 0;
21900}
21901
21902static int
Damjan Marion7cd468a2016-12-19 23:05:39 +010021903cmd_cmp (void *a1, void *a2)
21904{
21905 u8 **c1 = a1;
21906 u8 **c2 = a2;
21907
21908 return strcmp ((char *) (c1[0]), (char *) (c2[0]));
21909}
21910
21911static int
21912help (vat_main_t * vam)
21913{
21914 u8 **cmds = 0;
21915 u8 *name = 0;
21916 hash_pair_t *p;
21917 unformat_input_t *i = vam->input;
21918 int j;
21919
21920 if (unformat (i, "%s", &name))
21921 {
21922 uword *hs;
21923
21924 vec_add1 (name, 0);
21925
21926 hs = hash_get_mem (vam->help_by_name, name);
21927 if (hs)
21928 print (vam->ofp, "usage: %s %s", name, hs[0]);
21929 else
21930 print (vam->ofp, "No such msg / command '%s'", name);
21931 vec_free (name);
21932 return 0;
21933 }
21934
21935 print (vam->ofp, "Help is available for the following:");
21936
21937 /* *INDENT-OFF* */
21938 hash_foreach_pair (p, vam->function_by_name,
21939 ({
21940 vec_add1 (cmds, (u8 *)(p->key));
21941 }));
21942 /* *INDENT-ON* */
21943
21944 vec_sort_with_function (cmds, cmd_cmp);
21945
21946 for (j = 0; j < vec_len (cmds); j++)
21947 print (vam->ofp, "%s", cmds[j]);
21948
21949 vec_free (cmds);
21950 return 0;
21951}
21952
21953static int
21954set (vat_main_t * vam)
21955{
21956 u8 *name = 0, *value = 0;
21957 unformat_input_t *i = vam->input;
21958
21959 if (unformat (i, "%s", &name))
21960 {
21961 /* The input buffer is a vector, not a string. */
21962 value = vec_dup (i->buffer);
21963 vec_delete (value, i->index, 0);
21964 /* Almost certainly has a trailing newline */
21965 if (value[vec_len (value) - 1] == '\n')
21966 value[vec_len (value) - 1] = 0;
21967 /* Make sure it's a proper string, one way or the other */
21968 vec_add1 (value, 0);
21969 (void) clib_macro_set_value (&vam->macro_main,
21970 (char *) name, (char *) value);
21971 }
21972 else
21973 errmsg ("usage: set <name> <value>");
21974
21975 vec_free (name);
21976 vec_free (value);
21977 return 0;
21978}
21979
21980static int
21981unset (vat_main_t * vam)
21982{
21983 u8 *name = 0;
21984
21985 if (unformat (vam->input, "%s", &name))
21986 if (clib_macro_unset (&vam->macro_main, (char *) name) == 1)
21987 errmsg ("unset: %s wasn't set", name);
21988 vec_free (name);
21989 return 0;
21990}
21991
21992typedef struct
21993{
21994 u8 *name;
21995 u8 *value;
21996} macro_sort_t;
21997
21998
21999static int
22000macro_sort_cmp (void *a1, void *a2)
22001{
22002 macro_sort_t *s1 = a1;
22003 macro_sort_t *s2 = a2;
22004
22005 return strcmp ((char *) (s1->name), (char *) (s2->name));
22006}
22007
22008static int
22009dump_macro_table (vat_main_t * vam)
22010{
22011 macro_sort_t *sort_me = 0, *sm;
22012 int i;
22013 hash_pair_t *p;
22014
22015 /* *INDENT-OFF* */
22016 hash_foreach_pair (p, vam->macro_main.the_value_table_hash,
22017 ({
22018 vec_add2 (sort_me, sm, 1);
22019 sm->name = (u8 *)(p->key);
22020 sm->value = (u8 *) (p->value[0]);
22021 }));
22022 /* *INDENT-ON* */
22023
22024 vec_sort_with_function (sort_me, macro_sort_cmp);
22025
22026 if (vec_len (sort_me))
22027 print (vam->ofp, "%-15s%s", "Name", "Value");
22028 else
22029 print (vam->ofp, "The macro table is empty...");
22030
22031 for (i = 0; i < vec_len (sort_me); i++)
22032 print (vam->ofp, "%-15s%s", sort_me[i].name, sort_me[i].value);
22033 return 0;
22034}
22035
22036static int
22037dump_node_table (vat_main_t * vam)
22038{
22039 int i, j;
22040 vlib_node_t *node, *next_node;
22041
22042 if (vec_len (vam->graph_nodes) == 0)
22043 {
22044 print (vam->ofp, "Node table empty, issue get_node_graph...");
22045 return 0;
22046 }
22047
Dave Barach1ddbc012018-06-13 09:26:05 -040022048 for (i = 0; i < vec_len (vam->graph_nodes[0]); i++)
Damjan Marion7cd468a2016-12-19 23:05:39 +010022049 {
Dave Barach1ddbc012018-06-13 09:26:05 -040022050 node = vam->graph_nodes[0][i];
Damjan Marion7cd468a2016-12-19 23:05:39 +010022051 print (vam->ofp, "[%d] %s", i, node->name);
22052 for (j = 0; j < vec_len (node->next_nodes); j++)
22053 {
22054 if (node->next_nodes[j] != ~0)
22055 {
Dave Barach1ddbc012018-06-13 09:26:05 -040022056 next_node = vam->graph_nodes[0][node->next_nodes[j]];
Damjan Marion7cd468a2016-12-19 23:05:39 +010022057 print (vam->ofp, " [%d] %s", j, next_node->name);
22058 }
22059 }
22060 }
22061 return 0;
22062}
22063
22064static int
22065value_sort_cmp (void *a1, void *a2)
22066{
22067 name_sort_t *n1 = a1;
22068 name_sort_t *n2 = a2;
22069
22070 if (n1->value < n2->value)
22071 return -1;
22072 if (n1->value > n2->value)
22073 return 1;
22074 return 0;
22075}
22076
22077
22078static int
22079dump_msg_api_table (vat_main_t * vam)
22080{
22081 api_main_t *am = &api_main;
22082 name_sort_t *nses = 0, *ns;
22083 hash_pair_t *hp;
22084 int i;
22085
22086 /* *INDENT-OFF* */
22087 hash_foreach_pair (hp, am->msg_index_by_name_and_crc,
22088 ({
22089 vec_add2 (nses, ns, 1);
22090 ns->name = (u8 *)(hp->key);
22091 ns->value = (u32) hp->value[0];
22092 }));
22093 /* *INDENT-ON* */
22094
22095 vec_sort_with_function (nses, value_sort_cmp);
22096
22097 for (i = 0; i < vec_len (nses); i++)
22098 print (vam->ofp, " [%d]: %s", nses[i].value, nses[i].name);
22099 vec_free (nses);
22100 return 0;
22101}
22102
22103static int
22104get_msg_id (vat_main_t * vam)
22105{
22106 u8 *name_and_crc;
22107 u32 message_index;
22108
22109 if (unformat (vam->input, "%s", &name_and_crc))
22110 {
Florin Corase86a8ed2018-01-05 03:20:25 -080022111 message_index = vl_msg_api_get_msg_index (name_and_crc);
Damjan Marion7cd468a2016-12-19 23:05:39 +010022112 if (message_index == ~0)
22113 {
22114 print (vam->ofp, " '%s' not found", name_and_crc);
22115 return 0;
22116 }
22117 print (vam->ofp, " '%s' has message index %d",
22118 name_and_crc, message_index);
22119 return 0;
22120 }
22121 errmsg ("name_and_crc required...");
22122 return 0;
22123}
22124
22125static int
22126search_node_table (vat_main_t * vam)
22127{
22128 unformat_input_t *line_input = vam->input;
22129 u8 *node_to_find;
22130 int j;
22131 vlib_node_t *node, *next_node;
22132 uword *p;
22133
22134 if (vam->graph_node_index_by_name == 0)
22135 {
22136 print (vam->ofp, "Node table empty, issue get_node_graph...");
22137 return 0;
22138 }
22139
22140 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
22141 {
22142 if (unformat (line_input, "%s", &node_to_find))
22143 {
22144 vec_add1 (node_to_find, 0);
22145 p = hash_get_mem (vam->graph_node_index_by_name, node_to_find);
22146 if (p == 0)
22147 {
22148 print (vam->ofp, "%s not found...", node_to_find);
22149 goto out;
22150 }
Dave Barach1ddbc012018-06-13 09:26:05 -040022151 node = vam->graph_nodes[0][p[0]];
Damjan Marion7cd468a2016-12-19 23:05:39 +010022152 print (vam->ofp, "[%d] %s", p[0], node->name);
22153 for (j = 0; j < vec_len (node->next_nodes); j++)
22154 {
22155 if (node->next_nodes[j] != ~0)
22156 {
Dave Barach1ddbc012018-06-13 09:26:05 -040022157 next_node = vam->graph_nodes[0][node->next_nodes[j]];
Damjan Marion7cd468a2016-12-19 23:05:39 +010022158 print (vam->ofp, " [%d] %s", j, next_node->name);
22159 }
22160 }
22161 }
22162
22163 else
22164 {
22165 clib_warning ("parse error '%U'", format_unformat_error,
22166 line_input);
22167 return -99;
22168 }
22169
22170 out:
22171 vec_free (node_to_find);
22172
22173 }
22174
22175 return 0;
22176}
22177
22178
22179static int
22180script (vat_main_t * vam)
22181{
22182#if (VPP_API_TEST_BUILTIN==0)
22183 u8 *s = 0;
22184 char *save_current_file;
22185 unformat_input_t save_input;
22186 jmp_buf save_jump_buf;
22187 u32 save_line_number;
22188
22189 FILE *new_fp, *save_ifp;
22190
22191 if (unformat (vam->input, "%s", &s))
22192 {
22193 new_fp = fopen ((char *) s, "r");
22194 if (new_fp == 0)
22195 {
22196 errmsg ("Couldn't open script file %s", s);
22197 vec_free (s);
22198 return -99;
22199 }
22200 }
22201 else
22202 {
22203 errmsg ("Missing script name");
22204 return -99;
22205 }
22206
22207 clib_memcpy (&save_input, &vam->input, sizeof (save_input));
22208 clib_memcpy (&save_jump_buf, &vam->jump_buf, sizeof (save_jump_buf));
22209 save_ifp = vam->ifp;
22210 save_line_number = vam->input_line_number;
22211 save_current_file = (char *) vam->current_file;
22212
22213 vam->input_line_number = 0;
22214 vam->ifp = new_fp;
22215 vam->current_file = s;
22216 do_one_file (vam);
22217
Sirshak Dasb0861822018-05-29 21:13:21 -050022218 clib_memcpy (&vam->input, &save_input, sizeof (save_input));
Damjan Marion7cd468a2016-12-19 23:05:39 +010022219 clib_memcpy (&vam->jump_buf, &save_jump_buf, sizeof (save_jump_buf));
22220 vam->ifp = save_ifp;
22221 vam->input_line_number = save_line_number;
22222 vam->current_file = (u8 *) save_current_file;
22223 vec_free (s);
22224
22225 return 0;
22226#else
22227 clib_warning ("use the exec command...");
22228 return -99;
22229#endif
22230}
22231
22232static int
22233echo (vat_main_t * vam)
22234{
22235 print (vam->ofp, "%v", vam->input->buffer);
22236 return 0;
22237}
22238
22239/* List of API message constructors, CLI names map to api_xxx */
22240#define foreach_vpe_api_msg \
Jon Loeligerc83c3b72017-02-23 13:57:35 -060022241_(create_loopback,"[mac <mac-addr>] [instance <instance>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022242_(sw_interface_dump,"") \
22243_(sw_interface_set_flags, \
22244 "<intfc> | sw_if_index <id> admin-up | admin-down link-up | link down") \
22245_(sw_interface_add_del_address, \
22246 "<intfc> | sw_if_index <id> <ip4-address> | <ip6-address> [del] [del-all] ") \
Stevenad8015b2017-10-29 22:10:46 -070022247_(sw_interface_set_rx_mode, \
22248 "<intfc> | sw_if_index <id> [queue <id>] <polling | interrupt | adaptive>") \
Mohsin Kazmi54f7c512018-08-23 18:28:11 +020022249_(sw_interface_set_rx_placement, \
22250 "<intfc> | sw_if_index <id> [queue <id>] [worker <id> | main]") \
Mohsin Kazmif0b42f42018-09-10 18:11:00 +020022251_(sw_interface_rx_placement_dump, \
22252 "[<intfc> | sw_if_index <id>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022253_(sw_interface_set_table, \
22254 "<intfc> | sw_if_index <id> vrf <table-id> [ipv6]") \
22255_(sw_interface_set_mpls_enable, \
22256 "<intfc> | sw_if_index [disable | dis]") \
22257_(sw_interface_set_vpath, \
22258 "<intfc> | sw_if_index <id> enable | disable") \
22259_(sw_interface_set_vxlan_bypass, \
John Lo2b81eb82017-01-30 13:12:10 -050022260 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
Marco Varleseb598f1d2017-09-19 14:25:28 +020022261_(sw_interface_set_geneve_bypass, \
22262 "<intfc> | sw_if_index <id> [ip4 | ip6] [enable | disable]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022263_(sw_interface_set_l2_xconnect, \
22264 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22265 "enable | disable") \
22266_(sw_interface_set_l2_bridge, \
Eyal Barif24991c2017-04-05 05:33:21 +030022267 "{<intfc> | sw_if_index <id>} bd_id <bridge-domain-id>\n" \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022268 "[shg <split-horizon-group>] [bvi]\n" \
22269 "enable | disable") \
Eyal Barif24991c2017-04-05 05:33:21 +030022270_(bridge_domain_set_mac_age, "bd_id <bridge-domain-id> mac-age 0-255") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022271_(bridge_domain_add_del, \
John Lo70bfcaf2017-11-14 13:19:26 -050022272 "bd_id <bridge-domain-id> [flood 1|0] [uu-flood 1|0] [forward 1|0] [learn 1|0] [arp-term 1|0] [mac-age 0-255] [bd-tag <text>] [del]\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022273_(bridge_domain_dump, "[bd_id <bridge-domain-id>]\n") \
22274_(l2fib_add_del, \
22275 "mac <mac-addr> bd_id <bridge-domain-id> [del] | sw_if <intfc> | sw_if_index <id> [static] [filter] [bvi] [count <nn>]\n") \
Eyal Barif24991c2017-04-05 05:33:21 +030022276_(l2fib_flush_bd, "bd_id <bridge-domain-id>") \
22277_(l2fib_flush_int, "<intfc> | sw_if_index <id>") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022278_(l2_flags, \
John Lo8d00fff2017-08-03 00:35:36 -040022279 "sw_if <intfc> | sw_if_index <id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022280_(bridge_flags, \
22281 "bd_id <bridge-domain-id> [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \
Damjan Marion8389fb92017-10-13 18:29:53 +020022282_(tap_create_v2, \
Steven9e635692018-03-01 09:36:01 -080022283 "id <num> [hw-addr <mac-addr>] [host-ns <name>] [rx-ring-size <num> [tx-ring-size <num>]") \
Damjan Marion8389fb92017-10-13 18:29:53 +020022284_(tap_delete_v2, \
22285 "<vpp-if-name> | sw_if_index <id>") \
22286_(sw_interface_tap_v2_dump, "") \
Mohsin Kazmi03ae24b2019-01-18 11:50:00 +010022287_(virtio_pci_create, \
22288 "pci-addr <pci-address> [use_random_mac | hw-addr <mac-addr>] [tx-ring-size <num> [rx-ring-size <num>] [features <hex-value>]") \
22289_(virtio_pci_delete, \
22290 "<vpp-if-name> | sw_if_index <id>") \
22291_(sw_interface_virtio_pci_dump, "") \
Steven9cd2d7a2017-12-20 12:43:01 -080022292_(bond_create, \
22293 "[hw-addr <mac-addr>] {round-robin | active-backup | " \
Alexander Chernavinad9d5282018-12-13 09:08:09 -050022294 "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \
22295 "[id <if-id>]") \
Steven9cd2d7a2017-12-20 12:43:01 -080022296_(bond_delete, \
22297 "<vpp-if-name> | sw_if_index <id>") \
22298_(bond_enslave, \
22299 "sw_if_index <n> bond <sw_if_index> [is_passive] [is_long_timeout]") \
22300_(bond_detach_slave, \
22301 "sw_if_index <n>") \
22302_(sw_interface_bond_dump, "") \
22303_(sw_interface_slave_dump, \
22304 "<vpp-if-name> | sw_if_index <id>") \
Neale Ranns28ab9cc2017-08-14 07:18:42 -070022305_(ip_table_add_del, \
John Loe166fd92018-09-13 14:08:59 -040022306 "table <n> [ipv6] [add | del]\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022307_(ip_add_del_route, \
John Lo22030432018-09-20 16:07:00 -040022308 "<addr>/<mask> via <<addr>|<intfc>|sw_if_index <id>|via-label <n>>\n" \
22309 "[table-id <n>] [<intfc> | sw_if_index <id>] [resolve-attempts <n>]\n"\
John Lo06fda9c2018-10-03 16:32:44 -040022310 "[weight <n>] [drop] [local] [classify <n>] [out-label <n>]\n" \
22311 "[multipath] [count <n>] [del]") \
Neale Ranns32e1c012016-11-22 17:07:28 +000022312_(ip_mroute_add_del, \
22313 "<src> <grp>/<mask> [table-id <n>]\n" \
22314 "[<intfc> | sw_if_index <id>] [local] [del]") \
Neale Ranns28ab9cc2017-08-14 07:18:42 -070022315_(mpls_table_add_del, \
John Loe166fd92018-09-13 14:08:59 -040022316 "table <n> [add | del]\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022317_(mpls_route_add_del, \
John Loe166fd92018-09-13 14:08:59 -040022318 "<label> <eos> via <addr | next-hop-table <n> | via-label <n> |\n" \
22319 "lookup-ip4-table <n> | lookup-in-ip6-table <n> |\n" \
22320 "l2-input-on <intfc> | l2-input-on sw_if_index <id>>\n" \
22321 "[<intfc> | sw_if_index <id>] [resolve-attempts <n>] [weight <n>]\n" \
John Lo06fda9c2018-10-03 16:32:44 -040022322 "[drop] [local] [classify <n>] [out-label <n>] [multipath]\n" \
22323 "[count <n>] [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022324_(mpls_ip_bind_unbind, \
22325 "<label> <addr/len>") \
22326_(mpls_tunnel_add_del, \
John Lo06fda9c2018-10-03 16:32:44 -040022327 "[add | del <intfc | sw_if_index <id>>] via <addr | via-label <n>>\n" \
22328 "[<intfc> | sw_if_index <id> | next-hop-table <id>]\n" \
22329 "[l2-only] [out-label <n>]") \
John Loe166fd92018-09-13 14:08:59 -040022330_(sr_mpls_policy_add, \
22331 "bsid <id> [weight <n>] [spray] next <sid> [next <sid>]") \
22332_(sr_mpls_policy_del, \
22333 "bsid <id>") \
Neale Rannsd792d9c2017-10-21 10:53:20 -070022334_(bier_table_add_del, \
22335 "<label> <sub-domain> <set> <bsl> [del]") \
22336_(bier_route_add_del, \
22337 "<bit-position> <sub-domain> <set> <bsl> via <addr> [table-id <n>]\n" \
22338 "[<intfc> | sw_if_index <id>]" \
22339 "[weight <n>] [del] [multipath]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022340_(proxy_arp_add_del, \
22341 "<lo-ip4-addr> - <hi-ip4-addr> [vrf <n>] [del]") \
22342_(proxy_arp_intfc_enable_disable, \
22343 "<intfc> | sw_if_index <id> enable | disable") \
22344_(sw_interface_set_unnumbered, \
22345 "<intfc> | sw_if_index <id> unnum_if_index <id> [del]") \
22346_(ip_neighbor_add_del, \
22347 "(<intfc> | sw_if_index <id>) dst <ip46-address> " \
22348 "[mac <mac-addr>] [vrf <vrf-id>] [is_static] [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022349_(create_vlan_subif, "<intfc> | sw_if_index <id> vlan <n>") \
22350_(create_subif, "<intfc> | sw_if_index <id> sub_id <n>\n" \
22351 "[outer_vlan_id <n>][inner_vlan_id <n>]\n" \
22352 "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \
22353 "[outer_vlan_id_any][inner_vlan_id_any]") \
22354_(oam_add_del, "src <ip4-address> dst <ip4-address> [vrf <n>] [del]") \
22355_(reset_fib, "vrf <n> [ipv6]") \
22356_(dhcp_proxy_config, \
22357 "svr <v46-address> src <v46-address>\n" \
Neale Ranns20a175a2017-02-14 07:28:41 -080022358 "rx_vrf_id <nn> server_vrf_id <nn> [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022359_(dhcp_proxy_set_vss, \
John Lo70bfcaf2017-11-14 13:19:26 -050022360 "tbl_id <n> [fib_id <n> oui <n> | vpn_ascii_id <text>] [ipv6] [del]") \
Neale Ranns20a175a2017-02-14 07:28:41 -080022361_(dhcp_proxy_dump, "ip6") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022362_(dhcp_client_config, \
22363 "<intfc> | sw_if_index <id> [hostname <name>] [disable_event] [del]") \
22364_(set_ip_flow_hash, \
22365 "vrf <n> [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \
22366_(sw_interface_ip6_enable_disable, \
22367 "<intfc> | sw_if_index <id> enable | disable") \
Neale Ranns3f844d02017-02-18 00:03:54 -080022368_(ip6nd_proxy_add_del, \
22369 "<intfc> | sw_if_index <id> <ip6-address>") \
22370_(ip6nd_proxy_dump, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022371_(sw_interface_ip6nd_ra_prefix, \
22372 "<intfc> | sw_if_index <id> <ip6-address>/<mask-width>\n" \
22373 "val_life <n> pref_life <n> [def] [noadv] [offl] [noauto]\n" \
22374 "[nolink] [isno]") \
22375_(sw_interface_ip6nd_ra_config, \
22376 "<intfc> | sw_if_index <id> [maxint <n>] [minint <n>]\n" \
22377 "[life <n>] [count <n>] [interval <n>] [suppress]\n" \
22378 "[managed] [other] [ll] [send] [cease] [isno] [def]") \
22379_(set_arp_neighbor_limit, "arp_nbr_limit <n> [ipv6]") \
22380_(l2_patch_add_del, \
22381 "rx <intfc> | rx_sw_if_index <id> tx <intfc> | tx_sw_if_index <id>\n" \
22382 "enable | disable") \
Pablo Camarillofb380952016-12-07 18:34:18 +010022383_(sr_localsid_add_del, \
22384 "(del) address <addr> next_hop <addr> behavior <beh>\n" \
22385 "fib-table <num> (end.psp) sw_if_index <num>") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022386_(classify_add_del_table, \
22387 "buckets <nn> [skip <n>] [match <n>] [memory_size <nn-bytes>]\n" \
22388 " [del] [del-chain] mask <mask-value>\n" \
22389 " [l2-miss-next | miss-next | acl-miss-next] <name|nn>\n" \
22390 " [current-data-flag <n>] [current-data-offset <nn>] [table <nn>]") \
22391_(classify_add_del_session, \
22392 "[hit-next|l2-hit-next|acl-hit-next|policer-hit-next] <name|nn>\n" \
22393 " table-index <nn> skip_n <nn> match_n <nn> match [hex] [l2]\n" \
22394 " [l3 [ip4|ip6]] [action set-ip4-fib-id <nn>]\n" \
22395 " [action set-ip6-fib-id <nn> | action <n> metadata <nn>] [del]") \
22396_(classify_set_interface_ip_table, \
22397 "<intfc> | sw_if_index <nn> table <nn>") \
22398_(classify_set_interface_l2_tables, \
22399 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22400 " [other-table <nn>]") \
22401_(get_node_index, "node <node-name") \
22402_(add_node_next, "node <node-name> next <next-node-name>") \
22403_(l2tpv3_create_tunnel, \
22404 "client_address <ip6-addr> our_address <ip6-addr>\n" \
22405 "[local_session_id <nn>][remote_session_id <nn>][local_cookie <nn>]\n" \
22406 "[remote_cookie <nn>]\n[l2-sublayer-preset]\n") \
22407_(l2tpv3_set_tunnel_cookies, \
22408 "<intfc> | sw_if_index <nn> [new_local_cookie <nn>]\n" \
22409 "[new_remote_cookie <nn>]\n") \
22410_(l2tpv3_interface_enable_disable, \
22411 "<intfc> | sw_if_index <nn> enable | disable") \
22412_(l2tpv3_set_lookup_key, \
22413 "lookup_v6_src | lookup_v6_dst | lookup_session_id") \
22414_(sw_if_l2tpv3_tunnel_dump, "") \
eyal bariaf86a482018-04-17 11:20:27 +030022415_(vxlan_offload_rx, \
22416 "hw { <interface name> | hw_if_index <nn>} " \
22417 "rx { <vxlan tunnel name> | sw_if_index <nn> } [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022418_(vxlan_add_del_tunnel, \
22419 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
Jon Loeliger3d460bd2018-02-01 16:36:12 -060022420 "{ <intfc> | mcast_sw_if_index <nn> } [instance <id>]}\n" \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022421 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
Marco Varleseb598f1d2017-09-19 14:25:28 +020022422_(geneve_add_del_tunnel, \
22423 "src <ip-addr> { dst <ip-addr> | group <mcast-ip-addr>\n" \
22424 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22425 "vni <vni> [encap-vrf-id <nn>] [decap-next <l2|nn>] [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022426_(vxlan_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
Marco Varleseb598f1d2017-09-19 14:25:28 +020022427_(geneve_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022428_(gre_add_del_tunnel, \
John Loa43ccae2018-02-13 17:15:23 -050022429 "src <ip-addr> dst <ip-addr> [outer-fib-id <nn>] [instance <n>]\n" \
22430 "[teb | erspan <session-id>] [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022431_(gre_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22432_(l2_fib_clear_table, "") \
22433_(l2_interface_efp_filter, "sw_if_index <nn> enable | disable") \
22434_(l2_interface_vlan_tag_rewrite, \
22435 "<intfc> | sw_if_index <nn> \n" \
22436 "[disable][push-[1|2]][pop-[1|2]][translate-1-[1|2]] \n" \
22437 "[translate-2-[1|2]] [push_dot1q 0] tag1 <nn> tag2 <nn>") \
22438_(create_vhost_user_if, \
22439 "socket <filename> [server] [renumber <dev_instance>] " \
Mohsin Kazmiee2e58f2018-08-21 16:07:03 +020022440 "[disable_mrg_rxbuf] [disable_indirect_desc] " \
Stevenf3b53642017-05-01 14:03:02 -070022441 "[mac <mac_address>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022442_(modify_vhost_user_if, \
22443 "<intfc> | sw_if_index <nn> socket <filename>\n" \
Stevenf3b53642017-05-01 14:03:02 -070022444 "[server] [renumber <dev_instance>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022445_(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
22446_(sw_interface_vhost_user_dump, "") \
22447_(show_version, "") \
Mohsin Kazmi5d64c782018-09-11 20:27:09 +020022448_(show_threads, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022449_(vxlan_gpe_add_del_tunnel, \
Hongjun Ni04ffd0ad2017-06-23 00:18:40 +080022450 "local <addr> remote <addr> | group <mcast-ip-addr>\n" \
22451 "{ <intfc> | mcast_sw_if_index <nn> } }\n" \
22452 "vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
22453 "[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022454_(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
22455_(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
22456_(interface_name_renumber, \
22457 "<intfc> | sw_if_index <nn> new_show_dev_instance <nn>") \
22458_(input_acl_set_interface, \
22459 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22460 " [l2-table <nn>] [del]") \
John Loc7b43042018-04-13 16:46:22 -040022461_(ip_probe_neighbor, "(<intc> | sw_if_index <nn>) address <ip4|ip6-addr>") \
John Lo7f358b32018-04-28 01:19:24 -040022462_(ip_scan_neighbor_enable_disable, "[ip4|ip6|both|disable] [interval <n-min>]\n" \
22463 " [max-time <n-usec>] [max-update <n>] [delay <n-msec>] [stale <n-min>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022464_(want_ip4_arp_events, "address <ip4-address> [del]") \
22465_(want_ip6_nd_events, "address <ip6-address> [del]") \
John Lo8d00fff2017-08-03 00:35:36 -040022466_(want_l2_macs_events, "[disable] [learn-limit <n>] [scan-delay <n>] [max-entries <n>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022467_(ip_address_dump, "(ipv4 | ipv6) (<intfc> | sw_if_index <id>)") \
22468_(ip_dump, "ipv4 | ipv6") \
22469_(ipsec_spd_add_del, "spd_id <n> [del]") \
22470_(ipsec_interface_add_del_spd, "(<intfc> | sw_if_index <id>)\n" \
22471 " spid_id <n> ") \
Neale Ranns17dcec02019-01-09 21:22:20 -080022472_(ipsec_sad_entry_add_del, "sad_id <n> spi <n> crypto_alg <alg>\n" \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022473 " crypto_key <hex> tunnel_src <ip4|ip6> tunnel_dst <ip4|ip6>\n" \
22474 " integ_alg <alg> integ_key <hex>") \
Neale Ranns17dcec02019-01-09 21:22:20 -080022475_(ipsec_spd_entry_add_del, "spd_id <n> priority <n> action <action>\n" \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022476 " (inbound|outbound) [sa_id <n>] laddr_start <ip4|ip6>\n" \
22477 " laddr_stop <ip4|ip6> raddr_start <ip4|ip6> raddr_stop <ip4|ip6>\n" \
22478 " [lport_start <n> lport_stop <n>] [rport_start <n> rport_stop <n>]" ) \
22479_(ipsec_sa_set_key, "sa_id <n> crypto_key <hex> integ_key <hex>") \
Matthew Smithb0972cb2017-05-02 16:20:41 -050022480_(ipsec_tunnel_if_add_del, "local_spi <n> remote_spi <n>\n" \
22481 " crypto_alg <alg> local_crypto_key <hex> remote_crypto_key <hex>\n" \
22482 " integ_alg <alg> local_integ_key <hex> remote_integ_key <hex>\n" \
Matthew Smith8e1039a2018-04-12 07:32:56 -050022483 " local_ip <addr> remote_ip <addr> [esn] [anti_replay] [del]\n" \
22484 " [instance <n>]") \
Matthew Smith28029532017-09-26 13:33:44 -050022485_(ipsec_sa_dump, "[sa_id <n>]") \
Matthew Smith75d85602017-10-05 19:03:05 -050022486_(ipsec_tunnel_if_set_key, "<intfc> <local|remote> <crypto|integ>\n" \
22487 " <alg> <hex>\n") \
Matthew Smithca514fd2017-10-12 12:06:59 -050022488_(ipsec_tunnel_if_set_sa, "<intfc> sa_id <n> <inbound|outbound>\n") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022489_(delete_loopback,"sw_if_index <nn>") \
22490_(bd_ip_mac_add_del, "bd_id <bridge-domain-id> <ip4/6-addr> <mac-addr> [del]") \
John Loe26c81f2019-01-07 15:16:33 -050022491_(bd_ip_mac_flush, "bd_id <bridge-domain-id>") \
22492_(bd_ip_mac_dump, "[bd_id] <bridge-domain-id>") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022493_(want_interface_events, "enable|disable") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022494_(get_first_msg_id, "client <name>") \
22495_(cop_interface_enable_disable, "<intfc> | sw_if_index <nn> [disable]") \
22496_(cop_whitelist_enable_disable, "<intfc> | sw_if_index <nn>\n" \
22497 "fib-id <nn> [ip4][ip6][default]") \
22498_(get_node_graph, " ") \
22499_(sw_interface_clear_stats,"<intfc> | sw_if_index <nn>") \
22500_(ioam_enable, "[trace] [pow] [ppc <encap|decap>]") \
22501_(ioam_disable, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022502_(one_add_del_locator_set, "locator-set <locator_name> [iface <intf> |" \
22503 " sw_if_index <sw_if_index> p <priority> " \
22504 "w <weight>] [del]") \
22505_(one_add_del_locator, "locator-set <locator_name> " \
22506 "iface <intf> | sw_if_index <sw_if_index> " \
22507 "p <priority> w <weight> [del]") \
22508_(one_add_del_local_eid,"vni <vni> eid " \
22509 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22510 "locator-set <locator_name> [del]" \
22511 "[key-id sha1|sha256 secret-key <secret-key>]")\
22512_(one_add_del_map_resolver, "<ip4|6-addr> [del]") \
22513_(one_add_del_map_server, "<ip4|6-addr> [del]") \
22514_(one_enable_disable, "enable|disable") \
22515_(one_map_register_enable_disable, "enable|disable") \
Filip Tehlar7048ff12017-07-27 08:09:14 +020022516_(one_map_register_fallback_threshold, "<value>") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022517_(one_rloc_probe_enable_disable, "enable|disable") \
22518_(one_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22519 "[seid <seid>] " \
22520 "rloc <locator> p <prio> " \
22521 "w <weight> [rloc <loc> ... ] " \
22522 "action <action> [del-all]") \
22523_(one_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22524 "<local-eid>") \
22525_(one_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
Filip Tehlar67a99f82017-03-10 13:18:02 +010022526_(one_use_petr, "ip-address> | disable") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022527_(one_map_request_mode, "src-dst|dst-only") \
22528_(one_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22529_(one_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22530_(one_locator_set_dump, "[local | remote]") \
22531_(one_locator_dump, "ls_index <index> | ls_name <name>") \
22532_(one_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22533 "[local] | [remote]") \
Filip Tehlar05879992017-09-05 15:46:09 +020022534_(one_add_del_ndp_entry, "[del] mac <mac> bd <bd> ip6 <ip6>") \
22535_(one_ndp_bd_get, "") \
22536_(one_ndp_entries_get, "bd <bridge-domain>") \
Filip Tehlard5a65db2017-05-17 17:21:10 +020022537_(one_add_del_l2_arp_entry, "[del] mac <mac> bd <bd> ip4 <ip4>") \
22538_(one_l2_arp_bd_get, "") \
22539_(one_l2_arp_entries_get, "bd <bridge-domain>") \
Paul Vinciguerraec11b132018-09-24 05:25:00 -070022540_(one_stats_enable_disable, "enable|disable") \
Filip Tehlar4868ff62017-03-09 16:48:39 +010022541_(show_one_stats_enable_disable, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022542_(one_eid_table_vni_dump, "") \
22543_(one_eid_table_map_dump, "l2|l3") \
22544_(one_map_resolver_dump, "") \
22545_(one_map_server_dump, "") \
22546_(one_adjacencies_get, "vni <vni>") \
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020022547_(one_nsh_set_locator_set, "[del] ls <locator-set-name>") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022548_(show_one_rloc_probe_state, "") \
22549_(show_one_map_register_state, "") \
22550_(show_one_status, "") \
Filip Tehlar4868ff62017-03-09 16:48:39 +010022551_(one_stats_dump, "") \
Filip Tehlar21511912017-04-07 10:41:42 +020022552_(one_stats_flush, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022553_(one_get_map_request_itr_rlocs, "") \
Filip Tehlar1e553a02017-08-02 12:45:07 +020022554_(one_map_register_set_ttl, "<ttl>") \
Filip Tehlara4980b82017-09-27 14:32:02 +020022555_(one_set_transport_protocol, "udp|api") \
22556_(one_get_transport_protocol, "") \
Filip Tehlar0a8840d2017-10-16 05:48:23 -070022557_(one_enable_disable_xtr_mode, "enable|disable") \
22558_(one_show_xtr_mode, "") \
22559_(one_enable_disable_pitr_mode, "enable|disable") \
22560_(one_show_pitr_mode, "") \
22561_(one_enable_disable_petr_mode, "enable|disable") \
22562_(one_show_petr_mode, "") \
Filip Tehlaref2a5bf2017-05-30 07:14:46 +020022563_(show_one_nsh_mapping, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022564_(show_one_pitr, "") \
Filip Tehlar67a99f82017-03-10 13:18:02 +010022565_(show_one_use_petr, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022566_(show_one_map_request_mode, "") \
Filip Tehlar1e553a02017-08-02 12:45:07 +020022567_(show_one_map_register_ttl, "") \
Filip Tehlar7048ff12017-07-27 08:09:14 +020022568_(show_one_map_register_fallback_threshold, "") \
Filip Tehlar694396d2017-02-17 14:29:11 +010022569_(lisp_add_del_locator_set, "locator-set <locator_name> [iface <intf> |"\
Damjan Marion7cd468a2016-12-19 23:05:39 +010022570 " sw_if_index <sw_if_index> p <priority> " \
22571 "w <weight>] [del]") \
22572_(lisp_add_del_locator, "locator-set <locator_name> " \
22573 "iface <intf> | sw_if_index <sw_if_index> " \
22574 "p <priority> w <weight> [del]") \
22575_(lisp_add_del_local_eid,"vni <vni> eid " \
22576 "<ipv4|ipv6>/<prefix> | <L2 address> " \
22577 "locator-set <locator_name> [del]" \
22578 "[key-id sha1|sha256 secret-key <secret-key>]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022579_(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \
22580_(lisp_add_del_map_server, "<ip4|6-addr> [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022581_(lisp_enable_disable, "enable|disable") \
22582_(lisp_map_register_enable_disable, "enable|disable") \
22583_(lisp_rloc_probe_enable_disable, "enable|disable") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022584_(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \
22585 "[seid <seid>] " \
22586 "rloc <locator> p <prio> " \
22587 "w <weight> [rloc <loc> ... ] " \
22588 "action <action> [del-all]") \
22589_(lisp_add_del_adjacency, "add|del vni <vni> reid <remote-eid> leid " \
22590 "<local-eid>") \
22591_(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \
Filip Tehlar67a99f82017-03-10 13:18:02 +010022592_(lisp_use_petr, "<ip-address> | disable") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022593_(lisp_map_request_mode, "src-dst|dst-only") \
22594_(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \
22595_(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \
22596_(lisp_locator_set_dump, "[local | remote]") \
22597_(lisp_locator_dump, "ls_index <index> | ls_name <name>") \
22598_(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \
22599 "[local] | [remote]") \
22600_(lisp_eid_table_vni_dump, "") \
22601_(lisp_eid_table_map_dump, "l2|l3") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022602_(lisp_map_resolver_dump, "") \
22603_(lisp_map_server_dump, "") \
22604_(lisp_adjacencies_get, "vni <vni>") \
Filip Tehlar0eb874e2017-05-18 14:23:32 +020022605_(gpe_fwd_entry_vnis_get, "") \
Filip Tehlarb4243aa2017-06-14 14:39:42 +020022606_(gpe_native_fwd_rpaths_get, "ip4 | ip6") \
22607_(gpe_add_del_native_fwd_rpath, "[del] via <nh-ip-addr> [iface] " \
22608 "[table <table-id>]") \
Filip Tehlar5fae99c2017-01-18 12:57:37 +010022609_(lisp_gpe_fwd_entries_get, "vni <vni>") \
22610_(lisp_gpe_fwd_entry_path_dump, "index <fwd_entry_index>") \
Filip Tehlar3e7b56932017-02-21 18:28:34 +010022611_(gpe_set_encap_mode, "lisp|vxlan") \
22612_(gpe_get_encap_mode, "") \
Filip Tehlar82786c42017-02-20 15:20:37 +010022613_(lisp_gpe_add_del_iface, "up|down") \
22614_(lisp_gpe_enable_disable, "enable|disable") \
22615_(lisp_gpe_add_del_fwd_entry, "reid <eid> [leid <eid>] vni <vni>" \
22616 "vrf/bd <dp_table> loc-pair <lcl_loc> <rmt_loc> w <weight>... [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022617_(show_lisp_rloc_probe_state, "") \
22618_(show_lisp_map_register_state, "") \
22619_(show_lisp_status, "") \
22620_(lisp_get_map_request_itr_rlocs, "") \
22621_(show_lisp_pitr, "") \
Filip Tehlar67a99f82017-03-10 13:18:02 +010022622_(show_lisp_use_petr, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022623_(show_lisp_map_request_mode, "") \
22624_(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
22625_(af_packet_delete, "name <host interface name>") \
Mohsin Kazmi04e0bb22018-05-28 18:55:37 +020022626_(af_packet_dump, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022627_(policer_add_del, "name <policer name> <params> [del]") \
22628_(policer_dump, "[name <policer name>]") \
22629_(policer_classify_set_interface, \
22630 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22631 " [l2-table <nn>] [del]") \
22632_(policer_classify_dump, "type [ip4|ip6|l2]") \
22633_(netmap_create, "name <interface name> [hw-addr <mac>] [pipe] " \
22634 "[master|slave]") \
22635_(netmap_delete, "name <interface name>") \
22636_(mpls_tunnel_dump, "tunnel_index <tunnel-id>") \
22637_(mpls_fib_dump, "") \
22638_(classify_table_ids, "") \
22639_(classify_table_by_interface, "sw_if_index <sw_if_index>") \
22640_(classify_table_info, "table_id <nn>") \
22641_(classify_session_dump, "table_id <nn>") \
22642_(set_ipfix_exporter, "collector_address <ip4> [collector_port <nn>] " \
22643 "src_address <ip4> [vrf_id <nn>] [path_mtu <nn>] " \
22644 "[template_interval <nn>] [udp_checksum]") \
22645_(ipfix_exporter_dump, "") \
22646_(set_ipfix_classify_stream, "[domain <domain-id>] [src_port <src-port>]") \
22647_(ipfix_classify_stream_dump, "") \
22648_(ipfix_classify_table_add_del, "table <table-index> ip4|ip6 [tcp|udp]") \
22649_(ipfix_classify_table_dump, "") \
Eyal Bari001fd402017-07-16 09:34:53 +030022650_(sw_interface_span_enable_disable, "[l2] [src <intfc> | src_sw_if_index <id>] [disable | [[dst <intfc> | dst_sw_if_index <id>] [both|rx|tx]]]") \
Eyal Bari5b311202017-07-31 13:12:30 +030022651_(sw_interface_span_dump, "[l2]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022652_(get_next_index, "node-name <node-name> next-node-name <node-name>") \
22653_(pg_create_interface, "if_id <nn>") \
22654_(pg_capture, "if_id <nnn> pcap <file_name> count <nnn> [disable]") \
22655_(pg_enable_disable, "[stream <id>] disable") \
22656_(ip_source_and_port_range_check_add_del, \
22657 "<ip-addr>/<mask> range <nn>-<nn> vrf <id>") \
22658_(ip_source_and_port_range_check_interface_add_del, \
22659 "<intf> | sw_if_index <nn> [tcp-out-vrf <id>] [tcp-in-vrf <id>]" \
22660 "[udp-in-vrf <id>] [udp-out-vrf <id>]") \
22661_(ipsec_gre_add_del_tunnel, \
22662 "src <addr> dst <addr> local_sa <sa-id> remote_sa <sa-id> [del]") \
22663_(ipsec_gre_tunnel_dump, "[sw_if_index <nn>]") \
22664_(delete_subif,"<intfc> | sw_if_index <nn>") \
22665_(l2_interface_pbb_tag_rewrite, \
22666 "<intfc> | sw_if_index <nn> \n" \
22667 "[disable | push | pop | translate_pbb_stag <outer_tag>] \n" \
22668 "dmac <mac> smac <mac> sid <nn> [vlanid <nn>]") \
Pavel Kotuceke88865d2018-11-28 07:42:11 +010022669_(set_punt, "protocol <l4-protocol> [ip <ver>] [port <l4-port>] [del]") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022670_(flow_classify_set_interface, \
22671 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>] [del]") \
22672_(flow_classify_dump, "type [ip4|ip6]") \
22673_(ip_fib_dump, "") \
Neale Ranns5a8123b2017-01-26 01:18:23 -080022674_(ip_mfib_dump, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022675_(ip6_fib_dump, "") \
Neale Ranns5a8123b2017-01-26 01:18:23 -080022676_(ip6_mfib_dump, "") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022677_(feature_enable_disable, "arc_name <arc_name> " \
22678 "feature_name <feature_name> <intfc> | sw_if_index <nn> [disable]") \
22679_(sw_interface_tag_add_del, "<intfc> | sw_if_index <nn> tag <text>" \
22680"[disable]") \
22681_(l2_xconnect_dump, "") \
Ole Troand7231612018-06-07 10:17:57 +020022682_(hw_interface_set_mtu, "<intfc> | hw_if_index <nn> mtu <nn>") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022683_(ip_neighbor_dump, "[ip6] <intfc> | sw_if_index <nn>") \
Pavel Kotucek6899a302017-06-08 08:46:10 +020022684_(sw_interface_get_table, "<intfc> | sw_if_index <id> [ipv6]") \
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020022685_(p2p_ethernet_add, "<intfc> | sw_if_index <nn> remote_mac <mac-address> sub_id <id>") \
Steve Shin99a0e602017-07-01 04:16:20 +000022686_(p2p_ethernet_del, "<intfc> | sw_if_index <nn> remote_mac <mac-address>") \
Pavel Kotucek15ac81c2017-06-20 14:00:26 +020022687_(lldp_config, "system-name <name> tx-hold <nn> tx-interval <nn>") \
Steve Shin9a6fcef2017-10-11 13:55:16 -070022688_(sw_interface_set_lldp, "<intfc> | sw_if_index <nn> [port-desc <description>]\n" \
22689 " [mgmt-ip4 <ip4>] [mgmt-ip6 <ip6>] [mgmt-oid <object id>] [disable]") \
Dave Barach59b25652017-09-10 15:04:27 -040022690_(tcp_configure_src_addresses, "<ip4|6>first-<ip4|6>last [vrf <id>]") \
Florin Coras90a63982017-12-19 04:50:01 -080022691_(sock_init_shm, "size <nnn>") \
Florin Corascea194d2017-10-02 00:18:51 -070022692_(app_namespace_add_del, "[add] id <ns-id> secret <nn> sw_if_index <nn>")\
Dave Barach65457162017-10-10 17:53:14 -040022693_(dns_enable_disable, "[enable][disable]") \
22694_(dns_name_server_add_del, "<ip-address> [del]") \
Dave Barachd2080152017-10-20 09:21:35 -040022695_(dns_resolve_name, "<hostname>") \
Florin Coras1c710452017-10-17 00:03:13 -070022696_(dns_resolve_ip, "<ip4|ip6>") \
22697_(dns_name_server_add_del, "<ip-address> [del]") \
22698_(dns_resolve_name, "<hostname>") \
22699_(session_rule_add_del, "[add|del] proto <tcp/udp> <lcl-ip>/<plen> " \
22700 "<lcl-port> <rmt-ip>/<plen> <rmt-port> action <nn>") \
Florin Coras6c36f532017-11-03 18:32:34 -070022701_(session_rules_dump, "") \
Florin Coras595992c2017-11-06 17:17:08 -080022702_(ip_container_proxy_add_del, "[add|del] <address> <sw_if_index>") \
Andrew Yourtchenko815d7d52018-02-07 11:37:02 +010022703_(output_acl_set_interface, \
22704 "<intfc> | sw_if_index <nn> [ip4-table <nn>] [ip6-table <nn>]\n" \
22705 " [l2-table <nn>] [del]") \
Ole Troane906aac2018-06-14 14:42:14 +020022706_(qos_record_enable_disable, "<record-source> <intfc> | sw_if_index <id> [disable]")
Damjan Marion7cd468a2016-12-19 23:05:39 +010022707
22708/* List of command functions, CLI names map directly to functions */
22709#define foreach_cli_function \
22710_(comment, "usage: comment <ignore-rest-of-line>") \
22711_(dump_interface_table, "usage: dump_interface_table") \
22712_(dump_sub_interface_table, "usage: dump_sub_interface_table") \
22713_(dump_ipv4_table, "usage: dump_ipv4_table") \
22714_(dump_ipv6_table, "usage: dump_ipv6_table") \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022715_(dump_macro_table, "usage: dump_macro_table ") \
22716_(dump_node_table, "usage: dump_node_table") \
22717_(dump_msg_api_table, "usage: dump_msg_api_table") \
22718_(get_msg_id, "usage: get_msg_id name_and_crc") \
22719_(echo, "usage: echo <message>") \
22720_(exec, "usage: exec <vpe-debug-CLI-command>") \
22721_(exec_inband, "usage: exec_inband <vpe-debug-CLI-command>") \
22722_(help, "usage: help") \
22723_(q, "usage: quit") \
22724_(quit, "usage: quit") \
22725_(search_node_table, "usage: search_node_table <name>...") \
22726_(set, "usage: set <variable-name> <value>") \
22727_(script, "usage: script <file-name>") \
Dave Barach048a4e52018-06-01 18:52:25 -040022728_(statseg, "usage: statseg"); \
Damjan Marion7cd468a2016-12-19 23:05:39 +010022729_(unset, "usage: unset <variable-name>")
Dave Barach048a4e52018-06-01 18:52:25 -040022730
Damjan Marion7cd468a2016-12-19 23:05:39 +010022731#define _(N,n) \
22732 static void vl_api_##n##_t_handler_uni \
22733 (vl_api_##n##_t * mp) \
22734 { \
22735 vat_main_t * vam = &vat_main; \
22736 if (vam->json_output) { \
22737 vl_api_##n##_t_handler_json(mp); \
22738 } else { \
22739 vl_api_##n##_t_handler(mp); \
22740 } \
22741 }
22742foreach_vpe_api_reply_msg;
Dave Baracha1a093d2017-03-02 13:13:23 -050022743#if VPP_API_TEST_BUILTIN == 0
22744foreach_standalone_reply_msg;
22745#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +010022746#undef _
22747
22748void
22749vat_api_hookup (vat_main_t * vam)
22750{
22751#define _(N,n) \
22752 vl_msg_api_set_handlers(VL_API_##N, #n, \
22753 vl_api_##n##_t_handler_uni, \
22754 vl_noop_handler, \
22755 vl_api_##n##_t_endian, \
22756 vl_api_##n##_t_print, \
22757 sizeof(vl_api_##n##_t), 1);
22758 foreach_vpe_api_reply_msg;
Dave Baracha1a093d2017-03-02 13:13:23 -050022759#if VPP_API_TEST_BUILTIN == 0
22760 foreach_standalone_reply_msg;
22761#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +010022762#undef _
22763
22764#if (VPP_API_TEST_BUILTIN==0)
22765 vl_msg_api_set_first_available_msg_id (VL_MSG_FIRST_AVAILABLE);
Damjan Marion7cd468a2016-12-19 23:05:39 +010022766
22767 vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
22768
22769 vam->function_by_name = hash_create_string (0, sizeof (uword));
22770
22771 vam->help_by_name = hash_create_string (0, sizeof (uword));
Dave Barach45e4f362017-03-07 12:52:31 -050022772#endif
Damjan Marion7cd468a2016-12-19 23:05:39 +010022773
22774 /* API messages we can send */
22775#define _(n,h) hash_set_mem (vam->function_by_name, #n, api_##n);
22776 foreach_vpe_api_msg;
22777#undef _
22778
22779 /* Help strings */
22780#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22781 foreach_vpe_api_msg;
22782#undef _
Damjan Marion7cd468a2016-12-19 23:05:39 +010022783
22784 /* CLI functions */
22785#define _(n,h) hash_set_mem (vam->function_by_name, #n, n);
22786 foreach_cli_function;
22787#undef _
22788
22789 /* Help strings */
22790#define _(n,h) hash_set_mem (vam->help_by_name, #n, h);
22791 foreach_cli_function;
22792#undef _
22793}
22794
Dave Baracha1a093d2017-03-02 13:13:23 -050022795#if VPP_API_TEST_BUILTIN
22796static clib_error_t *
22797vat_api_hookup_shim (vlib_main_t * vm)
22798{
22799 vat_api_hookup (&vat_main);
22800 return 0;
22801}
22802
22803VLIB_API_INIT_FUNCTION (vat_api_hookup_shim);
22804#endif
22805
Damjan Marion7cd468a2016-12-19 23:05:39 +010022806/*
22807 * fd.io coding-style-patch-verification: ON
22808 *
22809 * Local Variables:
22810 * eval: (c-set-style "gnu")
22811 * End:
22812 */