From 8b5c75ca40d965d4e1bed10ff2f7d5ab2d1076aa Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Sun, 4 Aug 2019 03:30:56 -0700 Subject: ip tests: Fixes and UT for MPLS 6PE Type: fix Change-Id: I48650473591aa181167cf3a86ed2f5da58a81072 Signed-off-by: Neale Ranns --- src/vnet/ip/ip.api | 2 ++ src/vnet/ip/ip_api.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api index 39d394f709d..c4ef626e2fb 100644 --- a/src/vnet/ip/ip.api +++ b/src/vnet/ip/ip.api @@ -384,6 +384,8 @@ autoreply define sw_interface_ip6_enable_disable are used for forwarding. lower value is better. @param next_hop_id - Used when the path resolves via an object that has a unique identifier. + @param next_hop_proto - The protocol of the next-hop (address) + 0=use same AF as the route, 1=IPv4, 2=IPv6 @param dst_address_length - @param dst_address[16] - @param next_hop_address[16] - diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index ce3456d77d9..7a6e6fe8501 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -1025,7 +1025,8 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, { u32 fib_index, next_hop_fib_index; fib_mpls_label_t *label_stack = NULL; - int rv, ii, n_labels;; + dpo_proto_t nh_proto; + int rv, ii, n_labels; rv = add_del_route_check (FIB_PROTOCOL_IP4, mp->table_id, @@ -1044,8 +1045,18 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, clib_memcpy (&pfx.fp_addr.ip4, mp->dst_address, sizeof (pfx.fp_addr.ip4)); ip46_address_t nh; - clib_memset (&nh, 0, sizeof (nh)); - memcpy (&nh.ip4, mp->next_hop_address, sizeof (nh.ip4)); + + if (0 == mp->next_hop_proto || 1 == mp->next_hop_proto) + { + clib_memset (&nh, 0, sizeof (nh)); + memcpy (&nh.ip4, mp->next_hop_address, sizeof (nh.ip4)); + nh_proto = DPO_PROTO_IP4; + } + else + { + memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6)); + nh_proto = DPO_PROTO_IP6; + } n_labels = mp->next_hop_n_out_labels; if (n_labels == 0) @@ -1078,7 +1089,7 @@ ip4_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, mp->is_dvr, mp->is_source_lookup, mp->is_udp_encap, - fib_index, &pfx, DPO_PROTO_IP4, + fib_index, &pfx, nh_proto, &nh, ntohl (mp->next_hop_id), ntohl (mp->next_hop_sw_if_index), @@ -1099,7 +1110,8 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, { fib_mpls_label_t *label_stack = NULL; u32 fib_index, next_hop_fib_index; - int rv, ii, n_labels;; + dpo_proto_t nh_proto; + int rv, ii, n_labels; rv = add_del_route_check (FIB_PROTOCOL_IP6, mp->table_id, @@ -1118,8 +1130,18 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, clib_memcpy (&pfx.fp_addr.ip6, mp->dst_address, sizeof (pfx.fp_addr.ip6)); ip46_address_t nh; - clib_memset (&nh, 0, sizeof (nh)); - memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6)); + + if (1 == mp->next_hop_proto) + { + clib_memset (&nh, 0, sizeof (nh)); + memcpy (&nh.ip4, mp->next_hop_address, sizeof (nh.ip4)); + nh_proto = DPO_PROTO_IP4; + } + else + { + memcpy (&nh.ip6, mp->next_hop_address, sizeof (nh.ip6)); + nh_proto = DPO_PROTO_IP6; + } n_labels = mp->next_hop_n_out_labels; if (n_labels == 0) @@ -1152,7 +1174,7 @@ ip6_add_del_route_t_handler (vl_api_ip_add_del_route_t * mp, mp->is_dvr, mp->is_source_lookup, mp->is_udp_encap, - fib_index, &pfx, DPO_PROTO_IP6, + fib_index, &pfx, nh_proto, &nh, ntohl (mp->next_hop_id), ntohl (mp->next_hop_sw_if_index), next_hop_fib_index, -- cgit 1.2.3-korg