From 95d67c683df6b5a1e1682cd11458154660395ae3 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 11 Dec 2015 13:28:34 +0100 Subject: [PATCH] platform/tests: ignore failure of iproute2 command for adding vxlan interface Older version of iproute2 fail to add the vxlan (e.g. on Ubuntu 12.04) Running command: ip link add nm-test-device type vxlan id 42 dev nm-test-parent local 23.1.2.164 group 239.1.2.134 ttl 0 tos 00 dstport 4789 srcport 0 0 ageing 1245 Garbage instead of arguments "id ...". Try "ip link help". Fallback using only platform. --- src/platform/tests/test-common.c | 52 ++++++++++++++++++++------------ src/platform/tests/test-common.h | 6 ++-- src/platform/tests/test-link.c | 3 +- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c index 1d9afa82f9..a62f6d5e9f 100644 --- a/src/platform/tests/test-common.c +++ b/src/platform/tests/test-common.c @@ -861,10 +861,14 @@ nmtstp_link_sit_add (gboolean external_command, const char *name, NMPlatformLnkS return success; } -gboolean -nmtstp_link_vxlan_add (gboolean external_command, const char *name, NMPlatformLnkVxlan *lnk) +const NMPlatformLink * +nmtstp_link_vxlan_add (gboolean external_command, const char *name, const NMPlatformLnkVxlan *lnk) { - gboolean success; + const NMPlatformLink *pllink = NULL; + NMPlatformError plerr; + int err; + + g_assert (nm_utils_iface_valid_name (name)); external_command = nmtstp_run_command_check_external (external_command); @@ -885,23 +889,33 @@ nmtstp_link_vxlan_add (gboolean external_command, const char *name, NMPlatformLn else if (memcmp (&lnk->group6, &in6addr_any, sizeof (in6addr_any))) remote = g_strdup_printf ("%s", nm_utils_inet6_ntop (&lnk->group6, NULL)); - success = !nmtstp_run_command ("ip link add %s type vxlan id %u %s local %s group %s ttl %u tos %02x dstport %u srcport %u %u ageing %u", - name, - lnk->id, - dev ? dev : "", - local, - remote, - lnk->ttl, - lnk->tos, - lnk->dst_port, - lnk->src_port_min, lnk->src_port_max, - lnk->ageing); - if (success) - nmtstp_assert_wait_for_link (name, NM_LINK_TYPE_VXLAN, 100); - } else - success = nm_platform_link_vxlan_add (NM_PLATFORM_GET, name, lnk, NULL) == NM_PLATFORM_ERROR_SUCCESS; + err = nmtstp_run_command ("ip link add %s type vxlan id %u %s local %s group %s ttl %u tos %02x dstport %u srcport %u %u ageing %u", + name, + lnk->id, + dev ? dev : "", + local, + remote, + lnk->ttl, + lnk->tos, + lnk->dst_port, + lnk->src_port_min, lnk->src_port_max, + lnk->ageing); + /* Older versions of iproute2 don't support adding vxlan devices. + * On failure, fallback to using platform code. */ + if (err == 0) + pllink = nmtstp_assert_wait_for_link (name, NM_LINK_TYPE_VXLAN, 100); + else + _LOGI ("Adding vxlan device via iproute2 failed. Assume iproute2 is not up to the task."); + } + if (!pllink) { + plerr = nm_platform_link_vxlan_add (NM_PLATFORM_GET, name, lnk, &pllink); + g_assert_cmpint (plerr, ==, NM_PLATFORM_ERROR_SUCCESS); + g_assert (pllink); + } - return success; + g_assert_cmpint (pllink->type, ==, NM_LINK_TYPE_VXLAN); + g_assert_cmpstr (pllink->name, ==, name); + return pllink; } void diff --git a/src/platform/tests/test-common.h b/src/platform/tests/test-common.h index 541f259b3a..f279aa1354 100644 --- a/src/platform/tests/test-common.h +++ b/src/platform/tests/test-common.h @@ -160,9 +160,9 @@ gboolean nmtstp_link_macvlan_add (gboolean external_command, gboolean nmtstp_link_sit_add (gboolean external_command, const char *name, NMPlatformLnkSit *lnk); -gboolean nmtstp_link_vxlan_add (gboolean external_command, - const char *name, - NMPlatformLnkVxlan *lnk); +const NMPlatformLink *nmtstp_link_vxlan_add (gboolean external_command, + const char *name, + const NMPlatformLnkVxlan *lnk); void nmtstp_link_del (gboolean external_command, int ifindex, diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c index 34eb124f44..97523a310c 100644 --- a/src/platform/tests/test-link.c +++ b/src/platform/tests/test-link.c @@ -816,8 +816,7 @@ test_software_detect (gconstpointer user_data) break; } - if (!nmtstp_link_vxlan_add (EX, DEVICE_NAME, &lnk_vxlan)) - g_error ("Failed adding VXLAN link"); + g_assert (nmtstp_link_vxlan_add (EX, DEVICE_NAME, &lnk_vxlan)); break; } default: