summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2013-11-14 09:49:30 -0600
committerDan Williams <dcbw@redhat.com>2013-12-02 15:26:13 -0600
commit664d64e0c04bd4b83137a682ff9a9881966f6f94 (patch)
tree8253405c3569361453cf42d56a8401a3aebabbfb
parent53ad869e92ae2a1ed9992a33cc6f012e9f84347e (diff)
downloadNetworkManager-664d64e0c04bd4b83137a682ff9a9881966f6f94.tar.gz
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.
-rw-r--r--src/settings/plugins/keyfile/reader.c35
1 files 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 */