From 5ca93db6928d7bbeb5ae378512843877359f06ba Mon Sep 17 00:00:00 2001 From: Fernando Fernandez Mancera Date: Tue, 4 Jul 2023 12:50:29 +0200 Subject: [PATCH] utils: extend connection matching function for UUID in controller When matching two connections one might be using UUID and the other one could be using interface-name for the controller property. When recovering from a fresh start NM does not have any context and when generating a connection we are using UUID as the controller. It is always hard to guess what is the right candidate to pick but at least something NM can do is checking if the UUID matches a connection with the same controller interface-name. If there are no other conflicts, then we can assume that is a good canditate to activate. This is a follow up to `dc254f90e2b306700a0b81f7194e9b0438c62f4c`. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1684 (cherry picked from commit 5b8fdd25ab431dd1318eff00e725448f7c699a30) --- src/core/NetworkManagerUtils.c | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/core/NetworkManagerUtils.c b/src/core/NetworkManagerUtils.c index 6f4c60f876..12f835484a 100644 --- a/src/core/NetworkManagerUtils.c +++ b/src/core/NetworkManagerUtils.c @@ -23,6 +23,7 @@ #include "nm-setting-connection.h" #include "nm-setting-ip4-config.h" #include "nm-setting-ip6-config.h" +#include "settings/nm-settings.h" #include "libnm-core-intern/nm-core-internal.h" #include "libnm-platform/nmp-object.h" @@ -683,6 +684,53 @@ check_connection_cloned_mac_address(NMConnection *orig, return FALSE; } +static gboolean +check_connection_controller(NMConnection *orig, NMConnection *candidate, GHashTable *settings) +{ + GHashTable *props; + const char *orig_controller = NULL, *cand_controller = NULL; + NMSettingConnection *s_con_orig, *s_con_cand, *s_con_controller; + NMSettingsConnection *con_controller; + + props = check_property_in_hash(settings, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_MASTER); + if (!props) + return TRUE; + + s_con_orig = nm_connection_get_setting_connection(orig); + s_con_cand = nm_connection_get_setting_connection(candidate); + orig_controller = nm_setting_connection_get_master(s_con_orig); + cand_controller = nm_setting_connection_get_master(s_con_cand); + + /* A generated connection uses the UUID to specify the controller. Accept + * candidates that specify as controller an interface name matching that + * UUID */ + if (orig_controller && cand_controller) { + if (nm_utils_is_uuid(orig_controller)) { + con_controller = nm_settings_get_connection_by_uuid(NM_SETTINGS_GET, orig_controller); + /* no connection found for that uuid */ + if (!con_controller) + return FALSE; + + s_con_controller = + nm_settings_connection_get_setting(con_controller, NM_META_SETTING_TYPE_CONNECTION); + if (nm_streq0(nm_setting_connection_get_interface_name(s_con_controller), + cand_controller)) { + remove_from_hash(settings, + props, + NM_SETTING_CONNECTION_SETTING_NAME, + NM_SETTING_CONNECTION_MASTER); + return TRUE; + } else { + return FALSE; + } + } + } + + return FALSE; +} + static gboolean check_connection_s390_props(NMConnection *orig, NMConnection *candidate, GHashTable *settings) { @@ -764,6 +812,9 @@ check_possible_match(NMConnection *orig, if (!check_connection_cloned_mac_address(orig, candidate, settings)) return NULL; + if (!check_connection_controller(orig, candidate, settings)) + return NULL; + if (!check_connection_s390_props(orig, candidate, settings)) return NULL;