[PATCH 8/9] ifcfg: Ignore higher level configs for bonding slaves



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 <tgraf redhat com>
---
 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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]