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