- if (unformat (i, "add"))
- is_add = 1;
- else
- if (unformat
- (i, "del %U", api_unformat_sw_if_index, vam, &sw_if_index))
- 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))
- {
- 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
- {
- clib_warning ("parse error '%U'", format_unformat_error, i);
- return -99;
- }
- }
-
- M2 (MPLS_TUNNEL_ADD_DEL, mp, sizeof (vl_api_fib_mpls_label_t) *
- vec_len (next_hop_out_label_stack));
-
- 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);
-
- 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));
- }
-
- S (mp);
- W (ret);
- return ret;
-}
-
-static int
-api_sw_interface_set_unnumbered (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_sw_interface_set_unnumbered_t *mp;
- u32 sw_if_index;
- u32 unnum_sw_index = ~0;
- u8 is_add = 1;
- u8 sw_if_index_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))
- 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, "unnum_if_index %d", &unnum_sw_index))
- ;
- else if (unformat (i, "del"))
- is_add = 0;
- 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 (SW_INTERFACE_SET_UNNUMBERED, mp);
-
- mp->sw_if_index = ntohl (sw_if_index);
- mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
- mp->is_add = is_add;
-
- S (mp);
- W (ret);
- return ret;
-}
-
-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 mac_set = 0;
- u8 address_set = 0;
- int ret;
- ip_neighbor_flags_t flags;
-
- 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_vl_api_mac_address, &mac_address))
- {
- mac_set = 1;
- }
- else if (unformat (i, "del"))
- is_add = 0;
- 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 if (unformat (i, "static"))
- flags |= IP_NEIGHBOR_FLAG_STATIC;
- else if (unformat (i, "no-fib-entry"))
- 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);
- return -99;
- }
- }
-
- if (sw_if_index_set == 0)
- {
- errmsg ("missing interface name or sw_if_index");
- return -99;
- }
- if (!address_set)
- {
- errmsg ("no address set");
- return -99;
- }
-
- /* Construct the API message */
- M (IP_NEIGHBOR_ADD_DEL, mp);
-
- mp->neighbor.sw_if_index = ntohl (sw_if_index);
- mp->is_add = is_add;
- mp->neighbor.flags = htonl (flags);
- if (mac_set)
- 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);
-
- /* Wait for a reply, return good/bad news */
- W (ret);
- return ret;
-}
-
-static int
-api_create_vlan_subif (vat_main_t * vam)
-{
- unformat_input_t *i = vam->input;
- vl_api_create_vlan_subif_t *mp;
- u32 sw_if_index;
- u8 sw_if_index_set = 0;
- u32 vlan_id;
- u8 vlan_id_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, "vlan %d", &vlan_id))
- vlan_id_set = 1;