From dee7f89b6231a8ea70abc2bf67497fa09615e592 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 24 Sep 2014 14:57:14 -0500 Subject: [PATCH] core: check duplicate devices by interface name not UDI We can't have devices with duplicate interface names so we might as well use that for dupe checking instead of the (mostly useless) UDI. (cherry picked from commit 81db51299719a4cbf3f1f15ead912391d2b52330) --- src/nm-manager.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index 6d52cf44cf..31303e80e2 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -470,20 +470,6 @@ _config_changed_cb (NMConfig *config, NMConfigData *config_data, NMConfigChangeF /************************************************************************/ -static NMDevice * -nm_manager_get_device_by_udi (NMManager *manager, const char *udi) -{ - GSList *iter; - - g_return_val_if_fail (udi != NULL, NULL); - - for (iter = NM_MANAGER_GET_PRIVATE (manager)->devices; iter; iter = iter->next) { - if (!strcmp (nm_device_get_udi (NM_DEVICE (iter->data)), udi)) - return NM_DEVICE (iter->data); - } - return NULL; -} - static NMDevice * nm_manager_get_device_by_path (NMManager *manager, const char *path) { @@ -545,6 +531,18 @@ find_device_by_ip_iface (NMManager *self, const gchar *iface) return NULL; } +static NMDevice * +find_device_by_iface (NMManager *self, const gchar *iface) +{ + GSList *iter; + + for (iter = NM_MANAGER_GET_PRIVATE (self)->devices; iter; iter = g_slist_next (iter)) { + if (g_strcmp0 (nm_device_get_iface (NM_DEVICE (iter->data)), iface) == 0) + return NM_DEVICE (iter->data); + } + return NULL; +} + static gboolean manager_sleeping (NMManager *self) { @@ -1751,9 +1749,13 @@ add_device (NMManager *self, NMDevice *device, gboolean try_assume) RfKillType rtype; GSList *iter, *remove = NULL; gboolean connection_assumed = FALSE; + int ifindex; /* No duplicates */ - if (nm_manager_get_device_by_udi (self, nm_device_get_udi (device))) + ifindex = nm_device_get_ifindex (device); + if (ifindex > 0 && nm_manager_get_device_by_ifindex (self, ifindex)) + return; + if (find_device_by_iface (self, nm_device_get_iface (device))) return; /* Remove existing devices owned by the new device; eg remove ethernet