diff options
-rw-r--r-- | src/platform/nm-linux-platform.c | 28 | ||||
-rw-r--r-- | src/platform/tests/test-link.c | 47 |
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); } } |