95 lines
3.9 KiB
Diff
95 lines
3.9 KiB
Diff
From 43c39b1e1ef66f2ecf970086fdd05ce9b0c7fedf Mon Sep 17 00:00:00 2001
|
|
From: Beniamino Galvani <bgalvani@redhat.com>
|
|
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)
|
|
---
|
|
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 7585acf4d3..461f57b5c1 100644
|
|
--- a/src/core/devices/nm-device.c
|
|
+++ b/src/core/devices/nm-device.c
|
|
@@ -17158,6 +17158,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 16b0211fa2..c24b484f30 100644
|
|
--- a/src/core/nm-policy.c
|
|
+++ b/src/core/nm-policy.c
|
|
@@ -796,6 +796,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)
|
|
{
|
|
@@ -880,6 +894,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);
|
|
@@ -905,10 +920,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;
|
|
--
|
|
2.38.1
|
|
|