summary refs log tree commit diff
path: root/libnm-core/nm-setting-sriov.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-core/nm-setting-sriov.c')
-rw-r--r--libnm-core/nm-setting-sriov.c1655
1 files changed, 823 insertions, 832 deletions
diff --git a/libnm-core/nm-setting-sriov.c b/libnm-core/nm-setting-sriov.c
index 3c52dc6c..942ef6d4 100644
--- a/libnm-core/nm-setting-sriov.c
+++ b/libnm-core/nm-setting-sriov.c
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: LGPL-2.1+
+/* SPDX-License-Identifier: LGPL-2.1+ */
 /*
  * Copyright (C) 2018 Red Hat, Inc.
  */
@@ -18,11 +18,7 @@
 
 /*****************************************************************************/
 
-NM_GOBJECT_PROPERTIES_DEFINE (NMSettingSriov,
-	PROP_TOTAL_VFS,
-	PROP_VFS,
-	PROP_AUTOPROBE_DRIVERS,
-);
+NM_GOBJECT_PROPERTIES_DEFINE(NMSettingSriov, PROP_TOTAL_VFS, PROP_VFS, PROP_AUTOPROBE_DRIVERS, );
 
 /**
  * NMSettingSriov:
@@ -32,56 +28,53 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMSettingSriov,
  * Since: 1.14
  */
 struct _NMSettingSriov {
-	NMSetting parent;
-	GPtrArray *vfs;
-	guint total_vfs;
-	NMTernary autoprobe_drivers;
+    NMSetting  parent;
+    GPtrArray *vfs;
+    guint      total_vfs;
+    NMTernary  autoprobe_drivers;
 };
 
 struct _NMSettingSriovClass {
-	NMSettingClass parent;
+    NMSettingClass parent;
 };
 
-G_DEFINE_TYPE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING)
+G_DEFINE_TYPE(NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING)
 
 /*****************************************************************************/
 
-G_DEFINE_BOXED_TYPE (NMSriovVF, nm_sriov_vf, nm_sriov_vf_dup, nm_sriov_vf_unref)
+G_DEFINE_BOXED_TYPE(NMSriovVF, nm_sriov_vf, nm_sriov_vf_dup, nm_sriov_vf_unref)
 
 struct _NMSriovVF {
-	guint refcount;
-	guint index;
-	GHashTable *attributes;
-	GHashTable *vlans;
-	guint *vlan_ids;
+    guint       refcount;
+    guint       index;
+    GHashTable *attributes;
+    GHashTable *vlans;
+    guint *     vlan_ids;
 };
 
 typedef struct {
-	guint id;
-	guint qos;
-	NMSriovVFVlanProtocol protocol;
+    guint                 id;
+    guint                 qos;
+    NMSriovVFVlanProtocol protocol;
 } VFVlan;
 
 static guint
-_vf_vlan_hash (gconstpointer ptr)
+_vf_vlan_hash(gconstpointer ptr)
 {
-	return nm_hash_val (1348254767u, *((guint *) ptr));
+    return nm_hash_val(1348254767u, *((guint *) ptr));
 }
 
 static gboolean
-_vf_vlan_equal (gconstpointer a, gconstpointer b)
+_vf_vlan_equal(gconstpointer a, gconstpointer b)
 {
-	return *((guint *) a) == *((guint *) b);
+    return *((guint *) a) == *((guint *) b);
 }
 
 static GHashTable *
-_vf_vlan_create_hash (void)
+_vf_vlan_create_hash(void)
 {
-	G_STATIC_ASSERT_EXPR (G_STRUCT_OFFSET (VFVlan, id) == 0);
-	return g_hash_table_new_full (_vf_vlan_hash,
-	                              _vf_vlan_equal,
-	                              NULL,
-	                              nm_g_slice_free_fcn (VFVlan));
+    G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(VFVlan, id) == 0);
+    return g_hash_table_new_full(_vf_vlan_hash, _vf_vlan_equal, NULL, nm_g_slice_free_fcn(VFVlan));
 }
 
 /**
@@ -95,20 +88,20 @@ _vf_vlan_create_hash (void)
  * Since: 1.14
  **/
 NMSriovVF *
-nm_sriov_vf_new (guint index)
+nm_sriov_vf_new(guint index)
 {
-	NMSriovVF *vf;
-
-	vf = g_slice_new (NMSriovVF);
-	*vf = (NMSriovVF) {
-		.refcount   = 1,
-		.index      = index,
-		.attributes = g_hash_table_new_full (nm_str_hash,
-		                                     g_str_equal,
-		                                     g_free,
-		                                     (GDestroyNotify) g_variant_unref),
-	};
-	return vf;
+    NMSriovVF *vf;
+
+    vf  = g_slice_new(NMSriovVF);
+    *vf = (NMSriovVF){
+        .refcount   = 1,
+        .index      = index,
+        .attributes = g_hash_table_new_full(nm_str_hash,
+                                            g_str_equal,
+                                            g_free,
+                                            (GDestroyNotify) g_variant_unref),
+    };
+    return vf;
 }
 
 /**
@@ -120,12 +113,12 @@ nm_sriov_vf_new (guint index)
  * Since: 1.14
  **/
 void
-nm_sriov_vf_ref (NMSriovVF *vf)
+nm_sriov_vf_ref(NMSriovVF *vf)
 {
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
 
-	vf->refcount++;
+    vf->refcount++;
 }
 
 /**
@@ -138,19 +131,19 @@ nm_sriov_vf_ref (NMSriovVF *vf)
  * Since: 1.14
  **/
 void
-nm_sriov_vf_unref (NMSriovVF *vf)
+nm_sriov_vf_unref(NMSriovVF *vf)
 {
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
-
-	vf->refcount--;
-	if (vf->refcount == 0) {
-		g_hash_table_unref (vf->attributes);
-		if (vf->vlans)
-			g_hash_table_unref (vf->vlans);
-		g_free (vf->vlan_ids);
-		nm_g_slice_free (vf);
-	}
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
+
+    vf->refcount--;
+    if (vf->refcount == 0) {
+        g_hash_table_unref(vf->attributes);
+        if (vf->vlans)
+            g_hash_table_unref(vf->vlans);
+        g_free(vf->vlan_ids);
+        nm_g_slice_free(vf);
+    }
 }
 
 /**
@@ -167,74 +160,70 @@ nm_sriov_vf_unref (NMSriovVF *vf)
  * Since: 1.14
  **/
 gboolean
-nm_sriov_vf_equal (const NMSriovVF *vf, const NMSriovVF *other)
+nm_sriov_vf_equal(const NMSriovVF *vf, const NMSriovVF *other)
 {
-	GHashTableIter iter;
-	const char *key;
-	GVariant *value, *value2;
-	VFVlan *vlan, *vlan2;
-	guint n_vlans;
-
-	g_return_val_if_fail (vf, FALSE);
-	g_return_val_if_fail (vf->refcount > 0, FALSE);
-	g_return_val_if_fail (other, FALSE);
-	g_return_val_if_fail (other->refcount > 0, FALSE);
-
-	if (vf == other)
-		return TRUE;
-
-	if (vf->index != other->index)
-		return FALSE;
-
-	if (g_hash_table_size (vf->attributes) != g_hash_table_size (other->attributes))
-		return FALSE;
-	g_hash_table_iter_init (&iter, vf->attributes);
-	while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) {
-		value2 = g_hash_table_lookup (other->attributes, key);
-		if (!value2)
-			return FALSE;
-		if (!g_variant_equal (value, value2))
-			return FALSE;
-	}
-
-	n_vlans = vf->vlans ? g_hash_table_size (vf->vlans) : 0u;
-	if (n_vlans != (other->vlans ? g_hash_table_size (other->vlans) : 0u))
-		return FALSE;
-	if (n_vlans > 0) {
-		g_hash_table_iter_init (&iter, vf->vlans);
-		while (g_hash_table_iter_next (&iter, (gpointer *) &vlan, NULL)) {
-			vlan2 = g_hash_table_lookup (other->vlans, vlan);
-			if (!vlan2)
-				return FALSE;
-			if (   vlan->qos != vlan2->qos
-			    || vlan->protocol != vlan2->protocol)
-				return FALSE;
-		}
-	}
-
-	return TRUE;
+    GHashTableIter iter;
+    const char *   key;
+    GVariant *     value, *value2;
+    VFVlan *       vlan, *vlan2;
+    guint          n_vlans;
+
+    g_return_val_if_fail(vf, FALSE);
+    g_return_val_if_fail(vf->refcount > 0, FALSE);
+    g_return_val_if_fail(other, FALSE);
+    g_return_val_if_fail(other->refcount > 0, FALSE);
+
+    if (vf == other)
+        return TRUE;
+
+    if (vf->index != other->index)
+        return FALSE;
+
+    if (g_hash_table_size(vf->attributes) != g_hash_table_size(other->attributes))
+        return FALSE;
+    g_hash_table_iter_init(&iter, vf->attributes);
+    while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &value)) {
+        value2 = g_hash_table_lookup(other->attributes, key);
+        if (!value2)
+            return FALSE;
+        if (!g_variant_equal(value, value2))
+            return FALSE;
+    }
+
+    n_vlans = vf->vlans ? g_hash_table_size(vf->vlans) : 0u;
+    if (n_vlans != (other->vlans ? g_hash_table_size(other->vlans) : 0u))
+        return FALSE;
+    if (n_vlans > 0) {
+        g_hash_table_iter_init(&iter, vf->vlans);
+        while (g_hash_table_iter_next(&iter, (gpointer *) &vlan, NULL)) {
+            vlan2 = g_hash_table_lookup(other->vlans, vlan);
+            if (!vlan2)
+                return FALSE;
+            if (vlan->qos != vlan2->qos || vlan->protocol != vlan2->protocol)
+                return FALSE;
+        }
+    }
+
+    return TRUE;
 }
 
 static void
