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

Reply via email to