diff options
Diffstat (limited to 'libnm-core/nm-setting-sriov.c')
| -rw-r--r-- | libnm-core/nm-setting-sriov.c | 210 |
1 files changed, 115 insertions, 95 deletions
diff --git a/libnm-core/nm-setting-sriov.c b/libnm-core/nm-setting-sriov.c index 7228fb0c..068d2185 100644 --- a/libnm-core/nm-setting-sriov.c +++ b/libnm-core/nm-setting-sriov.c @@ -15,6 +15,7 @@ #include "nm-default.h" #include "nm-setting-sriov.h" + #include "nm-setting-private.h" #include "nm-utils-private.h" @@ -24,6 +25,14 @@ * @include: nm-setting-sriov.h **/ +/*****************************************************************************/ + +NM_GOBJECT_PROPERTIES_DEFINE (NMSettingSriov, + PROP_TOTAL_VFS, + PROP_VFS, + PROP_AUTOPROBE_DRIVERS, +); + /** * NMSettingSriov: * @@ -44,15 +53,6 @@ struct _NMSettingSriovClass { G_DEFINE_TYPE (NMSettingSriov, nm_setting_sriov, NM_TYPE_SETTING) -enum { - PROP_0, - PROP_TOTAL_VFS, - PROP_VFS, - PROP_AUTOPROBE_DRIVERS, - - LAST_PROP -}; - /*****************************************************************************/ G_DEFINE_BOXED_TYPE (NMSriovVF, nm_sriov_vf, nm_sriov_vf_dup, nm_sriov_vf_unref) @@ -705,21 +705,6 @@ nm_sriov_vf_get_vlan_protocol (const NMSriovVF *vf, guint vlan_id) /*****************************************************************************/ /** - * nm_setting_sriov_new: - * - * Creates a new #NMSettingSriov object with default values. - * - * Returns: (transfer full): the new empty #NMSettingSriov object - * - * Since: 1.14 - **/ -NMSetting * -nm_setting_sriov_new (void) -{ - return (NMSetting *) g_object_new (NM_TYPE_SETTING_SRIOV, NULL); -} - -/** * nm_setting_sriov_get_total_vfs: * @setting: the #NMSettingSriov * @@ -790,7 +775,7 @@ nm_setting_sriov_add_vf (NMSettingSriov *setting, NMSriovVF *vf) g_return_if_fail (vf->refcount > 0); g_ptr_array_add (setting->vfs, nm_sriov_vf_dup (vf)); - g_object_notify (G_OBJECT (setting), NM_SETTING_SRIOV_VFS); + _notify (setting, PROP_VFS); } /** @@ -809,7 +794,7 @@ nm_setting_sriov_remove_vf (NMSettingSriov *setting, guint idx) g_return_if_fail (idx < setting->vfs->len); g_ptr_array_remove_index (setting->vfs, idx); - g_object_notify (G_OBJECT (setting), NM_SETTING_SRIOV_VFS); + _notify (setting, PROP_VFS); } /** @@ -834,7 +819,7 @@ nm_setting_sriov_remove_vf_by_index (NMSettingSriov *setting, 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); - g_object_notify (G_OBJECT (setting), NM_SETTING_SRIOV_VFS); + _notify (setting, PROP_VFS); return TRUE; } } @@ -856,7 +841,7 @@ nm_setting_sriov_clear_vfs (NMSettingSriov *setting) if (setting->vfs->len != 0) { g_ptr_array_set_size (setting->vfs, 0); - g_object_notify (G_OBJECT (setting), NM_SETTING_SRIOV_VFS); + _notify (setting, PROP_VFS); } } @@ -952,7 +937,7 @@ vfs_to_dbus (NMSetting *setting, const char *property) /* VLANs are translated into an array of maps, where each map has * keys 'id', 'qos' and 'proto'. This guarantees enough flexibility - * to accomodate any future new option. */ + * to accommodate any future new option. */ vlan_ids = nm_sriov_vf_get_vlan_ids (vf, &num_vlans); if (num_vlans) { GVariantBuilder vlans_builder; @@ -1139,24 +1124,58 @@ verify (NMSetting *setting, NMConnection *connection, GError **error) return TRUE; } +static NMTernary +compare_property (const NMSettInfoSetting *sett_info, + guint property_idx, + NMSetting *setting, + NMSetting *other, + NMSettingCompareFlags flags) +{ + NMSettingSriov *a; + NMSettingSriov *b; + guint i; + + if (nm_streq (sett_info->property_infos[property_idx].name, NM_SETTING_SRIOV_VFS)) { + if (other) { + a = NM_SETTING_SRIOV (setting); + b = NM_SETTING_SRIOV (other); + + 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, + setting, + other, + flags); +} + +/*****************************************************************************/ + static void -set_property (GObject *object, guint prop_id, - const 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: - self->total_vfs = g_value_get_uint (value); + g_value_set_uint (value, self->total_vfs); 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); + 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: - self->autoprobe_drivers = g_value_get_enum (value); + g_value_set_enum (value, self->autoprobe_drivers); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1165,22 +1184,23 @@ set_property (GObject *object, guint prop_id, } static void -get_property (GObject *object, guint prop_id, - 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: - g_value_set_uint (value, self->total_vfs); + self->total_vfs = g_value_get_uint (value); 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)); + 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: - g_value_set_enum (value, self->autoprobe_drivers); + self->autoprobe_drivers = g_value_get_enum (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1188,30 +1208,7 @@ get_property (GObject *object, guint prop_id, } } -static gboolean -compare_property (NMSetting *setting, - NMSetting *other, - const GParamSpec *prop_spec, - NMSettingCompareFlags flags) -{ - NMSettingSriov *a = NM_SETTING_SRIOV (setting); - NMSettingSriov *b = NM_SETTING_SRIOV (other); - NMSettingClass *setting_class; - guint i; - - if (nm_streq (prop_spec->name, NM_SETTING_SRIOV_VFS)) { - 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; - } - - setting_class = NM_SETTING_CLASS (nm_setting_sriov_parent_class); - return setting_class->compare_property (setting, other, prop_spec, flags); -} +/*****************************************************************************/ static void nm_setting_sriov_init (NMSettingSriov *setting) @@ -1219,6 +1216,21 @@ nm_setting_sriov_init (NMSettingSriov *setting) setting->vfs = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_sriov_vf_unref); } +/** + * nm_setting_sriov_new: + * + * Creates a new #NMSettingSriov object with default values. + * + * Returns: (transfer full): the new empty #NMSettingSriov object + * + * Since: 1.14 + **/ +NMSetting * +nm_setting_sriov_new (void) +{ + return (NMSetting *) g_object_new (NM_TYPE_SETTING_SRIOV, NULL); +} + static void finalize (GObject *object) { @@ -1248,6 +1260,11 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * * 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. To prevent any changes to SR-IOV + * parameters don't add a sriov setting to the connection. + * * Since: 1.14 **/ /* ---ifcfg-rh--- @@ -1257,14 +1274,13 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * example: SRIOV_TOTAL_VFS=16 * ---end--- */ - g_object_class_install_property - (object_class, 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_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); + 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_CONSTRUCT | + G_PARAM_STATIC_STRINGS); /** * NMSettingSriov:vfs: (type GPtrArray(NMSriovVF)) @@ -1283,7 +1299,11 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * * "2 mac=00:11:22:33:44:55 spoof-check=true". * - * The "vlans" attribute is represented as a semicolor-separated + * 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]]". @@ -1291,6 +1311,7 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * PROTO can be either 'q' for 802.1Q (the default) or 'ad' for * 802.1ad. * + * Since: 1.14 **/ /* ---ifcfg-rh--- @@ -1300,17 +1321,15 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * example: SRIOV_VF10="mac=00:11:22:33:44:55", ... * ---end--- */ - g_object_class_install_property - (object_class, 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)); + 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); _properties_override_add_override (properties_override, - g_object_class_find_property (G_OBJECT_CLASS (setting_class), - NM_SETTING_SRIOV_VFS), + obj_properties[PROP_VFS], G_VARIANT_TYPE ("aa{sv}"), vfs_to_dbus, vfs_from_dbus, @@ -1342,15 +1361,16 @@ nm_setting_sriov_class_init (NMSettingSriovClass *klass) * example: SRIOV_AUTOPROBE_DRIVERS=0,1 * ---end--- */ - g_object_class_install_property - (object_class, PROP_AUTOPROBE_DRIVERS, - g_param_spec_enum (NM_SETTING_SRIOV_AUTOPROBE_DRIVERS, "", "", - nm_ternary_get_type (), - NM_TERNARY_DEFAULT, - NM_SETTING_PARAM_FUZZY_IGNORE | - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS)); + obj_properties[PROP_AUTOPROBE_DRIVERS] = + g_param_spec_enum (NM_SETTING_SRIOV_AUTOPROBE_DRIVERS, "", "", + nm_ternary_get_type (), + NM_TERNARY_DEFAULT, + NM_SETTING_PARAM_FUZZY_IGNORE | + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + 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); |