-vf_add_vlan (NMSriovVF *vf,
-             guint vlan_id,
-             guint qos,
-             NMSriovVFVlanProtocol protocol)
+vf_add_vlan(NMSriovVF *vf, guint vlan_id, guint qos, NMSriovVFVlanProtocol protocol)
 {
-	VFVlan *vlan;
+    VFVlan *vlan;
 
-	vlan = g_slice_new (VFVlan);
-	*vlan = (VFVlan) {
-		.id       = vlan_id,
-		.qos      = qos,
-		.protocol = protocol,
-	};
+    vlan  = g_slice_new(VFVlan);
+    *vlan = (VFVlan){
+        .id       = vlan_id,
+        .qos      = qos,
+        .protocol = protocol,
+    };
 
-	if (!vf->vlans)
-		vf->vlans = _vf_vlan_create_hash ();
+    if (!vf->vlans)
+        vf->vlans = _vf_vlan_create_hash();
 
-	g_hash_table_add (vf->vlans, vlan);
-	nm_clear_g_free (&vf->vlan_ids);
+    g_hash_table_add(vf->vlans, vlan);
+    nm_clear_g_free(&vf->vlan_ids);
 }
 
 /**
@@ -248,30 +237,30 @@ vf_add_vlan (NMSriovVF *vf,
  * Since: 1.14
  **/
 NMSriovVF *
-nm_sriov_vf_dup (const NMSriovVF *vf)
+nm_sriov_vf_dup(const NMSriovVF *vf)
 {
-	NMSriovVF *copy;
-	GHashTableIter iter;
-	const char *name;
-	GVariant *variant;
-	VFVlan *vlan;
+    NMSriovVF *    copy;
+    GHashTableIter iter;
+    const char *   name;
+    GVariant *     variant;
+    VFVlan *       vlan;
 
-	g_return_val_if_fail (vf, NULL);
-	g_return_val_if_fail (vf->refcount > 0, NULL);
+    g_return_val_if_fail(vf, NULL);
+    g_return_val_if_fail(vf->refcount > 0, NULL);
 
-	copy = nm_sriov_vf_new (vf->index);
+    copy = nm_sriov_vf_new(vf->index);
 
-	g_hash_table_iter_init (&iter, vf->attributes);
-	while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &variant))
-		nm_sriov_vf_set_attribute (copy, name, variant);
+    g_hash_table_iter_init(&iter, vf->attributes);
+    while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &variant))
+        nm_sriov_vf_set_attribute(copy, name, variant);
 
-	if (vf->vlans) {
-		g_hash_table_iter_init (&iter, vf->vlans);
-		while (g_hash_table_iter_next (&iter, (gpointer *) &vlan, NULL))
-			vf_add_vlan (copy, vlan->id, vlan->qos, vlan->protocol);
-	}
+    if (vf->vlans) {
+        g_hash_table_iter_init(&iter, vf->vlans);
+        while (g_hash_table_iter_next(&iter, (gpointer *) &vlan, NULL))
+            vf_add_vlan(copy, vlan->id, vlan->qos, vlan->protocol);
+    }
 
-	return copy;
+    return copy;
 }
 
 /**
@@ -285,12 +274,12 @@ nm_sriov_vf_dup (const NMSriovVF *vf)
  * Since: 1.14
  **/
 guint
-nm_sriov_vf_get_index (const NMSriovVF *vf)
+nm_sriov_vf_get_index(const NMSriovVF *vf)
 {
-	g_return_val_if_fail (vf, 0);
-	g_return_val_if_fail (vf->refcount > 0, 0);
+    g_return_val_if_fail(vf, 0);
+    g_return_val_if_fail(vf->refcount > 0, 0);
 
-	return vf->index;
+    return vf->index;
 }
 
 /**
@@ -304,19 +293,17 @@ nm_sriov_vf_get_index (const NMSriovVF *vf)
  * Since: 1.14
  **/
 void
-nm_sriov_vf_set_attribute (NMSriovVF *vf, const char *name, GVariant *value)
+nm_sriov_vf_set_attribute(NMSriovVF *vf, const char *name, GVariant *value)
 {
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
-	g_return_if_fail (name && *name != '\0');
-	g_return_if_fail (!nm_streq (name, "index"));
-
-	if (value) {
-		g_hash_table_insert (vf->attributes,
-		                     g_strdup (name),
-		                     g_variant_ref_sink (value));
-	} else
-		g_hash_table_remove (vf->attributes, name);
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
+    g_return_if_fail(name && *name != '\0');
+    g_return_if_fail(!nm_streq(name, "index"));
+
+    if (value) {
+        g_hash_table_insert(vf->attributes, g_strdup(name), g_variant_ref_sink(value));
+    } else
+        g_hash_table_remove(vf->attributes, name);
 }
 
 /**
@@ -330,12 +317,12 @@ nm_sriov_vf_set_attribute (NMSriovVF *vf, const char *name, GVariant *value)
  * Since: 1.14
  **/
 const char **
-nm_sriov_vf_get_attribute_names (const NMSriovVF *vf)
+nm_sriov_vf_get_attribute_names(const NMSriovVF *vf)
 {
-	g_return_val_if_fail (vf, NULL);
-	g_return_val_if_fail (vf->refcount > 0, NULL);
+    g_return_val_if_fail(vf, NULL);
+    g_return_val_if_fail(vf->refcount > 0, NULL);
 
-	return nm_utils_strdict_get_keys (vf->attributes, TRUE, NULL);
+    return nm_utils_strdict_get_keys(vf->attributes, TRUE, NULL);
 }
 
 /**
@@ -351,24 +338,26 @@ nm_sriov_vf_get_attribute_names (const NMSriovVF *vf)
  * Since: 1.14
  **/
 GVariant *
-nm_sriov_vf_get_attribute (const NMSriovVF *vf, const char *name)
+nm_sriov_vf_get_attribute(const NMSriovVF *vf, const char *name)
 {
-	g_return_val_if_fail (vf, NULL);
-	g_return_val_if_fail (vf->refcount > 0, NULL);
-	g_return_val_if_fail (name && *name != '\0', NULL);
+    g_return_val_if_fail(vf, NULL);
+    g_return_val_if_fail(vf->refcount > 0, NULL);
+    g_return_val_if_fail(name && *name != '\0', NULL);
 
-	return g_hash_table_lookup (vf->attributes, name);
+    return g_hash_table_lookup(vf->attributes, name);
 }
 
 const NMVariantAttributeSpec *const _nm_sriov_vf_attribute_spec[] = {
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE (NM_SRIOV_VF_ATTRIBUTE_MAC,         G_VARIANT_TYPE_STRING,  .str_type = 'm', ),
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE (NM_SRIOV_VF_ATTRIBUTE_SPOOF_CHECK, G_VARIANT_TYPE_BOOLEAN,                  ),
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE (NM_SRIOV_VF_ATTRIBUTE_TRUST,       G_VARIANT_TYPE_BOOLEAN,                  ),
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE (NM_SRIOV_VF_ATTRIBUTE_MIN_TX_RATE, G_VARIANT_TYPE_UINT32,                   ),
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE (NM_SRIOV_VF_ATTRIBUTE_MAX_TX_RATE, G_VARIANT_TYPE_UINT32,                   ),
-	/* D-Bus only, synthetic attributes */
-	NM_VARIANT_ATTRIBUTE_SPEC_DEFINE ("vlans",                           G_VARIANT_TYPE_STRING,  .str_type = 'd', ),
-	NULL,
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MAC,
+                                     G_VARIANT_TYPE_STRING,
+                                     .str_type = 'm', ),
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_SPOOF_CHECK, G_VARIANT_TYPE_BOOLEAN, ),
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_TRUST, G_VARIANT_TYPE_BOOLEAN, ),
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MIN_TX_RATE, G_VARIANT_TYPE_UINT32, ),
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE(NM_SRIOV_VF_ATTRIBUTE_MAX_TX_RATE, G_VARIANT_TYPE_UINT32, ),
+    /* D-Bus only, synthetic attributes */
+    NM_VARIANT_ATTRIBUTE_SPEC_DEFINE("vlans", G_VARIANT_TYPE_STRING, .str_type = 'd', ),
+    NULL,
 };
 
 /**
@@ -386,100 +375,95 @@ const NMVariantAttributeSpec *const _nm_sriov_vf_attribute_spec[] = {
  * Since: 1.14
  */
 gboolean
