VPP crash on creating vxlan gpe interface. VPP-875

Change-Id: I6b19634ecb03860a7624d9408e09b52e95f47aef
Signed-off-by: Hongjun Ni <hongjun.ni@intel.com>
This commit is contained in:
Hongjun Ni
2017-06-23 00:18:40 +08:00
committed by Damjan Marion
parent fcfa38d680
commit 04ffd0ad83
5 changed files with 118 additions and 19 deletions
+97 -11
View File
@@ -1795,6 +1795,40 @@ static void vl_api_vxlan_add_del_tunnel_reply_t_handler_json
vam->result_ready = 1;
}
static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler
(vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
{
vat_main_t *vam = &vat_main;
i32 retval = ntohl (mp->retval);
if (vam->async_mode)
{
vam->async_errors += (retval < 0);
}
else
{
vam->retval = retval;
vam->sw_if_index = ntohl (mp->sw_if_index);
vam->result_ready = 1;
}
}
static void vl_api_vxlan_gpe_add_del_tunnel_reply_t_handler_json
(vl_api_vxlan_gpe_add_del_tunnel_reply_t * mp)
{
vat_main_t *vam = &vat_main;
vat_json_node_t node;
vat_json_init_object (&node);
vat_json_object_add_int (&node, "retval", ntohl (mp->retval));
vat_json_object_add_uint (&node, "sw_if_index", ntohl (mp->sw_if_index));
vat_json_print (vam->ofp, &node);
vat_json_free (&node);
vam->retval = ntohl (mp->retval);
vam->result_ready = 1;
}
static void vl_api_gre_add_del_tunnel_reply_t_handler
(vl_api_gre_add_del_tunnel_reply_t * mp)
{
@@ -4480,6 +4514,7 @@ _(sw_interface_set_table_reply) \
_(sw_interface_set_mpls_enable_reply) \
_(sw_interface_set_vpath_reply) \
_(sw_interface_set_vxlan_bypass_reply) \
_(sw_interface_set_vxlan_gpe_bypass_reply) \
_(sw_interface_set_l2_bridge_reply) \
_(bridge_domain_add_del_reply) \
_(sw_interface_set_l2_xconnect_reply) \
@@ -4578,7 +4613,6 @@ _(gpe_enable_disable_reply) \
_(gpe_set_encap_mode_reply) \
_(gpe_add_del_iface_reply) \
_(gpe_add_del_native_fwd_rpath_reply) \
_(vxlan_gpe_add_del_tunnel_reply) \
_(af_packet_delete_reply) \
_(policer_classify_set_interface_reply) \
_(netmap_create_reply) \
@@ -4651,6 +4685,7 @@ _(SW_INTERFACE_SET_TABLE_REPLY, sw_interface_set_table_reply) \
_(SW_INTERFACE_SET_MPLS_ENABLE_REPLY, sw_interface_set_mpls_enable_reply) \
_(SW_INTERFACE_SET_VPATH_REPLY, sw_interface_set_vpath_reply) \
_(SW_INTERFACE_SET_VXLAN_BYPASS_REPLY, sw_interface_set_vxlan_bypass_reply) \
_(SW_INTERFACE_SET_VXLAN_GPE_BYPASS_REPLY, sw_interface_set_vxlan_gpe_bypass_reply) \
_(SW_INTERFACE_SET_L2_XCONNECT_REPLY, \
sw_interface_set_l2_xconnect_reply) \
_(SW_INTERFACE_SET_L2_BRIDGE_REPLY, \
@@ -6039,6 +6074,7 @@ api_sw_interface_set_vxlan_bypass (vat_main_t * vam)
return ret;
}
static int
api_sw_interface_set_l2_xconnect (vat_main_t * vam)
{
@@ -12002,6 +12038,8 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
u8 ipv4_set = 0, ipv6_set = 0;
u8 local_set = 0;
u8 remote_set = 0;
u8 grp_set = 0;
u32 mcast_sw_if_index = ~0;
u32 encap_vrf_id = 0;
u32 decap_vrf_id = 0;
u8 protocol = ~0;
@@ -12009,6 +12047,12 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
u8 vni_set = 0;
int ret;
/* Can't "universally zero init" (={0}) due to GCC bug 53119 */
memset (&local4, 0, sizeof local4);
memset (&remote4, 0, sizeof remote4);
memset (&local6, 0, sizeof local6);
memset (&remote6, 0, sizeof remote6);
while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
{
if (unformat (line_input, "del"))
@@ -12037,6 +12081,35 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
remote_set = 1;
ipv6_set = 1;
}
else if (unformat (line_input, "group %U %U",
unformat_ip4_address, &remote4,
api_unformat_sw_if_index, vam, &mcast_sw_if_index))
{
grp_set = remote_set = 1;
ipv4_set = 1;
}
else if (unformat (line_input, "group %U",
unformat_ip4_address, &remote4))
{
grp_set = remote_set = 1;
ipv4_set = 1;
}
else if (unformat (line_input, "group %U %U",
unformat_ip6_address, &remote6,
api_unformat_sw_if_index, vam, &mcast_sw_if_index))
{
grp_set = remote_set = 1;
ipv6_set = 1;
}
else if (unformat (line_input, "group %U",
unformat_ip6_address, &remote6))
{
grp_set = remote_set = 1;
ipv6_set = 1;
}
else
if (unformat (line_input, "mcast_sw_if_index %u", &mcast_sw_if_index))
;
else if (unformat (line_input, "encap-vrf-id %d", &encap_vrf_id))
;
else if (unformat (line_input, "decap-vrf-id %d", &decap_vrf_id))
@@ -12068,6 +12141,11 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
errmsg ("tunnel remote address not specified");
return -99;
}
if (grp_set && mcast_sw_if_index == ~0)
{
errmsg ("tunnel nonexistent multicast device");
return -99;
}
if (ipv4_set && ipv6_set)
{
errmsg ("both IPv4 and IPv6 addresses specified");
@@ -12094,6 +12172,7 @@ api_vxlan_gpe_add_del_tunnel (vat_main_t * vam)
clib_memcpy (&mp->remote, &remote4, sizeof (remote4));
}
mp->mcast_sw_if_index = ntohl (mcast_sw_if_index);
mp->encap_vrf_id = ntohl (encap_vrf_id);
mp->decap_vrf_id = ntohl (decap_vrf_id);
mp->protocol = protocol;
@@ -12110,16 +12189,19 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler
(vl_api_vxlan_gpe_tunnel_details_t * mp)
{
vat_main_t *vam = &vat_main;
ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
print (vam->ofp, "%11d%24U%24U%13d%12d%14d%14d",
print (vam->ofp, "%11d%24U%24U%13d%12d%19d%14d%14d",
ntohl (mp->sw_if_index),
format_ip46_address, &(mp->local[0]),
format_ip46_address, &(mp->remote[0]),
ntohl (mp->vni),
ntohl (mp->protocol),
format_ip46_address, &local, IP46_TYPE_ANY,
format_ip46_address, &remote, IP46_TYPE_ANY,
ntohl (mp->vni), mp->protocol,
ntohl (mp->mcast_sw_if_index),
ntohl (mp->encap_vrf_id), ntohl (mp->decap_vrf_id));
}
static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
(vl_api_vxlan_gpe_tunnel_details_t * mp)
{
@@ -12153,6 +12235,8 @@ static void vl_api_vxlan_gpe_tunnel_details_t_handler_json
}
vat_json_object_add_uint (node, "vni", ntohl (mp->vni));
vat_json_object_add_uint (node, "protocol", ntohl (mp->protocol));
vat_json_object_add_uint (node, "mcast_sw_if_index",
ntohl (mp->mcast_sw_if_index));
vat_json_object_add_uint (node, "encap_vrf_id", ntohl (mp->encap_vrf_id));
vat_json_object_add_uint (node, "decap_vrf_id", ntohl (mp->decap_vrf_id));
vat_json_object_add_uint (node, "is_ipv6", mp->is_ipv6 ? 1 : 0);
@@ -12184,9 +12268,9 @@ api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
if (!vam->json_output)
{
print (vam->ofp, "%11s%24s%24s%13s%15s%14s%14s",
print (vam->ofp, "%11s%24s%24s%13s%15s%19s%14s%14s",
"sw_if_index", "local", "remote", "vni",
"protocol", "encap_vrf_id", "decap_vrf_id");
"protocol", "mcast_sw_if_index", "encap_vrf_id", "decap_vrf_id");
}
/* Get list of vxlan-tunnel interfaces */
@@ -12204,6 +12288,7 @@ api_vxlan_gpe_tunnel_dump (vat_main_t * vam)
return ret;
}
u8 *
format_l2_fib_mac_address (u8 * s, va_list * args)
{
@@ -19673,9 +19758,10 @@ _(delete_vhost_user_if, "<intfc> | sw_if_index <nn>") \
_(sw_interface_vhost_user_dump, "") \
_(show_version, "") \
_(vxlan_gpe_add_del_tunnel, \
"local <addr> remote <addr> vni <nn>\n" \
"[encap-vrf-id <nn>] [decap-vrf-id <nn>] [next-ip4][next-ip6]" \
"[next-ethernet] [next-nsh]\n") \
"local <addr> remote <addr> | group <mcast-ip-addr>\n" \
"{ <intfc> | mcast_sw_if_index <nn> } }\n" \
"vni <nn> [encap-vrf-id <nn>] [decap-vrf-id <nn>]\n" \
"[next-ip4][next-ip6][next-ethernet] [next-nsh] [del]\n") \
_(vxlan_gpe_tunnel_dump, "[<intfc> | sw_if_index <nn>]") \
_(l2_fib_table_dump, "bd_id <bridge-domain-id>") \
_(interface_name_renumber, \
-1
View File
@@ -53,7 +53,6 @@ define vxlan_gpe_tunnel_details
u32 mcast_sw_if_index;
u32 encap_vrf_id;
u32 decap_vrf_id;
u8 is_ipv6;
};
+3
View File
@@ -83,6 +83,9 @@ u8 * format_vxlan_gpe_tunnel (u8 * s, va_list * args)
s = format (s, "next-protocol unknown %d", t->protocol);
}
if (ip46_address_is_multicast (&t->remote))
s = format (s, "mcast_sw_if_index %d ", t->mcast_sw_if_index);
s = format (s, " fibs: (encap %d, decap %d)",
t->encap_fib_index,
t->decap_fib_index);
+8 -5
View File
@@ -47,7 +47,7 @@
#define foreach_vpe_api_msg \
_(SW_INTERFACE_SET_VXLAN_GPE_BYPASS, sw_interface_set_vxlan_gpe_bypass) \
_(VXLAN_GPE_ADD_DEL_TUNNEL, vxlan_gpe_add_del_tunnel) \
_(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump) \
_(VXLAN_GPE_TUNNEL_DUMP, vxlan_gpe_tunnel_dump)
static void
vl_api_sw_interface_set_vxlan_gpe_bypass_t_handler
@@ -156,15 +156,15 @@ static void send_vxlan_gpe_tunnel_details
rmp->_vl_msg_id = ntohs (VL_API_VXLAN_GPE_TUNNEL_DETAILS);
if (is_ipv6)
{
memcpy (rmp->local, &(t->local.ip6), 16);
memcpy (rmp->remote, &(t->remote.ip6), 16);
memcpy (rmp->local, &(t->local.ip6.as_u8), 16);
memcpy (rmp->remote, &(t->remote.ip6.as_u8), 16);
rmp->encap_vrf_id = htonl (im6->fibs[t->encap_fib_index].ft_table_id);
rmp->decap_vrf_id = htonl (im6->fibs[t->decap_fib_index].ft_table_id);
}
else
{
memcpy (rmp->local, &(t->local.ip4), 4);
memcpy (rmp->remote, &(t->remote.ip4), 4);
memcpy (rmp->local, &(t->local.ip4.as_u8), 4);
memcpy (rmp->remote, &(t->remote.ip4.as_u8), 4);
rmp->encap_vrf_id = htonl (im4->fibs[t->encap_fib_index].ft_table_id);
rmp->decap_vrf_id = htonl (im4->fibs[t->decap_fib_index].ft_table_id);
}
@@ -250,6 +250,9 @@ vxlan_gpe_api_hookup (vlib_main_t * vm)
foreach_vpe_api_msg;
#undef _
am->api_trace_cfg[VL_API_VXLAN_GPE_ADD_DEL_TUNNEL].size +=
17 * sizeof (u32);
/*
* Set up the (msg_name, crc, message-id) table
*/
+10 -2
View File
@@ -1703,10 +1703,18 @@ static void *vl_api_vxlan_gpe_add_del_tunnel_t_print
s = format (0, "SCRIPT: vxlan_gpe_add_del_tunnel ");
s = format (s, "local %U ", format_ip46_address, &mp->local, mp->is_ipv6);
ip46_address_t local = to_ip46 (mp->is_ipv6, mp->local);
ip46_address_t remote = to_ip46 (mp->is_ipv6, mp->remote);
s = format (s, "remote %U ", format_ip46_address, &mp->remote, mp->is_ipv6);
u8 is_grp = ip46_address_is_multicast (&remote);
char *remote_name = is_grp ? "group" : "remote";
s = format (s, "local %U ", format_ip46_address, &local, IP46_TYPE_ANY);
s = format (s, "%s %U ", remote_name, format_ip46_address,
&remote, IP46_TYPE_ANY);
if (is_grp)
s = format (s, "mcast_sw_if_index %d ", ntohl (mp->mcast_sw_if_index));
s = format (s, "protocol %d ", ntohl (mp->protocol));
s = format (s, "vni %d ", ntohl (mp->vni));