manager: don't update ifindex of existing devices

When NM has to rebuild the platform cache, it first generates ADD and
then REMOVE events for the links.  So, if an interface is removed and
readded, platform will emit the ADDED event with a new ifindex while
the device with old ifindex still exists.

In such case the manager currently updates the device's ifindex but
this causes problems as the DNS manager tracks configurations by their
ifindex and so the configurations for the old device will become
stale.

Fix this by removing the device and adding it again when we detect a
change of ifindex on a device that already had valid one.

https://bugzilla.redhat.com/show_bug.cgi?id=1542366
This commit is contained in:
Beniamino Galvani 2018-08-02 17:45:09 +02:00
parent 9ed07fbb46
commit 281974b932

View file

@ -3083,10 +3083,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,
@ -3106,6 +3117,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) {