- return 1;
- }
-
- return 0;
-}
-
-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;
-
- 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;
- }
-
- M (GET_NODE_INDEX, mp);
- clib_memcpy (mp->node_name, name, vec_len (name));
- vec_free (name);
-
- S (mp);
- W (ret);
- return ret;
-}
-
-static int
-api_get_next_index (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_get_next_index_t *mp;
- u8 *node_name = 0, *next_node_name = 0;
- int ret;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "node-name %s", &node_name))
- ;
- else if (unformat (i, "next-node-name %s", &next_node_name))
- break;
- }
-
- 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;
- }
-
- if (next_node_name == 0)
- {
- errmsg ("next node name required");
- return -99;
- }
- 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_add_node_next (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_add_node_next_t *mp;
- u8 *name = 0;
- u8 *next = 0;
- int ret;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "node %s", &name))
- ;
- else if (unformat (i, "next %s", &next))
- ;
- 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;
- }
-
- 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);
- 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_show_version (vat_main_t *vam)
-{
- vl_api_show_version_t *mp;
- int ret;
-
- M (SHOW_VERSION, mp);
-
- S (mp);
- W (ret);
- return ret;
-}
-
-static int
-api_interface_name_renumber (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;
- int ret;
-
- while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
- &sw_if_index))
- ;
- else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
- ;
- else if (unformat (line_input, "new_show_dev_instance %d",
- &new_show_dev_instance))
- ;
- else
- break;
- }
-
- if (sw_if_index == ~0)
- {
- 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_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 (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;
- }
-
- if (ipv4_set && ipv6_set)
- {
- errmsg ("ipv4 and ipv6 flags cannot be both set");
- return -99;
- }
-
- if ((!ipv4_set) && (!ipv6_set))
- {
- errmsg ("no ipv4 nor ipv6 flag set");
- return -99;
- }
-
- if (sw_if_index_set == 0)
- {
- errmsg ("missing interface name or sw_if_index");
- 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;
- }
-
- if (ipv4_set && ipv6_set)
- {
- errmsg ("ipv4 and ipv6 flags cannot be both set");
- return -99;
- }
-
- if ((!ipv4_set) && (!ipv6_set))
- {
- errmsg ("no ipv4 nor ipv6 flag set");
- return -99;
- }
-
- 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++)
- {
- 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_get_first_msg_id (vat_main_t * vam)
-{
- vl_api_get_first_msg_id_t *mp;
- unformat_input_t *i = vam->input;
- u8 *name;
- u8 name_set = 0;
- int ret;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "client %s", &name))
- name_set = 1;
- else
- break;
- }
-
- if (name_set == 0)
- {
- errmsg ("missing client name");
- return -99;
- }
- vec_add1 (name, 0);
-
- if (vec_len (name) > 63)
- {
- errmsg ("client name too long");
- return -99;
- }
-
- M (GET_FIRST_MSG_ID, mp);
- clib_memcpy (mp->name, name, vec_len (name));
- S (mp);
- W (ret);
- return ret;
-}
-
-static int
-api_get_node_graph (vat_main_t * vam)
-{
- vl_api_get_node_graph_t *mp;
- int ret;
-
- M (GET_NODE_GRAPH, mp);
-
- /* send it... */
- S (mp);
- /* Wait for the reply */
- W (ret);
- 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, int);
- 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_fib_path_print (vat_main_t * vam, vl_api_fib_path_t * fp)
-{
- 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
-vl_api_mpls_fib_path_json_print (vat_json_node_t * node,
- vl_api_fib_path_t * fp)
-{
- struct in_addr ip4;
- struct in6_addr ip6;
-
- 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, "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->proto == FIB_API_PATH_NH_PROTO_IP6)
- {
- clib_memcpy (&ip6, &fp->nh.address.ip6, sizeof (ip6));
- vat_json_object_add_ip6 (node, "next_hop", ip6);
- }
-}
-
-#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_table_details_t_handler (vl_api_ip_table_details_t * mp)
-{
- vat_main_t *vam = &vat_main;
-
- print (vam->ofp,
- "%s; table-id %d, prefix %U/%d",
- mp->table.name, ntohl (mp->table.table_id));
-}
-
-
-static void vl_api_ip_table_details_t_handler_json
- (vl_api_ip_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, "table", ntohl (mp->table.table_id));
-}
-
-static int
-api_ip_table_dump (vat_main_t * vam)
-{
- vl_api_ip_table_dump_t *mp;
- vl_api_control_ping_t *mp_ping;
- int ret;
-
- M (IP_TABLE_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_mtable_dump (vat_main_t * vam)
-{
- vl_api_ip_mtable_dump_t *mp;
- vl_api_control_ping_t *mp_ping;
- int ret;
-
- 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 */
- MPING (CONTROL_PING, mp_ping);
- S (mp_ping);
-
- W (ret);
- return ret;
-}
-
-#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_ip_route_details_t_handler (vl_api_ip_route_details_t * mp)
-{
- vat_main_t *vam = &vat_main;
- u8 count = mp->route.n_paths;
- vl_api_fib_path_t *fp;
- int i;
-
- print (vam->ofp,
- "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++)
- {
- fp = &mp->route.paths[i];
-
- vl_api_fib_path_print (vam, fp);
- fp++;