From cc74cffe12bab58e489b2ad734c93b137da101d0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 16 Jun 2017 18:20:40 +0200 Subject: 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. --- src/NetworkManagerUtils.c | 24 +++++++++++++++++++++++- src/NetworkManagerUtils.h | 1 + src/nm-manager.c | 2 ++ src/tests/test-general.c | 2 +- 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 -- cgit v1.2.1