summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vnet/ip/ip.api2
-rw-r--r--src/vnet/ip/ip_api.c38
2 files changed, 32 insertions, 8 deletions
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,