Functionatlity is implemented on NMSettingConnection level in case other device types require this as well.
Adds a dummy ip4_config when high level config is disabled. This is required in order not to fall back to using DHCP. Signed-off-by: Thomas Graf <[email protected]> --- libnm-util/libnm-util.ver | 1 + libnm-util/nm-setting-connection.c | 41 +++++++++++++++++++++++++++ libnm-util/nm-setting-connection.h | 19 +++++++----- src/settings/plugins/ifcfg-rh/reader.c | 47 ++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 8 deletions(-) diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver index 0c7aab0..03f445b 100644 --- a/libnm-util/libnm-util.ver +++ b/libnm-util/libnm-util.ver @@ -194,6 +194,7 @@ global: nm_setting_connection_get_autoconnect; nm_setting_connection_get_connection_type; nm_setting_connection_get_id; + nm_setting_connection_get_ignore_config; nm_setting_connection_get_num_permissions; nm_setting_connection_get_master; nm_setting_connection_get_permission; diff --git a/libnm-util/nm-setting-connection.c b/libnm-util/nm-setting-connection.c index 5ca6b60..c3f581b 100644 --- a/libnm-util/nm-setting-connection.c +++ b/libnm-util/nm-setting-connection.c @@ -102,6 +102,7 @@ typedef struct { gboolean autoconnect; guint64 timestamp; gboolean read_only; + gboolean ignore_config; } NMSettingConnectionPrivate; enum { @@ -114,6 +115,7 @@ enum { PROP_TIMESTAMP, PROP_READ_ONLY, PROP_MASTER, + PROP_IGNORE_CONFIG, LAST_PROP }; @@ -496,6 +498,22 @@ nm_setting_connection_get_master (NMSettingConnection *setting) return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->master; } +/** + * nm_setting_connection_get_ignore_config: + * @setting: the #NMSettingConnection + * + * Returns the #NMSettingConnection:ignore-config property of the connection. + * + * Returns: %TRUE if the connection ignores high level configs, %FALSE if it does not + **/ +gboolean +nm_setting_connection_get_ignore_config (NMSettingConnection *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting), TRUE); + + return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->ignore_config; +} + static gint find_setting_by_name (gconstpointer a, gconstpointer b) { @@ -667,6 +685,9 @@ set_property (GObject *object, guint prop_id, g_free (priv->master); priv->master = g_value_dup_string (value); break; + case PROP_IGNORE_CONFIG: + priv->ignore_config = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -715,6 +736,9 @@ get_property (GObject *object, guint prop_id, case PROP_MASTER: g_value_set_string (value, nm_setting_connection_get_master (setting)); break; + case PROP_IGNORE_CONFIG: + g_value_set_boolean (value, nm_setting_connection_get_ignore_config (setting)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -915,4 +939,21 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class) "Name of the master device or UUID of the master connection", NULL, G_PARAM_READWRITE | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE)); + + /** + * NMSettingConnection:ignore-config: + * + * %TRUE if the connection ignores high level configuration such as + * ip configuration. + **/ + g_object_class_install_property + (object_class, PROP_IGNORE_CONFIG, + g_param_spec_boolean (NM_SETTING_CONNECTION_IGNORE_CONFIG, + "Ignore-Config", + "If TRUE, the connection will ignore any high level " + "configuration such as \"ip configuration\". This is " + "typically the case for bonding or bridging slave " + "connections.", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE | NM_SETTING_PARAM_FUZZY_IGNORE)); } diff --git a/libnm-util/nm-setting-connection.h b/libnm-util/nm-setting-connection.h index 0768bd6..a7ff659 100644 --- a/libnm-util/nm-setting-connection.h +++ b/libnm-util/nm-setting-connection.h @@ -68,14 +68,15 @@ GType nm_setting_connection_error_get_type (void); #define NM_SETTING_CONNECTION_ERROR nm_setting_connection_error_quark () GQuark nm_setting_connection_error_quark (void); -#define NM_SETTING_CONNECTION_ID "id" -#define NM_SETTING_CONNECTION_UUID "uuid" -#define NM_SETTING_CONNECTION_TYPE "type" -#define NM_SETTING_CONNECTION_AUTOCONNECT "autoconnect" -#define NM_SETTING_CONNECTION_TIMESTAMP "timestamp" -#define NM_SETTING_CONNECTION_READ_ONLY "read-only" -#define NM_SETTING_CONNECTION_PERMISSIONS "permissions" -#define NM_SETTING_CONNECTION_MASTER "master" +#define NM_SETTING_CONNECTION_ID "id" +#define NM_SETTING_CONNECTION_UUID "uuid" +#define NM_SETTING_CONNECTION_TYPE "type" +#define NM_SETTING_CONNECTION_AUTOCONNECT "autoconnect" +#define NM_SETTING_CONNECTION_TIMESTAMP "timestamp" +#define NM_SETTING_CONNECTION_READ_ONLY "read-only" +#define NM_SETTING_CONNECTION_PERMISSIONS "permissions" +#define NM_SETTING_CONNECTION_MASTER "master" +#define NM_SETTING_CONNECTION_IGNORE_CONFIG "ignore-config" /** * NMSettingConnection: @@ -122,6 +123,8 @@ void nm_setting_connection_remove_permission (NMSettingConnection *set guint32 idx); const char *nm_setting_connection_get_master (NMSettingConnection *setting); +gboolean nm_setting_connection_get_ignore_config (NMSettingConnection *setting); + G_END_DECLS #endif /* NM_SETTING_CONNECTION_H */ diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c index 1b12069..961fa6c 100644 --- a/src/settings/plugins/ifcfg-rh/reader.c +++ b/src/settings/plugins/ifcfg-rh/reader.c @@ -143,6 +143,11 @@ make_connection_setting (const char *file, if (value) { g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL); g_free (value); + + /* Slave should ignore any high level configurations */ + g_object_set (s_con, + NM_SETTING_CONNECTION_IGNORE_CONFIG, TRUE, + NULL); } value = svGetValue (ifcfg, "USERS", FALSE); @@ -1117,6 +1122,24 @@ error: return success; } +static NMSetting * +make_disabled_ip4_setting (shvarFile *ifcfg, GError **error) +{ + NMSettingIP4Config *s_ip4 = NULL; + + s_ip4 = (NMSettingIP4Config *) nm_setting_ip4_config_new (); + if (!s_ip4) { + g_set_error (error, IFCFG_PLUGIN_ERROR, 0, + "Could not allocate IP4 setting"); + return NULL; + } + + g_object_set (s_ip4, + NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_DISABLED, + NULL); + + return NM_SETTING (s_ip4); +} static NMSetting * make_ip4_setting (shvarFile *ifcfg, @@ -3490,6 +3513,17 @@ is_bond_device (const char *name, shvarFile *parsed) return FALSE; } +static gboolean +connection_ignore_config (NMConnection *connection) +{ + NMSettingConnection *s_con; + + s_con = NM_SETTING_CONNECTION( nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); + g_assert (s_con); + + return nm_setting_connection_get_ignore_config (s_con); +} + enum { IGNORE_REASON_NONE = 0x00, IGNORE_REASON_BRIDGE = 0x01, @@ -3672,6 +3706,18 @@ connection_from_file (const char *filename, goto done; } + /* Some connections such as bond slaves deliberately ignore the high level config */ + if (connection_ignore_config (connection)) { + s_ip4 = make_disabled_ip4_setting (parsed, &error); + if (error) { + g_object_unref (connection); + connection = NULL; + } else + nm_connection_add_setting (connection, s_ip4); + + goto verify; + } + s_ip6 = make_ip6_setting (parsed, network_file, iscsiadm_path, &error); if (error) { g_object_unref (connection); @@ -3710,6 +3756,7 @@ connection_from_file (const char *filename, } g_free (bootproto); +verify: if (!nm_connection_verify (connection, &error)) { g_object_unref (connection); connection = NULL; -- 1.7.6 _______________________________________________ networkmanager-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/networkmanager-list
