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 e3cf5083fb)
(cherry picked from commit 1673e3f051)
(cherry picked from commit 69e66102ce)
(cherry picked from commit a8f8ca01fd)
(cherry picked from commit bd951c5398)
This commit is contained in:
Beniamino Galvani 2022-09-07 16:50:02 +02:00 committed by Fernando Fernandez Mancera
parent dc39b9a364
commit badd1aa0b0
2 changed files with 33 additions and 3 deletions

View file

@ -17892,6 +17892,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;
}

View file

@ -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;