From 664d64e0c04bd4b83137a682ff9a9881966f6f94 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Thu, 14 Nov 2013 09:49:30 -0600 Subject: [PATCH] keyfile: ensure slave connections have the right settings If the connection describes a bridge/bond/team/etc slave, where the slave setting (like NMSettingBridgePort or NMSettingTeamPort) has all default values, the setting does not get written out because the plugin does not write default values. But then when reading the connection back in, we need to add that all-default slave type setting since it's required for a valid connection. --- src/settings/plugins/keyfile/reader.c | 35 ++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c index 674b25606d..6949d1e5b1 100644 --- a/src/settings/plugins/keyfile/reader.c +++ b/src/settings/plugins/keyfile/reader.c @@ -1141,6 +1141,30 @@ read_vpn_secrets (GKeyFile *file, NMSettingVPN *s_vpn) g_strfreev (keys); } +static void +ensure_slave_setting (NMConnection *connection) +{ + NMSettingConnection *s_con = nm_connection_get_setting_connection (connection); + const char *slave_type; + GType slave_gtype = G_TYPE_INVALID; + NMSetting *setting; + + slave_type = nm_setting_connection_get_slave_type (s_con); + if (!slave_type) + return; + + if (g_strcmp0 (slave_type, NM_SETTING_BRIDGE_SETTING_NAME) == 0) + slave_gtype = NM_TYPE_SETTING_BRIDGE_PORT; + else if (g_strcmp0 (slave_type, NM_SETTING_TEAM_SETTING_NAME) == 0) + slave_gtype = NM_TYPE_SETTING_TEAM_PORT; + + if (slave_gtype != G_TYPE_INVALID && !nm_connection_get_setting (connection, slave_gtype)) { + setting = (NMSetting *) g_object_new (slave_gtype, NULL); + g_assert (setting); + nm_connection_add_setting (connection, setting); + } +} + NMConnection * nm_keyfile_plugin_connection_from_file (const char *filename, GError **error) { @@ -1191,10 +1215,11 @@ nm_keyfile_plugin_connection_from_file (const char *filename, GError **error) nm_connection_add_setting (connection, setting); } - /* Make sure that we have the base device type setting even if - * the keyfile didn't include it, which can happen when the base - * device type setting is all default values (like ethernet where - * the MAC address isn't given, or VLAN when the VLAN ID is zero). + /* Make sure that we have the base device type and slave type settings + * even if the keyfile didn't include it, which can happen when the + * setting in question is all default values (like ethernet where + * the MAC address isn't given, or VLAN when the VLAN ID is zero, or + * bridge port with all default settings). */ s_con = nm_connection_get_setting_connection (connection); if (s_con) { @@ -1211,6 +1236,8 @@ nm_keyfile_plugin_connection_from_file (const char *filename, GError **error) nm_connection_add_setting (connection, base_setting); } } + + ensure_slave_setting (connection); } /* Handle vpn secrets after the 'vpn' setting was read */