about summary refs log tree commit diff
path: root/src/nm-manager.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-09-23 10:11:11 +0200
committerMichael Biebl <biebl@debian.org>2018-09-23 10:11:11 +0200
commit135c3be0fb0eedb7a1b493ffde6c1ab3d23771f6 (patch)
tree40408d2ad887437e3ca63ff7fc6334bf22ae3fe6 /src/nm-manager.c
parent81e5928f26b40b0227604ccaf4b051fe14c9b3ef (diff)
parente126f3e804c35480c4f075777430419d6ece23da (diff)
Update upstream source from tag 'upstream/1.12.4'
Update to upstream version '1.12.4'
with Debian dir 650b52e60bf462f2972d0c33deec2cb171953445
Diffstat (limited to 'src/nm-manager.c')
-rw-r--r--src/nm-manager.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 289dcf83..ad906169 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -3008,10 +3008,21 @@ platform_link_added (NMManager *self,
 			continue;
 
 		if (nm_device_is_real (candidate)) {
-			/* Ignore the link added event since there's already a realized
-			 * device with the link's name.
+			/* There's already a realized device with the link's name
+			 * and a different ifindex.
 			 */
-			nm_device_update_from_platform_link (candidate, plink);
+			if (nm_device_get_ifindex (candidate) <= 0)
+				nm_device_update_from_platform_link (candidate, plink);
+			else {
+				/* The ifindex of a device can't be changed after
+				 * initialization because it is used as a key by
+				 * the dns-manager.
+				 */
+				_LOGD (LOGD_DEVICE, "(%s): removing old device %p after ifindex change from %d to %d",
+				       plink->name, candidate, nm_device_get_ifindex (candidate), ifindex);
+				remove_device (self, candidate, FALSE, TRUE);
+				goto add;
+			}
 			return;
 		} else if (nm_device_realize_start (candidate,
 		                                    plink,
@@ -3031,6 +3042,7 @@ platform_link_added (NMManager *self,
 		/* Try next unrealized device */
 	}
 
+add:
 	/* Try registered device factories */
 	factory = nm_device_factory_manager_find_factory_for_link_type (plink->type);
 	if (factory) {