diff options
author | Jiri Pirko <jiri@resnulli.us> | 2013-07-25 15:36:47 +0200 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2013-08-15 10:54:15 -0500 |
commit | db65980328b9e5ef6f1e162cd2dbc685dcdcdb21 (patch) | |
tree | b995e5afb1480ee7e6ec8c6181965f7764a580fb | |
parent | c4eade715f90d78305d447f9ce19ec8d0ea9305c (diff) | |
download | NetworkManager-db65980328b9e5ef6f1e162cd2dbc685dcdcdb21.tar.gz |
ifcfg-rh: add read support for team devices
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
-rw-r--r-- | src/settings/plugins/ifcfg-rh/reader.c | 158 |
1 files changed, 142 insertions, 16 deletions
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index b37bdb1506..17681c6261 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -44,6 +44,8 @@ #include <nm-setting-wireless.h> #include <nm-setting-8021x.h> #include <nm-setting-bond.h> +#include <nm-setting-team.h> +#include <nm-setting-team-port.h> #include <nm-setting-bridge.h> #include <nm-setting-bridge-port.h> #include <nm-utils.h> @@ -1742,6 +1744,28 @@ check_if_bond_slave (shvarFile *ifcfg, } } +static void +check_if_team_slave (shvarFile *ifcfg, + NMSettingConnection *s_con) +{ + char *value; + + value = svGetValue (ifcfg, "DEVICETYPE", FALSE); + if (!value) + return; + if (strcasecmp (value, TYPE_TEAM_PORT)) { + g_free (value); + return; + } + g_free (value); + value = svGetValue (ifcfg, "TEAM_MASTER", FALSE); + if (!value) + return; + g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL); + g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME, NULL); + g_free (value); +} + static gboolean add_one_wep_key (shvarFile *ifcfg, const char *shvar_key, @@ -3494,6 +3518,7 @@ wired_connection_from_ifcfg (const char *file, return NULL; } check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); + check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); nm_connection_add_setting (connection, con_setting); wired_setting = make_wired_setting (ifcfg, file, nm_controlled, unmanaged, &s_8021x, error); @@ -3670,6 +3695,7 @@ infiniband_connection_from_ifcfg (const char *file, return NULL; } check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); + check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting)); nm_connection_add_setting (connection, con_setting); infiniband_setting = make_infiniband_setting (ifcfg, file, nm_controlled, unmanaged, error); @@ -3800,6 +3826,92 @@ bond_connection_from_ifcfg (const char *file, return connection; } +static NMSetting * +make_team_setting (shvarFile *ifcfg, + const char *file, + gboolean nm_controlled, + char **unmanaged, + GError **error) +{ + NMSettingTeam *s_team; + char *value; + + s_team = NM_SETTING_TEAM (nm_setting_team_new ()); + + value = svGetValue (ifcfg, "DEVICE", FALSE); + if (!value || !strlen (value)) { + g_set_error (error, IFCFG_PLUGIN_ERROR, 0, "mandatory DEVICE keyword missing"); + goto error; + } + + g_object_set (s_team, NM_SETTING_TEAM_INTERFACE_NAME, value, NULL); + g_free (value); + + value = svGetValue (ifcfg, "TEAM_CONFIG", FALSE); + if (value) { + g_object_set (s_team, NM_SETTING_TEAM_CONFIG, value, NULL); + g_free (value); + } + + return (NMSetting *) s_team; + +error: + g_object_unref (s_team); + return NULL; +} + +static NMConnection * +team_connection_from_ifcfg (const char *file, + shvarFile *ifcfg, + gboolean nm_controlled, + char **unmanaged, + GError **error) +{ + NMConnection *connection = NULL; + NMSetting *con_setting = NULL; + NMSetting *team_setting = NULL; + NMSetting *wired_setting = NULL; + NMSetting8021x *s_8021x = NULL; + + g_return_val_if_fail (file != NULL, NULL); + g_return_val_if_fail (ifcfg != NULL, NULL); + + connection = nm_connection_new (); + + con_setting = make_connection_setting (file, ifcfg, NM_SETTING_TEAM_SETTING_NAME, NULL, _("Team")); + if (!con_setting) { + g_set_error (error, IFCFG_PLUGIN_ERROR, 0, + "Failed to create connection setting."); + g_object_unref (connection); + return NULL; + } + nm_connection_add_setting (connection, con_setting); + + team_setting = make_team_setting (ifcfg, file, nm_controlled, unmanaged, error); + if (!team_setting) { + g_object_unref (connection); + return NULL; + } + nm_connection_add_setting (connection, team_setting); + + wired_setting = make_wired_setting (ifcfg, file, nm_controlled, unmanaged, &s_8021x, error); + if (!wired_setting) { + g_object_unref (connection); + return NULL; + } + nm_connection_add_setting (connection, wired_setting); + + if (s_8021x) + nm_connection_add_setting (connection, NM_SETTING (s_8021x)); + + if (!nm_connection_verify (connection, error)) { + g_object_unref (connection); + return NULL; + } + + return connection; +} + typedef void (*BridgeOptFunc) (NMSetting *setting, gboolean stp, const char *key, @@ -4029,6 +4141,22 @@ make_bridge_port_setting (shvarFile *ifcfg) return s_port; } +static NMSetting * +make_team_port_setting (shvarFile *ifcfg) +{ + NMSetting *s_port = NULL; + char *value; + + value = svGetValue (ifcfg, "TEAM_PORT_CONFIG", FALSE); + if (value) { + s_port = nm_setting_team_port_new (); + g_object_set (s_port, NM_SETTING_TEAM_PORT_CONFIG, value, NULL); + g_free (value); + } + + return s_port; +} + static gboolean is_bond_device (const char *name, shvarFile *parsed) { @@ -4365,27 +4493,18 @@ connection_from_file (const char *filename, return NULL; } - /* - * Ignore Team connections for now; we don't support team yet. - * https://fedorahosted.org/libteam/ - */ + type = NULL; + devtype = svGetValue (parsed, "DEVICETYPE", FALSE); if (devtype) { - if ( !strcasecmp (devtype, TYPE_TEAM) - || !strcasecmp (devtype, TYPE_TEAM_PORT)) { - char *base_name = g_path_get_basename (filename); - g_set_error (error, IFCFG_PLUGIN_ERROR, 0, - "Ignoring team (DEVICETYPE=\"%s\") connection '%s'; teaming is not supported yet", - devtype, - base_name); - g_free (base_name); - g_free (devtype); - goto done; - } + if (!strcasecmp (devtype, TYPE_TEAM)) + type = g_strdup (TYPE_TEAM); g_free (devtype); } - type = svGetValue (parsed, "TYPE", FALSE); + if (!type) + type = svGetValue (parsed, "TYPE", FALSE); + if (!type) { char *device; @@ -4460,6 +4579,8 @@ connection_from_file (const char *filename, connection = infiniband_connection_from_ifcfg (filename, parsed, nm_controlled, &unmanaged, error); else if (!strcasecmp (type, TYPE_BOND)) connection = bond_connection_from_ifcfg (filename, parsed, nm_controlled, &unmanaged, error); + else if (!strcasecmp (type, TYPE_TEAM)) + connection = team_connection_from_ifcfg (filename, parsed, nm_controlled, &unmanaged, error); else if (!strcasecmp (type, TYPE_VLAN)) connection = vlan_connection_from_ifcfg (filename, parsed, nm_controlled, &unmanaged, error); else if (!strcasecmp (type, TYPE_BRIDGE)) @@ -4510,6 +4631,11 @@ connection_from_file (const char *filename, if (s_port) nm_connection_add_setting (connection, s_port); + /* Team port? */ + s_port = make_team_port_setting (parsed); + if (s_port) + nm_connection_add_setting (connection, s_port); + /* iSCSI / ibft connections are read-only since their settings are * stored in NVRAM and can only be changed in BIOS. */ |