1 /* SPDX-License-Identifier: Apache-2.0
2 * Copyright(c) 2021 Cisco Systems, Inc.
3 * Copyright(c) 2022 Nordix Foundation.
7 #include <vlibapi/api.h>
8 #include <vlibmemory/api.h>
9 #include <vppinfra/error.h>
10 #include <vpp/api/types.h>
13 #include <vnet/l2/l2_classify.h>
14 #include <vnet/l2/l2_vtr.h>
15 #include <vnet/ip/ip_types_api.h>
17 #define __plugin_msg_base l2_test_main.msg_id_base
18 #include <vlibapi/vat_helper_macros.h>
20 #include <vlibmemory/vlib.api_enum.h>
21 #include <vlibmemory/vlib.api_types.h>
23 /* Declare message IDs */
24 #include <vnet/format_fns.h>
25 #include <vnet/l2/l2.api_enum.h>
26 #include <vnet/l2/l2.api_types.h>
28 #define vl_endianfun /* define message structures */
29 #include <vnet/l2/l2.api.h>
32 #define vl_calcsizefun
33 #include <vnet/l2/l2.api.h>
38 /* API message ID base */
44 static l2_test_main_t l2_test_main;
47 vl_api_l2_fib_table_details_t_handler (vl_api_l2_fib_table_details_t *mp)
49 vat_main_t *vam = l2_test_main.vat_main;
52 vam->ofp, "%3" PRIu32 " %U %3" PRIu32 " %d %d %d",
53 ntohl (mp->bd_id), format_ethernet_address, mp->mac,
54 ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac, mp->bvi_mac);
58 api_l2_fib_table_dump (vat_main_t *vam)
60 unformat_input_t *i = vam->input;
61 vl_api_l2_fib_table_dump_t *mp;
62 vl_api_control_ping_t *mp_ping;
67 /* Parse args required to build the message */
68 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
70 if (unformat (i, "bd_id %d", &bd_id))
78 errmsg ("missing bridge domain");
82 fformat (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI");
84 /* Get list of l2 fib entries */
85 M (L2_FIB_TABLE_DUMP, mp);
87 mp->bd_id = ntohl (bd_id);
90 /* Use a control ping for synchronization */
91 PING (&l2_test_main, mp_ping);
99 vl_api_l2_xconnect_details_t_handler (vl_api_l2_xconnect_details_t *mp)
101 vat_main_t *vam = l2_test_main.vat_main;
102 fformat (vam->ofp, "%15d%15d", ntohl (mp->rx_sw_if_index),
103 ntohl (mp->tx_sw_if_index));
107 api_l2_xconnect_dump (vat_main_t *vam)
109 vl_api_l2_xconnect_dump_t *mp;
110 vl_api_control_ping_t *mp_ping;
113 if (!vam->json_output)
115 print (vam->ofp, "%15s%15s", "rx_sw_if_index", "tx_sw_if_index");
118 M (L2_XCONNECT_DUMP, mp);
122 /* Use a control ping for synchronization */
123 PING (&l2_test_main, mp_ping);
131 api_want_l2_arp_term_events (vat_main_t *vam)
137 api_want_l2_macs_events (vat_main_t *vam)
139 unformat_input_t *line_input = vam->input;
140 vl_api_want_l2_macs_events_t *mp;
141 u8 enable_disable = 1;
143 u32 max_macs_in_event = 0;
147 while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
149 if (unformat (line_input, "learn-limit %d", &learn_limit))
151 else if (unformat (line_input, "scan-delay %d", &scan_delay))
153 else if (unformat (line_input, "max-entries %d", &max_macs_in_event))
155 else if (unformat (line_input, "disable"))
161 M (WANT_L2_MACS_EVENTS, mp);
162 mp->enable_disable = enable_disable;
163 mp->pid = htonl (getpid ());
164 mp->learn_limit = htonl (learn_limit);
165 mp->scan_delay = (u8) scan_delay;
166 mp->max_macs_in_event = (u8) (max_macs_in_event / 10);
173 api_l2fib_flush_all (vat_main_t *vam)
179 increment_mac_address (u8 *mac)
181 u64 tmp = *((u64 *) mac);
182 tmp = clib_net_to_host_u64 (tmp);
183 tmp += 1 << 16; /* skip unused (least significant) octets */
184 tmp = clib_host_to_net_u64 (tmp);
186 clib_memcpy (mac, &tmp, 6);
190 api_l2fib_add_del (vat_main_t *vam)
192 vnet_main_t *vnm = vnet_get_main ();
193 unformat_input_t *i = vam->input;
194 vl_api_l2fib_add_del_t *mp;
201 u8 sw_if_index_set = 0;
210 /* Parse args required to build the message */
211 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
213 if (unformat (i, "mac %U", unformat_ethernet_address, mac))
215 else if (unformat (i, "bd_id %d", &bd_id))
217 else if (unformat (i, "sw_if_index %d", &sw_if_index))
219 else if (unformat (i, "sw_if"))
221 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
223 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
230 else if (unformat (i, "static"))
232 else if (unformat (i, "filter"))
237 else if (unformat (i, "bvi"))
242 else if (unformat (i, "del"))
244 else if (unformat (i, "count %d", &count))
252 errmsg ("missing mac address");
258 errmsg ("missing bridge domain");
262 if (is_add && sw_if_index_set == 0 && filter_mac == 0)
264 errmsg ("missing interface name or sw_if_index");
270 /* Turn on async mode */
272 vam->async_errors = 0;
273 before = vat_time_now (vam);
276 for (j = 0; j < count; j++)
278 M (L2FIB_ADD_DEL, mp);
280 clib_memcpy (mp->mac, mac, 6);
281 mp->bd_id = ntohl (bd_id);
283 mp->sw_if_index = ntohl (sw_if_index);
287 mp->static_mac = static_mac;
288 mp->filter_mac = filter_mac;
289 mp->bvi_mac = bvi_mac;
291 increment_mac_address (mac);
298 vl_api_control_ping_t *mp_ping;
301 /* Shut off async mode */
304 PING (&l2_test_main, mp_ping);
307 timeout = vat_time_now (vam) + 1.0;
308 while (vat_time_now (vam) < timeout)
309 if (vam->result_ready == 1)
314 if (vam->retval == -99)
317 if (vam->async_errors > 0)
319 errmsg ("%d asynchronous errors", vam->async_errors);
322 vam->async_errors = 0;
323 after = vat_time_now (vam);
325 print (vam->ofp, "%d routes in %.6f secs, %.2f routes/sec", count,
326 after - before, count / (after - before));
332 /* Wait for a reply... */
336 /* Return the good/bad news */
337 return (vam->retval);
341 api_l2fib_flush_int (vat_main_t *vam)
343 vnet_main_t *vnm = vnet_get_main ();
344 unformat_input_t *i = vam->input;
345 vl_api_l2fib_flush_int_t *mp;
346 u32 sw_if_index = ~0;
349 /* Parse args required to build the message */
350 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
352 if (unformat (i, "sw_if_index %d", &sw_if_index))
354 else if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
361 if (sw_if_index == ~0)
363 errmsg ("missing interface name or sw_if_index");
367 M (L2FIB_FLUSH_INT, mp);
369 mp->sw_if_index = ntohl (sw_if_index);
377 api_l2_fib_clear_table (vat_main_t *vam)
379 vl_api_l2_fib_clear_table_t *mp;
382 M (L2_FIB_CLEAR_TABLE, mp);
390 api_bridge_domain_set_mac_age (vat_main_t *vam)
392 unformat_input_t *i = vam->input;
393 vl_api_bridge_domain_set_mac_age_t *mp;
398 /* Parse args required to build the message */
399 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
401 if (unformat (i, "bd_id %d", &bd_id))
403 else if (unformat (i, "mac-age %d", &mac_age))
411 errmsg ("missing bridge domain");
417 errmsg ("mac age must be less than 256 ");
421 M (BRIDGE_DOMAIN_SET_MAC_AGE, mp);
423 mp->bd_id = htonl (bd_id);
424 mp->mac_age = (u8) mac_age;
432 api_l2fib_set_scan_delay (vat_main_t *vam)
438 api_want_l2_macs_events2 (vat_main_t *vam)
444 api_l2_flags (vat_main_t *vam)
446 vnet_main_t *vnm = vnet_get_main ();
447 unformat_input_t *i = vam->input;
448 vl_api_l2_flags_t *mp;
451 u8 sw_if_index_set = 0;
455 /* Parse args required to build the message */
456 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
458 if (unformat (i, "sw_if_index %d", &sw_if_index))
460 else if (unformat (i, "sw_if"))
462 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
464 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
471 else if (unformat (i, "learn"))
473 else if (unformat (i, "forward"))
475 else if (unformat (i, "flood"))
477 else if (unformat (i, "uu-flood"))
478 flags |= L2_UU_FLOOD;
479 else if (unformat (i, "arp-term"))
480 flags |= L2_ARP_TERM;
481 else if (unformat (i, "off"))
483 else if (unformat (i, "disable"))
489 if (sw_if_index_set == 0)
491 errmsg ("missing interface name or sw_if_index");
497 mp->sw_if_index = ntohl (sw_if_index);
498 mp->feature_bitmap = ntohl (flags);
507 vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t *mp)
509 vat_main_t *vam = l2_test_main.vat_main;
510 i32 retval = ntohl (mp->retval);
513 vam->async_errors += (retval < 0);
517 vam->retval = retval;
518 vam->result_ready = 1;
523 api_l2fib_flush_bd (vat_main_t *vam)
525 unformat_input_t *i = vam->input;
526 vl_api_l2fib_flush_bd_t *mp;
530 /* Parse args required to build the message */
531 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
533 if (unformat (i, "bd_id %d", &bd_id))
541 errmsg ("missing bridge domain");
545 M (L2FIB_FLUSH_BD, mp);
547 mp->bd_id = htonl (bd_id);
555 api_bridge_domain_add_del (vat_main_t *vam)
557 unformat_input_t *i = vam->input;
558 vl_api_bridge_domain_add_del_t *mp;
561 u32 flood = 1, forward = 1, learn = 1, uu_flood = 1, arp_term = 0;
566 /* Parse args required to build the message */
567 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
569 if (unformat (i, "bd_id %d", &bd_id))
571 else if (unformat (i, "flood %d", &flood))
573 else if (unformat (i, "uu-flood %d", &uu_flood))
575 else if (unformat (i, "forward %d", &forward))
577 else if (unformat (i, "learn %d", &learn))
579 else if (unformat (i, "arp-term %d", &arp_term))
581 else if (unformat (i, "mac-age %d", &mac_age))
583 else if (unformat (i, "bd-tag %s", &bd_tag))
585 else if (unformat (i, "del"))
588 flood = uu_flood = forward = learn = 0;
596 errmsg ("missing bridge domain");
603 errmsg ("mac age must be less than 256 ");
608 if ((bd_tag) && (vec_len (bd_tag) > 63))
610 errmsg ("bd-tag cannot be longer than 63");
615 M (BRIDGE_DOMAIN_ADD_DEL, mp);
617 mp->bd_id = ntohl (bd_id);
619 mp->uu_flood = uu_flood;
620 mp->forward = forward;
622 mp->arp_term = arp_term;
624 mp->mac_age = (u8) mac_age;
627 clib_memcpy (mp->bd_tag, bd_tag, vec_len (bd_tag));
628 mp->bd_tag[vec_len (bd_tag)] = 0;
639 api_bridge_domain_add_del_v2 (vat_main_t *vam)
645 vl_api_bridge_domain_add_del_v2_reply_t_handler (
646 vl_api_bridge_domain_add_del_v2_reply_t *mp)
650 #define foreach_pbb_vtr_op \
651 _ ("disable", L2_VTR_DISABLED) \
652 _ ("pop", L2_VTR_POP_2) \
653 _ ("push", L2_VTR_PUSH_2)
656 api_l2_interface_pbb_tag_rewrite (vat_main_t *vam)
658 vnet_main_t *vnm = vnet_get_main ();
659 unformat_input_t *i = vam->input;
660 vl_api_l2_interface_pbb_tag_rewrite_t *mp;
661 u32 sw_if_index = ~0, vtr_op = ~0;
664 u8 dmac_set = 0, smac_set = 0;
670 /* Shut up coverity */
671 clib_memset (dmac, 0, sizeof (dmac));
672 clib_memset (smac, 0, sizeof (smac));
674 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
676 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
678 else if (unformat (i, "sw_if_index %d", &sw_if_index))
680 else if (unformat (i, "vtr_op %d", &vtr_op))
683 else if (unformat (i, n)) { vtr_op = v; }
686 else if (unformat (i, "translate_pbb_stag"))
688 if (unformat (i, "%d", &tmp))
690 vtr_op = L2_VTR_TRANSLATE_2_1;
696 "translate_pbb_stag operation requires outer tag definition");
700 else if (unformat (i, "dmac %U", unformat_ethernet_address, dmac))
702 else if (unformat (i, "smac %U", unformat_ethernet_address, smac))
704 else if (unformat (i, "sid %d", &sid));
705 else if (unformat (i, "vlanid %d", &tmp)) vlanid = tmp;
708 clib_warning ("parse error '%U'", format_unformat_error, i);
713 if ((sw_if_index == ~0) || (vtr_op == ~0))
715 errmsg ("missing sw_if_index or vtr operation");
718 if (((vtr_op == L2_VTR_PUSH_2) || (vtr_op == L2_VTR_TRANSLATE_2_2)) &&
719 ((dmac_set == 0) || (smac_set == 0) || (sid == ~0)))
721 errmsg ("push and translate_qinq operations require dmac, smac, sid and "
722 "optionally vlanid");
726 M (L2_INTERFACE_PBB_TAG_REWRITE, mp);
727 mp->sw_if_index = ntohl (sw_if_index);
728 mp->vtr_op = ntohl (vtr_op);
729 mp->outer_tag = ntohs (outer_tag);
730 clib_memcpy (mp->b_dmac, dmac, sizeof (dmac));
731 clib_memcpy (mp->b_smac, smac, sizeof (smac));
732 mp->b_vlanid = ntohs (vlanid);
733 mp->i_sid = ntohl (sid);
741 api_sw_interface_set_l2_xconnect (vat_main_t *vam)
743 vnet_main_t *vnm = vnet_get_main ();
744 unformat_input_t *i = vam->input;
745 vl_api_sw_interface_set_l2_xconnect_t *mp;
747 u8 rx_sw_if_index_set = 0;
749 u8 tx_sw_if_index_set = 0;
753 /* Parse args required to build the message */
754 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
756 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
757 rx_sw_if_index_set = 1;
758 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
759 tx_sw_if_index_set = 1;
760 else if (unformat (i, "rx"))
762 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
764 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
766 rx_sw_if_index_set = 1;
771 else if (unformat (i, "tx"))
773 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
775 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
777 tx_sw_if_index_set = 1;
782 else if (unformat (i, "enable"))
784 else if (unformat (i, "disable"))
790 if (rx_sw_if_index_set == 0)
792 errmsg ("missing rx interface name or rx_sw_if_index");
796 if (enable && (tx_sw_if_index_set == 0))
798 errmsg ("missing tx interface name or tx_sw_if_index");
802 M (SW_INTERFACE_SET_L2_XCONNECT, mp);
804 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
805 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
814 api_l2_interface_efp_filter (vat_main_t *vam)
816 vnet_main_t *vnm = vnet_get_main ();
817 unformat_input_t *i = vam->input;
818 vl_api_l2_interface_efp_filter_t *mp;
821 u8 sw_if_index_set = 0;
824 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
826 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
828 else if (unformat (i, "sw_if_index %d", &sw_if_index))
830 else if (unformat (i, "enable"))
832 else if (unformat (i, "disable"))
836 clib_warning ("parse error '%U'", format_unformat_error, i);
841 if (sw_if_index_set == 0)
843 errmsg ("missing sw_if_index");
847 M (L2_INTERFACE_EFP_FILTER, mp);
849 mp->sw_if_index = ntohl (sw_if_index);
850 mp->enable_disable = enable;
858 vl_api_bd_ip_mac_details_t_handler (vl_api_bd_ip_mac_details_t *mp)
860 vat_main_t *vam = &vat_main;
862 print (vam->ofp, "\n%-5d %U %U", ntohl (mp->entry.bd_id),
863 format_vl_api_mac_address, mp->entry.mac, format_vl_api_address,
868 vl_api_bvi_create_reply_t_handler (vl_api_bvi_create_reply_t *mp)
873 api_sw_interface_set_l2_bridge (vat_main_t *vam)
875 vnet_main_t *vnm = vnet_get_main ();
876 unformat_input_t *i = vam->input;
877 vl_api_sw_interface_set_l2_bridge_t *mp;
878 vl_api_l2_port_type_t port_type;
880 u8 rx_sw_if_index_set = 0;
887 port_type = L2_API_PORT_TYPE_NORMAL;
889 /* Parse args required to build the message */
890 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
892 if (unformat (i, "sw_if_index %d", &rx_sw_if_index))
893 rx_sw_if_index_set = 1;
894 else if (unformat (i, "bd_id %d", &bd_id))
896 else if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
898 rx_sw_if_index_set = 1;
899 else if (unformat (i, "shg %d", &shg))
901 else if (unformat (i, "bvi"))
902 port_type = L2_API_PORT_TYPE_BVI;
903 else if (unformat (i, "uu-fwd"))
904 port_type = L2_API_PORT_TYPE_UU_FWD;
905 else if (unformat (i, "enable"))
907 else if (unformat (i, "disable"))
913 if (rx_sw_if_index_set == 0)
915 errmsg ("missing rx interface name or sw_if_index");
919 if (enable && (bd_id_set == 0))
921 errmsg ("missing bridge domain");
925 M (SW_INTERFACE_SET_L2_BRIDGE, mp);
927 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
928 mp->bd_id = ntohl (bd_id);
930 mp->port_type = ntohl (port_type);
939 api_sw_interface_set_vpath (vat_main_t *vam)
941 vnet_main_t *vnm = vnet_get_main ();
942 unformat_input_t *i = vam->input;
943 vl_api_sw_interface_set_vpath_t *mp;
945 u8 sw_if_index_set = 0;
949 /* Parse args required to build the message */
950 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
952 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
954 else if (unformat (i, "sw_if_index %d", &sw_if_index))
956 else if (unformat (i, "enable"))
958 else if (unformat (i, "disable"))
964 if (sw_if_index_set == 0)
966 errmsg ("missing interface name or sw_if_index");
970 /* Construct the API message */
971 M (SW_INTERFACE_SET_VPATH, mp);
973 mp->sw_if_index = ntohl (sw_if_index);
974 mp->enable = is_enable;
979 /* Wait for a reply... */
985 api_l2_patch_add_del (vat_main_t *vam)
987 vnet_main_t *vnm = vnet_get_main ();
988 unformat_input_t *i = vam->input;
989 vl_api_l2_patch_add_del_t *mp;
991 u8 rx_sw_if_index_set = 0;
993 u8 tx_sw_if_index_set = 0;
997 /* Parse args required to build the message */
998 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1000 if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index))
1001 rx_sw_if_index_set = 1;
1002 else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index))
1003 tx_sw_if_index_set = 1;
1004 else if (unformat (i, "rx"))
1006 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1008 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
1010 rx_sw_if_index_set = 1;
1015 else if (unformat (i, "tx"))
1017 if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1019 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm,
1021 tx_sw_if_index_set = 1;
1026 else if (unformat (i, "del"))
1032 if (rx_sw_if_index_set == 0)
1034 errmsg ("missing rx interface name or rx_sw_if_index");
1038 if (tx_sw_if_index_set == 0)
1040 errmsg ("missing tx interface name or tx_sw_if_index");
1044 M (L2_PATCH_ADD_DEL, mp);
1046 mp->rx_sw_if_index = ntohl (rx_sw_if_index);
1047 mp->tx_sw_if_index = ntohl (tx_sw_if_index);
1048 mp->is_add = is_add;
1056 vl_api_bridge_flags_reply_t_handler (vl_api_bridge_flags_reply_t *mp)
1058 vat_main_t *vam = &vat_main;
1059 i32 retval = ntohl (mp->retval);
1060 if (vam->async_mode)
1062 vam->async_errors += (retval < 0);
1066 vam->retval = retval;
1067 vam->result_ready = 1;
1071 #define foreach_vtr_op \
1072 _ ("disable", L2_VTR_DISABLED) \
1073 _ ("push-1", L2_VTR_PUSH_1) \
1074 _ ("push-2", L2_VTR_PUSH_2) \
1075 _ ("pop-1", L2_VTR_POP_1) \
1076 _ ("pop-2", L2_VTR_POP_2) \
1077 _ ("translate-1-1", L2_VTR_TRANSLATE_1_1) \
1078 _ ("translate-1-2", L2_VTR_TRANSLATE_1_2) \
1079 _ ("translate-2-1", L2_VTR_TRANSLATE_2_1) \
1080 _ ("translate-2-2", L2_VTR_TRANSLATE_2_2)
1083 api_l2_interface_vlan_tag_rewrite (vat_main_t *vam)
1085 vnet_main_t *vnm = vnet_get_main ();
1086 unformat_input_t *i = vam->input;
1087 vl_api_l2_interface_vlan_tag_rewrite_t *mp;
1089 u8 sw_if_index_set = 0;
1097 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1099 if (unformat (i, "%U", unformat_vnet_sw_interface, vnm, &sw_if_index))
1100 sw_if_index_set = 1;
1101 else if (unformat (i, "sw_if_index %d", &sw_if_index))
1102 sw_if_index_set = 1;
1103 else if (unformat (i, "vtr_op %d", &vtr_op))
1106 else if (unformat (i, n)) \
1113 else if (unformat (i, "push_dot1q %d", &push_dot1q));
1114 else if (unformat (i, "tag1 %d", &tag1));
1115 else if (unformat (i, "tag2 %d", &tag2));
1118 clib_warning ("parse error '%U'", format_unformat_error, i);
1123 if ((sw_if_index_set == 0) || (vtr_op_set == 0))
1125 errmsg ("missing vtr operation or sw_if_index");
1129 M (L2_INTERFACE_VLAN_TAG_REWRITE, mp);
1130 mp->sw_if_index = ntohl (sw_if_index);
1131 mp->vtr_op = ntohl (vtr_op);
1132 mp->push_dot1q = ntohl (push_dot1q);
1133 mp->tag1 = ntohl (tag1);
1134 mp->tag2 = ntohl (tag2);
1142 api_bridge_domain_set_learn_limit (vat_main_t *vam)
1148 api_bd_ip_mac_add_del (vat_main_t *vam)
1150 vl_api_address_t ip = VL_API_ZERO_ADDRESS;
1151 vl_api_mac_address_t mac = { 0 };
1152 unformat_input_t *i = vam->input;
1153 vl_api_bd_ip_mac_add_del_t *mp;
1161 /* Parse args required to build the message */
1162 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1164 if (unformat (i, "bd_id %d", &bd_id))
1168 else if (unformat (i, "%U", unformat_vl_api_address, &ip))
1172 else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
1176 else if (unformat (i, "del"))
1184 errmsg ("missing bridge domain");
1187 else if (ip_set == 0)
1189 errmsg ("missing IP address");
1192 else if (mac_set == 0)
1194 errmsg ("missing MAC address");
1198 M (BD_IP_MAC_ADD_DEL, mp);
1200 mp->entry.bd_id = ntohl (bd_id);
1201 mp->is_add = is_add;
1203 clib_memcpy (&mp->entry.ip, &ip, sizeof (ip));
1204 clib_memcpy (&mp->entry.mac, &mac, sizeof (mac));
1212 vl_api_bridge_domain_details_t_handler (vl_api_bridge_domain_details_t *mp)
1214 vat_main_t *vam = l2_test_main.vat_main;
1215 u32 n_sw_ifs = ntohl (mp->n_sw_ifs);
1218 print (vam->ofp, "\n%-3s %-3s %-3s %-3s %-3s %-6s %-3s", " ID", "LRN", "FWD",
1219 "FLD", "BVI", "UU-FWD", "#IF");
1221 print (vam->ofp, "%3d %3d %3d %3d %3d %6d %3d", ntohl (mp->bd_id), mp->learn,
1222 mp->forward, mp->flood, ntohl (mp->bvi_sw_if_index),
1223 ntohl (mp->uu_fwd_sw_if_index), n_sw_ifs);
1227 vl_api_bridge_domain_sw_if_t *sw_ifs;
1228 print (vam->ofp, "\n\n%s %s %s", "sw_if_index", "SHG",
1231 sw_ifs = mp->sw_if_details;
1232 for (i = 0; i < n_sw_ifs; i++)
1238 sw_if_index = ntohl (sw_ifs->sw_if_index);
1240 hash_foreach_pair (p, vam->sw_if_index_by_interface_name, ({
1241 if ((u32) p->value[0] == sw_if_index)
1243 sw_if_name = (u8 *) (p->key);
1247 print (vam->ofp, "%7d %3d %s", sw_if_index, sw_ifs->shg,
1248 sw_if_name ? (char *) sw_if_name : "sw_if_index not found!");
1256 api_bridge_domain_dump (vat_main_t *vam)
1258 unformat_input_t *i = vam->input;
1259 vl_api_bridge_domain_dump_t *mp;
1260 vl_api_control_ping_t *mp_ping;
1264 /* Parse args required to build the message */
1265 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1267 if (unformat (i, "bd_id %d", &bd_id))
1273 M (BRIDGE_DOMAIN_DUMP, mp);
1274 mp->bd_id = ntohl (bd_id);
1277 /* Use a control ping for synchronization */
1278 PING (&l2_test_main, mp_ping);
1286 api_bridge_domain_set_default_learn_limit (vat_main_t *vam)
1292 api_bd_ip_mac_flush (vat_main_t *vam)
1294 unformat_input_t *i = vam->input;
1295 vl_api_bd_ip_mac_flush_t *mp;
1300 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1302 if (unformat (i, "bd_id %d", &bd_id))
1312 errmsg ("missing bridge domain");
1316 M (BD_IP_MAC_FLUSH, mp);
1318 mp->bd_id = ntohl (bd_id);
1326 api_bd_ip_mac_dump (vat_main_t *vam)
1328 unformat_input_t *i = vam->input;
1329 vl_api_bd_ip_mac_dump_t *mp;
1330 vl_api_control_ping_t *mp_ping;
1335 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1337 if (unformat (i, "bd_id %d", &bd_id))
1345 fformat (vam->ofp, "\n%-5s %-7s %-20s %-30s", "bd_id", "is_ipv6",
1346 "mac_address", "ip_address");
1348 /* Dump Bridge Domain Ip to Mac entries */
1349 M (BD_IP_MAC_DUMP, mp);
1352 mp->bd_id = htonl (bd_id);
1358 /* Use a control ping for synchronization */
1359 PING (&l2_test_main, mp_ping);
1367 api_bvi_create (vat_main_t *vam)
1373 api_bvi_delete (vat_main_t *vam)
1379 api_bridge_flags (vat_main_t *vam)
1381 unformat_input_t *i = vam->input;
1382 vl_api_bridge_flags_t *mp;
1386 bd_flags_t flags = 0;
1389 /* Parse args required to build the message */
1390 while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1392 if (unformat (i, "bd_id %d", &bd_id))
1394 else if (unformat (i, "learn"))
1395 flags |= BRIDGE_API_FLAG_LEARN;
1396 else if (unformat (i, "forward"))
1397 flags |= BRIDGE_API_FLAG_FWD;
1398 else if (unformat (i, "flood"))
1399 flags |= BRIDGE_API_FLAG_FLOOD;
1400 else if (unformat (i, "uu-flood"))
1401 flags |= BRIDGE_API_FLAG_UU_FLOOD;
1402 else if (unformat (i, "arp-term"))
1403 flags |= BRIDGE_API_FLAG_ARP_TERM;
1404 else if (unformat (i, "off"))
1406 else if (unformat (i, "disable"))
1414 errmsg ("missing bridge domain");
1418 M (BRIDGE_FLAGS, mp);
1420 mp->bd_id = ntohl (bd_id);
1421 mp->flags = ntohl (flags);
1422 mp->is_set = is_set;
1429 #include <vnet/l2/l2.api_test.c>
1433 * eval: (c-set-style "gnu")