summaryrefslogtreecommitdiffstats
path: root/vpp
diff options
context:
space:
mode:
authorNeale Ranns <neale.ranns@cisco.com>2016-10-16 12:01:42 -0700
committerEd Warnicke <hagbard@gmail.com>2016-10-18 20:44:22 +0000
commit1357f3b175b4d5b05fb25e9be356695fea9f7e35 (patch)
tree0f2d0b1461d53cf4e9804cd6cd4e7ff8f7722680 /vpp
parent2b39a00795232bdbe68487d2eb9bccf0435b886e (diff)
Deprecate MPLSoGRE tunnels (VPP-502)
Add shared memory APIs for MPLS routes and MPLS to IP prefix bindings. Change-Id: I85b074a4dadc8249c410fdabd8ea019d20479cf8 Signed-off-by: Neale Ranns <neale.ranns@cisco.com>
Diffstat (limited to 'vpp')
-rw-r--r--vpp/vpp-api/api.c650
-rw-r--r--vpp/vpp-api/custom_dump.c80
-rw-r--r--vpp/vpp-api/test_client.c85
-rw-r--r--vpp/vpp-api/vpe.api223
4 files changed, 465 insertions, 573 deletions
diff --git a/vpp/vpp-api/api.c b/vpp/vpp-api/api.c
index b0e0412b127..33f87702056 100644
--- a/vpp/vpp-api/api.c
+++ b/vpp/vpp-api/api.c
@@ -282,6 +282,8 @@ _(SW_INTERFACE_DUMP, sw_interface_dump) \
_(SW_INTERFACE_DETAILS, sw_interface_details) \
_(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \
_(IP_ADD_DEL_ROUTE, ip_add_del_route) \
+_(MPLS_ROUTE_ADD_DEL, mpls_route_add_del) \
+_(MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind) \
_(IS_ADDRESS_REACHABLE, is_address_reachable) \
_(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address) \
_(SW_INTERFACE_SET_TABLE, sw_interface_set_table) \
@@ -305,11 +307,9 @@ _(TAP_DELETE, tap_delete) \
_(SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump) \
_(CREATE_VLAN_SUBIF, create_vlan_subif) \
_(CREATE_SUBIF, create_subif) \
-_(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel) \
_(MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel) \
_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2) \
_(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap) \
-_(MPLS_ADD_DEL_DECAP, mpls_add_del_decap) \
_(PROXY_ARP_ADD_DEL, proxy_arp_add_del) \
_(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable) \
_(IP_NEIGHBOR_ADD_DEL, ip_neighbor_add_del) \
@@ -426,14 +426,12 @@ _(POLICER_CLASSIFY_SET_INTERFACE, policer_classify_set_interface) \
_(POLICER_CLASSIFY_DUMP, policer_classify_dump) \
_(NETMAP_CREATE, netmap_create) \
_(NETMAP_DELETE, netmap_delete) \
-_(MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump) \
-_(MPLS_GRE_TUNNEL_DETAILS, mpls_gre_tunnel_details) \
_(MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump) \
_(MPLS_ETH_TUNNEL_DETAILS, mpls_eth_tunnel_details) \
_(MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump) \
_(MPLS_FIB_ENCAP_DETAILS, mpls_fib_encap_details) \
-_(MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump) \
-_(MPLS_FIB_DECAP_DETAILS, mpls_fib_decap_details) \
+_(MPLS_FIB_DUMP, mpls_fib_dump) \
+_(MPLS_FIB_DETAILS, mpls_fib_details) \
_(CLASSIFY_TABLE_IDS,classify_table_ids) \
_(CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface) \
_(CLASSIFY_TABLE_INFO,classify_table_info) \
@@ -1031,44 +1029,57 @@ VLIB_REGISTER_NODE (vpe_resolver_process_node,static) = {
/* *INDENT-ON* */
static int
-ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
- u32 fib_index,
- const fib_prefix_t * prefix,
- const ip46_address_t * next_hop,
- u32 next_hop_sw_if_index,
- u32 next_hop_fib_index, u32 next_hop_weight)
+add_del_route_t_handler (u8 is_multipath,
+ u8 is_add,
+ u8 is_drop,
+ u8 is_local,
+ u8 is_classify,
+ u32 classify_table_index,
+ u8 is_resolve_host,
+ u8 is_resolve_attached,
+ u32 fib_index,
+ const fib_prefix_t * prefix,
+ u8 next_hop_proto_is_ip4,
+ const ip46_address_t * next_hop,
+ u32 next_hop_sw_if_index,
+ u8 next_hop_fib_index,
+ u32 next_hop_weight, u32 next_hop_out_label)
{
vnet_classify_main_t *cm = &vnet_classify_main;
fib_protocol_t proto = prefix->fp_proto;
stats_main_t *sm = &stats_main;
- if (mp->is_multipath)
+ if (is_multipath)
{
fib_route_path_flags_t path_flags = FIB_ROUTE_PATH_FLAG_NONE;
dslock (sm, 1 /* release hint */ , 10 /* tag */ );
- if (mp->is_resolve_host)
+ if (is_resolve_host)
path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_HOST;
- if (mp->is_resolve_attached)
+ if (is_resolve_attached)
path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_ATTACHED;
- if (mp->is_add)
+ if (is_add)
fib_table_entry_path_add (fib_index,
prefix,
FIB_SOURCE_API,
FIB_ENTRY_FLAG_NONE,
- prefix->fp_proto,
+ (next_hop_proto_is_ip4 ?
+ FIB_PROTOCOL_IP4 :
+ FIB_PROTOCOL_IP6),
next_hop,
next_hop_sw_if_index,
next_hop_fib_index,
next_hop_weight,
- MPLS_LABEL_INVALID, path_flags);
+ next_hop_out_label, path_flags);
else
fib_table_entry_path_remove (fib_index,
prefix,
FIB_SOURCE_API,
- prefix->fp_proto,
+ (next_hop_proto_is_ip4 ?
+ FIB_PROTOCOL_IP4 :
+ FIB_PROTOCOL_IP6),
next_hop,
next_hop_sw_if_index,
next_hop_fib_index,
@@ -1080,26 +1091,26 @@ ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
dslock (sm, 1 /* release hint */ , 2 /* tag */ );
- if (mp->is_drop || mp->is_local || mp->is_classify || mp->lookup_in_vrf)
+ if (is_drop || is_local || is_classify)
{
/*
* special route types that link directly to the adj
*/
- if (mp->is_add)
+ if (is_add)
{
dpo_id_t dpo = DPO_NULL;
dpo_proto_t dproto;
dproto = fib_proto_to_dpo (prefix->fp_proto);
- if (mp->is_drop)
+ if (is_drop)
dpo_copy (&dpo, drop_dpo_get (dproto));
- else if (mp->is_local)
+ else if (is_local)
receive_dpo_add_or_lock (dproto, ~0, NULL, &dpo);
- else if (mp->is_classify)
+ else if (is_classify)
{
if (pool_is_free_index (cm->tables,
- ntohl (mp->classify_table_index)))
+ ntohl (classify_table_index)))
{
dsunlock (sm);
return VNET_API_ERROR_NO_SUCH_TABLE;
@@ -1107,25 +1118,7 @@ ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
dpo_set (&dpo, DPO_CLASSIFY, proto,
classify_dpo_create (prefix->fp_proto,
- ntohl
- (mp->classify_table_index)));
- }
- else if (mp->lookup_in_vrf)
- {
- next_hop_fib_index =
- fib_table_id_find_fib_index (dproto,
- ntohl (mp->lookup_in_vrf));
- if (~0 == next_hop_fib_index)
- {
- dsunlock (sm);
- return VNET_API_ERROR_NO_SUCH_INNER_FIB;
- }
-
- lookup_dpo_add_or_lock_w_fib_index (next_hop_fib_index,
- dproto,
- LOOKUP_INPUT_DST_ADDR,
- LOOKUP_TABLE_FROM_CONFIG,
- &dpo);
+ ntohl (classify_table_index)));
}
else
{
@@ -1146,25 +1139,27 @@ ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
}
else
{
- if (mp->is_add)
+ if (is_add)
{
fib_route_path_flags_t path_flags = FIB_ROUTE_PATH_FLAG_NONE;
- if (mp->is_resolve_host)
+ if (is_resolve_host)
path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_HOST;
- if (mp->is_resolve_attached)
+ if (is_resolve_attached)
path_flags |= FIB_ROUTE_PATH_RESOLVE_VIA_ATTACHED;
fib_table_entry_update_one_path (fib_index,
prefix,
FIB_SOURCE_API,
FIB_ENTRY_FLAG_NONE,
- prefix->fp_proto,
+ (next_hop_proto_is_ip4 ?
+ FIB_PROTOCOL_IP4 :
+ FIB_PROTOCOL_IP6),
next_hop,
next_hop_sw_if_index,
next_hop_fib_index,
next_hop_weight,
- MPLS_LABEL_INVALID, path_flags);
+ next_hop_out_label, path_flags);
}
else
{
@@ -1177,19 +1172,23 @@ ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp,
}
static int
-ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
+add_del_route_check (fib_protocol_t table_proto,
+ u32 table_id,
+ u32 next_hop_sw_if_index,
+ fib_protocol_t next_hop_table_proto,
+ u32 next_hop_table_id,
+ u8 create_missing_tables,
+ u32 * fib_index, u32 * next_hop_fib_index)
{
- vpe_api_main_t *vam = &vpe_api_main;
- vnet_main_t *vnm = vam->vnet_main;
- u32 fib_index;
+ vnet_main_t *vnm = vnet_get_main ();
- fib_index = ip4_fib_index_from_table_id (ntohl (mp->vrf_id));
- if (~0 == fib_index)
+ *fib_index = fib_table_find (table_proto, ntohl (table_id));
+ if (~0 == *fib_index)
{
- if (mp->create_vrf_if_needed)
+ if (create_missing_tables)
{
- fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4,
- ntohl (mp->vrf_id));
+ *fib_index = fib_table_find_or_create_and_lock (table_proto,
+ ntohl (table_id));
}
else
{
@@ -1198,10 +1197,54 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
}
}
- if (~0 != ntohl (mp->next_hop_sw_if_index) &&
- pool_is_free_index (vnm->interface_main.sw_interfaces,
- ntohl (mp->next_hop_sw_if_index)))
- return VNET_API_ERROR_NO_MATCHING_INTERFACE;
+ if (~0 != ntohl (next_hop_sw_if_index))
+ {
+ if (pool_is_free_index (vnm->interface_main.sw_interfaces,
+ ntohl (next_hop_sw_if_index)))
+ {
+ return VNET_API_ERROR_NO_MATCHING_INTERFACE;
+ }
+ }
+ else
+ {
+ *next_hop_fib_index = fib_table_find (next_hop_table_proto,
+ ntohl (next_hop_table_id));
+
+ if (~0 == *next_hop_fib_index)
+ {
+ if (create_missing_tables)
+ {
+ *next_hop_fib_index =
+ fib_table_find_or_create_and_lock (next_hop_table_proto,
+ ntohl (next_hop_table_id));
+ }
+ else
+ {
+ /* No such VRF, and we weren't asked to create one */
+ return VNET_API_ERROR_NO_SUCH_FIB;
+ }
+ }
+ }
+
+ return (0);
+}
+
+static int
+ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
+{
+ u32 fib_index, next_hop_fib_index;
+ int rv;
+
+ rv = add_del_route_check (FIB_PROTOCOL_IP4,
+ mp->table_id,
+ mp->next_hop_sw_if_index,
+ FIB_PROTOCOL_IP4,
+ mp->next_hop_table_id,
+ mp->create_vrf_if_needed,
+ &fib_index, &next_hop_fib_index);
+
+ if (0 != rv)
+ return (rv);
fib_prefix_t pfx = {
.fp_len = mp->dst_address_length,
@@ -1213,50 +1256,109 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
memset (&nh, 0, sizeof (nh));
memcpy (&nh.ip4, mp->next_hop_address, sizeof (nh.ip4));
- return (ip_add_del_route_t_handler (mp, fib_index, &pfx, &nh,
- ntohl (mp->next_hop_sw_if_index),
- fib_index, (u32) mp->next_hop_weight));
+ return (add_del_route_t_handler (mp->is_multipath, mp->is_add, mp->is_drop, mp->is_local, mp->is_classify, mp->classify_table_index, mp->is_resolve_host, mp->is_resolve_attached, fib_index, &pfx, 1, // is_ip4
+ &nh,
+ ntohl (mp->next_hop_sw_if_index),
+ next_hop_fib_index,
+ mp->next_hop_weight,
+ ntohl (mp->next_hop_out_label)));
}
static int
ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
{
- vnet_main_t *vnm = vnet_get_main ();
- u32 fib_index;
+ u32 fib_index, next_hop_fib_index;
+ int rv;
+
+ rv = add_del_route_check (FIB_PROTOCOL_IP6,
+ mp->table_id,
+ mp->next_hop_sw_if_index,
+ FIB_PROTOCOL_IP6,
+ mp->next_hop_table_id,
+ mp->create_vrf_if_needed,
+ &fib_index, &next_hop_fib_index);
+
+ if (0 != rv)
+ return (rv);
+
+ fib_prefix_t pfx = {
+ .fp_len = mp->dst_address_length,
+ .fp_proto = FIB_PROTOCOL_IP6,
+ };
+ clib_memcpy (&pfx.fp_addr.ip6, mp->dst_address, sizeof (pfx.fp_addr.ip6));
+
+ ip46_address_t nh;
+ memset (&nh, 0, sizeof (nh));
+ memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6));
+
+ return (add_del_route_t_handler (mp->is_multipath, mp->is_add, mp->is_drop, mp->is_local, mp->is_classify, mp->classify_table_index, mp->is_resolve_host, mp->is_resolve_attached, fib_index, &pfx, 0, // is_ip4
+ &nh, ntohl (mp->next_hop_sw_if_index),
+ next_hop_fib_index,
+ mp->next_hop_weight,
+ ntohl (mp->next_hop_out_label)));
+}
+
+static int
+mpls_route_add_del_t_handler (vnet_main_t * vnm,
+ vl_api_mpls_route_add_del_t * mp)
+{
+ u32 fib_index, next_hop_fib_index;
- fib_index = ip6_fib_index_from_table_id (ntohl (mp->vrf_id));
- if (~0 == fib_index)
+ int rv;
+
+ fib_prefix_t pfx = {
+ .fp_len = 21,
+ .fp_proto = FIB_PROTOCOL_MPLS,
+ .fp_eos = mp->mr_eos,
+ .fp_label = ntohl (mp->mr_label),
+ };
+ if (pfx.fp_eos)
{
- if (mp->create_vrf_if_needed)
+ if (mp->mr_next_hop_proto_is_ip4)
{
- fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6,
- ntohl (mp->vrf_id));
+ pfx.fp_payload_proto = DPO_PROTO_IP4;
}
else
{
- /* No such VRF, and we weren't asked to create one */
- return VNET_API_ERROR_NO_SUCH_FIB;
+ pfx.fp_payload_proto = DPO_PROTO_IP6;
}
}
+ else
+ {
+ pfx.fp_payload_proto = DPO_PROTO_MPLS;
+ }
- if (~0 != ntohl (mp->next_hop_sw_if_index) &&
- pool_is_free_index (vnm->interface_main.sw_interfaces,
- ntohl (mp->next_hop_sw_if_index)))
- return VNET_API_ERROR_NO_MATCHING_INTERFACE;
+ rv = add_del_route_check (FIB_PROTOCOL_MPLS,
+ mp->mr_table_id,
+ mp->mr_next_hop_sw_if_index,
+ dpo_proto_to_fib (pfx.fp_payload_proto),
+ mp->mr_next_hop_table_id,
+ mp->mr_create_table_if_needed,
+ &fib_index, &next_hop_fib_index);
- fib_prefix_t pfx = {
- .fp_len = mp->dst_address_length,
- .fp_proto = FIB_PROTOCOL_IP6,
- };
- clib_memcpy (&pfx.fp_addr.ip6, mp->dst_address, sizeof (pfx.fp_addr.ip6));
+ if (0 != rv)
+ return (rv);
ip46_address_t nh;
memset (&nh, 0, sizeof (nh));
- memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6));
- return (ip_add_del_route_t_handler (mp, fib_index, &pfx,
- &nh, ntohl (mp->next_hop_sw_if_index),
- fib_index, (u32) mp->next_hop_weight));
+ if (mp->mr_next_hop_proto_is_ip4)
+ memcpy (&nh.ip4, mp->mr_next_hop, sizeof (nh.ip4));
+ else
+ memcpy (&nh.ip6, mp->mr_next_hop, sizeof (nh.ip6));
+
+ return (add_del_route_t_handler (mp->mr_is_multipath, mp->mr_is_add, 0, // mp->is_drop,
+ 0, // mp->is_local,
+ mp->mr_is_classify,
+ mp->mr_classify_table_index,
+ mp->mr_is_resolve_host,
+ mp->mr_is_resolve_attached,
+ fib_index, &pfx,
+ mp->mr_next_hop_proto_is_ip4,
+ &nh, ntohl (mp->mr_next_hop_sw_if_index),
+ next_hop_fib_index,
+ mp->mr_next_hop_weight,
+ ntohl (mp->mr_next_hop_out_label)));
}
void
@@ -1278,6 +1380,95 @@ vl_api_ip_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp)
REPLY_MACRO (VL_API_IP_ADD_DEL_ROUTE_REPLY);
}
+void
+vl_api_mpls_route_add_del_t_handler (vl_api_mpls_route_add_del_t * mp)
+{
+ vl_api_mpls_route_add_del_reply_t *rmp;
+ vnet_main_t *vnm;
+ int rv;
+
+ vnm = vnet_get_main ();
+ vnm->api_errno = 0;
+
+ rv = mpls_route_add_del_t_handler (vnm, mp);
+
+ rv = (rv == 0) ? vnm->api_errno : rv;
+
+ REPLY_MACRO (VL_API_MPLS_ROUTE_ADD_DEL_REPLY);
+}
+
+static int
+mpls_ip_bind_unbind_handler (vnet_main_t * vnm,
+ vl_api_mpls_ip_bind_unbind_t * mp)
+{
+ u32 mpls_fib_index, ip_fib_index;
+
+ mpls_fib_index =
+ fib_table_find (FIB_PROTOCOL_MPLS, ntohl (mp->mb_mpls_table_id));
+
+ if (~0 == mpls_fib_index)
+ {
+ if (mp->mb_create_table_if_needed)
+ {
+ mpls_fib_index =
+ fib_table_find_or_create_and_lock (FIB_PROTOCOL_MPLS,
+ ntohl (mp->mb_mpls_table_id));
+ }
+ else
+ return VNET_API_ERROR_NO_SUCH_FIB;
+ }
+
+ ip_fib_index = fib_table_find ((mp->mb_is_ip4 ?
+ FIB_PROTOCOL_IP4 :
+ FIB_PROTOCOL_IP6),
+ ntohl (mp->mb_ip_table_id));
+ if (~0 == ip_fib_index)
+ return VNET_API_ERROR_NO_SUCH_FIB;
+
+ fib_prefix_t pfx = {
+ .fp_len = mp->mb_address_length,
+ };
+
+ if (mp->mb_is_ip4)
+ {
+ pfx.fp_proto = FIB_PROTOCOL_IP4;
+ clib_memcpy (&pfx.fp_addr.ip4, mp->mb_address,
+ sizeof (pfx.fp_addr.ip4));
+ }
+ else
+ {
+ pfx.fp_proto = FIB_PROTOCOL_IP6;
+ clib_memcpy (&pfx.fp_addr.ip6, mp->mb_address,
+ sizeof (pfx.fp_addr.ip6));
+ }
+
+ if (mp->mb_is_bind)
+ fib_table_entry_local_label_add (ip_fib_index, &pfx,
+ ntohl (mp->mb_label));
+ else
+ fib_table_entry_local_label_remove (ip_fib_index, &pfx,
+ ntohl (mp->mb_label));
+
+ return (0);
+}
+
+void
+vl_api_mpls_ip_bind_unbind_t_handler (vl_api_mpls_ip_bind_unbind_t * mp)
+{
+ vl_api_mpls_route_add_del_reply_t *rmp;
+ vnet_main_t *vnm;
+ int rv;
+
+ vnm = vnet_get_main ();
+ vnm->api_errno = 0;
+
+ rv = mpls_ip_bind_unbind_handler (vnm, mp);
+
+ rv = (rv == 0) ? vnm->api_errno : rv;
+
+ REPLY_MACRO (VL_API_MPLS_ROUTE_ADD_DEL_REPLY);
+}
+
static void
vl_api_sw_interface_add_del_address_t_handler
(vl_api_sw_interface_add_del_address_t * mp)
@@ -2169,35 +2360,6 @@ out:
}
static void
-vl_api_mpls_gre_add_del_tunnel_t_handler (vl_api_mpls_gre_add_del_tunnel_t *
- mp)
-{
- vl_api_mpls_gre_add_del_tunnel_reply_t *rmp;
- int rv = 0;
- stats_main_t *sm = &stats_main;
- u32 tunnel_sw_if_index = ~0;
-
- dslock (sm, 1 /* release hint */ , 5 /* tag */ );
-
- rv = vnet_mpls_gre_add_del_tunnel ((ip4_address_t *) (mp->src_address),
- (ip4_address_t *) (mp->dst_address),
- (ip4_address_t *) (mp->intfc_address),
- (u32) (mp->intfc_address_length),
- ntohl (mp->inner_vrf_id),
- ntohl (mp->outer_vrf_id),
- &tunnel_sw_if_index,
- mp->l2_only, mp->is_add);
- dsunlock (sm);
-
- /* *INDENT-OFF* */
- REPLY_MACRO2(VL_API_MPLS_GRE_ADD_DEL_TUNNEL_REPLY,
- ({
- rmp->tunnel_sw_if_index = ntohl(tunnel_sw_if_index);
- }));
- /* *INDENT-ON* */
-}
-
-static void
vl_api_mpls_ethernet_add_del_tunnel_t_handler
(vl_api_mpls_ethernet_add_del_tunnel_t * mp)
{
@@ -2364,19 +2526,6 @@ vl_api_mpls_add_del_encap_t_handler (vl_api_mpls_add_del_encap_t * mp)
}
static void
-vl_api_mpls_add_del_decap_t_handler (vl_api_mpls_add_del_decap_t * mp)
-{
- vl_api_mpls_add_del_decap_reply_t *rmp;
- int rv;
-
- rv = vnet_mpls_add_del_decap (ntohl (mp->rx_vrf_id), ntohl (mp->tx_vrf_id),
- ntohl (mp->label), ntohl (mp->next_index),
- mp->s_bit, mp->is_add);
-
- REPLY_MACRO (VL_API_MPLS_ADD_DEL_DECAP_REPLY);
-}
-
-static void
vl_api_proxy_arp_add_del_t_handler (vl_api_proxy_arp_add_del_t * mp)
{
vl_api_proxy_arp_add_del_reply_t *rmp;
@@ -2967,9 +3116,6 @@ ip4_reset_fib_t_handler (vl_api_reset_fib_t * mp)
if (fib->table_id != target_fib_id)
continue;
- /* remove any mpls/gre tunnels in this fib */
- vnet_mpls_gre_delete_fib_tunnels (fib->table_id);
-
/* remove any mpls encap/decap labels */
mpls_fib_reset_labels (fib->table_id);
@@ -7387,41 +7533,40 @@ vl_api_netmap_delete_t_handler (vl_api_netmap_delete_t * mp)
}
static void
-vl_api_mpls_gre_tunnel_details_t_handler (vl_api_mpls_gre_tunnel_details_t *
+vl_api_mpls_eth_tunnel_details_t_handler (vl_api_mpls_eth_tunnel_details_t *
mp)
{
clib_warning ("BUG");
}
static void
-send_mpls_gre_tunnel_entry (vpe_api_main_t * am,
+send_mpls_eth_tunnel_entry (vpe_api_main_t * am,
unix_shared_memory_queue_t * q,
- mpls_gre_tunnel_t * gt, u32 index, u32 context)
+ mpls_eth_tunnel_t * et, u32 index, u32 context)
{
- vl_api_mpls_gre_tunnel_details_t *mp;
mpls_main_t *mm = &mpls_main;
mpls_encap_t *e;
int i;
u32 nlabels;
+ vl_api_mpls_eth_tunnel_details_t *mp;
- e = pool_elt_at_index (mm->encaps, gt->encap_index);
+ e = pool_elt_at_index (mm->encaps, et->encap_index);
nlabels = vec_len (e->labels);
mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MPLS_GRE_TUNNEL_DETAILS);
+ mp->_vl_msg_id = ntohs (VL_API_MPLS_ETH_TUNNEL_DETAILS);
mp->context = context;
mp->tunnel_index = htonl (index);
- mp->tunnel_src = gt->tunnel_src.as_u32;
- mp->tunnel_dst = gt->tunnel_dst.as_u32;
- mp->intfc_address = gt->intfc_address.as_u32;
- mp->mask_width = htonl (gt->mask_width);
- mp->inner_fib_index = htonl (gt->inner_fib_index);
- mp->outer_fib_index = htonl (gt->outer_fib_index);
- mp->encap_index = htonl (gt->encap_index);
- mp->hw_if_index = htonl (gt->hw_if_index);
- mp->l2_only = htonl (gt->l2_only);
+ memcpy (mp->tunnel_dst_mac, et->tunnel_dst, 6);
+ mp->intfc_address = et->intfc_address.as_u32;
+ mp->tx_sw_if_index = htonl (et->tx_sw_if_index);
+ mp->inner_fib_index = htonl (et->inner_fib_index);
+ mp->mask_width = htonl (et->mask_width);
+ mp->encap_index = htonl (et->encap_index);
+ mp->hw_if_index = htonl (et->hw_if_index);
+ mp->l2_only = htonl (et->l2_only);
mp->nlabels = htonl (nlabels);
for (i = 0; i < nlabels; i++)
@@ -7435,12 +7580,12 @@ send_mpls_gre_tunnel_entry (vpe_api_main_t * am,
}
static void
-vl_api_mpls_gre_tunnel_dump_t_handler (vl_api_mpls_gre_tunnel_dump_t * mp)
+vl_api_mpls_eth_tunnel_dump_t_handler (vl_api_mpls_eth_tunnel_dump_t * mp)
{
vpe_api_main_t *am = &vpe_api_main;
unix_shared_memory_queue_t *q;
mpls_main_t *mm = &mpls_main;
- mpls_gre_tunnel_t *gt;
+ mpls_eth_tunnel_t *et;
u32 index = ntohl (mp->tunnel_index);
q = vl_api_client_index_to_input_queue (mp->client_index);
@@ -7449,19 +7594,19 @@ vl_api_mpls_gre_tunnel_dump_t_handler (vl_api_mpls_gre_tunnel_dump_t * mp)
if (index != ~0)
{
- if (!pool_is_free_index (mm->gre_tunnels, index))
+ if (!pool_is_free_index (mm->eth_tunnels, index))
{
- gt = pool_elt_at_index (mm->gre_tunnels, index);
- send_mpls_gre_tunnel_entry (am, q, gt, gt - mm->gre_tunnels,
+ et = pool_elt_at_index (mm->eth_tunnels, index);
+ send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
mp->context);
}
}
else
{
/* *INDENT-OFF* */
- pool_foreach (gt, mm->gre_tunnels,
+ pool_foreach (et, mm->eth_tunnels,
({
- send_mpls_gre_tunnel_entry (am, q, gt, gt - mm->gre_tunnels,
+ send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
mp->context);
}));
/* *INDENT-ON* */
@@ -7469,84 +7614,71 @@ vl_api_mpls_gre_tunnel_dump_t_handler (vl_api_mpls_gre_tunnel_dump_t * mp)
}
static void
-vl_api_mpls_eth_tunnel_details_t_handler (vl_api_mpls_eth_tunnel_details_t *
- mp)
+vl_api_mpls_fib_details_t_handler (vl_api_mpls_fib_details_t * mp)
{
clib_warning ("BUG");
}
static void
-send_mpls_eth_tunnel_entry (vpe_api_main_t * am,
- unix_shared_memory_queue_t * q,
- mpls_eth_tunnel_t * et, u32 index, u32 context)
+send_mpls_fib_details (vpe_api_main_t * am,
+ unix_shared_memory_queue_t * q,
+ u32 table_id, u32 label, u32 eos, u32 context)
{
- mpls_main_t *mm = &mpls_main;
- mpls_encap_t *e;
- int i;
- u32 nlabels;
- vl_api_mpls_eth_tunnel_details_t *mp;
+ vl_api_mpls_fib_details_t *mp;
- e = pool_elt_at_index (mm->encaps, et->encap_index);
- nlabels = vec_len (e->labels);
-
- mp = vl_msg_api_alloc (sizeof (*mp) + nlabels * sizeof (u32));
+ mp = vl_msg_api_alloc (sizeof (*mp));
memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MPLS_ETH_TUNNEL_DETAILS);
+ mp->_vl_msg_id = ntohs (VL_API_MPLS_FIB_DETAILS);
mp->context = context;
- mp->tunnel_index = htonl (index);
- memcpy (mp->tunnel_dst_mac, et->tunnel_dst, 6);
- mp->intfc_address = et->intfc_address.as_u32;
- mp->tx_sw_if_index = htonl (et->tx_sw_if_index);
- mp->inner_fib_index = htonl (et->inner_fib_index);
- mp->mask_width = htonl (et->mask_width);
- mp->encap_index = htonl (et->encap_index);
- mp->hw_if_index = htonl (et->hw_if_index);
- mp->l2_only = htonl (et->l2_only);
- mp->nlabels = htonl (nlabels);
-
- for (i = 0; i < nlabels; i++)
- {
- mp->labels[i] =
- htonl (vnet_mpls_uc_get_label
- (clib_host_to_net_u32 (e->labels[i].label_exp_s_ttl)));
- }
+ mp->table_id = htonl (table_id);
+ mp->eos_bit = eos;
+ mp->label = htonl (label);
vl_msg_api_send_shmem (q, (u8 *) & mp);
}
static void
-vl_api_mpls_eth_tunnel_dump_t_handler (vl_api_mpls_eth_tunnel_dump_t * mp)
+vl_api_mpls_fib_dump_t_handler (vl_api_mpls_fib_dump_t * mp)
{
vpe_api_main_t *am = &vpe_api_main;
unix_shared_memory_queue_t *q;
mpls_main_t *mm = &mpls_main;
- mpls_eth_tunnel_t *et;
- u32 index = ntohl (mp->tunnel_index);
+ fib_table_t *fib_table;
+ fib_node_index_t lfei, *lfeip, *lfeis = NULL;
+ mpls_label_t key;
+ fib_prefix_t pfx;
+ u32 fib_index;
q = vl_api_client_index_to_input_queue (mp->client_index);
if (q == 0)
return;
- if (index != ~0)
- {
- if (!pool_is_free_index (mm->eth_tunnels, index))
- {
- et = pool_elt_at_index (mm->eth_tunnels, index);
- send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
- mp->context);
- }
- }
- else
- {
- /* *INDENT-OFF* */
- pool_foreach (et, mm->eth_tunnels,
- ({
- send_mpls_eth_tunnel_entry (am, q, et, et - mm->eth_tunnels,
- mp->context);
- }));
- /* *INDENT-ON* */
- }
+ /* *INDENT-OFF* */
+ pool_foreach (fib_table, mm->fibs,
+ ({
+ hash_foreach(key, lfei, fib_table->mpls.mf_entries,
+ ({
+ vec_add1(lfeis, lfei);
+ }));
+ }));
+ vec_sort_with_function(lfeis, fib_entry_cmp_for_sort);
+
+ vec_foreach(lfeip, lfeis)
+ {
+ fib_entry_get_prefix(*lfeip, &pfx);
+ fib_index = fib_entry_get_fib_index(*lfeip);
+
+ fib_table = fib_table_get(fib_index, pfx.fp_proto);
+
+ send_mpls_fib_details (am, q,
+ fib_table->ft_table_id,
+ pfx.fp_label,
+ pfx.fp_eos,
+ mp->context);
+ }
+
+ vec_free (lfeis);
}
static void
@@ -7643,108 +7775,6 @@ out:
}
static void
-vl_api_mpls_fib_decap_details_t_handler (vl_api_mpls_fib_decap_details_t * mp)
-{
- clib_warning ("BUG");
-}
-
-static void
-send_mpls_fib_decap_details (vpe_api_main_t * am,
- unix_shared_memory_queue_t * q,
- show_mpls_fib_t * s,
- u32 rx_table_id,
- u32 tx_table_id, char *swif_tag, u32 context)
-{
- vl_api_mpls_fib_decap_details_t *mp;
-
- mp = vl_msg_api_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MPLS_FIB_DECAP_DETAILS);
- mp->context = context;
-
- mp->fib_index = htonl (s->fib_index);
- mp->entry_index = htonl (s->entry_index);
- mp->dest = s->dest;
- mp->s_bit = htonl (s->s_bit);
- mp->label = htonl (s->label);
- mp->rx_table_id = htonl (rx_table_id);
- mp->tx_table_id = htonl (tx_table_id);
- strncpy ((char *) mp->swif_tag,
- (char *) swif_tag, ARRAY_LEN (mp->swif_tag) - 1);
-
- vl_msg_api_send_shmem (q, (u8 *) & mp);
-}
-
-static void
-vl_api_mpls_fib_decap_dump_t_handler (vl_api_mpls_fib_decap_dump_t * mp)
-{
- vpe_api_main_t *am = &vpe_api_main;
- unix_shared_memory_queue_t *q;
- vlib_main_t *vm = &vlib_global_main;
- u64 key;
- u32 value;
- show_mpls_fib_t *records = 0;
- show_mpls_fib_t *s;
- mpls_main_t *mm = &mpls_main;
- ip4_fib_t *rx_fib;
- ip4_fib_t *tx_fib;
- u32 tx_table_id;
- char *swif_tag;
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- return;
-
- /* *INDENT-OFF* */
- hash_foreach (key, value, mm->mpls_decap_by_rx_fib_and_label,
- ({
- vec_add2 (records, s, 1);
- s->fib_index = (u32)(key>>32);
- s->entry_index = (u32) value;
- s->label = ((u32) key)>>12;
- s->s_bit = (key & (1<<8)) != 0;
- }));
- /* *INDENT-ON* */
-
- if (!vec_len (records))
- {
- vlib_cli_output (vm, "MPLS decap table empty");
- goto out;
- }
-
- vec_sort_with_function (records, mpls_label_cmp);
- vlib_cli_output (vm, "MPLS decap table");
- vlib_cli_output (vm, "%=10s%=15s%=6s%=6s", "RX Table", "TX Table/Intfc",
- "Label", "S-bit");
- vec_foreach (s, records)
- {
- mpls_decap_t *d;
- d = pool_elt_at_index (mm->decaps, s->entry_index);
- if (d->next_index == MPLS_LOOKUP_NEXT_IP4_INPUT)
- {
- tx_fib = ip4_fib_get (d->tx_fib_index);
- tx_table_id = tx_fib->table_id;
- swif_tag = " ";
- }
- else
- {
- tx_table_id = d->tx_fib_index;
- swif_tag = "(i) ";
- }
- rx_fib = ip4_fib_get (s->fib_index);
-
- vlib_cli_output (vm, "%=10d%=10d%=5s%=6d%=6d", rx_fib->table_id,
- tx_table_id, swif_tag, s->label, s->s_bit);
-
- send_mpls_fib_decap_details (am, q, s, rx_fib->table_id,
- tx_table_id, swif_tag, mp->context);
- }
-
-out:
- vec_free (records);
-}
-
-static void
vl_api_classify_table_ids_t_handler (vl_api_classify_table_ids_t * mp)
{
unix_shared_memory_queue_t *q;
diff --git a/vpp/vpp-api/custom_dump.c b/vpp/vpp-api/custom_dump.c
index 887c9fc7459..cce6bb83853 100644
--- a/vpp/vpp-api/custom_dump.c
+++ b/vpp/vpp-api/custom_dump.c
@@ -477,8 +477,8 @@ static void *vl_api_ip_add_del_route_t_print
s = format (s, "via %U ", format_ip4_address, mp->next_hop_address);
}
- if (mp->vrf_id != 0)
- s = format (s, "vrf %d ", ntohl (mp->vrf_id));
+ if (mp->table_id != 0)
+ s = format (s, "vrf %d ", ntohl (mp->table_id));
if (mp->create_vrf_if_needed)
s = format (s, "create-vrf ");
@@ -498,8 +498,8 @@ static void *vl_api_ip_add_del_route_t_print
if (mp->is_multipath)
s = format (s, "multipath ");
- if (mp->lookup_in_vrf)
- s = format (s, "lookup-in-vrf %d ", ntohl (mp->lookup_in_vrf));
+ if (mp->next_hop_table_id)
+ s = format (s, "lookup-in-vrf %d ", ntohl (mp->next_hop_table_id));
FINISH;
}
@@ -537,30 +537,6 @@ static void *vl_api_proxy_arp_intfc_enable_disable_t_print
FINISH;
}
-static void *vl_api_mpls_add_del_decap_t_print
- (vl_api_mpls_add_del_decap_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: mpls_add_del_decap ");
-
- s = format (s, "rx_vrf_id %d ", ntohl (mp->rx_vrf_id));
-
- s = format (s, "tx_vrf_id %d ", ntohl (mp->tx_vrf_id));
-
- s = format (s, "label %d ", ntohl (mp->label));
-
- s = format (s, "next-index %d ", ntohl (mp->next_index));
-
- if (mp->s_bit == 0)
- s = format (s, "s-bit-clear ");
-
- if (mp->is_add == 0)
- s = format (s, "del ");
-
- FINISH;
-}
-
static void *vl_api_mpls_add_del_encap_t_print
(vl_api_mpls_add_del_encap_t * mp, void *handle)
{
@@ -582,33 +558,6 @@ static void *vl_api_mpls_add_del_encap_t_print
FINISH;
}
-static void *vl_api_mpls_gre_add_del_tunnel_t_print
- (vl_api_mpls_gre_add_del_tunnel_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: mpls_gre_add_del_tunnel ");
-
- s = format (s, "src %U ", format_ip4_address, mp->src_address);
-
- s = format (s, "dst %U ", format_ip4_address, mp->dst_address);
-
- s = format (s, "adj %U/%d ", format_ip4_address,
- (ip4_address_t *) mp->intfc_address, mp->intfc_address_length);
-
- s = format (s, "inner-vrf_id %d ", ntohl (mp->inner_vrf_id));
-
- s = format (s, "outer-vrf_id %d ", ntohl (mp->outer_vrf_id));
-
- if (mp->is_add == 0)
- s = format (s, "del ");
-
- if (mp->l2_only)
- s = format (s, "l2-only ");
-
- FINISH;
-}
-
static void *vl_api_mpls_ethernet_add_del_tunnel_t_print
(vl_api_mpls_ethernet_add_del_tunnel_t * mp, void *handle)
{
@@ -2060,18 +2009,6 @@ static void *vl_api_sw_interface_clear_stats_t_print
FINISH;
}
-static void *vl_api_mpls_gre_tunnel_dump_t_print
- (vl_api_mpls_gre_tunnel_dump_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: mpls_gre_tunnel_dump ");
-
- s = format (s, "tunnel_index %d ", ntohl (mp->tunnel_index));
-
- FINISH;
-}
-
static void *vl_api_mpls_eth_tunnel_dump_t_print
(vl_api_mpls_eth_tunnel_dump_t * mp, void *handle)
{
@@ -2094,8 +2031,8 @@ static void *vl_api_mpls_fib_encap_dump_t_print
FINISH;
}
-static void *vl_api_mpls_fib_decap_dump_t_print
- (vl_api_mpls_fib_decap_dump_t * mp, void *handle)
+static void *vl_api_mpls_fib_dump_t_print
+ (vl_api_mpls_fib_dump_t * mp, void *handle)
{
u8 *s;
@@ -2871,9 +2808,7 @@ _(SW_INTERFACE_TAP_DUMP, sw_interface_tap_dump) \
_(IP_ADD_DEL_ROUTE, ip_add_del_route) \
_(PROXY_ARP_ADD_DEL, proxy_arp_add_del) \
_(PROXY_ARP_INTFC_ENABLE_DISABLE, proxy_arp_intfc_enable_disable) \
-_(MPLS_ADD_DEL_DECAP, mpls_add_del_decap) \
_(MPLS_ADD_DEL_ENCAP, mpls_add_del_encap) \
-_(MPLS_GRE_ADD_DEL_TUNNEL, mpls_gre_add_del_tunnel) \
_(MPLS_ETHERNET_ADD_DEL_TUNNEL, mpls_ethernet_add_del_tunnel) \
_(MPLS_ETHERNET_ADD_DEL_TUNNEL_2, mpls_ethernet_add_del_tunnel_2) \
_(SW_INTERFACE_SET_UNNUMBERED, sw_interface_set_unnumbered) \
@@ -2951,10 +2886,9 @@ _(COP_WHITELIST_ENABLE_DISABLE, cop_whitelist_enable_disable) \
_(AF_PACKET_CREATE, af_packet_create) \
_(AF_PACKET_DELETE, af_packet_delete) \
_(SW_INTERFACE_CLEAR_STATS, sw_interface_clear_stats) \
-_(MPLS_GRE_TUNNEL_DUMP, mpls_gre_tunnel_dump) \
_(MPLS_ETH_TUNNEL_DUMP, mpls_eth_tunnel_dump) \
_(MPLS_FIB_ENCAP_DUMP, mpls_fib_encap_dump) \
-_(MPLS_FIB_DECAP_DUMP, mpls_fib_decap_dump) \
+_(MPLS_FIB_DUMP, mpls_fib_dump) \
_(CLASSIFY_TABLE_IDS,classify_table_ids) \
_(CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface) \
_(CLASSIFY_TABLE_INFO,classify_table_info) \
diff --git a/vpp/vpp-api/test_client.c b/vpp/vpp-api/test_client.c
index 8ca7a4b5651..d6192497268 100644
--- a/vpp/vpp-api/test_client.c
+++ b/vpp/vpp-api/test_client.c
@@ -225,26 +225,12 @@ vl_api_create_vlan_subif_reply_t_handler (vl_api_create_vlan_subif_reply_t *
}
static void
- vl_api_mpls_gre_add_del_tunnel_reply_t_handler
- (vl_api_mpls_gre_add_del_tunnel_reply_t * mp)
-{
- fformat (stdout, "add_del mpls gre tunnel reply %d\n", ntohl (mp->retval));
-}
-
-static void
vl_api_mpls_add_del_encap_reply_t_handler (vl_api_mpls_add_del_encap_reply_t *
mp)
{
fformat (stdout, "add del mpls label reply %d\n", ntohl (mp->retval));
}
-static void
-vl_api_mpls_add_del_decap_reply_t_handler (vl_api_mpls_add_del_decap_reply_t *
- mp)
-{
- fformat (stdout, "add del mpls decap label reply %d\n", ntohl (mp->retval));
-}
-
static void vl_api_proxy_arp_add_del_reply_t_handler
(vl_api_proxy_arp_add_del_reply_t * mp)
{
@@ -604,9 +590,7 @@ _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, sw_interface_add_del_address_reply) \
_(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
_(TAP_CONNECT_REPLY, tap_connect_reply) \
_(CREATE_VLAN_SUBIF_REPLY, create_vlan_subif_reply) \
-_(MPLS_GRE_ADD_DEL_TUNNEL_REPLY, mpls_gre_add_del_tunnel_reply) \
_(MPLS_ADD_DEL_ENCAP_REPLY, mpls_add_del_encap_reply) \
-_(MPLS_ADD_DEL_DECAP_REPLY, mpls_add_del_decap_reply) \
_(PROXY_ARP_ADD_DEL_REPLY, proxy_arp_add_del_reply) \
_(PROXY_ARP_INTFC_ENABLE_DISABLE_REPLY, proxy_arp_intfc_enable_disable_reply) \
_(IP_NEIGHBOR_ADD_DEL_REPLY, ip_neighbor_add_del_reply) \
@@ -751,7 +735,7 @@ add_del_ip4_route (test_main_t * tm, int enable_disable)
mp->_vl_msg_id = ntohs (VL_API_IP_ADD_DEL_ROUTE);
mp->client_index = tm->my_client_index;
mp->context = 0xdeadbeef;
- mp->vrf_id = ntohl (0);
+ mp->table_id = ntohl (0);
mp->create_vrf_if_needed = 1;
/* Arp, please, if needed */
mp->resolve_if_needed = 1;
@@ -916,63 +900,6 @@ create_vlan_subif (test_main_t * tm, u32 vlan_id)
}
void
-create_mpls_gre_tunnel (test_main_t * tm, u32 vrf_id, u32 label, u8 is_add)
-{
- vl_api_mpls_add_del_encap_t *lp;
- vl_api_mpls_add_del_decap_t *dlp;
- vl_api_mpls_gre_add_del_tunnel_t *mp;
- u32 tmp;
-
- dlp = vl_msg_api_alloc (sizeof (*dlp));
- memset (dlp, 0, sizeof (*dlp));
- dlp->_vl_msg_id = ntohs (VL_API_MPLS_ADD_DEL_DECAP);
- dlp->client_index = tm->my_client_index;
- dlp->context = 0xdeadbeef;
- dlp->tx_vrf_id = ntohl (vrf_id);
- dlp->label = ntohl (label);
- dlp->s_bit = 1;
- dlp->is_add = is_add;
- vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & dlp);
-
- lp = vl_msg_api_alloc (sizeof (*lp) + sizeof (u32));
- memset (lp, 0, sizeof (*lp) + sizeof (u32));
- lp->_vl_msg_id = ntohs (VL_API_MPLS_ADD_DEL_ENCAP);
- lp->client_index = tm->my_client_index;
- lp->context = 0xdeadbeef;
- lp->vrf_id = ntohl (vrf_id);
- lp->labels[0] = ntohl (label);
- lp->nlabels = 1;
- lp->is_add = is_add;
- /* dst: 5.0.0.1 */
- tmp = ntohl (0x05000001);
- clib_memcpy (lp->dst_address, &tmp, 4);
-
- vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & lp);
-
- mp = vl_msg_api_alloc (sizeof (*mp));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_MPLS_GRE_ADD_DEL_TUNNEL);
- mp->client_index = tm->my_client_index;
- mp->context = 0xdeadbeef;
- mp->inner_vrf_id = ntohl (vrf_id);
- mp->outer_vrf_id = 0;
- mp->is_add = is_add;
-
- /* src: 6.0.0.1 */
- tmp = ntohl (0x06000001);
- clib_memcpy (mp->src_address, &tmp, 4);
- /* dst: 5.0.0.1 */
- tmp = ntohl (0x05000001);
- clib_memcpy (mp->dst_address, &tmp, 4);
- /* intfc: 5.0.0.1/24 */
- tmp = ntohl (0x05000001);
- clib_memcpy (mp->intfc_address, &tmp, 4);
- mp->intfc_address_length = 24;
-
- vl_msg_api_send_shmem (tm->vl_input_queue, (u8 *) & mp);
-}
-
-void
add_del_proxy_arp (test_main_t * tm, int is_add)
{
vl_api_proxy_arp_add_del_t *mp;
@@ -1441,16 +1368,6 @@ main (int argc, char **argv)
connect_unix_tap (tm, "foo");
break;
- case 'M':
- create_mpls_gre_tunnel (tm, 11 /* fib */ , 123 /* label */ ,
- 1 /* is_add */ );
- break;
-
- case 'm':
- create_mpls_gre_tunnel (tm, 11 /* fib */ , 123 /* label */ ,
- 0 /* is_add */ );
- break;
-
case 'n':
add_ip4_neighbor (tm, 1 /* is_add */ );
add_ip6_neighbor (tm, 1 /* is_add */ );
diff --git a/vpp/vpp-api/vpe.api b/vpp/vpp-api/vpe.api
index 0fe9d200668..ac84bdc5cd5 100644
--- a/vpp/vpp-api/vpe.api
+++ b/vpp/vpp-api/vpe.api
@@ -367,6 +367,120 @@ define create_vlan_subif_reply
u32 sw_if_index;
};
+/** \brief MPLS Route Add / del route
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param mr_label - The MPLS label value
+ @param mr_eos - The End of stack bit
+ @param mr_table_id - The MPLS table-id the route is added in
+ @param mr_classify_table_index - If this is a classify route,
+ this is the classify table index
+ @param mr_create_table_if_needed - If the MPLS or IP tables do not exist,
+ create them
+ @param mr_is_add - Is this a route add or delete
+ @param mr_is_classify - Is this route result a classify
+ @param mr_is_multipath - Is this route update a multipath - i.e. is this
+ a path addition to an existing route
+ @param mr_is_resolve_host - Recurse resolution constraint via a host prefix
+ @param mr_is_resolve_attached - Recurse resolution constraint via attached prefix
+ @param mr_next_hop_proto_is_ip4 - The next-hop is IPV4
+ @param mr_next_hop_weight - The weight, for UCMP
+ @param mr_next_hop[16] - the nextop address
+ @param mr_next_hop_sw_if_index - the next-hop SW interface
+ @param mr_next_hop_table_id - the next-hop table-id (if appropriate)
+ @param mr_next_hop_out_label - the next-hop output label
+*/
+define mpls_route_add_del
+{
+ u32 client_index;
+ u32 context;
+ u32 mr_label;
+ u8 mr_eos;
+ u32 mr_table_id;
+ u32 mr_classify_table_index;
+ u8 mr_create_table_if_needed;
+ u8 mr_is_add;
+ u8 mr_is_classify;
+ u8 mr_is_multipath;
+ u8 mr_is_resolve_host;
+ u8 mr_is_resolve_attached;
+ u8 mr_next_hop_proto_is_ip4;
+ u8 mr_next_hop_weight;
+ u8 mr_next_hop[16];
+ u32 mr_next_hop_sw_if_index;
+ u32 mr_next_hop_table_id;
+ u32 mr_next_hop_out_label;
+};
+
+/** \brief Reply for MPLS route add / del request
+ @param context - returned sender context, to match reply w/ request
+ @param retval - return code
+*/
+define mpls_route_add_del_reply
+{
+ u32 context;
+ i32 retval;
+};
+
+/** \brief Dump MPLS fib table
+ @param client_index - opaque cookie to identify the sender
+*/
+define mpls_fib_dump
+{
+ u32 client_index;
+ u32 context;
+};
+
+/** \brief mpls FIB table response
+ @param table_id - MPLS fib table id
+ @param s_bit - End-of-stack bit
+ @param label - MPLS label value
+*/
+define mpls_fib_details
+{
+ u32 context;
+ u32 table_id;
+ u8 eos_bit;
+ u32 label;
+};
+
+/** \brief Bind/Unbind an MPLS local label to an IP prefix. i.e. create
+ a per-prefix label entry.
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param mb_mpls_table_id - The MPLS table-id the MPLS entry will be added in
+ @param mb_label - The MPLS label value to bind
+ @param mb_ip_table_id - The IP table-id of the IP prefix to bind to.
+ @param mb_create_table_if_needed - Create either/both tables if required.
+ @param mb_is_bind - Bind or unbind
+ @param mb_is_ip4 - The prefix to bind to is IPv4
+ @param mb_address_length - Length of IP prefix
+ @param mb_address[16] - IP prefix/
+*/
+define mpls_ip_bind_unbind
+{
+ u32 client_index;
+ u32 context;
+ u32 mb_mpls_table_id;
+ u32 mb_label;
+ u32 mb_ip_table_id;
+ u8 mb_create_table_if_needed;
+ u8 mb_is_bind;
+ u8 mb_is_ip4;
+ u8 mb_address_length;
+ u8 mb_address[16];
+};
+
+/** \brief Reply for MPLS IP bind/unbind request
+ @param context - returned sender context, to match reply w/ request
+ @param retval - return code
+*/
+define mpls_ip_bind_unbind_reply
+{
+ u32 context;
+ i32 retval;
+};
+
/** \brief Add / del route request
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@@ -394,10 +508,11 @@ define ip_add_del_route
u32 client_index;
u32 context;
u32 next_hop_sw_if_index;
- u32 vrf_id;
- u32 lookup_in_vrf;
+ u32 table_id;
u32 resolve_attempts;
u32 classify_table_index;
+ u32 next_hop_out_label;
+ u32 next_hop_table_id;
u8 create_vrf_if_needed;
u8 resolve_if_needed;
u8 is_add;
@@ -426,44 +541,6 @@ define ip_add_del_route_reply
i32 retval;
};
-/* works */
-/** \brief Add / del gre tunnel request
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param sw_if_index - software index of the new vlan's parent interface
- @param inner_vrf_id -
- @param outer_vrf_id -
- @param is_add - 1 if adding the tunnel, 0 if deleting
- @param src_address[4] - tunnel source address
- @param dst_address[4] - tunnel destination address
- @param intf_address -
- @param intf_address_length -
-*/
-define mpls_gre_add_del_tunnel
-{
- u32 client_index;
- u32 context;
- u32 inner_vrf_id;
- u32 outer_vrf_id;
- u8 is_add;
- u8 l2_only;
- u8 src_address[4];
- u8 dst_address[4];
- u8 intfc_address[4];
- u8 intfc_address_length;
-};
-
-/** \brief Reply for add / del tunnel request
- @param context - returned sender context, to match reply w/ request
- @param retval - return code
-*/
-define mpls_gre_add_del_tunnel_reply
-{
- u32 context;
- i32 retval;
- u32 tunnel_sw_if_index;
-};
-
/** \brief Add / del MPLS encapsulation request
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@@ -495,38 +572,6 @@ define mpls_add_del_encap_reply
i32 retval;
};
-/** \brief Add / del MPLS decapsulation request
- @param client_index - opaque cookie to identify the sender
- @param context - sender context, to match reply w/ request
- @param rx_vrf_id - receive vrf
- @param tx_vrf_id - transmit vrf
- @param label -
- @param next_index -
- @param s_bit -
- @param is_add - 1 if adding the encap, 0 if deleting
-*/
-define mpls_add_del_decap
-{
- u32 client_index;
- u32 context;
- u32 rx_vrf_id;
- u32 tx_vrf_id;
- u32 label;
- u32 next_index;
- u8 s_bit;
- u8 is_add;
-};
-
-/** \brief Reply for MPLS decap add / del request
- @param context - returned sender context, to match reply w/ request
- @param retval - return code
-*/
-define mpls_add_del_decap_reply
-{
- u32 context;
- i32 retval;
-};
-
/** \brief Proxy ARP add / del request
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request
@@ -4522,40 +4567,6 @@ define mpls_fib_encap_details
u32 labels[nlabels];
};
-/** \brief Dump mpls fib decap table
- @param client_index - opaque cookie to identify the sender
- @param fib_index - mpls fib entry identifier or -1 in case of all entries
-*/
-define mpls_fib_decap_dump
-{
- u32 client_index;
- u32 context;
-};
-
-/** \brief mpls fib decap table response
- @param fib_index - fib table id
- @param entry_index - reference to mpls label table
- @param dest - destination ipv4 addr
- @param s_bit -
- @param label - mpls labels
- @param rx_table_id - rx fib id
- @param tx_table_id - tx fib id
- @param swif_tag -
-*/
-define mpls_fib_decap_details
-{
- u32 context;
-
- u32 fib_index;
- u32 entry_index;
- u32 dest;
- u32 s_bit;
- u32 label;
- u32 rx_table_id;
- u32 tx_table_id;
- u8 swif_tag[8];
-};
-
/** \brief Classify get table IDs request
@param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request