summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-06-16 18:20:40 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-11-30 14:47:49 +0100
commitcc74cffe12bab58e489b2ad734c93b137da101d0 (patch)
tree0108051242455427e5c86078b1f726f4cf442927
parent15608713c4a8e4eeea0d5418247f133760fb9a8e (diff)
downloadNetworkManager-cc74cffe12bab58e489b2ad734c93b137da101d0.tar.gz
device: add "indicated" argument to nm_utils_match_connection()
The matching works fuzzy and is not reliable. That is why we store which connection should be assumed after restart in the state file of NetworkManager. In that case, we don't need to do a full check (with the possibility of a false-reject). Just check for the minimum required properties: the type and slave-type. Yes, if the user modifies the connection while restarting NM, then we might wrongly assume a connection that no longer would match. But NM should not read minds, it should do as indicated.
-rw-r--r--src/NetworkManagerUtils.c24
-rw-r--r--src/NetworkManagerUtils.h1
-rw-r--r--src/nm-manager.c2
-rw-r--r--src/tests/test-general.c2
4 files changed, 27 insertions, 2 deletions
diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
index 596c5bb362..89bd357f07 100644
--- a/src/NetworkManagerUtils.c
+++ b/src/NetworkManagerUtils.c
@@ -773,6 +773,10 @@ check_possible_match (NMConnection *orig,
* @connections: a (optionally pre-sorted) list of connections from which to
* find a matching connection to @original based on "inferrable" properties
* @original: the #NMConnection to find a match for from @connections
+ * @indicated: whether the match is already hinted/indicated. That is the
+ * case when we found the connection in the state file from a previous run.
+ * In this case, we perform a relexed check, as we have a good hint
+ * that the connection actually matches.
* @device_has_carrier: pass %TRUE if the device that generated @original has
* a carrier, %FALSE if not
* @match_filter_func: a function to check whether each connection from @connections
@@ -792,6 +796,7 @@ check_possible_match (NMConnection *orig,
NMConnection *
nm_utils_match_connection (NMConnection *const*connections,
NMConnection *original,
+ gboolean indicated,
gboolean device_has_carrier,
gint64 default_v4_metric,
gint64 default_v6_metric,
@@ -812,7 +817,24 @@ nm_utils_match_connection (NMConnection *const*connections,
continue;
}
- if (!nm_connection_diff (original, candidate, NM_SETTING_COMPARE_FLAG_INFERRABLE, &diffs)) {
+ if (indicated) {
+ NMSettingConnection *s_orig, *s_cand;
+
+ s_orig = nm_connection_get_setting_connection (original);
+ s_cand = nm_connection_get_setting_connection (candidate);
+
+ /* It is indicated that this connection matches. Assume we have
+ * a match, but check for particular differences that let us
+ * reject the candidate. */
+ if (!nm_streq0 (nm_setting_connection_get_connection_type (s_orig),
+ nm_setting_connection_get_connection_type (s_cand)))
+ continue;
+ if (!nm_streq0 (nm_setting_connection_get_slave_type (s_orig),
+ nm_setting_connection_get_slave_type (s_cand)))
+ continue;
+
+ /* this is good enough for a match */
+ } else if (!nm_connection_diff (original, candidate, NM_SETTING_COMPARE_FLAG_INFERRABLE, &diffs)) {
if (!best_match) {
best_match = check_possible_match (original, candidate, diffs, device_has_carrier,
default_v4_metric, default_v6_metric);
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h
index c20f2439d4..e5f28b2729 100644
--- a/src/NetworkManagerUtils.h
+++ b/src/NetworkManagerUtils.h
@@ -41,6 +41,7 @@ typedef gboolean (NMUtilsMatchFilterFunc) (NMConnection *connection, gpointer us
NMConnection *nm_utils_match_connection (NMConnection *const*connections,
NMConnection *original,
+ gboolean indicated,
gboolean device_has_carrier,
gint64 default_v4_metric,
gint64 default_v6_metric,
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 202e80fe20..871ed310f1 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -1842,6 +1842,7 @@ get_existing_connection (NMManager *self,
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),
@@ -1871,6 +1872,7 @@ get_existing_connection (NMManager *self,
matched = NM_SETTINGS_CONNECTION (nm_utils_match_connection ((NMConnection *const*) connections,
connection,
+ FALSE,
nm_device_has_carrier (device),
nm_device_get_route_metric (device, AF_INET),
nm_device_get_route_metric (device, AF_INET6),
diff --git a/src/tests/test-general.c b/src/tests/test-general.c
index d36a26ef4a..bfa2ea7391 100644
--- a/src/tests/test-general.c
+++ b/src/tests/test-general.c
@@ -359,7 +359,7 @@ _match_connection (GSList *connections,
}
list[i] = NULL;
- return nm_utils_match_connection (list, original, device_has_carrier, default_v4_metric, default_v6_metric, NULL, NULL);
+ return nm_utils_match_connection (list, original, FALSE, device_has_carrier, default_v4_metric, default_v6_metric, NULL, NULL);
}
static void