From 18c635779d0b9cc355b0aa58ad8bee9e09a5c457 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 24 Aug 2022 16:52:52 +0200 Subject: [PATCH] device: restart DHCP when the MAC changes If the MAC changes there is the possibility that the DHCP client will not be able to renew the address because it uses the old MAC as CHADDR. Depending on the implementation, the DHCP server might use CHADDR (so, the old address) as the destination MAC for DHCP replies, and those packets will be lost. To avoid this problem, restart the DHCP client when the MAC changes. https://bugzilla.redhat.com/show_bug.cgi?id=2110000 (cherry picked from commit 905adabdba033bbfc33013d0ad203bd444131dc5) (cherry picked from commit 5a49a2f6b20e6d124ac705e79ab7d5df3837b8c1) (cherry picked from commit d0fb3fbf8e68c8452840adeb2ee818596b4b54af) (cherry picked from commit 59a52510f3002be099c6894b952eefffb12f9b62) (cherry picked from commit 0766d08db925bf5fd4adc00c4f8ff883b72c3d96) (cherry picked from commit 25abc22ac9929b84613454086be74320c1ba778d) --- src/core/devices/nm-device.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 20b849a9af..0c760f30f5 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -5394,9 +5394,10 @@ device_update_interface_flags(NMDevice *self, const NMPlatformLink *plink) static gboolean device_link_changed(NMDevice *self) { - NMDeviceClass * klass = NM_DEVICE_GET_CLASS(self); - NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); - gboolean ip_ifname_changed = FALSE; + NMDeviceClass * klass = NM_DEVICE_GET_CLASS(self); + NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); + gboolean ip_ifname_changed = FALSE; + gboolean hw_addr_changed; nm_auto_nmpobj const NMPObject *pllink_keep_alive = NULL; const NMPlatformLink * pllink; const char * str; @@ -5443,9 +5444,9 @@ device_link_changed(NMDevice *self) if (ifindex == nm_device_get_ip_ifindex(self)) _stats_update_counters_from_pllink(self, pllink); - had_hw_addr = (priv->hw_addr != NULL); - nm_device_update_hw_address(self); - got_hw_addr = (!had_hw_addr && priv->hw_addr); + had_hw_addr = (priv->hw_addr != NULL); + hw_addr_changed = nm_device_update_hw_address(self); + got_hw_addr = (!had_hw_addr && priv->hw_addr); nm_device_update_permanent_hw_address(self, FALSE); if (pllink->name[0] && !nm_streq(priv->iface, pllink->name)) { @@ -5495,6 +5496,8 @@ device_link_changed(NMDevice *self) /* Update DHCP, etc, if needed */ if (ip_ifname_changed) nm_device_update_dynamic_ip_setup(self, "IP interface changed"); + else if (hw_addr_changed) + nm_device_update_dynamic_ip_setup(self, "hw-address changed"); was_up = priv->up; priv->up = NM_FLAGS_HAS(pllink->n_ifi_flags, IFF_UP);