X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=blobdiff_plain;f=src%2Fvat%2Fapi_format.c;h=9f02507e4f74ed78d12520a6c53566706f782652;hp=8b8d0c9fdc0acb12abab8fcb5594a3d762c08fce;hb=e0792fdff;hpb=86327be9751ad54cb24d16c161cacb001dc20772 diff --git a/src/vat/api_format.c b/src/vat/api_format.c index 8b8d0c9fdc0..9f02507e4f7 100644 --- a/src/vat/api_format.c +++ b/src/vat/api_format.c @@ -18,12 +18,14 @@ */ #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -40,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -50,9 +51,10 @@ #include #include #include -#include #include #include +#include +#include #include "vat/json_format.h" #include #include @@ -71,7 +73,11 @@ #undef vl_endianfun /* instantiate all the print functions we know about */ +#if VPP_API_TEST_BUILTIN == 0 #define vl_print(handle, ...) +#else +#define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) +#endif #define vl_printfun #include #undef vl_printfun @@ -79,17 +85,14 @@ #define __plugin_msg_base 0 #include +#include + +void vl_api_set_elog_main (elog_main_t * m); +int vl_api_set_elog_trace_api_messages (int enable); + #if VPP_API_TEST_BUILTIN == 0 #include -/* *INDENT-OFF* */ -const mac_address_t ZERO_MAC_ADDRESS = { - .bytes = { - 0, 0, 0, 0, 0, 0, - }, -}; -/* *INDENT-ON* */ - u32 vl (void *p) { @@ -99,9 +102,15 @@ vl (void *p) int vat_socket_connect (vat_main_t * vam) { + int rv; vam->socket_client_main = &socket_client_main; - return vl_socket_client_connect ((char *) vam->socket_name, "vpp_api_test", - 0 /* default socket rx, tx buffer */ ); + if ((rv = vl_socket_client_connect ((char *) vam->socket_name, + "vpp_api_test", + 0 /* default socket rx, tx buffer */ ))) + return rv; + /* vpp expects the client index in network order */ + vam->my_client_index = htonl (socket_client_main.client_index); + return 0; } #else /* vpp built-in case, we don't do sockets... */ int @@ -160,7 +169,8 @@ errmsg (char *fmt, ...) if (vam->ifp != stdin) fformat (vam->ofp, "%s(%d): \n", vam->current_file, vam->input_line_number); - fformat (vam->ofp, (char *) s); + else + fformat (vam->ofp, "%s\n", (char *) s); fflush (vam->ofp); } #endif @@ -360,20 +370,6 @@ unformat_ipsec_policy_action (unformat_input_t * input, va_list * args) return 1; } -uword -unformat_ipsec_crypto_alg (unformat_input_t * input, va_list * args) -{ - u32 *r = va_arg (*args, u32 *); - - if (0); -#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_CRYPTO_ALG_##f; - foreach_ipsec_crypto_alg -#undef _ - else - return 0; - return 1; -} - u8 * format_ipsec_crypto_alg (u8 * s, va_list * args) { @@ -391,20 +387,6 @@ format_ipsec_crypto_alg (u8 * s, va_list * args) return format (s, "%s", t); } -uword -unformat_ipsec_integ_alg (unformat_input_t * input, va_list * args) -{ - u32 *r = va_arg (*args, u32 *); - - if (0); -#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_INTEG_ALG_##f; - foreach_ipsec_integ_alg -#undef _ - else - return 0; - return 1; -} - u8 * format_ipsec_integ_alg (u8 * s, va_list * args) { @@ -422,14 +404,37 @@ format_ipsec_integ_alg (u8 * s, va_list * args) return format (s, "%s", t); } +#else /* VPP_API_TEST_BUILTIN == 1 */ +static uword +api_unformat_sw_if_index (unformat_input_t * input, va_list * args) +{ + vat_main_t *vam __clib_unused = va_arg (*args, vat_main_t *); + vnet_main_t *vnm = vnet_get_main (); + u32 *result = va_arg (*args, u32 *); + + return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result); +} + +static uword +api_unformat_hw_if_index (unformat_input_t * input, va_list * args) +{ + vat_main_t *vam __clib_unused = va_arg (*args, vat_main_t *); + vnet_main_t *vnm = vnet_get_main (); + u32 *result = va_arg (*args, u32 *); + + return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result); +} + +#endif /* VPP_API_TEST_BUILTIN */ + uword -unformat_ikev2_auth_method (unformat_input_t * input, va_list * args) +unformat_ipsec_api_crypto_alg (unformat_input_t * input, va_list * args) { u32 *r = va_arg (*args, u32 *); if (0); -#define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_AUTH_METHOD_##f; - foreach_ikev2_auth_method +#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_CRYPTO_ALG_##f; + foreach_ipsec_crypto_alg #undef _ else return 0; @@ -437,40 +442,18 @@ unformat_ikev2_auth_method (unformat_input_t * input, va_list * args) } uword -unformat_ikev2_id_type (unformat_input_t * input, va_list * args) +unformat_ipsec_api_integ_alg (unformat_input_t * input, va_list * args) { u32 *r = va_arg (*args, u32 *); if (0); -#define _(v,f,s) else if (unformat (input, s)) *r = IKEV2_ID_TYPE_##f; - foreach_ikev2_id_type +#define _(v,f,s) else if (unformat (input, s)) *r = IPSEC_API_INTEG_ALG_##f; + foreach_ipsec_integ_alg #undef _ else return 0; return 1; } -#else /* VPP_API_TEST_BUILTIN == 1 */ -static uword -api_unformat_sw_if_index (unformat_input_t * input, va_list * args) -{ - vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *); - vnet_main_t *vnm = vnet_get_main (); - u32 *result = va_arg (*args, u32 *); - - return unformat (input, "%U", unformat_vnet_sw_interface, vnm, result); -} - -static uword -api_unformat_hw_if_index (unformat_input_t * input, va_list * args) -{ - vat_main_t *vam __attribute__ ((unused)) = va_arg (*args, vat_main_t *); - vnet_main_t *vnm = vnet_get_main (); - u32 *result = va_arg (*args, u32 *); - - return unformat (input, "%U", unformat_vnet_hw_interface, vnm, result); -} - -#endif /* VPP_API_TEST_BUILTIN */ static uword unformat_policer_rate_type (unformat_input_t * input, va_list * args) @@ -589,12 +572,13 @@ unformat_flow_classify_table_type (unformat_input_t * input, va_list * va) return 1; } +#if (VPP_API_TEST_BUILTIN==0) + static const char *mfib_flag_names[] = MFIB_ENTRY_NAMES_SHORT; static const char *mfib_flag_long_names[] = MFIB_ENTRY_NAMES_LONG; static const char *mfib_itf_flag_long_names[] = MFIB_ITF_NAMES_LONG; static const char *mfib_itf_flag_names[] = MFIB_ITF_NAMES_SHORT; -#if (VPP_API_TEST_BUILTIN==0) uword unformat_mfib_itf_flags (unformat_input_t * input, va_list * args) { @@ -731,8 +715,9 @@ format_ethernet_address (u8 * s, va_list * args) #endif static void -increment_v4_address (ip4_address_t * a) +increment_v4_address (vl_api_ip4_address_t * i) { + ip4_address_t *a = (ip4_address_t *) i; u32 v; v = ntohl (a->as_u32) + 1; @@ -740,8 +725,9 @@ increment_v4_address (ip4_address_t * a) } static void -increment_v6_address (ip6_address_t * a) +increment_v6_address (vl_api_ip6_address_t * i) { + ip6_address_t *a = (ip6_address_t *) i; u64 v0, v1; v0 = clib_net_to_host_u64 (a->as_u64[0]); @@ -754,6 +740,25 @@ increment_v6_address (ip6_address_t * a) a->as_u64[1] = clib_net_to_host_u64 (v1); } +static void +increment_address (vl_api_address_t * a) +{ + if (clib_net_to_host_u32 (a->af) == ADDRESS_IP4) + increment_v4_address (&a->un.ip4); + else if (clib_net_to_host_u32 (a->af) == ADDRESS_IP6) + increment_v6_address (&a->un.ip6); +} + +static void +set_ip4_address (vl_api_address_t * a, u32 v) +{ + if (a->af == ADDRESS_IP4) + { + ip4_address_t *i = (ip4_address_t *) & a->un.ip4; + i->as_u32 = v; + } +} + static void increment_mac_address (u8 * mac) { @@ -765,6 +770,34 @@ increment_mac_address (u8 * mac) clib_memcpy (mac, &tmp, 6); } +static void +vat_json_object_add_address (vat_json_node_t * node, + const char *str, const vl_api_address_t * addr) +{ + if (ADDRESS_IP6 == addr->af) + { + struct in6_addr ip6; + + clib_memcpy (&ip6, &addr->un.ip6, sizeof (ip6)); + vat_json_object_add_ip6 (node, str, ip6); + } + else + { + struct in_addr ip4; + + clib_memcpy (&ip4, &addr->un.ip4, sizeof (ip4)); + vat_json_object_add_ip4 (node, str, ip4); + } +} + +static void +vat_json_object_add_prefix (vat_json_node_t * node, + const vl_api_prefix_t * prefix) +{ + vat_json_object_add_uint (node, "len", prefix->len); + vat_json_object_add_address (node, "address", &prefix->address); +} + static void vl_api_create_loopback_reply_t_handler (vl_api_create_loopback_reply_t * mp) { @@ -961,14 +994,11 @@ static void vl_api_sw_interface_details_t_handler sub->sw_if_index = ntohl (mp->sw_if_index); sub->sub_id = ntohl (mp->sub_id); - sub->sub_dot1ad = mp->sub_dot1ad; + sub->raw_flags = ntohl (mp->sub_if_flags & SUB_IF_API_FLAG_MASK_VNET); + sub->sub_number_of_tags = mp->sub_number_of_tags; sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id); sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id); - sub->sub_exact_match = mp->sub_exact_match; - sub->sub_default = mp->sub_default; - sub->sub_outer_vlan_id_any = mp->sub_outer_vlan_id_any; - sub->sub_inner_vlan_id_any = mp->sub_inner_vlan_id_any; /* vlan tag rewrite */ sub->vtr_op = ntohl (mp->vtr_op); @@ -995,37 +1025,28 @@ static void vl_api_sw_interface_details_t_handler_json vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); vat_json_object_add_uint (node, "sup_sw_if_index", ntohl (mp->sup_sw_if_index)); - vat_json_object_add_uint (node, "l2_address_length", - ntohl (mp->l2_address_length)); vat_json_object_add_bytes (node, "l2_address", mp->l2_address, sizeof (mp->l2_address)); vat_json_object_add_string_copy (node, "interface_name", mp->interface_name); - vat_json_object_add_uint (node, "admin_up_down", mp->admin_up_down); - vat_json_object_add_uint (node, "link_up_down", mp->link_up_down); + vat_json_object_add_uint (node, "flags", mp->flags); vat_json_object_add_uint (node, "link_duplex", mp->link_duplex); vat_json_object_add_uint (node, "link_speed", mp->link_speed); vat_json_object_add_uint (node, "mtu", ntohs (mp->link_mtu)); vat_json_object_add_uint (node, "sub_id", ntohl (mp->sub_id)); - vat_json_object_add_uint (node, "sub_dot1ad", mp->sub_dot1ad); vat_json_object_add_uint (node, "sub_number_of_tags", mp->sub_number_of_tags); vat_json_object_add_uint (node, "sub_outer_vlan_id", ntohs (mp->sub_outer_vlan_id)); vat_json_object_add_uint (node, "sub_inner_vlan_id", ntohs (mp->sub_inner_vlan_id)); - vat_json_object_add_uint (node, "sub_exact_match", mp->sub_exact_match); - vat_json_object_add_uint (node, "sub_default", mp->sub_default); - vat_json_object_add_uint (node, "sub_outer_vlan_id_any", - mp->sub_outer_vlan_id_any); - vat_json_object_add_uint (node, "sub_inner_vlan_id_any", - mp->sub_inner_vlan_id_any); + vat_json_object_add_uint (node, "sub_if_flags", ntohl (mp->sub_if_flags)); vat_json_object_add_uint (node, "vtr_op", ntohl (mp->vtr_op)); vat_json_object_add_uint (node, "vtr_push_dot1q", ntohl (mp->vtr_push_dot1q)); vat_json_object_add_uint (node, "vtr_tag1", ntohl (mp->vtr_tag1)); vat_json_object_add_uint (node, "vtr_tag2", ntohl (mp->vtr_tag2)); - if (mp->sub_dot1ah) + if (ntohl (mp->sub_if_flags) & SUB_IF_API_FLAG_DOT1AH) { vat_json_object_add_string_copy (node, "pbb_vtr_dmac", format (0, "%U", @@ -1048,13 +1069,15 @@ static void vl_api_sw_interface_event_t_handler if (vam->interface_event_display) errmsg ("interface flags: sw_if_index %d %s %s", ntohl (mp->sw_if_index), - mp->admin_up_down ? "admin-up" : "admin-down", - mp->link_up_down ? "link-up" : "link-down"); + ((ntohl (mp->flags)) & IF_STATUS_API_FLAG_ADMIN_UP) ? + "admin-up" : "admin-down", + ((ntohl (mp->flags)) & IF_STATUS_API_FLAG_LINK_UP) ? + "link-up" : "link-down"); } #endif -static void vl_api_sw_interface_event_t_handler_json - (vl_api_sw_interface_event_t * mp) +__clib_unused static void +vl_api_sw_interface_event_t_handler_json (vl_api_sw_interface_event_t * mp) { /* JSON output not supported */ } @@ -1105,7 +1128,7 @@ vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); - u32 length = ntohl (mp->length); + u32 length = vl_api_string_len (&mp->reply); vec_reset_length (vam->cmd_reply); @@ -1113,7 +1136,8 @@ vl_api_cli_inband_reply_t_handler (vl_api_cli_inband_reply_t * mp) if (retval == 0) { vec_validate (vam->cmd_reply, length); - clib_memcpy ((char *) (vam->cmd_reply), mp->reply, length); + clib_memcpy ((char *) (vam->cmd_reply), + vl_api_from_api_string (&mp->reply), length); vam->cmd_reply[length] = 0; } vam->result_ready = 1; @@ -1129,7 +1153,8 @@ vl_api_cli_inband_reply_t_handler_json (vl_api_cli_inband_reply_t * mp) vat_json_init_object (&node); vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); - vat_json_object_add_string_copy (&node, "reply", mp->reply); + vat_json_object_add_string_copy (&node, "reply", + vl_api_from_api_string (&mp->reply)); vat_json_print (vam->ofp, &node); vat_json_free (&node); @@ -1410,8 +1435,8 @@ vl_api_ip4_arp_event_t_handler (vl_api_ip4_arp_event_t * mp) u32 sw_if_index = ntohl (mp->sw_if_index); errmsg ("arp %s event: pid %d address %U new mac %U sw_if_index %d\n", mp->mac_ip ? "mac/ip binding" : "address resolution", - ntohl (mp->pid), format_ip4_address, &mp->address, - format_ethernet_address, mp->new_mac, sw_if_index); + ntohl (mp->pid), format_ip4_address, mp->ip, + format_vl_api_mac_address, &mp->mac, sw_if_index); } static void @@ -1426,8 +1451,8 @@ vl_api_ip6_nd_event_t_handler (vl_api_ip6_nd_event_t * mp) u32 sw_if_index = ntohl (mp->sw_if_index); errmsg ("ip6 nd %s event: pid %d address %U new mac %U sw_if_index %d\n", mp->mac_ip ? "mac/ip binding" : "address resolution", - ntohl (mp->pid), format_ip6_address, mp->address, - format_ethernet_address, mp->new_mac, sw_if_index); + ntohl (mp->pid), format_vl_api_ip6_address, mp->ip, + format_vl_api_mac_address, mp->mac, sw_if_index); } static void @@ -1704,8 +1729,8 @@ static void vl_api_bridge_flags_reply_t_handler_json vam->result_ready = 1; } -static void vl_api_tap_connect_reply_t_handler - (vl_api_tap_connect_reply_t * mp) +static void +vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -1722,8 +1747,8 @@ static void vl_api_tap_connect_reply_t_handler } -static void vl_api_tap_connect_reply_t_handler_json - (vl_api_tap_connect_reply_t * mp) +static void vl_api_tap_create_v2_reply_t_handler_json + (vl_api_tap_create_v2_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -1741,41 +1766,7 @@ static void vl_api_tap_connect_reply_t_handler_json } static void -vl_api_tap_modify_reply_t_handler (vl_api_tap_modify_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - if (vam->async_mode) - { - vam->async_errors += (retval < 0); - } - else - { - vam->retval = retval; - vam->sw_if_index = ntohl (mp->sw_if_index); - vam->result_ready = 1; - } -} - -static void vl_api_tap_modify_reply_t_handler_json - (vl_api_tap_modify_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t node; - - vat_json_init_object (&node); - vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); - vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index)); - - vat_json_print (vam->ofp, &node); - vat_json_free (&node); - - vam->retval = ntohl (mp->retval); - vam->result_ready = 1; -} - -static void -vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp) +vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -1790,8 +1781,8 @@ vl_api_tap_delete_reply_t_handler (vl_api_tap_delete_reply_t * mp) } } -static void vl_api_tap_delete_reply_t_handler_json - (vl_api_tap_delete_reply_t * mp) +static void vl_api_tap_delete_v2_reply_t_handler_json + (vl_api_tap_delete_v2_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -1807,7 +1798,8 @@ static void vl_api_tap_delete_reply_t_handler_json } static void -vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp) +vl_api_virtio_pci_create_reply_t_handler (vl_api_virtio_pci_create_reply_t * + mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -1821,11 +1813,10 @@ vl_api_tap_create_v2_reply_t_handler (vl_api_tap_create_v2_reply_t * mp) vam->sw_if_index = ntohl (mp->sw_if_index); vam->result_ready = 1; } - } -static void vl_api_tap_create_v2_reply_t_handler_json - (vl_api_tap_create_v2_reply_t * mp) +static void vl_api_virtio_pci_create_reply_t_handler_json + (vl_api_virtio_pci_create_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -1843,7 +1834,8 @@ static void vl_api_tap_create_v2_reply_t_handler_json } static void -vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp) +vl_api_virtio_pci_delete_reply_t_handler (vl_api_virtio_pci_delete_reply_t * + mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -1858,8 +1850,8 @@ vl_api_tap_delete_v2_reply_t_handler (vl_api_tap_delete_v2_reply_t * mp) } } -static void vl_api_tap_delete_v2_reply_t_handler_json - (vl_api_tap_delete_v2_reply_t * mp) +static void vl_api_virtio_pci_delete_reply_t_handler_json + (vl_api_virtio_pci_delete_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -2009,6 +2001,49 @@ static void vl_api_bond_detach_slave_reply_t_handler_json vam->result_ready = 1; } +static int +api_sw_interface_set_bond_weight (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_sw_interface_set_bond_weight_t *mp; + u32 sw_if_index = ~0; + u32 weight = 0; + u8 weight_enter = 0; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + ; + else if (unformat (i, "weight %u", &weight)) + weight_enter = 1; + else + break; + } + + if (sw_if_index == ~0) + { + errmsg ("missing interface name or sw_if_index"); + return -99; + } + if (weight_enter == 0) + { + errmsg ("missing valid weight"); + return -99; + } + + /* Construct the API message */ + M (SW_INTERFACE_SET_BOND_WEIGHT, mp); + mp->sw_if_index = ntohl (sw_if_index); + mp->weight = ntohl (weight); + + S (mp); + W (ret); + return ret; +} + static void vl_api_sw_interface_bond_details_t_handler (vl_api_sw_interface_bond_details_t * mp) { @@ -2017,8 +2052,8 @@ static void vl_api_sw_interface_bond_details_t_handler print (vam->ofp, "%-16s %-12d %-12U %-13U %-14u %-14u", mp->interface_name, ntohl (mp->sw_if_index), - format_bond_mode, mp->mode, format_bond_load_balance, mp->lb, - ntohl (mp->active_slaves), ntohl (mp->slaves)); + format_bond_mode, ntohl (mp->mode), format_bond_load_balance, + ntohl (mp->lb), ntohl (mp->active_slaves), ntohl (mp->slaves)); } static void vl_api_sw_interface_bond_details_t_handler_json @@ -2038,8 +2073,8 @@ static void vl_api_sw_interface_bond_details_t_handler_json vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); vat_json_object_add_string_copy (node, "interface_name", mp->interface_name); - vat_json_object_add_uint (node, "mode", mp->mode); - vat_json_object_add_uint (node, "load_balance", mp->lb); + vat_json_object_add_uint (node, "mode", ntohl (mp->mode)); + vat_json_object_add_uint (node, "load_balance", ntohl (mp->lb)); vat_json_object_add_uint (node, "active_slaves", ntohl (mp->active_slaves)); vat_json_object_add_uint (node, "slaves", ntohl (mp->slaves)); } @@ -2074,8 +2109,9 @@ static void vl_api_sw_interface_slave_details_t_handler vat_main_t *vam = &vat_main; print (vam->ofp, - "%-25s %-12d %-12d %d", mp->interface_name, - ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout); + "%-25s %-12d %-7d %-12d %-10d %-10d", mp->interface_name, + ntohl (mp->sw_if_index), mp->is_passive, mp->is_long_timeout, + ntohl (mp->weight), mp->is_local_numa); } static void vl_api_sw_interface_slave_details_t_handler_json @@ -2097,6 +2133,8 @@ static void vl_api_sw_interface_slave_details_t_handler_json mp->interface_name); vat_json_object_add_uint (node, "passive", mp->is_passive); vat_json_object_add_uint (node, "long_timeout", mp->is_long_timeout); + vat_json_object_add_uint (node, "weight", ntohl (mp->weight)); + vat_json_object_add_uint (node, "is_local_numa", mp->is_local_numa); } static int @@ -2127,8 +2165,9 @@ api_sw_interface_slave_dump (vat_main_t * vam) } print (vam->ofp, - "\n%-25s %-12s %-12s %s", - "slave interface name", "sw_if_index", "passive", "long_timeout"); + "\n%-25s %-12s %-7s %-12s %-10s %-10s", + "slave interface name", "sw_if_index", "passive", "long_timeout", + "weight", "local numa"); /* Get list of bond interfaces */ M (SW_INTERFACE_SLAVE_DUMP, mp); @@ -2474,8 +2513,8 @@ static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json vam->result_ready = 1; } -static void vl_api_gre_add_del_tunnel_reply_t_handler - (vl_api_gre_add_del_tunnel_reply_t * mp) +static void vl_api_gre_tunnel_add_del_reply_t_handler + (vl_api_gre_tunnel_add_del_reply_t * mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -2491,8 +2530,8 @@ static void vl_api_gre_add_del_tunnel_reply_t_handler } } -static void vl_api_gre_add_del_tunnel_reply_t_handler_json - (vl_api_gre_add_del_tunnel_reply_t * mp) +static void vl_api_gre_tunnel_add_del_reply_t_handler_json + (vl_api_gre_tunnel_add_del_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -2543,70 +2582,6 @@ static void vl_api_create_vhost_user_if_reply_t_handler_json vam->result_ready = 1; } -static void vl_api_dns_resolve_name_reply_t_handler - (vl_api_dns_resolve_name_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - if (vam->async_mode) - { - vam->async_errors += (retval < 0); - } - else - { - vam->retval = retval; - vam->result_ready = 1; - - if (retval == 0) - { - if (mp->ip4_set) - clib_warning ("ip4 address %U", format_ip4_address, - (ip4_address_t *) mp->ip4_address); - if (mp->ip6_set) - clib_warning ("ip6 address %U", format_ip6_address, - (ip6_address_t *) mp->ip6_address); - } - else - clib_warning ("retval %d", retval); - } -} - -static void vl_api_dns_resolve_name_reply_t_handler_json - (vl_api_dns_resolve_name_reply_t * mp) -{ - clib_warning ("not implemented"); -} - -static void vl_api_dns_resolve_ip_reply_t_handler - (vl_api_dns_resolve_ip_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - if (vam->async_mode) - { - vam->async_errors += (retval < 0); - } - else - { - vam->retval = retval; - vam->result_ready = 1; - - if (retval == 0) - { - clib_warning ("canonical name %s", mp->name); - } - else - clib_warning ("retval %d", retval); - } -} - -static void vl_api_dns_resolve_ip_reply_t_handler_json - (vl_api_dns_resolve_ip_reply_t * mp) -{ - clib_warning ("not implemented"); -} - - static void vl_api_ip_address_details_t_handler (vl_api_ip_address_details_t * mp) { @@ -2635,8 +2610,8 @@ static void vl_api_ip_address_details_t_handler address = vec_elt_at_index (addresses, vec_len (addresses) - 1); - clib_memcpy (&address->ip, &mp->ip, sizeof (address->ip)); - address->prefix_length = mp->prefix_length; + clib_memcpy (&address->ip, &mp->prefix.address.un, sizeof (address->ip)); + address->prefix_length = mp->prefix.len; #undef addresses } @@ -2645,8 +2620,6 @@ static void vl_api_ip_address_details_t_handler_json { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; - struct in6_addr ip6; - struct in_addr ip4; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -2656,17 +2629,7 @@ static void vl_api_ip_address_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - if (vam->is_ipv6) - { - clib_memcpy (&ip6, mp->ip, sizeof (ip6)); - vat_json_object_add_ip6 (node, "ip", ip6); - } - else - { - clib_memcpy (&ip4, mp->ip, sizeof (ip4)); - vat_json_object_add_ip4 (node, "ip", ip4); - } - vat_json_object_add_uint (node, "prefix_length", mp->prefix_length); + vat_json_object_add_prefix (node, &mp->prefix); } static void @@ -2702,311 +2665,11 @@ vl_api_ip_details_t_handler_json (vl_api_ip_details_t * mp) clib_net_to_host_u32 (mp->sw_if_index)); } -static void -vl_api_dhcp_compl_event_t_handler (vl_api_dhcp_compl_event_t * mp) +static void vl_api_get_first_msg_id_reply_t_handler + (vl_api_get_first_msg_id_reply_t * mp) { - errmsg ("DHCP compl event: pid %d %s hostname %s host_addr %U " - "router_addr %U host_mac %U", - ntohl (mp->pid), mp->lease.is_ipv6 ? "ipv6" : "ipv4", - mp->lease.hostname, - format_ip4_address, &mp->lease.host_address, - format_ip4_address, &mp->lease.router_address, - format_ethernet_address, mp->lease.host_mac); -} - -static void vl_api_dhcp_compl_event_t_handler_json - (vl_api_dhcp_compl_event_t * mp) -{ - /* JSON output not supported */ -} - -static void -set_simple_interface_counter (u8 vnet_counter_type, u32 sw_if_index, - u32 counter) -{ - vat_main_t *vam = &vat_main; - static u64 default_counter = 0; - - vec_validate_init_empty (vam->simple_interface_counters, vnet_counter_type, - NULL); - vec_validate_init_empty (vam->simple_interface_counters[vnet_counter_type], - sw_if_index, default_counter); - vam->simple_interface_counters[vnet_counter_type][sw_if_index] = counter; -} - -static void -set_combined_interface_counter (u8 vnet_counter_type, u32 sw_if_index, - interface_counter_t counter) -{ - vat_main_t *vam = &vat_main; - static interface_counter_t default_counter = { 0, }; - - vec_validate_init_empty (vam->combined_interface_counters, - vnet_counter_type, NULL); - vec_validate_init_empty (vam->combined_interface_counters - [vnet_counter_type], sw_if_index, default_counter); - vam->combined_interface_counters[vnet_counter_type][sw_if_index] = counter; -} - -static void vl_api_vnet_interface_simple_counters_t_handler - (vl_api_vnet_interface_simple_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_interface_combined_counters_t_handler - (vl_api_vnet_interface_combined_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_interface_simple_counters_t_handler_json - (vl_api_vnet_interface_simple_counters_t * mp) -{ - u64 *v_packets; - u64 packets; - u32 count; - u32 first_sw_if_index; - int i; - - count = ntohl (mp->count); - first_sw_if_index = ntohl (mp->first_sw_if_index); - - v_packets = (u64 *) & mp->data; - for (i = 0; i < count; i++) - { - packets = clib_net_to_host_u64 (clib_mem_unaligned (v_packets, u64)); - set_simple_interface_counter (mp->vnet_counter_type, - first_sw_if_index + i, packets); - v_packets++; - } -} - -static void vl_api_vnet_interface_combined_counters_t_handler_json - (vl_api_vnet_interface_combined_counters_t * mp) -{ - interface_counter_t counter; - vlib_counter_t *v; - u32 first_sw_if_index; - int i; - u32 count; - - count = ntohl (mp->count); - first_sw_if_index = ntohl (mp->first_sw_if_index); - - v = (vlib_counter_t *) & mp->data; - for (i = 0; i < count; i++) - { - counter.packets = - clib_net_to_host_u64 (clib_mem_unaligned (&v->packets, u64)); - counter.bytes = - clib_net_to_host_u64 (clib_mem_unaligned (&v->bytes, u64)); - set_combined_interface_counter (mp->vnet_counter_type, - first_sw_if_index + i, counter); - v++; - } -} - -static u32 -ip4_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id) -{ - vat_main_t *vam = &vat_main; - u32 i; - - for (i = 0; i < vec_len (vam->ip4_fib_counters_vrf_id_by_index); i++) - { - if (vam->ip4_fib_counters_vrf_id_by_index[i] == vrf_id) - { - return i; - } - } - return ~0; -} - -static u32 -ip6_fib_counters_get_vrf_index_by_vrf_id (u32 vrf_id) -{ - vat_main_t *vam = &vat_main; - u32 i; - - for (i = 0; i < vec_len (vam->ip6_fib_counters_vrf_id_by_index); i++) - { - if (vam->ip6_fib_counters_vrf_id_by_index[i] == vrf_id) - { - return i; - } - } - return ~0; -} - -static void vl_api_vnet_ip4_fib_counters_t_handler - (vl_api_vnet_ip4_fib_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_ip4_fib_counters_t_handler_json - (vl_api_vnet_ip4_fib_counters_t * mp) -{ - vat_main_t *vam = &vat_main; - vl_api_ip4_fib_counter_t *v; - ip4_fib_counter_t *counter; - struct in_addr ip4; - u32 vrf_id; - u32 vrf_index; - u32 count; - int i; - - vrf_id = ntohl (mp->vrf_id); - vrf_index = ip4_fib_counters_get_vrf_index_by_vrf_id (vrf_id); - if (~0 == vrf_index) - { - vrf_index = vec_len (vam->ip4_fib_counters_vrf_id_by_index); - vec_validate (vam->ip4_fib_counters_vrf_id_by_index, vrf_index); - vam->ip4_fib_counters_vrf_id_by_index[vrf_index] = vrf_id; - vec_validate (vam->ip4_fib_counters, vrf_index); - vam->ip4_fib_counters[vrf_index] = NULL; - } - - vec_free (vam->ip4_fib_counters[vrf_index]); - v = (vl_api_ip4_fib_counter_t *) & mp->c; - count = ntohl (mp->count); - for (i = 0; i < count; i++) - { - vec_validate (vam->ip4_fib_counters[vrf_index], i); - counter = &vam->ip4_fib_counters[vrf_index][i]; - clib_memcpy (&ip4, &v->address, sizeof (ip4)); - counter->address = ip4; - counter->address_length = v->address_length; - counter->packets = clib_net_to_host_u64 (v->packets); - counter->bytes = clib_net_to_host_u64 (v->bytes); - v++; - } -} - -static void vl_api_vnet_ip4_nbr_counters_t_handler - (vl_api_vnet_ip4_nbr_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_ip4_nbr_counters_t_handler_json - (vl_api_vnet_ip4_nbr_counters_t * mp) -{ - vat_main_t *vam = &vat_main; - vl_api_ip4_nbr_counter_t *v; - ip4_nbr_counter_t *counter; - u32 sw_if_index; - u32 count; - int i; - - sw_if_index = ntohl (mp->sw_if_index); - count = ntohl (mp->count); - vec_validate (vam->ip4_nbr_counters, sw_if_index); - - if (mp->begin) - vec_free (vam->ip4_nbr_counters[sw_if_index]); - - v = (vl_api_ip4_nbr_counter_t *) & mp->c; - for (i = 0; i < count; i++) - { - vec_validate (vam->ip4_nbr_counters[sw_if_index], i); - counter = &vam->ip4_nbr_counters[sw_if_index][i]; - counter->address.s_addr = v->address; - counter->packets = clib_net_to_host_u64 (v->packets); - counter->bytes = clib_net_to_host_u64 (v->bytes); - counter->linkt = v->link_type; - v++; - } -} - -static void vl_api_vnet_ip6_fib_counters_t_handler - (vl_api_vnet_ip6_fib_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_ip6_fib_counters_t_handler_json - (vl_api_vnet_ip6_fib_counters_t * mp) -{ - vat_main_t *vam = &vat_main; - vl_api_ip6_fib_counter_t *v; - ip6_fib_counter_t *counter; - struct in6_addr ip6; - u32 vrf_id; - u32 vrf_index; - u32 count; - int i; - - vrf_id = ntohl (mp->vrf_id); - vrf_index = ip6_fib_counters_get_vrf_index_by_vrf_id (vrf_id); - if (~0 == vrf_index) - { - vrf_index = vec_len (vam->ip6_fib_counters_vrf_id_by_index); - vec_validate (vam->ip6_fib_counters_vrf_id_by_index, vrf_index); - vam->ip6_fib_counters_vrf_id_by_index[vrf_index] = vrf_id; - vec_validate (vam->ip6_fib_counters, vrf_index); - vam->ip6_fib_counters[vrf_index] = NULL; - } - - vec_free (vam->ip6_fib_counters[vrf_index]); - v = (vl_api_ip6_fib_counter_t *) & mp->c; - count = ntohl (mp->count); - for (i = 0; i < count; i++) - { - vec_validate (vam->ip6_fib_counters[vrf_index], i); - counter = &vam->ip6_fib_counters[vrf_index][i]; - clib_memcpy (&ip6, &v->address, sizeof (ip6)); - counter->address = ip6; - counter->address_length = v->address_length; - counter->packets = clib_net_to_host_u64 (v->packets); - counter->bytes = clib_net_to_host_u64 (v->bytes); - v++; - } -} - -static void vl_api_vnet_ip6_nbr_counters_t_handler - (vl_api_vnet_ip6_nbr_counters_t * mp) -{ - /* not supported */ -} - -static void vl_api_vnet_ip6_nbr_counters_t_handler_json - (vl_api_vnet_ip6_nbr_counters_t * mp) -{ - vat_main_t *vam = &vat_main; - vl_api_ip6_nbr_counter_t *v; - ip6_nbr_counter_t *counter; - struct in6_addr ip6; - u32 sw_if_index; - u32 count; - int i; - - sw_if_index = ntohl (mp->sw_if_index); - count = ntohl (mp->count); - vec_validate (vam->ip6_nbr_counters, sw_if_index); - - if (mp->begin) - vec_free (vam->ip6_nbr_counters[sw_if_index]); - - v = (vl_api_ip6_nbr_counter_t *) & mp->c; - for (i = 0; i < count; i++) - { - vec_validate (vam->ip6_nbr_counters[sw_if_index], i); - counter = &vam->ip6_nbr_counters[sw_if_index][i]; - clib_memcpy (&ip6, &v->address, sizeof (ip6)); - counter->address = ip6; - counter->packets = clib_net_to_host_u64 (v->packets); - counter->bytes = clib_net_to_host_u64 (v->bytes); - v++; - } -} - -static void vl_api_get_first_msg_id_reply_t_handler - (vl_api_get_first_msg_id_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); + vat_main_t *vam = &vat_main; + i32 retval = ntohl (mp->retval); if (vam->async_mode) { @@ -5339,41 +5002,6 @@ static void vl_api_policer_classify_details_t_handler_json vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index)); } -static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler - (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - if (vam->async_mode) - { - vam->async_errors += (retval < 0); - } - else - { - vam->retval = retval; - vam->sw_if_index = ntohl (mp->sw_if_index); - vam->result_ready = 1; - } - vam->regenerate_interface_table = 1; -} - -static void vl_api_ipsec_gre_add_del_tunnel_reply_t_handler_json - (vl_api_ipsec_gre_add_del_tunnel_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t node; - - vat_json_init_object (&node); - vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); - vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index)); - - vat_json_print (vam->ofp, &node); - vat_json_free (&node); - - vam->retval = ntohl (mp->retval); - vam->result_ready = 1; -} - static void vl_api_flow_classify_details_t_handler (vl_api_flow_classify_details_t * mp) { @@ -5401,18 +5029,6 @@ static void vl_api_flow_classify_details_t_handler_json vat_json_object_add_uint (node, "table_index", ntohl (mp->table_index)); } -#define vl_api_vnet_interface_simple_counters_t_endian vl_noop_handler -#define vl_api_vnet_interface_simple_counters_t_print vl_noop_handler -#define vl_api_vnet_interface_combined_counters_t_endian vl_noop_handler -#define vl_api_vnet_interface_combined_counters_t_print vl_noop_handler -#define vl_api_vnet_ip4_fib_counters_t_endian vl_noop_handler -#define vl_api_vnet_ip4_fib_counters_t_print vl_noop_handler -#define vl_api_vnet_ip6_fib_counters_t_endian vl_noop_handler -#define vl_api_vnet_ip6_fib_counters_t_print vl_noop_handler -#define vl_api_vnet_ip4_nbr_counters_t_endian vl_noop_handler -#define vl_api_vnet_ip4_nbr_counters_t_print vl_noop_handler -#define vl_api_vnet_ip6_nbr_counters_t_endian vl_noop_handler -#define vl_api_vnet_ip6_nbr_counters_t_print vl_noop_handler #define vl_api_one_adjacencies_get_reply_t_endian vl_noop_handler #define vl_api_one_adjacencies_get_reply_t_print vl_noop_handler #define vl_api_one_l2_arp_bd_get_reply_t_print vl_noop_handler @@ -5445,12 +5061,13 @@ _(sw_interface_set_vxlan_bypass_reply) \ _(sw_interface_set_geneve_bypass_reply) \ _(sw_interface_set_vxlan_gpe_bypass_reply) \ _(sw_interface_set_l2_bridge_reply) \ +_(sw_interface_set_bond_weight_reply) \ _(bridge_domain_add_del_reply) \ _(sw_interface_set_l2_xconnect_reply) \ _(l2fib_add_del_reply) \ _(l2fib_flush_int_reply) \ _(l2fib_flush_bd_reply) \ -_(ip_add_del_route_reply) \ +_(ip_route_add_del_reply) \ _(ip_table_add_del_reply) \ _(ip_mroute_add_del_reply) \ _(mpls_route_add_del_reply) \ @@ -5462,14 +5079,9 @@ _(proxy_arp_add_del_reply) \ _(proxy_arp_intfc_enable_disable_reply) \ _(sw_interface_set_unnumbered_reply) \ _(ip_neighbor_add_del_reply) \ -_(oam_add_del_reply) \ _(reset_fib_reply) \ -_(dhcp_proxy_config_reply) \ -_(dhcp_proxy_set_vss_reply) \ -_(dhcp_client_config_reply) \ _(set_ip_flow_hash_reply) \ _(sw_interface_ip6_enable_disable_reply) \ -_(sw_interface_ip6_set_link_local_address_reply) \ _(ip6nd_proxy_add_del_reply) \ _(sw_interface_ip6nd_ra_prefix_reply) \ _(sw_interface_ip6nd_ra_config_reply) \ @@ -5502,29 +5114,14 @@ _(want_l2_macs_events_reply) \ _(input_acl_set_interface_reply) \ _(ipsec_spd_add_del_reply) \ _(ipsec_interface_add_del_spd_reply) \ -_(ipsec_spd_add_del_entry_reply) \ -_(ipsec_sad_add_del_entry_reply) \ -_(ipsec_sa_set_key_reply) \ +_(ipsec_spd_entry_add_del_reply) \ +_(ipsec_sad_entry_add_del_reply) \ _(ipsec_tunnel_if_add_del_reply) \ -_(ipsec_tunnel_if_set_key_reply) \ _(ipsec_tunnel_if_set_sa_reply) \ -_(ikev2_profile_add_del_reply) \ -_(ikev2_profile_set_auth_reply) \ -_(ikev2_profile_set_id_reply) \ -_(ikev2_profile_set_ts_reply) \ -_(ikev2_set_local_key_reply) \ -_(ikev2_set_responder_reply) \ -_(ikev2_set_ike_transforms_reply) \ -_(ikev2_set_esp_transforms_reply) \ -_(ikev2_set_sa_lifetime_reply) \ -_(ikev2_initiate_sa_init_reply) \ -_(ikev2_initiate_del_ike_sa_reply) \ -_(ikev2_initiate_del_child_sa_reply) \ -_(ikev2_initiate_rekey_child_sa_reply) \ _(delete_loopback_reply) \ _(bd_ip_mac_add_del_reply) \ +_(bd_ip_mac_flush_reply) \ _(want_interface_events_reply) \ -_(want_stats_reply) \ _(cop_interface_enable_disable_reply) \ _(cop_whitelist_enable_disable_reply) \ _(sw_interface_clear_stats_reply) \ @@ -5573,17 +5170,16 @@ _(ip_source_and_port_range_check_add_del_reply) \ _(ip_source_and_port_range_check_interface_add_del_reply)\ _(delete_subif_reply) \ _(l2_interface_pbb_tag_rewrite_reply) \ -_(punt_reply) \ +_(set_punt_reply) \ _(feature_enable_disable_reply) \ _(sw_interface_tag_add_del_reply) \ +_(sw_interface_add_del_mac_address_reply) \ _(hw_interface_set_mtu_reply) \ _(p2p_ethernet_add_reply) \ _(p2p_ethernet_del_reply) \ _(lldp_config_reply) \ _(sw_interface_set_lldp_reply) \ _(tcp_configure_src_addresses_reply) \ -_(dns_enable_disable_reply) \ -_(dns_name_server_add_del_reply) \ _(session_rule_add_del_reply) \ _(ip_container_proxy_add_del_reply) \ _(output_acl_set_interface_reply) \ @@ -5656,20 +5252,20 @@ _(L2FIB_FLUSH_INT_REPLY, l2fib_flush_int_reply) \ _(L2FIB_FLUSH_BD_REPLY, l2fib_flush_bd_reply) \ _(L2_FLAGS_REPLY, l2_flags_reply) \ _(BRIDGE_FLAGS_REPLY, bridge_flags_reply) \ -_(TAP_CONNECT_REPLY, tap_connect_reply) \ -_(TAP_MODIFY_REPLY, tap_modify_reply) \ -_(TAP_DELETE_REPLY, tap_delete_reply) \ -_(SW_INTERFACE_TAP_DETAILS, sw_interface_tap_details) \ _(TAP_CREATE_V2_REPLY, tap_create_v2_reply) \ _(TAP_DELETE_V2_REPLY, tap_delete_v2_reply) \ _(SW_INTERFACE_TAP_V2_DETAILS, sw_interface_tap_v2_details) \ +_(VIRTIO_PCI_CREATE_REPLY, virtio_pci_create_reply) \ +_(VIRTIO_PCI_DELETE_REPLY, virtio_pci_delete_reply) \ +_(SW_INTERFACE_VIRTIO_PCI_DETAILS, sw_interface_virtio_pci_details) \ _(BOND_CREATE_REPLY, bond_create_reply) \ _(BOND_DELETE_REPLY, bond_delete_reply) \ _(BOND_ENSLAVE_REPLY, bond_enslave_reply) \ _(BOND_DETACH_SLAVE_REPLY, bond_detach_slave_reply) \ +_(SW_INTERFACE_SET_BOND_WEIGHT_REPLY, sw_interface_set_bond_weight_reply) \ _(SW_INTERFACE_BOND_DETAILS, sw_interface_bond_details) \ _(SW_INTERFACE_SLAVE_DETAILS, sw_interface_slave_details) \ -_(IP_ADD_DEL_ROUTE_REPLY, ip_add_del_route_reply) \ +_(IP_ROUTE_ADD_DEL_REPLY, ip_route_add_del_reply) \ _(IP_TABLE_ADD_DEL_REPLY, ip_table_add_del_reply) \ _(IP_MROUTE_ADD_DEL_REPLY, ip_mroute_add_del_reply) \ _(MPLS_TABLE_ADD_DEL_REPLY, mpls_table_add_del_reply) \ @@ -5686,17 +5282,10 @@ _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \ _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \ _(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \ _(CREATE_SUBIF_REPLY, create_subif_reply) \ -_(OAM_ADD_DEL_REPLY, oam_add_del_reply) \ _(RESET_FIB_REPLY, reset_fib_reply) \ -_(DHCP_PROXY_CONFIG_REPLY, dhcp_proxy_config_reply) \ -_(DHCP_PROXY_SET_VSS_REPLY, dhcp_proxy_set_vss_reply) \ -_(DHCP_PROXY_DETAILS, dhcp_proxy_details) \ -_(DHCP_CLIENT_CONFIG_REPLY, dhcp_client_config_reply) \ _(SET_IP_FLOW_HASH_REPLY, set_ip_flow_hash_reply) \ _(SW_INTERFACE_IP6_ENABLE_DISABLE_REPLY, \ sw_interface_ip6_enable_disable_reply) \ -_(SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS_REPLY, \ - sw_interface_ip6_set_link_local_address_reply) \ _(IP6ND_PROXY_ADD_DEL_REPLY, ip6nd_proxy_add_del_reply) \ _(IP6ND_PROXY_DETAILS, ip6nd_proxy_details) \ _(SW_INTERFACE_IP6ND_RA_PREFIX_REPLY, \ @@ -5732,7 +5321,7 @@ _(VXLAN_OFFLOAD_RX_REPLY, vxlan_offload_rx_reply) \ _(GENEVE_ADD_DEL_TUNNEL_REPLY, geneve_add_del_tunnel_reply) \ _(VXLAN_TUNNEL_DETAILS, vxlan_tunnel_details) \ _(GENEVE_TUNNEL_DETAILS, geneve_tunnel_details) \ -_(GRE_ADD_DEL_TUNNEL_REPLY, gre_add_del_tunnel_reply) \ +_(GRE_TUNNEL_ADD_DEL_REPLY, gre_tunnel_add_del_reply) \ _(GRE_TUNNEL_DETAILS, gre_tunnel_details) \ _(L2_FIB_CLEAR_TABLE_REPLY, l2_fib_clear_table_reply) \ _(L2_INTERFACE_EFP_FILTER_REPLY, l2_interface_efp_filter_reply) \ @@ -5760,32 +5349,16 @@ _(IP_ADDRESS_DETAILS, ip_address_details) \ _(IP_DETAILS, ip_details) \ _(IPSEC_SPD_ADD_DEL_REPLY, ipsec_spd_add_del_reply) \ _(IPSEC_INTERFACE_ADD_DEL_SPD_REPLY, ipsec_interface_add_del_spd_reply) \ -_(IPSEC_SPD_ADD_DEL_ENTRY_REPLY, ipsec_spd_add_del_entry_reply) \ -_(IPSEC_SAD_ADD_DEL_ENTRY_REPLY, ipsec_sad_add_del_entry_reply) \ +_(IPSEC_SPD_ENTRY_ADD_DEL_REPLY, ipsec_spd_entry_add_del_reply) \ +_(IPSEC_SAD_ENTRY_ADD_DEL_REPLY, ipsec_sad_entry_add_del_reply) \ _(IPSEC_SA_DETAILS, ipsec_sa_details) \ -_(IPSEC_SA_SET_KEY_REPLY, ipsec_sa_set_key_reply) \ _(IPSEC_TUNNEL_IF_ADD_DEL_REPLY, ipsec_tunnel_if_add_del_reply) \ -_(IPSEC_TUNNEL_IF_SET_KEY_REPLY, ipsec_tunnel_if_set_key_reply) \ _(IPSEC_TUNNEL_IF_SET_SA_REPLY, ipsec_tunnel_if_set_sa_reply) \ -_(IKEV2_PROFILE_ADD_DEL_REPLY, ikev2_profile_add_del_reply) \ -_(IKEV2_PROFILE_SET_AUTH_REPLY, ikev2_profile_set_auth_reply) \ -_(IKEV2_PROFILE_SET_ID_REPLY, ikev2_profile_set_id_reply) \ -_(IKEV2_PROFILE_SET_TS_REPLY, ikev2_profile_set_ts_reply) \ -_(IKEV2_SET_LOCAL_KEY_REPLY, ikev2_set_local_key_reply) \ -_(IKEV2_SET_RESPONDER_REPLY, ikev2_set_responder_reply) \ -_(IKEV2_SET_IKE_TRANSFORMS_REPLY, ikev2_set_ike_transforms_reply) \ -_(IKEV2_SET_ESP_TRANSFORMS_REPLY, ikev2_set_esp_transforms_reply) \ -_(IKEV2_SET_SA_LIFETIME_REPLY, ikev2_set_sa_lifetime_reply) \ -_(IKEV2_INITIATE_SA_INIT_REPLY, ikev2_initiate_sa_init_reply) \ -_(IKEV2_INITIATE_DEL_IKE_SA_REPLY, ikev2_initiate_del_ike_sa_reply) \ -_(IKEV2_INITIATE_DEL_CHILD_SA_REPLY, ikev2_initiate_del_child_sa_reply) \ -_(IKEV2_INITIATE_REKEY_CHILD_SA_REPLY, ikev2_initiate_rekey_child_sa_reply) \ _(DELETE_LOOPBACK_REPLY, delete_loopback_reply) \ _(BD_IP_MAC_ADD_DEL_REPLY, bd_ip_mac_add_del_reply) \ +_(BD_IP_MAC_FLUSH_REPLY, bd_ip_mac_flush_reply) \ _(BD_IP_MAC_DETAILS, bd_ip_mac_details) \ -_(DHCP_COMPL_EVENT, dhcp_compl_event) \ _(WANT_INTERFACE_EVENTS_REPLY, want_interface_events_reply) \ -_(WANT_STATS_REPLY, want_stats_reply) \ _(GET_FIRST_MSG_ID_REPLY, get_first_msg_id_reply) \ _(COP_INTERFACE_ENABLE_DISABLE_REPLY, cop_interface_enable_disable_reply) \ _(COP_WHITELIST_ENABLE_DISABLE_REPLY, cop_whitelist_enable_disable_reply) \ @@ -5878,7 +5451,8 @@ _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \ _(NETMAP_CREATE_REPLY, netmap_create_reply) \ _(NETMAP_DELETE_REPLY, netmap_delete_reply) \ _(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \ -_(MPLS_FIB_DETAILS, mpls_fib_details) \ +_(MPLS_TABLE_DETAILS, mpls_table_details) \ +_(MPLS_ROUTE_DETAILS, mpls_route_details) \ _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \ _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \ _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \ @@ -5901,15 +5475,14 @@ _(IP_SOURCE_AND_PORT_RANGE_CHECK_ADD_DEL_REPLY, \ ip_source_and_port_range_check_add_del_reply) \ _(IP_SOURCE_AND_PORT_RANGE_CHECK_INTERFACE_ADD_DEL_REPLY, \ ip_source_and_port_range_check_interface_add_del_reply) \ -_(IPSEC_GRE_ADD_DEL_TUNNEL_REPLY, ipsec_gre_add_del_tunnel_reply) \ -_(IPSEC_GRE_TUNNEL_DETAILS, ipsec_gre_tunnel_details) \ _(DELETE_SUBIF_REPLY, delete_subif_reply) \ _(L2_INTERFACE_PBB_TAG_REWRITE_REPLY, l2_interface_pbb_tag_rewrite_reply) \ -_(PUNT_REPLY, punt_reply) \ -_(IP_FIB_DETAILS, ip_fib_details) \ -_(IP6_FIB_DETAILS, ip6_fib_details) \ +_(SET_PUNT_REPLY, set_punt_reply) \ +_(IP_TABLE_DETAILS, ip_table_details) \ +_(IP_ROUTE_DETAILS, ip_route_details) \ _(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \ _(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \ +_(SW_INTERFACE_ADD_DEL_MAC_ADDRESS_REPLY, sw_interface_add_del_mac_address_reply) \ _(L2_XCONNECT_DETAILS, l2_xconnect_details) \ _(HW_INTERFACE_SET_MTU_REPLY, hw_interface_set_mtu_reply) \ _(IP_NEIGHBOR_DETAILS, ip_neighbor_details) \ @@ -5920,10 +5493,6 @@ _(LLDP_CONFIG_REPLY, lldp_config_reply) \ _(SW_INTERFACE_SET_LLDP_REPLY, sw_interface_set_lldp_reply) \ _(TCP_CONFIGURE_SRC_ADDRESSES_REPLY, tcp_configure_src_addresses_reply) \ _(APP_NAMESPACE_ADD_DEL_REPLY, app_namespace_add_del_reply) \ -_(DNS_ENABLE_DISABLE_REPLY, dns_enable_disable_reply) \ -_(DNS_NAME_SERVER_ADD_DEL_REPLY, dns_name_server_add_del_reply) \ -_(DNS_RESOLVE_NAME_REPLY, dns_resolve_name_reply) \ -_(DNS_RESOLVE_IP_REPLY, dns_resolve_ip_reply) \ _(SESSION_RULE_ADD_DEL_REPLY, session_rule_add_del_reply) \ _(SESSION_RULES_DETAILS, session_rules_details) \ _(IP_CONTAINER_PROXY_ADD_DEL_REPLY, ip_container_proxy_add_del_reply) \ @@ -5931,13 +5500,7 @@ _(OUTPUT_ACL_SET_INTERFACE_REPLY, output_acl_set_interface_reply) \ _(QOS_RECORD_ENABLE_DISABLE_REPLY, qos_record_enable_disable_reply) #define foreach_standalone_reply_msg \ -_(SW_INTERFACE_EVENT, sw_interface_event) \ -_(VNET_INTERFACE_SIMPLE_COUNTERS, vnet_interface_simple_counters) \ -_(VNET_INTERFACE_COMBINED_COUNTERS, vnet_interface_combined_counters) \ -_(VNET_IP4_FIB_COUNTERS, vnet_ip4_fib_counters) \ -_(VNET_IP6_FIB_COUNTERS, vnet_ip6_fib_counters) \ -_(VNET_IP4_NBR_COUNTERS, vnet_ip4_nbr_counters) \ -_(VNET_IP6_NBR_COUNTERS, vnet_ip6_nbr_counters) +_(SW_INTERFACE_EVENT, sw_interface_event) typedef struct { @@ -6111,205 +5674,6 @@ dump_ipv6_table (vat_main_t * vam) return dump_ip_table (vam, 1); } -static char * -counter_type_to_str (u8 counter_type, u8 is_combined) -{ - if (!is_combined) - { - switch (counter_type) - { - case VNET_INTERFACE_COUNTER_DROP: - return "drop"; - case VNET_INTERFACE_COUNTER_PUNT: - return "punt"; - case VNET_INTERFACE_COUNTER_IP4: - return "ip4"; - case VNET_INTERFACE_COUNTER_IP6: - return "ip6"; - case VNET_INTERFACE_COUNTER_RX_NO_BUF: - return "rx-no-buf"; - case VNET_INTERFACE_COUNTER_RX_MISS: - return "rx-miss"; - case VNET_INTERFACE_COUNTER_RX_ERROR: - return "rx-error"; - case VNET_INTERFACE_COUNTER_TX_ERROR: - return "tx-error"; - default: - return "INVALID-COUNTER-TYPE"; - } - } - else - { - switch (counter_type) - { - case VNET_INTERFACE_COUNTER_RX: - return "rx"; - case VNET_INTERFACE_COUNTER_TX: - return "tx"; - default: - return "INVALID-COUNTER-TYPE"; - } - } -} - -static int -dump_stats_table (vat_main_t * vam) -{ - vat_json_node_t node; - vat_json_node_t *msg_array; - vat_json_node_t *msg; - vat_json_node_t *counter_array; - vat_json_node_t *counter; - interface_counter_t c; - u64 packets; - ip4_fib_counter_t *c4; - ip6_fib_counter_t *c6; - ip4_nbr_counter_t *n4; - ip6_nbr_counter_t *n6; - int i, j; - - if (!vam->json_output) - { - clib_warning ("dump_stats_table supported only in JSON format"); - return -99; - } - - vat_json_init_object (&node); - - /* interface counters */ - msg_array = vat_json_object_add (&node, "interface_counters"); - vat_json_init_array (msg_array); - for (i = 0; i < vec_len (vam->simple_interface_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_string_copy (msg, "vnet_counter_type", - (u8 *) counter_type_to_str (i, 0)); - vat_json_object_add_int (msg, "is_combined", 0); - counter_array = vat_json_object_add (msg, "data"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->simple_interface_counters[i]); j++) - { - packets = vam->simple_interface_counters[i][j]; - vat_json_array_add_uint (counter_array, packets); - } - } - for (i = 0; i < vec_len (vam->combined_interface_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_string_copy (msg, "vnet_counter_type", - (u8 *) counter_type_to_str (i, 1)); - vat_json_object_add_int (msg, "is_combined", 1); - counter_array = vat_json_object_add (msg, "data"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->combined_interface_counters[i]); j++) - { - c = vam->combined_interface_counters[i][j]; - counter = vat_json_array_add (counter_array); - vat_json_init_object (counter); - vat_json_object_add_uint (counter, "packets", c.packets); - vat_json_object_add_uint (counter, "bytes", c.bytes); - } - } - - /* ip4 fib counters */ - msg_array = vat_json_object_add (&node, "ip4_fib_counters"); - vat_json_init_array (msg_array); - for (i = 0; i < vec_len (vam->ip4_fib_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_uint (msg, "vrf_id", - vam->ip4_fib_counters_vrf_id_by_index[i]); - counter_array = vat_json_object_add (msg, "c"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->ip4_fib_counters[i]); j++) - { - counter = vat_json_array_add (counter_array); - vat_json_init_object (counter); - c4 = &vam->ip4_fib_counters[i][j]; - vat_json_object_add_ip4 (counter, "address", c4->address); - vat_json_object_add_uint (counter, "address_length", - c4->address_length); - vat_json_object_add_uint (counter, "packets", c4->packets); - vat_json_object_add_uint (counter, "bytes", c4->bytes); - } - } - - /* ip6 fib counters */ - msg_array = vat_json_object_add (&node, "ip6_fib_counters"); - vat_json_init_array (msg_array); - for (i = 0; i < vec_len (vam->ip6_fib_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_uint (msg, "vrf_id", - vam->ip6_fib_counters_vrf_id_by_index[i]); - counter_array = vat_json_object_add (msg, "c"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->ip6_fib_counters[i]); j++) - { - counter = vat_json_array_add (counter_array); - vat_json_init_object (counter); - c6 = &vam->ip6_fib_counters[i][j]; - vat_json_object_add_ip6 (counter, "address", c6->address); - vat_json_object_add_uint (counter, "address_length", - c6->address_length); - vat_json_object_add_uint (counter, "packets", c6->packets); - vat_json_object_add_uint (counter, "bytes", c6->bytes); - } - } - - /* ip4 nbr counters */ - msg_array = vat_json_object_add (&node, "ip4_nbr_counters"); - vat_json_init_array (msg_array); - for (i = 0; i < vec_len (vam->ip4_nbr_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_uint (msg, "sw_if_index", i); - counter_array = vat_json_object_add (msg, "c"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->ip4_nbr_counters[i]); j++) - { - counter = vat_json_array_add (counter_array); - vat_json_init_object (counter); - n4 = &vam->ip4_nbr_counters[i][j]; - vat_json_object_add_ip4 (counter, "address", n4->address); - vat_json_object_add_uint (counter, "link-type", n4->linkt); - vat_json_object_add_uint (counter, "packets", n4->packets); - vat_json_object_add_uint (counter, "bytes", n4->bytes); - } - } - - /* ip6 nbr counters */ - msg_array = vat_json_object_add (&node, "ip6_nbr_counters"); - vat_json_init_array (msg_array); - for (i = 0; i < vec_len (vam->ip6_nbr_counters); i++) - { - msg = vat_json_array_add (msg_array); - vat_json_init_object (msg); - vat_json_object_add_uint (msg, "sw_if_index", i); - counter_array = vat_json_object_add (msg, "c"); - vat_json_init_array (counter_array); - for (j = 0; j < vec_len (vam->ip6_nbr_counters[i]); j++) - { - counter = vat_json_array_add (counter_array); - vat_json_init_object (counter); - n6 = &vam->ip6_nbr_counters[i][j]; - vat_json_object_add_ip6 (counter, "address", n6->address); - vat_json_object_add_uint (counter, "packets", n6->packets); - vat_json_object_add_uint (counter, "bytes", n6->bytes); - } - } - - vat_json_print (vam->ofp, &node); - vat_json_free (&node); - - return 0; -} - /* * Pass CLI buffers directly in the CLI_INBAND API message, * instead of an additional shared memory area. @@ -6342,8 +5706,7 @@ exec_inband (vat_main_t * vam) */ u32 len = vec_len (vam->input->buffer); M2 (CLI_INBAND, mp, len); - clib_memcpy (mp->cmd, vam->input->buffer, len); - mp->length = htonl (len); + vl_api_to_api_string (len - 1, (const char *) vam->input->buffer, &mp->cmd); S (mp); W (ret); @@ -6437,38 +5800,6 @@ api_delete_loopback (vat_main_t * vam) return ret; } -static int -api_want_stats (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_want_stats_t *mp; - int enable = -1; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "enable")) - enable = 1; - else if (unformat (i, "disable")) - enable = 0; - else - break; - } - - if (enable == -1) - { - errmsg ("missing enable|disable"); - return -99; - } - - M (WANT_STATS, mp); - mp->enable_disable = enable; - - S (mp); - W (ret); - return ret; -} - static int api_want_interface_events (vat_main_t * vam) { @@ -6591,7 +5922,7 @@ api_sw_interface_set_flags (vat_main_t * vam) /* Construct the API message */ M (SW_INTERFACE_SET_FLAGS, mp); mp->sw_if_index = ntohl (sw_if_index); - mp->admin_up_down = admin_up; + mp->flags = ntohl ((admin_up) ? IF_STATUS_API_FLAG_ADMIN_UP : 0); /* send it... */ S (mp); @@ -6647,7 +5978,7 @@ api_sw_interface_set_rx_mode (vat_main_t * vam) /* Construct the API message */ M (SW_INTERFACE_SET_RX_MODE, mp); mp->sw_if_index = ntohl (sw_if_index); - mp->mode = mode; + mp->mode = (vl_api_rx_mode_t) mode; mp->queue_id_valid = queue_id_valid; mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0; @@ -6883,14 +6214,15 @@ api_sw_interface_add_del_address (vat_main_t * vam) mp->del_all = del_all; if (v6_address_set) { - mp->is_ipv6 = 1; - clib_memcpy (mp->address, &v6address, sizeof (v6address)); + mp->prefix.address.af = ADDRESS_IP6; + clib_memcpy (mp->prefix.address.un.ip6, &v6address, sizeof (v6address)); } else { - clib_memcpy (mp->address, &v4address, sizeof (v4address)); + mp->prefix.address.af = ADDRESS_IP4; + clib_memcpy (mp->prefix.address.un.ip4, &v4address, sizeof (v4address)); } - mp->address_length = address_length; + mp->prefix.len = address_length; /* send it... */ S (mp); @@ -7826,17 +7158,15 @@ api_bridge_flags (vat_main_t * vam) static int api_bd_ip_mac_add_del (vat_main_t * vam) { + vl_api_address_t ip = VL_API_ZERO_ADDRESS; + vl_api_mac_address_t mac = { 0 }; unformat_input_t *i = vam->input; vl_api_bd_ip_mac_add_del_t *mp; u32 bd_id; - u8 is_ipv6 = 0; u8 is_add = 1; u8 bd_id_set = 0; u8 ip_set = 0; u8 mac_set = 0; - ip4_address_t v4addr; - ip6_address_t v6addr; - u8 macaddr[6]; int ret; @@ -7847,16 +7177,11 @@ api_bd_ip_mac_add_del (vat_main_t * vam) { bd_id_set++; } - else if (unformat (i, "%U", unformat_ip4_address, &v4addr)) - { - ip_set++; - } - else if (unformat (i, "%U", unformat_ip6_address, &v6addr)) + else if (unformat (i, "%U", unformat_vl_api_address, &ip)) { ip_set++; - is_ipv6++; } - else if (unformat (i, "%U", unformat_ethernet_address, macaddr)) + else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac)) { mac_set++; } @@ -7884,38 +7209,61 @@ api_bd_ip_mac_add_del (vat_main_t * vam) M (BD_IP_MAC_ADD_DEL, mp); - mp->bd_id = ntohl (bd_id); - mp->is_ipv6 = is_ipv6; + mp->entry.bd_id = ntohl (bd_id); mp->is_add = is_add; - if (is_ipv6) - clib_memcpy (mp->ip_address, &v6addr, sizeof (v6addr)); - else - clib_memcpy (mp->ip_address, &v4addr, sizeof (v4addr)); - clib_memcpy (mp->mac_address, macaddr, 6); + + clib_memcpy (&mp->entry.ip, &ip, sizeof (ip)); + clib_memcpy (&mp->entry.mac, &mac, sizeof (mac)); + S (mp); W (ret); return ret; } -static void vl_api_bd_ip_mac_details_t_handler - (vl_api_bd_ip_mac_details_t * mp) +static int +api_bd_ip_mac_flush (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - u8 *ip = 0; + unformat_input_t *i = vam->input; + vl_api_bd_ip_mac_flush_t *mp; + u32 bd_id; + u8 bd_id_set = 0; + int ret; - if (!mp->is_ipv6) - ip = - format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address); - else - ip = - format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address); + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "bd_id %d", &bd_id)) + { + bd_id_set++; + } + else + break; + } - print (vam->ofp, - "\n%-5d %-7s %-20U %-30s", - ntohl (mp->bd_id), mp->is_ipv6 ? "ip6" : "ip4", - format_ethernet_address, mp->mac_address, ip); + if (bd_id_set == 0) + { + errmsg ("missing bridge domain"); + return -99; + } - vec_free (ip); + M (BD_IP_MAC_FLUSH, mp); + + mp->bd_id = ntohl (bd_id); + + S (mp); + W (ret); + return ret; +} + +static void vl_api_bd_ip_mac_details_t_handler + (vl_api_bd_ip_mac_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + print (vam->ofp, + "\n%-5d %U %U", + ntohl (mp->entry.bd_id), + format_vl_api_mac_address, mp->entry.mac, + format_vl_api_address, &mp->entry.ip); } static void vl_api_bd_ip_mac_details_t_handler_json @@ -7932,19 +7280,13 @@ static void vl_api_bd_ip_mac_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id)); - vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6); + vat_json_object_add_uint (node, "bd_id", ntohl (mp->entry.bd_id)); vat_json_object_add_string_copy (node, "mac_address", - format (0, "%U", format_ethernet_address, - &mp->mac_address)); + format (0, "%U", format_vl_api_mac_address, + &mp->entry.mac)); u8 *ip = 0; - if (!mp->is_ipv6) - ip = - format (0, "%U", format_ip4_address, (ip4_address_t *) mp->ip_address); - else - ip = - format (0, "%U", format_ip6_address, (ip6_address_t *) mp->ip_address); + ip = format (0, "%U", format_vl_api_address, &mp->entry.ip); vat_json_object_add_string_copy (node, "ip_address", ip); vec_free (ip); } @@ -7991,211 +7333,12 @@ api_bd_ip_mac_dump (vat_main_t * vam) return ret; } -static int -api_tap_connect (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_tap_connect_t *mp; - u8 mac_address[6]; - u8 random_mac = 1; - u8 name_set = 0; - u8 *tap_name; - u8 *tag = 0; - ip4_address_t ip4_address; - u32 ip4_mask_width; - int ip4_address_set = 0; - ip6_address_t ip6_address; - u32 ip6_mask_width; - int ip6_address_set = 0; - int ret; - - clib_memset (mac_address, 0, sizeof (mac_address)); - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) - { - random_mac = 0; - } - else if (unformat (i, "random-mac")) - random_mac = 1; - else if (unformat (i, "tapname %s", &tap_name)) - name_set = 1; - else if (unformat (i, "tag %s", &tag)) - ; - else if (unformat (i, "address %U/%d", - unformat_ip4_address, &ip4_address, &ip4_mask_width)) - ip4_address_set = 1; - else if (unformat (i, "address %U/%d", - unformat_ip6_address, &ip6_address, &ip6_mask_width)) - ip6_address_set = 1; - else - break; - } - - if (name_set == 0) - { - errmsg ("missing tap name"); - return -99; - } - if (vec_len (tap_name) > 63) - { - errmsg ("tap name too long"); - return -99; - } - vec_add1 (tap_name, 0); - - if (vec_len (tag) > 63) - { - errmsg ("tag too long"); - return -99; - } - - /* Construct the API message */ - M (TAP_CONNECT, mp); - - mp->use_random_mac = random_mac; - clib_memcpy (mp->mac_address, mac_address, 6); - clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name)); - if (tag) - clib_memcpy (mp->tag, tag, vec_len (tag)); - - if (ip4_address_set) - { - mp->ip4_address_set = 1; - clib_memcpy (mp->ip4_address, &ip4_address, sizeof (mp->ip4_address)); - mp->ip4_mask_width = ip4_mask_width; - } - if (ip6_address_set) - { - mp->ip6_address_set = 1; - clib_memcpy (mp->ip6_address, &ip6_address, sizeof (mp->ip6_address)); - mp->ip6_mask_width = ip6_mask_width; - } - - vec_free (tap_name); - vec_free (tag); - - /* send it... */ - S (mp); - - /* Wait for a reply... */ - W (ret); - return ret; -} - -static int -api_tap_modify (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_tap_modify_t *mp; - u8 mac_address[6]; - u8 random_mac = 1; - u8 name_set = 0; - u8 *tap_name; - u32 sw_if_index = ~0; - u8 sw_if_index_set = 0; - int ret; - - clib_memset (mac_address, 0, sizeof (mac_address)); - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) - { - random_mac = 0; - } - else if (unformat (i, "random-mac")) - random_mac = 1; - else if (unformat (i, "tapname %s", &tap_name)) - name_set = 1; - else - break; - } - - if (sw_if_index_set == 0) - { - errmsg ("missing vpp interface name"); - return -99; - } - if (name_set == 0) - { - errmsg ("missing tap name"); - return -99; - } - if (vec_len (tap_name) > 63) - { - errmsg ("tap name too long"); - } - vec_add1 (tap_name, 0); - - /* Construct the API message */ - M (TAP_MODIFY, mp); - - mp->use_random_mac = random_mac; - mp->sw_if_index = ntohl (sw_if_index); - clib_memcpy (mp->mac_address, mac_address, 6); - clib_memcpy (mp->tap_name, tap_name, vec_len (tap_name)); - vec_free (tap_name); - - /* send it... */ - S (mp); - - /* Wait for a reply... */ - W (ret); - return ret; -} - -static int -api_tap_delete (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_tap_delete_t *mp; - u32 sw_if_index = ~0; - u8 sw_if_index_set = 0; - int ret; - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else - break; - } - - if (sw_if_index_set == 0) - { - errmsg ("missing vpp interface name"); - return -99; - } - - /* Construct the API message */ - M (TAP_DELETE, mp); - - mp->sw_if_index = ntohl (sw_if_index); - - /* send it... */ - S (mp); - - /* Wait for a reply... */ - W (ret); - return ret; -} - static int api_tap_create_v2 (vat_main_t * vam) { unformat_input_t *i = vam->input; vl_api_tap_create_v2_t *mp; +#define TAP_FLAG_GSO (1 << 0) u8 mac_address[6]; u8 random_mac = 1; u32 id = ~0; @@ -8212,6 +7355,9 @@ api_tap_create_v2 (vat_main_t * vam) ip6_address_t host_ip6_gw; u8 host_ip6_gw_set = 0; u32 host_ip6_prefix_len = 0; + u8 host_mtu_set = 0; + u32 host_mtu_size = 0; + u32 tap_flags = 0; int ret; u32 rx_ring_sz = 0, tx_ring_sz = 0; @@ -8251,6 +7397,12 @@ api_tap_create_v2 (vat_main_t * vam) ; else if (unformat (i, "tx-ring-size %d", &tx_ring_sz)) ; + else if (unformat (i, "host-mtu-size %d", &host_mtu_size)) + host_mtu_set = 1; + else if (unformat (i, "no-gso")) + tap_flags &= ~TAP_FLAG_GSO; + else if (unformat (i, "gso")) + tap_flags |= TAP_FLAG_GSO; else break; } @@ -8300,6 +7452,11 @@ api_tap_create_v2 (vat_main_t * vam) errmsg ("tx ring size must be 32768 or lower. "); return -99; } + if (host_mtu_set && (host_mtu_size < 64 || host_mtu_size > 65355)) + { + errmsg ("host MTU size must be in between 64 and 65355. "); + return -99; + } /* Construct the API message */ M (TAP_CREATE_V2, mp); @@ -8313,6 +7470,9 @@ api_tap_create_v2 (vat_main_t * vam) mp->host_ip6_addr_set = host_ip6_prefix_len != 0; mp->rx_ring_sz = ntohs (rx_ring_sz); mp->tx_ring_sz = ntohs (tx_ring_sz); + mp->host_mtu_set = host_mtu_set; + mp->host_mtu_size = ntohl (host_mtu_size); + mp->tap_flags = ntohl (tap_flags); if (random_mac == 0) clib_memcpy (mp->mac_address, mac_address, 6); @@ -8384,6 +7544,119 @@ api_tap_delete_v2 (vat_main_t * vam) return ret; } +uword +unformat_vlib_pci_addr (unformat_input_t * input, va_list * args) +{ + vlib_pci_addr_t *addr = va_arg (*args, vlib_pci_addr_t *); + u32 x[4]; + + if (!unformat (input, "%x:%x:%x.%x", &x[0], &x[1], &x[2], &x[3])) + return 0; + + addr->domain = x[0]; + addr->bus = x[1]; + addr->slot = x[2]; + addr->function = x[3]; + + return 1; +} + +static int +api_virtio_pci_create (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_virtio_pci_create_t *mp; + u8 mac_address[6]; + u8 random_mac = 1; + u8 gso_enabled = 0; + u32 pci_addr = 0; + u64 features = (u64) ~ (0ULL); + int ret; + + clib_memset (mac_address, 0, sizeof (mac_address)); + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address)) + { + random_mac = 0; + } + else if (unformat (i, "pci-addr %U", unformat_vlib_pci_addr, &pci_addr)) + ; + else if (unformat (i, "features 0x%llx", &features)) + ; + else if (unformat (i, "gso-enabled")) + gso_enabled = 1; + else + break; + } + + if (pci_addr == 0) + { + errmsg ("pci address must be non zero. "); + return -99; + } + + /* Construct the API message */ + M (VIRTIO_PCI_CREATE, mp); + + mp->use_random_mac = random_mac; + + mp->pci_addr = htonl (pci_addr); + mp->features = clib_host_to_net_u64 (features); + mp->gso_enabled = gso_enabled; + + if (random_mac == 0) + clib_memcpy (mp->mac_address, mac_address, 6); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static int +api_virtio_pci_delete (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_virtio_pci_delete_t *mp; + u32 sw_if_index = ~0; + u8 sw_if_index_set = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else + break; + } + + if (sw_if_index_set == 0) + { + errmsg ("missing vpp interface name. "); + return -99; + } + + /* Construct the API message */ + M (VIRTIO_PCI_DELETE, mp); + + mp->sw_if_index = htonl (sw_if_index); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + static int api_bond_create (vat_main_t * vam) { @@ -8395,6 +7668,8 @@ api_bond_create (vat_main_t * vam) u8 mode; u8 lb; u8 mode_is_set = 0; + u32 id = ~0; + u8 numa_only = 0; clib_memset (mac_address, 0, sizeof (mac_address)); lb = BOND_LB_L2; @@ -8410,6 +7685,10 @@ api_bond_create (vat_main_t * vam) else if (unformat (i, "hw-addr %U", unformat_ethernet_address, mac_address)) custom_mac = 1; + else if (unformat (i, "numa-only")) + numa_only = 1; + else if (unformat (i, "id %u", &id)) + ; else break; } @@ -8425,8 +7704,10 @@ api_bond_create (vat_main_t * vam) mp->use_custom_mac = custom_mac; - mp->mode = mode; - mp->lb = lb; + mp->mode = htonl (mode); + mp->lb = htonl (lb); + mp->id = htonl (id); + mp->numa_only = numa_only; if (custom_mac) clib_memcpy (mp->mac_address, mac_address, 6); @@ -8609,8 +7890,8 @@ api_ip_table_add_del (vat_main_t * vam) /* Construct the API message */ M (IP_TABLE_ADD_DEL, mp); - mp->table_id = ntohl (table_id); - mp->is_ipv6 = is_ipv6; + mp->table.table_id = ntohl (table_id); + mp->table.is_ip6 = is_ipv6; mp->is_add = is_add; /* send it... */ @@ -8622,141 +7903,195 @@ api_ip_table_add_del (vat_main_t * vam) return ret; } -static int -api_ip_add_del_route (vat_main_t * vam) +uword +unformat_fib_path (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_ip_add_del_route_t *mp; - u32 sw_if_index = ~0, vrf_id = 0; - u8 is_ipv6 = 0; - u8 is_local = 0, is_drop = 0; - u8 is_unreach = 0, is_prohibit = 0; - u8 is_add = 1; - u32 next_hop_weight = 1; - u8 is_multipath = 0; - u8 address_set = 0; - u8 address_length_set = 0; - u32 next_hop_table_id = 0; - u32 resolve_attempts = 0; - u32 dst_address_length = 0; - u8 next_hop_set = 0; - ip4_address_t v4_dst_address, v4_next_hop_address; - ip6_address_t v6_dst_address, v6_next_hop_address; - int count = 1; - int j; - f64 before = 0; - u32 random_add_del = 0; - u32 *random_vector = 0; - uword *random_hash; - u32 random_seed = 0xdeaddabe; - u32 classify_table_index = ~0; - u8 is_classify = 0; - u8 resolve_host = 0, resolve_attached = 0; - vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL; - mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID; - mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID; + vat_main_t *vam = va_arg (*args, vat_main_t *); + vl_api_fib_path_t *path = va_arg (*args, vl_api_fib_path_t *); + u32 weight, preference; + mpls_label_t out_label; - clib_memset (&v4_next_hop_address, 0, sizeof (ip4_address_t)); - clib_memset (&v6_next_hop_address, 0, sizeof (ip6_address_t)); - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + clib_memset (path, 0, sizeof (*path)); + path->weight = 1; + path->sw_if_index = ~0; + path->rpf_id = ~0; + path->n_labels = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - ; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - ; - else if (unformat (i, "%U", unformat_ip4_address, &v4_dst_address)) + if (unformat (input, "%U %U", + unformat_vl_api_ip4_address, + &path->nh.address.ip4, + api_unformat_sw_if_index, vam, &path->sw_if_index)) { - address_set = 1; - is_ipv6 = 0; + path->proto = FIB_API_PATH_NH_PROTO_IP4; } - else if (unformat (i, "%U", unformat_ip6_address, &v6_dst_address)) + else if (unformat (input, "%U %U", + unformat_vl_api_ip6_address, + &path->nh.address.ip6, + api_unformat_sw_if_index, vam, &path->sw_if_index)) { - address_set = 1; - is_ipv6 = 1; + path->proto = FIB_API_PATH_NH_PROTO_IP6; } - else if (unformat (i, "/%d", &dst_address_length)) + else if (unformat (input, "weight %u", &weight)) { - address_length_set = 1; + path->weight = weight; } - - else if (is_ipv6 == 0 && unformat (i, "via %U", unformat_ip4_address, - &v4_next_hop_address)) + else if (unformat (input, "preference %u", &preference)) { - next_hop_set = 1; + path->preference = preference; } - else if (is_ipv6 == 1 && unformat (i, "via %U", unformat_ip6_address, - &v6_next_hop_address)) + else if (unformat (input, "%U next-hop-table %d", + unformat_vl_api_ip4_address, + &path->nh.address.ip4, &path->table_id)) { - next_hop_set = 1; + path->proto = FIB_API_PATH_NH_PROTO_IP4; } - else - if (unformat - (i, "via %U", api_unformat_sw_if_index, vam, &sw_if_index)) + else if (unformat (input, "%U next-hop-table %d", + unformat_vl_api_ip6_address, + &path->nh.address.ip6, &path->table_id)) { - next_hop_set = 1; + path->proto = FIB_API_PATH_NH_PROTO_IP6; } - else if (unformat (i, "via sw_if_index %d", &sw_if_index)) + else if (unformat (input, "%U", + unformat_vl_api_ip4_address, &path->nh.address.ip4)) { - next_hop_set = 1; + /* + * the recursive next-hops are by default in the default table + */ + path->table_id = 0; + path->sw_if_index = ~0; + path->proto = FIB_API_PATH_NH_PROTO_IP4; } - else if (unformat (i, "resolve-attempts %d", &resolve_attempts)) - ; - else if (unformat (i, "weight %d", &next_hop_weight)) + else if (unformat (input, "%U", + unformat_vl_api_ip6_address, &path->nh.address.ip6)) + { + /* + * the recursive next-hops are by default in the default table + */ + path->table_id = 0; + path->sw_if_index = ~0; + path->proto = FIB_API_PATH_NH_PROTO_IP6; + } + else if (unformat (input, "resolve-via-host")) + { + path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_HOST; + } + else if (unformat (input, "resolve-via-attached")) + { + path->flags |= FIB_API_PATH_FLAG_RESOLVE_VIA_ATTACHED; + } + else if (unformat (input, "ip4-lookup-in-table %d", &path->table_id)) + { + path->type = FIB_API_PATH_TYPE_LOCAL; + path->sw_if_index = ~0; + path->proto = FIB_API_PATH_NH_PROTO_IP4; + } + else if (unformat (input, "ip6-lookup-in-table %d", &path->table_id)) + { + path->type = FIB_API_PATH_TYPE_LOCAL; + path->sw_if_index = ~0; + path->proto = FIB_API_PATH_NH_PROTO_IP6; + } + else if (unformat (input, "sw_if_index %d", &path->sw_if_index)) ; - else if (unformat (i, "drop")) + else if (unformat (input, "via-label %d", &path->nh.via_label)) { - is_drop = 1; + path->proto = FIB_API_PATH_NH_PROTO_MPLS; + path->sw_if_index = ~0; } - else if (unformat (i, "null-send-unreach")) + else if (unformat (input, "l2-input-on %d", &path->sw_if_index)) { - is_unreach = 1; + path->proto = FIB_API_PATH_NH_PROTO_ETHERNET; + path->type = FIB_API_PATH_TYPE_INTERFACE_RX; } - else if (unformat (i, "null-send-prohibit")) + else if (unformat (input, "local")) { - is_prohibit = 1; + path->type = FIB_API_PATH_TYPE_LOCAL; } - else if (unformat (i, "local")) + else if (unformat (input, "out-labels")) + { + while (unformat (input, "%d", &out_label)) + { + path->label_stack[path->n_labels].label = out_label; + path->label_stack[path->n_labels].is_uniform = 0; + path->label_stack[path->n_labels].ttl = 64; + path->n_labels++; + } + } + else if (unformat (input, "via")) { - is_local = 1; + /* new path, back up and return */ + unformat_put_input (input); + unformat_put_input (input); + unformat_put_input (input); + unformat_put_input (input); + break; } - else if (unformat (i, "classify %d", &classify_table_index)) + else { - is_classify = 1; + return (0); } + } + + path->proto = ntohl (path->proto); + path->type = ntohl (path->type); + path->flags = ntohl (path->flags); + path->table_id = ntohl (path->table_id); + path->sw_if_index = ntohl (path->sw_if_index); + + return (1); +} + +static int +api_ip_route_add_del (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_ip_route_add_del_t *mp; + u32 vrf_id = 0; + u8 is_add = 1; + u8 is_multipath = 0; + u8 prefix_set = 0; + u8 path_count = 0; + vl_api_prefix_t pfx = { }; + vl_api_fib_path_t paths[8]; + int count = 1; + int j; + f64 before = 0; + u32 random_add_del = 0; + u32 *random_vector = 0; + u32 random_seed = 0xdeaddabe; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", unformat_vl_api_prefix, &pfx)) + prefix_set = 1; else if (unformat (i, "del")) is_add = 0; else if (unformat (i, "add")) is_add = 1; - else if (unformat (i, "resolve-via-host")) - resolve_host = 1; - else if (unformat (i, "resolve-via-attached")) - resolve_attached = 1; - else if (unformat (i, "multipath")) - is_multipath = 1; else if (unformat (i, "vrf %d", &vrf_id)) ; else if (unformat (i, "count %d", &count)) ; - else if (unformat (i, "lookup-in-vrf %d", &next_hop_table_id)) - ; - else if (unformat (i, "next-hop-table %d", &next_hop_table_id)) - ; - else if (unformat (i, "out-label %d", &next_hop_out_label)) - { - vl_api_fib_mpls_label_t fib_label = { - .label = ntohl (next_hop_out_label), - .ttl = 64, - .exp = 0, - }; - vec_add1 (next_hop_out_label_stack, fib_label); - } - else if (unformat (i, "via via-label %d", &next_hop_via_label)) - ; else if (unformat (i, "random")) random_add_del = 1; + else if (unformat (i, "multipath")) + is_multipath = 1; else if (unformat (i, "seed %d", &random_seed)) ; + else + if (unformat + (i, "via %U", unformat_fib_path, vam, &paths[path_count])) + { + path_count++; + if (8 == path_count) + { + errmsg ("max 8 paths"); + return -99; + } + } else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -8764,39 +8099,27 @@ api_ip_add_del_route (vat_main_t * vam) } } - if (!next_hop_set && !is_drop && !is_local && - !is_classify && !is_unreach && !is_prohibit && - MPLS_LABEL_INVALID == next_hop_via_label) + if (!path_count) { - errmsg - ("next hop / local / drop / unreach / prohibit / classify not set"); - return -99; - } - - if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label) - { - errmsg ("next hop and next-hop via label set"); - return -99; - } - if (address_set == 0) - { - errmsg ("missing addresses"); + errmsg ("specify a path; via ..."); return -99; } - - if (address_length_set == 0) + if (prefix_set == 0) { - errmsg ("missing address length"); + errmsg ("missing prefix"); return -99; } /* Generate a pile of unique, random routes */ if (random_add_del) { + ip4_address_t *i = (ip4_address_t *) & paths[0].nh.address.ip4; u32 this_random_address; + uword *random_hash; + random_hash = hash_create (count, sizeof (uword)); - hash_set (random_hash, v4_next_hop_address.as_u32, 1); + hash_set (random_hash, i->as_u32, 1); for (j = 0; j <= count; j++) { do @@ -8810,7 +8133,7 @@ api_ip_add_del_route (vat_main_t * vam) hash_set (random_hash, this_random_address, 1); } hash_free (random_hash); - v4_dst_address.as_u32 = random_vector[0]; + set_ip4_address (&pfx.address, random_vector[0]); } if (count > 1) @@ -8824,59 +8147,21 @@ api_ip_add_del_route (vat_main_t * vam) for (j = 0; j < count; j++) { /* Construct the API message */ - M2 (IP_ADD_DEL_ROUTE, mp, sizeof (vl_api_fib_mpls_label_t) * - vec_len (next_hop_out_label_stack)); - - mp->next_hop_sw_if_index = ntohl (sw_if_index); - mp->table_id = ntohl (vrf_id); + M2 (IP_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count); mp->is_add = is_add; - mp->is_drop = is_drop; - mp->is_unreach = is_unreach; - mp->is_prohibit = is_prohibit; - mp->is_ipv6 = is_ipv6; - mp->is_local = is_local; - mp->is_classify = is_classify; mp->is_multipath = is_multipath; - mp->is_resolve_host = resolve_host; - mp->is_resolve_attached = resolve_attached; - mp->next_hop_weight = next_hop_weight; - mp->next_hop_preference = 0; - mp->dst_address_length = dst_address_length; - mp->next_hop_table_id = ntohl (next_hop_table_id); - mp->classify_table_index = ntohl (classify_table_index); - mp->next_hop_via_label = ntohl (next_hop_via_label); - mp->next_hop_n_out_labels = vec_len (next_hop_out_label_stack); - if (0 != mp->next_hop_n_out_labels) - { - memcpy (mp->next_hop_out_label_stack, - next_hop_out_label_stack, - (vec_len (next_hop_out_label_stack) * - sizeof (vl_api_fib_mpls_label_t))); - vec_free (next_hop_out_label_stack); - } - - if (is_ipv6) - { - clib_memcpy (mp->dst_address, &v6_dst_address, - sizeof (v6_dst_address)); - if (next_hop_set) - clib_memcpy (mp->next_hop_address, &v6_next_hop_address, - sizeof (v6_next_hop_address)); - increment_v6_address (&v6_dst_address); - } - else - { - clib_memcpy (mp->dst_address, &v4_dst_address, - sizeof (v4_dst_address)); - if (next_hop_set) - clib_memcpy (mp->next_hop_address, &v4_next_hop_address, - sizeof (v4_next_hop_address)); - if (random_add_del) - v4_dst_address.as_u32 = random_vector[j + 1]; - else - increment_v4_address (&v4_dst_address); - } + + clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx)); + mp->route.table_id = ntohl (vrf_id); + mp->route.n_paths = path_count; + + clib_memcpy (&mp->route.paths, &paths, sizeof (paths[0]) * path_count); + + if (random_add_del) + set_ip4_address (&pfx.address, random_vector[j + 1]); + else + increment_address (&pfx.address); /* send it... */ S (mp); /* If we receive SIGTERM, stop now... */ @@ -8939,59 +8224,21 @@ static int api_ip_mroute_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; + u8 path_set = 0, prefix_set = 0, is_add = 1; vl_api_ip_mroute_add_del_t *mp; - u32 sw_if_index = ~0, vrf_id = 0; - u8 is_ipv6 = 0; - u8 is_local = 0; - u8 is_add = 1; - u8 address_set = 0; - u32 grp_address_length = 0; - ip4_address_t v4_grp_address, v4_src_address; - ip6_address_t v6_grp_address, v6_src_address; - mfib_itf_flags_t iflags = 0; mfib_entry_flags_t eflags = 0; + vl_api_mfib_path_t path; + vl_api_mprefix_t pfx = { }; + u32 vrf_id = 0; int ret; /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "sw_if_index %d", &sw_if_index)) - ; - else if (unformat (i, "%U %U", - unformat_ip4_address, &v4_src_address, - unformat_ip4_address, &v4_grp_address)) - { - grp_address_length = 64; - address_set = 1; - is_ipv6 = 0; - } - else if (unformat (i, "%U %U", - unformat_ip6_address, &v6_src_address, - unformat_ip6_address, &v6_grp_address)) - { - grp_address_length = 256; - address_set = 1; - is_ipv6 = 1; - } - else if (unformat (i, "%U", unformat_ip4_address, &v4_grp_address)) - { - clib_memset (&v4_src_address, 0, sizeof (v4_src_address)); - grp_address_length = 32; - address_set = 1; - is_ipv6 = 0; - } - else if (unformat (i, "%U", unformat_ip6_address, &v6_grp_address)) + if (unformat (i, "%U", unformat_vl_api_mprefix, &pfx)) { - clib_memset (&v6_src_address, 0, sizeof (v6_src_address)); - grp_address_length = 128; - address_set = 1; - is_ipv6 = 1; - } - else if (unformat (i, "/%d", &grp_address_length)) - ; - else if (unformat (i, "local")) - { - is_local = 1; + prefix_set = 1; + pfx.grp_address_length = htons (pfx.grp_address_length); } else if (unformat (i, "del")) is_add = 0; @@ -8999,10 +8246,12 @@ api_ip_mroute_add_del (vat_main_t * vam) is_add = 1; else if (unformat (i, "vrf %d", &vrf_id)) ; - else if (unformat (i, "%U", unformat_mfib_itf_flags, &iflags)) - ; + else if (unformat (i, "%U", unformat_mfib_itf_flags, &path.itf_flags)) + path.itf_flags = htonl (path.itf_flags); else if (unformat (i, "%U", unformat_mfib_entry_flags, &eflags)) ; + else if (unformat (i, "via %U", unformat_fib_path, vam, &path.path)) + path_set = 1; else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -9010,37 +8259,29 @@ api_ip_mroute_add_del (vat_main_t * vam) } } - if (address_set == 0) + if (prefix_set == 0) { errmsg ("missing addresses\n"); return -99; } + if (path_set == 0) + { + errmsg ("missing path\n"); + return -99; + } /* Construct the API message */ M (IP_MROUTE_ADD_DEL, mp); - mp->next_hop_sw_if_index = ntohl (sw_if_index); - mp->table_id = ntohl (vrf_id); - mp->is_add = is_add; - mp->is_ipv6 = is_ipv6; - mp->is_local = is_local; - mp->itf_flags = ntohl (iflags); - mp->entry_flags = ntohl (eflags); - mp->grp_address_length = grp_address_length; - mp->grp_address_length = ntohs (mp->grp_address_length); + mp->is_multipath = 1; - if (is_ipv6) - { - clib_memcpy (mp->grp_address, &v6_grp_address, sizeof (v6_grp_address)); - clib_memcpy (mp->src_address, &v6_src_address, sizeof (v6_src_address)); - } - else - { - clib_memcpy (mp->grp_address, &v4_grp_address, sizeof (v4_grp_address)); - clib_memcpy (mp->src_address, &v4_src_address, sizeof (v4_src_address)); + clib_memcpy (&mp->route.prefix, &pfx, sizeof (pfx)); + mp->route.table_id = htonl (vrf_id); + mp->route.n_paths = 1; + mp->route.entry_flags = htonl (eflags); - } + clib_memcpy (&mp->route.paths, &path, sizeof (path)); /* send it... */ S (mp); @@ -9083,7 +8324,7 @@ api_mpls_table_add_del (vat_main_t * vam) /* Construct the API message */ M (MPLS_TABLE_ADD_DEL, mp); - mp->mt_table_id = ntohl (table_id); + mp->mt_table.mt_table_id = ntohl (table_id); mp->mt_is_add = is_add; /* send it... */ @@ -9098,112 +8339,41 @@ api_mpls_table_add_del (vat_main_t * vam) static int api_mpls_route_add_del (vat_main_t * vam) { + u8 is_add = 1, path_count = 0, is_multipath = 0, is_eos = 0; + mpls_label_t local_label = MPLS_LABEL_INVALID; unformat_input_t *i = vam->input; vl_api_mpls_route_add_del_t *mp; - u32 sw_if_index = ~0, table_id = 0; - u8 is_add = 1; - u32 next_hop_weight = 1; - u8 is_multipath = 0; - u32 next_hop_table_id = 0; - u8 next_hop_set = 0; - ip4_address_t v4_next_hop_address = { - .as_u32 = 0, - }; - ip6_address_t v6_next_hop_address = { {0} }; - int count = 1; - int j; + vl_api_fib_path_t paths[8]; + int count = 1, j; f64 before = 0; - u32 classify_table_index = ~0; - u8 is_classify = 0; - u8 resolve_host = 0, resolve_attached = 0; - u8 is_interface_rx = 0; - mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID; - mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID; - vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL; - mpls_label_t local_label = MPLS_LABEL_INVALID; - u8 is_eos = 0; - dpo_proto_t next_hop_proto = DPO_PROTO_MPLS; /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - ; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - ; - else if (unformat (i, "%d", &local_label)) + if (unformat (i, "%d", &local_label)) ; else if (unformat (i, "eos")) is_eos = 1; else if (unformat (i, "non-eos")) is_eos = 0; - else if (unformat (i, "via %U", unformat_ip4_address, - &v4_next_hop_address)) - { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_IP4; - } - else if (unformat (i, "via %U", unformat_ip6_address, - &v6_next_hop_address)) - { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_IP6; - } - else if (unformat (i, "weight %d", &next_hop_weight)) - ; - else if (unformat (i, "classify %d", &classify_table_index)) - { - is_classify = 1; - } else if (unformat (i, "del")) is_add = 0; else if (unformat (i, "add")) is_add = 1; - else if (unformat (i, "resolve-via-host")) - resolve_host = 1; - else if (unformat (i, "resolve-via-attached")) - resolve_attached = 1; else if (unformat (i, "multipath")) is_multipath = 1; else if (unformat (i, "count %d", &count)) ; - else if (unformat (i, "via lookup-in-ip4-table %d", &next_hop_table_id)) - { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_IP4; - } - else if (unformat (i, "via lookup-in-ip6-table %d", &next_hop_table_id)) - { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_IP6; - } else if (unformat - (i, "via l2-input-on %U", api_unformat_sw_if_index, vam, - &sw_if_index)) + (i, "via %U", unformat_fib_path, vam, &paths[path_count])) { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_ETHERNET; - is_interface_rx = 1; - } - else if (unformat (i, "via l2-input-on sw_if_index %d", &sw_if_index)) - { - next_hop_set = 1; - next_hop_proto = DPO_PROTO_ETHERNET; - is_interface_rx = 1; - } - else if (unformat (i, "via next-hop-table %d", &next_hop_table_id)) - next_hop_set = 1; - else if (unformat (i, "via via-label %d", &next_hop_via_label)) - next_hop_set = 1; - else if (unformat (i, "out-label %d", &next_hop_out_label)) - { - vl_api_fib_mpls_label_t fib_label = { - .label = ntohl (next_hop_out_label), - .ttl = 64, - .exp = 0, - }; - vec_add1 (next_hop_out_label_stack, fib_label); + path_count++; + if (8 == path_count) + { + errmsg ("max 8 paths"); + return -99; + } } else { @@ -9212,9 +8382,9 @@ api_mpls_route_add_del (vat_main_t * vam) } } - if (!next_hop_set && !is_classify) + if (!path_count) { - errmsg ("next hop / classify not set"); + errmsg ("specify a path; via ..."); return -99; } @@ -9235,53 +8405,19 @@ api_mpls_route_add_del (vat_main_t * vam) for (j = 0; j < count; j++) { /* Construct the API message */ - M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) * - vec_len (next_hop_out_label_stack)); - - mp->mr_next_hop_sw_if_index = ntohl (sw_if_index); - mp->mr_table_id = ntohl (table_id); + M2 (MPLS_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count); mp->mr_is_add = is_add; - mp->mr_next_hop_proto = next_hop_proto; - mp->mr_is_classify = is_classify; mp->mr_is_multipath = is_multipath; - mp->mr_is_resolve_host = resolve_host; - mp->mr_is_resolve_attached = resolve_attached; - mp->mr_is_interface_rx = is_interface_rx; - mp->mr_next_hop_weight = next_hop_weight; - mp->mr_next_hop_preference = 0; - mp->mr_next_hop_table_id = ntohl (next_hop_table_id); - mp->mr_classify_table_index = ntohl (classify_table_index); - mp->mr_next_hop_via_label = ntohl (next_hop_via_label); - mp->mr_label = ntohl (local_label); - mp->mr_eos = is_eos; - - mp->mr_next_hop_n_out_labels = vec_len (next_hop_out_label_stack); - if (0 != mp->mr_next_hop_n_out_labels) - { - memcpy (mp->mr_next_hop_out_label_stack, - next_hop_out_label_stack, - vec_len (next_hop_out_label_stack) * - sizeof (vl_api_fib_mpls_label_t)); - vec_free (next_hop_out_label_stack); - } - - if (next_hop_set) - { - if (DPO_PROTO_IP4 == next_hop_proto) - { - clib_memcpy (mp->mr_next_hop, - &v4_next_hop_address, - sizeof (v4_next_hop_address)); - } - else if (DPO_PROTO_IP6 == next_hop_proto) - { - clib_memcpy (mp->mr_next_hop, - &v6_next_hop_address, - sizeof (v6_next_hop_address)); - } - } + mp->mr_route.mr_label = local_label; + mp->mr_route.mr_eos = is_eos; + mp->mr_route.mr_table_id = 0; + mp->mr_route.mr_n_paths = path_count; + + clib_memcpy (&mp->mr_route.mr_paths, paths, + sizeof (paths[0]) * path_count); + local_label++; /* send it... */ @@ -9340,6 +8476,7 @@ api_mpls_route_add_del (vat_main_t * vam) /* Return the good/bad news */ return (vam->retval); + return (0); } static int @@ -9349,29 +8486,16 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) vl_api_mpls_ip_bind_unbind_t *mp; u32 ip_table_id = 0; u8 is_bind = 1; - u8 is_ip4 = 1; - ip4_address_t v4_address; - ip6_address_t v6_address; - u32 address_length; - u8 address_set = 0; + vl_api_prefix_t pfx; + u8 prefix_set = 0; mpls_label_t local_label = MPLS_LABEL_INVALID; int ret; /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U/%d", unformat_ip4_address, - &v4_address, &address_length)) - { - is_ip4 = 1; - address_set = 1; - } - else if (unformat (i, "%U/%d", unformat_ip6_address, - &v6_address, &address_length)) - { - is_ip4 = 0; - address_set = 1; - } + if (unformat (i, "%U", unformat_vl_api_prefix, &pfx)) + prefix_set = 1; else if (unformat (i, "%d", &local_label)) ; else if (unformat (i, "table-id %d", &ip_table_id)) @@ -9387,9 +8511,9 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) } } - if (!address_set) + if (!prefix_set) { - errmsg ("IP address not set"); + errmsg ("IP prefix not set"); return -99; } @@ -9403,16 +8527,10 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) M (MPLS_IP_BIND_UNBIND, mp); mp->mb_is_bind = is_bind; - mp->mb_is_ip4 = is_ip4; mp->mb_ip_table_id = ntohl (ip_table_id); mp->mb_mpls_table_id = 0; mp->mb_label = ntohl (local_label); - mp->mb_address_length = address_length; - - if (is_ip4) - clib_memcpy (mp->mb_address, &v4_address, sizeof (v4_address)); - else - clib_memcpy (mp->mb_address, &v6_address, sizeof (v6_address)); + clib_memcpy (&mp->mb_prefix, &pfx, sizeof (pfx)); /* send it... */ S (mp); @@ -9420,6 +8538,7 @@ api_mpls_ip_bind_unbind (vat_main_t * vam) /* Wait for a reply... */ W (ret); return ret; + return (0); } static int @@ -9644,23 +8763,25 @@ api_bier_route_add_del (vat_main_t * vam) M2 (BIER_ROUTE_ADD_DEL, mp, sizeof (vl_api_fib_path_t)); mp->br_is_add = is_add; - mp->br_tbl_id.bt_set = set; - mp->br_tbl_id.bt_sub_domain = sub_domain; - mp->br_tbl_id.bt_hdr_len_id = hdr_len; - mp->br_bp = ntohs (bp); - mp->br_n_paths = 1; - mp->br_paths[0].n_labels = 1; - mp->br_paths[0].label_stack[0].label = ntohl (next_hop_out_label); - mp->br_paths[0].afi = (next_hop_proto_is_ip4 ? 0 : 1); + mp->br_route.br_tbl_id.bt_set = set; + mp->br_route.br_tbl_id.bt_sub_domain = sub_domain; + mp->br_route.br_tbl_id.bt_hdr_len_id = hdr_len; + mp->br_route.br_bp = ntohs (bp); + mp->br_route.br_n_paths = 1; + mp->br_route.br_paths[0].n_labels = 1; + mp->br_route.br_paths[0].label_stack[0].label = ntohl (next_hop_out_label); + mp->br_route.br_paths[0].proto = (next_hop_proto_is_ip4 ? + FIB_API_PATH_NH_PROTO_IP4 : + FIB_API_PATH_NH_PROTO_IP6); if (next_hop_proto_is_ip4) { - clib_memcpy (mp->br_paths[0].next_hop, + clib_memcpy (&mp->br_route.br_paths[0].nh.address.ip4, &v4_next_hop_address, sizeof (v4_next_hop_address)); } else { - clib_memcpy (mp->br_paths[0].next_hop, + clib_memcpy (&mp->br_route.br_paths[0].nh.address.ip6, &v6_next_hop_address, sizeof (v6_next_hop_address)); } @@ -9680,7 +8801,7 @@ api_proxy_arp_add_del (vat_main_t * vam) vl_api_proxy_arp_add_del_t *mp; u32 vrf_id = 0; u8 is_add = 1; - ip4_address_t lo, hi; + vl_api_ip4_address_t lo, hi; u8 range_set = 0; int ret; @@ -9688,8 +8809,8 @@ api_proxy_arp_add_del (vat_main_t * vam) { if (unformat (i, "vrf %d", &vrf_id)) ; - else if (unformat (i, "%U - %U", unformat_ip4_address, &lo, - unformat_ip4_address, &hi)) + else if (unformat (i, "%U - %U", unformat_vl_api_ip4_address, &lo, + unformat_vl_api_ip4_address, &hi)) range_set = 1; else if (unformat (i, "del")) is_add = 0; @@ -9708,10 +8829,10 @@ api_proxy_arp_add_del (vat_main_t * vam) M (PROXY_ARP_ADD_DEL, mp); - mp->proxy.vrf_id = ntohl (vrf_id); + mp->proxy.table_id = ntohl (vrf_id); mp->is_add = is_add; - clib_memcpy (mp->proxy.low_address, &lo, sizeof (mp->proxy.low_address)); - clib_memcpy (mp->proxy.hi_address, &hi, sizeof (mp->proxy.hi_address)); + clib_memcpy (mp->proxy.low, &lo, sizeof (lo)); + clib_memcpy (mp->proxy.hi, &hi, sizeof (hi)); S (mp); W (ret); @@ -9767,20 +8888,11 @@ api_mpls_tunnel_add_del (vat_main_t * vam) unformat_input_t *i = vam->input; vl_api_mpls_tunnel_add_del_t *mp; - u8 is_add = 1; - u8 l2_only = 0; + vl_api_fib_path_t paths[8]; u32 sw_if_index = ~0; - u32 next_hop_sw_if_index = ~0; - u32 next_hop_proto_is_ip4 = 1; - - u32 next_hop_table_id = 0; - ip4_address_t v4_next_hop_address = { - .as_u32 = 0, - }; - ip6_address_t v6_next_hop_address = { {0} }; - vl_api_fib_mpls_label_t *next_hop_out_label_stack = NULL; - mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID; - mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID; + u8 path_count = 0; + u8 l2_only = 0; + u8 is_add = 1; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) @@ -9793,36 +8905,18 @@ api_mpls_tunnel_add_del (vat_main_t * vam) is_add = 0; else if (unformat (i, "del sw_if_index %d", &sw_if_index)) is_add = 0; - else if (unformat (i, "via %U", - unformat_ip4_address, &v4_next_hop_address)) - { - next_hop_proto_is_ip4 = 1; - } - else if (unformat (i, "via %U", - unformat_ip6_address, &v6_next_hop_address)) - { - next_hop_proto_is_ip4 = 0; - } - else if (unformat (i, "via-label %d", &next_hop_via_label)) - ; - else - if (unformat - (i, "%U", api_unformat_sw_if_index, vam, &next_hop_sw_if_index)) - ; - else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index)) - ; else if (unformat (i, "l2-only")) l2_only = 1; - else if (unformat (i, "next-hop-table %d", &next_hop_table_id)) - ; - else if (unformat (i, "out-label %d", &next_hop_out_label)) + else + if (unformat + (i, "via %U", unformat_fib_path, vam, &paths[path_count])) { - vl_api_fib_mpls_label_t fib_label = { - .label = ntohl (next_hop_out_label), - .ttl = 64, - .exp = 0, - }; - vec_add1 (next_hop_out_label_stack, fib_label); + path_count++; + if (8 == path_count) + { + errmsg ("max 8 paths"); + return -99; + } } else { @@ -9831,40 +8925,16 @@ api_mpls_tunnel_add_del (vat_main_t * vam) } } - M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) * - vec_len (next_hop_out_label_stack)); + M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_path_t) * path_count); - mp->mt_next_hop_sw_if_index = ntohl (next_hop_sw_if_index); - mp->mt_sw_if_index = ntohl (sw_if_index); mp->mt_is_add = is_add; - mp->mt_l2_only = l2_only; - mp->mt_next_hop_table_id = ntohl (next_hop_table_id); - mp->mt_next_hop_proto_is_ip4 = next_hop_proto_is_ip4; - mp->mt_next_hop_via_label = ntohl (next_hop_via_label); - mp->mt_next_hop_weight = 1; - mp->mt_next_hop_preference = 0; - - mp->mt_next_hop_n_out_labels = vec_len (next_hop_out_label_stack); + mp->mt_tunnel.mt_sw_if_index = ntohl (sw_if_index); + mp->mt_tunnel.mt_l2_only = l2_only; + mp->mt_tunnel.mt_is_multicast = 0; + mp->mt_tunnel.mt_n_paths = path_count; - if (0 != mp->mt_next_hop_n_out_labels) - { - clib_memcpy (mp->mt_next_hop_out_label_stack, - next_hop_out_label_stack, - (vec_len (next_hop_out_label_stack) * - sizeof (vl_api_fib_mpls_label_t))); - vec_free (next_hop_out_label_stack); - } - - if (next_hop_proto_is_ip4) - { - clib_memcpy (mp->mt_next_hop, - &v4_next_hop_address, sizeof (v4_next_hop_address)); - } - else - { - clib_memcpy (mp->mt_next_hop, - &v6_next_hop_address, sizeof (v6_next_hop_address)); - } + clib_memcpy (&mp->mt_tunnel.mt_paths, &paths, + sizeof (paths[0]) * path_count); S (mp); W (ret); @@ -9919,27 +8989,26 @@ api_sw_interface_set_unnumbered (vat_main_t * vam) static int api_ip_neighbor_add_del (vat_main_t * vam) { + vl_api_mac_address_t mac_address; unformat_input_t *i = vam->input; vl_api_ip_neighbor_add_del_t *mp; + vl_api_address_t ip_address; u32 sw_if_index; u8 sw_if_index_set = 0; u8 is_add = 1; - u8 is_static = 0; - u8 is_no_fib_entry = 0; - u8 mac_address[6]; u8 mac_set = 0; - u8 v4_address_set = 0; - u8 v6_address_set = 0; - ip4_address_t v4address; - ip6_address_t v6address; + u8 address_set = 0; int ret; + ip_neighbor_flags_t flags; - clib_memset (mac_address, 0, sizeof (mac_address)); + flags = IP_NEIGHBOR_FLAG_NONE; + clib_memset (&ip_address, 0, sizeof (ip_address)); + clib_memset (&mac_address, 0, sizeof (mac_address)); /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "mac %U", unformat_ethernet_address, mac_address)) + if (unformat (i, "mac %U", unformat_vl_api_mac_address, &mac_address)) { mac_set = 1; } @@ -9950,14 +9019,12 @@ api_ip_neighbor_add_del (vat_main_t * vam) sw_if_index_set = 1; else if (unformat (i, "sw_if_index %d", &sw_if_index)) sw_if_index_set = 1; - else if (unformat (i, "is_static")) - is_static = 1; + else if (unformat (i, "static")) + flags |= IP_NEIGHBOR_FLAG_STATIC; else if (unformat (i, "no-fib-entry")) - is_no_fib_entry = 1; - else if (unformat (i, "dst %U", unformat_ip4_address, &v4address)) - v4_address_set = 1; - else if (unformat (i, "dst %U", unformat_ip6_address, &v6address)) - v6_address_set = 1; + flags |= IP_NEIGHBOR_FLAG_NO_FIB_ENTRY; + else if (unformat (i, "dst %U", unformat_vl_api_address, &ip_address)) + address_set = 1; else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -9970,12 +9037,7 @@ api_ip_neighbor_add_del (vat_main_t * vam) errmsg ("missing interface name or sw_if_index"); return -99; } - if (v4_address_set && v6_address_set) - { - errmsg ("both v4 and v6 addresses set"); - return -99; - } - if (!v4_address_set && !v6_address_set) + if (!address_set) { errmsg ("no address set"); return -99; @@ -9984,22 +9046,14 @@ api_ip_neighbor_add_del (vat_main_t * vam) /* Construct the API message */ M (IP_NEIGHBOR_ADD_DEL, mp); - mp->sw_if_index = ntohl (sw_if_index); + mp->neighbor.sw_if_index = ntohl (sw_if_index); mp->is_add = is_add; - mp->is_static = is_static; - mp->is_no_adj_fib = is_no_fib_entry; + mp->neighbor.flags = htonl (flags); if (mac_set) - clib_memcpy (mp->mac_address, mac_address, 6); - if (v6_address_set) - { - mp->is_ipv6 = 1; - clib_memcpy (mp->dst_address, &v6address, sizeof (v6address)); - } - else - { - /* mp->is_ipv6 = 0; via clib_memset in M macro above */ - clib_memcpy (mp->dst_address, &v4address, sizeof (v4address)); - } + clib_memcpy (&mp->neighbor.mac_address, &mac_address, + sizeof (mac_address)); + if (address_set) + clib_memcpy (&mp->neighbor.ip_address, &ip_address, sizeof (ip_address)); /* send it... */ S (mp); @@ -10067,6 +9121,16 @@ _(default_sub) \ _(outer_vlan_id_any) \ _(inner_vlan_id_any) +#define foreach_create_subif_flag \ +_(0, "no_tags") \ +_(1, "one_tag") \ +_(2, "two_tags") \ +_(3, "dot1ad") \ +_(4, "exact_match") \ +_(5, "default_sub") \ +_(6, "outer_vlan_id_any") \ +_(7, "inner_vlan_id_any") + static int api_create_subif (vat_main_t * vam) { @@ -10076,14 +9140,14 @@ api_create_subif (vat_main_t * vam) u8 sw_if_index_set = 0; u32 sub_id; u8 sub_id_set = 0; - u32 no_tags = 0; - u32 one_tag = 0; - u32 two_tags = 0; - u32 dot1ad = 0; - u32 exact_match = 0; - u32 default_sub = 0; - u32 outer_vlan_id_any = 0; - u32 inner_vlan_id_any = 0; + u32 __attribute__ ((unused)) no_tags = 0; + u32 __attribute__ ((unused)) one_tag = 0; + u32 __attribute__ ((unused)) two_tags = 0; + u32 __attribute__ ((unused)) dot1ad = 0; + u32 __attribute__ ((unused)) exact_match = 0; + u32 __attribute__ ((unused)) default_sub = 0; + u32 __attribute__ ((unused)) outer_vlan_id_any = 0; + u32 __attribute__ ((unused)) inner_vlan_id_any = 0; u32 tmp; u16 outer_vlan_id = 0; u16 inner_vlan_id = 0; @@ -10129,8 +9193,8 @@ api_create_subif (vat_main_t * vam) mp->sw_if_index = ntohl (sw_if_index); mp->sub_id = ntohl (sub_id); -#define _(a) mp->a = a; - foreach_create_subif_bit; +#define _(a,b) mp->sub_if_flags |= (1 << a); + foreach_create_subif_flag; #undef _ mp->outer_vlan_id = ntohs (outer_vlan_id); @@ -10142,27 +9206,21 @@ api_create_subif (vat_main_t * vam) } static int -api_oam_add_del (vat_main_t * vam) +api_reset_fib (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_oam_add_del_t *mp; + vl_api_reset_fib_t *mp; u32 vrf_id = 0; - u8 is_add = 1; - ip4_address_t src, dst; - u8 src_set = 0; - u8 dst_set = 0; - int ret; + u8 is_ipv6 = 0; + u8 vrf_id_set = 0; + int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "vrf %d", &vrf_id)) - ; - else if (unformat (i, "src %U", unformat_ip4_address, &src)) - src_set = 1; - else if (unformat (i, "dst %U", unformat_ip4_address, &dst)) - dst_set = 1; - else if (unformat (i, "del")) - is_add = 0; + vrf_id_set = 1; + else if (unformat (i, "ipv6")) + is_ipv6 = 1; else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -10170,24 +9228,16 @@ api_oam_add_del (vat_main_t * vam) } } - if (src_set == 0) - { - errmsg ("missing src addr"); - return -99; - } - - if (dst_set == 0) + if (vrf_id_set == 0) { - errmsg ("missing dst addr"); + errmsg ("missing vrf id"); return -99; } - M (OAM_ADD_DEL, mp); + M (RESET_FIB, mp); mp->vrf_id = ntohl (vrf_id); - mp->is_add = is_add; - clib_memcpy (mp->src_address, &src, sizeof (mp->src_address)); - clib_memcpy (mp->dst_address, &dst, sizeof (mp->dst_address)); + mp->is_ipv6 = is_ipv6; S (mp); W (ret); @@ -10195,21 +9245,40 @@ api_oam_add_del (vat_main_t * vam) } static int -api_reset_fib (vat_main_t * vam) +api_set_ip_flow_hash (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_reset_fib_t *mp; + vl_api_set_ip_flow_hash_t *mp; u32 vrf_id = 0; u8 is_ipv6 = 0; u8 vrf_id_set = 0; - + u8 src = 0; + u8 dst = 0; + u8 sport = 0; + u8 dport = 0; + u8 proto = 0; + u8 reverse = 0; int ret; + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "vrf %d", &vrf_id)) vrf_id_set = 1; else if (unformat (i, "ipv6")) is_ipv6 = 1; + else if (unformat (i, "src")) + src = 1; + else if (unformat (i, "dst")) + dst = 1; + else if (unformat (i, "sport")) + sport = 1; + else if (unformat (i, "dport")) + dport = 1; + else if (unformat (i, "proto")) + proto = 1; + else if (unformat (i, "reverse")) + reverse = 1; + else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -10223,8 +9292,13 @@ api_reset_fib (vat_main_t * vam) return -99; } - M (RESET_FIB, mp); - + M (SET_IP_FLOW_HASH, mp); + mp->src = src; + mp->dst = dst; + mp->sport = sport; + mp->dport = dport; + mp->proto = proto; + mp->reverse = reverse; mp->vrf_id = ntohl (vrf_id); mp->is_ipv6 = is_ipv6; @@ -10234,90 +9308,94 @@ api_reset_fib (vat_main_t * vam) } static int -api_dhcp_proxy_config (vat_main_t * vam) +api_sw_interface_ip6_enable_disable (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_dhcp_proxy_config_t *mp; - u32 rx_vrf_id = 0; - u32 server_vrf_id = 0; - u8 is_add = 1; - u8 v4_address_set = 0; - u8 v6_address_set = 0; - ip4_address_t v4address; - ip6_address_t v6address; - u8 v4_src_address_set = 0; - u8 v6_src_address_set = 0; - ip4_address_t v4srcaddress; - ip6_address_t v6srcaddress; + vl_api_sw_interface_ip6_enable_disable_t *mp; + u32 sw_if_index; + u8 sw_if_index_set = 0; + u8 enable = 0; int ret; - /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "rx_vrf_id %d", &rx_vrf_id)) - ; - else if (unformat (i, "server_vrf_id %d", &server_vrf_id)) - ; - else if (unformat (i, "svr %U", unformat_ip4_address, &v4address)) - v4_address_set = 1; - else if (unformat (i, "svr %U", unformat_ip6_address, &v6address)) - v6_address_set = 1; - else if (unformat (i, "src %U", unformat_ip4_address, &v4srcaddress)) - v4_src_address_set = 1; - else if (unformat (i, "src %U", unformat_ip6_address, &v6srcaddress)) - v6_src_address_set = 1; + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "enable")) + enable = 1; + else if (unformat (i, "disable")) + enable = 0; else - break; + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - if (v4_address_set && v6_address_set) - { - errmsg ("both v4 and v6 server addresses set"); - return -99; - } - if (!v4_address_set && !v6_address_set) + if (sw_if_index_set == 0) { - errmsg ("no server addresses set"); + errmsg ("missing interface name or sw_if_index"); return -99; } - if (v4_src_address_set && v6_src_address_set) + M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp); + + mp->sw_if_index = ntohl (sw_if_index); + mp->enable = enable; + + S (mp); + W (ret); + return ret; +} + +static int +api_ip6nd_proxy_add_del (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_ip6nd_proxy_add_del_t *mp; + u32 sw_if_index = ~0; + u8 v6_address_set = 0; + vl_api_ip6_address_t v6address; + u8 is_del = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - errmsg ("both v4 and v6 src addresses set"); - return -99; + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + ; + else if (unformat (i, "%U", unformat_vl_api_ip6_address, &v6address)) + v6_address_set = 1; + if (unformat (i, "del")) + is_del = 1; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - if (!v4_src_address_set && !v6_src_address_set) + + if (sw_if_index == ~0) { - errmsg ("no src addresses set"); + errmsg ("missing interface name or sw_if_index"); return -99; } - - if (!(v4_src_address_set && v4_address_set) && - !(v6_src_address_set && v6_address_set)) + if (!v6_address_set) { - errmsg ("no matching server and src addresses set"); + errmsg ("no address set"); return -99; } /* Construct the API message */ - M (DHCP_PROXY_CONFIG, mp); + M (IP6ND_PROXY_ADD_DEL, mp); - mp->is_add = is_add; - mp->rx_vrf_id = ntohl (rx_vrf_id); - mp->server_vrf_id = ntohl (server_vrf_id); - if (v6_address_set) - { - mp->is_ipv6 = 1; - clib_memcpy (mp->dhcp_server, &v6address, sizeof (v6address)); - clib_memcpy (mp->dhcp_src_address, &v6srcaddress, sizeof (v6address)); - } - else - { - clib_memcpy (mp->dhcp_server, &v4address, sizeof (v4address)); - clib_memcpy (mp->dhcp_src_address, &v4srcaddress, sizeof (v4address)); - } + mp->is_del = is_del; + mp->sw_if_index = ntohl (sw_if_index); + clib_memcpy (mp->ip, v6address, sizeof (v6address)); /* send it... */ S (mp); @@ -10327,57 +9405,40 @@ api_dhcp_proxy_config (vat_main_t * vam) return ret; } -#define vl_api_dhcp_proxy_details_t_endian vl_noop_handler -#define vl_api_dhcp_proxy_details_t_print vl_noop_handler - -static void -vl_api_dhcp_proxy_details_t_handler (vl_api_dhcp_proxy_details_t * mp) +static int +api_ip6nd_proxy_dump (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - u32 i, count = mp->count; - vl_api_dhcp_server_t *s; + vl_api_ip6nd_proxy_dump_t *mp; + vl_api_control_ping_t *mp_ping; + int ret; - if (mp->is_ipv6) - print (vam->ofp, - "RX Table-ID %d, Source Address %U, VSS Type %d, " - "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d", - ntohl (mp->rx_vrf_id), - format_ip6_address, mp->dhcp_src_address, - mp->vss_type, mp->vss_vpn_ascii_id, - ntohl (mp->vss_oui), ntohl (mp->vss_fib_id)); - else - print (vam->ofp, - "RX Table-ID %d, Source Address %U, VSS Type %d, " - "VSS ASCII VPN-ID '%s', VSS RFC2685 VPN-ID (oui:id) %d:%d", - ntohl (mp->rx_vrf_id), - format_ip4_address, mp->dhcp_src_address, - mp->vss_type, mp->vss_vpn_ascii_id, - ntohl (mp->vss_oui), ntohl (mp->vss_fib_id)); + M (IP6ND_PROXY_DUMP, mp); - for (i = 0; i < count; i++) - { - s = &mp->servers[i]; + S (mp); - if (mp->is_ipv6) - print (vam->ofp, - " Server Table-ID %d, Server Address %U", - ntohl (s->server_vrf_id), format_ip6_address, s->dhcp_server); - else - print (vam->ofp, - " Server Table-ID %d, Server Address %U", - ntohl (s->server_vrf_id), format_ip4_address, s->dhcp_server); - } + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + W (ret); + return ret; +} + +static void vl_api_ip6nd_proxy_details_t_handler + (vl_api_ip6nd_proxy_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + print (vam->ofp, "host %U sw_if_index %d", + format_vl_api_ip6_address, mp->ip, ntohl (mp->sw_if_index)); } -static void vl_api_dhcp_proxy_details_t_handler_json - (vl_api_dhcp_proxy_details_t * mp) +static void vl_api_ip6nd_proxy_details_t_handler_json + (vl_api_ip6nd_proxy_details_t * mp) { vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; - u32 i, count = mp->count; - struct in_addr ip4; struct in6_addr ip6; - vl_api_dhcp_server_t *s; + vat_json_node_t *node = NULL; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -10387,172 +9448,157 @@ static void vl_api_dhcp_proxy_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "rx-table-id", ntohl (mp->rx_vrf_id)); - vat_json_object_add_bytes (node, "vss-type", &mp->vss_type, - sizeof (mp->vss_type)); - vat_json_object_add_string_copy (node, "vss-vpn-ascii-id", - mp->vss_vpn_ascii_id); - vat_json_object_add_uint (node, "vss-fib-id", ntohl (mp->vss_fib_id)); - vat_json_object_add_uint (node, "vss-oui", ntohl (mp->vss_oui)); - - if (mp->is_ipv6) - { - clib_memcpy (&ip6, &mp->dhcp_src_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "src_address", ip6); - } - else - { - clib_memcpy (&ip4, &mp->dhcp_src_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - } - - for (i = 0; i < count; i++) - { - s = &mp->servers[i]; - - vat_json_object_add_uint (node, "server-table-id", - ntohl (s->server_vrf_id)); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - if (mp->is_ipv6) - { - clib_memcpy (&ip4, &s->dhcp_server, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - } - else - { - clib_memcpy (&ip6, &s->dhcp_server, sizeof (ip6)); - vat_json_object_add_ip6 (node, "server_address", ip6); - } - } + clib_memcpy (&ip6, mp->ip, sizeof (ip6)); + vat_json_object_add_ip6 (node, "host", ip6); } static int -api_dhcp_proxy_dump (vat_main_t * vam) +api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_control_ping_t *mp_ping; - vl_api_dhcp_proxy_dump_t *mp; - u8 is_ipv6 = 0; + vl_api_sw_interface_ip6nd_ra_prefix_t *mp; + u32 sw_if_index; + u8 sw_if_index_set = 0; + u8 v6_address_set = 0; + vl_api_prefix_t pfx; + u8 use_default = 0; + u8 no_advertise = 0; + u8 off_link = 0; + u8 no_autoconfig = 0; + u8 no_onlink = 0; + u8 is_no = 0; + u32 val_lifetime = 0; + u32 pref_lifetime = 0; int ret; + /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "ipv6")) - is_ipv6 = 1; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - M (DHCP_PROXY_DUMP, mp); - - mp->is_ip6 = is_ipv6; - S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - - W (ret); - return ret; -} - -static int -api_dhcp_proxy_set_vss (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_dhcp_proxy_set_vss_t *mp; - u8 is_ipv6 = 0; - u8 is_add = 1; - u32 tbl_id = ~0; - u8 vss_type = VSS_TYPE_DEFAULT; - u8 *vpn_ascii_id = 0; - u32 oui = 0; - u32 fib_id = 0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "tbl_id %d", &tbl_id)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "%U", unformat_vl_api_prefix, &pfx)) + v6_address_set = 1; + else if (unformat (i, "val_life %d", &val_lifetime)) ; - else if (unformat (i, "vpn_ascii_id %s", &vpn_ascii_id)) - vss_type = VSS_TYPE_ASCII; - else if (unformat (i, "fib_id %d", &fib_id)) - vss_type = VSS_TYPE_VPN_ID; - else if (unformat (i, "oui %d", &oui)) - vss_type = VSS_TYPE_VPN_ID; - else if (unformat (i, "ipv6")) - is_ipv6 = 1; - else if (unformat (i, "del")) - is_add = 0; + else if (unformat (i, "pref_life %d", &pref_lifetime)) + ; + else if (unformat (i, "def")) + use_default = 1; + else if (unformat (i, "noadv")) + no_advertise = 1; + else if (unformat (i, "offl")) + off_link = 1; + else if (unformat (i, "noauto")) + no_autoconfig = 1; + else if (unformat (i, "nolink")) + no_onlink = 1; + else if (unformat (i, "isno")) + is_no = 1; else - break; + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - if (tbl_id == ~0) + if (sw_if_index_set == 0) { - errmsg ("missing tbl_id "); - vec_free (vpn_ascii_id); + errmsg ("missing interface name or sw_if_index"); return -99; } - - if ((vpn_ascii_id) && (vec_len (vpn_ascii_id) > 128)) + if (!v6_address_set) { - errmsg ("vpn_ascii_id cannot be longer than 128 "); - vec_free (vpn_ascii_id); + errmsg ("no address set"); return -99; } - M (DHCP_PROXY_SET_VSS, mp); - mp->tbl_id = ntohl (tbl_id); - mp->vss_type = vss_type; - if (vpn_ascii_id) - { - clib_memcpy (mp->vpn_ascii_id, vpn_ascii_id, vec_len (vpn_ascii_id)); - mp->vpn_ascii_id[vec_len (vpn_ascii_id)] = 0; - } - mp->vpn_index = ntohl (fib_id); - mp->oui = ntohl (oui); - mp->is_ipv6 = is_ipv6; - mp->is_add = is_add; + /* Construct the API message */ + M (SW_INTERFACE_IP6ND_RA_PREFIX, mp); + + mp->sw_if_index = ntohl (sw_if_index); + clib_memcpy (&mp->prefix, &pfx, sizeof (pfx)); + mp->use_default = use_default; + mp->no_advertise = no_advertise; + mp->off_link = off_link; + mp->no_autoconfig = no_autoconfig; + mp->no_onlink = no_onlink; + mp->is_no = is_no; + mp->val_lifetime = ntohl (val_lifetime); + mp->pref_lifetime = ntohl (pref_lifetime); + /* send it... */ S (mp); - W (ret); - vec_free (vpn_ascii_id); + /* Wait for a reply, return good/bad news */ + W (ret); return ret; } static int -api_dhcp_client_config (vat_main_t * vam) +api_sw_interface_ip6nd_ra_config (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_dhcp_client_config_t *mp; + vl_api_sw_interface_ip6nd_ra_config_t *mp; u32 sw_if_index; u8 sw_if_index_set = 0; - u8 is_add = 1; - u8 *hostname = 0; - u8 disable_event = 0; + u8 suppress = 0; + u8 managed = 0; + u8 other = 0; + u8 ll_option = 0; + u8 send_unicast = 0; + u8 cease = 0; + u8 is_no = 0; + u8 default_router = 0; + u32 max_interval = 0; + u32 min_interval = 0; + u32 lifetime = 0; + u32 initial_count = 0; + u32 initial_interval = 0; int ret; + /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - else - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) sw_if_index_set = 1; else if (unformat (i, "sw_if_index %d", &sw_if_index)) sw_if_index_set = 1; - else if (unformat (i, "hostname %s", &hostname)) + else if (unformat (i, "maxint %d", &max_interval)) + ; + else if (unformat (i, "minint %d", &min_interval)) + ; + else if (unformat (i, "life %d", &lifetime)) ; - else if (unformat (i, "disable_event")) - disable_event = 1; + else if (unformat (i, "count %d", &initial_count)) + ; + else if (unformat (i, "interval %d", &initial_interval)) + ; + else if (unformat (i, "suppress") || unformat (i, "surpress")) + suppress = 1; + else if (unformat (i, "managed")) + managed = 1; + else if (unformat (i, "other")) + other = 1; + else if (unformat (i, "ll")) + ll_option = 1; + else if (unformat (i, "send")) + send_unicast = 1; + else if (unformat (i, "cease")) + cease = 1; + else if (unformat (i, "isno")) + is_no = 1; + else if (unformat (i, "def")) + default_router = 1; else - break; + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } if (sw_if_index_set == 0) @@ -10561,21 +9607,23 @@ api_dhcp_client_config (vat_main_t * vam) return -99; } - if (vec_len (hostname) > 63) - { - errmsg ("hostname too long"); - } - vec_add1 (hostname, 0); - /* Construct the API message */ - M (DHCP_CLIENT_CONFIG, mp); + M (SW_INTERFACE_IP6ND_RA_CONFIG, mp); - mp->is_add = is_add; - mp->client.sw_if_index = htonl (sw_if_index); - clib_memcpy (mp->client.hostname, hostname, vec_len (hostname)); - vec_free (hostname); - mp->client.want_dhcp_event = disable_event ? 0 : 1; - mp->client.pid = htonl (getpid ()); + mp->sw_if_index = ntohl (sw_if_index); + mp->max_interval = ntohl (max_interval); + mp->min_interval = ntohl (min_interval); + mp->lifetime = ntohl (lifetime); + mp->initial_count = ntohl (initial_count); + mp->initial_interval = ntohl (initial_interval); + mp->suppress = suppress; + mp->managed = managed; + mp->other = other; + mp->ll_option = ll_option; + mp->send_unicast = send_unicast; + mp->cease = cease; + mp->is_no = is_no; + mp->default_router = default_router; /* send it... */ S (mp); @@ -10586,40 +9634,21 @@ api_dhcp_client_config (vat_main_t * vam) } static int -api_set_ip_flow_hash (vat_main_t * vam) +api_set_arp_neighbor_limit (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_set_ip_flow_hash_t *mp; - u32 vrf_id = 0; + vl_api_set_arp_neighbor_limit_t *mp; + u32 arp_nbr_limit; + u8 limit_set = 0; u8 is_ipv6 = 0; - u8 vrf_id_set = 0; - u8 src = 0; - u8 dst = 0; - u8 sport = 0; - u8 dport = 0; - u8 proto = 0; - u8 reverse = 0; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "vrf %d", &vrf_id)) - vrf_id_set = 1; + if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit)) + limit_set = 1; else if (unformat (i, "ipv6")) is_ipv6 = 1; - else if (unformat (i, "src")) - src = 1; - else if (unformat (i, "dst")) - dst = 1; - else if (unformat (i, "sport")) - sport = 1; - else if (unformat (i, "dport")) - dport = 1; - else if (unformat (i, "proto")) - proto = 1; - else if (unformat (i, "reverse")) - reverse = 1; - else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -10627,20 +9656,15 @@ api_set_ip_flow_hash (vat_main_t * vam) } } - if (vrf_id_set == 0) + if (limit_set == 0) { - errmsg ("missing vrf id"); + errmsg ("missing limit value"); return -99; } - M (SET_IP_FLOW_HASH, mp); - mp->src = src; - mp->dst = dst; - mp->sport = sport; - mp->dport = dport; - mp->proto = proto; - mp->reverse = reverse; - mp->vrf_id = ntohl (vrf_id); + M (SET_ARP_NEIGHBOR_LIMIT, mp); + + mp->arp_neighbor_limit = ntohl (arp_nbr_limit); mp->is_ipv6 = is_ipv6; S (mp); @@ -10649,1553 +9673,483 @@ api_set_ip_flow_hash (vat_main_t * vam) } static int -api_sw_interface_ip6_enable_disable (vat_main_t * vam) +api_l2_patch_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_sw_interface_ip6_enable_disable_t *mp; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u8 enable = 0; + vl_api_l2_patch_add_del_t *mp; + u32 rx_sw_if_index; + u8 rx_sw_if_index_set = 0; + u32 tx_sw_if_index; + u8 tx_sw_if_index_set = 0; + u8 is_add = 1; int ret; + /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "enable")) - enable = 1; - else if (unformat (i, "disable")) - enable = 0; - else + if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index)) + rx_sw_if_index_set = 1; + else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index)) + tx_sw_if_index_set = 1; + else if (unformat (i, "rx")) { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; + if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, + &rx_sw_if_index)) + rx_sw_if_index_set = 1; + } + else + break; + } + else if (unformat (i, "tx")) + { + if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, + &tx_sw_if_index)) + tx_sw_if_index_set = 1; + } + else + break; } + else if (unformat (i, "del")) + is_add = 0; + else + break; } - if (sw_if_index_set == 0) + if (rx_sw_if_index_set == 0) { - errmsg ("missing interface name or sw_if_index"); + errmsg ("missing rx interface name or rx_sw_if_index"); return -99; } - M (SW_INTERFACE_IP6_ENABLE_DISABLE, mp); + if (tx_sw_if_index_set == 0) + { + errmsg ("missing tx interface name or tx_sw_if_index"); + return -99; + } - mp->sw_if_index = ntohl (sw_if_index); - mp->enable = enable; + M (L2_PATCH_ADD_DEL, mp); + + mp->rx_sw_if_index = ntohl (rx_sw_if_index); + mp->tx_sw_if_index = ntohl (tx_sw_if_index); + mp->is_add = is_add; S (mp); W (ret); return ret; } -static int -api_sw_interface_ip6_set_link_local_address (vat_main_t * vam) +u8 is_del; +u8 localsid_addr[16]; +u8 end_psp; +u8 behavior; +u32 sw_if_index; +u32 vlan_index; +u32 fib_table; +u8 nh_addr[16]; + +static int +api_sr_localsid_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_sw_interface_ip6_set_link_local_address_t *mp; + vl_api_sr_localsid_add_del_t *mp; + + u8 is_del; + ip6_address_t localsid; + u8 end_psp = 0; + u8 behavior = ~0; u32 sw_if_index; - u8 sw_if_index_set = 0; - u8 v6_address_set = 0; - ip6_address_t v6address; + u32 fib_table = ~(u32) 0; + ip6_address_t nh_addr6; + ip4_address_t nh_addr4; + clib_memset (&nh_addr6, 0, sizeof (ip6_address_t)); + clib_memset (&nh_addr4, 0, sizeof (ip4_address_t)); + + bool nexthop_set = 0; + int ret; - /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "%U", unformat_ip6_address, &v6address)) - v6_address_set = 1; + if (unformat (i, "del")) + is_del = 1; + else if (unformat (i, "address %U", unformat_ip6_address, &localsid)); + else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4)) + nexthop_set = 1; + else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6)) + nexthop_set = 1; + else if (unformat (i, "behavior %u", &behavior)); + else if (unformat (i, "sw_if_index %u", &sw_if_index)); + else if (unformat (i, "fib-table %u", &fib_table)); + else if (unformat (i, "end.psp %u", &behavior)); else break; } - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } - if (!v6_address_set) + M (SR_LOCALSID_ADD_DEL, mp); + + clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid)); + if (nexthop_set) { - errmsg ("no address set"); - return -99; + clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6)); + clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4)); } - - /* Construct the API message */ - M (SW_INTERFACE_IP6_SET_LINK_LOCAL_ADDRESS, mp); - + mp->behavior = behavior; mp->sw_if_index = ntohl (sw_if_index); - clib_memcpy (mp->address, &v6address, sizeof (v6address)); + mp->fib_table = ntohl (fib_table); + mp->end_psp = end_psp; + mp->is_del = is_del; - /* send it... */ S (mp); - - /* Wait for a reply, return good/bad news */ W (ret); return ret; } static int -api_ip6nd_proxy_add_del (vat_main_t * vam) +api_ioam_enable (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ip6nd_proxy_add_del_t *mp; - u32 sw_if_index = ~0; - u8 v6_address_set = 0; - ip6_address_t v6address; - u8 is_del = 0; + unformat_input_t *input = vam->input; + vl_api_ioam_enable_t *mp; + u32 id = 0; + int has_trace_option = 0; + int has_pot_option = 0; + int has_seqno_option = 0; + int has_analyse_option = 0; int ret; - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - ; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - ; - else if (unformat (i, "%U", unformat_ip6_address, &v6address)) - v6_address_set = 1; - if (unformat (i, "del")) - is_del = 1; + if (unformat (input, "trace")) + has_trace_option = 1; + else if (unformat (input, "pot")) + has_pot_option = 1; + else if (unformat (input, "seqno")) + has_seqno_option = 1; + else if (unformat (input, "analyse")) + has_analyse_option = 1; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index == ~0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } - if (!v6_address_set) - { - errmsg ("no address set"); - return -99; + break; } + M (IOAM_ENABLE, mp); + mp->id = htons (id); + mp->seqno = has_seqno_option; + mp->analyse = has_analyse_option; + mp->pot_enable = has_pot_option; + mp->trace_enable = has_trace_option; - /* Construct the API message */ - M (IP6ND_PROXY_ADD_DEL, mp); - - mp->is_del = is_del; - mp->sw_if_index = ntohl (sw_if_index); - clib_memcpy (mp->address, &v6address, sizeof (v6address)); - - /* send it... */ S (mp); - - /* Wait for a reply, return good/bad news */ W (ret); return ret; } + static int -api_ip6nd_proxy_dump (vat_main_t * vam) +api_ioam_disable (vat_main_t * vam) { - vl_api_ip6nd_proxy_dump_t *mp; - vl_api_control_ping_t *mp_ping; + vl_api_ioam_disable_t *mp; int ret; - M (IP6ND_PROXY_DUMP, mp); - + M (IOAM_DISABLE, mp); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } -static void vl_api_ip6nd_proxy_details_t_handler - (vl_api_ip6nd_proxy_details_t * mp) -{ - vat_main_t *vam = &vat_main; +#define foreach_tcp_proto_field \ +_(src_port) \ +_(dst_port) - print (vam->ofp, "host %U sw_if_index %d", - format_ip6_address, mp->address, ntohl (mp->sw_if_index)); -} +#define foreach_udp_proto_field \ +_(src_port) \ +_(dst_port) -static void vl_api_ip6nd_proxy_details_t_handler_json - (vl_api_ip6nd_proxy_details_t * mp) +#define foreach_ip4_proto_field \ +_(src_address) \ +_(dst_address) \ +_(tos) \ +_(length) \ +_(fragment_id) \ +_(ttl) \ +_(protocol) \ +_(checksum) + +typedef struct { - vat_main_t *vam = &vat_main; - struct in6_addr ip6; - vat_json_node_t *node = NULL; + u16 src_port, dst_port; +} tcpudp_header_t; - if (VAT_JSON_ARRAY != vam->json_tree.type) +#if VPP_API_TEST_BUILTIN == 0 +uword +unformat_tcp_mask (unformat_input_t * input, va_list * args) +{ + u8 **maskp = va_arg (*args, u8 **); + u8 *mask = 0; + u8 found_something = 0; + tcp_header_t *tcp; + +#define _(a) u8 a=0; + foreach_tcp_proto_field; +#undef _ + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + if (0); +#define _(a) else if (unformat (input, #a)) a=1; + foreach_tcp_proto_field +#undef _ + else + break; } - node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); +#define _(a) found_something += a; + foreach_tcp_proto_field; +#undef _ - clib_memcpy (&ip6, mp->address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "host", ip6); + if (found_something == 0) + return 0; + + vec_validate (mask, sizeof (*tcp) - 1); + + tcp = (tcp_header_t *) mask; + +#define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a)); + foreach_tcp_proto_field; +#undef _ + + *maskp = mask; + return 1; } -static int -api_sw_interface_ip6nd_ra_prefix (vat_main_t * vam) +uword +unformat_udp_mask (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_sw_interface_ip6nd_ra_prefix_t *mp; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u32 address_length = 0; - u8 v6_address_set = 0; - ip6_address_t v6address; - u8 use_default = 0; - u8 no_advertise = 0; - u8 off_link = 0; - u8 no_autoconfig = 0; - u8 no_onlink = 0; - u8 is_no = 0; - u32 val_lifetime = 0; - u32 pref_lifetime = 0; - int ret; + u8 **maskp = va_arg (*args, u8 **); + u8 *mask = 0; + u8 found_something = 0; + udp_header_t *udp; - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) +#define _(a) u8 a=0; + foreach_udp_proto_field; +#undef _ + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "%U/%d", - unformat_ip6_address, &v6address, &address_length)) - v6_address_set = 1; - else if (unformat (i, "val_life %d", &val_lifetime)) - ; - else if (unformat (i, "pref_life %d", &pref_lifetime)) - ; - else if (unformat (i, "def")) - use_default = 1; - else if (unformat (i, "noadv")) - no_advertise = 1; - else if (unformat (i, "offl")) - off_link = 1; - else if (unformat (i, "noauto")) - no_autoconfig = 1; - else if (unformat (i, "nolink")) - no_onlink = 1; - else if (unformat (i, "isno")) - is_no = 1; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } - if (!v6_address_set) - { - errmsg ("no address set"); - return -99; - } - - /* Construct the API message */ - M (SW_INTERFACE_IP6ND_RA_PREFIX, mp); - - mp->sw_if_index = ntohl (sw_if_index); - clib_memcpy (mp->address, &v6address, sizeof (v6address)); - mp->address_length = address_length; - mp->use_default = use_default; - mp->no_advertise = no_advertise; - mp->off_link = off_link; - mp->no_autoconfig = no_autoconfig; - mp->no_onlink = no_onlink; - mp->is_no = is_no; - mp->val_lifetime = ntohl (val_lifetime); - mp->pref_lifetime = ntohl (pref_lifetime); - - /* send it... */ - S (mp); - - /* Wait for a reply, return good/bad news */ - W (ret); - return ret; -} - -static int -api_sw_interface_ip6nd_ra_config (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_sw_interface_ip6nd_ra_config_t *mp; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u8 suppress = 0; - u8 managed = 0; - u8 other = 0; - u8 ll_option = 0; - u8 send_unicast = 0; - u8 cease = 0; - u8 is_no = 0; - u8 default_router = 0; - u32 max_interval = 0; - u32 min_interval = 0; - u32 lifetime = 0; - u32 initial_count = 0; - u32 initial_interval = 0; - int ret; - - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "maxint %d", &max_interval)) - ; - else if (unformat (i, "minint %d", &min_interval)) - ; - else if (unformat (i, "life %d", &lifetime)) - ; - else if (unformat (i, "count %d", &initial_count)) - ; - else if (unformat (i, "interval %d", &initial_interval)) - ; - else if (unformat (i, "suppress") || unformat (i, "surpress")) - suppress = 1; - else if (unformat (i, "managed")) - managed = 1; - else if (unformat (i, "other")) - other = 1; - else if (unformat (i, "ll")) - ll_option = 1; - else if (unformat (i, "send")) - send_unicast = 1; - else if (unformat (i, "cease")) - cease = 1; - else if (unformat (i, "isno")) - is_no = 1; - else if (unformat (i, "def")) - default_router = 1; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } - - /* Construct the API message */ - M (SW_INTERFACE_IP6ND_RA_CONFIG, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->max_interval = ntohl (max_interval); - mp->min_interval = ntohl (min_interval); - mp->lifetime = ntohl (lifetime); - mp->initial_count = ntohl (initial_count); - mp->initial_interval = ntohl (initial_interval); - mp->suppress = suppress; - mp->managed = managed; - mp->other = other; - mp->ll_option = ll_option; - mp->send_unicast = send_unicast; - mp->cease = cease; - mp->is_no = is_no; - mp->default_router = default_router; - - /* send it... */ - S (mp); - - /* Wait for a reply, return good/bad news */ - W (ret); - return ret; -} - -static int -api_set_arp_neighbor_limit (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_set_arp_neighbor_limit_t *mp; - u32 arp_nbr_limit; - u8 limit_set = 0; - u8 is_ipv6 = 0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "arp_nbr_limit %d", &arp_nbr_limit)) - limit_set = 1; - else if (unformat (i, "ipv6")) - is_ipv6 = 1; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (limit_set == 0) - { - errmsg ("missing limit value"); - return -99; - } - - M (SET_ARP_NEIGHBOR_LIMIT, mp); - - mp->arp_neighbor_limit = ntohl (arp_nbr_limit); - mp->is_ipv6 = is_ipv6; - - S (mp); - W (ret); - return ret; -} - -static int -api_l2_patch_add_del (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_l2_patch_add_del_t *mp; - u32 rx_sw_if_index; - u8 rx_sw_if_index_set = 0; - u32 tx_sw_if_index; - u8 tx_sw_if_index_set = 0; - u8 is_add = 1; - int ret; - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "rx_sw_if_index %d", &rx_sw_if_index)) - rx_sw_if_index_set = 1; - else if (unformat (i, "tx_sw_if_index %d", &tx_sw_if_index)) - tx_sw_if_index_set = 1; - else if (unformat (i, "rx")) - { - if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, - &rx_sw_if_index)) - rx_sw_if_index_set = 1; - } - else - break; - } - else if (unformat (i, "tx")) - { - if (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, - &tx_sw_if_index)) - tx_sw_if_index_set = 1; - } - else - break; - } - else if (unformat (i, "del")) - is_add = 0; - else - break; - } - - if (rx_sw_if_index_set == 0) - { - errmsg ("missing rx interface name or rx_sw_if_index"); - return -99; - } - - if (tx_sw_if_index_set == 0) - { - errmsg ("missing tx interface name or tx_sw_if_index"); - return -99; - } - - M (L2_PATCH_ADD_DEL, mp); - - mp->rx_sw_if_index = ntohl (rx_sw_if_index); - mp->tx_sw_if_index = ntohl (tx_sw_if_index); - mp->is_add = is_add; - - S (mp); - W (ret); - return ret; -} - -u8 is_del; -u8 localsid_addr[16]; -u8 end_psp; -u8 behavior; -u32 sw_if_index; -u32 vlan_index; -u32 fib_table; -u8 nh_addr[16]; - -static int -api_sr_localsid_add_del (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_sr_localsid_add_del_t *mp; - - u8 is_del; - ip6_address_t localsid; - u8 end_psp = 0; - u8 behavior = ~0; - u32 sw_if_index; - u32 fib_table = ~(u32) 0; - ip6_address_t nh_addr6; - ip4_address_t nh_addr4; - clib_memset (&nh_addr6, 0, sizeof (ip6_address_t)); - clib_memset (&nh_addr4, 0, sizeof (ip4_address_t)); - - bool nexthop_set = 0; - - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "del")) - is_del = 1; - else if (unformat (i, "address %U", unformat_ip6_address, &localsid)); - else if (unformat (i, "next-hop %U", unformat_ip4_address, &nh_addr4)) - nexthop_set = 1; - else if (unformat (i, "next-hop %U", unformat_ip6_address, &nh_addr6)) - nexthop_set = 1; - else if (unformat (i, "behavior %u", &behavior)); - else if (unformat (i, "sw_if_index %u", &sw_if_index)); - else if (unformat (i, "fib-table %u", &fib_table)); - else if (unformat (i, "end.psp %u", &behavior)); - else - break; - } - - M (SR_LOCALSID_ADD_DEL, mp); - - clib_memcpy (mp->localsid.addr, &localsid, sizeof (mp->localsid)); - if (nexthop_set) - { - clib_memcpy (mp->nh_addr6, &nh_addr6, sizeof (mp->nh_addr6)); - clib_memcpy (mp->nh_addr4, &nh_addr4, sizeof (mp->nh_addr4)); - } - mp->behavior = behavior; - mp->sw_if_index = ntohl (sw_if_index); - mp->fib_table = ntohl (fib_table); - mp->end_psp = end_psp; - mp->is_del = is_del; - - S (mp); - W (ret); - return ret; -} - -static int -api_ioam_enable (vat_main_t * vam) -{ - unformat_input_t *input = vam->input; - vl_api_ioam_enable_t *mp; - u32 id = 0; - int has_trace_option = 0; - int has_pot_option = 0; - int has_seqno_option = 0; - int has_analyse_option = 0; - int ret; - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "trace")) - has_trace_option = 1; - else if (unformat (input, "pot")) - has_pot_option = 1; - else if (unformat (input, "seqno")) - has_seqno_option = 1; - else if (unformat (input, "analyse")) - has_analyse_option = 1; - else - break; - } - M (IOAM_ENABLE, mp); - mp->id = htons (id); - mp->seqno = has_seqno_option; - mp->analyse = has_analyse_option; - mp->pot_enable = has_pot_option; - mp->trace_enable = has_trace_option; - - S (mp); - W (ret); - return ret; -} - - -static int -api_ioam_disable (vat_main_t * vam) -{ - vl_api_ioam_disable_t *mp; - int ret; - - M (IOAM_DISABLE, mp); - S (mp); - W (ret); - return ret; -} - -#define foreach_tcp_proto_field \ -_(src_port) \ -_(dst_port) - -#define foreach_udp_proto_field \ -_(src_port) \ -_(dst_port) - -#define foreach_ip4_proto_field \ -_(src_address) \ -_(dst_address) \ -_(tos) \ -_(length) \ -_(fragment_id) \ -_(ttl) \ -_(protocol) \ -_(checksum) - -typedef struct -{ - u16 src_port, dst_port; -} tcpudp_header_t; - -#if VPP_API_TEST_BUILTIN == 0 -uword -unformat_tcp_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u8 *mask = 0; - u8 found_something = 0; - tcp_header_t *tcp; - -#define _(a) u8 a=0; - foreach_tcp_proto_field; -#undef _ - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (0); -#define _(a) else if (unformat (input, #a)) a=1; - foreach_tcp_proto_field -#undef _ - else - break; - } - -#define _(a) found_something += a; - foreach_tcp_proto_field; -#undef _ - - if (found_something == 0) - return 0; - - vec_validate (mask, sizeof (*tcp) - 1); - - tcp = (tcp_header_t *) mask; - -#define _(a) if (a) clib_memset (&tcp->a, 0xff, sizeof (tcp->a)); - foreach_tcp_proto_field; -#undef _ - - *maskp = mask; - return 1; -} - -uword -unformat_udp_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u8 *mask = 0; - u8 found_something = 0; - udp_header_t *udp; - -#define _(a) u8 a=0; - foreach_udp_proto_field; -#undef _ - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (0); -#define _(a) else if (unformat (input, #a)) a=1; - foreach_udp_proto_field -#undef _ - else - break; - } - -#define _(a) found_something += a; - foreach_udp_proto_field; -#undef _ - - if (found_something == 0) - return 0; - - vec_validate (mask, sizeof (*udp) - 1); - - udp = (udp_header_t *) mask; - -#define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a)); - foreach_udp_proto_field; -#undef _ - - *maskp = mask; - return 1; -} - -uword -unformat_l4_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u16 src_port = 0, dst_port = 0; - tcpudp_header_t *tcpudp; - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "tcp %U", unformat_tcp_mask, maskp)) - return 1; - else if (unformat (input, "udp %U", unformat_udp_mask, maskp)) - return 1; - else if (unformat (input, "src_port")) - src_port = 0xFFFF; - else if (unformat (input, "dst_port")) - dst_port = 0xFFFF; - else - return 0; - } - - if (!src_port && !dst_port) - return 0; - - u8 *mask = 0; - vec_validate (mask, sizeof (tcpudp_header_t) - 1); - - tcpudp = (tcpudp_header_t *) mask; - tcpudp->src_port = src_port; - tcpudp->dst_port = dst_port; - - *maskp = mask; - - return 1; -} - -uword -unformat_ip4_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u8 *mask = 0; - u8 found_something = 0; - ip4_header_t *ip; - -#define _(a) u8 a=0; - foreach_ip4_proto_field; -#undef _ - u8 version = 0; - u8 hdr_length = 0; - - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "version")) - version = 1; - else if (unformat (input, "hdr_length")) - hdr_length = 1; - else if (unformat (input, "src")) - src_address = 1; - else if (unformat (input, "dst")) - dst_address = 1; - else if (unformat (input, "proto")) - protocol = 1; - -#define _(a) else if (unformat (input, #a)) a=1; - foreach_ip4_proto_field -#undef _ - else - break; - } - -#define _(a) found_something += a; - foreach_ip4_proto_field; -#undef _ - - if (found_something == 0) - return 0; - - vec_validate (mask, sizeof (*ip) - 1); - - ip = (ip4_header_t *) mask; - -#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a)); - foreach_ip4_proto_field; -#undef _ - - ip->ip_version_and_header_length = 0; - - if (version) - ip->ip_version_and_header_length |= 0xF0; - - if (hdr_length) - ip->ip_version_and_header_length |= 0x0F; - - *maskp = mask; - return 1; -} - -#define foreach_ip6_proto_field \ -_(src_address) \ -_(dst_address) \ -_(payload_length) \ -_(hop_limit) \ -_(protocol) - -uword -unformat_ip6_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u8 *mask = 0; - u8 found_something = 0; - ip6_header_t *ip; - u32 ip_version_traffic_class_and_flow_label; - -#define _(a) u8 a=0; - foreach_ip6_proto_field; -#undef _ - u8 version = 0; - u8 traffic_class = 0; - u8 flow_label = 0; - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "version")) - version = 1; - else if (unformat (input, "traffic-class")) - traffic_class = 1; - else if (unformat (input, "flow-label")) - flow_label = 1; - else if (unformat (input, "src")) - src_address = 1; - else if (unformat (input, "dst")) - dst_address = 1; - else if (unformat (input, "proto")) - protocol = 1; - -#define _(a) else if (unformat (input, #a)) a=1; - foreach_ip6_proto_field -#undef _ - else - break; - } - -#define _(a) found_something += a; - foreach_ip6_proto_field; -#undef _ - - if (found_something == 0) - return 0; - - vec_validate (mask, sizeof (*ip) - 1); - - ip = (ip6_header_t *) mask; - -#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a)); - foreach_ip6_proto_field; -#undef _ - - ip_version_traffic_class_and_flow_label = 0; - - if (version) - ip_version_traffic_class_and_flow_label |= 0xF0000000; - - if (traffic_class) - ip_version_traffic_class_and_flow_label |= 0x0FF00000; - - if (flow_label) - ip_version_traffic_class_and_flow_label |= 0x000FFFFF; - - ip->ip_version_traffic_class_and_flow_label = - clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label); - - *maskp = mask; - return 1; -} - -uword -unformat_l3_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp)) - return 1; - else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp)) - return 1; - else - break; - } - return 0; -} - -uword -unformat_l2_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u8 *mask = 0; - u8 src = 0; - u8 dst = 0; - u8 proto = 0; - u8 tag1 = 0; - u8 tag2 = 0; - u8 ignore_tag1 = 0; - u8 ignore_tag2 = 0; - u8 cos1 = 0; - u8 cos2 = 0; - u8 dot1q = 0; - u8 dot1ad = 0; - int len = 14; - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "src")) - src = 1; - else if (unformat (input, "dst")) - dst = 1; - else if (unformat (input, "proto")) - proto = 1; - else if (unformat (input, "tag1")) - tag1 = 1; - else if (unformat (input, "tag2")) - tag2 = 1; - else if (unformat (input, "ignore-tag1")) - ignore_tag1 = 1; - else if (unformat (input, "ignore-tag2")) - ignore_tag2 = 1; - else if (unformat (input, "cos1")) - cos1 = 1; - else if (unformat (input, "cos2")) - cos2 = 1; - else if (unformat (input, "dot1q")) - dot1q = 1; - else if (unformat (input, "dot1ad")) - dot1ad = 1; - else - break; - } - if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad + - ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0) - return 0; - - if (tag1 || ignore_tag1 || cos1 || dot1q) - len = 18; - if (tag2 || ignore_tag2 || cos2 || dot1ad) - len = 22; - - vec_validate (mask, len - 1); - - if (dst) - clib_memset (mask, 0xff, 6); - - if (src) - clib_memset (mask + 6, 0xff, 6); - - if (tag2 || dot1ad) - { - /* inner vlan tag */ - if (tag2) - { - mask[19] = 0xff; - mask[18] = 0x0f; - } - if (cos2) - mask[18] |= 0xe0; - if (proto) - mask[21] = mask[20] = 0xff; - if (tag1) - { - mask[15] = 0xff; - mask[14] = 0x0f; - } - if (cos1) - mask[14] |= 0xe0; - *maskp = mask; - return 1; - } - if (tag1 | dot1q) - { - if (tag1) - { - mask[15] = 0xff; - mask[14] = 0x0f; - } - if (cos1) - mask[14] |= 0xe0; - if (proto) - mask[16] = mask[17] = 0xff; - - *maskp = mask; - return 1; - } - if (cos2) - mask[18] |= 0xe0; - if (cos1) - mask[14] |= 0xe0; - if (proto) - mask[12] = mask[13] = 0xff; - - *maskp = mask; - return 1; -} - -uword -unformat_classify_mask (unformat_input_t * input, va_list * args) -{ - u8 **maskp = va_arg (*args, u8 **); - u32 *skipp = va_arg (*args, u32 *); - u32 *matchp = va_arg (*args, u32 *); - u32 match; - u8 *mask = 0; - u8 *l2 = 0; - u8 *l3 = 0; - u8 *l4 = 0; - int i; - - while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (input, "hex %U", unformat_hex_string, &mask)) - ; - else if (unformat (input, "l2 %U", unformat_l2_mask, &l2)) - ; - else if (unformat (input, "l3 %U", unformat_l3_mask, &l3)) - ; - else if (unformat (input, "l4 %U", unformat_l4_mask, &l4)) - ; - else - break; - } - - if (l4 && !l3) - { - vec_free (mask); - vec_free (l2); - vec_free (l4); - return 0; - } - - if (mask || l2 || l3 || l4) - { - if (l2 || l3 || l4) - { - /* "With a free Ethernet header in every package" */ - if (l2 == 0) - vec_validate (l2, 13); - mask = l2; - if (vec_len (l3)) - { - vec_append (mask, l3); - vec_free (l3); - } - if (vec_len (l4)) - { - vec_append (mask, l4); - vec_free (l4); - } - } - - /* Scan forward looking for the first significant mask octet */ - for (i = 0; i < vec_len (mask); i++) - if (mask[i]) - break; - - /* compute (skip, match) params */ - *skipp = i / sizeof (u32x4); - vec_delete (mask, *skipp * sizeof (u32x4), 0); - - /* Pad mask to an even multiple of the vector size */ - while (vec_len (mask) % sizeof (u32x4)) - vec_add1 (mask, 0); - - match = vec_len (mask) / sizeof (u32x4); - - for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4)) - { - u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4))); - if (*tmp || *(tmp + 1)) - break; - match--; - } - if (match == 0) - clib_warning ("BUG: match 0"); - - _vec_len (mask) = match * sizeof (u32x4); - - *matchp = match; - *maskp = mask; - - return 1; - } - - return 0; -} -#endif /* VPP_API_TEST_BUILTIN */ - -#define foreach_l2_next \ -_(drop, DROP) \ -_(ethernet, ETHERNET_INPUT) \ -_(ip4, IP4_INPUT) \ -_(ip6, IP6_INPUT) - -uword -unformat_l2_next_index (unformat_input_t * input, va_list * args) -{ - u32 *miss_next_indexp = va_arg (*args, u32 *); - u32 next_index = 0; - u32 tmp; - -#define _(n,N) \ - if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;} - foreach_l2_next; + if (0); +#define _(a) else if (unformat (input, #a)) a=1; + foreach_udp_proto_field #undef _ - - if (unformat (input, "%d", &tmp)) - { - next_index = tmp; - goto out; + else + break; } - return 0; - -out: - *miss_next_indexp = next_index; - return 1; -} - -#define foreach_ip_next \ -_(drop, DROP) \ -_(local, LOCAL) \ -_(rewrite, REWRITE) - -uword -api_unformat_ip_next_index (unformat_input_t * input, va_list * args) -{ - u32 *miss_next_indexp = va_arg (*args, u32 *); - u32 next_index = 0; - u32 tmp; - -#define _(n,N) \ - if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;} - foreach_ip_next; +#define _(a) found_something += a; + foreach_udp_proto_field; #undef _ - if (unformat (input, "%d", &tmp)) - { - next_index = tmp; - goto out; - } - - return 0; - -out: - *miss_next_indexp = next_index; - return 1; -} + if (found_something == 0) + return 0; -#define foreach_acl_next \ -_(deny, DENY) + vec_validate (mask, sizeof (*udp) - 1); -uword -api_unformat_acl_next_index (unformat_input_t * input, va_list * args) -{ - u32 *miss_next_indexp = va_arg (*args, u32 *); - u32 next_index = 0; - u32 tmp; + udp = (udp_header_t *) mask; -#define _(n,N) \ - if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;} - foreach_acl_next; +#define _(a) if (a) clib_memset (&udp->a, 0xff, sizeof (udp->a)); + foreach_udp_proto_field; #undef _ - if (unformat (input, "permit")) - { - next_index = ~0; - goto out; - } - else if (unformat (input, "%d", &tmp)) - { - next_index = tmp; - goto out; - } - - return 0; - -out: - *miss_next_indexp = next_index; - return 1; -} - -uword -unformat_policer_precolor (unformat_input_t * input, va_list * args) -{ - u32 *r = va_arg (*args, u32 *); - - if (unformat (input, "conform-color")) - *r = POLICE_CONFORM; - else if (unformat (input, "exceed-color")) - *r = POLICE_EXCEED; - else - return 0; - + *maskp = mask; return 1; } -static int -api_classify_add_del_table (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_classify_add_del_table_t *mp; - - u32 nbuckets = 2; - u32 skip = ~0; - u32 match = ~0; - int is_add = 1; - int del_chain = 0; - u32 table_index = ~0; - u32 next_table_index = ~0; - u32 miss_next_index = ~0; - u32 memory_size = 32 << 20; - u8 *mask = 0; - u32 current_data_flag = 0; - int current_data_offset = 0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "del-chain")) - { - is_add = 0; - del_chain = 1; - } - else if (unformat (i, "buckets %d", &nbuckets)) - ; - else if (unformat (i, "memory_size %d", &memory_size)) - ; - else if (unformat (i, "skip %d", &skip)) - ; - else if (unformat (i, "match %d", &match)) - ; - else if (unformat (i, "table %d", &table_index)) - ; - else if (unformat (i, "mask %U", unformat_classify_mask, - &mask, &skip, &match)) - ; - else if (unformat (i, "next-table %d", &next_table_index)) - ; - else if (unformat (i, "miss-next %U", api_unformat_ip_next_index, - &miss_next_index)) - ; - else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index, - &miss_next_index)) - ; - else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index, - &miss_next_index)) - ; - else if (unformat (i, "current-data-flag %d", ¤t_data_flag)) - ; - else if (unformat (i, "current-data-offset %d", ¤t_data_offset)) - ; - else - break; - } - - if (is_add && mask == 0) - { - errmsg ("Mask required"); - return -99; - } - - if (is_add && skip == ~0) - { - errmsg ("skip count required"); - return -99; - } - - if (is_add && match == ~0) - { - errmsg ("match count required"); - return -99; - } - - if (!is_add && table_index == ~0) - { - errmsg ("table index required for delete"); - return -99; - } - - M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask)); - - mp->is_add = is_add; - mp->del_chain = del_chain; - mp->table_index = ntohl (table_index); - mp->nbuckets = ntohl (nbuckets); - mp->memory_size = ntohl (memory_size); - mp->skip_n_vectors = ntohl (skip); - mp->match_n_vectors = ntohl (match); - mp->next_table_index = ntohl (next_table_index); - mp->miss_next_index = ntohl (miss_next_index); - mp->current_data_flag = ntohl (current_data_flag); - mp->current_data_offset = ntohl (current_data_offset); - mp->mask_len = ntohl (vec_len (mask)); - clib_memcpy (mp->mask, mask, vec_len (mask)); - - vec_free (mask); - - S (mp); - W (ret); - return ret; -} - -#if VPP_API_TEST_BUILTIN == 0 uword -unformat_l4_match (unformat_input_t * input, va_list * args) +unformat_l4_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); - - u8 *proto_header = 0; - int src_port = 0; - int dst_port = 0; - - tcpudp_header_t h; + u8 **maskp = va_arg (*args, u8 **); + u16 src_port = 0, dst_port = 0; + tcpudp_header_t *tcpudp; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "src_port %d", &src_port)) - ; - else if (unformat (input, "dst_port %d", &dst_port)) - ; + if (unformat (input, "tcp %U", unformat_tcp_mask, maskp)) + return 1; + else if (unformat (input, "udp %U", unformat_udp_mask, maskp)) + return 1; + else if (unformat (input, "src_port")) + src_port = 0xFFFF; + else if (unformat (input, "dst_port")) + dst_port = 0xFFFF; else return 0; } - h.src_port = clib_host_to_net_u16 (src_port); - h.dst_port = clib_host_to_net_u16 (dst_port); - vec_validate (proto_header, sizeof (h) - 1); - memcpy (proto_header, &h, sizeof (h)); + if (!src_port && !dst_port) + return 0; - *matchp = proto_header; + u8 *mask = 0; + vec_validate (mask, sizeof (tcpudp_header_t) - 1); + + tcpudp = (tcpudp_header_t *) mask; + tcpudp->src_port = src_port; + tcpudp->dst_port = dst_port; + + *maskp = mask; return 1; } uword -unformat_ip4_match (unformat_input_t * input, va_list * args) +unformat_ip4_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); - u8 *match = 0; + u8 **maskp = va_arg (*args, u8 **); + u8 *mask = 0; + u8 found_something = 0; ip4_header_t *ip; - int version = 0; - u32 version_val; - int hdr_length = 0; - u32 hdr_length_val; - int src = 0, dst = 0; - ip4_address_t src_val, dst_val; - int proto = 0; - u32 proto_val; - int tos = 0; - u32 tos_val; - int length = 0; - u32 length_val; - int fragment_id = 0; - u32 fragment_id_val; - int ttl = 0; - int ttl_val; - int checksum = 0; - u32 checksum_val; + +#define _(a) u8 a=0; + foreach_ip4_proto_field; +#undef _ + u8 version = 0; + u8 hdr_length = 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "version %d", &version_val)) + if (unformat (input, "version")) version = 1; - else if (unformat (input, "hdr_length %d", &hdr_length_val)) + else if (unformat (input, "hdr_length")) hdr_length = 1; - else if (unformat (input, "src %U", unformat_ip4_address, &src_val)) - src = 1; - else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val)) - dst = 1; - else if (unformat (input, "proto %d", &proto_val)) - proto = 1; - else if (unformat (input, "tos %d", &tos_val)) - tos = 1; - else if (unformat (input, "length %d", &length_val)) - length = 1; - else if (unformat (input, "fragment_id %d", &fragment_id_val)) - fragment_id = 1; - else if (unformat (input, "ttl %d", &ttl_val)) - ttl = 1; - else if (unformat (input, "checksum %d", &checksum_val)) - checksum = 1; - else + else if (unformat (input, "src")) + src_address = 1; + else if (unformat (input, "dst")) + dst_address = 1; + else if (unformat (input, "proto")) + protocol = 1; + +#define _(a) else if (unformat (input, #a)) a=1; + foreach_ip4_proto_field +#undef _ + else break; } - if (version + hdr_length + src + dst + proto + tos + length + fragment_id - + ttl + checksum == 0) - return 0; - - /* - * Aligned because we use the real comparison functions - */ - vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4)); +#define _(a) found_something += a; + foreach_ip4_proto_field; +#undef _ - ip = (ip4_header_t *) match; + if (found_something == 0) + return 0; - /* These are realistically matched in practice */ - if (src) - ip->src_address.as_u32 = src_val.as_u32; + vec_validate (mask, sizeof (*ip) - 1); - if (dst) - ip->dst_address.as_u32 = dst_val.as_u32; + ip = (ip4_header_t *) mask; - if (proto) - ip->protocol = proto_val; +#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a)); + foreach_ip4_proto_field; +#undef _ + ip->ip_version_and_header_length = 0; - /* These are not, but they're included for completeness */ if (version) - ip->ip_version_and_header_length |= (version_val & 0xF) << 4; + ip->ip_version_and_header_length |= 0xF0; if (hdr_length) - ip->ip_version_and_header_length |= (hdr_length_val & 0xF); - - if (tos) - ip->tos = tos_val; - - if (length) - ip->length = clib_host_to_net_u16 (length_val); - - if (ttl) - ip->ttl = ttl_val; - - if (checksum) - ip->checksum = clib_host_to_net_u16 (checksum_val); + ip->ip_version_and_header_length |= 0x0F; - *matchp = match; + *maskp = mask; return 1; } +#define foreach_ip6_proto_field \ +_(src_address) \ +_(dst_address) \ +_(payload_length) \ +_(hop_limit) \ +_(protocol) + uword -unformat_ip6_match (unformat_input_t * input, va_list * args) +unformat_ip6_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); - u8 *match = 0; + u8 **maskp = va_arg (*args, u8 **); + u8 *mask = 0; + u8 found_something = 0; ip6_header_t *ip; - int version = 0; - u32 version_val; + u32 ip_version_traffic_class_and_flow_label; + +#define _(a) u8 a=0; + foreach_ip6_proto_field; +#undef _ + u8 version = 0; u8 traffic_class = 0; - u32 traffic_class_val = 0; u8 flow_label = 0; - u8 flow_label_val; - int src = 0, dst = 0; - ip6_address_t src_val, dst_val; - int proto = 0; - u32 proto_val; - int payload_length = 0; - u32 payload_length_val; - int hop_limit = 0; - int hop_limit_val; - u32 ip_version_traffic_class_and_flow_label; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "version %d", &version_val)) + if (unformat (input, "version")) version = 1; - else if (unformat (input, "traffic_class %d", &traffic_class_val)) + else if (unformat (input, "traffic-class")) traffic_class = 1; - else if (unformat (input, "flow_label %d", &flow_label_val)) + else if (unformat (input, "flow-label")) flow_label = 1; - else if (unformat (input, "src %U", unformat_ip6_address, &src_val)) - src = 1; - else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val)) - dst = 1; - else if (unformat (input, "proto %d", &proto_val)) - proto = 1; - else if (unformat (input, "payload_length %d", &payload_length_val)) - payload_length = 1; - else if (unformat (input, "hop_limit %d", &hop_limit_val)) - hop_limit = 1; - else + else if (unformat (input, "src")) + src_address = 1; + else if (unformat (input, "dst")) + dst_address = 1; + else if (unformat (input, "proto")) + protocol = 1; + +#define _(a) else if (unformat (input, #a)) a=1; + foreach_ip6_proto_field +#undef _ + else break; } - if (version + traffic_class + flow_label + src + dst + proto + - payload_length + hop_limit == 0) - return 0; - - /* - * Aligned because we use the real comparison functions - */ - vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4)); +#define _(a) found_something += a; + foreach_ip6_proto_field; +#undef _ - ip = (ip6_header_t *) match; + if (found_something == 0) + return 0; - if (src) - clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address)); + vec_validate (mask, sizeof (*ip) - 1); - if (dst) - clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address)); + ip = (ip6_header_t *) mask; - if (proto) - ip->protocol = proto_val; +#define _(a) if (a) clib_memset (&ip->a, 0xff, sizeof (ip->a)); + foreach_ip6_proto_field; +#undef _ ip_version_traffic_class_and_flow_label = 0; if (version) - ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28; + ip_version_traffic_class_and_flow_label |= 0xF0000000; if (traffic_class) - ip_version_traffic_class_and_flow_label |= - (traffic_class_val & 0xFF) << 20; + ip_version_traffic_class_and_flow_label |= 0x0FF00000; if (flow_label) - ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF); + ip_version_traffic_class_and_flow_label |= 0x000FFFFF; ip->ip_version_traffic_class_and_flow_label = clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label); - if (payload_length) - ip->payload_length = clib_host_to_net_u16 (payload_length_val); - - if (hop_limit) - ip->hop_limit = hop_limit_val; - - *matchp = match; + *maskp = mask; return 1; } uword -unformat_l3_match (unformat_input_t * input, va_list * args) +unformat_l3_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); + u8 **maskp = va_arg (*args, u8 **); while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "ip4 %U", unformat_ip4_match, matchp)) + if (unformat (input, "ip4 %U", unformat_ip4_mask, maskp)) return 1; - else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp)) + else if (unformat (input, "ip6 %U", unformat_ip6_mask, maskp)) return 1; else break; @@ -12204,178 +10158,137 @@ unformat_l3_match (unformat_input_t * input, va_list * args) } uword -unformat_vlan_tag (unformat_input_t * input, va_list * args) -{ - u8 *tagp = va_arg (*args, u8 *); - u32 tag; - - if (unformat (input, "%d", &tag)) - { - tagp[0] = (tag >> 8) & 0x0F; - tagp[1] = tag & 0xFF; - return 1; - } - - return 0; -} - -uword -unformat_l2_match (unformat_input_t * input, va_list * args) +unformat_l2_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); - u8 *match = 0; + u8 **maskp = va_arg (*args, u8 **); + u8 *mask = 0; u8 src = 0; - u8 src_val[6]; u8 dst = 0; - u8 dst_val[6]; u8 proto = 0; - u16 proto_val; u8 tag1 = 0; - u8 tag1_val[2]; u8 tag2 = 0; - u8 tag2_val[2]; - int len = 14; u8 ignore_tag1 = 0; u8 ignore_tag2 = 0; u8 cos1 = 0; u8 cos2 = 0; - u32 cos1_val = 0; - u32 cos2_val = 0; + u8 dot1q = 0; + u8 dot1ad = 0; + int len = 14; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "src %U", unformat_ethernet_address, &src_val)) + if (unformat (input, "src")) src = 1; - else - if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val)) + else if (unformat (input, "dst")) dst = 1; - else if (unformat (input, "proto %U", - unformat_ethernet_type_host_byte_order, &proto_val)) + else if (unformat (input, "proto")) proto = 1; - else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val)) + else if (unformat (input, "tag1")) tag1 = 1; - else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val)) + else if (unformat (input, "tag2")) tag2 = 1; else if (unformat (input, "ignore-tag1")) ignore_tag1 = 1; else if (unformat (input, "ignore-tag2")) ignore_tag2 = 1; - else if (unformat (input, "cos1 %d", &cos1_val)) + else if (unformat (input, "cos1")) cos1 = 1; - else if (unformat (input, "cos2 %d", &cos2_val)) + else if (unformat (input, "cos2")) cos2 = 1; + else if (unformat (input, "dot1q")) + dot1q = 1; + else if (unformat (input, "dot1ad")) + dot1ad = 1; else break; } - if ((src + dst + proto + tag1 + tag2 + + if ((src + dst + proto + tag1 + tag2 + dot1q + dot1ad + ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0) return 0; - if (tag1 || ignore_tag1 || cos1) + if (tag1 || ignore_tag1 || cos1 || dot1q) len = 18; - if (tag2 || ignore_tag2 || cos2) + if (tag2 || ignore_tag2 || cos2 || dot1ad) len = 22; - vec_validate_aligned (match, len - 1, sizeof (u32x4)); + vec_validate (mask, len - 1); if (dst) - clib_memcpy (match, dst_val, 6); + clib_memset (mask, 0xff, 6); if (src) - clib_memcpy (match + 6, src_val, 6); + clib_memset (mask + 6, 0xff, 6); - if (tag2) + if (tag2 || dot1ad) { /* inner vlan tag */ - match[19] = tag2_val[1]; - match[18] = tag2_val[0]; - if (cos2) - match[18] |= (cos2_val & 0x7) << 5; - if (proto) + if (tag2) { - match[21] = proto_val & 0xff; - match[20] = proto_val >> 8; + mask[19] = 0xff; + mask[18] = 0x0f; } + if (cos2) + mask[18] |= 0xe0; + if (proto) + mask[21] = mask[20] = 0xff; if (tag1) { - match[15] = tag1_val[1]; - match[14] = tag1_val[0]; + mask[15] = 0xff; + mask[14] = 0x0f; } if (cos1) - match[14] |= (cos1_val & 0x7) << 5; - *matchp = match; + mask[14] |= 0xe0; + *maskp = mask; return 1; } - if (tag1) + if (tag1 | dot1q) { - match[15] = tag1_val[1]; - match[14] = tag1_val[0]; - if (proto) + if (tag1) { - match[17] = proto_val & 0xff; - match[16] = proto_val >> 8; + mask[15] = 0xff; + mask[14] = 0x0f; } if (cos1) - match[14] |= (cos1_val & 0x7) << 5; + mask[14] |= 0xe0; + if (proto) + mask[16] = mask[17] = 0xff; - *matchp = match; + *maskp = mask; return 1; } if (cos2) - match[18] |= (cos2_val & 0x7) << 5; + mask[18] |= 0xe0; if (cos1) - match[14] |= (cos1_val & 0x7) << 5; + mask[14] |= 0xe0; if (proto) - { - match[13] = proto_val & 0xff; - match[12] = proto_val >> 8; - } - - *matchp = match; - return 1; -} - -uword -unformat_qos_source (unformat_input_t * input, va_list * args) -{ - int *qs = va_arg (*args, int *); - - if (unformat (input, "ip")) - *qs = QOS_SOURCE_IP; - else if (unformat (input, "mpls")) - *qs = QOS_SOURCE_MPLS; - else if (unformat (input, "ext")) - *qs = QOS_SOURCE_EXT; - else if (unformat (input, "vlan")) - *qs = QOS_SOURCE_VLAN; - else - return 0; + mask[12] = mask[13] = 0xff; + *maskp = mask; return 1; } -#endif uword -api_unformat_classify_match (unformat_input_t * input, va_list * args) +unformat_classify_mask (unformat_input_t * input, va_list * args) { - u8 **matchp = va_arg (*args, u8 **); - u32 skip_n_vectors = va_arg (*args, u32); - u32 match_n_vectors = va_arg (*args, u32); - - u8 *match = 0; + u8 **maskp = va_arg (*args, u8 **); + u32 *skipp = va_arg (*args, u32 *); + u32 *matchp = va_arg (*args, u32 *); + u32 match; + u8 *mask = 0; u8 *l2 = 0; u8 *l3 = 0; u8 *l4 = 0; + int i; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "hex %U", unformat_hex_string, &match)) + if (unformat (input, "hex %U", unformat_hex_string, &mask)) ; - else if (unformat (input, "l2 %U", unformat_l2_match, &l2)) + else if (unformat (input, "l2 %U", unformat_l2_mask, &l2)) ; - else if (unformat (input, "l3 %U", unformat_l3_match, &l3)) + else if (unformat (input, "l3 %U", unformat_l3_mask, &l3)) ; - else if (unformat (input, "l4 %U", unformat_l4_match, &l4)) + else if (unformat (input, "l4 %U", unformat_l4_mask, &l4)) ; else break; @@ -12383,1669 +10296,1445 @@ api_unformat_classify_match (unformat_input_t * input, va_list * args) if (l4 && !l3) { - vec_free (match); + vec_free (mask); vec_free (l2); vec_free (l4); return 0; } - if (match || l2 || l3 || l4) + if (mask || l2 || l3 || l4) { if (l2 || l3 || l4) { - /* "Win a free Ethernet header in every packet" */ + /* "With a free Ethernet header in every package" */ if (l2 == 0) - vec_validate_aligned (l2, 13, sizeof (u32x4)); - match = l2; + vec_validate (l2, 13); + mask = l2; if (vec_len (l3)) { - vec_append_aligned (match, l3, sizeof (u32x4)); + vec_append (mask, l3); vec_free (l3); } if (vec_len (l4)) { - vec_append_aligned (match, l4, sizeof (u32x4)); + vec_append (mask, l4); vec_free (l4); } } - /* Make sure the vector is big enough even if key is all 0's */ - vec_validate_aligned - (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1, - sizeof (u32x4)); + /* Scan forward looking for the first significant mask octet */ + for (i = 0; i < vec_len (mask); i++) + if (mask[i]) + break; - /* Set size, include skipped vectors */ - _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4); + /* compute (skip, match) params */ + *skipp = i / sizeof (u32x4); + vec_delete (mask, *skipp * sizeof (u32x4), 0); + + /* Pad mask to an even multiple of the vector size */ + while (vec_len (mask) % sizeof (u32x4)) + vec_add1 (mask, 0); + + match = vec_len (mask) / sizeof (u32x4); + + for (i = match * sizeof (u32x4); i > 0; i -= sizeof (u32x4)) + { + u64 *tmp = (u64 *) (mask + (i - sizeof (u32x4))); + if (*tmp || *(tmp + 1)) + break; + match--; + } + if (match == 0) + clib_warning ("BUG: match 0"); + + _vec_len (mask) = match * sizeof (u32x4); *matchp = match; + *maskp = mask; return 1; } return 0; } +#endif /* VPP_API_TEST_BUILTIN */ + +#define foreach_l2_next \ +_(drop, DROP) \ +_(ethernet, ETHERNET_INPUT) \ +_(ip4, IP4_INPUT) \ +_(ip6, IP6_INPUT) + +uword +unformat_l2_next_index (unformat_input_t * input, va_list * args) +{ + u32 *miss_next_indexp = va_arg (*args, u32 *); + u32 next_index = 0; + u32 tmp; + +#define _(n,N) \ + if (unformat (input, #n)) { next_index = L2_INPUT_CLASSIFY_NEXT_##N; goto out;} + foreach_l2_next; +#undef _ + + if (unformat (input, "%d", &tmp)) + { + next_index = tmp; + goto out; + } + + return 0; + +out: + *miss_next_indexp = next_index; + return 1; +} + +#define foreach_ip_next \ +_(drop, DROP) \ +_(local, LOCAL) \ +_(rewrite, REWRITE) + +uword +api_unformat_ip_next_index (unformat_input_t * input, va_list * args) +{ + u32 *miss_next_indexp = va_arg (*args, u32 *); + u32 next_index = 0; + u32 tmp; + +#define _(n,N) \ + if (unformat (input, #n)) { next_index = IP_LOOKUP_NEXT_##N; goto out;} + foreach_ip_next; +#undef _ + + if (unformat (input, "%d", &tmp)) + { + next_index = tmp; + goto out; + } + + return 0; + +out: + *miss_next_indexp = next_index; + return 1; +} + +#define foreach_acl_next \ +_(deny, DENY) + +uword +api_unformat_acl_next_index (unformat_input_t * input, va_list * args) +{ + u32 *miss_next_indexp = va_arg (*args, u32 *); + u32 next_index = 0; + u32 tmp; + +#define _(n,N) \ + if (unformat (input, #n)) { next_index = ACL_NEXT_INDEX_##N; goto out;} + foreach_acl_next; +#undef _ + + if (unformat (input, "permit")) + { + next_index = ~0; + goto out; + } + else if (unformat (input, "%d", &tmp)) + { + next_index = tmp; + goto out; + } + + return 0; + +out: + *miss_next_indexp = next_index; + return 1; +} + +uword +unformat_policer_precolor (unformat_input_t * input, va_list * args) +{ + u32 *r = va_arg (*args, u32 *); + + if (unformat (input, "conform-color")) + *r = POLICE_CONFORM; + else if (unformat (input, "exceed-color")) + *r = POLICE_EXCEED; + else + return 0; + + return 1; +} static int -api_classify_add_del_session (vat_main_t * vam) +api_classify_add_del_table (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_classify_add_del_session_t *mp; + vl_api_classify_add_del_table_t *mp; + + u32 nbuckets = 2; + u32 skip = ~0; + u32 match = ~0; int is_add = 1; + int del_chain = 0; u32 table_index = ~0; - u32 hit_next_index = ~0; - u32 opaque_index = ~0; - u8 *match = 0; - i32 advance = 0; - u32 skip_n_vectors = 0; - u32 match_n_vectors = 0; - u32 action = 0; - u32 metadata = 0; + u32 next_table_index = ~0; + u32 miss_next_index = ~0; + u32 memory_size = 32 << 20; + u8 *mask = 0; + u32 current_data_flag = 0; + int current_data_offset = 0; int ret; - /* - * Warning: you have to supply skip_n and match_n - * because the API client cant simply look at the classify - * table object. - */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "del")) is_add = 0; - else if (unformat (i, "hit-next %U", api_unformat_ip_next_index, - &hit_next_index)) - ; - else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index, - &hit_next_index)) + else if (unformat (i, "del-chain")) + { + is_add = 0; + del_chain = 1; + } + else if (unformat (i, "buckets %d", &nbuckets)) ; - else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index, - &hit_next_index)) + else if (unformat (i, "memory_size %d", &memory_size)) ; - else if (unformat (i, "policer-hit-next %d", &hit_next_index)) + else if (unformat (i, "skip %d", &skip)) ; - else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index)) + else if (unformat (i, "match %d", &match)) ; - else if (unformat (i, "opaque-index %d", &opaque_index)) + else if (unformat (i, "table %d", &table_index)) ; - else if (unformat (i, "skip_n %d", &skip_n_vectors)) + else if (unformat (i, "mask %U", unformat_classify_mask, + &mask, &skip, &match)) ; - else if (unformat (i, "match_n %d", &match_n_vectors)) + else if (unformat (i, "next-table %d", &next_table_index)) ; - else if (unformat (i, "match %U", api_unformat_classify_match, - &match, skip_n_vectors, match_n_vectors)) + else if (unformat (i, "miss-next %U", api_unformat_ip_next_index, + &miss_next_index)) ; - else if (unformat (i, "advance %d", &advance)) + else if (unformat (i, "l2-miss-next %U", unformat_l2_next_index, + &miss_next_index)) ; - else if (unformat (i, "table-index %d", &table_index)) + else if (unformat (i, "acl-miss-next %U", api_unformat_acl_next_index, + &miss_next_index)) ; - else if (unformat (i, "action set-ip4-fib-id %d", &metadata)) - action = 1; - else if (unformat (i, "action set-ip6-fib-id %d", &metadata)) - action = 2; - else if (unformat (i, "action %d", &action)) + else if (unformat (i, "current-data-flag %d", ¤t_data_flag)) ; - else if (unformat (i, "metadata %d", &metadata)) + else if (unformat (i, "current-data-offset %d", ¤t_data_offset)) ; else break; } - if (table_index == ~0) + if (is_add && mask == 0) { - errmsg ("Table index required"); + errmsg ("Mask required"); return -99; } - if (is_add && match == 0) + if (is_add && skip == ~0) { - errmsg ("Match value required"); + errmsg ("skip count required"); return -99; } - M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match)); + if (is_add && match == ~0) + { + errmsg ("match count required"); + return -99; + } + + if (!is_add && table_index == ~0) + { + errmsg ("table index required for delete"); + return -99; + } + + M2 (CLASSIFY_ADD_DEL_TABLE, mp, vec_len (mask)); mp->is_add = is_add; + mp->del_chain = del_chain; mp->table_index = ntohl (table_index); - mp->hit_next_index = ntohl (hit_next_index); - mp->opaque_index = ntohl (opaque_index); - mp->advance = ntohl (advance); - mp->action = action; - mp->metadata = ntohl (metadata); - mp->match_len = ntohl (vec_len (match)); - clib_memcpy (mp->match, match, vec_len (match)); - vec_free (match); + mp->nbuckets = ntohl (nbuckets); + mp->memory_size = ntohl (memory_size); + mp->skip_n_vectors = ntohl (skip); + mp->match_n_vectors = ntohl (match); + mp->next_table_index = ntohl (next_table_index); + mp->miss_next_index = ntohl (miss_next_index); + mp->current_data_flag = ntohl (current_data_flag); + mp->current_data_offset = ntohl (current_data_offset); + mp->mask_len = ntohl (vec_len (mask)); + clib_memcpy (mp->mask, mask, vec_len (mask)); + + vec_free (mask); S (mp); W (ret); return ret; } -static int -api_classify_set_interface_ip_table (vat_main_t * vam) +#if VPP_API_TEST_BUILTIN == 0 +uword +unformat_l4_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_classify_set_interface_ip_table_t *mp; - u32 sw_if_index; - int sw_if_index_set; - u32 table_index = ~0; - u8 is_ipv6 = 0; - int ret; + u8 **matchp = va_arg (*args, u8 **); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + u8 *proto_header = 0; + int src_port = 0; + int dst_port = 0; + + tcpudp_header_t h; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "table %d", &table_index)) + if (unformat (input, "src_port %d", &src_port)) + ; + else if (unformat (input, "dst_port %d", &dst_port)) ; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; + return 0; } + h.src_port = clib_host_to_net_u16 (src_port); + h.dst_port = clib_host_to_net_u16 (dst_port); + vec_validate (proto_header, sizeof (h) - 1); + memcpy (proto_header, &h, sizeof (h)); - M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->table_index = ntohl (table_index); - mp->is_ipv6 = is_ipv6; + *matchp = proto_header; - S (mp); - W (ret); - return ret; + return 1; } -static int -api_classify_set_interface_l2_tables (vat_main_t * vam) +uword +unformat_ip4_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_classify_set_interface_l2_tables_t *mp; - u32 sw_if_index; - int sw_if_index_set; - u32 ip4_table_index = ~0; - u32 ip6_table_index = ~0; - u32 other_table_index = ~0; - u32 is_input = 1; - int ret; + u8 **matchp = va_arg (*args, u8 **); + u8 *match = 0; + ip4_header_t *ip; + int version = 0; + u32 version_val; + int hdr_length = 0; + u32 hdr_length_val; + int src = 0, dst = 0; + ip4_address_t src_val, dst_val; + int proto = 0; + u32 proto_val; + int tos = 0; + u32 tos_val; + int length = 0; + u32 length_val; + int fragment_id = 0; + u32 fragment_id_val; + int ttl = 0; + int ttl_val; + int checksum = 0; + u32 checksum_val; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "ip4-table %d", &ip4_table_index)) - ; - else if (unformat (i, "ip6-table %d", &ip6_table_index)) - ; - else if (unformat (i, "other-table %d", &other_table_index)) - ; - else if (unformat (i, "is-input %d", &is_input)) - ; + if (unformat (input, "version %d", &version_val)) + version = 1; + else if (unformat (input, "hdr_length %d", &hdr_length_val)) + hdr_length = 1; + else if (unformat (input, "src %U", unformat_ip4_address, &src_val)) + src = 1; + else if (unformat (input, "dst %U", unformat_ip4_address, &dst_val)) + dst = 1; + else if (unformat (input, "proto %d", &proto_val)) + proto = 1; + else if (unformat (input, "tos %d", &tos_val)) + tos = 1; + else if (unformat (input, "length %d", &length_val)) + length = 1; + else if (unformat (input, "fragment_id %d", &fragment_id_val)) + fragment_id = 1; + else if (unformat (input, "ttl %d", &ttl_val)) + ttl = 1; + else if (unformat (input, "checksum %d", &checksum_val)) + checksum = 1; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; } - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } + if (version + hdr_length + src + dst + proto + tos + length + fragment_id + + ttl + checksum == 0) + return 0; + /* + * Aligned because we use the real comparison functions + */ + vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4)); - M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp); + ip = (ip4_header_t *) match; - mp->sw_if_index = ntohl (sw_if_index); - mp->ip4_table_index = ntohl (ip4_table_index); - mp->ip6_table_index = ntohl (ip6_table_index); - mp->other_table_index = ntohl (other_table_index); - mp->is_input = (u8) is_input; + /* These are realistically matched in practice */ + if (src) + ip->src_address.as_u32 = src_val.as_u32; - S (mp); - W (ret); - return ret; -} + if (dst) + ip->dst_address.as_u32 = dst_val.as_u32; -static int -api_set_ipfix_exporter (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_set_ipfix_exporter_t *mp; - ip4_address_t collector_address; - u8 collector_address_set = 0; - u32 collector_port = ~0; - ip4_address_t src_address; - u8 src_address_set = 0; - u32 vrf_id = ~0; - u32 path_mtu = ~0; - u32 template_interval = ~0; - u8 udp_checksum = 0; - int ret; + if (proto) + ip->protocol = proto_val; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "collector_address %U", unformat_ip4_address, - &collector_address)) - collector_address_set = 1; - else if (unformat (i, "collector_port %d", &collector_port)) - ; - else if (unformat (i, "src_address %U", unformat_ip4_address, - &src_address)) - src_address_set = 1; - else if (unformat (i, "vrf_id %d", &vrf_id)) - ; - else if (unformat (i, "path_mtu %d", &path_mtu)) - ; - else if (unformat (i, "template_interval %d", &template_interval)) - ; - else if (unformat (i, "udp_checksum")) - udp_checksum = 1; - else - break; - } - if (collector_address_set == 0) - { - errmsg ("collector_address required"); - return -99; - } + /* These are not, but they're included for completeness */ + if (version) + ip->ip_version_and_header_length |= (version_val & 0xF) << 4; - if (src_address_set == 0) - { - errmsg ("src_address required"); - return -99; - } + if (hdr_length) + ip->ip_version_and_header_length |= (hdr_length_val & 0xF); - M (SET_IPFIX_EXPORTER, mp); + if (tos) + ip->tos = tos_val; - memcpy (mp->collector_address, collector_address.data, - sizeof (collector_address.data)); - mp->collector_port = htons ((u16) collector_port); - memcpy (mp->src_address, src_address.data, sizeof (src_address.data)); - mp->vrf_id = htonl (vrf_id); - mp->path_mtu = htonl (path_mtu); - mp->template_interval = htonl (template_interval); - mp->udp_checksum = udp_checksum; + if (length) + ip->length = clib_host_to_net_u16 (length_val); - S (mp); - W (ret); - return ret; + if (ttl) + ip->ttl = ttl_val; + + if (checksum) + ip->checksum = clib_host_to_net_u16 (checksum_val); + + *matchp = match; + return 1; } -static int -api_set_ipfix_classify_stream (vat_main_t * vam) +uword +unformat_ip6_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_set_ipfix_classify_stream_t *mp; - u32 domain_id = 0; - u32 src_port = UDP_DST_PORT_ipfix; - int ret; + u8 **matchp = va_arg (*args, u8 **); + u8 *match = 0; + ip6_header_t *ip; + int version = 0; + u32 version_val; + u8 traffic_class = 0; + u32 traffic_class_val = 0; + u8 flow_label = 0; + u8 flow_label_val; + int src = 0, dst = 0; + ip6_address_t src_val, dst_val; + int proto = 0; + u32 proto_val; + int payload_length = 0; + u32 payload_length_val; + int hop_limit = 0; + int hop_limit_val; + u32 ip_version_traffic_class_and_flow_label; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "domain %d", &domain_id)) - ; - else if (unformat (i, "src_port %d", &src_port)) - ; + if (unformat (input, "version %d", &version_val)) + version = 1; + else if (unformat (input, "traffic_class %d", &traffic_class_val)) + traffic_class = 1; + else if (unformat (input, "flow_label %d", &flow_label_val)) + flow_label = 1; + else if (unformat (input, "src %U", unformat_ip6_address, &src_val)) + src = 1; + else if (unformat (input, "dst %U", unformat_ip6_address, &dst_val)) + dst = 1; + else if (unformat (input, "proto %d", &proto_val)) + proto = 1; + else if (unformat (input, "payload_length %d", &payload_length_val)) + payload_length = 1; + else if (unformat (input, "hop_limit %d", &hop_limit_val)) + hop_limit = 1; else - { - errmsg ("unknown input `%U'", format_unformat_error, i); - return -99; - } + break; } - M (SET_IPFIX_CLASSIFY_STREAM, mp); + if (version + traffic_class + flow_label + src + dst + proto + + payload_length + hop_limit == 0) + return 0; - mp->domain_id = htonl (domain_id); - mp->src_port = htons ((u16) src_port); + /* + * Aligned because we use the real comparison functions + */ + vec_validate_aligned (match, sizeof (*ip) - 1, sizeof (u32x4)); - S (mp); - W (ret); - return ret; -} + ip = (ip6_header_t *) match; -static int -api_ipfix_classify_table_add_del (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_ipfix_classify_table_add_del_t *mp; - int is_add = -1; - u32 classify_table_index = ~0; - u8 ip_version = 0; - u8 transport_protocol = 255; - int ret; + if (src) + clib_memcpy (&ip->src_address, &src_val, sizeof (ip->src_address)); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "add")) - is_add = 1; - else if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "table %d", &classify_table_index)) - ; - else if (unformat (i, "ip4")) - ip_version = 4; - else if (unformat (i, "ip6")) - ip_version = 6; - else if (unformat (i, "tcp")) - transport_protocol = 6; - else if (unformat (i, "udp")) - transport_protocol = 17; - else - { - errmsg ("unknown input `%U'", format_unformat_error, i); - return -99; - } - } + if (dst) + clib_memcpy (&ip->dst_address, &dst_val, sizeof (ip->dst_address)); - if (is_add == -1) - { - errmsg ("expecting: add|del"); - return -99; - } - if (classify_table_index == ~0) - { - errmsg ("classifier table not specified"); - return -99; - } - if (ip_version == 0) - { - errmsg ("IP version not specified"); - return -99; - } + if (proto) + ip->protocol = proto_val; - M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp); + ip_version_traffic_class_and_flow_label = 0; - mp->is_add = is_add; - mp->table_id = htonl (classify_table_index); - mp->ip_version = ip_version; - mp->transport_protocol = transport_protocol; + if (version) + ip_version_traffic_class_and_flow_label |= (version_val & 0xF) << 28; - S (mp); - W (ret); - return ret; -} + if (traffic_class) + ip_version_traffic_class_and_flow_label |= + (traffic_class_val & 0xFF) << 20; -static int -api_get_node_index (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_get_node_index_t *mp; - u8 *name = 0; - int ret; + if (flow_label) + ip_version_traffic_class_and_flow_label |= (flow_label_val & 0xFFFFF); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "node %s", &name)) - ; - else - break; - } - if (name == 0) - { - errmsg ("node name required"); - return -99; - } - if (vec_len (name) >= ARRAY_LEN (mp->node_name)) - { - errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); - return -99; - } + ip->ip_version_traffic_class_and_flow_label = + clib_host_to_net_u32 (ip_version_traffic_class_and_flow_label); - M (GET_NODE_INDEX, mp); - clib_memcpy (mp->node_name, name, vec_len (name)); - vec_free (name); + if (payload_length) + ip->payload_length = clib_host_to_net_u16 (payload_length_val); - S (mp); - W (ret); - return ret; + if (hop_limit) + ip->hop_limit = hop_limit_val; + + *matchp = match; + return 1; } -static int -api_get_next_index (vat_main_t * vam) +uword +unformat_l3_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_get_next_index_t *mp; - u8 *node_name = 0, *next_node_name = 0; - int ret; + u8 **matchp = va_arg (*args, u8 **); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "node-name %s", &node_name)) - ; - else if (unformat (i, "next-node-name %s", &next_node_name)) + if (unformat (input, "ip4 %U", unformat_ip4_match, matchp)) + return 1; + else if (unformat (input, "ip6 %U", unformat_ip6_match, matchp)) + return 1; + else break; } + return 0; +} - if (node_name == 0) - { - errmsg ("node name required"); - return -99; - } - if (vec_len (node_name) >= ARRAY_LEN (mp->node_name)) - { - errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); - return -99; - } +uword +unformat_vlan_tag (unformat_input_t * input, va_list * args) +{ + u8 *tagp = va_arg (*args, u8 *); + u32 tag; - if (next_node_name == 0) - { - errmsg ("next node name required"); - return -99; - } - if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name)) + if (unformat (input, "%d", &tag)) { - errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name)); - return -99; + tagp[0] = (tag >> 8) & 0x0F; + tagp[1] = tag & 0xFF; + return 1; } - M (GET_NEXT_INDEX, mp); - clib_memcpy (mp->node_name, node_name, vec_len (node_name)); - clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name)); - vec_free (node_name); - vec_free (next_node_name); - - S (mp); - W (ret); - return ret; + return 0; } -static int -api_add_node_next (vat_main_t * vam) +uword +unformat_l2_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - vl_api_add_node_next_t *mp; - u8 *name = 0; - u8 *next = 0; - int ret; + u8 **matchp = va_arg (*args, u8 **); + u8 *match = 0; + u8 src = 0; + u8 src_val[6]; + u8 dst = 0; + u8 dst_val[6]; + u8 proto = 0; + u16 proto_val; + u8 tag1 = 0; + u8 tag1_val[2]; + u8 tag2 = 0; + u8 tag2_val[2]; + int len = 14; + u8 ignore_tag1 = 0; + u8 ignore_tag2 = 0; + u8 cos1 = 0; + u8 cos2 = 0; + u32 cos1_val = 0; + u32 cos2_val = 0; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "node %s", &name)) - ; - else if (unformat (i, "next %s", &next)) - ; + if (unformat (input, "src %U", unformat_ethernet_address, &src_val)) + src = 1; + else + if (unformat (input, "dst %U", unformat_ethernet_address, &dst_val)) + dst = 1; + else if (unformat (input, "proto %U", + unformat_ethernet_type_host_byte_order, &proto_val)) + proto = 1; + else if (unformat (input, "tag1 %U", unformat_vlan_tag, tag1_val)) + tag1 = 1; + else if (unformat (input, "tag2 %U", unformat_vlan_tag, tag2_val)) + tag2 = 1; + else if (unformat (input, "ignore-tag1")) + ignore_tag1 = 1; + else if (unformat (input, "ignore-tag2")) + ignore_tag2 = 1; + else if (unformat (input, "cos1 %d", &cos1_val)) + cos1 = 1; + else if (unformat (input, "cos2 %d", &cos2_val)) + cos2 = 1; else break; } - if (name == 0) - { - errmsg ("node name required"); - return -99; - } - if (vec_len (name) >= ARRAY_LEN (mp->node_name)) - { - errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); - return -99; - } - if (next == 0) - { - errmsg ("next node required"); - return -99; - } - if (vec_len (next) >= ARRAY_LEN (mp->next_name)) - { - errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name)); - return -99; - } + if ((src + dst + proto + tag1 + tag2 + + ignore_tag1 + ignore_tag2 + cos1 + cos2) == 0) + return 0; - M (ADD_NODE_NEXT, mp); - clib_memcpy (mp->node_name, name, vec_len (name)); - clib_memcpy (mp->next_name, next, vec_len (next)); - vec_free (name); - vec_free (next); + if (tag1 || ignore_tag1 || cos1) + len = 18; + if (tag2 || ignore_tag2 || cos2) + len = 22; - S (mp); - W (ret); - return ret; -} + vec_validate_aligned (match, len - 1, sizeof (u32x4)); -static int -api_l2tpv3_create_tunnel (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - ip6_address_t client_address, our_address; - int client_address_set = 0; - int our_address_set = 0; - u32 local_session_id = 0; - u32 remote_session_id = 0; - u64 local_cookie = 0; - u64 remote_cookie = 0; - u8 l2_sublayer_present = 0; - vl_api_l2tpv3_create_tunnel_t *mp; - int ret; + if (dst) + clib_memcpy (match, dst_val, 6); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (src) + clib_memcpy (match + 6, src_val, 6); + + if (tag2) { - if (unformat (i, "client_address %U", unformat_ip6_address, - &client_address)) - client_address_set = 1; - else if (unformat (i, "our_address %U", unformat_ip6_address, - &our_address)) - our_address_set = 1; - else if (unformat (i, "local_session_id %d", &local_session_id)) - ; - else if (unformat (i, "remote_session_id %d", &remote_session_id)) - ; - else if (unformat (i, "local_cookie %lld", &local_cookie)) - ; - else if (unformat (i, "remote_cookie %lld", &remote_cookie)) - ; - else if (unformat (i, "l2-sublayer-present")) - l2_sublayer_present = 1; - else - break; + /* inner vlan tag */ + match[19] = tag2_val[1]; + match[18] = tag2_val[0]; + if (cos2) + match[18] |= (cos2_val & 0x7) << 5; + if (proto) + { + match[21] = proto_val & 0xff; + match[20] = proto_val >> 8; + } + if (tag1) + { + match[15] = tag1_val[1]; + match[14] = tag1_val[0]; + } + if (cos1) + match[14] |= (cos1_val & 0x7) << 5; + *matchp = match; + return 1; } - - if (client_address_set == 0) + if (tag1) { - errmsg ("client_address required"); - return -99; + match[15] = tag1_val[1]; + match[14] = tag1_val[0]; + if (proto) + { + match[17] = proto_val & 0xff; + match[16] = proto_val >> 8; + } + if (cos1) + match[14] |= (cos1_val & 0x7) << 5; + + *matchp = match; + return 1; } - - if (our_address_set == 0) + if (cos2) + match[18] |= (cos2_val & 0x7) << 5; + if (cos1) + match[14] |= (cos1_val & 0x7) << 5; + if (proto) { - errmsg ("our_address required"); - return -99; + match[13] = proto_val & 0xff; + match[12] = proto_val >> 8; } - M (L2TPV3_CREATE_TUNNEL, mp); - - clib_memcpy (mp->client_address, client_address.as_u8, - sizeof (mp->client_address)); + *matchp = match; + return 1; +} - clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address)); +uword +unformat_qos_source (unformat_input_t * input, va_list * args) +{ + int *qs = va_arg (*args, int *); - mp->local_session_id = ntohl (local_session_id); - mp->remote_session_id = ntohl (remote_session_id); - mp->local_cookie = clib_host_to_net_u64 (local_cookie); - mp->remote_cookie = clib_host_to_net_u64 (remote_cookie); - mp->l2_sublayer_present = l2_sublayer_present; - mp->is_ipv6 = 1; + if (unformat (input, "ip")) + *qs = QOS_SOURCE_IP; + else if (unformat (input, "mpls")) + *qs = QOS_SOURCE_MPLS; + else if (unformat (input, "ext")) + *qs = QOS_SOURCE_EXT; + else if (unformat (input, "vlan")) + *qs = QOS_SOURCE_VLAN; + else + return 0; - S (mp); - W (ret); - return ret; + return 1; } +#endif -static int -api_l2tpv3_set_tunnel_cookies (vat_main_t * vam) +uword +api_unformat_classify_match (unformat_input_t * input, va_list * args) { - unformat_input_t *i = vam->input; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u64 new_local_cookie = 0; - u64 new_remote_cookie = 0; - vl_api_l2tpv3_set_tunnel_cookies_t *mp; - int ret; + u8 **matchp = va_arg (*args, u8 **); + u32 skip_n_vectors = va_arg (*args, u32); + u32 match_n_vectors = va_arg (*args, u32); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + u8 *match = 0; + u8 *l2 = 0; + u8 *l3 = 0; + u8 *l4 = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "new_local_cookie %lld", &new_local_cookie)) + if (unformat (input, "hex %U", unformat_hex_string, &match)) ; - else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie)) + else if (unformat (input, "l2 %U", unformat_l2_match, &l2)) + ; + else if (unformat (input, "l3 %U", unformat_l3_match, &l3)) + ; + else if (unformat (input, "l4 %U", unformat_l4_match, &l4)) ; else break; } - if (sw_if_index_set == 0) + if (l4 && !l3) { - errmsg ("missing interface name or sw_if_index"); - return -99; + vec_free (match); + vec_free (l2); + vec_free (l4); + return 0; } - M (L2TPV3_SET_TUNNEL_COOKIES, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie); - mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie); + if (match || l2 || l3 || l4) + { + if (l2 || l3 || l4) + { + /* "Win a free Ethernet header in every packet" */ + if (l2 == 0) + vec_validate_aligned (l2, 13, sizeof (u32x4)); + match = l2; + if (vec_len (l3)) + { + vec_append_aligned (match, l3, sizeof (u32x4)); + vec_free (l3); + } + if (vec_len (l4)) + { + vec_append_aligned (match, l4, sizeof (u32x4)); + vec_free (l4); + } + } - S (mp); - W (ret); - return ret; -} + /* Make sure the vector is big enough even if key is all 0's */ + vec_validate_aligned + (match, ((match_n_vectors + skip_n_vectors) * sizeof (u32x4)) - 1, + sizeof (u32x4)); -static int -api_l2tpv3_interface_enable_disable (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_l2tpv3_interface_enable_disable_t *mp; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u8 enable_disable = 1; - int ret; + /* Set size, include skipped vectors */ + _vec_len (match) = (match_n_vectors + skip_n_vectors) * sizeof (u32x4); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "enable")) - enable_disable = 1; - else if (unformat (i, "disable")) - enable_disable = 0; - else - break; - } + *matchp = match; - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; + return 1; } - M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->enable_disable = enable_disable; - - S (mp); - W (ret); - return ret; + return 0; } static int -api_l2tpv3_set_lookup_key (vat_main_t * vam) +api_classify_add_del_session (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_l2tpv3_set_lookup_key_t *mp; - u8 key = ~0; + vl_api_classify_add_del_session_t *mp; + int is_add = 1; + u32 table_index = ~0; + u32 hit_next_index = ~0; + u32 opaque_index = ~0; + u8 *match = 0; + i32 advance = 0; + u32 skip_n_vectors = 0; + u32 match_n_vectors = 0; + u32 action = 0; + u32 metadata = 0; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "lookup_v6_src")) - key = L2T_LOOKUP_SRC_ADDRESS; - else if (unformat (i, "lookup_v6_dst")) - key = L2T_LOOKUP_DST_ADDRESS; - else if (unformat (i, "lookup_session_id")) - key = L2T_LOOKUP_SESSION_ID; - else - break; - } + /* + * Warning: you have to supply skip_n and match_n + * because the API client cant simply look at the classify + * table object. + */ - if (key == (u8) ~ 0) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - errmsg ("l2tp session lookup key unset"); - return -99; - } - - M (L2TPV3_SET_LOOKUP_KEY, mp); - - mp->key = key; - - S (mp); - W (ret); - return ret; -} - -static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler - (vl_api_sw_if_l2tpv3_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - - print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)", - format_ip6_address, mp->our_address, - format_ip6_address, mp->client_address, - clib_net_to_host_u32 (mp->sw_if_index)); - - print (vam->ofp, - " local cookies %016llx %016llx remote cookie %016llx", - clib_net_to_host_u64 (mp->local_cookie[0]), - clib_net_to_host_u64 (mp->local_cookie[1]), - clib_net_to_host_u64 (mp->remote_cookie)); - - print (vam->ofp, " local session-id %d remote session-id %d", - clib_net_to_host_u32 (mp->local_session_id), - clib_net_to_host_u32 (mp->remote_session_id)); - - print (vam->ofp, " l2 specific sublayer %s\n", - mp->l2_sublayer_present ? "preset" : "absent"); - -} - -static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json - (vl_api_sw_if_l2tpv3_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; - struct in6_addr addr; + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "hit-next %U", api_unformat_ip_next_index, + &hit_next_index)) + ; + else if (unformat (i, "l2-hit-next %U", unformat_l2_next_index, + &hit_next_index)) + ; + else if (unformat (i, "acl-hit-next %U", api_unformat_acl_next_index, + &hit_next_index)) + ; + else if (unformat (i, "policer-hit-next %d", &hit_next_index)) + ; + else if (unformat (i, "%U", unformat_policer_precolor, &opaque_index)) + ; + else if (unformat (i, "opaque-index %d", &opaque_index)) + ; + else if (unformat (i, "skip_n %d", &skip_n_vectors)) + ; + else if (unformat (i, "match_n %d", &match_n_vectors)) + ; + else if (unformat (i, "match %U", api_unformat_classify_match, + &match, skip_n_vectors, match_n_vectors)) + ; + else if (unformat (i, "advance %d", &advance)) + ; + else if (unformat (i, "table-index %d", &table_index)) + ; + else if (unformat (i, "action set-ip4-fib-id %d", &metadata)) + action = 1; + else if (unformat (i, "action set-ip6-fib-id %d", &metadata)) + action = 2; + else if (unformat (i, "action %d", &action)) + ; + else if (unformat (i, "metadata %d", &metadata)) + ; + else + break; + } - if (VAT_JSON_ARRAY != vam->json_tree.type) + if (table_index == ~0) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + errmsg ("Table index required"); + return -99; } - node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - - clib_memcpy (&addr, mp->our_address, sizeof (addr)); - vat_json_object_add_ip6 (node, "our_address", addr); - clib_memcpy (&addr, mp->client_address, sizeof (addr)); - vat_json_object_add_ip6 (node, "client_address", addr); - - vat_json_node_t *lc = vat_json_object_add (node, "local_cookie"); - vat_json_init_array (lc); - vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0])); - vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1])); - vat_json_object_add_uint (node, "remote_cookie", - clib_net_to_host_u64 (mp->remote_cookie)); + if (is_add && match == 0) + { + errmsg ("Match value required"); + return -99; + } - printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id)); - vat_json_object_add_uint (node, "local_session_id", - clib_net_to_host_u32 (mp->local_session_id)); - vat_json_object_add_uint (node, "remote_session_id", - clib_net_to_host_u32 (mp->remote_session_id)); - vat_json_object_add_string_copy (node, "l2_sublayer", - mp->l2_sublayer_present ? (u8 *) "present" - : (u8 *) "absent"); -} + M2 (CLASSIFY_ADD_DEL_SESSION, mp, vec_len (match)); -static int -api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam) -{ - vl_api_sw_if_l2tpv3_tunnel_dump_t *mp; - vl_api_control_ping_t *mp_ping; - int ret; + mp->is_add = is_add; + mp->table_index = ntohl (table_index); + mp->hit_next_index = ntohl (hit_next_index); + mp->opaque_index = ntohl (opaque_index); + mp->advance = ntohl (advance); + mp->action = action; + mp->metadata = ntohl (metadata); + mp->match_len = ntohl (vec_len (match)); + clib_memcpy (mp->match, match, vec_len (match)); + vec_free (match); - /* Get list of l2tpv3-tunnel interfaces */ - M (SW_IF_L2TPV3_TUNNEL_DUMP, mp); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } - -static void vl_api_sw_interface_tap_details_t_handler - (vl_api_sw_interface_tap_details_t * mp) -{ - vat_main_t *vam = &vat_main; - - print (vam->ofp, "%-16s %d", - mp->dev_name, clib_net_to_host_u32 (mp->sw_if_index)); -} - -static void vl_api_sw_interface_tap_details_t_handler_json - (vl_api_sw_interface_tap_details_t * mp) +static int +api_classify_set_interface_ip_table (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; + unformat_input_t *i = vam->input; + vl_api_classify_set_interface_ip_table_t *mp; + u32 sw_if_index; + int sw_if_index_set; + u32 table_index = ~0; + u8 is_ipv6 = 0; + int ret; - if (VAT_JSON_ARRAY != vam->json_tree.type) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "table %d", &table_index)) + ; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_string_copy (node, "dev_name", mp->dev_name); -} + if (sw_if_index_set == 0) + { + errmsg ("missing interface name or sw_if_index"); + return -99; + } -static int -api_sw_interface_tap_dump (vat_main_t * vam) -{ - vl_api_sw_interface_tap_dump_t *mp; - vl_api_control_ping_t *mp_ping; - int ret; - print (vam->ofp, "\n%-16s %s", "dev_name", "sw_if_index"); - /* Get list of tap interfaces */ - M (SW_INTERFACE_TAP_DUMP, mp); - S (mp); + M (CLASSIFY_SET_INTERFACE_IP_TABLE, mp); - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); + mp->sw_if_index = ntohl (sw_if_index); + mp->table_index = ntohl (table_index); + mp->is_ipv6 = is_ipv6; + S (mp); W (ret); return ret; } -static void vl_api_sw_interface_tap_v2_details_t_handler - (vl_api_sw_interface_tap_v2_details_t * mp) -{ - vat_main_t *vam = &vat_main; - - u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr, - mp->host_ip4_prefix_len); - u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr, - mp->host_ip6_prefix_len); - - print (vam->ofp, - "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s", - mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id), - ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz), - format_ethernet_address, mp->host_mac_addr, mp->host_namespace, - mp->host_bridge, ip4, ip6); - - vec_free (ip4); - vec_free (ip6); -} - -static void vl_api_sw_interface_tap_v2_details_t_handler_json - (vl_api_sw_interface_tap_v2_details_t * mp) +static int +api_classify_set_interface_l2_tables (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; + unformat_input_t *i = vam->input; + vl_api_classify_set_interface_l2_tables_t *mp; + u32 sw_if_index; + int sw_if_index_set; + u32 ip4_table_index = ~0; + u32 ip6_table_index = ~0; + u32 other_table_index = ~0; + u32 is_input = 1; + int ret; - if (VAT_JSON_ARRAY != vam->json_tree.type) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "ip4-table %d", &ip4_table_index)) + ; + else if (unformat (i, "ip6-table %d", &ip6_table_index)) + ; + else if (unformat (i, "other-table %d", &other_table_index)) + ; + else if (unformat (i, "is-input %d", &is_input)) + ; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - vat_json_object_add_uint (node, "id", ntohl (mp->id)); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_string_copy (node, "dev_name", mp->dev_name); - vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz)); - vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz)); - vat_json_object_add_string_copy (node, "host_mac_addr", - format (0, "%U", format_ethernet_address, - &mp->host_mac_addr)); - vat_json_object_add_string_copy (node, "host_namespace", - mp->host_namespace); - vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge); - vat_json_object_add_string_copy (node, "host_ip4_addr", - format (0, "%U/%d", format_ip4_address, - mp->host_ip4_addr, - mp->host_ip4_prefix_len)); - vat_json_object_add_string_copy (node, "host_ip6_addr", - format (0, "%U/%d", format_ip6_address, - mp->host_ip6_addr, - mp->host_ip6_prefix_len)); + if (sw_if_index_set == 0) + { + errmsg ("missing interface name or sw_if_index"); + return -99; + } -} -static int -api_sw_interface_tap_v2_dump (vat_main_t * vam) -{ - vl_api_sw_interface_tap_v2_dump_t *mp; - vl_api_control_ping_t *mp_ping; - int ret; + M (CLASSIFY_SET_INTERFACE_L2_TABLES, mp); - print (vam->ofp, - "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s", - "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz", - "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr", - "host_ip6_addr"); + mp->sw_if_index = ntohl (sw_if_index); + mp->ip4_table_index = ntohl (ip4_table_index); + mp->ip6_table_index = ntohl (ip6_table_index); + mp->other_table_index = ntohl (other_table_index); + mp->is_input = (u8) is_input; - /* Get list of tap interfaces */ - M (SW_INTERFACE_TAP_V2_DUMP, mp); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } static int -api_vxlan_offload_rx (vat_main_t * vam) +api_set_ipfix_exporter (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_vxlan_offload_rx_t *mp; - u32 hw_if_index = ~0, rx_if_index = ~0; - u8 is_add = 1; + unformat_input_t *i = vam->input; + vl_api_set_ipfix_exporter_t *mp; + ip4_address_t collector_address; + u8 collector_address_set = 0; + u32 collector_port = ~0; + ip4_address_t src_address; + u8 src_address_set = 0; + u32 vrf_id = ~0; + u32 path_mtu = ~0; + u32 template_interval = ~0; + u8 udp_checksum = 0; int ret; - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "del")) - is_add = 0; - else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam, - &hw_if_index)) + if (unformat (i, "collector_address %U", unformat_ip4_address, + &collector_address)) + collector_address_set = 1; + else if (unformat (i, "collector_port %d", &collector_port)) ; - else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index)) + else if (unformat (i, "src_address %U", unformat_ip4_address, + &src_address)) + src_address_set = 1; + else if (unformat (i, "vrf_id %d", &vrf_id)) ; - else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam, - &rx_if_index)) + else if (unformat (i, "path_mtu %d", &path_mtu)) ; - else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index)) + else if (unformat (i, "template_interval %d", &template_interval)) ; + else if (unformat (i, "udp_checksum")) + udp_checksum = 1; else - { - errmsg ("parse error '%U'", format_unformat_error, line_input); - return -99; - } + break; } - if (hw_if_index == ~0) + if (collector_address_set == 0) { - errmsg ("no hw interface"); + errmsg ("collector_address required"); return -99; } - if (rx_if_index == ~0) + if (src_address_set == 0) { - errmsg ("no rx tunnel"); + errmsg ("src_address required"); return -99; } - M (VXLAN_OFFLOAD_RX, mp); + M (SET_IPFIX_EXPORTER, mp); - mp->hw_if_index = ntohl (hw_if_index); - mp->sw_if_index = ntohl (rx_if_index); - mp->enable = is_add; + memcpy (mp->collector_address, collector_address.data, + sizeof (collector_address.data)); + mp->collector_port = htons ((u16) collector_port); + memcpy (mp->src_address, src_address.data, sizeof (src_address.data)); + mp->vrf_id = htonl (vrf_id); + mp->path_mtu = htonl (path_mtu); + mp->template_interval = htonl (template_interval); + mp->udp_checksum = udp_checksum; S (mp); W (ret); return ret; } -static uword unformat_vxlan_decap_next - (unformat_input_t * input, va_list * args) +static int +api_set_ipfix_classify_stream (vat_main_t * vam) { - u32 *result = va_arg (*args, u32 *); - u32 tmp; + unformat_input_t *i = vam->input; + vl_api_set_ipfix_classify_stream_t *mp; + u32 domain_id = 0; + u32 src_port = UDP_DST_PORT_ipfix; + int ret; - if (unformat (input, "l2")) - *result = VXLAN_INPUT_NEXT_L2_INPUT; - else if (unformat (input, "%d", &tmp)) - *result = tmp; - else - return 0; - return 1; + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "domain %d", &domain_id)) + ; + else if (unformat (i, "src_port %d", &src_port)) + ; + else + { + errmsg ("unknown input `%U'", format_unformat_error, i); + return -99; + } + } + + M (SET_IPFIX_CLASSIFY_STREAM, mp); + + mp->domain_id = htonl (domain_id); + mp->src_port = htons ((u16) src_port); + + S (mp); + W (ret); + return ret; } static int -api_vxlan_add_del_tunnel (vat_main_t * vam) +api_ipfix_classify_table_add_del (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_vxlan_add_del_tunnel_t *mp; - ip46_address_t src, dst; - u8 is_add = 1; - u8 ipv4_set = 0, ipv6_set = 0; - u8 src_set = 0; - u8 dst_set = 0; - u8 grp_set = 0; - u32 instance = ~0; - u32 mcast_sw_if_index = ~0; - u32 encap_vrf_id = 0; - u32 decap_next_index = ~0; - u32 vni = 0; + unformat_input_t *i = vam->input; + vl_api_ipfix_classify_table_add_del_t *mp; + int is_add = -1; + u32 classify_table_index = ~0; + u8 ip_version = 0; + u8 transport_protocol = 255; int ret; - /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ - clib_memset (&src, 0, sizeof src); - clib_memset (&dst, 0, sizeof dst); - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "del")) + if (unformat (i, "add")) + is_add = 1; + else if (unformat (i, "del")) is_add = 0; - else if (unformat (line_input, "instance %d", &instance)) - ; - else - if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4)) - { - ipv4_set = 1; - src_set = 1; - } - else - if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4)) - { - ipv4_set = 1; - dst_set = 1; - } - else - if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6)) - { - ipv6_set = 1; - src_set = 1; - } - else - if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6)) - { - ipv6_set = 1; - dst_set = 1; - } - else if (unformat (line_input, "group %U %U", - unformat_ip4_address, &dst.ip4, - api_unformat_sw_if_index, vam, &mcast_sw_if_index)) - { - grp_set = dst_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "group %U", - unformat_ip4_address, &dst.ip4)) - { - grp_set = dst_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "group %U %U", - unformat_ip6_address, &dst.ip6, - api_unformat_sw_if_index, vam, &mcast_sw_if_index)) - { - grp_set = dst_set = 1; - ipv6_set = 1; - } - else if (unformat (line_input, "group %U", - unformat_ip6_address, &dst.ip6)) - { - grp_set = dst_set = 1; - ipv6_set = 1; - } - else - if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index)) - ; - else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id)) - ; - else if (unformat (line_input, "decap-next %U", - unformat_vxlan_decap_next, &decap_next_index)) - ; - else if (unformat (line_input, "vni %d", &vni)) + else if (unformat (i, "table %d", &classify_table_index)) ; + else if (unformat (i, "ip4")) + ip_version = 4; + else if (unformat (i, "ip6")) + ip_version = 6; + else if (unformat (i, "tcp")) + transport_protocol = 6; + else if (unformat (i, "udp")) + transport_protocol = 17; else { - errmsg ("parse error '%U'", format_unformat_error, line_input); + errmsg ("unknown input `%U'", format_unformat_error, i); return -99; } } - if (src_set == 0) - { - errmsg ("tunnel src address not specified"); - return -99; - } - if (dst_set == 0) - { - errmsg ("tunnel dst address not specified"); - return -99; - } - - if (grp_set && !ip46_address_is_multicast (&dst)) + if (is_add == -1) { - errmsg ("tunnel group address not multicast"); + errmsg ("expecting: add|del"); return -99; } - if (grp_set && mcast_sw_if_index == ~0) + if (classify_table_index == ~0) { - errmsg ("tunnel nonexistent multicast device"); + errmsg ("classifier table not specified"); return -99; } - if (grp_set == 0 && ip46_address_is_multicast (&dst)) + if (ip_version == 0) { - errmsg ("tunnel dst address must be unicast"); + errmsg ("IP version not specified"); return -99; } + M (IPFIX_CLASSIFY_TABLE_ADD_DEL, mp); - if (ipv4_set && ipv6_set) - { - errmsg ("both IPv4 and IPv6 addresses specified"); - return -99; - } + mp->is_add = is_add; + mp->table_id = htonl (classify_table_index); + mp->ip_version = ip_version; + mp->transport_protocol = transport_protocol; - if ((vni == 0) || (vni >> 24)) - { - errmsg ("vni not specified or out of range"); - return -99; - } + S (mp); + W (ret); + return ret; +} - M (VXLAN_ADD_DEL_TUNNEL, mp); +static int +api_get_node_index (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_get_node_index_t *mp; + u8 *name = 0; + int ret; - if (ipv6_set) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6)); - clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6)); + if (unformat (i, "node %s", &name)) + ; + else + break; } - else + if (name == 0) { - clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4)); - clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4)); + errmsg ("node name required"); + return -99; + } + if (vec_len (name) >= ARRAY_LEN (mp->node_name)) + { + errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); + return -99; } - mp->instance = htonl (instance); - mp->encap_vrf_id = ntohl (encap_vrf_id); - mp->decap_next_index = ntohl (decap_next_index); - mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); - mp->vni = ntohl (vni); - mp->is_add = is_add; - mp->is_ipv6 = ipv6_set; + M (GET_NODE_INDEX, mp); + clib_memcpy (mp->node_name, name, vec_len (name)); + vec_free (name); S (mp); W (ret); return ret; } -static void vl_api_vxlan_tunnel_details_t_handler - (vl_api_vxlan_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address); - ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address); - - print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d", - ntohl (mp->sw_if_index), - ntohl (mp->instance), - format_ip46_address, &src, IP46_TYPE_ANY, - format_ip46_address, &dst, IP46_TYPE_ANY, - ntohl (mp->encap_vrf_id), - ntohl (mp->decap_next_index), ntohl (mp->vni), - ntohl (mp->mcast_sw_if_index)); -} - -static void vl_api_vxlan_tunnel_details_t_handler_json - (vl_api_vxlan_tunnel_details_t * mp) +static int +api_get_next_index (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; + unformat_input_t *i = vam->input; + vl_api_get_next_index_t *mp; + u8 *node_name = 0, *next_node_name = 0; + int ret; - if (VAT_JSON_ARRAY != vam->json_tree.type) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + if (unformat (i, "node-name %s", &node_name)) + ; + else if (unformat (i, "next-node-name %s", &next_node_name)) + break; } - node = vat_json_array_add (&vam->json_tree); - - vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_uint (node, "instance", ntohl (mp->instance)); - - if (mp->is_ipv6) + if (node_name == 0) { - struct in6_addr ip6; - - clib_memcpy (&ip6, mp->src_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "src_address", ip6); - clib_memcpy (&ip6, mp->dst_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "dst_address", ip6); + errmsg ("node name required"); + return -99; } - else + if (vec_len (node_name) >= ARRAY_LEN (mp->node_name)) { - struct in_addr ip4; + errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); + return -99; + } - clib_memcpy (&ip4, mp->src_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - clib_memcpy (&ip4, mp->dst_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "dst_address", ip4); + if (next_node_name == 0) + { + errmsg ("next node name required"); + return -99; } - vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); - vat_json_object_add_uint (node, "decap_next_index", - ntohl (mp->decap_next_index)); - vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); - vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); - vat_json_object_add_uint (node, "mcast_sw_if_index", - ntohl (mp->mcast_sw_if_index)); + if (vec_len (next_node_name) >= ARRAY_LEN (mp->next_name)) + { + errmsg ("next node name too long, max %d", ARRAY_LEN (mp->next_name)); + return -99; + } + + M (GET_NEXT_INDEX, mp); + clib_memcpy (mp->node_name, node_name, vec_len (node_name)); + clib_memcpy (mp->next_name, next_node_name, vec_len (next_node_name)); + vec_free (node_name); + vec_free (next_node_name); + + S (mp); + W (ret); + return ret; } static int -api_vxlan_tunnel_dump (vat_main_t * vam) +api_add_node_next (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_vxlan_tunnel_dump_t *mp; - vl_api_control_ping_t *mp_ping; - u32 sw_if_index; - u8 sw_if_index_set = 0; + vl_api_add_node_next_t *mp; + u8 *name = 0; + u8 *next = 0; int ret; - /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; + if (unformat (i, "node %s", &name)) + ; + else if (unformat (i, "next %s", &next)) + ; else break; } - - if (sw_if_index_set == 0) + if (name == 0) { - sw_if_index = ~0; + errmsg ("node name required"); + return -99; } - - if (!vam->json_output) + if (vec_len (name) >= ARRAY_LEN (mp->node_name)) { - print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s", - "sw_if_index", "instance", "src_address", "dst_address", - "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index"); + errmsg ("node name too long, max %d", ARRAY_LEN (mp->node_name)); + return -99; + } + if (next == 0) + { + errmsg ("next node required"); + return -99; + } + if (vec_len (next) >= ARRAY_LEN (mp->next_name)) + { + errmsg ("next name too long, max %d", ARRAY_LEN (mp->next_name)); + return -99; } - /* Get list of vxlan-tunnel interfaces */ - M (VXLAN_TUNNEL_DUMP, mp); - - mp->sw_if_index = htonl (sw_if_index); + M (ADD_NODE_NEXT, mp); + clib_memcpy (mp->node_name, name, vec_len (name)); + clib_memcpy (mp->next_name, next, vec_len (next)); + vec_free (name); + vec_free (next); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } -static uword unformat_geneve_decap_next - (unformat_input_t * input, va_list * args) -{ - u32 *result = va_arg (*args, u32 *); - u32 tmp; - - if (unformat (input, "l2")) - *result = GENEVE_INPUT_NEXT_L2_INPUT; - else if (unformat (input, "%d", &tmp)) - *result = tmp; - else - return 0; - return 1; -} - static int -api_geneve_add_del_tunnel (vat_main_t * vam) +api_l2tpv3_create_tunnel (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_geneve_add_del_tunnel_t *mp; - ip46_address_t src, dst; - u8 is_add = 1; - u8 ipv4_set = 0, ipv6_set = 0; - u8 src_set = 0; - u8 dst_set = 0; - u8 grp_set = 0; - u32 mcast_sw_if_index = ~0; - u32 encap_vrf_id = 0; - u32 decap_next_index = ~0; - u32 vni = 0; + unformat_input_t *i = vam->input; + ip6_address_t client_address, our_address; + int client_address_set = 0; + int our_address_set = 0; + u32 local_session_id = 0; + u32 remote_session_id = 0; + u64 local_cookie = 0; + u64 remote_cookie = 0; + u8 l2_sublayer_present = 0; + vl_api_l2tpv3_create_tunnel_t *mp; int ret; - /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ - clib_memset (&src, 0, sizeof src); - clib_memset (&dst, 0, sizeof dst); - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "del")) - is_add = 0; - else - if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4)) - { - ipv4_set = 1; - src_set = 1; - } - else - if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4)) - { - ipv4_set = 1; - dst_set = 1; - } - else - if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6)) - { - ipv6_set = 1; - src_set = 1; - } - else - if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6)) - { - ipv6_set = 1; - dst_set = 1; - } - else if (unformat (line_input, "group %U %U", - unformat_ip4_address, &dst.ip4, - api_unformat_sw_if_index, vam, &mcast_sw_if_index)) - { - grp_set = dst_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "group %U", - unformat_ip4_address, &dst.ip4)) - { - grp_set = dst_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "group %U %U", - unformat_ip6_address, &dst.ip6, - api_unformat_sw_if_index, vam, &mcast_sw_if_index)) - { - grp_set = dst_set = 1; - ipv6_set = 1; - } - else if (unformat (line_input, "group %U", - unformat_ip6_address, &dst.ip6)) - { - grp_set = dst_set = 1; - ipv6_set = 1; - } - else - if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index)) + if (unformat (i, "client_address %U", unformat_ip6_address, + &client_address)) + client_address_set = 1; + else if (unformat (i, "our_address %U", unformat_ip6_address, + &our_address)) + our_address_set = 1; + else if (unformat (i, "local_session_id %d", &local_session_id)) ; - else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id)) + else if (unformat (i, "remote_session_id %d", &remote_session_id)) ; - else if (unformat (line_input, "decap-next %U", - unformat_geneve_decap_next, &decap_next_index)) + else if (unformat (i, "local_cookie %lld", &local_cookie)) ; - else if (unformat (line_input, "vni %d", &vni)) + else if (unformat (i, "remote_cookie %lld", &remote_cookie)) ; + else if (unformat (i, "l2-sublayer-present")) + l2_sublayer_present = 1; else - { - errmsg ("parse error '%U'", format_unformat_error, line_input); - return -99; - } + break; } - if (src_set == 0) - { - errmsg ("tunnel src address not specified"); - return -99; - } - if (dst_set == 0) + if (client_address_set == 0) { - errmsg ("tunnel dst address not specified"); + errmsg ("client_address required"); return -99; } - if (grp_set && !ip46_address_is_multicast (&dst)) - { - errmsg ("tunnel group address not multicast"); - return -99; - } - if (grp_set && mcast_sw_if_index == ~0) - { - errmsg ("tunnel nonexistent multicast device"); - return -99; - } - if (grp_set == 0 && ip46_address_is_multicast (&dst)) + if (our_address_set == 0) { - errmsg ("tunnel dst address must be unicast"); + errmsg ("our_address required"); return -99; } + M (L2TPV3_CREATE_TUNNEL, mp); - if (ipv4_set && ipv6_set) - { - errmsg ("both IPv4 and IPv6 addresses specified"); - return -99; - } - - if ((vni == 0) || (vni >> 24)) - { - errmsg ("vni not specified or out of range"); - return -99; - } + clib_memcpy (mp->client_address, client_address.as_u8, + sizeof (mp->client_address)); - M (GENEVE_ADD_DEL_TUNNEL, mp); + clib_memcpy (mp->our_address, our_address.as_u8, sizeof (mp->our_address)); - if (ipv6_set) - { - clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6)); - clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6)); - } - else - { - clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4)); - clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4)); - } - mp->encap_vrf_id = ntohl (encap_vrf_id); - mp->decap_next_index = ntohl (decap_next_index); - mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); - mp->vni = ntohl (vni); - mp->is_add = is_add; - mp->is_ipv6 = ipv6_set; + mp->local_session_id = ntohl (local_session_id); + mp->remote_session_id = ntohl (remote_session_id); + mp->local_cookie = clib_host_to_net_u64 (local_cookie); + mp->remote_cookie = clib_host_to_net_u64 (remote_cookie); + mp->l2_sublayer_present = l2_sublayer_present; + mp->is_ipv6 = 1; S (mp); W (ret); return ret; } -static void vl_api_geneve_tunnel_details_t_handler - (vl_api_geneve_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address); - ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address); - - print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d", - ntohl (mp->sw_if_index), - format_ip46_address, &src, IP46_TYPE_ANY, - format_ip46_address, &dst, IP46_TYPE_ANY, - ntohl (mp->encap_vrf_id), - ntohl (mp->decap_next_index), ntohl (mp->vni), - ntohl (mp->mcast_sw_if_index)); -} - -static void vl_api_geneve_tunnel_details_t_handler_json - (vl_api_geneve_tunnel_details_t * mp) +static int +api_l2tpv3_set_tunnel_cookies (vat_main_t * vam) { - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; + unformat_input_t *i = vam->input; + u32 sw_if_index; + u8 sw_if_index_set = 0; + u64 new_local_cookie = 0; + u64 new_remote_cookie = 0; + vl_api_l2tpv3_set_tunnel_cookies_t *mp; + int ret; - if (VAT_JSON_ARRAY != vam->json_tree.type) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "new_local_cookie %lld", &new_local_cookie)) + ; + else if (unformat (i, "new_remote_cookie %lld", &new_remote_cookie)) + ; + else + break; } - node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - if (mp->is_ipv6) + if (sw_if_index_set == 0) { - struct in6_addr ip6; - - clib_memcpy (&ip6, mp->src_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "src_address", ip6); - clib_memcpy (&ip6, mp->dst_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "dst_address", ip6); + errmsg ("missing interface name or sw_if_index"); + return -99; } - else - { - struct in_addr ip4; - clib_memcpy (&ip4, mp->src_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - clib_memcpy (&ip4, mp->dst_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "dst_address", ip4); - } - vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); - vat_json_object_add_uint (node, "decap_next_index", - ntohl (mp->decap_next_index)); - vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); - vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); - vat_json_object_add_uint (node, "mcast_sw_if_index", - ntohl (mp->mcast_sw_if_index)); + M (L2TPV3_SET_TUNNEL_COOKIES, mp); + + mp->sw_if_index = ntohl (sw_if_index); + mp->new_local_cookie = clib_host_to_net_u64 (new_local_cookie); + mp->new_remote_cookie = clib_host_to_net_u64 (new_remote_cookie); + + S (mp); + W (ret); + return ret; } static int -api_geneve_tunnel_dump (vat_main_t * vam) +api_l2tpv3_interface_enable_disable (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_geneve_tunnel_dump_t *mp; - vl_api_control_ping_t *mp_ping; + vl_api_l2tpv3_interface_enable_disable_t *mp; u32 sw_if_index; u8 sw_if_index_set = 0; + u8 enable_disable = 1; int ret; - /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "sw_if_index %d", &sw_if_index)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "enable")) + enable_disable = 1; + else if (unformat (i, "disable")) + enable_disable = 0; else break; } if (sw_if_index_set == 0) { - sw_if_index = ~0; - } - - if (!vam->json_output) - { - print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s", - "sw_if_index", "local_address", "remote_address", - "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index"); + errmsg ("missing interface name or sw_if_index"); + return -99; } - /* Get list of geneve-tunnel interfaces */ - M (GENEVE_TUNNEL_DUMP, mp); + M (L2TPV3_INTERFACE_ENABLE_DISABLE, mp); - mp->sw_if_index = htonl (sw_if_index); + mp->sw_if_index = ntohl (sw_if_index); + mp->enable_disable = enable_disable; S (mp); - - /* Use a control ping for synchronization */ - M (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } static int -api_gre_add_del_tunnel (vat_main_t * vam) +api_l2tpv3_set_lookup_key (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_gre_add_del_tunnel_t *mp; - ip4_address_t src4, dst4; - ip6_address_t src6, dst6; - u8 is_add = 1; - u8 ipv4_set = 0; - u8 ipv6_set = 0; - u8 t_type = GRE_TUNNEL_TYPE_L3; - u8 src_set = 0; - u8 dst_set = 0; - u32 outer_fib_id = 0; - u32 session_id = 0; - u32 instance = ~0; + unformat_input_t *i = vam->input; + vl_api_l2tpv3_set_lookup_key_t *mp; + u8 key = ~0; int ret; - clib_memset (&src4, 0, sizeof src4); - clib_memset (&dst4, 0, sizeof dst4); - clib_memset (&src6, 0, sizeof src6); - clib_memset (&dst6, 0, sizeof dst6); - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "del")) - is_add = 0; - else if (unformat (line_input, "instance %d", &instance)) - ; - else if (unformat (line_input, "src %U", unformat_ip4_address, &src4)) - { - src_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "dst %U", unformat_ip4_address, &dst4)) - { - dst_set = 1; - ipv4_set = 1; - } - else if (unformat (line_input, "src %U", unformat_ip6_address, &src6)) - { - src_set = 1; - ipv6_set = 1; - } - else if (unformat (line_input, "dst %U", unformat_ip6_address, &dst6)) - { - dst_set = 1; - ipv6_set = 1; - } - else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id)) - ; - else if (unformat (line_input, "teb")) - t_type = GRE_TUNNEL_TYPE_TEB; - else if (unformat (line_input, "erspan %d", &session_id)) - t_type = GRE_TUNNEL_TYPE_ERSPAN; - else - { - errmsg ("parse error '%U'", format_unformat_error, line_input); - return -99; - } - } - - if (src_set == 0) - { - errmsg ("tunnel src address not specified"); - return -99; - } - if (dst_set == 0) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - errmsg ("tunnel dst address not specified"); - return -99; + if (unformat (i, "lookup_v6_src")) + key = L2T_LOOKUP_SRC_ADDRESS; + else if (unformat (i, "lookup_v6_dst")) + key = L2T_LOOKUP_DST_ADDRESS; + else if (unformat (i, "lookup_session_id")) + key = L2T_LOOKUP_SESSION_ID; + else + break; } - if (ipv4_set && ipv6_set) + + if (key == (u8) ~ 0) { - errmsg ("both IPv4 and IPv6 addresses specified"); + errmsg ("l2tp session lookup key unset"); return -99; } + M (L2TPV3_SET_LOOKUP_KEY, mp); - M (GRE_ADD_DEL_TUNNEL, mp); - - if (ipv4_set) - { - clib_memcpy (&mp->src_address, &src4, 4); - clib_memcpy (&mp->dst_address, &dst4, 4); - } - else - { - clib_memcpy (&mp->src_address, &src6, 16); - clib_memcpy (&mp->dst_address, &dst6, 16); - } - mp->instance = htonl (instance); - mp->outer_fib_id = htonl (outer_fib_id); - mp->is_add = is_add; - mp->session_id = htons ((u16) session_id); - mp->tunnel_type = t_type; - mp->is_ipv6 = ipv6_set; + mp->key = key; S (mp); W (ret); return ret; } -static void vl_api_gre_tunnel_details_t_handler - (vl_api_gre_tunnel_details_t * mp) +static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler + (vl_api_sw_if_l2tpv3_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; - ip46_address_t src = to_ip46 (mp->is_ipv6, mp->src_address); - ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->dst_address); - print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d", - ntohl (mp->sw_if_index), - ntohl (mp->instance), - format_ip46_address, &src, IP46_TYPE_ANY, - format_ip46_address, &dst, IP46_TYPE_ANY, - mp->tunnel_type, ntohl (mp->outer_fib_id), ntohl (mp->session_id)); + print (vam->ofp, "* %U (our) %U (client) (sw_if_index %d)", + format_ip6_address, mp->our_address, + format_ip6_address, mp->client_address, + clib_net_to_host_u32 (mp->sw_if_index)); + + print (vam->ofp, + " local cookies %016llx %016llx remote cookie %016llx", + clib_net_to_host_u64 (mp->local_cookie[0]), + clib_net_to_host_u64 (mp->local_cookie[1]), + clib_net_to_host_u64 (mp->remote_cookie)); + + print (vam->ofp, " local session-id %d remote session-id %d", + clib_net_to_host_u32 (mp->local_session_id), + clib_net_to_host_u32 (mp->remote_session_id)); + + print (vam->ofp, " l2 specific sublayer %s\n", + mp->l2_sublayer_present ? "preset" : "absent"); + } -static void vl_api_gre_tunnel_details_t_handler_json - (vl_api_gre_tunnel_details_t * mp) +static void vl_api_sw_if_l2tpv3_tunnel_details_t_handler_json + (vl_api_sw_if_l2tpv3_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; - struct in_addr ip4; - struct in6_addr ip6; + struct in6_addr addr; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -14055,64 +11744,38 @@ static void vl_api_gre_tunnel_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_uint (node, "instance", ntohl (mp->instance)); - if (!mp->is_ipv6) - { - clib_memcpy (&ip4, &mp->src_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "dst_address", ip4); - } - else - { - clib_memcpy (&ip6, &mp->src_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "src_address", ip6); - clib_memcpy (&ip6, &mp->dst_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "dst_address", ip6); - } - vat_json_object_add_uint (node, "tunnel_type", mp->tunnel_type); - vat_json_object_add_uint (node, "outer_fib_id", ntohl (mp->outer_fib_id)); - vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6); - vat_json_object_add_uint (node, "session_id", mp->session_id); + + clib_memcpy (&addr, mp->our_address, sizeof (addr)); + vat_json_object_add_ip6 (node, "our_address", addr); + clib_memcpy (&addr, mp->client_address, sizeof (addr)); + vat_json_object_add_ip6 (node, "client_address", addr); + + vat_json_node_t *lc = vat_json_object_add (node, "local_cookie"); + vat_json_init_array (lc); + vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[0])); + vat_json_array_add_uint (lc, clib_net_to_host_u64 (mp->local_cookie[1])); + vat_json_object_add_uint (node, "remote_cookie", + clib_net_to_host_u64 (mp->remote_cookie)); + + printf ("local id: %u", clib_net_to_host_u32 (mp->local_session_id)); + vat_json_object_add_uint (node, "local_session_id", + clib_net_to_host_u32 (mp->local_session_id)); + vat_json_object_add_uint (node, "remote_session_id", + clib_net_to_host_u32 (mp->remote_session_id)); + vat_json_object_add_string_copy (node, "l2_sublayer", + mp->l2_sublayer_present ? (u8 *) "present" + : (u8 *) "absent"); } static int -api_gre_tunnel_dump (vat_main_t * vam) +api_sw_if_l2tpv3_tunnel_dump (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_gre_tunnel_dump_t *mp; + vl_api_sw_if_l2tpv3_tunnel_dump_t *mp; vl_api_control_ping_t *mp_ping; - u32 sw_if_index; - u8 sw_if_index_set = 0; int ret; - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else - break; - } - - if (sw_if_index_set == 0) - { - sw_if_index = ~0; - } - - if (!vam->json_output) - { - print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s", - "sw_if_index", "instance", "src_address", "dst_address", - "tunnel_type", "outer_fib_id", "session_id"); - } - - /* Get list of gre-tunnel interfaces */ - M (GRE_TUNNEL_DUMP, mp); - - mp->sw_if_index = htonl (sw_if_index); - + /* Get list of l2tpv3-tunnel interfaces */ + M (SW_IF_L2TPV3_TUNNEL_DUMP, mp); S (mp); /* Use a control ping for synchronization */ @@ -14123,325 +11786,417 @@ api_gre_tunnel_dump (vat_main_t * vam) return ret; } -static int -api_l2_fib_clear_table (vat_main_t * vam) + +static void vl_api_sw_interface_tap_v2_details_t_handler + (vl_api_sw_interface_tap_v2_details_t * mp) { -// unformat_input_t * i = vam->input; - vl_api_l2_fib_clear_table_t *mp; - int ret; + vat_main_t *vam = &vat_main; - M (L2_FIB_CLEAR_TABLE, mp); + u8 *ip4 = format (0, "%U/%d", format_ip4_address, mp->host_ip4_addr, + mp->host_ip4_prefix_len); + u8 *ip6 = format (0, "%U/%d", format_ip6_address, mp->host_ip6_addr, + mp->host_ip6_prefix_len); - S (mp); - W (ret); - return ret; + print (vam->ofp, + "\n%-16s %-12d %-5d %-12d %-12d %-14U %-30s %-20s %-20s %-30s 0x%-08x", + mp->dev_name, ntohl (mp->sw_if_index), ntohl (mp->id), + ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz), + format_ethernet_address, mp->host_mac_addr, mp->host_namespace, + mp->host_bridge, ip4, ip6, ntohl (mp->tap_flags)); + + vec_free (ip4); + vec_free (ip6); } -static int -api_l2_interface_efp_filter (vat_main_t * vam) +static void vl_api_sw_interface_tap_v2_details_t_handler_json + (vl_api_sw_interface_tap_v2_details_t * mp) { - unformat_input_t *i = vam->input; - vl_api_l2_interface_efp_filter_t *mp; - u32 sw_if_index; - u8 enable = 1; - u8 sw_if_index_set = 0; - int ret; + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (VAT_JSON_ARRAY != vam->json_tree.type) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "enable")) - enable = 1; - else if (unformat (i, "disable")) - enable = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); } + node = vat_json_array_add (&vam->json_tree); - if (sw_if_index_set == 0) - { - errmsg ("missing sw_if_index"); - return -99; - } + vat_json_init_object (node); + vat_json_object_add_uint (node, "id", ntohl (mp->id)); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_uint (node, "tap_flags", ntohl (mp->tap_flags)); + vat_json_object_add_string_copy (node, "dev_name", mp->dev_name); + vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz)); + vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz)); + vat_json_object_add_string_copy (node, "host_mac_addr", + format (0, "%U", format_ethernet_address, + &mp->host_mac_addr)); + vat_json_object_add_string_copy (node, "host_namespace", + mp->host_namespace); + vat_json_object_add_string_copy (node, "host_bridge", mp->host_bridge); + vat_json_object_add_string_copy (node, "host_ip4_addr", + format (0, "%U/%d", format_ip4_address, + mp->host_ip4_addr, + mp->host_ip4_prefix_len)); + vat_json_object_add_string_copy (node, "host_ip6_addr", + format (0, "%U/%d", format_ip6_address, + mp->host_ip6_addr, + mp->host_ip6_prefix_len)); - M (L2_INTERFACE_EFP_FILTER, mp); +} - mp->sw_if_index = ntohl (sw_if_index); - mp->enable_disable = enable; +static int +api_sw_interface_tap_v2_dump (vat_main_t * vam) +{ + vl_api_sw_interface_tap_v2_dump_t *mp; + vl_api_control_ping_t *mp_ping; + int ret; + + print (vam->ofp, + "\n%-16s %-12s %-5s %-12s %-12s %-14s %-30s %-20s %-20s %-30s", + "dev_name", "sw_if_index", "id", "rx_ring_sz", "tx_ring_sz", + "host_mac_addr", "host_namespace", "host_bridge", "host_ip4_addr", + "host_ip6_addr"); + /* Get list of tap interfaces */ + M (SW_INTERFACE_TAP_V2_DUMP, mp); S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } -#define foreach_vtr_op \ -_("disable", L2_VTR_DISABLED) \ -_("push-1", L2_VTR_PUSH_1) \ -_("push-2", L2_VTR_PUSH_2) \ -_("pop-1", L2_VTR_POP_1) \ -_("pop-2", L2_VTR_POP_2) \ -_("translate-1-1", L2_VTR_TRANSLATE_1_1) \ -_("translate-1-2", L2_VTR_TRANSLATE_1_2) \ -_("translate-2-1", L2_VTR_TRANSLATE_2_1) \ -_("translate-2-2", L2_VTR_TRANSLATE_2_2) +static void vl_api_sw_interface_virtio_pci_details_t_handler + (vl_api_sw_interface_virtio_pci_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + typedef union + { + struct + { + u16 domain; + u8 bus; + u8 slot:5; + u8 function:3; + }; + u32 as_u32; + } pci_addr_t; + pci_addr_t addr; + addr.as_u32 = ntohl (mp->pci_addr); + u8 *pci_addr = format (0, "%04x:%02x:%02x.%x", addr.domain, addr.bus, + addr.slot, addr.function); + + print (vam->ofp, + "\n%-12s %-12d %-12d %-12d %-17U 0x%-08llx", + pci_addr, ntohl (mp->sw_if_index), + ntohs (mp->rx_ring_sz), ntohs (mp->tx_ring_sz), + format_ethernet_address, mp->mac_addr, + clib_net_to_host_u64 (mp->features)); + vec_free (pci_addr); +} + +static void vl_api_sw_interface_virtio_pci_details_t_handler_json + (vl_api_sw_interface_virtio_pci_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + + if (VAT_JSON_ARRAY != vam->json_tree.type) + { + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); + } + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + vat_json_object_add_uint (node, "pci-addr", ntohl (mp->pci_addr)); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_uint (node, "rx_ring_sz", ntohs (mp->rx_ring_sz)); + vat_json_object_add_uint (node, "tx_ring_sz", ntohs (mp->tx_ring_sz)); + vat_json_object_add_uint (node, "features", + clib_net_to_host_u64 (mp->features)); + vat_json_object_add_string_copy (node, "mac_addr", + format (0, "%U", format_ethernet_address, + &mp->mac_addr)); +} static int -api_l2_interface_vlan_tag_rewrite (vat_main_t * vam) +api_sw_interface_virtio_pci_dump (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_l2_interface_vlan_tag_rewrite_t *mp; - u32 sw_if_index; - u8 sw_if_index_set = 0; - u8 vtr_op_set = 0; - u32 vtr_op = 0; - u32 push_dot1q = 1; - u32 tag1 = ~0; - u32 tag2 = ~0; + vl_api_sw_interface_virtio_pci_dump_t *mp; + vl_api_control_ping_t *mp_ping; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "vtr_op %d", &vtr_op)) - vtr_op_set = 1; -#define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;} - foreach_vtr_op -#undef _ - else if (unformat (i, "push_dot1q %d", &push_dot1q)) - ; - else if (unformat (i, "tag1 %d", &tag1)) - ; - else if (unformat (i, "tag2 %d", &tag2)) - ; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } + print (vam->ofp, + "\n%-12s %-12s %-12s %-12s %-17s %-08s", + "pci_addr", "sw_if_index", "rx_ring_sz", "tx_ring_sz", + "mac_addr", "features"); - if ((sw_if_index_set == 0) || (vtr_op_set == 0)) - { - errmsg ("missing vtr operation or sw_if_index"); - return -99; - } + /* Get list of tap interfaces */ + M (SW_INTERFACE_VIRTIO_PCI_DUMP, mp); + S (mp); - M (L2_INTERFACE_VLAN_TAG_REWRITE, mp); - mp->sw_if_index = ntohl (sw_if_index); - mp->vtr_op = ntohl (vtr_op); - mp->push_dot1q = ntohl (push_dot1q); - mp->tag1 = ntohl (tag1); - mp->tag2 = ntohl (tag2); + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); - S (mp); W (ret); return ret; } static int -api_create_vhost_user_if (vat_main_t * vam) +api_vxlan_offload_rx (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_create_vhost_user_if_t *mp; - u8 *file_name; - u8 is_server = 0; - u8 file_name_set = 0; - u32 custom_dev_instance = ~0; - u8 hwaddr[6]; - u8 use_custom_mac = 0; - u8 disable_mrg_rxbuf = 0; - u8 disable_indirect_desc = 0; - u8 *tag = 0; + unformat_input_t *line_input = vam->input; + vl_api_vxlan_offload_rx_t *mp; + u32 hw_if_index = ~0, rx_if_index = ~0; + u8 is_add = 1; int ret; - /* Shut up coverity */ - clib_memset (hwaddr, 0, sizeof (hwaddr)); - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "socket %s", &file_name)) - { - file_name_set = 1; - } - else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance)) + if (unformat (line_input, "del")) + is_add = 0; + else if (unformat (line_input, "hw %U", api_unformat_hw_if_index, vam, + &hw_if_index)) ; - else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr)) - use_custom_mac = 1; - else if (unformat (i, "server")) - is_server = 1; - else if (unformat (i, "disable_mrg_rxbuf")) - disable_mrg_rxbuf = 1; - else if (unformat (i, "disable_indirect_desc")) - disable_indirect_desc = 1; - else if (unformat (i, "tag %s", &tag)) + else if (unformat (line_input, "hw hw_if_index %u", &hw_if_index)) + ; + else if (unformat (line_input, "rx %U", api_unformat_sw_if_index, vam, + &rx_if_index)) + ; + else if (unformat (line_input, "rx sw_if_index %u", &rx_if_index)) ; else - break; + { + errmsg ("parse error '%U'", format_unformat_error, line_input); + return -99; + } } - if (file_name_set == 0) + if (hw_if_index == ~0) { - errmsg ("missing socket file name"); + errmsg ("no hw interface"); return -99; } - if (vec_len (file_name) > 255) + if (rx_if_index == ~0) { - errmsg ("socket file name too long"); + errmsg ("no rx tunnel"); return -99; } - vec_add1 (file_name, 0); - M (CREATE_VHOST_USER_IF, mp); - - mp->is_server = is_server; - mp->disable_mrg_rxbuf = disable_mrg_rxbuf; - mp->disable_indirect_desc = disable_indirect_desc; - clib_memcpy (mp->sock_filename, file_name, vec_len (file_name)); - vec_free (file_name); - if (custom_dev_instance != ~0) - { - mp->renumber = 1; - mp->custom_dev_instance = ntohl (custom_dev_instance); - } + M (VXLAN_OFFLOAD_RX, mp); - mp->use_custom_mac = use_custom_mac; - clib_memcpy (mp->mac_address, hwaddr, 6); - if (tag) - strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1); - vec_free (tag); + mp->hw_if_index = ntohl (hw_if_index); + mp->sw_if_index = ntohl (rx_if_index); + mp->enable = is_add; S (mp); W (ret); return ret; } +static uword unformat_vxlan_decap_next + (unformat_input_t * input, va_list * args) +{ + u32 *result = va_arg (*args, u32 *); + u32 tmp; + + if (unformat (input, "l2")) + *result = VXLAN_INPUT_NEXT_L2_INPUT; + else if (unformat (input, "%d", &tmp)) + *result = tmp; + else + return 0; + return 1; +} + static int -api_modify_vhost_user_if (vat_main_t * vam) +api_vxlan_add_del_tunnel (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_modify_vhost_user_if_t *mp; - u8 *file_name; - u8 is_server = 0; - u8 file_name_set = 0; - u32 custom_dev_instance = ~0; - u8 sw_if_index_set = 0; - u32 sw_if_index = (u32) ~ 0; + unformat_input_t *line_input = vam->input; + vl_api_vxlan_add_del_tunnel_t *mp; + ip46_address_t src, dst; + u8 is_add = 1; + u8 ipv4_set = 0, ipv6_set = 0; + u8 src_set = 0; + u8 dst_set = 0; + u8 grp_set = 0; + u32 instance = ~0; + u32 mcast_sw_if_index = ~0; + u32 encap_vrf_id = 0; + u32 decap_next_index = ~0; + u32 vni = 0; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ + clib_memset (&src, 0, sizeof src); + clib_memset (&dst, 0, sizeof dst); + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "socket %s", &file_name)) + if (unformat (line_input, "del")) + is_add = 0; + else if (unformat (line_input, "instance %d", &instance)) + ; + else + if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4)) { - file_name_set = 1; + ipv4_set = 1; + src_set = 1; } - else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance)) + else + if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4)) + { + ipv4_set = 1; + dst_set = 1; + } + else + if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6)) + { + ipv6_set = 1; + src_set = 1; + } + else + if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6)) + { + ipv6_set = 1; + dst_set = 1; + } + else if (unformat (line_input, "group %U %U", + unformat_ip4_address, &dst.ip4, + api_unformat_sw_if_index, vam, &mcast_sw_if_index)) + { + grp_set = dst_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "group %U", + unformat_ip4_address, &dst.ip4)) + { + grp_set = dst_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "group %U %U", + unformat_ip6_address, &dst.ip6, + api_unformat_sw_if_index, vam, &mcast_sw_if_index)) + { + grp_set = dst_set = 1; + ipv6_set = 1; + } + else if (unformat (line_input, "group %U", + unformat_ip6_address, &dst.ip6)) + { + grp_set = dst_set = 1; + ipv6_set = 1; + } + else + if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index)) + ; + else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id)) + ; + else if (unformat (line_input, "decap-next %U", + unformat_vxlan_decap_next, &decap_next_index)) + ; + else if (unformat (line_input, "vni %d", &vni)) ; - else if (unformat (i, "server")) - is_server = 1; else - break; + { + errmsg ("parse error '%U'", format_unformat_error, line_input); + return -99; + } } - if (sw_if_index_set == 0) + if (src_set == 0) { - errmsg ("missing sw_if_index or interface name"); + errmsg ("tunnel src address not specified"); return -99; } - - if (file_name_set == 0) + if (dst_set == 0) { - errmsg ("missing socket file name"); + errmsg ("tunnel dst address not specified"); return -99; } - if (vec_len (file_name) > 255) + if (grp_set && !ip46_address_is_multicast (&dst)) { - errmsg ("socket file name too long"); + errmsg ("tunnel group address not multicast"); return -99; } - vec_add1 (file_name, 0); - - M (MODIFY_VHOST_USER_IF, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->is_server = is_server; - clib_memcpy (mp->sock_filename, file_name, vec_len (file_name)); - vec_free (file_name); - if (custom_dev_instance != ~0) + if (grp_set && mcast_sw_if_index == ~0) { - mp->renumber = 1; - mp->custom_dev_instance = ntohl (custom_dev_instance); + errmsg ("tunnel nonexistent multicast device"); + return -99; + } + if (grp_set == 0 && ip46_address_is_multicast (&dst)) + { + errmsg ("tunnel dst address must be unicast"); + return -99; } - S (mp); - W (ret); - return ret; -} - -static int -api_delete_vhost_user_if (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_delete_vhost_user_if_t *mp; - u32 sw_if_index = ~0; - u8 sw_if_index_set = 0; - int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (ipv4_set && ipv6_set) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else - break; + errmsg ("both IPv4 and IPv6 addresses specified"); + return -99; } - if (sw_if_index_set == 0) + if ((vni == 0) || (vni >> 24)) { - errmsg ("missing sw_if_index or interface name"); + errmsg ("vni not specified or out of range"); return -99; } + M (VXLAN_ADD_DEL_TUNNEL, mp); - M (DELETE_VHOST_USER_IF, mp); + if (ipv6_set) + { + clib_memcpy (mp->src_address, &src.ip6, sizeof (src.ip6)); + clib_memcpy (mp->dst_address, &dst.ip6, sizeof (dst.ip6)); + } + else + { + clib_memcpy (mp->src_address, &src.ip4, sizeof (src.ip4)); + clib_memcpy (mp->dst_address, &dst.ip4, sizeof (dst.ip4)); + } - mp->sw_if_index = ntohl (sw_if_index); + mp->instance = htonl (instance); + mp->encap_vrf_id = ntohl (encap_vrf_id); + mp->decap_next_index = ntohl (decap_next_index); + mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); + mp->vni = ntohl (vni); + mp->is_add = is_add; + mp->is_ipv6 = ipv6_set; S (mp); W (ret); return ret; } -static void vl_api_sw_interface_vhost_user_details_t_handler - (vl_api_sw_interface_vhost_user_details_t * mp) +static void vl_api_vxlan_tunnel_details_t_handler + (vl_api_vxlan_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; + ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address); + ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address); - print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s", - (char *) mp->interface_name, - ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz), - clib_net_to_host_u64 (mp->features), mp->is_server, - ntohl (mp->num_regions), (char *) mp->sock_filename); - print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno))); + print (vam->ofp, "%11d%11d%24U%24U%14d%18d%13d%19d", + ntohl (mp->sw_if_index), + ntohl (mp->instance), + format_ip46_address, &src, IP46_TYPE_ANY, + format_ip46_address, &dst, IP46_TYPE_ANY, + ntohl (mp->encap_vrf_id), + ntohl (mp->decap_next_index), ntohl (mp->vni), + ntohl (mp->mcast_sw_if_index)); } -static void vl_api_sw_interface_vhost_user_details_t_handler_json - (vl_api_sw_interface_vhost_user_details_t * mp) +static void vl_api_vxlan_tunnel_details_t_handler_json + (vl_api_vxlan_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; @@ -14455,29 +12210,72 @@ static void vl_api_sw_interface_vhost_user_details_t_handler_json vat_json_init_object (node); vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_string_copy (node, "interface_name", - mp->interface_name); - vat_json_object_add_uint (node, "virtio_net_hdr_sz", - ntohl (mp->virtio_net_hdr_sz)); - vat_json_object_add_uint (node, "features", - clib_net_to_host_u64 (mp->features)); - vat_json_object_add_uint (node, "is_server", mp->is_server); - vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename); - vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions)); - vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno)); + + vat_json_object_add_uint (node, "instance", ntohl (mp->instance)); + + if (mp->is_ipv6) + { + struct in6_addr ip6; + + clib_memcpy (&ip6, mp->src_address, sizeof (ip6)); + vat_json_object_add_ip6 (node, "src_address", ip6); + clib_memcpy (&ip6, mp->dst_address, sizeof (ip6)); + vat_json_object_add_ip6 (node, "dst_address", ip6); + } + else + { + struct in_addr ip4; + + clib_memcpy (&ip4, mp->src_address, sizeof (ip4)); + vat_json_object_add_ip4 (node, "src_address", ip4); + clib_memcpy (&ip4, mp->dst_address, sizeof (ip4)); + vat_json_object_add_ip4 (node, "dst_address", ip4); + } + vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); + vat_json_object_add_uint (node, "decap_next_index", + ntohl (mp->decap_next_index)); + vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); + vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); + vat_json_object_add_uint (node, "mcast_sw_if_index", + ntohl (mp->mcast_sw_if_index)); } static int -api_sw_interface_vhost_user_dump (vat_main_t * vam) +api_vxlan_tunnel_dump (vat_main_t * vam) { - vl_api_sw_interface_vhost_user_dump_t *mp; + unformat_input_t *i = vam->input; + vl_api_vxlan_tunnel_dump_t *mp; vl_api_control_ping_t *mp_ping; + u32 sw_if_index; + u8 sw_if_index_set = 0; int ret; - print (vam->ofp, - "Interface name idx hdr_sz features server regions filename"); - /* Get list of vhost-user interfaces */ - M (SW_INTERFACE_VHOST_USER_DUMP, mp); + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else + break; + } + + if (sw_if_index_set == 0) + { + sw_if_index = ~0; + } + + if (!vam->json_output) + { + print (vam->ofp, "%11s%11s%24s%24s%14s%18s%13s%19s", + "sw_if_index", "instance", "src_address", "dst_address", + "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index"); + } + + /* Get list of vxlan-tunnel interfaces */ + M (VXLAN_TUNNEL_DUMP, mp); + + mp->sw_if_index = htonl (sw_if_index); + S (mp); /* Use a control ping for synchronization */ @@ -14488,98 +12286,94 @@ api_sw_interface_vhost_user_dump (vat_main_t * vam) return ret; } -static int -api_show_version (vat_main_t * vam) +static uword unformat_geneve_decap_next + (unformat_input_t * input, va_list * args) { - vl_api_show_version_t *mp; - int ret; - - M (SHOW_VERSION, mp); + u32 *result = va_arg (*args, u32 *); + u32 tmp; - S (mp); - W (ret); - return ret; + if (unformat (input, "l2")) + *result = GENEVE_INPUT_NEXT_L2_INPUT; + else if (unformat (input, "%d", &tmp)) + *result = tmp; + else + return 0; + return 1; } - static int -api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) +api_geneve_add_del_tunnel (vat_main_t * vam) { unformat_input_t *line_input = vam->input; - vl_api_vxlan_gpe_add_del_tunnel_t *mp; - ip4_address_t local4, remote4; - ip6_address_t local6, remote6; + vl_api_geneve_add_del_tunnel_t *mp; + ip46_address_t src, dst; u8 is_add = 1; u8 ipv4_set = 0, ipv6_set = 0; - u8 local_set = 0; - u8 remote_set = 0; + u8 src_set = 0; + u8 dst_set = 0; u8 grp_set = 0; u32 mcast_sw_if_index = ~0; u32 encap_vrf_id = 0; - u32 decap_vrf_id = 0; - u8 protocol = ~0; - u32 vni; - u8 vni_set = 0; + u32 decap_next_index = ~0; + u32 vni = 0; int ret; /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ - clib_memset (&local4, 0, sizeof local4); - clib_memset (&remote4, 0, sizeof remote4); - clib_memset (&local6, 0, sizeof local6); - clib_memset (&remote6, 0, sizeof remote6); + clib_memset (&src, 0, sizeof src); + clib_memset (&dst, 0, sizeof dst); while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { if (unformat (line_input, "del")) is_add = 0; - else if (unformat (line_input, "local %U", - unformat_ip4_address, &local4)) + else + if (unformat (line_input, "src %U", unformat_ip4_address, &src.ip4)) { - local_set = 1; ipv4_set = 1; + src_set = 1; } - else if (unformat (line_input, "remote %U", - unformat_ip4_address, &remote4)) + else + if (unformat (line_input, "dst %U", unformat_ip4_address, &dst.ip4)) { - remote_set = 1; ipv4_set = 1; + dst_set = 1; } - else if (unformat (line_input, "local %U", - unformat_ip6_address, &local6)) + else + if (unformat (line_input, "src %U", unformat_ip6_address, &src.ip6)) { - local_set = 1; ipv6_set = 1; + src_set = 1; } - else if (unformat (line_input, "remote %U", - unformat_ip6_address, &remote6)) + else + if (unformat (line_input, "dst %U", unformat_ip6_address, &dst.ip6)) { - remote_set = 1; ipv6_set = 1; + dst_set = 1; } else if (unformat (line_input, "group %U %U", - unformat_ip4_address, &remote4, + unformat_ip4_address, &dst.ip4, api_unformat_sw_if_index, vam, &mcast_sw_if_index)) { - grp_set = remote_set = 1; + grp_set = dst_set = 1; ipv4_set = 1; } else if (unformat (line_input, "group %U", - unformat_ip4_address, &remote4)) + unformat_ip4_address, &dst.ip4)) { - grp_set = remote_set = 1; + grp_set = dst_set = 1; ipv4_set = 1; } else if (unformat (line_input, "group %U %U", - unformat_ip6_address, &remote6, + unformat_ip6_address, &dst.ip6, api_unformat_sw_if_index, vam, &mcast_sw_if_index)) { - grp_set = remote_set = 1; + grp_set = dst_set = 1; ipv6_set = 1; } else if (unformat (line_input, "group %U", - unformat_ip6_address, &remote6)) + unformat_ip6_address, &dst.ip6)) { - grp_set = remote_set = 1; + grp_set = dst_set = 1; ipv6_set = 1; } else @@ -14587,18 +12381,11 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) ; else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id)) ; - else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id)) + else if (unformat (line_input, "decap-next %U", + unformat_geneve_decap_next, &decap_next_index)) ; else if (unformat (line_input, "vni %d", &vni)) - vni_set = 1; - else if (unformat (line_input, "next-ip4")) - protocol = 1; - else if (unformat (line_input, "next-ip6")) - protocol = 2; - else if (unformat (line_input, "next-ethernet")) - protocol = 3; - else if (unformat (line_input, "next-nsh")) - protocol = 4; + ; else { errmsg ("parse error '%U'", format_unformat_error, line_input); @@ -14606,14 +12393,20 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) } } - if (local_set == 0) + if (src_set == 0) { - errmsg ("tunnel local address not specified"); + errmsg ("tunnel src address not specified"); return -99; } - if (remote_set == 0) + if (dst_set == 0) { - errmsg ("tunnel remote address not specified"); + errmsg ("tunnel dst address not specified"); + return -99; + } + + if (grp_set && !ip46_address_is_multicast (&dst)) + { + errmsg ("tunnel group address not multicast"); return -99; } if (grp_set && mcast_sw_if_index == ~0) @@ -14621,36 +12414,40 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) errmsg ("tunnel nonexistent multicast device"); return -99; } + if (grp_set == 0 && ip46_address_is_multicast (&dst)) + { + errmsg ("tunnel dst address must be unicast"); + return -99; + } + + if (ipv4_set && ipv6_set) { errmsg ("both IPv4 and IPv6 addresses specified"); return -99; } - if (vni_set == 0) + if ((vni == 0) || (vni >> 24)) { - errmsg ("vni not specified"); + errmsg ("vni not specified or out of range"); return -99; } - M (VXLAN_GPE_ADD_DEL_TUNNEL, mp); - + M (GENEVE_ADD_DEL_TUNNEL, mp); if (ipv6_set) { - clib_memcpy (&mp->local, &local6, sizeof (local6)); - clib_memcpy (&mp->remote, &remote6, sizeof (remote6)); + clib_memcpy (mp->local_address, &src.ip6, sizeof (src.ip6)); + clib_memcpy (mp->remote_address, &dst.ip6, sizeof (dst.ip6)); } else { - clib_memcpy (&mp->local, &local4, sizeof (local4)); - clib_memcpy (&mp->remote, &remote4, sizeof (remote4)); + clib_memcpy (mp->local_address, &src.ip4, sizeof (src.ip4)); + clib_memcpy (mp->remote_address, &dst.ip4, sizeof (dst.ip4)); } - - mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); mp->encap_vrf_id = ntohl (encap_vrf_id); - mp->decap_vrf_id = ntohl (decap_vrf_id); - mp->protocol = protocol; + mp->decap_next_index = ntohl (decap_next_index); + mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); mp->vni = ntohl (vni); mp->is_add = is_add; mp->is_ipv6 = ipv6_set; @@ -14660,30 +12457,27 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) return ret; } -static void vl_api_vxlan_gpe_tunnel_details_t_handler - (vl_api_vxlan_gpe_tunnel_details_t * mp) +static void vl_api_geneve_tunnel_details_t_handler + (vl_api_geneve_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; - ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local); - ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote); + ip46_address_t src = to_ip46 (mp->is_ipv6, mp->dst_address); + ip46_address_t dst = to_ip46 (mp->is_ipv6, mp->src_address); - print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d", + print (vam->ofp, "%11d%24U%24U%14d%18d%13d%19d", ntohl (mp->sw_if_index), - format_ip46_address, &local, IP46_TYPE_ANY, - format_ip46_address, &remote, IP46_TYPE_ANY, - ntohl (mp->vni), mp->protocol, - ntohl (mp->mcast_sw_if_index), - ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id)); + format_ip46_address, &src, IP46_TYPE_ANY, + format_ip46_address, &dst, IP46_TYPE_ANY, + ntohl (mp->encap_vrf_id), + ntohl (mp->decap_next_index), ntohl (mp->vni), + ntohl (mp->mcast_sw_if_index)); } - -static void vl_api_vxlan_gpe_tunnel_details_t_handler_json - (vl_api_vxlan_gpe_tunnel_details_t * mp) +static void vl_api_geneve_tunnel_details_t_handler_json + (vl_api_geneve_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; - struct in_addr ip4; - struct in6_addr ip6; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -14696,32 +12490,36 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler_json vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); if (mp->is_ipv6) { - clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6)); - vat_json_object_add_ip6 (node, "local", ip6); - clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6)); - vat_json_object_add_ip6 (node, "remote", ip6); + struct in6_addr ip6; + + clib_memcpy (&ip6, mp->src_address, sizeof (ip6)); + vat_json_object_add_ip6 (node, "src_address", ip6); + clib_memcpy (&ip6, mp->dst_address, sizeof (ip6)); + vat_json_object_add_ip6 (node, "dst_address", ip6); } else { - clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4)); - vat_json_object_add_ip4 (node, "local", ip4); - clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4)); - vat_json_object_add_ip4 (node, "remote", ip4); + struct in_addr ip4; + + clib_memcpy (&ip4, mp->src_address, sizeof (ip4)); + vat_json_object_add_ip4 (node, "src_address", ip4); + clib_memcpy (&ip4, mp->dst_address, sizeof (ip4)); + vat_json_object_add_ip4 (node, "dst_address", ip4); } + vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); + vat_json_object_add_uint (node, "decap_next_index", + ntohl (mp->decap_next_index)); vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); - vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol)); + vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); vat_json_object_add_uint (node, "mcast_sw_if_index", ntohl (mp->mcast_sw_if_index)); - vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); - vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id)); - vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); } static int -api_vxlan_gpe_tunnel_dump (vat_main_t * vam) +api_geneve_tunnel_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_vxlan_gpe_tunnel_dump_t *mp; + vl_api_geneve_tunnel_dump_t *mp; vl_api_control_ping_t *mp_ping; u32 sw_if_index; u8 sw_if_index_set = 0; @@ -14743,40 +12541,115 @@ api_vxlan_gpe_tunnel_dump (vat_main_t * vam) if (!vam->json_output) { - print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s", - "sw_if_index", "local", "remote", "vni", - "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id"); + print (vam->ofp, "%11s%24s%24s%14s%18s%13s%19s", + "sw_if_index", "local_address", "remote_address", + "encap_vrf_id", "decap_next_index", "vni", "mcast_sw_if_index"); } - /* Get list of vxlan-tunnel interfaces */ - M (VXLAN_GPE_TUNNEL_DUMP, mp); + /* Get list of geneve-tunnel interfaces */ + M (GENEVE_TUNNEL_DUMP, mp); mp->sw_if_index = htonl (sw_if_index); S (mp); /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); + M (CONTROL_PING, mp_ping); S (mp_ping); W (ret); return ret; } -static void vl_api_l2_fib_table_details_t_handler - (vl_api_l2_fib_table_details_t * mp) +static int +api_gre_tunnel_add_del (vat_main_t * vam) +{ + unformat_input_t *line_input = vam->input; + vl_api_address_t src = { }, dst = + { + }; + vl_api_gre_tunnel_add_del_t *mp; + vl_api_gre_tunnel_type_t t_type; + u8 is_add = 1; + u8 src_set = 0; + u8 dst_set = 0; + u32 outer_fib_id = 0; + u32 session_id = 0; + u32 instance = ~0; + int ret; + + t_type = GRE_API_TUNNEL_TYPE_L3; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "del")) + is_add = 0; + else if (unformat (line_input, "instance %d", &instance)) + ; + else if (unformat (line_input, "src %U", unformat_vl_api_address, &src)) + { + src_set = 1; + } + else if (unformat (line_input, "dst %U", unformat_vl_api_address, &dst)) + { + dst_set = 1; + } + else if (unformat (line_input, "outer-fib-id %d", &outer_fib_id)) + ; + else if (unformat (line_input, "teb")) + t_type = GRE_API_TUNNEL_TYPE_TEB; + else if (unformat (line_input, "erspan %d", &session_id)) + t_type = GRE_API_TUNNEL_TYPE_ERSPAN; + else + { + errmsg ("parse error '%U'", format_unformat_error, line_input); + return -99; + } + } + + if (src_set == 0) + { + errmsg ("tunnel src address not specified"); + return -99; + } + if (dst_set == 0) + { + errmsg ("tunnel dst address not specified"); + return -99; + } + + M (GRE_TUNNEL_ADD_DEL, mp); + + clib_memcpy (&mp->tunnel.src, &src, sizeof (mp->tunnel.src)); + clib_memcpy (&mp->tunnel.dst, &dst, sizeof (mp->tunnel.dst)); + + mp->tunnel.instance = htonl (instance); + mp->tunnel.outer_fib_id = htonl (outer_fib_id); + mp->is_add = is_add; + mp->tunnel.session_id = htons ((u16) session_id); + mp->tunnel.type = htonl (t_type); + + S (mp); + W (ret); + return ret; +} + +static void vl_api_gre_tunnel_details_t_handler + (vl_api_gre_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; - print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32 - " %d %d %d", - ntohl (mp->bd_id), format_ethernet_address, mp->mac, - ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac, - mp->bvi_mac); + print (vam->ofp, "%11d%11d%24U%24U%13d%14d%12d", + ntohl (mp->tunnel.sw_if_index), + ntohl (mp->tunnel.instance), + format_vl_api_address, &mp->tunnel.src, + format_vl_api_address, &mp->tunnel.dst, + mp->tunnel.type, ntohl (mp->tunnel.outer_fib_id), + ntohl (mp->tunnel.session_id)); } -static void vl_api_l2_fib_table_details_t_handler_json - (vl_api_l2_fib_table_details_t * mp) +static void vl_api_gre_tunnel_details_t_handler_json + (vl_api_gre_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; @@ -14788,96 +12661,183 @@ static void vl_api_l2_fib_table_details_t_handler_json } node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); - vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id)); - vat_json_object_add_bytes (node, "mac", mp->mac, 6); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_uint (node, "static_mac", mp->static_mac); - vat_json_object_add_uint (node, "filter_mac", mp->filter_mac); - vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac); + vat_json_init_object (node); + vat_json_object_add_uint (node, "sw_if_index", + ntohl (mp->tunnel.sw_if_index)); + vat_json_object_add_uint (node, "instance", ntohl (mp->tunnel.instance)); + + vat_json_object_add_address (node, "src", &mp->tunnel.src); + vat_json_object_add_address (node, "dst", &mp->tunnel.dst); + vat_json_object_add_uint (node, "tunnel_type", mp->tunnel.type); + vat_json_object_add_uint (node, "outer_fib_id", + ntohl (mp->tunnel.outer_fib_id)); + vat_json_object_add_uint (node, "session_id", mp->tunnel.session_id); +} + +static int +api_gre_tunnel_dump (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_gre_tunnel_dump_t *mp; + vl_api_control_ping_t *mp_ping; + u32 sw_if_index; + u8 sw_if_index_set = 0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else + break; + } + + if (sw_if_index_set == 0) + { + sw_if_index = ~0; + } + + if (!vam->json_output) + { + print (vam->ofp, "%11s%11s%24s%24s%13s%14s%12s", + "sw_if_index", "instance", "src_address", "dst_address", + "tunnel_type", "outer_fib_id", "session_id"); + } + + /* Get list of gre-tunnel interfaces */ + M (GRE_TUNNEL_DUMP, mp); + + mp->sw_if_index = htonl (sw_if_index); + + S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + W (ret); + return ret; +} + +static int +api_l2_fib_clear_table (vat_main_t * vam) +{ +// unformat_input_t * i = vam->input; + vl_api_l2_fib_clear_table_t *mp; + int ret; + + M (L2_FIB_CLEAR_TABLE, mp); + + S (mp); + W (ret); + return ret; } static int -api_l2_fib_table_dump (vat_main_t * vam) +api_l2_interface_efp_filter (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_l2_fib_table_dump_t *mp; - vl_api_control_ping_t *mp_ping; - u32 bd_id; - u8 bd_id_set = 0; + vl_api_l2_interface_efp_filter_t *mp; + u32 sw_if_index; + u8 enable = 1; + u8 sw_if_index_set = 0; int ret; - /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "bd_id %d", &bd_id)) - bd_id_set = 1; + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "enable")) + enable = 1; + else if (unformat (i, "disable")) + enable = 0; else - break; + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - if (bd_id_set == 0) + if (sw_if_index_set == 0) { - errmsg ("missing bridge domain"); + errmsg ("missing sw_if_index"); return -99; } - print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI"); + M (L2_INTERFACE_EFP_FILTER, mp); - /* Get list of l2 fib entries */ - M (L2_FIB_TABLE_DUMP, mp); + mp->sw_if_index = ntohl (sw_if_index); + mp->enable_disable = enable; - mp->bd_id = ntohl (bd_id); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } +#define foreach_vtr_op \ +_("disable", L2_VTR_DISABLED) \ +_("push-1", L2_VTR_PUSH_1) \ +_("push-2", L2_VTR_PUSH_2) \ +_("pop-1", L2_VTR_POP_1) \ +_("pop-2", L2_VTR_POP_2) \ +_("translate-1-1", L2_VTR_TRANSLATE_1_1) \ +_("translate-1-2", L2_VTR_TRANSLATE_1_2) \ +_("translate-2-1", L2_VTR_TRANSLATE_2_1) \ +_("translate-2-2", L2_VTR_TRANSLATE_2_2) static int -api_interface_name_renumber (vat_main_t * vam) +api_l2_interface_vlan_tag_rewrite (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_interface_name_renumber_t *mp; - u32 sw_if_index = ~0; - u32 new_show_dev_instance = ~0; + unformat_input_t *i = vam->input; + vl_api_l2_interface_vlan_tag_rewrite_t *mp; + u32 sw_if_index; + u8 sw_if_index_set = 0; + u8 vtr_op_set = 0; + u32 vtr_op = 0; + u32 push_dot1q = 1; + u32 tag1 = ~0; + u32 tag2 = ~0; int ret; - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "%U", api_unformat_sw_if_index, vam, - &sw_if_index)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "vtr_op %d", &vtr_op)) + vtr_op_set = 1; +#define _(n,v) else if (unformat(i, n)) {vtr_op = v; vtr_op_set = 1;} + foreach_vtr_op +#undef _ + else if (unformat (i, "push_dot1q %d", &push_dot1q)) ; - else if (unformat (line_input, "sw_if_index %d", &sw_if_index)) + else if (unformat (i, "tag1 %d", &tag1)) ; - else if (unformat (line_input, "new_show_dev_instance %d", - &new_show_dev_instance)) + else if (unformat (i, "tag2 %d", &tag2)) ; else - break; - } - - if (sw_if_index == ~0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - if (new_show_dev_instance == ~0) + if ((sw_if_index_set == 0) || (vtr_op_set == 0)) { - errmsg ("missing new_show_dev_instance"); + errmsg ("missing vtr operation or sw_if_index"); return -99; } - M (INTERFACE_NAME_RENUMBER, mp); - + M (L2_INTERFACE_VLAN_TAG_REWRITE, mp); mp->sw_if_index = ntohl (sw_if_index); - mp->new_show_dev_instance = ntohl (new_show_dev_instance); + mp->vtr_op = ntohl (vtr_op); + mp->push_dot1q = ntohl (push_dot1q); + mp->tag1 = ntohl (tag1); + mp->tag2 = ntohl (tag2); S (mp); W (ret); @@ -14885,51 +12845,81 @@ api_interface_name_renumber (vat_main_t * vam) } static int -api_ip_probe_neighbor (vat_main_t * vam) +api_create_vhost_user_if (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ip_probe_neighbor_t *mp; - u8 int_set = 0; - u8 adr_set = 0; - u8 is_ipv6 = 0; - u8 dst_adr[16]; - u32 sw_if_index; + vl_api_create_vhost_user_if_t *mp; + u8 *file_name; + u8 is_server = 0; + u8 file_name_set = 0; + u32 custom_dev_instance = ~0; + u8 hwaddr[6]; + u8 use_custom_mac = 0; + u8 disable_mrg_rxbuf = 0; + u8 disable_indirect_desc = 0; + u8 *tag = 0; + u8 enable_gso = 0; int ret; + /* Shut up coverity */ + clib_memset (hwaddr, 0, sizeof (hwaddr)); + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - int_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - int_set = 1; - else if (unformat (i, "address %U", unformat_ip4_address, dst_adr)) - adr_set = 1; - else if (unformat (i, "address %U", unformat_ip6_address, dst_adr)) + if (unformat (i, "socket %s", &file_name)) { - adr_set = 1; - is_ipv6 = 1; + file_name_set = 1; } + else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance)) + ; + else if (unformat (i, "mac %U", unformat_ethernet_address, hwaddr)) + use_custom_mac = 1; + else if (unformat (i, "server")) + is_server = 1; + else if (unformat (i, "disable_mrg_rxbuf")) + disable_mrg_rxbuf = 1; + else if (unformat (i, "disable_indirect_desc")) + disable_indirect_desc = 1; + else if (unformat (i, "gso")) + enable_gso = 1; + else if (unformat (i, "tag %s", &tag)) + ; else break; } - if (int_set == 0) + if (file_name_set == 0) { - errmsg ("missing interface"); + errmsg ("missing socket file name"); return -99; } - if (adr_set == 0) + if (vec_len (file_name) > 255) { - errmsg ("missing addresses"); + errmsg ("socket file name too long"); return -99; } + vec_add1 (file_name, 0); - M (IP_PROBE_NEIGHBOR, mp); + M (CREATE_VHOST_USER_IF, mp); - mp->sw_if_index = ntohl (sw_if_index); - mp->is_ipv6 = is_ipv6; - clib_memcpy (mp->dst_address, dst_adr, sizeof (dst_adr)); + mp->is_server = is_server; + mp->disable_mrg_rxbuf = disable_mrg_rxbuf; + mp->disable_indirect_desc = disable_indirect_desc; + mp->enable_gso = enable_gso; + clib_memcpy (mp->sock_filename, file_name, vec_len (file_name)); + vec_free (file_name); + if (custom_dev_instance != ~0) + { + mp->renumber = 1; + mp->custom_dev_instance = ntohl (custom_dev_instance); + } + + mp->use_custom_mac = use_custom_mac; + clib_memcpy (mp->mac_address, hwaddr, 6); + if (tag) + strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1); + vec_free (tag); S (mp); W (ret); @@ -14937,824 +12927,607 @@ api_ip_probe_neighbor (vat_main_t * vam) } static int -api_ip_scan_neighbor_enable_disable (vat_main_t * vam) +api_modify_vhost_user_if (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ip_scan_neighbor_enable_disable_t *mp; - u8 mode = IP_SCAN_V46_NEIGHBORS; - u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0; + vl_api_modify_vhost_user_if_t *mp; + u8 *file_name; + u8 is_server = 0; + u8 file_name_set = 0; + u32 custom_dev_instance = ~0; + u8 sw_if_index_set = 0; + u32 sw_if_index = (u32) ~ 0; + u8 enable_gso = 0; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "ip4")) - mode = IP_SCAN_V4_NEIGHBORS; - else if (unformat (i, "ip6")) - mode = IP_SCAN_V6_NEIGHBORS; - if (unformat (i, "both")) - mode = IP_SCAN_V46_NEIGHBORS; - else if (unformat (i, "disable")) - mode = IP_SCAN_DISABLED; - else if (unformat (i, "interval %d", &interval)) - ; - else if (unformat (i, "max-time %d", &time)) - ; - else if (unformat (i, "max-update %d", &update)) - ; - else if (unformat (i, "delay %d", &delay)) - ; - else if (unformat (i, "stale %d", &stale)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "socket %s", &file_name)) + { + file_name_set = 1; + } + else if (unformat (i, "renumber %" PRIu32, &custom_dev_instance)) ; + else if (unformat (i, "server")) + is_server = 1; + else if (unformat (i, "gso")) + enable_gso = 1; else break; } - if (interval > 255) - { - errmsg ("interval cannot exceed 255 minutes."); - return -99; - } - if (time > 255) + if (sw_if_index_set == 0) { - errmsg ("max-time cannot exceed 255 usec."); + errmsg ("missing sw_if_index or interface name"); return -99; } - if (update > 255) + + if (file_name_set == 0) { - errmsg ("max-update cannot exceed 255."); + errmsg ("missing socket file name"); return -99; } - if (delay > 255) + + if (vec_len (file_name) > 255) { - errmsg ("delay cannot exceed 255 msec."); + errmsg ("socket file name too long"); return -99; } - if (stale > 255) + vec_add1 (file_name, 0); + + M (MODIFY_VHOST_USER_IF, mp); + + mp->sw_if_index = ntohl (sw_if_index); + mp->is_server = is_server; + mp->enable_gso = enable_gso; + clib_memcpy (mp->sock_filename, file_name, vec_len (file_name)); + vec_free (file_name); + if (custom_dev_instance != ~0) { - errmsg ("stale cannot exceed 255 minutes."); - return -99; + mp->renumber = 1; + mp->custom_dev_instance = ntohl (custom_dev_instance); } - M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp); - mp->mode = mode; - mp->scan_interval = interval; - mp->max_proc_time = time; - mp->max_update = update; - mp->scan_int_delay = delay; - mp->stale_threshold = stale; - S (mp); W (ret); return ret; } static int -api_want_ip4_arp_events (vat_main_t * vam) +api_delete_vhost_user_if (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_want_ip4_arp_events_t *mp; - ip4_address_t address; - int address_set = 0; - u32 enable_disable = 1; + unformat_input_t *i = vam->input; + vl_api_delete_vhost_user_if_t *mp; + u32 sw_if_index = ~0; + u8 sw_if_index_set = 0; int ret; - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (line_input, "address %U", unformat_ip4_address, &address)) - address_set = 1; - else if (unformat (line_input, "del")) - enable_disable = 0; + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; else break; } - if (address_set == 0) + if (sw_if_index_set == 0) { - errmsg ("missing addresses"); + errmsg ("missing sw_if_index or interface name"); return -99; } - M (WANT_IP4_ARP_EVENTS, mp); - mp->enable_disable = enable_disable; - mp->pid = htonl (getpid ()); - mp->address = address.as_u32; + + M (DELETE_VHOST_USER_IF, mp); + + mp->sw_if_index = ntohl (sw_if_index); S (mp); W (ret); return ret; } -static int -api_want_ip6_nd_events (vat_main_t * vam) +static void vl_api_sw_interface_vhost_user_details_t_handler + (vl_api_sw_interface_vhost_user_details_t * mp) { - unformat_input_t *line_input = vam->input; - vl_api_want_ip6_nd_events_t *mp; - ip6_address_t address; - int address_set = 0; - u32 enable_disable = 1; - int ret; + vat_main_t *vam = &vat_main; - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "address %U", unformat_ip6_address, &address)) - address_set = 1; - else if (unformat (line_input, "del")) - enable_disable = 0; - else - break; - } + print (vam->ofp, "%-25s %3" PRIu32 " %6" PRIu32 " %8x %6d %7d %s", + (char *) mp->interface_name, + ntohl (mp->sw_if_index), ntohl (mp->virtio_net_hdr_sz), + clib_net_to_host_u64 (mp->features), mp->is_server, + ntohl (mp->num_regions), (char *) mp->sock_filename); + print (vam->ofp, " Status: '%s'", strerror (ntohl (mp->sock_errno))); +} - if (address_set == 0) +static void vl_api_sw_interface_vhost_user_details_t_handler_json + (vl_api_sw_interface_vhost_user_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + + if (VAT_JSON_ARRAY != vam->json_tree.type) { - errmsg ("missing addresses"); - return -99; + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); } + node = vat_json_array_add (&vam->json_tree); - M (WANT_IP6_ND_EVENTS, mp); - mp->enable_disable = enable_disable; - mp->pid = htonl (getpid ()); - clib_memcpy (mp->address, &address, sizeof (ip6_address_t)); - - S (mp); - W (ret); - return ret; + vat_json_init_object (node); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_string_copy (node, "interface_name", + mp->interface_name); + vat_json_object_add_uint (node, "virtio_net_hdr_sz", + ntohl (mp->virtio_net_hdr_sz)); + vat_json_object_add_uint (node, "features", + clib_net_to_host_u64 (mp->features)); + vat_json_object_add_uint (node, "is_server", mp->is_server); + vat_json_object_add_string_copy (node, "sock_filename", mp->sock_filename); + vat_json_object_add_uint (node, "num_regions", ntohl (mp->num_regions)); + vat_json_object_add_uint (node, "sock_errno", ntohl (mp->sock_errno)); } static int -api_want_l2_macs_events (vat_main_t * vam) +api_sw_interface_vhost_user_dump (vat_main_t * vam) { - unformat_input_t *line_input = vam->input; - vl_api_want_l2_macs_events_t *mp; - u8 enable_disable = 1; - u32 scan_delay = 0; - u32 max_macs_in_event = 0; - u32 learn_limit = 0; + vl_api_sw_interface_vhost_user_dump_t *mp; + vl_api_control_ping_t *mp_ping; int ret; + print (vam->ofp, + "Interface name idx hdr_sz features server regions filename"); - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "learn-limit %d", &learn_limit)) - ; - else if (unformat (line_input, "scan-delay %d", &scan_delay)) - ; - else if (unformat (line_input, "max-entries %d", &max_macs_in_event)) - ; - else if (unformat (line_input, "disable")) - enable_disable = 0; - else - break; - } - - M (WANT_L2_MACS_EVENTS, mp); - mp->enable_disable = enable_disable; - mp->pid = htonl (getpid ()); - mp->learn_limit = htonl (learn_limit); - mp->scan_delay = (u8) scan_delay; - mp->max_macs_in_event = (u8) (max_macs_in_event / 10); + /* Get list of vhost-user interfaces */ + M (SW_INTERFACE_VHOST_USER_DUMP, mp); S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } static int -api_input_acl_set_interface (vat_main_t * vam) +api_show_version (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_input_acl_set_interface_t *mp; - u32 sw_if_index; - int sw_if_index_set; - u32 ip4_table_index = ~0; - u32 ip6_table_index = ~0; - u32 l2_table_index = ~0; - u8 is_add = 1; + vl_api_show_version_t *mp; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "ip4-table %d", &ip4_table_index)) - ; - else if (unformat (i, "ip6-table %d", &ip6_table_index)) - ; - else if (unformat (i, "l2-table %d", &l2_table_index)) - ; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index_set == 0) - { - errmsg ("missing interface name or sw_if_index"); - return -99; - } - - M (INPUT_ACL_SET_INTERFACE, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->ip4_table_index = ntohl (ip4_table_index); - mp->ip6_table_index = ntohl (ip6_table_index); - mp->l2_table_index = ntohl (l2_table_index); - mp->is_add = is_add; + M (SHOW_VERSION, mp); S (mp); W (ret); return ret; } + static int -api_output_acl_set_interface (vat_main_t * vam) +api_vxlan_gpe_add_del_tunnel (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_output_acl_set_interface_t *mp; - u32 sw_if_index; - int sw_if_index_set; - u32 ip4_table_index = ~0; - u32 ip6_table_index = ~0; - u32 l2_table_index = ~0; + unformat_input_t *line_input = vam->input; + vl_api_vxlan_gpe_add_del_tunnel_t *mp; + ip4_address_t local4, remote4; + ip6_address_t local6, remote6; u8 is_add = 1; + u8 ipv4_set = 0, ipv6_set = 0; + u8 local_set = 0; + u8 remote_set = 0; + u8 grp_set = 0; + u32 mcast_sw_if_index = ~0; + u32 encap_vrf_id = 0; + u32 decap_vrf_id = 0; + u8 protocol = ~0; + u32 vni; + u8 vni_set = 0; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + /* Can't "universally zero init" (={0}) due to GCC bug 53119 */ + clib_memset (&local4, 0, sizeof local4); + clib_memset (&remote4, 0, sizeof remote4); + clib_memset (&local6, 0, sizeof local6); + clib_memset (&remote6, 0, sizeof remote6); + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "del")) + if (unformat (line_input, "del")) is_add = 0; - else if (unformat (i, "ip4-table %d", &ip4_table_index)) + else if (unformat (line_input, "local %U", + unformat_ip4_address, &local4)) + { + local_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "remote %U", + unformat_ip4_address, &remote4)) + { + remote_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "local %U", + unformat_ip6_address, &local6)) + { + local_set = 1; + ipv6_set = 1; + } + else if (unformat (line_input, "remote %U", + unformat_ip6_address, &remote6)) + { + remote_set = 1; + ipv6_set = 1; + } + else if (unformat (line_input, "group %U %U", + unformat_ip4_address, &remote4, + api_unformat_sw_if_index, vam, &mcast_sw_if_index)) + { + grp_set = remote_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "group %U", + unformat_ip4_address, &remote4)) + { + grp_set = remote_set = 1; + ipv4_set = 1; + } + else if (unformat (line_input, "group %U %U", + unformat_ip6_address, &remote6, + api_unformat_sw_if_index, vam, &mcast_sw_if_index)) + { + grp_set = remote_set = 1; + ipv6_set = 1; + } + else if (unformat (line_input, "group %U", + unformat_ip6_address, &remote6)) + { + grp_set = remote_set = 1; + ipv6_set = 1; + } + else + if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index)) ; - else if (unformat (i, "ip6-table %d", &ip6_table_index)) + else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id)) ; - else if (unformat (i, "l2-table %d", &l2_table_index)) + else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id)) ; + else if (unformat (line_input, "vni %d", &vni)) + vni_set = 1; + else if (unformat (line_input, "next-ip4")) + protocol = 1; + else if (unformat (line_input, "next-ip6")) + protocol = 2; + else if (unformat (line_input, "next-ethernet")) + protocol = 3; + else if (unformat (line_input, "next-nsh")) + protocol = 4; else { - clib_warning ("parse error '%U'", format_unformat_error, i); + errmsg ("parse error '%U'", format_unformat_error, line_input); return -99; } } - if (sw_if_index_set == 0) + if (local_set == 0) { - errmsg ("missing interface name or sw_if_index"); + errmsg ("tunnel local address not specified"); return -99; } - - M (OUTPUT_ACL_SET_INTERFACE, mp); - - mp->sw_if_index = ntohl (sw_if_index); - mp->ip4_table_index = ntohl (ip4_table_index); - mp->ip6_table_index = ntohl (ip6_table_index); - mp->l2_table_index = ntohl (l2_table_index); - mp->is_add = is_add; - - S (mp); - W (ret); - return ret; -} - -static int -api_ip_address_dump (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_ip_address_dump_t *mp; - vl_api_control_ping_t *mp_ping; - u32 sw_if_index = ~0; - u8 sw_if_index_set = 0; - u8 ipv4_set = 0; - u8 ipv6_set = 0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (remote_set == 0) { - if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "ipv4")) - ipv4_set = 1; - else if (unformat (i, "ipv6")) - ipv6_set = 1; - else - break; + errmsg ("tunnel remote address not specified"); + return -99; } - - if (ipv4_set && ipv6_set) + if (grp_set && mcast_sw_if_index == ~0) { - errmsg ("ipv4 and ipv6 flags cannot be both set"); + errmsg ("tunnel nonexistent multicast device"); return -99; } - - if ((!ipv4_set) && (!ipv6_set)) + if (ipv4_set && ipv6_set) { - errmsg ("no ipv4 nor ipv6 flag set"); + errmsg ("both IPv4 and IPv6 addresses specified"); return -99; } - if (sw_if_index_set == 0) + if (vni_set == 0) { - errmsg ("missing interface name or sw_if_index"); + errmsg ("vni not specified"); return -99; } - vam->current_sw_if_index = sw_if_index; - vam->is_ipv6 = ipv6_set; - - M (IP_ADDRESS_DUMP, mp); - mp->sw_if_index = ntohl (sw_if_index); - mp->is_ipv6 = ipv6_set; - S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - - W (ret); - return ret; -} - -static int -api_ip_dump (vat_main_t * vam) -{ - vl_api_ip_dump_t *mp; - vl_api_control_ping_t *mp_ping; - unformat_input_t *in = vam->input; - int ipv4_set = 0; - int ipv6_set = 0; - int is_ipv6; - int i; - int ret; - - while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT) - { - if (unformat (in, "ipv4")) - ipv4_set = 1; - else if (unformat (in, "ipv6")) - ipv6_set = 1; - else - break; - } + M (VXLAN_GPE_ADD_DEL_TUNNEL, mp); - if (ipv4_set && ipv6_set) - { - errmsg ("ipv4 and ipv6 flags cannot be both set"); - return -99; - } - if ((!ipv4_set) && (!ipv6_set)) + if (ipv6_set) { - errmsg ("no ipv4 nor ipv6 flag set"); - return -99; + clib_memcpy (&mp->local, &local6, sizeof (local6)); + clib_memcpy (&mp->remote, &remote6, sizeof (remote6)); } - - is_ipv6 = ipv6_set; - vam->is_ipv6 = is_ipv6; - - /* free old data */ - for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++) + else { - vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr); + clib_memcpy (&mp->local, &local4, sizeof (local4)); + clib_memcpy (&mp->remote, &remote4, sizeof (remote4)); } - vec_free (vam->ip_details_by_sw_if_index[is_ipv6]); - M (IP_DUMP, mp); + mp->mcast_sw_if_index = ntohl (mcast_sw_if_index); + mp->encap_vrf_id = ntohl (encap_vrf_id); + mp->decap_vrf_id = ntohl (decap_vrf_id); + mp->protocol = protocol; + mp->vni = ntohl (vni); + mp->is_add = is_add; mp->is_ipv6 = ipv6_set; - S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); + S (mp); W (ret); return ret; } -static int -api_ipsec_spd_add_del (vat_main_t * vam) +static void vl_api_vxlan_gpe_tunnel_details_t_handler + (vl_api_vxlan_gpe_tunnel_details_t * mp) { - unformat_input_t *i = vam->input; - vl_api_ipsec_spd_add_del_t *mp; - u32 spd_id = ~0; - u8 is_add = 1; - int ret; + vat_main_t *vam = &vat_main; + ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local); + ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d", + ntohl (mp->sw_if_index), + format_ip46_address, &local, IP46_TYPE_ANY, + format_ip46_address, &remote, IP46_TYPE_ANY, + ntohl (mp->vni), mp->protocol, + ntohl (mp->mcast_sw_if_index), + ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id)); +} + + +static void vl_api_vxlan_gpe_tunnel_details_t_handler_json + (vl_api_vxlan_gpe_tunnel_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + struct in_addr ip4; + struct in6_addr ip6; + + if (VAT_JSON_ARRAY != vam->json_tree.type) { - if (unformat (i, "spd_id %d", &spd_id)) - ; - else if (unformat (i, "del")) - is_add = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); } - if (spd_id == ~0) + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + if (mp->is_ipv6) { - errmsg ("spd_id must be set"); - return -99; + clib_memcpy (&ip6, &(mp->local[0]), sizeof (ip6)); + vat_json_object_add_ip6 (node, "local", ip6); + clib_memcpy (&ip6, &(mp->remote[0]), sizeof (ip6)); + vat_json_object_add_ip6 (node, "remote", ip6); } - - M (IPSEC_SPD_ADD_DEL, mp); - - mp->spd_id = ntohl (spd_id); - mp->is_add = is_add; - - S (mp); - W (ret); - return ret; + else + { + clib_memcpy (&ip4, &(mp->local[0]), sizeof (ip4)); + vat_json_object_add_ip4 (node, "local", ip4); + clib_memcpy (&ip4, &(mp->remote[0]), sizeof (ip4)); + vat_json_object_add_ip4 (node, "remote", ip4); + } + vat_json_object_add_uint (node, "vni", ntohl (mp->vni)); + vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol)); + vat_json_object_add_uint (node, "mcast_sw_if_index", + ntohl (mp->mcast_sw_if_index)); + vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id)); + vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id)); + vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0); } static int -api_ipsec_interface_add_del_spd (vat_main_t * vam) +api_vxlan_gpe_tunnel_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ipsec_interface_add_del_spd_t *mp; + vl_api_vxlan_gpe_tunnel_dump_t *mp; + vl_api_control_ping_t *mp_ping; u32 sw_if_index; u8 sw_if_index_set = 0; - u32 spd_id = (u32) ~ 0; - u8 is_add = 1; int ret; + /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "spd_id %d", &spd_id)) - ; - else - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - sw_if_index_set = 1; - else if (unformat (i, "sw_if_index %d", &sw_if_index)) + if (unformat (i, "sw_if_index %d", &sw_if_index)) sw_if_index_set = 1; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - + break; } - if (spd_id == (u32) ~ 0) + if (sw_if_index_set == 0) { - errmsg ("spd_id must be set"); - return -99; + sw_if_index = ~0; } - if (sw_if_index_set == 0) + if (!vam->json_output) { - errmsg ("missing interface name or sw_if_index"); - return -99; + print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s", + "sw_if_index", "local", "remote", "vni", + "protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id"); } - M (IPSEC_INTERFACE_ADD_DEL_SPD, mp); + /* Get list of vxlan-tunnel interfaces */ + M (VXLAN_GPE_TUNNEL_DUMP, mp); - mp->spd_id = ntohl (spd_id); - mp->sw_if_index = ntohl (sw_if_index); - mp->is_add = is_add; + mp->sw_if_index = htonl (sw_if_index); S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } +static void vl_api_l2_fib_table_details_t_handler + (vl_api_l2_fib_table_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + print (vam->ofp, "%3" PRIu32 " %U %3" PRIu32 + " %d %d %d", + ntohl (mp->bd_id), format_ethernet_address, mp->mac, + ntohl (mp->sw_if_index), mp->static_mac, mp->filter_mac, + mp->bvi_mac); +} + +static void vl_api_l2_fib_table_details_t_handler_json + (vl_api_l2_fib_table_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + + if (VAT_JSON_ARRAY != vam->json_tree.type) + { + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); + } + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + vat_json_object_add_uint (node, "bd_id", ntohl (mp->bd_id)); + vat_json_object_add_bytes (node, "mac", mp->mac, 6); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_uint (node, "static_mac", mp->static_mac); + vat_json_object_add_uint (node, "filter_mac", mp->filter_mac); + vat_json_object_add_uint (node, "bvi_mac", mp->bvi_mac); +} + static int -api_ipsec_spd_add_del_entry (vat_main_t * vam) +api_l2_fib_table_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ipsec_spd_add_del_entry_t *mp; - u8 is_add = 1, is_outbound = 0, is_ipv6 = 0, is_ip_any = 1; - u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0; - i32 priority = 0; - u32 rport_start = 0, rport_stop = (u32) ~ 0; - u32 lport_start = 0, lport_stop = (u32) ~ 0; - ip4_address_t laddr4_start, laddr4_stop, raddr4_start, raddr4_stop; - ip6_address_t laddr6_start, laddr6_stop, raddr6_start, raddr6_stop; + vl_api_l2_fib_table_dump_t *mp; + vl_api_control_ping_t *mp_ping; + u32 bd_id; + u8 bd_id_set = 0; int ret; - laddr4_start.as_u32 = raddr4_start.as_u32 = 0; - laddr4_stop.as_u32 = raddr4_stop.as_u32 = (u32) ~ 0; - laddr6_start.as_u64[0] = raddr6_start.as_u64[0] = 0; - laddr6_start.as_u64[1] = raddr6_start.as_u64[1] = 0; - laddr6_stop.as_u64[0] = raddr6_stop.as_u64[0] = (u64) ~ 0; - laddr6_stop.as_u64[1] = raddr6_stop.as_u64[1] = (u64) ~ 0; - + /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - if (unformat (i, "outbound")) - is_outbound = 1; - if (unformat (i, "inbound")) - is_outbound = 0; - else if (unformat (i, "spd_id %d", &spd_id)) - ; - else if (unformat (i, "sa_id %d", &sa_id)) - ; - else if (unformat (i, "priority %d", &priority)) - ; - else if (unformat (i, "protocol %d", &protocol)) - ; - else if (unformat (i, "lport_start %d", &lport_start)) - ; - else if (unformat (i, "lport_stop %d", &lport_stop)) - ; - else if (unformat (i, "rport_start %d", &rport_start)) - ; - else if (unformat (i, "rport_stop %d", &rport_stop)) - ; - else - if (unformat - (i, "laddr_start %U", unformat_ip4_address, &laddr4_start)) - { - is_ipv6 = 0; - is_ip_any = 0; - } - else - if (unformat (i, "laddr_stop %U", unformat_ip4_address, &laddr4_stop)) - { - is_ipv6 = 0; - is_ip_any = 0; - } - else - if (unformat - (i, "raddr_start %U", unformat_ip4_address, &raddr4_start)) - { - is_ipv6 = 0; - is_ip_any = 0; - } - else - if (unformat (i, "raddr_stop %U", unformat_ip4_address, &raddr4_stop)) - { - is_ipv6 = 0; - is_ip_any = 0; - } - else - if (unformat - (i, "laddr_start %U", unformat_ip6_address, &laddr6_start)) - { - is_ipv6 = 1; - is_ip_any = 0; - } - else - if (unformat (i, "laddr_stop %U", unformat_ip6_address, &laddr6_stop)) - { - is_ipv6 = 1; - is_ip_any = 0; - } - else - if (unformat - (i, "raddr_start %U", unformat_ip6_address, &raddr6_start)) - { - is_ipv6 = 1; - is_ip_any = 0; - } - else - if (unformat (i, "raddr_stop %U", unformat_ip6_address, &raddr6_stop)) - { - is_ipv6 = 1; - is_ip_any = 0; - } - else - if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy)) - { - if (policy == IPSEC_POLICY_ACTION_RESOLVE) - { - clib_warning ("unsupported action: 'resolve'"); - return -99; - } - } + if (unformat (i, "bd_id %d", &bd_id)) + bd_id_set = 1; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; + } + if (bd_id_set == 0) + { + errmsg ("missing bridge domain"); + return -99; } - M (IPSEC_SPD_ADD_DEL_ENTRY, mp); + print (vam->ofp, "BD-ID Mac Address sw-ndx Static Filter BVI"); - mp->spd_id = ntohl (spd_id); - mp->priority = ntohl (priority); - mp->is_outbound = is_outbound; + /* Get list of l2 fib entries */ + M (L2_FIB_TABLE_DUMP, mp); - mp->is_ipv6 = is_ipv6; - if (is_ipv6 || is_ip_any) - { - clib_memcpy (mp->remote_address_start, &raddr6_start, - sizeof (ip6_address_t)); - clib_memcpy (mp->remote_address_stop, &raddr6_stop, - sizeof (ip6_address_t)); - clib_memcpy (mp->local_address_start, &laddr6_start, - sizeof (ip6_address_t)); - clib_memcpy (mp->local_address_stop, &laddr6_stop, - sizeof (ip6_address_t)); - } - else - { - clib_memcpy (mp->remote_address_start, &raddr4_start, - sizeof (ip4_address_t)); - clib_memcpy (mp->remote_address_stop, &raddr4_stop, - sizeof (ip4_address_t)); - clib_memcpy (mp->local_address_start, &laddr4_start, - sizeof (ip4_address_t)); - clib_memcpy (mp->local_address_stop, &laddr4_stop, - sizeof (ip4_address_t)); - } - mp->protocol = (u8) protocol; - mp->local_port_start = ntohs ((u16) lport_start); - mp->local_port_stop = ntohs ((u16) lport_stop); - mp->remote_port_start = ntohs ((u16) rport_start); - mp->remote_port_stop = ntohs ((u16) rport_stop); - mp->policy = (u8) policy; - mp->sa_id = ntohl (sa_id); - mp->is_add = is_add; - mp->is_ip_any = is_ip_any; + mp->bd_id = ntohl (bd_id); S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } + static int -api_ipsec_sad_add_del_entry (vat_main_t * vam) +api_interface_name_renumber (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ipsec_sad_add_del_entry_t *mp; - u32 sad_id = 0, spi = 0; - u8 *ck = 0, *ik = 0; - u8 is_add = 1; - - u8 protocol = IPSEC_PROTOCOL_AH; - u8 is_tunnel = 0, is_tunnel_ipv6 = 0; - u32 crypto_alg = 0, integ_alg = 0; - ip4_address_t tun_src4; - ip4_address_t tun_dst4; - ip6_address_t tun_src6; - ip6_address_t tun_dst6; + unformat_input_t *line_input = vam->input; + vl_api_interface_name_renumber_t *mp; + u32 sw_if_index = ~0; + u32 new_show_dev_instance = ~0; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "sad_id %d", &sad_id)) - ; - else if (unformat (i, "spi %d", &spi)) + if (unformat (line_input, "%U", api_unformat_sw_if_index, vam, + &sw_if_index)) ; - else if (unformat (i, "esp")) - protocol = IPSEC_PROTOCOL_ESP; - else if (unformat (i, "tunnel_src %U", unformat_ip4_address, &tun_src4)) - { - is_tunnel = 1; - is_tunnel_ipv6 = 0; - } - else if (unformat (i, "tunnel_dst %U", unformat_ip4_address, &tun_dst4)) - { - is_tunnel = 1; - is_tunnel_ipv6 = 0; - } - else if (unformat (i, "tunnel_src %U", unformat_ip6_address, &tun_src6)) - { - is_tunnel = 1; - is_tunnel_ipv6 = 1; - } - else if (unformat (i, "tunnel_dst %U", unformat_ip6_address, &tun_dst6)) - { - is_tunnel = 1; - is_tunnel_ipv6 = 1; - } - else - if (unformat - (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg)) - { - if (crypto_alg >= IPSEC_CRYPTO_N_ALG) - { - clib_warning ("unsupported crypto-alg: '%U'", - format_ipsec_crypto_alg, crypto_alg); - return -99; - } - } - else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck)) + else if (unformat (line_input, "sw_if_index %d", &sw_if_index)) ; - else - if (unformat - (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg)) - { - if (integ_alg >= IPSEC_INTEG_N_ALG) - { - clib_warning ("unsupported integ-alg: '%U'", - format_ipsec_integ_alg, integ_alg); - return -99; - } - } - else if (unformat (i, "integ_key %U", unformat_hex_string, &ik)) + else if (unformat (line_input, "new_show_dev_instance %d", + &new_show_dev_instance)) ; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - + break; } - M (IPSEC_SAD_ADD_DEL_ENTRY, mp); - - mp->sad_id = ntohl (sad_id); - mp->is_add = is_add; - mp->protocol = protocol; - mp->spi = ntohl (spi); - mp->is_tunnel = is_tunnel; - mp->is_tunnel_ipv6 = is_tunnel_ipv6; - mp->crypto_algorithm = crypto_alg; - mp->integrity_algorithm = integ_alg; - mp->crypto_key_length = vec_len (ck); - mp->integrity_key_length = vec_len (ik); - - if (mp->crypto_key_length > sizeof (mp->crypto_key)) - mp->crypto_key_length = sizeof (mp->crypto_key); - - if (mp->integrity_key_length > sizeof (mp->integrity_key)) - mp->integrity_key_length = sizeof (mp->integrity_key); - - if (ck) - clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length); - if (ik) - clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length); - - if (is_tunnel) + if (sw_if_index == ~0) { - if (is_tunnel_ipv6) - { - clib_memcpy (mp->tunnel_src_address, &tun_src6, - sizeof (ip6_address_t)); - clib_memcpy (mp->tunnel_dst_address, &tun_dst6, - sizeof (ip6_address_t)); - } - else - { - clib_memcpy (mp->tunnel_src_address, &tun_src4, - sizeof (ip4_address_t)); - clib_memcpy (mp->tunnel_dst_address, &tun_dst4, - sizeof (ip4_address_t)); - } + errmsg ("missing interface name or sw_if_index"); + return -99; + } + + if (new_show_dev_instance == ~0) + { + errmsg ("missing new_show_dev_instance"); + return -99; } + M (INTERFACE_NAME_RENUMBER, mp); + + mp->sw_if_index = ntohl (sw_if_index); + mp->new_show_dev_instance = ntohl (new_show_dev_instance); + S (mp); W (ret); return ret; } static int -api_ipsec_sa_set_key (vat_main_t * vam) +api_ip_probe_neighbor (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ipsec_sa_set_key_t *mp; - u32 sa_id; - u8 *ck = 0, *ik = 0; + vl_api_ip_probe_neighbor_t *mp; + vl_api_address_t dst_adr = { }; + u8 int_set = 0; + u8 adr_set = 0; + u32 sw_if_index; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "sa_id %d", &sa_id)) - ; - else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck)) - ; - else if (unformat (i, "integ_key %U", unformat_hex_string, &ik)) - ; + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + int_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + int_set = 1; + else if (unformat (i, "address %U", unformat_vl_api_address, &dst_adr)) + adr_set = 1; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; } - M (IPSEC_SA_SET_KEY, mp); - - mp->sa_id = ntohl (sa_id); - mp->crypto_key_length = vec_len (ck); - mp->integrity_key_length = vec_len (ik); + if (int_set == 0) + { + errmsg ("missing interface"); + return -99; + } - if (mp->crypto_key_length > sizeof (mp->crypto_key)) - mp->crypto_key_length = sizeof (mp->crypto_key); + if (adr_set == 0) + { + errmsg ("missing addresses"); + return -99; + } - if (mp->integrity_key_length > sizeof (mp->integrity_key)) - mp->integrity_key_length = sizeof (mp->integrity_key); + M (IP_PROBE_NEIGHBOR, mp); - if (ck) - clib_memcpy (mp->crypto_key, ck, mp->crypto_key_length); - if (ik) - clib_memcpy (mp->integrity_key, ik, mp->integrity_key_length); + mp->sw_if_index = ntohl (sw_if_index); + clib_memcpy (&mp->dst, &dst_adr, sizeof (dst_adr)); S (mp); W (ret); @@ -15762,421 +13535,233 @@ api_ipsec_sa_set_key (vat_main_t * vam) } static int -api_ipsec_tunnel_if_add_del (vat_main_t * vam) +api_ip_scan_neighbor_enable_disable (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ipsec_tunnel_if_add_del_t *mp; - u32 local_spi = 0, remote_spi = 0; - u32 crypto_alg = 0, integ_alg = 0; - u8 *lck = NULL, *rck = NULL; - u8 *lik = NULL, *rik = NULL; - ip4_address_t local_ip = { {0} }; - ip4_address_t remote_ip = { {0} }; - u8 is_add = 1; - u8 esn = 0; - u8 anti_replay = 0; - u8 renumber = 0; - u32 instance = ~0; + vl_api_ip_scan_neighbor_enable_disable_t *mp; + u8 mode = IP_SCAN_V46_NEIGHBORS; + u32 interval = 0, time = 0, update = 0, delay = 0, stale = 0; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) - is_add = 0; - else if (unformat (i, "esn")) - esn = 1; - else if (unformat (i, "anti_replay")) - anti_replay = 1; - else if (unformat (i, "local_spi %d", &local_spi)) - ; - else if (unformat (i, "remote_spi %d", &remote_spi)) - ; - else if (unformat (i, "local_ip %U", unformat_ip4_address, &local_ip)) - ; - else if (unformat (i, "remote_ip %U", unformat_ip4_address, &remote_ip)) + if (unformat (i, "ip4")) + mode = IP_SCAN_V4_NEIGHBORS; + else if (unformat (i, "ip6")) + mode = IP_SCAN_V6_NEIGHBORS; + if (unformat (i, "both")) + mode = IP_SCAN_V46_NEIGHBORS; + else if (unformat (i, "disable")) + mode = IP_SCAN_DISABLED; + else if (unformat (i, "interval %d", &interval)) ; - else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck)) + else if (unformat (i, "max-time %d", &time)) ; - else - if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck)) + else if (unformat (i, "max-update %d", &update)) ; - else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik)) + else if (unformat (i, "delay %d", &delay)) ; - else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik)) + else if (unformat (i, "stale %d", &stale)) ; else - if (unformat - (i, "crypto_alg %U", unformat_ipsec_crypto_alg, &crypto_alg)) - { - if (crypto_alg >= IPSEC_CRYPTO_N_ALG) - { - errmsg ("unsupported crypto-alg: '%U'\n", - format_ipsec_crypto_alg, crypto_alg); - return -99; - } - } - else - if (unformat - (i, "integ_alg %U", unformat_ipsec_integ_alg, &integ_alg)) - { - if (integ_alg >= IPSEC_INTEG_N_ALG) - { - errmsg ("unsupported integ-alg: '%U'\n", - format_ipsec_integ_alg, integ_alg); - return -99; - } - } - else if (unformat (i, "instance %u", &instance)) - renumber = 1; - else - { - errmsg ("parse error '%U'\n", format_unformat_error, i); - return -99; - } + break; } - M (IPSEC_TUNNEL_IF_ADD_DEL, mp); - - mp->is_add = is_add; - mp->esn = esn; - mp->anti_replay = anti_replay; - - clib_memcpy (mp->local_ip, &local_ip, sizeof (ip4_address_t)); - clib_memcpy (mp->remote_ip, &remote_ip, sizeof (ip4_address_t)); - - mp->local_spi = htonl (local_spi); - mp->remote_spi = htonl (remote_spi); - mp->crypto_alg = (u8) crypto_alg; - - mp->local_crypto_key_len = 0; - if (lck) + if (interval > 255) { - mp->local_crypto_key_len = vec_len (lck); - if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key)) - mp->local_crypto_key_len = sizeof (mp->local_crypto_key); - clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len); + errmsg ("interval cannot exceed 255 minutes."); + return -99; } - - mp->remote_crypto_key_len = 0; - if (rck) + if (time > 255) { - mp->remote_crypto_key_len = vec_len (rck); - if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key)) - mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key); - clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len); + errmsg ("max-time cannot exceed 255 usec."); + return -99; } - - mp->integ_alg = (u8) integ_alg; - - mp->local_integ_key_len = 0; - if (lik) + if (update > 255) { - mp->local_integ_key_len = vec_len (lik); - if (mp->local_integ_key_len > sizeof (mp->local_integ_key)) - mp->local_integ_key_len = sizeof (mp->local_integ_key); - clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len); + errmsg ("max-update cannot exceed 255."); + return -99; } - - mp->remote_integ_key_len = 0; - if (rik) + if (delay > 255) { - mp->remote_integ_key_len = vec_len (rik); - if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key)) - mp->remote_integ_key_len = sizeof (mp->remote_integ_key); - clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len); + errmsg ("delay cannot exceed 255 msec."); + return -99; } - - if (renumber) + if (stale > 255) { - mp->renumber = renumber; - mp->show_instance = ntohl (instance); + errmsg ("stale cannot exceed 255 minutes."); + return -99; } + M (IP_SCAN_NEIGHBOR_ENABLE_DISABLE, mp); + mp->mode = mode; + mp->scan_interval = interval; + mp->max_proc_time = time; + mp->max_update = update; + mp->scan_int_delay = delay; + mp->stale_threshold = stale; + S (mp); W (ret); return ret; } -static void -vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp) -{ - vat_main_t *vam = &vat_main; - - print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u " - "crypto_key %U integ_alg %u integ_key %U use_esn %u " - "use_anti_replay %u is_tunnel %u is_tunnel_ip6 %u " - "tunnel_src_addr %U tunnel_dst_addr %U " - "salt %u seq_outbound %lu last_seq_inbound %lu " - "replay_window %lu total_data_size %lu\n", - ntohl (mp->sa_id), ntohl (mp->sw_if_index), ntohl (mp->spi), - mp->protocol, - mp->crypto_alg, format_hex_bytes, mp->crypto_key, mp->crypto_key_len, - mp->integ_alg, format_hex_bytes, mp->integ_key, mp->integ_key_len, - mp->use_esn, mp->use_anti_replay, mp->is_tunnel, mp->is_tunnel_ip6, - (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address, - mp->tunnel_src_addr, - (mp->is_tunnel_ip6) ? format_ip6_address : format_ip4_address, - mp->tunnel_dst_addr, - ntohl (mp->salt), - clib_net_to_host_u64 (mp->seq_outbound), - clib_net_to_host_u64 (mp->last_seq_inbound), - clib_net_to_host_u64 (mp->replay_window), - clib_net_to_host_u64 (mp->total_data_size)); -} - -#define vl_api_ipsec_sa_details_t_endian vl_noop_handler -#define vl_api_ipsec_sa_details_t_print vl_noop_handler - -static void vl_api_ipsec_sa_details_t_handler_json - (vl_api_ipsec_sa_details_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; - struct in_addr src_ip4, dst_ip4; - struct in6_addr src_ip6, dst_ip6; - - if (VAT_JSON_ARRAY != vam->json_tree.type) - { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); - } - node = vat_json_array_add (&vam->json_tree); - - vat_json_init_object (node); - vat_json_object_add_uint (node, "sa_id", ntohl (mp->sa_id)); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - vat_json_object_add_uint (node, "spi", ntohl (mp->spi)); - vat_json_object_add_uint (node, "proto", mp->protocol); - vat_json_object_add_uint (node, "crypto_alg", mp->crypto_alg); - vat_json_object_add_uint (node, "integ_alg", mp->integ_alg); - vat_json_object_add_uint (node, "use_esn", mp->use_esn); - vat_json_object_add_uint (node, "use_anti_replay", mp->use_anti_replay); - vat_json_object_add_uint (node, "is_tunnel", mp->is_tunnel); - vat_json_object_add_uint (node, "is_tunnel_ip6", mp->is_tunnel_ip6); - vat_json_object_add_bytes (node, "crypto_key", mp->crypto_key, - mp->crypto_key_len); - vat_json_object_add_bytes (node, "integ_key", mp->integ_key, - mp->integ_key_len); - if (mp->is_tunnel_ip6) - { - clib_memcpy (&src_ip6, mp->tunnel_src_addr, sizeof (src_ip6)); - vat_json_object_add_ip6 (node, "tunnel_src_addr", src_ip6); - clib_memcpy (&dst_ip6, mp->tunnel_dst_addr, sizeof (dst_ip6)); - vat_json_object_add_ip6 (node, "tunnel_dst_addr", dst_ip6); - } - else - { - clib_memcpy (&src_ip4, mp->tunnel_src_addr, sizeof (src_ip4)); - vat_json_object_add_ip4 (node, "tunnel_src_addr", src_ip4); - clib_memcpy (&dst_ip4, mp->tunnel_dst_addr, sizeof (dst_ip4)); - vat_json_object_add_ip4 (node, "tunnel_dst_addr", dst_ip4); - } - vat_json_object_add_uint (node, "replay_window", - clib_net_to_host_u64 (mp->replay_window)); - vat_json_object_add_uint (node, "total_data_size", - clib_net_to_host_u64 (mp->total_data_size)); - -} - static int -api_ipsec_sa_dump (vat_main_t * vam) +api_want_ip4_arp_events (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ipsec_sa_dump_t *mp; - vl_api_control_ping_t *mp_ping; - u32 sa_id = ~0; + unformat_input_t *line_input = vam->input; + vl_api_want_ip4_arp_events_t *mp; + ip4_address_t address; + int address_set = 0; + u32 enable_disable = 1; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "sa_id %d", &sa_id)) - ; + if (unformat (line_input, "address %U", unformat_ip4_address, &address)) + address_set = 1; + else if (unformat (line_input, "del")) + enable_disable = 0; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; } - M (IPSEC_SA_DUMP, mp); + if (address_set == 0) + { + errmsg ("missing addresses"); + return -99; + } - mp->sa_id = ntohl (sa_id); + M (WANT_IP4_ARP_EVENTS, mp); + mp->enable_disable = enable_disable; + mp->pid = htonl (getpid ()); + clib_memcpy (mp->ip, &address, sizeof (address)); S (mp); - - /* Use a control ping for synchronization */ - M (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } -static int -api_ipsec_tunnel_if_set_key (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_ipsec_tunnel_if_set_key_t *mp; - u32 sw_if_index = ~0; - u8 key_type = IPSEC_IF_SET_KEY_TYPE_NONE; - u8 *key = 0; - u32 alg = ~0; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) - ; - else - if (unformat (i, "local crypto %U", unformat_ipsec_crypto_alg, &alg)) - key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_CRYPTO; - else - if (unformat (i, "remote crypto %U", unformat_ipsec_crypto_alg, &alg)) - key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_CRYPTO; - else if (unformat (i, "local integ %U", unformat_ipsec_integ_alg, &alg)) - key_type = IPSEC_IF_SET_KEY_TYPE_LOCAL_INTEG; - else - if (unformat (i, "remote integ %U", unformat_ipsec_integ_alg, &alg)) - key_type = IPSEC_IF_SET_KEY_TYPE_REMOTE_INTEG; - else if (unformat (i, "%U", unformat_hex_string, &key)) - ; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index == ~0) - { - errmsg ("interface must be specified"); - return -99; - } - - if (key_type == IPSEC_IF_SET_KEY_TYPE_NONE) - { - errmsg ("key type must be specified"); - return -99; - } +static int +api_want_ip6_nd_events (vat_main_t * vam) +{ + unformat_input_t *line_input = vam->input; + vl_api_want_ip6_nd_events_t *mp; + vl_api_ip6_address_t address; + int address_set = 0; + u32 enable_disable = 1; + int ret; - if (alg == ~0) + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - errmsg ("algorithm must be specified"); - return -99; + if (unformat + (line_input, "address %U", unformat_vl_api_ip6_address, &address)) + address_set = 1; + else if (unformat (line_input, "del")) + enable_disable = 0; + else + break; } - if (vec_len (key) == 0) + if (address_set == 0) { - errmsg ("key must be specified"); + errmsg ("missing addresses"); return -99; } - M (IPSEC_TUNNEL_IF_SET_KEY, mp); - - mp->sw_if_index = htonl (sw_if_index); - mp->alg = alg; - mp->key_type = key_type; - mp->key_len = vec_len (key); - clib_memcpy (mp->key, key, vec_len (key)); + M (WANT_IP6_ND_EVENTS, mp); + mp->enable_disable = enable_disable; + mp->pid = htonl (getpid ()); + clib_memcpy (&mp->ip, &address, sizeof (address)); S (mp); W (ret); - return ret; } static int -api_ipsec_tunnel_if_set_sa (vat_main_t * vam) +api_want_l2_macs_events (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ipsec_tunnel_if_set_sa_t *mp; - u32 sw_if_index = ~0; - u32 sa_id = ~0; - u8 is_outbound = (u8) ~ 0; + unformat_input_t *line_input = vam->input; + vl_api_want_l2_macs_events_t *mp; + u8 enable_disable = 1; + u32 scan_delay = 0; + u32 max_macs_in_event = 0; + u32 learn_limit = 0; int ret; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + if (unformat (line_input, "learn-limit %d", &learn_limit)) ; - else if (unformat (i, "sa_id %d", &sa_id)) + else if (unformat (line_input, "scan-delay %d", &scan_delay)) ; - else if (unformat (i, "outbound")) - is_outbound = 1; - else if (unformat (i, "inbound")) - is_outbound = 0; + else if (unformat (line_input, "max-entries %d", &max_macs_in_event)) + ; + else if (unformat (line_input, "disable")) + enable_disable = 0; else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (sw_if_index == ~0) - { - errmsg ("interface must be specified"); - return -99; - } - - if (sa_id == ~0) - { - errmsg ("SA ID must be specified"); - return -99; + break; } - M (IPSEC_TUNNEL_IF_SET_SA, mp); - - mp->sw_if_index = htonl (sw_if_index); - mp->sa_id = htonl (sa_id); - mp->is_outbound = is_outbound; - + M (WANT_L2_MACS_EVENTS, mp); + mp->enable_disable = enable_disable; + mp->pid = htonl (getpid ()); + mp->learn_limit = htonl (learn_limit); + mp->scan_delay = (u8) scan_delay; + mp->max_macs_in_event = (u8) (max_macs_in_event / 10); S (mp); W (ret); - return ret; } static int -api_ikev2_profile_add_del (vat_main_t * vam) +api_input_acl_set_interface (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_profile_add_del_t *mp; + vl_api_input_acl_set_interface_t *mp; + u32 sw_if_index; + int sw_if_index_set; + u32 ip4_table_index = ~0; + u32 ip6_table_index = ~0; + u32 l2_table_index = ~0; u8 is_add = 1; - u8 *name = 0; int ret; - const char *valid_chars = "a-zA-Z0-9_"; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "del")) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "del")) is_add = 0; - else if (unformat (i, "name %U", unformat_token, valid_chars, &name)) - vec_add1 (name, 0); + else if (unformat (i, "ip4-table %d", &ip4_table_index)) + ; + else if (unformat (i, "ip6-table %d", &ip6_table_index)) + ; + else if (unformat (i, "l2-table %d", &l2_table_index)) + ; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } } - if (!vec_len (name)) - { - errmsg ("profile name must be specified"); - return -99; - } - - if (vec_len (name) > 64) + if (sw_if_index_set == 0) { - errmsg ("profile name too long"); + errmsg ("missing interface name or sw_if_index"); return -99; } - M (IKEV2_PROFILE_ADD_DEL, mp); + M (INPUT_ACL_SET_INTERFACE, mp); - clib_memcpy (mp->name, name, vec_len (name)); + mp->sw_if_index = ntohl (sw_if_index); + mp->ip4_table_index = ntohl (ip4_table_index); + mp->ip6_table_index = ntohl (ip6_table_index); + mp->l2_table_index = ntohl (l2_table_index); mp->is_add = is_add; - vec_free (name); S (mp); W (ret); @@ -16184,69 +13769,52 @@ api_ikev2_profile_add_del (vat_main_t * vam) } static int -api_ikev2_profile_set_auth (vat_main_t * vam) +api_output_acl_set_interface (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_profile_set_auth_t *mp; - u8 *name = 0; - u8 *data = 0; - u32 auth_method = 0; - u8 is_hex = 0; + vl_api_output_acl_set_interface_t *mp; + u32 sw_if_index; + int sw_if_index_set; + u32 ip4_table_index = ~0; + u32 ip6_table_index = ~0; + u32 l2_table_index = ~0; + u8 is_add = 1; int ret; - const char *valid_chars = "a-zA-Z0-9_"; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "name %U", unformat_token, valid_chars, &name)) - vec_add1 (name, 0); - else if (unformat (i, "auth_method %U", - unformat_ikev2_auth_method, &auth_method)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "ip4-table %d", &ip4_table_index)) + ; + else if (unformat (i, "ip6-table %d", &ip6_table_index)) ; - else if (unformat (i, "auth_data 0x%U", unformat_hex_string, &data)) - is_hex = 1; - else if (unformat (i, "auth_data %v", &data)) + else if (unformat (i, "l2-table %d", &l2_table_index)) ; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } } - if (!vec_len (name)) - { - errmsg ("profile name must be specified"); - return -99; - } - - if (vec_len (name) > 64) - { - errmsg ("profile name too long"); - return -99; - } - - if (!vec_len (data)) - { - errmsg ("auth_data must be specified"); - return -99; - } - - if (!auth_method) + if (sw_if_index_set == 0) { - errmsg ("auth_method must be specified"); + errmsg ("missing interface name or sw_if_index"); return -99; } - M (IKEV2_PROFILE_SET_AUTH, mp); + M (OUTPUT_ACL_SET_INTERFACE, mp); - mp->is_hex = is_hex; - mp->auth_method = (u8) auth_method; - mp->data_len = vec_len (data); - clib_memcpy (mp->name, name, vec_len (name)); - clib_memcpy (mp->data, data, vec_len (data)); - vec_free (name); - vec_free (data); + mp->sw_if_index = ntohl (sw_if_index); + mp->ip4_table_index = ntohl (ip4_table_index); + mp->ip6_table_index = ntohl (ip6_table_index); + mp->l2_table_index = ntohl (l2_table_index); + mp->is_add = is_add; S (mp); W (ret); @@ -16254,189 +13822,153 @@ api_ikev2_profile_set_auth (vat_main_t * vam) } static int -api_ikev2_profile_set_id (vat_main_t * vam) +api_ip_address_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_profile_set_id_t *mp; - u8 *name = 0; - u8 *data = 0; - u8 is_local = 0; - u32 id_type = 0; - ip4_address_t ip4; + vl_api_ip_address_dump_t *mp; + vl_api_control_ping_t *mp_ping; + u32 sw_if_index = ~0; + u8 sw_if_index_set = 0; + u8 ipv4_set = 0; + u8 ipv6_set = 0; int ret; - const char *valid_chars = "a-zA-Z0-9_"; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "name %U", unformat_token, valid_chars, &name)) - vec_add1 (name, 0); - else if (unformat (i, "id_type %U", unformat_ikev2_id_type, &id_type)) - ; - else if (unformat (i, "id_data %U", unformat_ip4_address, &ip4)) - { - data = vec_new (u8, 4); - clib_memcpy (data, ip4.as_u8, 4); - } - else if (unformat (i, "id_data 0x%U", unformat_hex_string, &data)) - ; - else if (unformat (i, "id_data %v", &data)) - ; - else if (unformat (i, "local")) - is_local = 1; - else if (unformat (i, "remote")) - is_local = 0; + if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; else - { - errmsg ("parse error '%U'", format_unformat_error, i); - return -99; - } + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "ipv4")) + ipv4_set = 1; + else if (unformat (i, "ipv6")) + ipv6_set = 1; + else + break; } - if (!vec_len (name)) + if (ipv4_set && ipv6_set) { - errmsg ("profile name must be specified"); + errmsg ("ipv4 and ipv6 flags cannot be both set"); return -99; } - if (vec_len (name) > 64) + if ((!ipv4_set) && (!ipv6_set)) { - errmsg ("profile name too long"); + errmsg ("no ipv4 nor ipv6 flag set"); return -99; } - if (!vec_len (data)) + if (sw_if_index_set == 0) { - errmsg ("id_data must be specified"); + errmsg ("missing interface name or sw_if_index"); return -99; } - if (!id_type) - { - errmsg ("id_type must be specified"); - return -99; - } + vam->current_sw_if_index = sw_if_index; + vam->is_ipv6 = ipv6_set; - M (IKEV2_PROFILE_SET_ID, mp); + M (IP_ADDRESS_DUMP, mp); + mp->sw_if_index = ntohl (sw_if_index); + mp->is_ipv6 = ipv6_set; + S (mp); - mp->is_local = is_local; - mp->id_type = (u8) id_type; - mp->data_len = vec_len (data); - clib_memcpy (mp->name, name, vec_len (name)); - clib_memcpy (mp->data, data, vec_len (data)); - vec_free (name); - vec_free (data); + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); - S (mp); W (ret); return ret; } static int -api_ikev2_profile_set_ts (vat_main_t * vam) +api_ip_dump (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ikev2_profile_set_ts_t *mp; - u8 *name = 0; - u8 is_local = 0; - u32 proto = 0, start_port = 0, end_port = (u32) ~ 0; - ip4_address_t start_addr, end_addr; - - const char *valid_chars = "a-zA-Z0-9_"; + vl_api_ip_dump_t *mp; + vl_api_control_ping_t *mp_ping; + unformat_input_t *in = vam->input; + int ipv4_set = 0; + int ipv6_set = 0; + int is_ipv6; + int i; int ret; - start_addr.as_u32 = 0; - end_addr.as_u32 = (u32) ~ 0; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + while (unformat_check_input (in) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "name %U", unformat_token, valid_chars, &name)) - vec_add1 (name, 0); - else if (unformat (i, "protocol %d", &proto)) - ; - else if (unformat (i, "start_port %d", &start_port)) - ; - else if (unformat (i, "end_port %d", &end_port)) - ; - else - if (unformat (i, "start_addr %U", unformat_ip4_address, &start_addr)) - ; - else if (unformat (i, "end_addr %U", unformat_ip4_address, &end_addr)) - ; - else if (unformat (i, "local")) - is_local = 1; - else if (unformat (i, "remote")) - is_local = 0; + if (unformat (in, "ipv4")) + ipv4_set = 1; + else if (unformat (in, "ipv6")) + ipv6_set = 1; else - { - errmsg ("parse error '%U'", format_unformat_error, i); - return -99; - } + break; } - if (!vec_len (name)) + if (ipv4_set && ipv6_set) { - errmsg ("profile name must be specified"); + errmsg ("ipv4 and ipv6 flags cannot be both set"); return -99; } - if (vec_len (name) > 64) + if ((!ipv4_set) && (!ipv6_set)) { - errmsg ("profile name too long"); + errmsg ("no ipv4 nor ipv6 flag set"); return -99; } - M (IKEV2_PROFILE_SET_TS, mp); + is_ipv6 = ipv6_set; + vam->is_ipv6 = is_ipv6; - mp->is_local = is_local; - mp->proto = (u8) proto; - mp->start_port = (u16) start_port; - mp->end_port = (u16) end_port; - mp->start_addr = start_addr.as_u32; - mp->end_addr = end_addr.as_u32; - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); + /* free old data */ + for (i = 0; i < vec_len (vam->ip_details_by_sw_if_index[is_ipv6]); i++) + { + vec_free (vam->ip_details_by_sw_if_index[is_ipv6][i].addr); + } + vec_free (vam->ip_details_by_sw_if_index[is_ipv6]); + M (IP_DUMP, mp); + mp->is_ipv6 = ipv6_set; S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } static int -api_ikev2_set_local_key (vat_main_t * vam) +api_ipsec_spd_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_set_local_key_t *mp; - u8 *file = 0; + vl_api_ipsec_spd_add_del_t *mp; + u32 spd_id = ~0; + u8 is_add = 1; int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "file %v", &file)) - vec_add1 (file, 0); + if (unformat (i, "spd_id %d", &spd_id)) + ; + else if (unformat (i, "del")) + is_add = 0; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } } - - if (!vec_len (file)) - { - errmsg ("RSA key file must be specified"); - return -99; - } - - if (vec_len (file) > 256) + if (spd_id == ~0) { - errmsg ("file name too long"); + errmsg ("spd_id must be set"); return -99; } - M (IKEV2_SET_LOCAL_KEY, mp); + M (IPSEC_SPD_ADD_DEL, mp); - clib_memcpy (mp->key_file, file, vec_len (file)); - vec_free (file); + mp->spd_id = ntohl (spd_id); + mp->is_add = is_add; S (mp); W (ret); @@ -16444,49 +13976,52 @@ api_ikev2_set_local_key (vat_main_t * vam) } static int -api_ikev2_set_responder (vat_main_t * vam) +api_ipsec_interface_add_del_spd (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_set_responder_t *mp; + vl_api_ipsec_interface_add_del_spd_t *mp; + u32 sw_if_index; + u8 sw_if_index_set = 0; + u32 spd_id = (u32) ~ 0; + u8 is_add = 1; int ret; - u8 *name = 0; - u32 sw_if_index = ~0; - ip4_address_t address; - - const char *valid_chars = "a-zA-Z0-9_"; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat - (i, "%U interface %d address %U", unformat_token, valid_chars, - &name, &sw_if_index, unformat_ip4_address, &address)) - vec_add1 (name, 0); + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "spd_id %d", &spd_id)) + ; + else + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + sw_if_index_set = 1; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + sw_if_index_set = 1; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } + } - if (!vec_len (name)) + if (spd_id == (u32) ~ 0) { - errmsg ("profile name must be specified"); + errmsg ("spd_id must be set"); return -99; } - if (vec_len (name) > 64) + if (sw_if_index_set == 0) { - errmsg ("profile name too long"); + errmsg ("missing interface name or sw_if_index"); return -99; } - M (IKEV2_SET_RESPONDER, mp); - - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); + M (IPSEC_INTERFACE_ADD_DEL_SPD, mp); - mp->sw_if_index = sw_if_index; - clib_memcpy (mp->address, &address, sizeof (address)); + mp->spd_id = ntohl (spd_id); + mp->sw_if_index = ntohl (sw_if_index); + mp->is_add = is_add; S (mp); W (ret); @@ -16494,98 +14029,198 @@ api_ikev2_set_responder (vat_main_t * vam) } static int -api_ikev2_set_ike_transforms (vat_main_t * vam) +api_ipsec_spd_entry_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_set_ike_transforms_t *mp; + vl_api_ipsec_spd_entry_add_del_t *mp; + u8 is_add = 1, is_outbound = 0; + u32 spd_id = 0, sa_id = 0, protocol = 0, policy = 0; + i32 priority = 0; + u32 rport_start = 0, rport_stop = (u32) ~ 0; + u32 lport_start = 0, lport_stop = (u32) ~ 0; + vl_api_address_t laddr_start = { }, laddr_stop = + { + }, raddr_start = + { + }, raddr_stop = + { + }; int ret; - u8 *name = 0; - u32 crypto_alg, crypto_key_size, integ_alg, dh_group; - - const char *valid_chars = "a-zA-Z0-9_"; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name, - &crypto_alg, &crypto_key_size, &integ_alg, &dh_group)) - vec_add1 (name, 0); + if (unformat (i, "del")) + is_add = 0; + if (unformat (i, "outbound")) + is_outbound = 1; + if (unformat (i, "inbound")) + is_outbound = 0; + else if (unformat (i, "spd_id %d", &spd_id)) + ; + else if (unformat (i, "sa_id %d", &sa_id)) + ; + else if (unformat (i, "priority %d", &priority)) + ; + else if (unformat (i, "protocol %d", &protocol)) + ; + else if (unformat (i, "lport_start %d", &lport_start)) + ; + else if (unformat (i, "lport_stop %d", &lport_stop)) + ; + else if (unformat (i, "rport_start %d", &rport_start)) + ; + else if (unformat (i, "rport_stop %d", &rport_stop)) + ; + else if (unformat (i, "laddr_start %U", + unformat_vl_api_address, &laddr_start)) + ; + else if (unformat (i, "laddr_stop %U", unformat_vl_api_address, + &laddr_stop)) + ; + else if (unformat (i, "raddr_start %U", unformat_vl_api_address, + &raddr_start)) + ; + else if (unformat (i, "raddr_stop %U", unformat_vl_api_address, + &raddr_stop)) + ; else + if (unformat (i, "action %U", unformat_ipsec_policy_action, &policy)) { - errmsg ("parse error '%U'", format_unformat_error, i); + if (policy == IPSEC_POLICY_ACTION_RESOLVE) + { + clib_warning ("unsupported action: 'resolve'"); + return -99; + } + } + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } - } - if (!vec_len (name)) - { - errmsg ("profile name must be specified"); - return -99; } - if (vec_len (name) > 64) - { - errmsg ("profile name too long"); - return -99; - } + M (IPSEC_SPD_ENTRY_ADD_DEL, mp); - M (IKEV2_SET_IKE_TRANSFORMS, mp); + mp->is_add = is_add; - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); - mp->crypto_alg = crypto_alg; - mp->crypto_key_size = crypto_key_size; - mp->integ_alg = integ_alg; - mp->dh_group = dh_group; + mp->entry.spd_id = ntohl (spd_id); + mp->entry.priority = ntohl (priority); + mp->entry.is_outbound = is_outbound; + + clib_memcpy (&mp->entry.remote_address_start, &raddr_start, + sizeof (vl_api_address_t)); + clib_memcpy (&mp->entry.remote_address_stop, &raddr_stop, + sizeof (vl_api_address_t)); + clib_memcpy (&mp->entry.local_address_start, &laddr_start, + sizeof (vl_api_address_t)); + clib_memcpy (&mp->entry.local_address_stop, &laddr_stop, + sizeof (vl_api_address_t)); + + mp->entry.protocol = (u8) protocol; + mp->entry.local_port_start = ntohs ((u16) lport_start); + mp->entry.local_port_stop = ntohs ((u16) lport_stop); + mp->entry.remote_port_start = ntohs ((u16) rport_start); + mp->entry.remote_port_stop = ntohs ((u16) rport_stop); + mp->entry.policy = (u8) policy; + mp->entry.sa_id = ntohl (sa_id); S (mp); W (ret); return ret; } - static int -api_ikev2_set_esp_transforms (vat_main_t * vam) +api_ipsec_sad_entry_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_set_esp_transforms_t *mp; - int ret; - u8 *name = 0; - u32 crypto_alg, crypto_key_size, integ_alg, dh_group; + vl_api_ipsec_sad_entry_add_del_t *mp; + u32 sad_id = 0, spi = 0; + u8 *ck = 0, *ik = 0; + u8 is_add = 1; - const char *valid_chars = "a-zA-Z0-9_"; + vl_api_ipsec_crypto_alg_t crypto_alg = IPSEC_API_CRYPTO_ALG_NONE; + vl_api_ipsec_integ_alg_t integ_alg = IPSEC_API_INTEG_ALG_NONE; + vl_api_ipsec_sad_flags_t flags = IPSEC_API_SAD_FLAG_NONE; + vl_api_ipsec_proto_t protocol = IPSEC_API_PROTO_AH; + vl_api_address_t tun_src, tun_dst; + int ret; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U %d %d %d %d", unformat_token, valid_chars, &name, - &crypto_alg, &crypto_key_size, &integ_alg, &dh_group)) - vec_add1 (name, 0); + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "sad_id %d", &sad_id)) + ; + else if (unformat (i, "spi %d", &spi)) + ; + else if (unformat (i, "esp")) + protocol = IPSEC_API_PROTO_ESP; else + if (unformat (i, "tunnel_src %U", unformat_vl_api_address, &tun_src)) { - errmsg ("parse error '%U'", format_unformat_error, i); + flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL; + if (ADDRESS_IP6 == tun_src.af) + flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6; + } + else + if (unformat (i, "tunnel_dst %U", unformat_vl_api_address, &tun_dst)) + { + flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL; + if (ADDRESS_IP6 == tun_src.af) + flags |= IPSEC_API_SAD_FLAG_IS_TUNNEL_V6; + } + else + if (unformat (i, "crypto_alg %U", + unformat_ipsec_api_crypto_alg, &crypto_alg)) + ; + else if (unformat (i, "crypto_key %U", unformat_hex_string, &ck)) + ; + else if (unformat (i, "integ_alg %U", + unformat_ipsec_api_integ_alg, &integ_alg)) + ; + else if (unformat (i, "integ_key %U", unformat_hex_string, &ik)) + ; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } - } - if (!vec_len (name)) - { - errmsg ("profile name must be specified"); - return -99; } - if (vec_len (name) > 64) - { - errmsg ("profile name too long"); - return -99; - } + M (IPSEC_SAD_ENTRY_ADD_DEL, mp); - M (IKEV2_SET_ESP_TRANSFORMS, mp); + mp->is_add = is_add; + mp->entry.sad_id = ntohl (sad_id); + mp->entry.protocol = protocol; + mp->entry.spi = ntohl (spi); + mp->entry.flags = flags; - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); - mp->crypto_alg = crypto_alg; - mp->crypto_key_size = crypto_key_size; - mp->integ_alg = integ_alg; - mp->dh_group = dh_group; + mp->entry.crypto_algorithm = crypto_alg; + mp->entry.integrity_algorithm = integ_alg; + mp->entry.crypto_key.length = vec_len (ck); + mp->entry.integrity_key.length = vec_len (ik); + + if (mp->entry.crypto_key.length > sizeof (mp->entry.crypto_key.data)) + mp->entry.crypto_key.length = sizeof (mp->entry.crypto_key.data); + + if (mp->entry.integrity_key.length > sizeof (mp->entry.integrity_key.data)) + mp->entry.integrity_key.length = sizeof (mp->entry.integrity_key.data); + + if (ck) + clib_memcpy (mp->entry.crypto_key.data, ck, mp->entry.crypto_key.length); + if (ik) + clib_memcpy (mp->entry.integrity_key.data, ik, + mp->entry.integrity_key.length); + + if (flags & IPSEC_API_SAD_FLAG_IS_TUNNEL) + { + clib_memcpy (&mp->entry.tunnel_src, &tun_src, + sizeof (mp->entry.tunnel_src)); + clib_memcpy (&mp->entry.tunnel_dst, &tun_dst, + sizeof (mp->entry.tunnel_dst)); + } S (mp); W (ret); @@ -16593,183 +14228,360 @@ api_ikev2_set_esp_transforms (vat_main_t * vam) } static int -api_ikev2_set_sa_lifetime (vat_main_t * vam) +api_ipsec_tunnel_if_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_set_sa_lifetime_t *mp; - int ret; - u8 *name = 0; - u64 lifetime, lifetime_maxdata; - u32 lifetime_jitter, handover; - - const char *valid_chars = "a-zA-Z0-9_"; + vl_api_ipsec_tunnel_if_add_del_t *mp; + u32 local_spi = 0, remote_spi = 0; + u32 crypto_alg = 0, integ_alg = 0; + u8 *lck = NULL, *rck = NULL; + u8 *lik = NULL, *rik = NULL; + vl_api_address_t local_ip = { 0 }; + vl_api_address_t remote_ip = { 0 }; + f64 before = 0; + u8 is_add = 1; + u8 esn = 0; + u8 anti_replay = 0; + u8 renumber = 0; + u32 instance = ~0; + u32 count = 1, jj; + int ret = -1; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%U %lu %u %u %lu", unformat_token, valid_chars, &name, - &lifetime, &lifetime_jitter, &handover, - &lifetime_maxdata)) - vec_add1 (name, 0); + if (unformat (i, "del")) + is_add = 0; + else if (unformat (i, "esn")) + esn = 1; + else if (unformat (i, "anti-replay")) + anti_replay = 1; + else if (unformat (i, "count %d", &count)) + ; + else if (unformat (i, "local_spi %d", &local_spi)) + ; + else if (unformat (i, "remote_spi %d", &remote_spi)) + ; + else + if (unformat (i, "local_ip %U", unformat_vl_api_address, &local_ip)) + ; + else + if (unformat (i, "remote_ip %U", unformat_vl_api_address, &remote_ip)) + ; + else if (unformat (i, "local_crypto_key %U", unformat_hex_string, &lck)) + ; + else + if (unformat (i, "remote_crypto_key %U", unformat_hex_string, &rck)) + ; + else if (unformat (i, "local_integ_key %U", unformat_hex_string, &lik)) + ; + else if (unformat (i, "remote_integ_key %U", unformat_hex_string, &rik)) + ; else + if (unformat + (i, "crypto_alg %U", unformat_ipsec_api_crypto_alg, &crypto_alg)) { - errmsg ("parse error '%U'", format_unformat_error, i); + if (crypto_alg >= IPSEC_CRYPTO_N_ALG) + { + errmsg ("unsupported crypto-alg: '%U'\n", + format_ipsec_crypto_alg, crypto_alg); + return -99; + } + } + else + if (unformat + (i, "integ_alg %U", unformat_ipsec_api_integ_alg, &integ_alg)) + { + if (integ_alg >= IPSEC_INTEG_N_ALG) + { + errmsg ("unsupported integ-alg: '%U'\n", + format_ipsec_integ_alg, integ_alg); + return -99; + } + } + else if (unformat (i, "instance %u", &instance)) + renumber = 1; + else + { + errmsg ("parse error '%U'\n", format_unformat_error, i); return -99; } } - if (!vec_len (name)) + if (count > 1) { - errmsg ("profile name must be specified"); - return -99; + /* Turn on async mode */ + vam->async_mode = 1; + vam->async_errors = 0; + before = vat_time_now (vam); } - if (vec_len (name) > 64) + for (jj = 0; jj < count; jj++) { - errmsg ("profile name too long"); - return -99; - } + M (IPSEC_TUNNEL_IF_ADD_DEL, mp); - M (IKEV2_SET_SA_LIFETIME, mp); + mp->is_add = is_add; + mp->esn = esn; + mp->anti_replay = anti_replay; - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); - mp->lifetime = lifetime; - mp->lifetime_jitter = lifetime_jitter; - mp->handover = handover; - mp->lifetime_maxdata = lifetime_maxdata; + if (jj > 0) + increment_address (&remote_ip); - S (mp); - W (ret); - return ret; -} + clib_memcpy (&mp->local_ip, &local_ip, sizeof (local_ip)); + clib_memcpy (&mp->remote_ip, &remote_ip, sizeof (remote_ip)); -static int -api_ikev2_initiate_sa_init (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_ikev2_initiate_sa_init_t *mp; - int ret; - u8 *name = 0; + mp->local_spi = htonl (local_spi + jj); + mp->remote_spi = htonl (remote_spi + jj); + mp->crypto_alg = (u8) crypto_alg; - const char *valid_chars = "a-zA-Z0-9_"; + mp->local_crypto_key_len = 0; + if (lck) + { + mp->local_crypto_key_len = vec_len (lck); + if (mp->local_crypto_key_len > sizeof (mp->local_crypto_key)) + mp->local_crypto_key_len = sizeof (mp->local_crypto_key); + clib_memcpy (mp->local_crypto_key, lck, mp->local_crypto_key_len); + } - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", unformat_token, valid_chars, &name)) - vec_add1 (name, 0); - else + mp->remote_crypto_key_len = 0; + if (rck) { - errmsg ("parse error '%U'", format_unformat_error, i); - return -99; + mp->remote_crypto_key_len = vec_len (rck); + if (mp->remote_crypto_key_len > sizeof (mp->remote_crypto_key)) + mp->remote_crypto_key_len = sizeof (mp->remote_crypto_key); + clib_memcpy (mp->remote_crypto_key, rck, mp->remote_crypto_key_len); } - } - if (!vec_len (name)) - { - errmsg ("profile name must be specified"); - return -99; + mp->integ_alg = (u8) integ_alg; + + mp->local_integ_key_len = 0; + if (lik) + { + mp->local_integ_key_len = vec_len (lik); + if (mp->local_integ_key_len > sizeof (mp->local_integ_key)) + mp->local_integ_key_len = sizeof (mp->local_integ_key); + clib_memcpy (mp->local_integ_key, lik, mp->local_integ_key_len); + } + + mp->remote_integ_key_len = 0; + if (rik) + { + mp->remote_integ_key_len = vec_len (rik); + if (mp->remote_integ_key_len > sizeof (mp->remote_integ_key)) + mp->remote_integ_key_len = sizeof (mp->remote_integ_key); + clib_memcpy (mp->remote_integ_key, rik, mp->remote_integ_key_len); + } + + if (renumber) + { + mp->renumber = renumber; + mp->show_instance = ntohl (instance); + } + S (mp); } - if (vec_len (name) > 64) + /* When testing multiple add/del ops, use a control-ping to sync */ + if (count > 1) { - errmsg ("profile name too long"); - return -99; - } + vl_api_control_ping_t *mp_ping; + f64 after; + f64 timeout; - M (IKEV2_INITIATE_SA_INIT, mp); + /* Shut off async mode */ + vam->async_mode = 0; - clib_memcpy (mp->name, name, vec_len (name)); - vec_free (name); + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + timeout = vat_time_now (vam) + 1.0; + while (vat_time_now (vam) < timeout) + if (vam->result_ready == 1) + goto out; + vam->retval = -99; + + out: + if (vam->retval == -99) + errmsg ("timeout"); + + if (vam->async_errors > 0) + { + errmsg ("%d asynchronous errors", vam->async_errors); + vam->retval = -98; + } + vam->async_errors = 0; + after = vat_time_now (vam); + + /* slim chance, but we might have eaten SIGTERM on the first iteration */ + if (jj > 0) + count = jj; + + print (vam->ofp, "%d tunnels in %.6f secs, %.2f tunnels/sec", + count, after - before, count / (after - before)); + } + else + { + /* Wait for a reply... */ + W (ret); + return ret; + } - S (mp); - W (ret); return ret; } -static int -api_ikev2_initiate_del_ike_sa (vat_main_t * vam) +static void +vl_api_ipsec_sa_details_t_handler (vl_api_ipsec_sa_details_t * mp) { - unformat_input_t *i = vam->input; - vl_api_ikev2_initiate_del_ike_sa_t *mp; - int ret; - u64 ispi; + vat_main_t *vam = &vat_main; + + print (vam->ofp, "sa_id %u sw_if_index %u spi %u proto %u crypto_alg %u " + "crypto_key %U integ_alg %u integ_key %U flags %x " + "tunnel_src_addr %U tunnel_dst_addr %U " + "salt %u seq_outbound %lu last_seq_inbound %lu " + "replay_window %lu\n", + ntohl (mp->entry.sad_id), + ntohl (mp->sw_if_index), + ntohl (mp->entry.spi), + ntohl (mp->entry.protocol), + ntohl (mp->entry.crypto_algorithm), + format_hex_bytes, mp->entry.crypto_key.data, + mp->entry.crypto_key.length, ntohl (mp->entry.integrity_algorithm), + format_hex_bytes, mp->entry.integrity_key.data, + mp->entry.integrity_key.length, ntohl (mp->entry.flags), + format_vl_api_address, &mp->entry.tunnel_src, format_vl_api_address, + &mp->entry.tunnel_dst, ntohl (mp->salt), + clib_net_to_host_u64 (mp->seq_outbound), + clib_net_to_host_u64 (mp->last_seq_inbound), + clib_net_to_host_u64 (mp->replay_window)); +} + +#define vl_api_ipsec_sa_details_t_endian vl_noop_handler +#define vl_api_ipsec_sa_details_t_print vl_noop_handler +static void vl_api_ipsec_sa_details_t_handler_json + (vl_api_ipsec_sa_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + vl_api_ipsec_sad_flags_t flags; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (VAT_JSON_ARRAY != vam->json_tree.type) { - if (unformat (i, "%lx", &ispi)) - ; - else - { - errmsg ("parse error '%U'", format_unformat_error, i); - return -99; - } + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); } + node = vat_json_array_add (&vam->json_tree); - M (IKEV2_INITIATE_DEL_IKE_SA, mp); - - mp->ispi = ispi; - - S (mp); - W (ret); - return ret; + vat_json_init_object (node); + vat_json_object_add_uint (node, "sa_id", ntohl (mp->entry.sad_id)); + vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); + vat_json_object_add_uint (node, "spi", ntohl (mp->entry.spi)); + vat_json_object_add_uint (node, "proto", ntohl (mp->entry.protocol)); + vat_json_object_add_uint (node, "crypto_alg", + ntohl (mp->entry.crypto_algorithm)); + vat_json_object_add_uint (node, "integ_alg", + ntohl (mp->entry.integrity_algorithm)); + flags = ntohl (mp->entry.flags); + vat_json_object_add_uint (node, "use_esn", + ! !(flags & IPSEC_API_SAD_FLAG_USE_ESN)); + vat_json_object_add_uint (node, "use_anti_replay", + ! !(flags & IPSEC_API_SAD_FLAG_USE_ANTI_REPLAY)); + vat_json_object_add_uint (node, "is_tunnel", + ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL)); + vat_json_object_add_uint (node, "is_tunnel_ip6", + ! !(flags & IPSEC_API_SAD_FLAG_IS_TUNNEL_V6)); + vat_json_object_add_uint (node, "udp_encap", + ! !(flags & IPSEC_API_SAD_FLAG_UDP_ENCAP)); + vat_json_object_add_bytes (node, "crypto_key", mp->entry.crypto_key.data, + mp->entry.crypto_key.length); + vat_json_object_add_bytes (node, "integ_key", mp->entry.integrity_key.data, + mp->entry.integrity_key.length); + vat_json_object_add_address (node, "src", &mp->entry.tunnel_src); + vat_json_object_add_address (node, "dst", &mp->entry.tunnel_dst); + vat_json_object_add_uint (node, "replay_window", + clib_net_to_host_u64 (mp->replay_window)); } static int -api_ikev2_initiate_del_child_sa (vat_main_t * vam) +api_ipsec_sa_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_initiate_del_child_sa_t *mp; + vl_api_ipsec_sa_dump_t *mp; + vl_api_control_ping_t *mp_ping; + u32 sa_id = ~0; int ret; - u32 ispi; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%x", &ispi)) + if (unformat (i, "sa_id %d", &sa_id)) ; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } } - M (IKEV2_INITIATE_DEL_CHILD_SA, mp); + M (IPSEC_SA_DUMP, mp); - mp->ispi = ispi; + mp->sa_id = ntohl (sa_id); S (mp); + + /* Use a control ping for synchronization */ + M (CONTROL_PING, mp_ping); + S (mp_ping); + W (ret); return ret; } static int -api_ikev2_initiate_rekey_child_sa (vat_main_t * vam) +api_ipsec_tunnel_if_set_sa (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_ikev2_initiate_rekey_child_sa_t *mp; + vl_api_ipsec_tunnel_if_set_sa_t *mp; + u32 sw_if_index = ~0; + u32 sa_id = ~0; + u8 is_outbound = (u8) ~ 0; int ret; - u32 ispi; - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "%x", &ispi)) + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sa_id %d", &sa_id)) ; + else if (unformat (i, "outbound")) + is_outbound = 1; + else if (unformat (i, "inbound")) + is_outbound = 0; else { - errmsg ("parse error '%U'", format_unformat_error, i); + clib_warning ("parse error '%U'", format_unformat_error, i); return -99; } } - M (IKEV2_INITIATE_REKEY_CHILD_SA, mp); + if (sw_if_index == ~0) + { + errmsg ("interface must be specified"); + return -99; + } + + if (sa_id == ~0) + { + errmsg ("SA ID must be specified"); + return -99; + } + + M (IPSEC_TUNNEL_IF_SET_SA, mp); - mp->ispi = ispi; + mp->sw_if_index = htonl (sw_if_index); + mp->sa_id = htonl (sa_id); + mp->is_outbound = is_outbound; S (mp); W (ret); + return ret; } @@ -20432,23 +18244,106 @@ api_netmap_delete (vat_main_t * vam) return ret; } +static u8 * +format_fib_api_path_nh_proto (u8 * s, va_list * args) +{ + vl_api_fib_path_nh_proto_t proto = + va_arg (*args, vl_api_fib_path_nh_proto_t); + + switch (proto) + { + case FIB_API_PATH_NH_PROTO_IP4: + s = format (s, "ip4"); + break; + case FIB_API_PATH_NH_PROTO_IP6: + s = format (s, "ip6"); + break; + case FIB_API_PATH_NH_PROTO_MPLS: + s = format (s, "mpls"); + break; + case FIB_API_PATH_NH_PROTO_BIER: + s = format (s, "bier"); + break; + case FIB_API_PATH_NH_PROTO_ETHERNET: + s = format (s, "ethernet"); + break; + } + + return (s); +} + +static u8 * +format_vl_api_ip_address_union (u8 * s, va_list * args) +{ + vl_api_address_family_t af = va_arg (*args, vl_api_address_family_t); + const vl_api_address_union_t *u = va_arg (*args, vl_api_address_union_t *); + + switch (af) + { + case ADDRESS_IP4: + s = format (s, "%U", format_ip4_address, u->ip4); + break; + case ADDRESS_IP6: + s = format (s, "%U", format_ip6_address, u->ip6); + break; + } + return (s); +} + +static u8 * +format_vl_api_fib_path_type (u8 * s, va_list * args) +{ + vl_api_fib_path_type_t t = va_arg (*args, vl_api_fib_path_type_t); + + switch (t) + { + case FIB_API_PATH_TYPE_NORMAL: + s = format (s, "normal"); + break; + case FIB_API_PATH_TYPE_LOCAL: + s = format (s, "local"); + break; + case FIB_API_PATH_TYPE_DROP: + s = format (s, "drop"); + break; + case FIB_API_PATH_TYPE_UDP_ENCAP: + s = format (s, "udp-encap"); + break; + case FIB_API_PATH_TYPE_BIER_IMP: + s = format (s, "bier-imp"); + break; + case FIB_API_PATH_TYPE_ICMP_UNREACH: + s = format (s, "unreach"); + break; + case FIB_API_PATH_TYPE_ICMP_PROHIBIT: + s = format (s, "prohibit"); + break; + case FIB_API_PATH_TYPE_SOURCE_LOOKUP: + s = format (s, "src-lookup"); + break; + case FIB_API_PATH_TYPE_DVR: + s = format (s, "dvr"); + break; + case FIB_API_PATH_TYPE_INTERFACE_RX: + s = format (s, "interface-rx"); + break; + case FIB_API_PATH_TYPE_CLASSIFY: + s = format (s, "classify"); + break; + } + + return (s); +} + static void -vl_api_mpls_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp) +vl_api_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp) { - if (fp->afi == IP46_TYPE_IP6) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip6_address, fp->next_hop); - else if (fp->afi == IP46_TYPE_IP4) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip4_address, fp->next_hop); + print (vam->ofp, + " weight %d, sw_if_index %d, type %U, afi %U, next_hop %U", + ntohl (fp->weight), ntohl (fp->sw_if_index), + format_vl_api_fib_path_type, fp->type, + format_fib_api_path_nh_proto, fp->proto, + format_vl_api_ip_address_union, &fp->nh.address); } static void @@ -20460,19 +18355,16 @@ vl_api_mpls_fib_path_json_print (vat_json_node_t * node, vat_json_object_add_uint (node, "weight", ntohl (fp->weight)); vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index)); - vat_json_object_add_uint (node, "is_local", fp->is_local); - vat_json_object_add_uint (node, "is_drop", fp->is_drop); - vat_json_object_add_uint (node, "is_unreach", fp->is_unreach); - vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit); - vat_json_object_add_uint (node, "next_hop_afi", fp->afi); - if (fp->afi == IP46_TYPE_IP4) - { - clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4)); + vat_json_object_add_uint (node, "type", fp->type); + vat_json_object_add_uint (node, "next_hop_proto", fp->proto); + if (fp->proto == FIB_API_PATH_NH_PROTO_IP4) + { + clib_memcpy (&ip4, &fp->nh.address.ip4, sizeof (ip4)); vat_json_object_add_ip4 (node, "next_hop", ip4); } - else if (fp->afi == IP46_TYPE_IP6) + else if (fp->proto == FIB_API_PATH_NH_PROTO_IP4) { - clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6)); + clib_memcpy (&ip6, &fp->nh.address.ip6, sizeof (ip6)); vat_json_object_add_ip6 (node, "next_hop", ip6); } } @@ -20481,16 +18373,16 @@ static void vl_api_mpls_tunnel_details_t_handler (vl_api_mpls_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->mt_count); + int count = ntohl (mp->mt_tunnel.mt_n_paths); vl_api_fib_path_t *fp; i32 i; - print (vam->ofp, "[%d]: sw_if_index %d via:", - ntohl (mp->mt_tunnel_index), ntohl (mp->mt_sw_if_index)); - fp = mp->mt_paths; + print (vam->ofp, "sw_if_index %d via:", + ntohl (mp->mt_tunnel.mt_sw_if_index)); + fp = mp->mt_tunnel.mt_paths; for (i = 0; i < count; i++) { - vl_api_mpls_fib_path_print (vam, fp); + vl_api_fib_path_print (vam, fp); fp++; } @@ -20505,7 +18397,7 @@ vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; - int count = ntohl (mp->mt_count); + int count = ntohl (mp->mt_tunnel.mt_n_paths); vl_api_fib_path_t *fp; i32 i; @@ -20517,13 +18409,12 @@ vl_api_mpls_tunnel_details_t_handler_json (vl_api_mpls_tunnel_details_t * mp) node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "tunnel_index", - ntohl (mp->mt_tunnel_index)); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->mt_sw_if_index)); + vat_json_object_add_uint (node, "sw_if_index", + ntohl (mp->mt_tunnel.mt_sw_if_index)); - vat_json_object_add_uint (node, "l2_only", mp->mt_l2_only); + vat_json_object_add_uint (node, "l2_only", mp->mt_tunnel.mt_l2_only); - fp = mp->mt_paths; + fp = mp->mt_tunnel.mt_paths; for (i = 0; i < count; i++) { vl_api_mpls_fib_path_json_print (node, fp); @@ -20536,20 +18427,57 @@ api_mpls_tunnel_dump (vat_main_t * vam) { vl_api_mpls_tunnel_dump_t *mp; vl_api_control_ping_t *mp_ping; - u32 sw_if_index = ~0; int ret; - /* Parse args required to build the message */ - while (unformat_check_input (vam->input) != UNFORMAT_END_OF_INPUT) + M (MPLS_TUNNEL_DUMP, mp); + + S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + W (ret); + return ret; +} + +#define vl_api_mpls_table_details_t_endian vl_noop_handler +#define vl_api_mpls_table_details_t_print vl_noop_handler + + +static void +vl_api_mpls_table_details_t_handler (vl_api_mpls_table_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + print (vam->ofp, "table-id %d,", ntohl (mp->mt_table.mt_table_id)); +} + +static void vl_api_mpls_table_details_t_handler_json + (vl_api_mpls_table_details_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t *node = NULL; + + if (VAT_JSON_ARRAY != vam->json_tree.type) { - if (unformat (vam->input, "sw_if_index %d", &sw_if_index)) - ; + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); } + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + vat_json_object_add_uint (node, "table", ntohl (mp->mt_table.mt_table_id)); +} - print (vam->ofp, " sw_if_index %d", sw_if_index); +static int +api_mpls_table_dump (vat_main_t * vam) +{ + vl_api_mpls_table_dump_t *mp; + vl_api_control_ping_t *mp_ping; + int ret; - M (MPLS_TUNNEL_DUMP, mp); - mp->sw_if_index = htonl (sw_if_index); + M (MPLS_TABLE_DUMP, mp); S (mp); /* Use a control ping for synchronization */ @@ -20560,34 +18488,34 @@ api_mpls_tunnel_dump (vat_main_t * vam) return ret; } -#define vl_api_mpls_fib_details_t_endian vl_noop_handler -#define vl_api_mpls_fib_details_t_print vl_noop_handler - +#define vl_api_mpls_route_details_t_endian vl_noop_handler +#define vl_api_mpls_route_details_t_print vl_noop_handler static void -vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp) +vl_api_mpls_route_details_t_handler (vl_api_mpls_route_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); + int count = (int) clib_net_to_host_u32 (mp->mr_route.mr_n_paths); vl_api_fib_path_t *fp; int i; print (vam->ofp, "table-id %d, label %u, ess_bit %u", - ntohl (mp->table_id), ntohl (mp->label), mp->eos_bit); - fp = mp->path; + ntohl (mp->mr_route.mr_table_id), + ntohl (mp->mr_route.mr_label), mp->mr_route.mr_eos); + fp = mp->mr_route.mr_paths; for (i = 0; i < count; i++) { - vl_api_mpls_fib_path_print (vam, fp); + vl_api_fib_path_print (vam, fp); fp++; } } -static void vl_api_mpls_fib_details_t_handler_json - (vl_api_mpls_fib_details_t * mp) +static void vl_api_mpls_route_details_t_handler_json + (vl_api_mpls_route_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); + int count = (int) clib_host_to_net_u32 (mp->mr_route.mr_n_paths); vat_json_node_t *node = NULL; vl_api_fib_path_t *fp; int i; @@ -20600,11 +18528,11 @@ static void vl_api_mpls_fib_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "table", ntohl (mp->table_id)); - vat_json_object_add_uint (node, "s_bit", mp->eos_bit); - vat_json_object_add_uint (node, "label", ntohl (mp->label)); + vat_json_object_add_uint (node, "table", ntohl (mp->mr_route.mr_table_id)); + vat_json_object_add_uint (node, "s_bit", mp->mr_route.mr_eos); + vat_json_object_add_uint (node, "label", ntohl (mp->mr_route.mr_label)); vat_json_object_add_uint (node, "path_count", count); - fp = mp->path; + fp = mp->mr_route.mr_paths; for (i = 0; i < count; i++) { vl_api_mpls_fib_path_json_print (node, fp); @@ -20613,13 +18541,30 @@ static void vl_api_mpls_fib_details_t_handler_json } static int -api_mpls_fib_dump (vat_main_t * vam) +api_mpls_route_dump (vat_main_t * vam) { - vl_api_mpls_fib_dump_t *mp; + unformat_input_t *input = vam->input; + vl_api_mpls_route_dump_t *mp; vl_api_control_ping_t *mp_ping; + u32 table_id; int ret; - M (MPLS_FIB_DUMP, mp); + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "table_id %d", &table_id)) + ; + else + break; + } + if (table_id == ~0) + { + errmsg ("missing table id"); + return -99; + } + + M (MPLS_ROUTE_DUMP, mp); + + mp->table.mt_table_id = ntohl (table_id); S (mp); /* Use a control ping for synchronization */ @@ -20630,54 +18575,25 @@ api_mpls_fib_dump (vat_main_t * vam) return ret; } -#define vl_api_ip_fib_details_t_endian vl_noop_handler -#define vl_api_ip_fib_details_t_print vl_noop_handler +#define vl_api_ip_table_details_t_endian vl_noop_handler +#define vl_api_ip_table_details_t_print vl_noop_handler static void -vl_api_ip_fib_details_t_handler (vl_api_ip_fib_details_t * mp) +vl_api_ip_table_details_t_handler (vl_api_ip_table_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); - vl_api_fib_path_t *fp; - int i; print (vam->ofp, - "table-id %d, prefix %U/%d stats-index %d", - ntohl (mp->table_id), format_ip4_address, mp->address, - mp->address_length, ntohl (mp->stats_index)); - fp = mp->path; - for (i = 0; i < count; i++) - { - if (fp->afi == IP46_TYPE_IP6) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, " - "next_hop_table %d", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip6_address, fp->next_hop, ntohl (fp->table_id)); - else if (fp->afi == IP46_TYPE_IP4) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U, " - "next_hop_table %d", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip4_address, fp->next_hop, ntohl (fp->table_id)); - fp++; - } + "%s; table-id %d, prefix %U/%d", + mp->table.name, ntohl (mp->table.table_id)); } -static void vl_api_ip_fib_details_t_handler_json - (vl_api_ip_fib_details_t * mp) + +static void vl_api_ip_table_details_t_handler_json + (vl_api_ip_table_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); vat_json_node_t *node = NULL; - struct in_addr ip4; - struct in6_addr ip6; - vl_api_fib_path_t *fp; - int i; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -20687,42 +18603,17 @@ static void vl_api_ip_fib_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "table", ntohl (mp->table_id)); - clib_memcpy (&ip4, &mp->address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "prefix", ip4); - vat_json_object_add_uint (node, "mask_length", mp->address_length); - vat_json_object_add_uint (node, "path_count", count); - fp = mp->path; - for (i = 0; i < count; i++) - { - vat_json_object_add_uint (node, "weight", ntohl (fp->weight)); - vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index)); - vat_json_object_add_uint (node, "is_local", fp->is_local); - vat_json_object_add_uint (node, "is_drop", fp->is_drop); - vat_json_object_add_uint (node, "is_unreach", fp->is_unreach); - vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit); - vat_json_object_add_uint (node, "next_hop_afi", fp->afi); - if (fp->afi == IP46_TYPE_IP4) - { - clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4)); - vat_json_object_add_ip4 (node, "next_hop", ip4); - } - else if (fp->afi == IP46_TYPE_IP6) - { - clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6)); - vat_json_object_add_ip6 (node, "next_hop", ip6); - } - } + vat_json_object_add_uint (node, "table", ntohl (mp->table.table_id)); } static int -api_ip_fib_dump (vat_main_t * vam) +api_ip_table_dump (vat_main_t * vam) { - vl_api_ip_fib_dump_t *mp; + vl_api_ip_table_dump_t *mp; vl_api_control_ping_t *mp_ping; int ret; - M (IP_FIB_DUMP, mp); + M (IP_TABLE_DUMP, mp); S (mp); /* Use a control ping for synchronization */ @@ -20734,13 +18625,53 @@ api_ip_fib_dump (vat_main_t * vam) } static int -api_ip_mfib_dump (vat_main_t * vam) +api_ip_mtable_dump (vat_main_t * vam) { - vl_api_ip_mfib_dump_t *mp; + vl_api_ip_mtable_dump_t *mp; vl_api_control_ping_t *mp_ping; int ret; - M (IP_MFIB_DUMP, mp); + M (IP_MTABLE_DUMP, mp); + S (mp); + + /* Use a control ping for synchronization */ + MPING (CONTROL_PING, mp_ping); + S (mp_ping); + + W (ret); + return ret; +} + +static int +api_ip_mroute_dump (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_control_ping_t *mp_ping; + vl_api_ip_mroute_dump_t *mp; + int ret, is_ip6; + u32 table_id; + + is_ip6 = 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "table_id %d", &table_id)) + ; + else if (unformat (input, "ip6")) + is_ip6 = 1; + else if (unformat (input, "ip4")) + is_ip6 = 0; + else + break; + } + if (table_id == ~0) + { + errmsg ("missing table id"); + return -99; + } + + M (IP_MROUTE_DUMP, mp); + mp->table.table_id = table_id; + mp->table.is_ip6 = is_ip6; S (mp); /* Use a control ping for synchronization */ @@ -20757,10 +18688,9 @@ static void vl_api_ip_neighbor_details_t_handler vat_main_t *vam = &vat_main; print (vam->ofp, "%c %U %U", - (mp->is_static) ? 'S' : 'D', - format_ethernet_address, &mp->mac_address, - (mp->is_ipv6) ? format_ip6_address : format_ip4_address, - &mp->ip_address); + (ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ? 'S' : 'D', + format_vl_api_mac_address, &mp->neighbor.mac_address, + format_vl_api_address, &mp->neighbor.ip_address); } static void vl_api_ip_neighbor_details_t_handler_json @@ -20769,8 +18699,6 @@ static void vl_api_ip_neighbor_details_t_handler_json vat_main_t *vam = &vat_main; vat_json_node_t *node; - struct in_addr ip4; - struct in6_addr ip6; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -20780,24 +18708,15 @@ static void vl_api_ip_neighbor_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_string_copy (node, "flag", - (mp->is_static) ? (u8 *) "static" : (u8 *) - "dynamic"); + vat_json_object_add_string_copy + (node, "flag", + ((ntohl (mp->neighbor.flags) & IP_NEIGHBOR_FLAG_STATIC) ? + (u8 *) "static" : (u8 *) "dynamic")); vat_json_object_add_string_copy (node, "link_layer", - format (0, "%U", format_ethernet_address, - &mp->mac_address)); - - if (mp->is_ipv6) - { - clib_memcpy (&ip6, &mp->ip_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "ip_address", ip6); - } - else - { - clib_memcpy (&ip4, &mp->ip_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "ip_address", ip4); - } + format (0, "%U", format_vl_api_mac_address, + &mp->neighbor.mac_address)); + vat_json_object_add_address (node, "ip", &mp->neighbor.ip_address); } static int @@ -20842,47 +18761,35 @@ api_ip_neighbor_dump (vat_main_t * vam) return ret; } -#define vl_api_ip6_fib_details_t_endian vl_noop_handler -#define vl_api_ip6_fib_details_t_print vl_noop_handler +#define vl_api_ip_route_details_t_endian vl_noop_handler +#define vl_api_ip_route_details_t_print vl_noop_handler static void -vl_api_ip6_fib_details_t_handler (vl_api_ip6_fib_details_t * mp) +vl_api_ip_route_details_t_handler (vl_api_ip_route_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); + u8 count = mp->route.n_paths; vl_api_fib_path_t *fp; int i; print (vam->ofp, - "table-id %d, prefix %U/%d stats-index %d", - ntohl (mp->table_id), format_ip6_address, mp->address, - mp->address_length, ntohl (mp->stats_index)); - fp = mp->path; + "table-id %d, prefix %U/%d", + ntohl (mp->route.table_id), + format_ip46_address, mp->route.prefix.address, mp->route.prefix.len); for (i = 0; i < count; i++) { - if (fp->afi == IP46_TYPE_IP6) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip6_address, fp->next_hop); - else if (fp->afi == IP46_TYPE_IP4) - print (vam->ofp, - " weight %d, sw_if_index %d, is_local %d, is_drop %d, " - "is_unreach %d, is_prohitbit %d, afi %d, next_hop %U", - ntohl (fp->weight), ntohl (fp->sw_if_index), fp->is_local, - fp->is_drop, fp->is_unreach, fp->is_prohibit, fp->afi, - format_ip4_address, fp->next_hop); + fp = &mp->route.paths[i]; + + vl_api_fib_path_print (vam, fp); fp++; } } -static void vl_api_ip6_fib_details_t_handler_json - (vl_api_ip6_fib_details_t * mp) +static void vl_api_ip_route_details_t_handler_json + (vl_api_ip_route_details_t * mp) { vat_main_t *vam = &vat_main; - int count = ntohl (mp->count); + u8 count = mp->route.n_paths; vat_json_node_t *node = NULL; struct in_addr ip4; struct in6_addr ip6; @@ -20897,60 +18804,59 @@ static void vl_api_ip6_fib_details_t_handler_json node = vat_json_array_add (&vam->json_tree); vat_json_init_object (node); - vat_json_object_add_uint (node, "table", ntohl (mp->table_id)); - clib_memcpy (&ip6, &mp->address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "prefix", ip6); - vat_json_object_add_uint (node, "mask_length", mp->address_length); + vat_json_object_add_uint (node, "table", ntohl (mp->route.table_id)); + if (ADDRESS_IP6 == mp->route.prefix.address.af) + { + clib_memcpy (&ip6, &mp->route.prefix.address.un.ip6, sizeof (ip6)); + vat_json_object_add_ip6 (node, "prefix", ip6); + } + else + { + clib_memcpy (&ip4, &mp->route.prefix.address.un.ip4, sizeof (ip4)); + vat_json_object_add_ip4 (node, "prefix", ip4); + } + vat_json_object_add_uint (node, "mask_length", mp->route.prefix.len); vat_json_object_add_uint (node, "path_count", count); - fp = mp->path; for (i = 0; i < count; i++) { - vat_json_object_add_uint (node, "weight", ntohl (fp->weight)); - vat_json_object_add_uint (node, "sw_if_index", ntohl (fp->sw_if_index)); - vat_json_object_add_uint (node, "is_local", fp->is_local); - vat_json_object_add_uint (node, "is_drop", fp->is_drop); - vat_json_object_add_uint (node, "is_unreach", fp->is_unreach); - vat_json_object_add_uint (node, "is_prohibit", fp->is_prohibit); - vat_json_object_add_uint (node, "next_hop_afi", fp->afi); - if (fp->afi == IP46_TYPE_IP4) - { - clib_memcpy (&ip4, &fp->next_hop, sizeof (ip4)); - vat_json_object_add_ip4 (node, "next_hop", ip4); - } - else if (fp->afi == IP46_TYPE_IP6) - { - clib_memcpy (&ip6, &fp->next_hop, sizeof (ip6)); - vat_json_object_add_ip6 (node, "next_hop", ip6); - } + fp = &mp->route.paths[i]; + vl_api_mpls_fib_path_json_print (node, fp); } } static int -api_ip6_fib_dump (vat_main_t * vam) +api_ip_route_dump (vat_main_t * vam) { - vl_api_ip6_fib_dump_t *mp; + unformat_input_t *input = vam->input; + vl_api_ip_route_dump_t *mp; vl_api_control_ping_t *mp_ping; + u32 table_id; + u8 is_ip6; int ret; - M (IP6_FIB_DUMP, mp); - S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); + is_ip6 = 0; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "table_id %d", &table_id)) + ; + else if (unformat (input, "ip6")) + is_ip6 = 1; + else if (unformat (input, "ip4")) + is_ip6 = 0; + else + break; + } + if (table_id == ~0) + { + errmsg ("missing table id"); + return -99; + } - W (ret); - return ret; -} + M (IP_ROUTE_DUMP, mp); -static int -api_ip6_mfib_dump (vat_main_t * vam) -{ - vl_api_ip6_mfib_dump_t *mp; - vl_api_control_ping_t *mp_ping; - int ret; + mp->table.table_id = table_id; + mp->table.is_ip6 = is_ip6; - M (IP6_MFIB_DUMP, mp); S (mp); /* Use a control ping for synchronization */ @@ -21409,12 +19315,24 @@ api_pg_create_interface (vat_main_t * vam) unformat_input_t *input = vam->input; vl_api_pg_create_interface_t *mp; - u32 if_id = ~0; + u32 if_id = ~0, gso_size = 0; + u8 gso_enabled = 0; int ret; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "if_id %d", &if_id)) ; + else if (unformat (input, "gso-enabled")) + { + gso_enabled = 1; + if (unformat (input, "gso-size %u", &gso_size)) + ; + else + { + errmsg ("missing gso-size"); + return -99; + } + } else break; } @@ -21428,6 +19346,7 @@ api_pg_create_interface (vat_main_t * vam) M (PG_CREATE_INTERFACE, mp); mp->context = 0; mp->interface_id = ntohl (if_id); + mp->gso_enabled = gso_enabled; S (mp); W (ret); @@ -21548,29 +19467,17 @@ api_ip_source_and_port_range_check_add_del (vat_main_t * vam) u16 *high_ports = 0; u16 this_low; u16 this_hi; - ip4_address_t ip4_addr; - ip6_address_t ip6_addr; - u32 length; + vl_api_prefix_t prefix; u32 tmp, tmp2; u8 prefix_set = 0; u32 vrf_id = ~0; u8 is_add = 1; - u8 is_ipv6 = 0; int ret; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "%U/%d", unformat_ip4_address, &ip4_addr, &length)) - { - prefix_set = 1; - } - else - if (unformat - (input, "%U/%d", unformat_ip6_address, &ip6_addr, &length)) - { - prefix_set = 1; - is_ipv6 = 1; - } + if (unformat (input, "%U", unformat_vl_api_prefix, &prefix)) + prefix_set = 1; else if (unformat (input, "vrf %d", &vrf_id)) ; else if (unformat (input, "del")) @@ -21641,18 +19548,8 @@ api_ip_source_and_port_range_check_add_del (vat_main_t * vam) mp->is_add = is_add; - if (is_ipv6) - { - mp->is_ipv6 = 1; - clib_memcpy (mp->address, &ip6_addr, sizeof (ip6_addr)); - } - else - { - mp->is_ipv6 = 0; - clib_memcpy (mp->address, &ip4_addr, sizeof (ip4_addr)); - } + clib_memcpy (&mp->prefix, &prefix, sizeof (prefix)); - mp->mask_length = length; mp->number_of_ranges = vec_len (low_ports); clib_memcpy (mp->low_ports, low_ports, vec_len (low_ports)); @@ -21739,167 +19636,42 @@ api_ip_source_and_port_range_check_interface_add_del (vat_main_t * vam) } static int -api_ipsec_gre_add_del_tunnel (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_ipsec_gre_add_del_tunnel_t *mp; - u32 local_sa_id = 0; - u32 remote_sa_id = 0; - ip4_address_t src_address; - ip4_address_t dst_address; - u8 is_add = 1; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "local_sa %d", &local_sa_id)) - ; - else if (unformat (i, "remote_sa %d", &remote_sa_id)) - ; - else if (unformat (i, "src %U", unformat_ip4_address, &src_address)) - ; - else if (unformat (i, "dst %U", unformat_ip4_address, &dst_address)) - ; - else if (unformat (i, "del")) - is_add = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - M (IPSEC_GRE_ADD_DEL_TUNNEL, mp); - - mp->local_sa_id = ntohl (local_sa_id); - mp->remote_sa_id = ntohl (remote_sa_id); - clib_memcpy (mp->src_address, &src_address, sizeof (src_address)); - clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address)); - mp->is_add = is_add; - - S (mp); - W (ret); - return ret; -} - -static int -api_punt (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_punt_t *mp; - u32 ipv = ~0; - u32 protocol = ~0; - u32 port = ~0; - int is_add = 1; - int ret; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "ip %d", &ipv)) - ; - else if (unformat (i, "protocol %d", &protocol)) - ; - else if (unformat (i, "port %d", &port)) - ; - else if (unformat (i, "del")) - is_add = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - M (PUNT, mp); - - mp->is_add = (u8) is_add; - mp->ipv = (u8) ipv; - mp->l4_protocol = (u8) protocol; - mp->l4_port = htons ((u16) port); - - S (mp); - W (ret); - return ret; -} - -static void vl_api_ipsec_gre_tunnel_details_t_handler - (vl_api_ipsec_gre_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - - print (vam->ofp, "%11d%15U%15U%14d%14d", - ntohl (mp->sw_if_index), - format_ip4_address, &mp->src_address, - format_ip4_address, &mp->dst_address, - ntohl (mp->local_sa_id), ntohl (mp->remote_sa_id)); -} - -static void vl_api_ipsec_gre_tunnel_details_t_handler_json - (vl_api_ipsec_gre_tunnel_details_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; - struct in_addr ip4; - - if (VAT_JSON_ARRAY != vam->json_tree.type) - { - ASSERT (VAT_JSON_NONE == vam->json_tree.type); - vat_json_init_array (&vam->json_tree); - } - node = vat_json_array_add (&vam->json_tree); - - vat_json_init_object (node); - vat_json_object_add_uint (node, "sw_if_index", ntohl (mp->sw_if_index)); - clib_memcpy (&ip4, &mp->src_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "src_address", ip4); - clib_memcpy (&ip4, &mp->dst_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "dst_address", ip4); - vat_json_object_add_uint (node, "local_sa_id", ntohl (mp->local_sa_id)); - vat_json_object_add_uint (node, "remote_sa_id", ntohl (mp->remote_sa_id)); -} - -static int -api_ipsec_gre_tunnel_dump (vat_main_t * vam) +api_set_punt (vat_main_t * vam) { - unformat_input_t *i = vam->input; - vl_api_ipsec_gre_tunnel_dump_t *mp; - vl_api_control_ping_t *mp_ping; - u32 sw_if_index; - u8 sw_if_index_set = 0; - int ret; - - /* Parse args required to build the message */ - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "sw_if_index %d", &sw_if_index)) - sw_if_index_set = 1; - else - break; - } - - if (sw_if_index_set == 0) - { - sw_if_index = ~0; - } + unformat_input_t *i = vam->input; + vl_api_address_family_t af; + vl_api_set_punt_t *mp; + u32 protocol = ~0; + u32 port = ~0; + int is_add = 1; + int ret; - if (!vam->json_output) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - print (vam->ofp, "%11s%15s%15s%14s%14s", - "sw_if_index", "src_address", "dst_address", - "local_sa_id", "remote_sa_id"); + if (unformat (i, "%U", unformat_vl_api_address_family, &af)) + ; + else if (unformat (i, "protocol %d", &protocol)) + ; + else if (unformat (i, "port %d", &port)) + ; + else if (unformat (i, "del")) + is_add = 0; + else + { + clib_warning ("parse error '%U'", format_unformat_error, i); + return -99; + } } - /* Get list of gre-tunnel interfaces */ - M (IPSEC_GRE_TUNNEL_DUMP, mp); + M (SET_PUNT, mp); - mp->sw_if_index = htonl (sw_if_index); + mp->is_add = (u8) is_add; + mp->punt.type = PUNT_API_TYPE_L4; + mp->punt.punt.l4.af = af; + mp->punt.punt.l4.protocol = (u8) protocol; + mp->punt.punt.l4.port = htons ((u16) port); S (mp); - - /* Use a control ping for synchronization */ - MPING (CONTROL_PING, mp_ping); - S (mp_ping); - W (ret); return ret; } @@ -22229,6 +20001,54 @@ api_sw_interface_tag_add_del (vat_main_t * vam) return ret; } +static int +api_sw_interface_add_del_mac_address (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_mac_address_t mac = { 0 }; + vl_api_sw_interface_add_del_mac_address_t *mp; + u32 sw_if_index = ~0; + u8 is_add = 1; + u8 mac_set = 0; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + ; + else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac)) + mac_set++; + else if (unformat (i, "del")) + is_add = 0; + else + break; + } + + if (sw_if_index == ~0) + { + errmsg ("missing interface name or sw_if_index"); + return -99; + } + + if (!mac_set) + { + errmsg ("missing MAC address"); + return -99; + } + + /* Construct the API message */ + M (SW_INTERFACE_ADD_DEL_MAC_ADDRESS, mp); + mp->sw_if_index = ntohl (sw_if_index); + mp->is_add = is_add; + clib_memcpy (&mp->addr, &mac, sizeof (mac)); + + S (mp); + W (ret); + return ret; +} + static void vl_api_l2_xconnect_details_t_handler (vl_api_l2_xconnect_details_t * mp) { @@ -22729,7 +20549,7 @@ api_sock_init_shm (vat_main_t * vam) config[6].count = 128; config[6].size = sizeof (uword); - rv = vl_socket_client_init_shm (config); + rv = vl_socket_client_init_shm (config, 1 /* want_pthread */ ); if (!rv) vam->client_index_invalid = 1; return rv; @@ -22738,172 +20558,6 @@ api_sock_init_shm (vat_main_t * vam) #endif } -static int -api_dns_enable_disable (vat_main_t * vam) -{ - unformat_input_t *line_input = vam->input; - vl_api_dns_enable_disable_t *mp; - u8 enable_disable = 1; - int ret; - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "disable")) - enable_disable = 0; - if (unformat (line_input, "enable")) - enable_disable = 1; - else - break; - } - - /* Construct the API message */ - M (DNS_ENABLE_DISABLE, mp); - mp->enable = enable_disable; - - /* send it... */ - S (mp); - /* Wait for the reply */ - W (ret); - return ret; -} - -static int -api_dns_resolve_name (vat_main_t * vam) -{ - unformat_input_t *line_input = vam->input; - vl_api_dns_resolve_name_t *mp; - u8 *name = 0; - int ret; - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "%s", &name)) - ; - else - break; - } - - if (vec_len (name) > 127) - { - errmsg ("name too long"); - return -99; - } - - /* Construct the API message */ - M (DNS_RESOLVE_NAME, mp); - memcpy (mp->name, name, vec_len (name)); - vec_free (name); - - /* send it... */ - S (mp); - /* Wait for the reply */ - W (ret); - return ret; -} - -static int -api_dns_resolve_ip (vat_main_t * vam) -{ - unformat_input_t *line_input = vam->input; - vl_api_dns_resolve_ip_t *mp; - int is_ip6 = -1; - ip4_address_t addr4; - ip6_address_t addr6; - int ret; - - while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) - { - if (unformat (line_input, "%U", unformat_ip6_address, &addr6)) - is_ip6 = 1; - else if (unformat (line_input, "%U", unformat_ip4_address, &addr4)) - is_ip6 = 0; - else - break; - } - - if (is_ip6 == -1) - { - errmsg ("missing address"); - return -99; - } - - /* Construct the API message */ - M (DNS_RESOLVE_IP, mp); - mp->is_ip6 = is_ip6; - if (is_ip6) - memcpy (mp->address, &addr6, sizeof (addr6)); - else - memcpy (mp->address, &addr4, sizeof (addr4)); - - /* send it... */ - S (mp); - /* Wait for the reply */ - W (ret); - return ret; -} - -static int -api_dns_name_server_add_del (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_dns_name_server_add_del_t *mp; - u8 is_add = 1; - ip6_address_t ip6_server; - ip4_address_t ip4_server; - int ip6_set = 0; - int ip4_set = 0; - int ret = 0; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "%U", unformat_ip6_address, &ip6_server)) - ip6_set = 1; - else if (unformat (i, "%U", unformat_ip4_address, &ip4_server)) - ip4_set = 1; - else if (unformat (i, "del")) - is_add = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } - } - - if (ip4_set && ip6_set) - { - errmsg ("Only one server address allowed per message"); - return -99; - } - if ((ip4_set + ip6_set) == 0) - { - errmsg ("Server address required"); - return -99; - } - - /* Construct the API message */ - M (DNS_NAME_SERVER_ADD_DEL, mp); - - if (ip6_set) - { - memcpy (mp->server_address, &ip6_server, sizeof (ip6_address_t)); - mp->is_ip6 = 1; - } - else - { - memcpy (mp->server_address, &ip4_server, sizeof (ip4_address_t)); - mp->is_ip6 = 0; - } - - mp->is_add = is_add; - - /* send it... */ - S (mp); - - /* Wait for a reply, return good/bad news */ - W (ret); - return ret; -} - static void vl_api_session_rules_details_t_handler (vl_api_session_rules_details_t * mp) { @@ -23105,10 +20759,8 @@ api_ip_container_proxy_add_del (vat_main_t * vam) { vl_api_ip_container_proxy_add_del_t *mp; unformat_input_t *i = vam->input; - u32 plen = ~0, sw_if_index = ~0; - ip4_address_t ip4; - ip6_address_t ip6; - u8 is_ip4 = 1; + u32 sw_if_index = ~0; + vl_api_prefix_t pfx = { }; u8 is_add = 1; int ret; @@ -23118,22 +20770,14 @@ api_ip_container_proxy_add_del (vat_main_t * vam) is_add = 0; else if (unformat (i, "add")) ; - if (unformat (i, "%U", unformat_ip4_address, &ip4)) - { - is_ip4 = 1; - plen = 32; - } - else if (unformat (i, "%U", unformat_ip6_address, &ip6)) - { - is_ip4 = 0; - plen = 128; - } + if (unformat (i, "%U", unformat_vl_api_prefix, &pfx)) + ; else if (unformat (i, "sw_if_index %u", &sw_if_index)) ; else break; } - if (sw_if_index == ~0 || plen == ~0) + if (sw_if_index == ~0 || pfx.len == 0) { errmsg ("address and sw_if_index must be set"); return -99; @@ -23141,14 +20785,9 @@ api_ip_container_proxy_add_del (vat_main_t * vam) M (IP_CONTAINER_PROXY_ADD_DEL, mp); - mp->is_ip4 = is_ip4; mp->sw_if_index = clib_host_to_net_u32 (sw_if_index); - mp->plen = plen; mp->is_add = is_add; - if (is_ip4) - clib_memcpy (mp->ip, &ip4, sizeof (ip4)); - else - clib_memcpy (mp->ip, &ip6, sizeof (ip6)); + clib_memcpy (&mp->pfx, &pfx, sizeof (pfx)); S (mp); W (ret); @@ -23195,8 +20834,8 @@ api_qos_record_enable_disable (vat_main_t * vam) M (QOS_RECORD_ENABLE_DISABLE, mp); - mp->sw_if_index = ntohl (sw_if_index); - mp->input_source = qs; + mp->record.sw_if_index = ntohl (sw_if_index); + mp->record.input_source = qs; mp->enable = enable; S (mp); @@ -23232,6 +20871,98 @@ comment (vat_main_t * vam) return 0; } +static int +elog_save (vat_main_t * vam) +{ +#if VPP_API_TEST_BUILTIN == 0 + elog_main_t *em = &vam->elog_main; + unformat_input_t *i = vam->input; + char *file, *chroot_file; + clib_error_t *error; + + if (!unformat (i, "%s", &file)) + { + errmsg ("expected file name, got `%U'", format_unformat_error, i); + return 0; + } + + /* It's fairly hard to get "../oopsie" through unformat; just in case */ + if (strstr (file, "..") || index (file, '/')) + { + errmsg ("illegal characters in filename '%s'", file); + return 0; + } + + chroot_file = (char *) format (0, "/tmp/%s%c", file, 0); + + vec_free (file); + + errmsg ("Saving %wd of %wd events to %s", + elog_n_events_in_buffer (em), + elog_buffer_capacity (em), chroot_file); + + error = elog_write_file (em, chroot_file, 1 /* flush ring */ ); + vec_free (chroot_file); + + if (error) + clib_error_report (error); +#else + errmsg ("Use the vpp event loger..."); +#endif + + return 0; +} + +static int +elog_setup (vat_main_t * vam) +{ +#if VPP_API_TEST_BUILTIN == 0 + elog_main_t *em = &vam->elog_main; + unformat_input_t *i = vam->input; + u32 nevents = 128 << 10; + + (void) unformat (i, "nevents %d", &nevents); + + elog_init (em, nevents); + vl_api_set_elog_main (em); + vl_api_set_elog_trace_api_messages (1); + errmsg ("Event logger initialized with %u events", nevents); +#else + errmsg ("Use the vpp event loger..."); +#endif + return 0; +} + +static int +elog_enable (vat_main_t * vam) +{ +#if VPP_API_TEST_BUILTIN == 0 + elog_main_t *em = &vam->elog_main; + + elog_enable_disable (em, 1 /* enable */ ); + vl_api_set_elog_trace_api_messages (1); + errmsg ("Event logger enabled..."); +#else + errmsg ("Use the vpp event loger..."); +#endif + return 0; +} + +static int +elog_disable (vat_main_t * vam) +{ +#if VPP_API_TEST_BUILTIN == 0 + elog_main_t *em = &vam->elog_main; + + elog_enable_disable (em, 0 /* enable */ ); + vl_api_set_elog_trace_api_messages (1); + errmsg ("Event logger disabled..."); +#else + errmsg ("Use the vpp event loger..."); +#endif + return 0; +} + static int statseg (vat_main_t * vam) { @@ -23686,33 +21417,33 @@ _(l2_flags, \ "sw_if | sw_if_index [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \ _(bridge_flags, \ "bd_id [learn] [forward] [uu-flood] [flood] [arp-term] [disable]\n") \ -_(tap_connect, \ - "tapname mac | random-mac [tag ]") \ -_(tap_modify, \ - " | sw_if_index tapname mac | random-mac") \ -_(tap_delete, \ - " | sw_if_index ") \ -_(sw_interface_tap_dump, "") \ _(tap_create_v2, \ - "id [hw-addr ] [host-ns ] [rx-ring-size [tx-ring-size ]") \ + "id [hw-addr ] [host-ns ] [rx-ring-size [tx-ring-size ] [host-mtu-size ] [gso | no-gso]") \ _(tap_delete_v2, \ " | sw_if_index ") \ _(sw_interface_tap_v2_dump, "") \ +_(virtio_pci_create, \ + "pci-addr [use_random_mac | hw-addr ] [features ] [gso-enabled]") \ +_(virtio_pci_delete, \ + " | sw_if_index ") \ +_(sw_interface_virtio_pci_dump, "") \ _(bond_create, \ "[hw-addr ] {round-robin | active-backup | " \ - "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]}") \ + "broadcast | {lacp | xor} [load-balance { l2 | l23 | l34 }]} " \ + "[id ]") \ _(bond_delete, \ " | sw_if_index ") \ _(bond_enslave, \ - "sw_if_index bond [is_passive] [is_long_timeout]") \ + "sw_if_index bond [is_passive] [is_long_timeout]") \ _(bond_detach_slave, \ "sw_if_index ") \ + _(sw_interface_set_bond_weight, " | sw_if_index weight ") \ _(sw_interface_bond_dump, "") \ _(sw_interface_slave_dump, \ " | sw_if_index ") \ _(ip_table_add_del, \ "table [ipv6] [add | del]\n") \ -_(ip_add_del_route, \ +_(ip_route_add_del, \ "/ via <||sw_if_index |via-label >\n" \ "[table-id ] [ | sw_if_index ] [resolve-attempts ]\n"\ "[weight ] [drop] [local] [classify ] [out-label ]\n" \ @@ -23759,22 +21490,11 @@ _(create_subif, " | sw_if_index sub_id \n" \ "[outer_vlan_id ][inner_vlan_id ]\n" \ "[no_tags][one_tag][two_tags][dot1ad][exact_match][default_sub]\n" \ "[outer_vlan_id_any][inner_vlan_id_any]") \ -_(oam_add_del, "src dst [vrf ] [del]") \ _(reset_fib, "vrf [ipv6]") \ -_(dhcp_proxy_config, \ - "svr src \n" \ - "rx_vrf_id server_vrf_id [del]") \ -_(dhcp_proxy_set_vss, \ - "tbl_id [fib_id oui | vpn_ascii_id ] [ipv6] [del]") \ -_(dhcp_proxy_dump, "ip6") \ -_(dhcp_client_config, \ - " | sw_if_index [hostname ] [disable_event] [del]") \ _(set_ip_flow_hash, \ "vrf [src] [dst] [sport] [dport] [proto] [reverse] [ipv6]") \ _(sw_interface_ip6_enable_disable, \ " | sw_if_index enable | disable") \ -_(sw_interface_ip6_set_link_local_address, \ - " | sw_if_index /") \ _(ip6nd_proxy_add_del, \ " | sw_if_index ") \ _(ip6nd_proxy_dump, "") \ @@ -23835,7 +21555,7 @@ _(geneve_add_del_tunnel, \ "vni [encap-vrf-id ] [decap-next ] [del]") \ _(vxlan_tunnel_dump, "[ | sw_if_index ]") \ _(geneve_tunnel_dump, "[ | sw_if_index ]") \ -_(gre_add_del_tunnel, \ +_(gre_tunnel_add_del, \ "src dst [outer-fib-id ] [instance ]\n" \ "[teb | erspan ] [del]") \ _(gre_tunnel_dump, "[ | sw_if_index ]") \ @@ -23847,11 +21567,11 @@ _(l2_interface_vlan_tag_rewrite, \ "[translate-2-[1|2]] [push_dot1q 0] tag1 tag2 ") \ _(create_vhost_user_if, \ "socket [server] [renumber ] " \ - "[disable_mrg_rxbuf] [disable_indirect_desc] " \ + "[disable_mrg_rxbuf] [disable_indirect_desc] [gso] " \ "[mac ]") \ _(modify_vhost_user_if, \ " | sw_if_index socket \n" \ - "[server] [renumber ]") \ + "[server] [renumber ] [gso]") \ _(delete_vhost_user_if, " | sw_if_index ") \ _(sw_interface_vhost_user_dump, "") \ _(show_version, "") \ @@ -23879,45 +21599,25 @@ _(ip_dump, "ipv4 | ipv6") \ _(ipsec_spd_add_del, "spd_id [del]") \ _(ipsec_interface_add_del_spd, "( | sw_if_index )\n" \ " spid_id ") \ -_(ipsec_sad_add_del_entry, "sad_id spi crypto_alg \n" \ +_(ipsec_sad_entry_add_del, "sad_id spi crypto_alg \n" \ " crypto_key tunnel_src tunnel_dst \n" \ " integ_alg integ_key ") \ -_(ipsec_spd_add_del_entry, "spd_id priority action \n" \ +_(ipsec_spd_entry_add_del, "spd_id priority action \n" \ " (inbound|outbound) [sa_id ] laddr_start \n" \ " laddr_stop raddr_start raddr_stop \n" \ " [lport_start lport_stop ] [rport_start rport_stop ]" ) \ -_(ipsec_sa_set_key, "sa_id crypto_key integ_key ") \ _(ipsec_tunnel_if_add_del, "local_spi remote_spi \n" \ " crypto_alg local_crypto_key remote_crypto_key \n" \ " integ_alg local_integ_key remote_integ_key \n" \ " local_ip remote_ip [esn] [anti_replay] [del]\n" \ " [instance ]") \ _(ipsec_sa_dump, "[sa_id ]") \ -_(ipsec_tunnel_if_set_key, " \n" \ - " \n") \ _(ipsec_tunnel_if_set_sa, " sa_id \n") \ -_(ikev2_profile_add_del, "name [del]") \ -_(ikev2_profile_set_auth, "name auth_method \n" \ - "(auth_data 0x | auth_data )") \ -_(ikev2_profile_set_id, "name id_type \n" \ - "(id_data 0x | id_data ) (local|remote)") \ -_(ikev2_profile_set_ts, "name protocol \n" \ - "start_port end_port start_addr end_addr \n" \ - "(local|remote)") \ -_(ikev2_set_local_key, "file ") \ -_(ikev2_set_responder, " interface address ") \ -_(ikev2_set_ike_transforms, " ") \ -_(ikev2_set_esp_transforms, " ") \ -_(ikev2_set_sa_lifetime, " ") \ -_(ikev2_initiate_sa_init, "") \ -_(ikev2_initiate_del_ike_sa, "") \ -_(ikev2_initiate_del_child_sa, "") \ -_(ikev2_initiate_rekey_child_sa, "") \ _(delete_loopback,"sw_if_index ") \ _(bd_ip_mac_add_del, "bd_id [del]") \ -_(bd_ip_mac_dump, "[bd_id] ") \ +_(bd_ip_mac_flush, "bd_id ") \ +_(bd_ip_mac_dump, "[bd_id] ") \ _(want_interface_events, "enable|disable") \ -_(want_stats,"enable|disable") \ _(get_first_msg_id, "client ") \ _(cop_interface_enable_disable, " | sw_if_index [disable]") \ _(cop_whitelist_enable_disable, " | sw_if_index \n" \ @@ -24061,7 +21761,8 @@ _(netmap_create, "name [hw-addr ] [pipe] " \ "[master|slave]") \ _(netmap_delete, "name ") \ _(mpls_tunnel_dump, "tunnel_index ") \ -_(mpls_fib_dump, "") \ +_(mpls_table_dump, "") \ +_(mpls_route_dump, "table-id ") \ _(classify_table_ids, "") \ _(classify_table_by_interface, "sw_if_index ") \ _(classify_table_info, "table_id ") \ @@ -24077,7 +21778,7 @@ _(ipfix_classify_table_dump, "") \ _(sw_interface_span_enable_disable, "[l2] [src | src_sw_if_index ] [disable | [[dst | dst_sw_if_index ] [both|rx|tx]]]") \ _(sw_interface_span_dump, "[l2]") \ _(get_next_index, "node-name next-node-name ") \ -_(pg_create_interface, "if_id ") \ +_(pg_create_interface, "if_id [gso-enabled gso-size ]") \ _(pg_capture, "if_id pcap count [disable]") \ _(pg_enable_disable, "[stream ] disable") \ _(ip_source_and_port_range_check_add_del, \ @@ -24085,26 +21786,25 @@ _(ip_source_and_port_range_check_add_del, \ _(ip_source_and_port_range_check_interface_add_del, \ " | sw_if_index [tcp-out-vrf ] [tcp-in-vrf ]" \ "[udp-in-vrf ] [udp-out-vrf ]") \ -_(ipsec_gre_add_del_tunnel, \ - "src dst local_sa remote_sa [del]") \ -_(ipsec_gre_tunnel_dump, "[sw_if_index ]") \ _(delete_subif," | sw_if_index ") \ _(l2_interface_pbb_tag_rewrite, \ " | sw_if_index \n" \ "[disable | push | pop | translate_pbb_stag ] \n" \ "dmac smac sid [vlanid ]") \ -_(punt, "protocol [ip ] [port ] [del]") \ +_(set_punt, "protocol [ip ] [port ] [del]") \ _(flow_classify_set_interface, \ " | sw_if_index [ip4-table ] [ip6-table ] [del]") \ _(flow_classify_dump, "type [ip4|ip6]") \ -_(ip_fib_dump, "") \ -_(ip_mfib_dump, "") \ -_(ip6_fib_dump, "") \ -_(ip6_mfib_dump, "") \ +_(ip_table_dump, "") \ +_(ip_route_dump, "table-id [ip4|ip6]") \ +_(ip_mtable_dump, "") \ +_(ip_mroute_dump, "table-id [ip4|ip6]") \ _(feature_enable_disable, "arc_name " \ "feature_name | sw_if_index [disable]") \ _(sw_interface_tag_add_del, " | sw_if_index tag " \ "[disable]") \ +_(sw_interface_add_del_mac_address, " | sw_if_index " \ + "mac [del]") \ _(l2_xconnect_dump, "") \ _(hw_interface_set_mtu, " | hw_if_index mtu ") \ _(ip_neighbor_dump, "[ip6] | sw_if_index ") \ @@ -24117,12 +21817,6 @@ _(sw_interface_set_lldp, " | sw_if_index [port-desc ]\n _(tcp_configure_src_addresses, "first-last [vrf ]") \ _(sock_init_shm, "size ") \ _(app_namespace_add_del, "[add] id secret sw_if_index ")\ -_(dns_enable_disable, "[enable][disable]") \ -_(dns_name_server_add_del, " [del]") \ -_(dns_resolve_name, "") \ -_(dns_resolve_ip, "") \ -_(dns_name_server_add_del, " [del]") \ -_(dns_resolve_name, "") \ _(session_rule_add_del, "[add|del] proto / " \ " / action ") \ _(session_rules_dump, "") \ @@ -24139,10 +21833,13 @@ _(dump_interface_table, "usage: dump_interface_table") \ _(dump_sub_interface_table, "usage: dump_sub_interface_table") \ _(dump_ipv4_table, "usage: dump_ipv4_table") \ _(dump_ipv6_table, "usage: dump_ipv6_table") \ -_(dump_stats_table, "usage: dump_stats_table") \ _(dump_macro_table, "usage: dump_macro_table ") \ _(dump_node_table, "usage: dump_node_table") \ _(dump_msg_api_table, "usage: dump_msg_api_table") \ +_(elog_setup, "usage: elog_setup [nevents, default 128K]") \ +_(elog_disable, "usage: elog_disable") \ +_(elog_enable, "usage: elog_enable") \ +_(elog_save, "usage: elog_save ") \ _(get_msg_id, "usage: get_msg_id name_and_crc") \ _(echo, "usage: echo ") \ _(exec, "usage: exec ") \ @@ -24153,7 +21850,7 @@ _(quit, "usage: quit") \ _(search_node_table, "usage: search_node_table ...") \ _(set, "usage: set ") \ _(script, "usage: script ") \ -_(statseg, "usage: statseg"); \ +_(statseg, "usage: statseg") \ _(unset, "usage: unset ") #define _(N,n) \