From f5d504843e6c0922e575c2275c704739eca265ee Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 5 Apr 2018 11:19:54 +0200 Subject: manager: trust the state file more when assuming connections If we can't generate a connection and maybe_later is TRUE, it means that the device can generate/assume connections but it failed for the moment due to missing master/slaves/addresses. In this case, just assume the connection from state file. https://bugzilla.redhat.com/show_bug.cgi?id=1551958 --- src/nm-manager.c | 53 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index 5074ae7e1a..f6a04f29b3 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -2181,13 +2181,14 @@ get_existing_connection (NMManager *self, gs_unref_object NMConnection *connection = NULL; NMSettingsConnection *added = NULL; GError *error = NULL; + gs_free_error GError *gen_error = NULL; NMDevice *master = NULL; int ifindex = nm_device_get_ifindex (device); NMSettingsConnection *matched; NMSettingsConnection *connection_checked = NULL; gboolean assume_state_guess_assume = FALSE; const char *assume_state_connection_uuid = NULL; - gboolean maybe_later; + gboolean maybe_later, only_by_uuid = FALSE; if (out_generated) *out_generated = FALSE; @@ -2220,14 +2221,18 @@ get_existing_connection (NMManager *self, * update_connection() implemented, otherwise nm_device_generate_connection() * returns NULL. */ - connection = nm_device_generate_connection (device, master, &maybe_later, &error); + connection = nm_device_generate_connection (device, master, &maybe_later, &gen_error); if (!connection) { - if (!maybe_later) + if (maybe_later) { + /* The device can generate a connection, but it failed for now. + * Give it a chance to match a connection from the state file. */ + only_by_uuid = TRUE; + } else { nm_device_assume_state_reset (device); - _LOG2D (LOGD_DEVICE, device, "assume: cannot generate connection: %s", - error->message); - g_error_free (error); - return NULL; + _LOG2D (LOGD_DEVICE, device, "assume: cannot generate connection: %s", + gen_error->message); + return NULL; + } } nm_device_assume_state_get (device, @@ -2248,21 +2253,31 @@ get_existing_connection (NMManager *self, && !active_connection_find_first (self, connection_checked, NULL, NM_ACTIVE_CONNECTION_STATE_DEACTIVATING) && nm_device_check_connection_compatible (device, NM_CONNECTION (connection_checked))) { - NMConnection *const connections[] = { - NM_CONNECTION (connection_checked), - NULL, - }; - - matched = NM_SETTINGS_CONNECTION (nm_utils_match_connection (connections, - connection, - TRUE, - nm_device_has_carrier (device), - nm_device_get_route_metric (device, AF_INET), - nm_device_get_route_metric (device, AF_INET6), - NULL, NULL)); + + if (connection) { + NMConnection *const connections[] = { + NM_CONNECTION (connection_checked), + NULL, + }; + + matched = NM_SETTINGS_CONNECTION (nm_utils_match_connection (connections, + connection, + TRUE, + nm_device_has_carrier (device), + nm_device_get_route_metric (device, AF_INET), + nm_device_get_route_metric (device, AF_INET6), + NULL, NULL)); + } else + matched = connection_checked; } else matched = NULL; + if (!matched && only_by_uuid) { + _LOG2D (LOGD_DEVICE, device, "assume: cannot generate connection: %s", + gen_error->message); + return NULL; + } + if (!matched && assume_state_guess_assume) { gs_free NMSettingsConnection **connections = NULL; guint len, i, j; -- cgit v1.2.1