summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2018-04-05 11:19:54 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2018-04-18 09:55:45 +0200
commitf5d504843e6c0922e575c2275c704739eca265ee (patch)
tree5a8c402f682d5d3a41981b8c6f5a958f61cf90ad
parenta99d51cb501d4a4022273aeb0622e1a8eaac2657 (diff)
downloadNetworkManager-bg/restart-assume-rh1551958.tar.gz
manager: trust the state file more when assuming connectionsbg/restart-assume-rh1551958
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.c53
1 files 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;