aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ipip/ipip_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet/ipip/ipip_api.c')
-rw-r--r--src/vnet/ipip/ipip_api.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/src/vnet/ipip/ipip_api.c b/src/vnet/ipip/ipip_api.c
index 455792ba133..b3fc0817a85 100644
--- a/src/vnet/ipip/ipip_api.c
+++ b/src/vnet/ipip/ipip_api.c
@@ -51,7 +51,7 @@ vl_api_ipip_add_tunnel_t_handler (vl_api_ipip_add_tunnel_t * mp)
{
vl_api_ipip_add_tunnel_reply_t *rmp;
int rv = 0;
- u32 sw_if_index = ~0;
+ u32 fib_index, sw_if_index = ~0;
ip46_address_t src = ip46_address_initializer, dst =
ip46_address_initializer;
@@ -67,13 +67,27 @@ vl_api_ipip_add_tunnel_t_handler (vl_api_ipip_add_tunnel_t * mp)
clib_memcpy (&dst.ip4, mp->dst_address, 4);
}
- rv = ipip_add_tunnel (mp->is_ipv6 ? IPIP_TRANSPORT_IP6 : IPIP_TRANSPORT_IP4,
- ntohl (mp->instance), &src, &dst,
- ntohl (mp->fib_index), mp->tc_tos, &sw_if_index);
+ fib_index =
+ fib_table_find (fib_ip_proto (mp->is_ipv6), ntohl (mp->table_id));
+
+ if (~0 == fib_index)
+ {
+ rv = VNET_API_ERROR_NO_SUCH_FIB;
+ }
+ else
+ {
+ rv = ipip_add_tunnel ((mp->is_ipv6 ?
+ IPIP_TRANSPORT_IP6 :
+ IPIP_TRANSPORT_IP4),
+ ntohl (mp->instance), &src, &dst,
+ fib_index, mp->tc_tos, &sw_if_index);
+ }
/* *INDENT-OFF* */
REPLY_MACRO2(VL_API_IPIP_ADD_TUNNEL_REPLY,
- ({ rmp->sw_if_index = ntohl(sw_if_index); }));
+ ({
+ rmp->sw_if_index = ntohl(sw_if_index);
+ }));
/* *INDENT-ON* */
}
@@ -153,21 +167,35 @@ static void
vl_api_ipip_6rd_add_tunnel_t_handler (vl_api_ipip_6rd_add_tunnel_t * mp)
{
vl_api_ipip_6rd_add_tunnel_reply_t *rmp;
- u32 sixrd_tunnel_index;
+ u32 sixrd_tunnel_index, ip4_fib_index, ip6_fib_index;
+ int rv;
+
+ ip4_fib_index = fib_table_find (FIB_PROTOCOL_IP4, ntohl (mp->ip4_table_id));
+ ip6_fib_index = fib_table_find (FIB_PROTOCOL_IP6, ntohl (mp->ip6_table_id));
+
+ if (~0 == ip4_fib_index || ~0 == ip6_fib_index)
- int rv = sixrd_add_tunnel ((ip6_address_t *) & mp->ip6_prefix,
+ {
+ rv = VNET_API_ERROR_NO_SUCH_FIB;
+ }
+ else
+ {
+ rv = sixrd_add_tunnel ((ip6_address_t *) & mp->ip6_prefix,
mp->ip6_prefix_len,
(ip4_address_t *) & mp->ip4_prefix,
mp->ip4_prefix_len,
(ip4_address_t *) & mp->ip4_src,
mp->security_check,
- ntohl (mp->fib_index), &sixrd_tunnel_index);
+ ip4_fib_index, ip6_fib_index,
+ &sixrd_tunnel_index);
+ }
- REPLY_MACRO2 (VL_API_IPIP_6RD_ADD_TUNNEL_REPLY, (
- {
- rmp->sw_if_index =
- htonl
- (sixrd_tunnel_index);}));
+ /* *INDENT-OFF* */
+ REPLY_MACRO2 (VL_API_IPIP_6RD_ADD_TUNNEL_REPLY,
+ ({
+ rmp->sw_if_index = htonl (sixrd_tunnel_index);
+ }));
+ /* *INDENT-ON* */
}
static void