X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vpp-api-test%2Fvat%2Fapi_format.c;h=94495ded191ecfc523bdd5ac382189457854cbed;hb=3e046ea96e7e9d98a8dd67eab84031e1d71b4422;hp=958f75f5fa077a9043e35f4f1c3cb17e537962f4;hpb=7be864ad0d8e3b139a277fb4a0234480f0cc3daa;p=vpp.git diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c index 958f75f5fa0..94495ded191 100644 --- a/vpp-api-test/vat/api_format.c +++ b/vpp-api-test/vat/api_format.c @@ -1440,8 +1440,8 @@ static void vl_api_tap_delete_reply_t_handler_json vam->result_ready = 1; } -static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler - (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp) +static void vl_api_mpls_tunnel_add_del_reply_t_handler + (vl_api_mpls_tunnel_add_del_reply_t * mp) { vat_main_t *vam = &vat_main; i32 retval = ntohl (mp->retval); @@ -1456,8 +1456,8 @@ static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler } } -static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json - (vl_api_mpls_ethernet_add_del_tunnel_reply_t * mp) +static void vl_api_mpls_tunnel_add_del_reply_t_handler_json + (vl_api_mpls_tunnel_add_del_reply_t * mp) { vat_main_t *vam = &vat_main; vat_json_node_t node; @@ -1465,7 +1465,7 @@ static void vl_api_mpls_ethernet_add_del_tunnel_reply_t_handler_json vat_json_init_object (&node); vat_json_object_add_int (&node, "retval", ntohl (mp->retval)); vat_json_object_add_uint (&node, "tunnel_sw_if_index", - ntohl (mp->tunnel_sw_if_index)); + ntohl (mp->sw_if_index)); vat_json_print (vam->ofp, &node); vat_json_free (&node); @@ -2337,11 +2337,13 @@ vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp) mp->seid, mp->seid_prefix_len, mp->is_src_dst); vec_add1 (eid, 0); - fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-d\n", + fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-20d%-10d%-20s\n", clib_net_to_host_u32 (mp->vni), eid, mp->is_local ? "local" : "remote", - s, clib_net_to_host_u32 (mp->ttl), mp->authoritative); + s, clib_net_to_host_u32 (mp->ttl), mp->authoritative, + clib_net_to_host_u16 (mp->key_id), mp->key); + vec_free (s); vec_free (eid); } @@ -2379,6 +2381,13 @@ vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni)); vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl)); vat_json_object_add_uint (node, "authoritative", (mp->authoritative)); + + if (mp->key_id) + { + vat_json_object_add_uint (node, "key_id", + clib_net_to_host_u16 (mp->key_id)); + vat_json_object_add_string_copy (node, "key", mp->key); + } vec_free (eid); } @@ -2539,6 +2548,76 @@ static void vec_free (next_decap_str); } +static void + vl_api_show_lisp_map_register_state_reply_t_handler + (vl_api_show_lisp_map_register_state_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + int retval = clib_net_to_host_u32 (mp->retval); + + fformat (vam->ofp, "%s\n", mp->is_enabled ? "enabled" : "disabled"); + + vam->retval = retval; + vam->result_ready = 1; +} + +static void + vl_api_show_lisp_map_register_state_reply_t_handler_json + (vl_api_show_lisp_map_register_state_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t _node, *node = &_node; + int retval = clib_net_to_host_u32 (mp->retval); + + u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled"); + + vat_json_init_object (node); + vat_json_object_add_string_copy (node, "state", s); + + vat_json_print (vam->ofp, node); + vat_json_free (node); + + vam->retval = retval; + vam->result_ready = 1; + vec_free (s); +} + +static void + vl_api_show_lisp_rloc_probe_state_reply_t_handler + (vl_api_show_lisp_rloc_probe_state_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + int retval = clib_net_to_host_u32 (mp->retval); + + if (retval) + goto end; + + fformat (vam->ofp, "%s\n", mp->is_enabled ? "enabled" : "disabled"); +end: + vam->retval = retval; + vam->result_ready = 1; +} + +static void + vl_api_show_lisp_rloc_probe_state_reply_t_handler_json + (vl_api_show_lisp_rloc_probe_state_reply_t * mp) +{ + vat_main_t *vam = &vat_main; + vat_json_node_t _node, *node = &_node; + int retval = clib_net_to_host_u32 (mp->retval); + + u8 *s = format (0, "%s", mp->is_enabled ? "enabled" : "disabled"); + vat_json_init_object (node); + vat_json_object_add_string_copy (node, "state", s); + + vat_json_print (vam->ofp, node); + vat_json_free (node); + + vam->retval = retval; + vam->result_ready = 1; + vec_free (s); +} + static void vl_api_lisp_adjacencies_get_reply_t_handler (vl_api_lisp_adjacencies_get_reply_t * mp) @@ -2611,6 +2690,46 @@ end: vam->result_ready = 1; } +static void +vl_api_lisp_map_server_details_t_handler (vl_api_lisp_map_server_details_t + * mp) +{ + vat_main_t *vam = &vat_main; + + fformat (vam->ofp, "%=20U\n", + mp->is_ipv6 ? format_ip6_address : format_ip4_address, + mp->ip_address); +} + +static void + vl_api_lisp_map_server_details_t_handler_json + (vl_api_lisp_map_server_details_t * mp) +{ + 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) + { + 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); + if (mp->is_ipv6) + { + clib_memcpy (&ip6, mp->ip_address, sizeof (ip6)); + vat_json_object_add_ip6 (node, "map-server", ip6); + } + else + { + clib_memcpy (&ip4, mp->ip_address, sizeof (ip4)); + vat_json_object_add_ip4 (node, "map-server", ip4); + } +} + static void vl_api_lisp_map_resolver_details_t_handler (vl_api_lisp_map_resolver_details_t * mp) @@ -3461,8 +3580,6 @@ _(mpls_route_add_del_reply) \ _(mpls_ip_bind_unbind_reply) \ _(proxy_arp_add_del_reply) \ _(proxy_arp_intfc_enable_disable_reply) \ -_(mpls_add_del_encap_reply) \ -_(mpls_ethernet_add_del_tunnel_2_reply) \ _(sw_interface_set_unnumbered_reply) \ _(ip_neighbor_add_del_reply) \ _(reset_vrf_reply) \ @@ -3523,9 +3640,12 @@ _(lisp_add_del_remote_mapping_reply) \ _(lisp_add_del_adjacency_reply) \ _(lisp_gpe_add_del_fwd_entry_reply) \ _(lisp_add_del_map_resolver_reply) \ +_(lisp_add_del_map_server_reply) \ _(lisp_gpe_enable_disable_reply) \ _(lisp_gpe_add_del_iface_reply) \ _(lisp_enable_disable_reply) \ +_(lisp_rloc_probe_enable_disable_reply) \ +_(lisp_map_register_enable_disable_reply) \ _(lisp_pitr_set_locator_set_reply) \ _(lisp_map_request_mode_reply) \ _(lisp_add_del_map_request_itr_rlocs_reply) \ @@ -3548,7 +3668,8 @@ _(delete_subif_reply) \ _(l2_interface_pbb_tag_rewrite_reply) \ _(punt_reply) \ _(feature_enable_disable_reply) \ -_(sw_interface_tag_add_del_reply) +_(sw_interface_tag_add_del_reply) \ +_(sw_interface_set_mtu_reply) #define _(n) \ static void vl_api_##n##_t_handler \ @@ -3626,11 +3747,7 @@ _(MPLS_IP_BIND_UNBIND_REPLY, mpls_ip_bind_unbind_reply) \ _(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \ _(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, \ proxy_arp_intfc_enable_disable_reply) \ -_(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \ -_(MPLS_ETHERNET_ADD_DEL_TUNNEL_REPLY, \ - mpls_ethernet_add_del_tunnel_reply) \ -_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2_REPLY, \ - mpls_ethernet_add_del_tunnel_2_reply) \ +_(MPLS_TUNNEL_ADD_DEL_REPLY, mpls_tunnel_add_del_reply) \ _(SW_INTERFACE_SET_UNNUMBERED_REPLY, \ sw_interface_set_unnumbered_reply) \ _(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \ @@ -3731,8 +3848,13 @@ _(LISP_ADD_DEL_REMOTE_MAPPING_REPLY, lisp_add_del_remote_mapping_reply) \ _(LISP_ADD_DEL_ADJACENCY_REPLY, lisp_add_del_adjacency_reply) \ _(LISP_GPE_ADD_DEL_FWD_ENTRY_REPLY, lisp_gpe_add_del_fwd_entry_reply) \ _(LISP_ADD_DEL_MAP_RESOLVER_REPLY, lisp_add_del_map_resolver_reply) \ +_(LISP_ADD_DEL_MAP_SERVER_REPLY, lisp_add_del_map_server_reply) \ _(LISP_GPE_ENABLE_DISABLE_REPLY, lisp_gpe_enable_disable_reply) \ _(LISP_ENABLE_DISABLE_REPLY, lisp_enable_disable_reply) \ +_(LISP_MAP_REGISTER_ENABLE_DISABLE_REPLY, \ + lisp_map_register_enable_disable_reply) \ +_(LISP_RLOC_PROBE_ENABLE_DISABLE_REPLY, \ + lisp_rloc_probe_enable_disable_reply) \ _(LISP_PITR_SET_LOCATOR_SET_REPLY, lisp_pitr_set_locator_set_reply) \ _(LISP_MAP_REQUEST_MODE_REPLY, lisp_map_request_mode_reply) \ _(LISP_EID_TABLE_ADD_DEL_MAP_REPLY, lisp_eid_table_add_del_map_reply) \ @@ -3744,6 +3866,7 @@ _(LISP_EID_TABLE_MAP_DETAILS, lisp_eid_table_map_details) \ _(LISP_EID_TABLE_VNI_DETAILS, lisp_eid_table_vni_details) \ _(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \ _(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \ +_(LISP_MAP_SERVER_DETAILS, lisp_map_server_details) \ _(LISP_ADJACENCIES_GET_REPLY, lisp_adjacencies_get_reply) \ _(SHOW_LISP_STATUS_REPLY, show_lisp_status_reply) \ _(LISP_ADD_DEL_MAP_REQUEST_ITR_RLOCS_REPLY, \ @@ -3752,6 +3875,9 @@ _(LISP_GET_MAP_REQUEST_ITR_RLOCS_REPLY, \ lisp_get_map_request_itr_rlocs_reply) \ _(SHOW_LISP_PITR_REPLY, show_lisp_pitr_reply) \ _(SHOW_LISP_MAP_REQUEST_MODE_REPLY, show_lisp_map_request_mode_reply) \ +_(SHOW_LISP_RLOC_PROBE_STATE_REPLY, show_lisp_rloc_probe_state_reply) \ +_(SHOW_LISP_MAP_REGISTER_STATE_REPLY, \ + show_lisp_map_register_state_reply) \ _(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \ _(AF_PACKET_DELETE_REPLY, af_packet_delete_reply) \ _(POLICER_ADD_DEL_REPLY, policer_add_del_reply) \ @@ -3760,8 +3886,7 @@ _(POLICER_CLASSIFY_SET_INTERFACE_REPLY, policer_classify_set_interface_reply) \ _(POLICER_CLASSIFY_DETAILS, policer_classify_details) \ _(NETMAP_CREATE_REPLY, netmap_create_reply) \ _(NETMAP_DELETE_REPLY, netmap_delete_reply) \ -_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \ -_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \ +_(MPLS_TUNNEL_DETAILS, mpls_tunnel_details) \ _(MPLS_FIB_DETAILS, mpls_fib_details) \ _(CLASSIFY_TABLE_IDS_REPLY, classify_table_ids_reply) \ _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \ @@ -3792,8 +3917,11 @@ _(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) \ -_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \ -_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) +_(FEATURE_ENABLE_DISABLE_REPLY, feature_enable_disable_reply) \ +_(SW_INTERFACE_TAG_ADD_DEL_REPLY, sw_interface_tag_add_del_reply) \ +_(L2_XCONNECT_DETAILS, l2_xconnect_details) \ +_(SW_INTERFACE_SET_MTU_REPLY, sw_interface_set_mtu_reply) \ +_(IP_NEIGHBOR_DETAILS, ip_neighbor_details) /* M: construct, but don't yet send a message */ @@ -5304,7 +5432,7 @@ api_l2fib_add_del (vat_main_t * vam) u8 mac_set = 0; u32 bd_id; u8 bd_id_set = 0; - u32 sw_if_index; + u32 sw_if_index = ~0; u8 sw_if_index_set = 0; u8 is_add = 1; u8 static_mac = 0; @@ -5365,7 +5493,7 @@ api_l2fib_add_del (vat_main_t * vam) return -99; } - if (is_add && (sw_if_index_set == 0)) + if (is_add && sw_if_index_set == 0 && filter_mac == 0) { errmsg ("missing interface name or sw_if_index\n"); return -99; @@ -5646,7 +5774,8 @@ api_tap_connect (vat_main_t * vam) 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, "tag %s", &tag)) + ; else break; } @@ -5668,7 +5797,6 @@ api_tap_connect (vat_main_t * vam) errmsg ("tag too long\n"); return -99; } - vec_add1 (tag, 0); /* Construct the API message */ M (TAP_CONNECT, tap_connect); @@ -5800,7 +5928,6 @@ api_ip_add_del_route (vat_main_t * vam) vl_api_ip_add_del_route_t *mp; f64 timeout; u32 sw_if_index = ~0, vrf_id = 0; - u8 sw_if_index_set = 0; u8 is_ipv6 = 0; u8 is_local = 0, is_drop = 0; u8 is_unreach = 0, is_prohibit = 0; @@ -5827,15 +5954,17 @@ api_ip_add_del_route (vat_main_t * vam) u32 classify_table_index = ~0; u8 is_classify = 0; u8 resolve_host = 0, resolve_attached = 0; + 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; /* Parse args required to build the message */ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { if (unformat (i, "%U", 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_ip4_address, &v4_dst_address)) { address_set = 1; @@ -5908,6 +6037,8 @@ api_ip_add_del_route (vat_main_t * vam) else if (unformat (i, "next-hop-table %d", &next_hop_table_id)) ; else if (unformat (i, "out-label %d", &next_hop_out_label)) + vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label)); + else if (unformat (i, "via-label %d", &next_hop_via_label)) ; else if (unformat (i, "random")) random_add_del = 1; @@ -5920,20 +6051,20 @@ api_ip_add_del_route (vat_main_t * vam) } } - if (resolve_attempts > 0 && sw_if_index_set == 0) - { - errmsg ("ARP resolution needs explicit interface or sw_if_index\n"); - return -99; - } - if (!next_hop_set && !is_drop && !is_local && - !is_classify && !is_unreach && !is_prohibit) + !is_classify && !is_unreach && !is_prohibit && + MPLS_LABEL_INVALID == next_hop_via_label) { errmsg ("next hop / local / drop / unreach / prohibit / classify not set\n"); return -99; } + if (next_hop_set && MPLS_LABEL_INVALID != next_hop_via_label) + { + errmsg ("next hop and next-hop via label set\n"); + return -99; + } if (address_set == 0) { errmsg ("missing addresses\n"); @@ -5980,15 +6111,11 @@ api_ip_add_del_route (vat_main_t * vam) for (j = 0; j < count; j++) { /* Construct the API message */ - M (IP_ADD_DEL_ROUTE, ip_add_del_route); + M2 (IP_ADD_DEL_ROUTE, ip_add_del_route, + sizeof (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); - if (resolve_attempts > 0) - { - mp->resolve_attempts = ntohl (resolve_attempts); - mp->resolve_if_needed = 1; - } mp->create_vrf_if_needed = create_vrf_if_needed; mp->is_add = is_add; @@ -6006,7 +6133,15 @@ api_ip_add_del_route (vat_main_t * vam) 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_out_label = ntohl (next_hop_out_label); + 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 (mpls_label_t)); + vec_free (next_hop_out_label_stack); + } if (is_ipv6) { @@ -6106,9 +6241,11 @@ api_mpls_route_add_del (vat_main_t * vam) u32 classify_table_index = ~0; u8 is_classify = 0; u8 resolve_host = 0, resolve_attached = 0; + mpls_label_t next_hop_via_label = MPLS_LABEL_INVALID; mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID; + mpls_label_t *next_hop_out_label_stack = NULL; mpls_label_t local_label = MPLS_LABEL_INVALID; - u8 is_eos = 1; + u8 is_eos = 0; u8 next_hop_proto_is_ip4 = 1; /* Parse args required to build the message */ @@ -6168,8 +6305,10 @@ api_mpls_route_add_del (vat_main_t * vam) } 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-label %d", &next_hop_via_label)) ; + else if (unformat (i, "out-label %d", &next_hop_out_label)) + vec_add1 (next_hop_out_label_stack, ntohl (next_hop_out_label)); else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -6200,7 +6339,8 @@ api_mpls_route_add_del (vat_main_t * vam) for (j = 0; j < count; j++) { /* Construct the API message */ - M (MPLS_ROUTE_ADD_DEL, mpls_route_add_del); + M2 (MPLS_ROUTE_ADD_DEL, mpls_route_add_del, + sizeof (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); @@ -6215,10 +6355,19 @@ api_mpls_route_add_del (vat_main_t * vam) mp->mr_next_hop_weight = next_hop_weight; mp->mr_next_hop_table_id = ntohl (next_hop_table_id); mp->mr_classify_table_index = ntohl (classify_table_index); - mp->mr_next_hop_out_label = ntohl (next_hop_out_label); + 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 (mpls_label_t)); + vec_free (next_hop_out_label_stack); + } + if (next_hop_set) { if (next_hop_proto_is_ip4) @@ -6464,95 +6613,49 @@ api_proxy_arp_intfc_enable_disable (vat_main_t * vam) } static int -api_mpls_add_del_encap (vat_main_t * vam) +api_mpls_tunnel_add_del (vat_main_t * vam) { unformat_input_t *i = vam->input; - vl_api_mpls_add_del_encap_t *mp; + vl_api_mpls_tunnel_add_del_t *mp; f64 timeout; - u32 vrf_id = 0; - u32 *labels = 0; - u32 label; - ip4_address_t dst_address; - u8 is_add = 1; - - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) - { - if (unformat (i, "vrf %d", &vrf_id)) - ; - else if (unformat (i, "label %d", &label)) - vec_add1 (labels, ntohl (label)); - 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; - } - } - - if (vec_len (labels) == 0) - { - errmsg ("missing encap label stack\n"); - return -99; - } - - M2 (MPLS_ADD_DEL_ENCAP, mpls_add_del_encap, - sizeof (u32) * vec_len (labels)); - - mp->vrf_id = ntohl (vrf_id); - clib_memcpy (mp->dst_address, &dst_address, sizeof (dst_address)); - mp->is_add = is_add; - mp->nlabels = vec_len (labels); - clib_memcpy (mp->labels, labels, sizeof (u32) * mp->nlabels); - vec_free (labels); - - S; - W; - /* NOTREACHED */ - return 0; -} - -static int -api_mpls_ethernet_add_del_tunnel (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_mpls_ethernet_add_del_tunnel_t *mp; - f64 timeout; - u32 inner_vrf_id = 0; - ip4_address_t intfc_address; - u8 dst_mac_address[6]; - int dst_set = 1; - u32 tmp; - u8 intfc_address_length = 0; u8 is_add = 1; u8 l2_only = 0; - u32 tx_sw_if_index; - int tx_sw_if_index_set = 0; + u32 sw_if_index = ~0; + u32 next_hop_sw_if_index = ~0; + u32 next_hop_proto_is_ip4 = 1; - /* Shut up coverity */ - memset (dst_mac_address, 0, sizeof (dst_mac_address)); + u32 next_hop_table_id = 0; + ip4_address_t v4_next_hop_address = { + .as_u32 = 0, + }; + ip6_address_t v6_next_hop_address = { {0} }; + mpls_label_t next_hop_out_label = MPLS_LABEL_INVALID, *labels = NULL; while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { - if (unformat (i, "vrf %d", &inner_vrf_id)) + if (unformat (i, "add")) + is_add = 1; + else if (unformat (i, "del sw_if_index %d", &sw_if_index)) + is_add = 0; + else if (unformat (i, "sw_if_index %d", &next_hop_sw_if_index)) ; - else if (unformat (i, "adj %U/%d", unformat_ip4_address, - &intfc_address, &tmp)) - intfc_address_length = tmp; - else if (unformat (i, "%U", unformat_sw_if_index, vam, &tx_sw_if_index)) - tx_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, "dst %U", unformat_ethernet_address, - dst_mac_address)) - dst_set = 1; + 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, "l2-only")) l2_only = 1; - else if (unformat (i, "del")) - is_add = 0; + else if (unformat (i, "next-hop-table %d", &next_hop_table_id)) + ; + else if (unformat (i, "out-label %d", &next_hop_out_label)) + vec_add1 (labels, ntohl (next_hop_out_label)); else { clib_warning ("parse error '%U'", format_unformat_error, i); @@ -6560,107 +6663,36 @@ api_mpls_ethernet_add_del_tunnel (vat_main_t * vam) } } - if (!dst_set) - { - errmsg ("dst (mac address) not set\n"); - return -99; - } - if (!tx_sw_if_index_set) - { - errmsg ("tx-intfc not set\n"); - return -99; - } - - M (MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel); - - mp->vrf_id = ntohl (inner_vrf_id); - clib_memcpy (mp->adj_address, &intfc_address, sizeof (intfc_address)); - mp->adj_address_length = intfc_address_length; - clib_memcpy (mp->dst_mac_address, dst_mac_address, - sizeof (dst_mac_address)); - mp->tx_sw_if_index = ntohl (tx_sw_if_index); - mp->l2_only = l2_only; - mp->is_add = is_add; + M2 (MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del, + sizeof (mpls_label_t) * vec_len (labels)); - S; - W; - /* NOTREACHED */ - return 0; -} + 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; -static int -api_mpls_ethernet_add_del_tunnel_2 (vat_main_t * vam) -{ - unformat_input_t *i = vam->input; - vl_api_mpls_ethernet_add_del_tunnel_2_t *mp; - f64 timeout; - u32 inner_vrf_id = 0; - u32 outer_vrf_id = 0; - ip4_address_t adj_address; - int adj_address_set = 0; - ip4_address_t next_hop_address; - int next_hop_address_set = 0; - u32 tmp; - u8 adj_address_length = 0; - u8 l2_only = 0; - u8 is_add = 1; - u32 resolve_attempts = 5; - u8 resolve_if_needed = 1; + mp->mt_next_hop_n_out_labels = vec_len (labels); - while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + if (0 != mp->mt_next_hop_n_out_labels) { - if (unformat (i, "inner_vrf_id %d", &inner_vrf_id)) - ; - else if (unformat (i, "outer_vrf_id %d", &outer_vrf_id)) - ; - else if (unformat (i, "adj %U/%d", unformat_ip4_address, - &adj_address, &tmp)) - { - adj_address_length = tmp; - adj_address_set = 1; - } - else if (unformat (i, "next-hop %U", unformat_ip4_address, - &next_hop_address)) - next_hop_address_set = 1; - else if (unformat (i, "resolve-attempts %d", &resolve_attempts)) - ; - else if (unformat (i, "resolve-if-needed %d", &tmp)) - resolve_if_needed = tmp; - else if (unformat (i, "l2-only")) - l2_only = 1; - else if (unformat (i, "del")) - is_add = 0; - else - { - clib_warning ("parse error '%U'", format_unformat_error, i); - return -99; - } + clib_memcpy (mp->mt_next_hop_out_label_stack, labels, + sizeof (mpls_label_t) * mp->mt_next_hop_n_out_labels); + vec_free (labels); } - if (!adj_address_set) + if (next_hop_proto_is_ip4) { - errmsg ("adjacency address/mask not set\n"); - return -99; + clib_memcpy (mp->mt_next_hop, + &v4_next_hop_address, sizeof (v4_next_hop_address)); } - if (!next_hop_address_set) + else { - errmsg ("ip4 next hop address (in outer fib) not set\n"); - return -99; + clib_memcpy (mp->mt_next_hop, + &v6_next_hop_address, sizeof (v6_next_hop_address)); } - M (MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2); - - mp->inner_vrf_id = ntohl (inner_vrf_id); - mp->outer_vrf_id = ntohl (outer_vrf_id); - mp->resolve_attempts = ntohl (resolve_attempts); - mp->resolve_if_needed = resolve_if_needed; - mp->is_add = is_add; - mp->l2_only = l2_only; - clib_memcpy (mp->adj_address, &adj_address, sizeof (adj_address)); - mp->adj_address_length = adj_address_length; - clib_memcpy (mp->next_hop_ip4_address_in_outer_vrf, &next_hop_address, - sizeof (next_hop_address)); - S; W; /* NOTREACHED */ @@ -12949,6 +12981,31 @@ api_lisp_add_del_locator (vat_main_t * vam) return 0; } +uword +unformat_hmac_key_id (unformat_input_t * input, va_list * args) +{ + u32 *key_id = va_arg (*args, u32 *); + u8 *s = 0; + + if (unformat (input, "%s", &s)) + { + if (!strcmp ((char *) s, "sha1")) + key_id[0] = HMAC_SHA_1_96; + else if (!strcmp ((char *) s, "sha256")) + key_id[0] = HMAC_SHA_256_128; + else + { + clib_warning ("invalid key_id: '%s'", s); + key_id[0] = HMAC_NO_KEY; + } + } + else + return 0; + + vec_free (s); + return 1; +} + static int api_lisp_add_del_local_eid (vat_main_t * vam) { @@ -12961,6 +13018,8 @@ api_lisp_add_del_local_eid (vat_main_t * vam) u8 *locator_set_name = 0; u8 locator_set_name_set = 0; u32 vni = 0; + u16 key_id = 0; + u8 *key = 0; /* Parse args required to build the message */ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) @@ -12981,6 +13040,10 @@ api_lisp_add_del_local_eid (vat_main_t * vam) { locator_set_name_set = 1; } + else if (unformat (input, "key-id %U", unformat_hmac_key_id, &key_id)) + ; + else if (unformat (input, "secret-key %_%v%_", &key)) + ; else break; } @@ -12998,6 +13061,19 @@ api_lisp_add_del_local_eid (vat_main_t * vam) return -99; } + if (key && (0 == key_id)) + { + errmsg ("invalid key_id!"); + return -99; + } + + if (vec_len (key) > 64) + { + errmsg ("key too long"); + vec_free (key); + return -99; + } + if (vec_len (locator_set_name) > 64) { errmsg ("locator-set name too long\n"); @@ -13014,10 +13090,13 @@ api_lisp_add_del_local_eid (vat_main_t * vam) mp->eid_type = eid->type; mp->prefix_len = eid->len; mp->vni = clib_host_to_net_u32 (vni); + mp->key_id = clib_host_to_net_u16 (key_id); clib_memcpy (mp->locator_set_name, locator_set_name, vec_len (locator_set_name)); + clib_memcpy (mp->key, key, vec_len (key)); vec_free (locator_set_name); + vec_free (key); /* send it... */ S; @@ -13171,10 +13250,10 @@ api_lisp_gpe_add_del_fwd_entry (vat_main_t * vam) } static int -api_lisp_add_del_map_resolver (vat_main_t * vam) +api_lisp_add_del_map_server (vat_main_t * vam) { unformat_input_t *input = vam->input; - vl_api_lisp_add_del_map_resolver_t *mp; + vl_api_lisp_add_del_map_server_t *mp; f64 timeout = ~0; u8 is_add = 1; u8 ipv4_set = 0; @@ -13214,7 +13293,75 @@ api_lisp_add_del_map_resolver (vat_main_t * vam) } /* Construct the API message */ - M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver); + M (LISP_ADD_DEL_MAP_SERVER, lisp_add_del_map_server); + + mp->is_add = is_add; + if (ipv6_set) + { + mp->is_ipv6 = 1; + clib_memcpy (mp->ip_address, &ipv6, sizeof (ipv6)); + } + else + { + mp->is_ipv6 = 0; + clib_memcpy (mp->ip_address, &ipv4, sizeof (ipv4)); + } + + /* send it... */ + S; + + /* Wait for a reply... */ + W; + + /* NOTREACHED */ + return 0; +} + +static int +api_lisp_add_del_map_resolver (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_lisp_add_del_map_resolver_t *mp; + f64 timeout = ~0; + u8 is_add = 1; + u8 ipv4_set = 0; + u8 ipv6_set = 0; + ip4_address_t ipv4; + ip6_address_t ipv6; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "del")) + { + is_add = 0; + } + else if (unformat (input, "%U", unformat_ip4_address, &ipv4)) + { + ipv4_set = 1; + } + else if (unformat (input, "%U", unformat_ip6_address, &ipv6)) + { + ipv6_set = 1; + } + else + break; + } + + if (ipv4_set && ipv6_set) + { + errmsg ("both eid v4 and v6 addresses set\n"); + return -99; + } + + if (!ipv4_set && !ipv6_set) + { + errmsg ("eid addresses not set\n"); + return -99; + } + + /* Construct the API message */ + M (LISP_ADD_DEL_MAP_RESOLVER, lisp_add_del_map_resolver); mp->is_add = is_add; if (ipv6_set) @@ -13285,6 +13432,94 @@ api_lisp_gpe_enable_disable (vat_main_t * vam) return 0; } +static int +api_lisp_rloc_probe_enable_disable (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_lisp_rloc_probe_enable_disable_t *mp; + f64 timeout = ~0; + u8 is_set = 0; + u8 is_en = 0; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable")) + { + is_set = 1; + is_en = 1; + } + else if (unformat (input, "disable")) + is_set = 1; + else + break; + } + + if (!is_set) + { + errmsg ("Value not set\n"); + return -99; + } + + /* Construct the API message */ + M (LISP_RLOC_PROBE_ENABLE_DISABLE, lisp_rloc_probe_enable_disable); + + mp->is_enabled = is_en; + + /* send it... */ + S; + + /* Wait for a reply... */ + W; + + /* NOTREACHED */ + return 0; +} + +static int +api_lisp_map_register_enable_disable (vat_main_t * vam) +{ + unformat_input_t *input = vam->input; + vl_api_lisp_map_register_enable_disable_t *mp; + f64 timeout = ~0; + u8 is_set = 0; + u8 is_en = 0; + + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "enable")) + { + is_set = 1; + is_en = 1; + } + else if (unformat (input, "disable")) + is_set = 1; + else + break; + } + + if (!is_set) + { + errmsg ("Value not set\n"); + return -99; + } + + /* Construct the API message */ + M (LISP_MAP_REGISTER_ENABLE_DISABLE, lisp_map_register_enable_disable); + + mp->is_enabled = is_en; + + /* send it... */ + S; + + /* Wait for a reply... */ + W; + + /* NOTREACHED */ + return 0; +} + static int api_lisp_enable_disable (vat_main_t * vam) { @@ -13331,6 +13566,40 @@ api_lisp_enable_disable (vat_main_t * vam) return 0; } +static int +api_show_lisp_map_register_state (vat_main_t * vam) +{ + f64 timeout = ~0; + vl_api_show_lisp_map_register_state_t *mp; + + M (SHOW_LISP_MAP_REGISTER_STATE, show_lisp_map_register_state); + + /* send */ + S; + + /* wait for reply */ + W; + + return 0; +} + +static int +api_show_lisp_rloc_probe_state (vat_main_t * vam) +{ + f64 timeout = ~0; + vl_api_show_lisp_rloc_probe_state_t *mp; + + M (SHOW_LISP_RLOC_PROBE_STATE, show_lisp_rloc_probe_state); + + /* send */ + S; + + /* wait for reply */ + W; + + return 0; +} + static int api_show_lisp_map_request_mode (vat_main_t * vam) { @@ -14207,8 +14476,8 @@ api_lisp_eid_table_dump (vat_main_t * vam) if (!vam->json_output) { - fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", - "ls_index", "ttl", "authoritative"); + fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-20s%-10s%-20s\n", "EID", + "type", "ls_index", "ttl", "authoritative", "key_id", "key"); } M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump); @@ -14333,6 +14602,34 @@ api_lisp_adjacencies_get (vat_main_t * vam) return 0; } +static int +api_lisp_map_server_dump (vat_main_t * vam) +{ + vl_api_lisp_map_server_dump_t *mp; + f64 timeout = ~0; + + if (!vam->json_output) + { + fformat (vam->ofp, "%=20s\n", "Map server"); + } + + M (LISP_MAP_SERVER_DUMP, lisp_map_server_dump); + /* send it... */ + S; + + /* Use a control ping for synchronization */ + { + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); + S; + } + /* Wait for a reply... */ + W; + + /* NOTREACHED */ + return 0; +} + static int api_lisp_map_resolver_dump (vat_main_t * vam) { @@ -14818,34 +15115,32 @@ api_netmap_delete (vat_main_t * vam) return 0; } -static void vl_api_mpls_eth_tunnel_details_t_handler - (vl_api_mpls_eth_tunnel_details_t * mp) +static void vl_api_mpls_tunnel_details_t_handler + (vl_api_mpls_tunnel_details_t * mp) { vat_main_t *vam = &vat_main; + i32 len = mp->mt_next_hop_n_labels; i32 i; - i32 len = ntohl (mp->nlabels); - fformat (vam->ofp, "[%d]: dst %U, adj %U/%d, labels ", - ntohl (mp->tunnel_index), - format_ethernet_address, &mp->tunnel_dst_mac, - format_ip4_address, &mp->intfc_address, ntohl (mp->mask_width)); + fformat (vam->ofp, "[%d]: via %U %d labels ", + mp->tunnel_index, + format_ip4_address, mp->mt_next_hop, + ntohl (mp->mt_next_hop_sw_if_index)); for (i = 0; i < len; i++) { - fformat (vam->ofp, "%u ", ntohl (mp->labels[i])); + fformat (vam->ofp, "%u ", ntohl (mp->mt_next_hop_out_labels[i])); } fformat (vam->ofp, "\n"); - fformat (vam->ofp, " tx on %d, rx fib index %d\n", - ntohl (mp->tx_sw_if_index), ntohl (mp->inner_fib_index)); } -static void vl_api_mpls_eth_tunnel_details_t_handler_json - (vl_api_mpls_eth_tunnel_details_t * mp) +static void 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; struct in_addr ip4; i32 i; - i32 len = ntohl (mp->nlabels); + i32 len = mp->mt_next_hop_n_labels; if (VAT_JSON_ARRAY != vam->json_tree.type) { @@ -14856,30 +15151,23 @@ static void vl_api_mpls_eth_tunnel_details_t_handler_json vat_json_init_object (node); vat_json_object_add_uint (node, "tunnel_index", ntohl (mp->tunnel_index)); - clib_memcpy (&ip4, &(mp->intfc_address), sizeof (ip4)); - vat_json_object_add_ip4 (node, "intfc_address", ip4); - vat_json_object_add_uint (node, "inner_fib_index", - ntohl (mp->inner_fib_index)); - vat_json_object_add_uint (node, "mask_width", ntohl (mp->mask_width)); - vat_json_object_add_uint (node, "encap_index", ntohl (mp->encap_index)); - vat_json_object_add_uint (node, "hw_if_index", ntohl (mp->hw_if_index)); - vat_json_object_add_uint (node, "l2_only", ntohl (mp->l2_only)); - vat_json_object_add_string_copy (node, "tunnel_dst_mac", - format (0, "%U", format_ethernet_address, - &mp->tunnel_dst_mac)); - vat_json_object_add_uint (node, "tx_sw_if_index", - ntohl (mp->tx_sw_if_index)); + clib_memcpy (&ip4, &(mp->mt_next_hop), sizeof (ip4)); + vat_json_object_add_ip4 (node, "next_hop", ip4); + vat_json_object_add_uint (node, "next_hop_sw_if_index", + ntohl (mp->mt_next_hop_sw_if_index)); + vat_json_object_add_uint (node, "l2_only", ntohl (mp->mt_l2_only)); vat_json_object_add_uint (node, "label_count", len); for (i = 0; i < len; i++) { - vat_json_object_add_uint (node, "label", ntohl (mp->labels[i])); + vat_json_object_add_uint (node, "label", + ntohl (mp->mt_next_hop_out_labels[i])); } } static int -api_mpls_eth_tunnel_dump (vat_main_t * vam) +api_mpls_tunnel_dump (vat_main_t * vam) { - vl_api_mpls_eth_tunnel_dump_t *mp; + vl_api_mpls_tunnel_dump_t *mp; f64 timeout; i32 index = -1; @@ -14895,7 +15183,7 @@ api_mpls_eth_tunnel_dump (vat_main_t * vam) fformat (vam->ofp, " tunnel_index %d\n", index); - M (MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump); + M (MPLS_TUNNEL_DUMP, mpls_tunnel_dump); mp->tunnel_index = htonl (index); S; @@ -14908,69 +15196,6 @@ api_mpls_eth_tunnel_dump (vat_main_t * vam) W; } -static void vl_api_mpls_fib_encap_details_t_handler - (vl_api_mpls_fib_encap_details_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 i; - i32 len = ntohl (mp->nlabels); - - fformat (vam->ofp, "table %d, dest %U, label ", - ntohl (mp->fib_index), format_ip4_address, &mp->dest, len); - for (i = 0; i < len; i++) - { - fformat (vam->ofp, "%u ", ntohl (mp->labels[i])); - } - fformat (vam->ofp, "\n"); -} - -static void vl_api_mpls_fib_encap_details_t_handler_json - (vl_api_mpls_fib_encap_details_t * mp) -{ - vat_main_t *vam = &vat_main; - vat_json_node_t *node = NULL; - i32 i; - i32 len = ntohl (mp->nlabels); - 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, "table", ntohl (mp->fib_index)); - vat_json_object_add_uint (node, "entry_index", ntohl (mp->entry_index)); - clib_memcpy (&ip4, &(mp->dest), sizeof (ip4)); - vat_json_object_add_ip4 (node, "dest", ip4); - vat_json_object_add_uint (node, "s_bit", ntohl (mp->s_bit)); - vat_json_object_add_uint (node, "label_count", len); - for (i = 0; i < len; i++) - { - vat_json_object_add_uint (node, "label", ntohl (mp->labels[i])); - } -} - -static int -api_mpls_fib_encap_dump (vat_main_t * vam) -{ - vl_api_mpls_fib_encap_dump_t *mp; - f64 timeout; - - M (MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump); - S; - - /* Use a control ping for synchronization */ - { - vl_api_control_ping_t *mp; - M (CONTROL_PING, control_ping); - S; - } - W; -} - #define vl_api_mpls_fib_details_t_endian vl_noop_handler #define vl_api_mpls_fib_details_t_print vl_noop_handler @@ -15171,6 +15396,97 @@ api_ip_fib_dump (vat_main_t * vam) W; } +static void vl_api_ip_neighbor_details_t_handler + (vl_api_ip_neighbor_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + fformat (vam->ofp, "%c %U %U\n", + (mp->is_static) ? 'S' : 'D', + format_ethernet_address, &mp->mac_address, + (mp->is_ipv6) ? format_ip6_address : format_ip4_address, + &mp->ip_address); +} + +static void vl_api_ip_neighbor_details_t_handler_json + (vl_api_ip_neighbor_details_t * mp) +{ + + 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) + { + 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_string_copy (node, "flag", + (mp->is_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); + } +} + +static int +api_ip_neighbor_dump (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_ip_neighbor_dump_t *mp; + f64 timeout; + u8 is_ipv6 = 0; + u32 sw_if_index = ~0; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + ; + else if (unformat (i, "ip6")) + is_ipv6 = 1; + else + break; + } + + if (sw_if_index == ~0) + { + errmsg ("missing interface name or sw_if_index\n"); + return -99; + } + + M (IP_NEIGHBOR_DUMP, ip_neighbor_dump); + mp->is_ipv6 = (u8) is_ipv6; + mp->sw_if_index = ntohl (sw_if_index); + S; + + /* Use a control ping for synchronization */ + { + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); + S; + } + W; +} + #define vl_api_ip6_fib_details_t_endian vl_noop_handler #define vl_api_ip6_fib_details_t_print vl_noop_handler @@ -16479,6 +16795,102 @@ api_sw_interface_tag_add_del (vat_main_t * vam) W; } +static void vl_api_l2_xconnect_details_t_handler + (vl_api_l2_xconnect_details_t * mp) +{ + vat_main_t *vam = &vat_main; + + fformat (vam->ofp, "%15d%15d\n", + ntohl (mp->rx_sw_if_index), ntohl (mp->tx_sw_if_index)); +} + +static void vl_api_l2_xconnect_details_t_handler_json + (vl_api_l2_xconnect_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, "rx_sw_if_index", + ntohl (mp->rx_sw_if_index)); + vat_json_object_add_uint (node, "tx_sw_if_index", + ntohl (mp->tx_sw_if_index)); +} + +static int +api_l2_xconnect_dump (vat_main_t * vam) +{ + vl_api_l2_xconnect_dump_t *mp; + f64 timeout; + + if (!vam->json_output) + { + fformat (vam->ofp, "%15s%15s\n", "rx_sw_if_index", "tx_sw_if_index"); + } + + M (L2_XCONNECT_DUMP, l2_xconnect_dump); + + S; + + /* Use a control ping for synchronization */ + { + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); + S; + } + W; +} + +static int +api_sw_interface_set_mtu (vat_main_t * vam) +{ + unformat_input_t *i = vam->input; + vl_api_sw_interface_set_mtu_t *mp; + f64 timeout; + u32 sw_if_index = ~0; + u32 mtu = 0; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "mtu %d", &mtu)) + ; + if (unformat (i, "%U", unformat_sw_if_index, vam, &sw_if_index)) + ; + else if (unformat (i, "sw_if_index %d", &sw_if_index)) + ; + else + break; + } + + if (sw_if_index == ~0) + { + errmsg ("missing interface name or sw_if_index\n"); + return -99; + } + + if (mtu == 0) + { + errmsg ("no mtu specified\n"); + return -99; + } + + /* Construct the API message */ + M (SW_INTERFACE_SET_MTU, sw_interface_set_mtu); + mp->sw_if_index = ntohl (sw_if_index); + mp->mtu = ntohs ((u16) mtu); + + S; + W; +} + + static int q_or_quit (vat_main_t * vam) { @@ -16895,12 +17307,13 @@ _(mpls_route_add_del, \ "[multipath] [count ]") \ _(mpls_ip_bind_unbind, \ "