-nm_sriov_vf_attribute_validate  (const char *name,
-                                 GVariant *value,
-                                 gboolean *known,
-                                 GError **error)
+nm_sriov_vf_attribute_validate(const char *name, GVariant *value, gboolean *known, GError **error)
 {
-	const NMVariantAttributeSpec *const *iter;
-	const NMVariantAttributeSpec *spec = NULL;
-
-	g_return_val_if_fail (name, FALSE);
-	g_return_val_if_fail (value, FALSE);
-	g_return_val_if_fail (!error || !*error, FALSE);
-
-	for (iter = _nm_sriov_vf_attribute_spec; *iter; iter++) {
-		if (nm_streq (name, (*iter)->name)) {
-			spec = *iter;
-			break;
-		}
-	}
-
-	if (!spec || spec->str_type == 'd') {
-		NM_SET_OUT (known, FALSE);
-		g_set_error_literal (error,
-		                     NM_CONNECTION_ERROR,
-		                     NM_CONNECTION_ERROR_FAILED,
-		                     _("unknown attribute"));
-		return FALSE;
-	}
-
-	NM_SET_OUT (known, TRUE);
-
-	if (!g_variant_is_of_type (value, spec->type)) {
-		g_set_error (error,
-		             NM_CONNECTION_ERROR,
-		             NM_CONNECTION_ERROR_FAILED,
-		             _("invalid attribute type '%s'"),
-		             g_variant_get_type_string (value));
-		return FALSE;
-	}
-
-	if (g_variant_type_equal (spec->type, G_VARIANT_TYPE_STRING)) {
-		const char *string;
-
-		switch (spec->str_type) {
-		case 'm': /* MAC address */
-			string = g_variant_get_string (value, NULL);
-			if (!nm_utils_hwaddr_valid (string, -1)) {
-				g_set_error (error,
-				             NM_CONNECTION_ERROR,
-				             NM_CONNECTION_ERROR_FAILED,
-				             _("'%s' is not a valid MAC address"),
-				             string);
-				return FALSE;
-			}
-			break;
-		default:
-			break;
-		}
-	}
-
-	return TRUE;
+    const NMVariantAttributeSpec *const *iter;
+    const NMVariantAttributeSpec *       spec = NULL;
+
+    g_return_val_if_fail(name, FALSE);
+    g_return_val_if_fail(value, FALSE);
+    g_return_val_if_fail(!error || !*error, FALSE);
+
+    for (iter = _nm_sriov_vf_attribute_spec; *iter; iter++) {
+        if (nm_streq(name, (*iter)->name)) {
+            spec = *iter;
+            break;
+        }
+    }
+
+    if (!spec || spec->str_type == 'd') {
+        NM_SET_OUT(known, FALSE);
+        g_set_error_literal(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_FAILED,
+                            _("unknown attribute"));
+        return FALSE;
+    }
+
+    NM_SET_OUT(known, TRUE);
+
+    if (!g_variant_is_of_type(value, spec->type)) {
+        g_set_error(error,
+                    NM_CONNECTION_ERROR,
+                    NM_CONNECTION_ERROR_FAILED,
+                    _("invalid attribute type '%s'"),
+                    g_variant_get_type_string(value));
+        return FALSE;
+    }
+
+    if (g_variant_type_equal(spec->type, G_VARIANT_TYPE_STRING)) {
+        const char *string;
+
+        switch (spec->str_type) {
+        case 'm': /* MAC address */
+            string = g_variant_get_string(value, NULL);
+            if (!nm_utils_hwaddr_valid(string, -1)) {
+                g_set_error(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_FAILED,
+                            _("'%s' is not a valid MAC address"),
+                            string);
+                return FALSE;
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+    return TRUE;
 }
 
 gboolean
-_nm_sriov_vf_attribute_validate_all (const NMSriovVF *vf, GError **error)
+_nm_sriov_vf_attribute_validate_all(const NMSriovVF *vf, GError **error)
 {
-	GHashTableIter iter;
-	const char *name;
-	GVariant *variant;
-	GVariant *min, *max;
-
-	g_return_val_if_fail (vf, FALSE);
-	g_return_val_if_fail (vf->refcount > 0, FALSE);
-
-	g_hash_table_iter_init (&iter, vf->attributes);
-	while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &variant)) {
-		if (!nm_sriov_vf_attribute_validate (name, variant, NULL, error)) {
-			g_prefix_error (error, "attribute '%s':", name);
-			return FALSE;
-		}
-	}
-
-	min = g_hash_table_lookup (vf->attributes, NM_SRIOV_VF_ATTRIBUTE_MIN_TX_RATE);
-	max = g_hash_table_lookup (vf->attributes, NM_SRIOV_VF_ATTRIBUTE_MAX_TX_RATE);
-	if (   min
-	    && max
-	    && g_variant_get_uint32 (min) > g_variant_get_uint32 (max)) {
-		g_set_error (error,
-		             NM_CONNECTION_ERROR,
-		             NM_CONNECTION_ERROR_FAILED,
-		             "min_tx_rate is greater than max_tx_rate");
-		return FALSE;
-	}
-
-	return TRUE;
+    GHashTableIter iter;
+    const char *   name;
+    GVariant *     variant;
+    GVariant *     min, *max;
+
+    g_return_val_if_fail(vf, FALSE);
+    g_return_val_if_fail(vf->refcount > 0, FALSE);
+
+    g_hash_table_iter_init(&iter, vf->attributes);
+    while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &variant)) {
+        if (!nm_sriov_vf_attribute_validate(name, variant, NULL, error)) {
+            g_prefix_error(error, "attribute '%s':", name);
+            return FALSE;
+        }
+    }
+
+    min = g_hash_table_lookup(vf->attributes, NM_SRIOV_VF_ATTRIBUTE_MIN_TX_RATE);
+    max = g_hash_table_lookup(vf->attributes, NM_SRIOV_VF_ATTRIBUTE_MAX_TX_RATE);
+    if (min && max && g_variant_get_uint32(min) > g_variant_get_uint32(max)) {
+        g_set_error(error,
+                    NM_CONNECTION_ERROR,
+                    NM_CONNECTION_ERROR_FAILED,
+                    "min_tx_rate is greater than max_tx_rate");
+        return FALSE;
+    }
+
+    return TRUE;
 }
 
 /**
@@ -494,18 +478,17 @@ _nm_sriov_vf_attribute_validate_all (const NMSriovVF *vf, GError **error)
  * Since: 1.14
  **/
 gboolean
