summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2022-09-07 16:50:02 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2022-10-06 14:02:21 +0200
commite3cf5083fba8dd1a3a1df69069de2f7e7411dd5e (patch)
tree46f91afeb53e8848a1b2b7c318c8dcd7db19a861
parent844d03bb12d3c3a08bab00066f6d15925dcc638e (diff)
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
-rw-r--r--src/core/devices/nm-device.c7
-rw-r--r--src/core/nm-policy.c29
2 files changed, 33 insertions, 3 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
index ec8ea32831..eedbc31f3c 100644
--- a/src/core/devices/nm-device.c
+++ b/src/core/devices/nm-device.c
@@ -17180,6 +17180,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 6f618bb287..ff47be8df1 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)
}
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)
{
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
@@ -879,6 +893,7 @@ update_system_hostname(NMPolicy *self, const char *msg)
info = &nm_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);
@@ -904,10 +919,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;