diff options
| author | Beniamino Galvani <bgalvani@redhat.com> | 2018-04-05 11:19:54 +0200 |
|---|---|---|
| committer | Beniamino Galvani <bgalvani@redhat.com> | 2018-04-16 10:57:22 +0200 |
| commit | 0fcc3ddc17ec912458b78d1b433534cc6e2f9383 (patch) | |
| tree | a783988cbf12dd5120072835ac09bff887968491 | |
| parent | aeaa8950494e9fb481524a13d138881195b7e297 (diff) | |
| download | NetworkManager-bg/restart-assume-rh1551958-on-1-10.tar.gz | |
manager: trust the state file more when assuming connectionsbg/restart-assume-rh1551958-on-1-10
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
| -rw-r--r-- | src/nm-manager.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c index 56011651ab..709ed588ef 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -2117,13 +2117,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; @@ -2156,14 +2157,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, @@ -2184,21 +2189,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; |