-nm_sriov_vf_add_vlan (NMSriovVF *vf, guint vlan_id)
+nm_sriov_vf_add_vlan(NMSriovVF *vf, guint vlan_id)
 {
-	g_return_val_if_fail (vf, FALSE);
-	g_return_val_if_fail (vf->refcount > 0, FALSE);
+    g_return_val_if_fail(vf, FALSE);
+    g_return_val_if_fail(vf->refcount > 0, FALSE);
 
-	if (   vf->vlans
-	    && g_hash_table_contains (vf->vlans, &vlan_id))
-		return FALSE;
+    if (vf->vlans && g_hash_table_contains(vf->vlans, &vlan_id))
+        return FALSE;
 
-	vf_add_vlan (vf, vlan_id, 0, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
+    vf_add_vlan(vf, vlan_id, 0, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
 
-	return TRUE;
+    return TRUE;
 }
 
 /**
@@ -521,30 +504,30 @@ nm_sriov_vf_add_vlan (NMSriovVF *vf, guint vlan_id)
  * Since: 1.14
  */
 gboolean
-nm_sriov_vf_remove_vlan (NMSriovVF *vf, guint vlan_id)
+nm_sriov_vf_remove_vlan(NMSriovVF *vf, guint vlan_id)
 {
-	g_return_val_if_fail (vf, FALSE);
-	g_return_val_if_fail (vf->refcount > 0, FALSE);
+    g_return_val_if_fail(vf, FALSE);
+    g_return_val_if_fail(vf->refcount > 0, FALSE);
 
-	if (   !vf->vlans
-	    || !g_hash_table_remove (vf->vlans, &vlan_id))
-		return FALSE;
+    if (!vf->vlans || !g_hash_table_remove(vf->vlans, &vlan_id))
+        return FALSE;
 
-	nm_clear_g_free (&vf->vlan_ids);
-	return TRUE;
+    nm_clear_g_free(&vf->vlan_ids);
+    return TRUE;
 }
 
 static int
-vlan_id_compare (gconstpointer a, gconstpointer b, gpointer user_data)
+vlan_id_compare(gconstpointer a, gconstpointer b, gpointer user_data)
 {
-	guint id_a  = *(guint *) a;
-	guint id_b  = *(guint *) b;
-
-	if (id_a < id_b)
-		return -1;
-	else if (id_a > id_b)
-		return 1;
-	else return 0;
+    guint id_a = *(guint *) a;
+    guint id_b = *(guint *) b;
+
+    if (id_a < id_b)
+        return -1;
+    else if (id_a > id_b)
+        return 1;
+    else
+        return 0;
 }
 
 /**
@@ -559,37 +542,37 @@ vlan_id_compare (gconstpointer a, gconstpointer b, gpointer user_data)
  * Since: 1.14
  */
 const guint *
-nm_sriov_vf_get_vlan_ids (const NMSriovVF *vf, guint *length)
+nm_sriov_vf_get_vlan_ids(const NMSriovVF *vf, guint *length)
 {
-	GHashTableIter iter;
-	VFVlan *vlan;
-	guint num, i;
+    GHashTableIter iter;
+    VFVlan *       vlan;
+    guint          num, i;
 
-	g_return_val_if_fail (vf, NULL);
-	g_return_val_if_fail (vf->refcount > 0, NULL);
+    g_return_val_if_fail(vf, NULL);
+    g_return_val_if_fail(vf->refcount > 0, NULL);
 
-	num = vf->vlans ? g_hash_table_size (vf->vlans) : 0u;
-	NM_SET_OUT (length, num);
+    num = vf->vlans ? g_hash_table_size(vf->vlans) : 0u;
+    NM_SET_OUT(length, num);
 
-	if (vf->vlan_ids)
-		return vf->vlan_ids;
-	if (num == 0)
-		return NULL;
+    if (vf->vlan_ids)
+        return vf->vlan_ids;
+    if (num == 0)
+        return NULL;
 
-	/* vf is const, however, vlan_ids is a mutable field caching the
-	 * result ("mutable" in C++ terminology) */
-	((NMSriovVF *) vf)->vlan_ids = g_new0 (guint, num);
+    /* vf is const, however, vlan_ids is a mutable field caching the
+     * result ("mutable" in C++ terminology) */
+    ((NMSriovVF *) vf)->vlan_ids = g_new0(guint, num);
 
-	i = 0;
-	g_hash_table_iter_init (&iter, vf->vlans);
-	while (g_hash_table_iter_next (&iter, (gpointer *) &vlan, NULL))
-		vf->vlan_ids[i++] = vlan->id;
+    i = 0;
+    g_hash_table_iter_init(&iter, vf->vlans);
+    while (g_hash_table_iter_next(&iter, (gpointer *) &vlan, NULL))
+        vf->vlan_ids[i++] = vlan->id;
 
-	nm_assert (num == i);
+    nm_assert(num == i);
 
-	g_qsort_with_data (vf->vlan_ids, num, sizeof (guint), vlan_id_compare, NULL);
+    g_qsort_with_data(vf->vlan_ids, num, sizeof(guint), vlan_id_compare, NULL);
 
-	return vf->vlan_ids;
+    return vf->vlan_ids;
 }
 
 /**
@@ -603,18 +586,17 @@ nm_sriov_vf_get_vlan_ids (const NMSriovVF *vf, guint *length)
  * Since: 1.14
  */
 void
-nm_sriov_vf_set_vlan_qos (NMSriovVF *vf, guint vlan_id, guint32 qos)
+nm_sriov_vf_set_vlan_qos(NMSriovVF *vf, guint vlan_id, guint32 qos)
 {
-	VFVlan *vlan;
+    VFVlan *vlan;
 
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
 
-	if (   !vf->vlans
-	    || !(vlan = g_hash_table_lookup (vf->vlans, &vlan_id)))
-		g_return_if_reached ();
+    if (!vf->vlans || !(vlan = g_hash_table_lookup(vf->vlans, &vlan_id)))
+        g_return_if_reached();
 
-	vlan->qos = qos;
+    vlan->qos = qos;
 }
 
 /**
@@ -628,18 +610,17 @@ nm_sriov_vf_set_vlan_qos (NMSriovVF *vf, guint vlan_id, guint32 qos)
  * Since: 1.14
  */
 void
-nm_sriov_vf_set_vlan_protocol (NMSriovVF *vf, guint vlan_id, NMSriovVFVlanProtocol protocol)
+nm_sriov_vf_set_vlan_protocol(NMSriovVF *vf, guint vlan_id, NMSriovVFVlanProtocol protocol)
 {
-	VFVlan *vlan;
+    VFVlan *vlan;
 
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
 
-	if (   !vf->vlans
-	    || !(vlan = g_hash_table_lookup (vf->vlans, &vlan_id)))
-		g_return_if_reached ();
+    if (!vf->vlans || !(vlan = g_hash_table_lookup(vf->vlans, &vlan_id)))
+        g_return_if_reached();
 
-	vlan->protocol = protocol;
+    vlan->protocol = protocol;
 }
 
 /**
@@ -654,18 +635,17 @@ nm_sriov_vf_set_vlan_protocol (NMSriovVF *vf, guint vlan_id, NMSriovVFVlanProtoc
  * Since: 1.14
  */
 guint32
-nm_sriov_vf_get_vlan_qos (const NMSriovVF *vf, guint vlan_id)
+nm_sriov_vf_get_vlan_qos(const NMSriovVF *vf, guint vlan_id)
 {
-	VFVlan *vlan;
+    VFVlan *vlan;
 
-	g_return_val_if_fail (vf, 0);
-	g_return_val_if_fail (vf->refcount > 0, 0);
+    g_return_val_if_fail(vf, 0);
+    g_return_val_if_fail(vf->refcount > 0, 0);
 
-	if (   !vf->vlans
-	    || !(vlan = g_hash_table_lookup (vf->vlans, &vlan_id)))
-		g_return_val_if_reached (0);
+    if (!vf->vlans || !(vlan = g_hash_table_lookup(vf->vlans, &vlan_id)))
+        g_return_val_if_reached(0);
 
-	return vlan->qos;
+    return vlan->qos;
 }
 
 /*
@@ -680,18 +660,17 @@ nm_sriov_vf_get_vlan_qos (const NMSriovVF *vf, guint vlan_id)
  * Since: 1.14
  */
 NMSriovVFVlanProtocol
-nm_sriov_vf_get_vlan_protocol (const NMSriovVF *vf, guint vlan_id)
+nm_sriov_vf_get_vlan_protocol(const NMSriovVF *vf, guint vlan_id)
 {
-	VFVlan *vlan;
+    VFVlan *vlan;
 
-	g_return_val_if_fail (vf, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
-	g_return_val_if_fail (vf->refcount > 0, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
+    g_return_val_if_fail(vf, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
+    g_return_val_if_fail(vf->refcount > 0, NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
 
-	if (   !vf->vlans
-	    || !(vlan = g_hash_table_lookup (vf->vlans, &vlan_id)))
-		g_return_val_if_reached (NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
+    if (!vf->vlans || !(vlan = g_hash_table_lookup(vf->vlans, &vlan_id)))
+        g_return_val_if_reached(NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q);
 
-	return vlan->protocol;
+    return vlan->protocol;
 }
 
 /*****************************************************************************/
@@ -708,11 +687,11 @@ nm_sriov_vf_get_vlan_protocol (const NMSriovVF *vf, guint vlan_id)
  * Since: 1.14
  **/
 guint
-nm_setting_sriov_get_total_vfs (NMSettingSriov *setting)
+nm_setting_sriov_get_total_vfs(NMSettingSriov *setting)
 {
-	g_return_val_if_fail (NM_IS_SETTING_SRIOV (setting), 0);
+    g_return_val_if_fail(NM_IS_SETTING_SRIOV(setting), 0);
 
-	return setting->total_vfs;
+    return setting->total_vfs;
 }
 
 /**
@@ -724,11 +703,11 @@ nm_setting_sriov_get_total_vfs (NMSettingSriov *setting)
  * Since: 1.14
  **/
 guint
-nm_setting_sriov_get_num_vfs (NMSettingSriov *setting)
+nm_setting_sriov_get_num_vfs(NMSettingSriov *setting)
 {
-	g_return_val_if_fail (NM_IS_SETTING_SRIOV (setting), 0);
+    g_return_val_if_fail(NM_IS_SETTING_SRIOV(setting), 0);
 
-	return setting->vfs->len;
+    return setting->vfs->len;
 }
 
 /**
@@ -741,12 +720,12 @@ nm_setting_sriov_get_num_vfs (NMSettingSriov *setting)
  * Since: 1.14
  **/
 NMSriovVF *
-nm_setting_sriov_get_vf (NMSettingSriov *setting, guint idx)
+nm_setting_sriov_get_vf(NMSettingSriov *setting, guint idx)
 {
-	g_return_val_if_fail (NM_IS_SETTING_SRIOV (setting), NULL);
-	g_return_val_if_fail (idx < setting->vfs->len, NULL);
+    g_return_val_if_fail(NM_IS_SETTING_SRIOV(setting), NULL);
+    g_return_val_if_fail(idx < setting->vfs->len, NULL);
 
-	return setting->vfs->pdata[idx];
+    return setting->vfs->pdata[idx];
 }
 
 /**
@@ -760,14 +739,14 @@ nm_setting_sriov_get_vf (NMSettingSriov *setting, guint idx)
  * Since: 1.14
  **/
 void
-nm_setting_sriov_add_vf (NMSettingSriov *setting, NMSriovVF *vf)
+nm_setting_sriov_add_vf(NMSettingSriov *setting, NMSriovVF *vf)
 {
-	g_return_if_fail (NM_IS_SETTING_SRIOV (setting));
-	g_return_if_fail (vf);
-	g_return_if_fail (vf->refcount > 0);
+    g_return_if_fail(NM_IS_SETTING_SRIOV(setting));
+    g_return_if_fail(vf);
+    g_return_if_fail(vf->refcount > 0);
 
-	g_ptr_array_add (setting->vfs, nm_sriov_vf_dup (vf));
-	_notify (setting, PROP_VFS);
+    g_ptr_array_add(setting->vfs, nm_sriov_vf_dup(vf));
+    _notify(setting, PROP_VFS);
 }
 
 /**
@@ -780,13 +759,13 @@ nm_setting_sriov_add_vf (NMSettingSriov *setting, NMSriovVF *vf)
  * Since: 1.14
  **/
 void
-nm_setting_sriov_remove_vf (NMSettingSriov *setting, guint idx)
+nm_setting_sriov_remove_vf(NMSettingSriov *setting, guint idx)
 {
-	g_return_if_fail (NM_IS_SETTING_SRIOV (setting));
-	g_return_if_fail (idx < setting->vfs->len);
+    g_return_if_fail(NM_IS_SETTING_SRIOV(setting));
+    g_return_if_fail(idx < setting->vfs->len);
 
-	g_ptr_array_remove_index (setting->vfs, idx);
-	_notify (setting, PROP_VFS);
+    g_ptr_array_remove_index(setting->vfs, idx);
+    _notify(setting, PROP_VFS);
 }
 
 /**
@@ -801,21 +780,20 @@ nm_setting_sriov_remove_vf (NMSettingSriov *setting, guint idx)
  * Since: 1.14
  **/
 gboolean
-nm_setting_sriov_remove_vf_by_index (NMSettingSriov *setting,
-                                     guint index)
+nm_setting_sriov_remove_vf_by_index(NMSettingSriov *setting, guint index)
 {
-	guint i;
-
-	g_return_val_if_fail (NM_IS_SETTING_SRIOV (setting), FALSE);
-
-	for (i = 0; i < setting->vfs->len; i++) {
-		if (nm_sriov_vf_get_index  (setting->vfs->pdata[i]) == index) {
-			g_ptr_array_remove_index (setting->vfs, i);
-			_notify (setting, PROP_VFS);
-			return TRUE;
-		}
-	}
-	return FALSE;
+    guint i;
+
+    g_return_val_if_fail(NM_IS_SETTING_SRIOV(setting), FALSE);
+
+    for (i = 0; i < setting->vfs->len; i++) {
+        if (nm_sriov_vf_get_index(setting->vfs->pdata[i]) == index) {
+            g_ptr_array_remove_index(setting->vfs, i);
+            _notify(setting, PROP_VFS);
+            return TRUE;
+        }
+    }
+    return FALSE;
 }
 
 /**
@@ -827,14 +805,14 @@ nm_setting_sriov_remove_vf_by_index (NMSettingSriov *setting,
  * Since: 1.14
  **/
 void
-nm_setting_sriov_clear_vfs (NMSettingSriov *setting)
+nm_setting_sriov_clear_vfs(NMSettingSriov *setting)
 {
-	g_return_if_fail (NM_IS_SETTING_SRIOV (setting));
+    g_return_if_fail(NM_IS_SETTING_SRIOV(setting));
 
-	if (setting->vfs->len != 0) {
-		g_ptr_array_set_size (setting->vfs, 0);
-		_notify (setting, PROP_VFS);
-	}
+    if (setting->vfs->len != 0) {
+        g_ptr_array_set_size(setting->vfs, 0);
+        _notify(setting, PROP_VFS);
+    }
 }
 
 /**
@@ -849,376 +827,387 @@ nm_setting_sriov_clear_vfs (NMSettingSriov *setting)
  * Since: 1.14
  **/
 NMTernary
-nm_setting_sriov_get_autoprobe_drivers (NMSettingSriov *setting)
+nm_setting_sriov_get_autoprobe_drivers(NMSettingSriov *setting)
 {
-	g_return_val_if_fail (NM_IS_SETTING_SRIOV (setting), NM_TERNARY_DEFAULT);
+    g_return_val_if_fail(NM_IS_SETTING_SRIOV(setting), NM_TERNARY_DEFAULT);
 
-	return setting->autoprobe_drivers;
+    return setting->autoprobe_drivers;
 }
 
 static int
-vf_index_compare (gconstpointer a, gconstpointer b)
+vf_index_compare(gconstpointer a, gconstpointer b)
 {
-	NMSriovVF *vf_a = *(NMSriovVF **) a;
-	NMSriovVF *vf_b = *(NMSriovVF **) b;
-
-	if (vf_a->index < vf_b->index)
-		return -1;
-	else if (vf_a->index > vf_b->index)
-		return 1;
-	else
-		return 0;
+    NMSriovVF *vf_a = *(NMSriovVF **) a;
+    NMSriovVF *vf_b = *(NMSriovVF **) b;
+
+    if (vf_a->index < vf_b->index)
+        return -1;
+    else if (vf_a->index > vf_b->index)
+        return 1;
+    else
+        return 0;
 }
 
 gboolean
-_nm_setting_sriov_sort_vfs (NMSettingSriov *setting)
+_nm_setting_sriov_sort_vfs(NMSettingSriov *setting)
 {
-	gboolean need_sort = FALSE;
-	guint i;
+    gboolean need_sort = FALSE;
+    guint    i;
 
-	for (i = 1; i < setting->vfs->len; i++) {
-		NMSriovVF *vf_prev = setting->vfs->pdata[i - 1];
-		NMSriovVF *vf = setting->vfs->pdata[i];
+    for (i = 1; i < setting->vfs->len; i++) {
+        NMSriovVF *vf_prev = setting->vfs->pdata[i - 1];
+        NMSriovVF *vf      = setting->vfs->pdata[i];
 
-		if (vf->index <= vf_prev->index) {
-			need_sort = TRUE;
-			break;
-		}
-	}
+        if (vf->index <= vf_prev->index) {
+            need_sort = TRUE;
+            break;
+        }
+    }
 
-	if (need_sort) {
-		g_ptr_array_sort (setting->vfs, vf_index_compare);
-		_notify (setting, PROP_VFS);
-	}
+    if (need_sort) {
+        g_ptr_array_sort(setting->vfs, vf_index_compare);
+        _notify(setting, PROP_VFS);
+    }
 
-	return need_sort;
+    return need_sort;
 }
 
 /*****************************************************************************/
 
 static GVariant *
-vfs_to_dbus (const NMSettInfoSetting *sett_info,
-             guint property_idx,
-             NMConnection *connection,
-             NMSetting *setting,
-             NMConnectionSerializationFlags flags,
-             const NMConnectionSerializationOptions *options)
+vfs_to_dbus(const NMSettInfoSetting *               sett_info,
+            guint                                   property_idx,
+            NMConnection *                          connection,
+            NMSetting *                             setting,
+            NMConnectionSerializationFlags          flags,
+            const NMConnectionSerializationOptions *options)
 {
-	gs_unref_ptrarray GPtrArray *vfs = NULL;
-	GVariantBuilder builder;
-	guint i;
-
-	g_object_get (setting, NM_SETTING_SRIOV_VFS, &vfs, NULL);
-	g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
-
-	if (vfs) {
-		for (i = 0; i < vfs->len; i++) {
-			gs_free const char **attr_names = NULL;
-			NMSriovVF *vf = vfs->pdata[i];
-			GVariantBuilder vf_builder;
-			const guint *vlan_ids;
-			const char **name;
-			guint num_vlans = 0;
-
-			g_variant_builder_init (&vf_builder, G_VARIANT_TYPE_VARDICT);
-			g_variant_builder_add (&vf_builder, "{sv}", "index",
-			                       g_variant_new_uint32 (nm_sriov_vf_get_index (vf)));
-
-			attr_names = nm_utils_strdict_get_keys (vf->attributes, TRUE, NULL);
-			if (attr_names) {
-				for (name = attr_names; *name; name++) {
-					g_variant_builder_add (&vf_builder,
-					                       "{sv}",
-					                       *name,
-					                       nm_sriov_vf_get_attribute (vf, *name));
-				}
-			}
-
-			/* VLANs are translated into an array of maps, where each map has
-			 * keys 'id', 'qos' and 'proto'. This guarantees enough flexibility
-			 * to accommodate any future new option. */
-			vlan_ids = nm_sriov_vf_get_vlan_ids (vf, &num_vlans);
-			if (num_vlans) {
-				GVariantBuilder vlans_builder;
-				guint j;
-
-				g_variant_builder_init (&vlans_builder, G_VARIANT_TYPE ("aa{sv}"));
-				for (j = 0; j < num_vlans; j++) {
-					GVariantBuilder vlan_builder;
-
-					g_variant_builder_init (&vlan_builder, G_VARIANT_TYPE ("a{sv}"));
-					g_variant_builder_add (&vlan_builder,
-					                       "{sv}", "id",
-					                       g_variant_new_uint32 (vlan_ids[j]));
-					g_variant_builder_add (&vlan_builder,
-					                       "{sv}", "qos",
-					                       g_variant_new_uint32 (nm_sriov_vf_get_vlan_qos (vf,
-					                                                                       vlan_ids[j])));
-					g_variant_builder_add (&vlan_builder,
-					                       "{sv}", "protocol",
-					                       g_variant_new_uint32 (nm_sriov_vf_get_vlan_protocol (vf,
-					                                                                            vlan_ids[j])));
-					g_variant_builder_add (&vlans_builder,
-					                       "a{sv}",
-					                       &vlan_builder);
-				}
-				g_variant_builder_add (&vf_builder , "{sv}", "vlans", g_variant_builder_end (&vlans_builder));
-			}
-			g_variant_builder_add (&builder, "a{sv}", &vf_builder);
-		}
-	}
-
-	return g_variant_builder_end (&builder);
+    gs_unref_ptrarray GPtrArray *vfs = NULL;
+    GVariantBuilder              builder;
+    guint                        i;
+
+    g_object_get(setting, NM_SETTING_SRIOV_VFS, &vfs, NULL);
+    g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
+
+    if (vfs) {
+        for (i = 0; i < vfs->len; i++) {
+            gs_free const char **attr_names = NULL;
+            NMSriovVF *          vf         = vfs->pdata[i];
+            GVariantBuilder      vf_builder;
+            const guint *        vlan_ids;
+            const char **        name;
+            guint                num_vlans = 0;
+
+            g_variant_builder_init(&vf_builder, G_VARIANT_TYPE_VARDICT);
+            g_variant_builder_add(&vf_builder,
+                                  "{sv}",
+                                  "index",
+                                  g_variant_new_uint32(nm_sriov_vf_get_index(vf)));
+
+            attr_names = nm_utils_strdict_get_keys(vf->attributes, TRUE, NULL);
+            if (attr_names) {
+                for (name = attr_names; *name; name++) {
+                    g_variant_builder_add(&vf_builder,
+                                          "{sv}",
+                                          *name,
+                                          nm_sriov_vf_get_attribute(vf, *name));
+                }
+            }
+
+            /* VLANs are translated into an array of maps, where each map has
+             * keys 'id', 'qos' and 'proto'. This guarantees enough flexibility
+             * to accommodate any future new option. */
+            vlan_ids = nm_sriov_vf_get_vlan_ids(vf, &num_vlans);
+            if (num_vlans) {
+                GVariantBuilder vlans_builder;
+                guint           j;
+
+                g_variant_builder_init(&vlans_builder, G_VARIANT_TYPE("aa{sv}"));
+                for (j = 0; j < num_vlans; j++) {
+                    GVariantBuilder vlan_builder;
+
+                    g_variant_builder_init(&vlan_builder, G_VARIANT_TYPE("a{sv}"));
+                    g_variant_builder_add(&vlan_builder,
+                                          "{sv}",
+                                          "id",
+                                          g_variant_new_uint32(vlan_ids[j]));
+                    g_variant_builder_add(
+                        &vlan_builder,
+                        "{sv}",
+                        "qos",
+                        g_variant_new_uint32(nm_sriov_vf_get_vlan_qos(vf, vlan_ids[j])));
+                    g_variant_builder_add(
+                        &vlan_builder,
+                        "{sv}",
+                        "protocol",
+                        g_variant_new_uint32(nm_sriov_vf_get_vlan_protocol(vf, vlan_ids[j])));
+                    g_variant_builder_add(&vlans_builder, "a{sv}", &vlan_builder);
+                }
+                g_variant_builder_add(&vf_builder,
+                                      "{sv}",
+                                      "vlans",
+                                      g_variant_builder_end(&vlans_builder));
+            }
+            g_variant_builder_add(&builder, "a{sv}", &vf_builder);
+        }
+    }
+
+    return g_variant_builder_end(&builder);
 }
 
 static gboolean
-vfs_from_dbus (NMSetting *setting,
-               GVariant *connection_dict,
-               const char *property,
-               GVariant *value,
-               NMSettingParseFlags parse_flags,
-               GError **error)
+vfs_from_dbus(NMSetting *         setting,
+              GVariant *          connection_dict,
+              const char *        property,
+              GVariant *          value,
+              NMSettingParseFlags parse_flags,
+              GError **           error)
 {
-	GPtrArray *vfs;
-	GVariantIter vf_iter;
-	GVariant *vf_var;
-
-	g_return_val_if_fail (g_variant_is_of_type (value, G_VARIANT_TYPE ("aa{sv}")), FALSE);
-
-	vfs = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_sriov_vf_unref);
-	g_variant_iter_init (&vf_iter, value);
-	while (g_variant_iter_next (&vf_iter, "@a{sv}", &vf_var)) {
-		NMSriovVF *vf;
-		guint32 index;
-		GVariantIter attr_iter;
-		const char *attr_name;
-		GVariant *attr_var, *vlans_var;
-
-		if (!g_variant_lookup (vf_var, "index", "u", &index))
-			goto next;
-
-		vf = nm_sriov_vf_new (index);
-
-		g_variant_iter_init (&attr_iter, vf_var);
-		while (g_variant_iter_next (&attr_iter, "{&sv}", &attr_name, &attr_var)) {
-			if (!NM_IN_STRSET (attr_name, "index", "vlans"))
-				nm_sriov_vf_set_attribute (vf, attr_name, attr_var);
-			g_variant_unref (attr_var);
-		}
-
-		if (g_variant_lookup (vf_var, "vlans", "@aa{sv}", &vlans_var)) {
-			GVariantIter vlan_iter;
-			GVariant *vlan_var;
-
-			g_variant_iter_init (&vlan_iter, vlans_var);
-			while (g_variant_iter_next (&vlan_iter, "@a{sv}", &vlan_var)) {
-				NMSriovVFVlanProtocol proto = NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q;
-				gint64 vlan_id = -1;
-				guint qos = 0;
-
-				g_variant_iter_init (&attr_iter, vlan_var);
-				while (g_variant_iter_next (&attr_iter, "{&sv}", &attr_name, &attr_var)) {
-					if (   nm_streq (attr_name, "id")
-					    && g_variant_is_of_type (attr_var, G_VARIANT_TYPE_UINT32))
-						vlan_id = g_variant_get_uint32 (attr_var);
-					else if (   nm_streq (attr_name, "qos")
-					         && g_variant_is_of_type (attr_var, G_VARIANT_TYPE_UINT32))
-						qos = g_variant_get_uint32 (attr_var);
-					else if (   nm_streq (attr_name, "protocol")
-					         && g_variant_is_of_type (attr_var, G_VARIANT_TYPE_UINT32))
-						proto = g_variant_get_uint32 (attr_var);
-					g_variant_unref (attr_var);
-				}
-				if (vlan_id != -1)
-					vf_add_vlan (vf, vlan_id, qos, proto);
-				g_variant_unref (vlan_var);
-			}
-			g_variant_unref (vlans_var);
-		}
-
-		g_ptr_array_add (vfs, vf);
+    GPtrArray *  vfs;
+    GVariantIter vf_iter;
+    GVariant *   vf_var;
+
+    g_return_val_if_fail(g_variant_is_of_type(value, G_VARIANT_TYPE("aa{sv}")), FALSE);
+
+    vfs = g_ptr_array_new_with_free_func((GDestroyNotify) nm_sriov_vf_unref);
+    g_variant_iter_init(&vf_iter, value);
+    while (g_variant_iter_next(&vf_iter, "@a{sv}", &vf_var)) {
+        NMSriovVF *  vf;
+        guint32      index;
+        GVariantIter attr_iter;
+        const char * attr_name;
+        GVariant *   attr_var, *vlans_var;
+
+        if (!g_variant_lookup(vf_var, "index", "u", &index))
+            goto next;
+
+        vf = nm_sriov_vf_new(index);
+
+        g_variant_iter_init(&attr_iter, vf_var);
+        while (g_variant_iter_next(&attr_iter, "{&sv}", &attr_name, &attr_var)) {
+            if (!NM_IN_STRSET(attr_name, "index", "vlans"))
+                nm_sriov_vf_set_attribute(vf, attr_name, attr_var);
+            g_variant_unref(attr_var);
+        }
+
+        if (g_variant_lookup(vf_var, "vlans", "@aa{sv}", &vlans_var)) {
+            GVariantIter vlan_iter;
+            GVariant *   vlan_var;
+
+            g_variant_iter_init(&vlan_iter, vlans_var);
+            while (g_variant_iter_next(&vlan_iter, "@a{sv}", &vlan_var)) {
+                NMSriovVFVlanProtocol proto   = NM_SRIOV_VF_VLAN_PROTOCOL_802_1Q;
+                gint64                vlan_id = -1;
+                guint                 qos     = 0;
+
+                g_variant_iter_init(&attr_iter, vlan_var);
+                while (g_variant_iter_next(&attr_iter, "{&sv}", &attr_name, &attr_var)) {
+                    if (nm_streq(attr_name, "id")
+                        && g_variant_is_of_type(attr_var, G_VARIANT_TYPE_UINT32))
+                        vlan_id = g_variant_get_uint32(attr_var);
+                    else if (nm_streq(attr_name, "qos")
+                             && g_variant_is_of_type(attr_var, G_VARIANT_TYPE_UINT32))
+                        qos = g_variant_get_uint32(attr_var);
+                    else if (nm_streq(attr_name, "protocol")
+                             && g_variant_is_of_type(attr_var, G_VARIANT_TYPE_UINT32))
+                        proto = g_variant_get_uint32(attr_var);
+                    g_variant_unref(attr_var);
+                }
+                if (vlan_id != -1)
+                    vf_add_vlan(vf, vlan_id, qos, proto);
+                g_variant_unref(vlan_var);
+            }
+            g_variant_unref(vlans_var);
+        }
+
+        g_ptr_array_add(vfs, vf);
 next:
-		g_variant_unref (vf_var);
-	}
+        g_variant_unref(vf_var);
+    }
 
-	g_object_set (setting, NM_SETTING_SRIOV_VFS, vfs, NULL);
-	g_ptr_array_unref (vfs);
+    g_object_set(setting, NM_SETTING_SRIOV_VFS, vfs, NULL);
+    g_ptr_array_unref(vfs);
 
-	return TRUE;
+    return TRUE;
 }
 
 /*****************************************************************************/
 
 static gboolean
-verify (NMSetting *setting, NMConnection *connection, GError **error)
+verify(NMSetting *setting, NMConnection *connection, GError **error)
 {
-	NMSettingSriov *self = NM_SETTING_SRIOV (setting);
-	guint i;
-
-	if (self->vfs->len) {
-		gs_unref_hashtable GHashTable *h = NULL;
-
-		h = g_hash_table_new (nm_direct_hash, NULL);
-		for (i = 0; i < self->vfs->len; i++) {
-			NMSriovVF *vf = self->vfs->pdata[i];
-			gs_free_error GError *local = NULL;
-
-			if (vf->index >= self->total_vfs) {
-				g_set_error (error,
-				             NM_CONNECTION_ERROR,
-				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
-				             _("VF with index %u, but the total number of VFs is %u"),
-				             vf->index, self->total_vfs);
-				g_prefix_error (error, "%s.%s: ", NM_SETTING_SRIOV_SETTING_NAME,
-				                NM_SETTING_SRIOV_VFS);
-				return FALSE;
-			}
-
-			if (!_nm_sriov_vf_attribute_validate_all (vf, &local)) {
-				g_set_error (error,
-				             NM_CONNECTION_ERROR,
-				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
-				             _("invalid VF %u: %s"),
-				             vf->index,
-				             local->message);
-				g_prefix_error (error, "%s.%s: ", NM_SETTING_SRIOV_SETTING_NAME,
-				                NM_SETTING_SRIOV_VFS);
-				return FALSE;
-			}
-
-			if (g_hash_table_contains (h, GUINT_TO_POINTER (vf->index))) {
-				g_set_error (error,
-				             NM_CONNECTION_ERROR,
-				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
-				             _("duplicate VF index %u"), vf->index);
-				g_prefix_error (error, "%s.%s: ", NM_SETTING_SRIOV_SETTING_NAME,
-				                NM_SETTING_SRIOV_VFS);
-				return FALSE;
-			}
-
-			g_hash_table_add (h, GUINT_TO_POINTER (vf->index));
-		}
-	}
-
-	/* Failures from here on are NORMALIZABLE... */
-
-	if (self->vfs->len) {
-		for (i = 1; i < self->vfs->len; i++) {
-			NMSriovVF *vf_prev = self->vfs->pdata[i - 1];
-			NMSriovVF *vf = self->vfs->pdata[i];
-
-			if (vf->index <= vf_prev->index) {
-				g_set_error (error,
-				             NM_CONNECTION_ERROR,
-				             NM_CONNECTION_ERROR_INVALID_PROPERTY,
-				             _("VFs %d and %d are not sorted by ascending index"),
-				             vf_prev->index, vf->index);
-				g_prefix_error (error, "%s.%s: ", NM_SETTING_SRIOV_SETTING_NAME,
-				                NM_SETTING_SRIOV_VFS);
-				return NM_SETTING_VERIFY_NORMALIZABLE;
-			}
-		}
-	}
-
-	return TRUE;
+    NMSettingSriov *self = NM_SETTING_SRIOV(setting);
+    guint           i;
+
+    if (self->vfs->len) {
+        gs_unref_hashtable GHashTable *h = NULL;
+
+        h = g_hash_table_new(nm_direct_hash, NULL);
+        for (i = 0; i < self->vfs->len; i++) {
+            NMSriovVF *   vf            = self->vfs->pdata[i];
+            gs_free_error GError *local = NULL;
+
+            if (vf->index >= self->total_vfs) {
+                g_set_error(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
+                            _("VF with index %u, but the total number of VFs is %u"),
+                            vf->index,
+                            self->total_vfs);
+                g_prefix_error(error,
+                               "%s.%s: ",
+                               NM_SETTING_SRIOV_SETTING_NAME,
+                               NM_SETTING_SRIOV_VFS);
+                return FALSE;
+            }
+
+            if (!_nm_sriov_vf_attribute_validate_all(vf, &local)) {
+                g_set_error(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
+                            _("invalid VF %u: %s"),
+                            vf->index,
+                            local->message);
+                g_prefix_error(error,
+                               "%s.%s: ",
+                               NM_SETTING_SRIOV_SETTING_NAME,
+                               NM_SETTING_SRIOV_VFS);
+                return FALSE;
+            }
+
+            if (g_hash_table_contains(h, GUINT_TO_POINTER(vf->index))) {
+                g_set_error(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
+                            _("duplicate VF index %u"),
+                            vf->index);
+                g_prefix_error(error,
+                               "%s.%s: ",
+                               NM_SETTING_SRIOV_SETTING_NAME,
+                               NM_SETTING_SRIOV_VFS);
+                return FALSE;
+            }
+
+            g_hash_table_add(h, GUINT_TO_POINTER(vf->index));
+        }
+    }
+
+    /* Failures from here on are NORMALIZABLE... */
+
+    if (self->vfs->len) {
+        for (i = 1; i < self->vfs->len; i++) {
+            NMSriovVF *vf_prev = self->vfs->pdata[i - 1];
+            NMSriovVF *vf      = self->vfs->pdata[i];
+
+            if (vf->index <= vf_prev->index) {
+                g_set_error(error,
+                            NM_CONNECTION_ERROR,
+                            NM_CONNECTION_ERROR_INVALID_PROPERTY,
+                            _("VFs %d and %d are not sorted by ascending index"),
+                            vf_prev->index,
+                            vf->index);
+                g_prefix_error(error,
+                               "%s.%s: ",
+                               NM_SETTING_SRIOV_SETTING_NAME,
+                               NM_SETTING_SRIOV_VFS);
+                return NM_SETTING_VERIFY_NORMALIZABLE;
+            }
+        }
+    }
+
+    return TRUE;
 }
 
 static NMTernary
-compare_property (const NMSettInfoSetting *sett_info,
-                  guint property_idx,
-                  NMConnection *con_a,
-                  NMSetting *set_a,
-                  NMConnection *con_b,
-                  NMSetting *set_b,
-                  NMSettingCompareFlags flags)
+compare_property(const NMSettInfoSetting *sett_info,
+                 guint                    property_idx,
+                 NMConnection *           con_a,
+                 NMSetting *              set_a,
+                 NMConnection *           con_b,
+                 NMSetting *              set_b,
+                 NMSettingCompareFlags    flags)
 {
-	NMSettingSriov *a;
-	NMSettingSriov *b;
-	guint i;
-
-	if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_SRIOV_VFS)) {
-		if (set_b) {
-			a = NM_SETTING_SRIOV (set_a);
-			b = NM_SETTING_SRIOV (set_b);
-
-			if (a->vfs->len != b->vfs->len)
-				return FALSE;
-			for (i = 0; i < a->vfs->len; i++) {
-				if (!nm_sriov_vf_equal (a->vfs->pdata[i], b->vfs->pdata[i]))
-					return FALSE;
-			}
-		}
-		return TRUE;
-	}
-
-	return NM_SETTING_CLASS (nm_setting_sriov_parent_class)->compare_property (sett_info,
-	                                                                           property_idx,
-	                                                                           con_a,
-	                                                                           set_a,
-	                                                                           con_b,
-	                                                                           set_b,
-	                                                                           flags);
+    NMSettingSriov *a;
+    NMSettingSriov *b;
+    guint           i;
+
+    if (nm_streq(sett_info->property_infos[property_idx].name, NM_SETTING_SRIOV_VFS)) {
+        if (set_b) {
+            a = NM_SETTING_SRIOV(set_a);
+            b = NM_SETTING_SRIOV(set_b);
+
+            if (a->vfs->len != b->vfs->len)
+                return FALSE;
+            for (i = 0; i < a->vfs->len; i++) {
+                if (!nm_sriov_vf_equal(a->vfs->pdata[i], b->vfs->pdata[i]))
+                    return FALSE;
+            }
+        }
+        return TRUE;
+    }
+
+    return NM_SETTING_CLASS(nm_setting_sriov_parent_class)
+        ->compare_property(sett_info, property_idx, con_a, set_a, con_b, set_b, flags);
 }
 
 /*****************************************************************************/
 
 static void
-get_property (GObject *object, guint prop_id,
-              GValue *value, GParamSpec *pspec)
+get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
 {
-	NMSettingSriov *self = NM_SETTING_SRIOV (object);
-
-	switch (prop_id) {
-	case PROP_TOTAL_VFS:
-		g_value_set_uint (value, self->total_vfs);
-		break;
-	case PROP_VFS:
-		g_value_take_boxed (value, _nm_utils_copy_array (self->vfs,
-		                                                 (NMUtilsCopyFunc) nm_sriov_vf_dup,
-		                                                 (GDestroyNotify) nm_sriov_vf_unref));
-		break;
-	case PROP_AUTOPROBE_DRIVERS:
-		g_value_set_enum (value, self->autoprobe_drivers);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
+    NMSettingSriov *self = NM_SETTING_SRIOV(object);
+
+    switch (prop_id) {
+    case PROP_TOTAL_VFS:
+        g_value_set_uint(value, self->total_vfs);
+        break;
+    case PROP_VFS:
+        g_value_take_boxed(value,
+                           _nm_utils_copy_array(self->vfs,
+                                                (NMUtilsCopyFunc) nm_sriov_vf_dup,
+                                                (GDestroyNotify) nm_sriov_vf_unref));
+        break;
+    case PROP_AUTOPROBE_DRIVERS:
+        g_value_set_enum(value, self->autoprobe_drivers);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
 }
 
 static void
-set_property (GObject *object, guint prop_id,
-              const GValue *value, GParamSpec *pspec)
+set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 {
-	NMSettingSriov *self = NM_SETTING_SRIOV (object);
-
-	switch (prop_id) {
-	case PROP_TOTAL_VFS:
-		self->total_vfs = g_value_get_uint (value);
-		break;
-	case PROP_VFS:
-		g_ptr_array_unref (self->vfs);
-		self->vfs = _nm_utils_copy_array (g_value_get_boxed (value),
-		                                  (NMUtilsCopyFunc) nm_sriov_vf_dup,
-		                                  (GDestroyNotify) nm_sriov_vf_unref);
-		break;
-	case PROP_AUTOPROBE_DRIVERS:
-		self->autoprobe_drivers = g_value_get_enum (value);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	}
+    NMSettingSriov *self = NM_SETTING_SRIOV(object);
+
+    switch (prop_id) {
+    case PROP_TOTAL_VFS:
+        self->total_vfs = g_value_get_uint(value);
+        break;
+    case PROP_VFS:
+        g_ptr_array_unref(self->vfs);
+        self->vfs = _nm_utils_copy_array(g_value_get_boxed(value),
+                                         (NMUtilsCopyFunc) nm_sriov_vf_dup,
+                                         (GDestroyNotify) nm_sriov_vf_unref);
+        break;
+    case PROP_AUTOPROBE_DRIVERS:
+        self->autoprobe_drivers = g_value_get_enum(value);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
 }
 
 /*****************************************************************************/
 
 static void
-nm_setting_sriov_init (NMSettingSriov *setting)
+nm_setting_sriov_init(NMSettingSriov *setting)
 {
-	setting->vfs = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_sriov_vf_unref);
+    setting->vfs = g_ptr_array_new_with_free_func((GDestroyNotify) nm_sriov_vf_unref);
 
-	setting->autoprobe_drivers = NM_TERNARY_DEFAULT;
+    setting->autoprobe_drivers = NM_TERNARY_DEFAULT;
 }
 
 /**
@@ -1231,151 +1220,153 @@ nm_setting_sriov_init (NMSettingSriov *setting)
  * Since: 1.14
  **/
 NMSetting *
-nm_setting_sriov_new (void)
+nm_setting_sriov_new(void)
 {
-	return (NMSetting *) g_object_new (NM_TYPE_SETTING_SRIOV, NULL);
+    return (NMSetting *) g_object_new(NM_TYPE_SETTING_SRIOV, NULL);
 }
 
 static void
-finalize (GObject *object)
+finalize(GObject *object)
 {
-	NMSettingSriov *self = NM_SETTING_SRIOV (object);
+    NMSettingSriov *self = NM_SETTING_SRIOV(object);
 
-	g_ptr_array_unref (self->vfs);
+    g_ptr_array_unref(self->vfs);
 
-	G_OBJECT_CLASS (nm_setting_sriov_parent_class)->finalize (object);
+    G_OBJECT_CLASS(nm_setting_sriov_parent_class)->finalize(object);
 }
 
 static void
-nm_setting_sriov_class_init (NMSettingSriovClass *klass)
+nm_setting_sriov_class_init(NMSettingSriovClass *klass)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
-	GArray *properties_override = _nm_sett_info_property_override_create_array ();
-
-	object_class->get_property     = get_property;
-	object_class->set_property     = set_property;
-	object_class->finalize         = finalize;
-
-	setting_class->compare_property = compare_property;
-	setting_class->verify           = verify;
-
-	/**
-	 * NMSettingSriov:total-vfs
-	 *
-	 * The total number of virtual functions to create.
-	 *
-	 * Note that when the sriov setting is present NetworkManager
-	 * enforces the number of virtual functions on the interface
-	 * (also when it is zero) during activation and resets it
-	 * upon deactivation. To prevent any changes to SR-IOV
-	 * parameters don't add a sriov setting to the connection.
-	 *
-	 * Since: 1.14
-	 **/
-	/* ---ifcfg-rh---
-	 * property: total-vfs
-	 * variable: SRIOV_TOTAL_VFS(+)
-	 * description: The total number of virtual functions to create
-	 * example: SRIOV_TOTAL_VFS=16
-	 * ---end---
-	 */
-	obj_properties[PROP_TOTAL_VFS] =
-	    g_param_spec_uint (NM_SETTING_SRIOV_TOTAL_VFS, "", "",
-	                       0, G_MAXUINT32, 0,
-	                       NM_SETTING_PARAM_FUZZY_IGNORE |
-	                       G_PARAM_READWRITE |
-	                       G_PARAM_STATIC_STRINGS);
-
-	/**
-	 * NMSettingSriov:vfs: (type GPtrArray(NMSriovVF))
-	 *
-	 * Array of virtual function descriptors.
-	 *
-	 * Each VF descriptor is a dictionary mapping attribute names
-	 * to GVariant values. The 'index' entry is mandatory for
-	 * each VF.
-	 *
-	 * When represented as string a VF is in the form:
-	 *
-	 *   "INDEX [ATTR=VALUE[ ATTR=VALUE]...]".
-	 *
-	 * for example:
-	 *
-	 *   "2 mac=00:11:22:33:44:55 spoof-check=true".
-	 *
-	 * Multiple VFs can be specified using a comma as separator.
-	 * Currently the following attributes are supported: mac,
-	 * spoof-check, trust, min-tx-rate, max-tx-rate, vlans.
-	 *
-	 * The "vlans" attribute is represented as a semicolon-separated
-	 * list of VLAN descriptors, where each descriptor has the form
-	 *
-	 *   "ID[.PRIORITY[.PROTO]]".
-	 *
-	 * PROTO can be either 'q' for 802.1Q (the default) or 'ad' for
-	 * 802.1ad.
-	 *
-
-	 * Since: 1.14
-	 **/
-	/* ---ifcfg-rh---
-	 * property: vfs
-	 * variable: SRIOV_VF1(+), SRIOV_VF2(+), ...
-	 * description: SR-IOV virtual function descriptors
-	 * example: SRIOV_VF10="mac=00:11:22:33:44:55", ...
-	 * ---end---
-	 */
-	obj_properties[PROP_VFS] =
-	    g_param_spec_boxed (NM_SETTING_SRIOV_VFS, "", "",
-	                        G_TYPE_PTR_ARRAY,
-	                        G_PARAM_READWRITE |
-	                        NM_SETTING_PARAM_INFERRABLE |
-	                        G_PARAM_STATIC_STRINGS);
-	_nm_properties_override_gobj (properties_override,
-	                              obj_properties[PROP_VFS],
-	                              NM_SETT_INFO_PROPERT_TYPE (
-	                                  .dbus_type     = NM_G_VARIANT_TYPE ("aa{sv}"),
-	                                  .to_dbus_fcn   = vfs_to_dbus,
-	                                  .from_dbus_fcn = vfs_from_dbus,
-	                              ));
-
-	/**
-	 * NMSettingSriov:autoprobe-drivers
-	 *
-	 * Whether to autoprobe virtual functions by a compatible driver.
-	 *
-	 * If set to %NM_TERNARY_TRUE, the kernel will try to bind VFs to
-	 * a compatible driver and if this succeeds a new network
-	 * interface will be instantiated for each VF.
-	 *
-	 * If set to %NM_TERNARY_FALSE, VFs will not be claimed and no
-	 * network interfaces will be created for them.
-	 *
-	 * When set to %NM_TERNARY_DEFAULT, the global default is used; in
-	 * case the global default is unspecified it is assumed to be
-	 * %NM_TERNARY_TRUE.
-	 *
-	 * Since: 1.14
-	 **/
-	/* ---ifcfg-rh---
-	 * property: autoprobe-drivers
-	 * variable: SRIOV_AUTOPROBE_DRIVERS(+)
-	 * default: missing variable means global default
-	 * description: Whether to autoprobe virtual functions by a compatible driver
-	 * example: SRIOV_AUTOPROBE_DRIVERS=0,1
-	 * ---end---
-	 */
-	obj_properties[PROP_AUTOPROBE_DRIVERS] =
-	    g_param_spec_enum (NM_SETTING_SRIOV_AUTOPROBE_DRIVERS, "", "",
-	                       NM_TYPE_TERNARY,
-	                       NM_TERNARY_DEFAULT,
-	                       NM_SETTING_PARAM_FUZZY_IGNORE |
-	                       G_PARAM_READWRITE |
-	                       G_PARAM_STATIC_STRINGS);
-
-	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
-
-	_nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_SRIOV,
-	                               NULL, properties_override);
+    GObjectClass *  object_class        = G_OBJECT_CLASS(klass);
+    NMSettingClass *setting_class       = NM_SETTING_CLASS(klass);
+    GArray *        properties_override = _nm_sett_info_property_override_create_array();
+
+    object_class->get_property = get_property;
+    object_class->set_property = set_property;
+    object_class->finalize     = finalize;
+
+    setting_class->compare_property = compare_property;
+    setting_class->verify           = verify;
+
+    /**
+     * NMSettingSriov:total-vfs
+     *
+     * The total number of virtual functions to create.
+     *
+     * Note that when the sriov setting is present NetworkManager
+     * enforces the number of virtual functions on the interface
+     * (also when it is zero) during activation and resets it
+     * upon deactivation. To prevent any changes to SR-IOV
+     * parameters don't add a sriov setting to the connection.
+     *
+     * Since: 1.14
+     **/
+    /* ---ifcfg-rh---
+     * property: total-vfs
+     * variable: SRIOV_TOTAL_VFS(+)
+     * description: The total number of virtual functions to create
+     * example: SRIOV_TOTAL_VFS=16
+     * ---end---
+     */
+    obj_properties[PROP_TOTAL_VFS] = g_param_spec_uint(
+        NM_SETTING_SRIOV_TOTAL_VFS,
+        "",
+        "",
+        0,
+        G_MAXUINT32,
+        0,
+        NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    /**
+     * NMSettingSriov:vfs: (type GPtrArray(NMSriovVF))
+     *
+     * Array of virtual function descriptors.
+     *
+     * Each VF descriptor is a dictionary mapping attribute names
+     * to GVariant values. The 'index' entry is mandatory for
+     * each VF.
+     *
+     * When represented as string a VF is in the form:
+     *
+     *   "INDEX [ATTR=VALUE[ ATTR=VALUE]...]".
+     *
+     * for example:
+     *
+     *   "2 mac=00:11:22:33:44:55 spoof-check=true".
+     *
+     * Multiple VFs can be specified using a comma as separator.
+     * Currently, the following attributes are supported: mac,
+     * spoof-check, trust, min-tx-rate, max-tx-rate, vlans.
+     *
+     * The "vlans" attribute is represented as a semicolon-separated
+     * list of VLAN descriptors, where each descriptor has the form
+     *
+     *   "ID[.PRIORITY[.PROTO]]".
+     *
+     * PROTO can be either 'q' for 802.1Q (the default) or 'ad' for
+     * 802.1ad.
+     *
+
+     * Since: 1.14
+     **/
+    /* ---ifcfg-rh---
+     * property: vfs
+     * variable: SRIOV_VF1(+), SRIOV_VF2(+), ...
+     * description: SR-IOV virtual function descriptors
+     * example: SRIOV_VF10="mac=00:11:22:33:44:55", ...
+     * ---end---
+     */
+    obj_properties[PROP_VFS] = g_param_spec_boxed(NM_SETTING_SRIOV_VFS,
+                                                  "",
+                                                  "",
+                                                  G_TYPE_PTR_ARRAY,
+                                                  G_PARAM_READWRITE | NM_SETTING_PARAM_INFERRABLE
+                                                      | G_PARAM_STATIC_STRINGS);
+    _nm_properties_override_gobj(properties_override,
+                                 obj_properties[PROP_VFS],
+                                 NM_SETT_INFO_PROPERT_TYPE(.dbus_type = NM_G_VARIANT_TYPE("aa{sv}"),
+                                                           .to_dbus_fcn   = vfs_to_dbus,
+                                                           .from_dbus_fcn = vfs_from_dbus, ));
+
+    /**
+     * NMSettingSriov:autoprobe-drivers
+     *
+     * Whether to autoprobe virtual functions by a compatible driver.
+     *
+     * If set to %NM_TERNARY_TRUE, the kernel will try to bind VFs to
+     * a compatible driver and if this succeeds a new network
+     * interface will be instantiated for each VF.
+     *
+     * If set to %NM_TERNARY_FALSE, VFs will not be claimed and no
+     * network interfaces will be created for them.
+     *
+     * When set to %NM_TERNARY_DEFAULT, the global default is used; in
+     * case the global default is unspecified it is assumed to be
+     * %NM_TERNARY_TRUE.
+     *
+     * Since: 1.14
+     **/
+    /* ---ifcfg-rh---
+     * property: autoprobe-drivers
+     * variable: SRIOV_AUTOPROBE_DRIVERS(+)
+     * default: missing variable means global default
+     * description: Whether to autoprobe virtual functions by a compatible driver
+     * example: SRIOV_AUTOPROBE_DRIVERS=0,1
+     * ---end---
+     */
+    obj_properties[PROP_AUTOPROBE_DRIVERS] = g_param_spec_enum(
+        NM_SETTING_SRIOV_AUTOPROBE_DRIVERS,
+        "",
+        "",
+        NM_TYPE_TERNARY,
+        NM_TERNARY_DEFAULT,
+        NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
+
+    _nm_setting_class_commit_full(setting_class,
+                                  NM_META_SETTING_TYPE_SRIOV,
+                                  NULL,
+                                  properties_override);
 }