diff options
author | Dan Williams <dcbw@redhat.com> | 2013-11-14 09:49:30 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-12-02 15:26:13 -0600 |
commit | 664d64e0c04bd4b83137a682ff9a9881966f6f94 (patch) | |
tree | 8253405c3569361453cf42d56a8401a3aebabbfb | |
parent | 53ad869e92ae2a1ed9992a33cc6f012e9f84347e (diff) | |
download | NetworkManager-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.c | 35 |
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 */ |