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.
This commit is contained in:
Thomas Haller 2015-12-11 13:28:34 +01:00
parent c2602469c3
commit 95d67c683d
3 changed files with 37 additions and 24 deletions

View file

@ -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

View file

@ -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,

View file

@ -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: