mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-07-22 10:46:59 +00:00
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
This commit is contained in:
parent
844d03bb12
commit
e3cf5083fb
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -795,6 +795,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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue