From b4746bf7a298df3b7b3e94a01546e0a6df46132b Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Wed, 7 Sep 2022 16:50:02 +0200 Subject: [PATCH] core: wait for carrier before resolving hostname via DNS If there is no carrier on a device, don't try to resolve the hostname on it. Instead, subscribe to carrier change notifications and retry again once carrier goes up. https://bugzilla.redhat.com/show_bug.cgi?id=2118817 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1402 (cherry picked from commit e3cf5083fba8dd1a3a1df69069de2f7e7411dd5e) (cherry picked from commit 1673e3f0518cff15dd19f871baecdf64bef48bc7) (cherry picked from commit 69e66102ce63c5f8794c9a8d53d060d03e9eb78d) (cherry picked from commit a8f8ca01fdf833fc82c3533796345ea7ae019b3b) (cherry picked from commit bd951c53986a94c7d09f28163be40481b80d86da) (cherry picked from commit badd1aa0b07f957e778b650449d874634e8ff318) --- src/core/devices/nm-device.c | 7 +++++++ src/core/nm-policy.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 0c760f30f5..81f31e12ba 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -17815,6 +17815,13 @@ nm_device_get_hostname_from_dns_lookup(NMDevice *self, int addr_family, gboolean /* If the device is not supposed to have addresses, * return an immediate empty result.*/ if (!nm_device_get_applied_connection(self)) { + nm_clear_pointer(&priv->hostname_resolver_x[IS_IPv4], _hostname_resolver_free); + NM_SET_OUT(out_wait, FALSE); + return NULL; + } + + if (!priv->carrier) { + nm_clear_pointer(&priv->hostname_resolver_x[IS_IPv4], _hostname_resolver_free); NM_SET_OUT(out_wait, FALSE); return NULL; } diff --git a/src/core/nm-policy.c b/src/core/nm-policy.c index 71aa1eceaf..d3370c8e94 100644 --- a/src/core/nm-policy.c +++ b/src/core/nm-policy.c @@ -793,6 +793,20 @@ device_dns_lookup_done(NMDevice *device, gpointer user_data) update_system_hostname(self, "lookup finished"); } +static void +device_carrier_changed(NMDevice *device, GParamSpec *pspec, gpointer user_data) +{ + NMPolicyPrivate *priv = user_data; + NMPolicy * self = _PRIV_TO_SELF(priv); + gs_free char * msg = NULL; + + if (nm_device_has_carrier(device)) { + g_signal_handlers_disconnect_by_func(device, device_carrier_changed, priv); + msg = g_strdup_printf("device '%s' got carrier", nm_device_get_iface(device)); + update_system_hostname(self, msg); + } +} + static void update_system_hostname(NMPolicy *self, const char *msg) { @@ -877,6 +891,7 @@ update_system_hostname(NMPolicy *self, const char *msg) info = &g_array_index(infos, DeviceHostnameInfo, i); addr_family = info->IS_IPv4 ? AF_INET : AF_INET6; g_signal_handlers_disconnect_by_func(info->device, device_dns_lookup_done, self); + g_signal_handlers_disconnect_by_func(info->device, device_carrier_changed, priv); if (info->from_dhcp) { dhcp_config = nm_device_get_dhcp_config(info->device, addr_family); @@ -902,10 +917,18 @@ update_system_hostname(NMPolicy *self, const char *msg) if (priv->hostname_mode != NM_POLICY_HOSTNAME_MODE_DHCP) { if (info->from_dns) { - const char *result; - gboolean wait = FALSE; + const char *result = NULL; + gboolean wait = FALSE; - result = nm_device_get_hostname_from_dns_lookup(info->device, addr_family, &wait); + if (nm_device_has_carrier(info->device)) { + result = + nm_device_get_hostname_from_dns_lookup(info->device, addr_family, &wait); + } else { + g_signal_connect(info->device, + "notify::" NM_DEVICE_CARRIER, + G_CALLBACK(device_carrier_changed), + priv); + } if (result) { _set_hostname(self, result, "from address lookup"); return;