From 037ff2870842e7aa4d2d763134015a8e9abb6327 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 1 Jul 2020 09:01:10 +0200 Subject: [PATCH] ovs: also set cloned MAC address via netlink We already set the MAC of OVS interfaces in the ovsdb. Unfortunately, vswitchd doesn't create the interface with the given MAC from the beginning, but first creates it with a random MAC and then changes it. This causes a race condition: as soon as NM sees the new link, it starts IP configuration on it and (possibly later) vswitchd will change the MAC. To avoid this, also set the desired MAC via netlink before starting IP configuration. https://bugzilla.redhat.com/show_bug.cgi?id=1852106 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/483 (cherry picked from commit 47ec3d14d49eb9e9db956b3efd495d5d696da996) (cherry picked from commit 60d10b146d57290f146536705d744e67925de90e) (cherry picked from commit 01399955906aa1b1e52998e8daf487b30fa6eb81) (cherry picked from commit 69c5c5e7670e8199829df308316d055be049c978) (cherry picked from commit 91d2b0fd5ae4960420da0321dd1b11f8333f7d4d) --- src/devices/ovs/nm-device-ovs-interface.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/devices/ovs/nm-device-ovs-interface.c b/src/devices/ovs/nm-device-ovs-interface.c index f2919b4881..5d103c16fe 100644 --- a/src/devices/ovs/nm-device-ovs-interface.c +++ b/src/devices/ovs/nm-device-ovs-interface.c @@ -117,6 +117,14 @@ link_changed (NMDevice *device, priv->waiting_for_interface = FALSE; if (nm_device_get_state (device) == NM_DEVICE_STATE_IP_CONFIG) { + if (!nm_device_hw_addr_set_cloned (device, + nm_device_get_applied_connection (device), + FALSE)) { + nm_device_state_changed (device, + NM_DEVICE_STATE_FAILED, + NM_DEVICE_STATE_REASON_CONFIG_FAILED); + return; + } nm_device_bring_up (device, TRUE, NULL); nm_device_activate_schedule_stage3_ip_config_start (device); } @@ -189,6 +197,13 @@ act_stage3_ip_config_start (NMDevice *device, return NM_ACT_STAGE_RETURN_POSTPONE; } + if (!nm_device_hw_addr_set_cloned (device, + nm_device_get_applied_connection (device), + FALSE)) { + *out_failure_reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED; + return NM_ACT_STAGE_RETURN_FAILURE; + } + return NM_DEVICE_CLASS (nm_device_ovs_interface_parent_class)->act_stage3_ip_config_start (device, addr_family, out_config, out_failure_reason); }