summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/platform/nm-linux-platform.c28
-rw-r--r--src/platform/tests/test-link.c47
2 files changed, 47 insertions, 28 deletions
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 7cc90b6790..c13995e6da 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -2491,33 +2491,6 @@ delayed_action_handle_idle (gpointer user_data)
}
static void
-delayed_action_clear_REFRESH_LINK (NMPlatform *platform, int ifindex)
-{
- NMLinuxPlatformPrivate *priv;
- gssize idx;
- gpointer user_data;
-
- if (ifindex <= 0)
- return;
-
- priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
- if (!NM_FLAGS_HAS (priv->delayed_action.flags, DELAYED_ACTION_TYPE_REFRESH_LINK))
- return;
-
- user_data = GINT_TO_POINTER (ifindex);
-
- idx = _nm_utils_ptrarray_find_first (priv->delayed_action.list_refresh_link->pdata, priv->delayed_action.list_refresh_link->len, user_data);
- if (idx < 0)
- return;
-
- _LOGt_delayed_action (DELAYED_ACTION_TYPE_REFRESH_LINK, user_data, "clear");
-
- g_ptr_array_remove_index_fast (priv->delayed_action.list_refresh_link, idx);
- if (priv->delayed_action.list_refresh_link->len == 0)
- priv->delayed_action.flags &= ~DELAYED_ACTION_TYPE_REFRESH_LINK;
-}
-
-static void
delayed_action_schedule (NMPlatform *platform, DelayedActionType action_type, gpointer user_data)
{
NMLinuxPlatformPrivate *priv = NM_LINUX_PLATFORM_GET_PRIVATE (platform);
@@ -3118,7 +3091,6 @@ event_notification (struct nl_msg *msg, gpointer user_data)
_LOGt ("delayed-deletion: clear delayed deletion of protected object %s", nmp_object_to_string (obj, NMP_OBJECT_TO_STRING_ID, NULL, 0));
g_hash_table_insert (priv->delayed_deletion, nmp_object_ref (obj), NULL);
}
- delayed_action_clear_REFRESH_LINK (platform, obj->link.ifindex);
}
/* fall-through */
case RTM_NEWADDR:
diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
index 024ecf0e92..b222721ef0 100644
--- a/src/platform/tests/test-link.c
+++ b/src/platform/tests/test-link.c
@@ -1442,6 +1442,52 @@ out:
/*****************************************************************************/
+static void
+test_nl_bugs_spuroius_newlink (void)
+{
+ const char *IFACE_BOND0 = "nm-test-bond0";
+ const char *IFACE_DUMMY0 = "nm-test-dummy0";
+ int ifindex_bond0, ifindex_dummy0;
+ const NMPlatformLink *pllink;
+
+ /* create veth pair. */
+ nmtstp_run_command_check ("ip link add %s type dummy", IFACE_DUMMY0);
+ ifindex_dummy0 = nmtstp_assert_wait_for_link (IFACE_DUMMY0, NM_LINK_TYPE_DUMMY, 100)->ifindex;
+
+ nmtstp_run_command_check ("ip link add %s type bond", IFACE_BOND0);
+ ifindex_bond0 = nmtstp_assert_wait_for_link (IFACE_BOND0, NM_LINK_TYPE_BOND, 100)->ifindex;
+
+ nmtstp_link_set_updown (-1, ifindex_bond0, TRUE);
+
+ nmtstp_run_command_check ("ip link set %s master %s", IFACE_DUMMY0, IFACE_BOND0);
+ NMTST_WAIT_ASSERT (100, {
+ nmtstp_wait_for_signal (50);
+
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex_dummy0);
+ g_assert (pllink);
+ if (pllink->master == ifindex_bond0) {
+ break;
+ }
+ });
+
+ nmtstp_run_command_check ("ip link del %s", IFACE_BOND0);
+ nmtstp_wait_for_signal (50);
+ nm_platform_process_events (NM_PLATFORM_GET);
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex_bond0);
+ g_assert (!pllink);
+
+ NMTST_WAIT (100, {
+ nmtstp_wait_for_signal (50);
+ });
+ pllink = nm_platform_link_get (NM_PLATFORM_GET, ifindex_bond0);
+ g_assert (!pllink);
+
+ nm_platform_link_delete (NM_PLATFORM_GET, ifindex_bond0);
+ nm_platform_link_delete (NM_PLATFORM_GET, ifindex_dummy0);
+}
+
+/*****************************************************************************/
+
void
init_tests (int *argc, char ***argv)
{
@@ -1479,5 +1525,6 @@ setup_tests (void)
g_test_add_func ("/link/software/vlan/set-xgress", test_vlan_set_xgress);
g_test_add_func ("/link/nl-bugs/veth", test_nl_bugs_veth);
+ g_test_add_func ("/link/nl-bugs/spurious-newlink", test_nl_bugs_spuroius_newlink);
}
}