summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-05-22 15:58:22 +0200
committerThomas Haller <thaller@redhat.com>2020-05-22 15:58:22 +0200
commitb8d947333cb43fa75819eb9cd0259bbc0b3efba3 (patch)
tree31e83a938052bbab0a3d4456e5ae7e7de3601bfc
parent332cf1ad9ddb440a9424283b5dfd695150b79a58 (diff)
parent16c8555b24417712d4e09da6d12938acc3734762 (diff)
downloadNetworkManager-b8d947333cb43fa75819eb9cd0259bbc0b3efba3.tar.gz
libnm,core: merge branch 'th/setting-option-and-ethtool'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/506
-rw-r--r--clients/common/nm-meta-setting-desc.c150
-rw-r--r--libnm-core/nm-core-internal.h43
-rw-r--r--libnm-core/nm-core-types.h3
-rw-r--r--libnm-core/nm-setting-ethtool.c399
-rw-r--r--libnm-core/nm-setting-ethtool.h46
-rw-r--r--libnm-core/nm-setting.c393
-rw-r--r--libnm-core/nm-setting.h40
-rw-r--r--libnm-core/nm-utils.c14
-rw-r--r--libnm-core/tests/test-setting.c150
-rw-r--r--libnm/libnm.ver16
-rw-r--r--shared/nm-keyfile/nm-keyfile.c6
-rw-r--r--shared/nm-libnm-core-intern/nm-ethtool-utils.h3
-rw-r--r--src/devices/nm-device.c86
-rw-r--r--src/platform/nm-platform-utils.c114
-rw-r--r--src/platform/nm-platform-utils.h23
-rw-r--r--src/platform/nm-platform.c89
-rw-r--r--src/platform/nm-platform.h5
-rw-r--r--src/platform/tests/test-link.c10
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c38
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c75
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected2
21 files changed, 743 insertions, 962 deletions
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 2c3e0d534a..7951a2333c 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -4097,78 +4097,57 @@ _gobject_enum_pre_set_notify_fcn_wireless_security_wep_key_type (const NMMetaPro
static gconstpointer
_get_fcn_ethtool (ARGS_GET_FCN)
{
- char *return_str;
- guint32 u32;
NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
+ const char *s;
+ guint32 u32;
+ gboolean b;
RETURN_UNSUPPORTED_GET_TYPE ();
- if (nm_ethtool_id_is_coalesce (ethtool_id)) {
- if (!nm_setting_ethtool_get_coalesce (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname,
- &u32)) {
+ if ( nm_ethtool_id_is_coalesce (ethtool_id)
+ || nm_ethtool_id_is_ring (ethtool_id)) {
+ if (!nm_setting_option_get_uint32 (setting,
+ nm_ethtool_data[ethtool_id]->optname,
+ &u32)) {
NM_SET_OUT (out_is_default, TRUE);
return NULL;
}
- return_str = g_strdup_printf ("%"G_GUINT32_FORMAT, u32);
- RETURN_STR_TO_FREE (return_str);
- } else if (nm_ethtool_id_is_feature (ethtool_id)) {
- const char *s;
- NMTernary val;
-
- val = nm_setting_ethtool_get_feature (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname);
-
- if (val == NM_TERNARY_TRUE)
- s = N_("on");
- else if (val == NM_TERNARY_FALSE)
- s = N_("off");
- else {
- s = NULL;
- NM_SET_OUT (out_is_default, TRUE);
- }
+ RETURN_STR_TO_FREE (nm_strdup_int (u32));
+ }
- if (s && get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
- s = gettext (s);
- return s;
- } else if (nm_ethtool_id_is_ring (ethtool_id)) {
- if (!nm_setting_ethtool_get_ring (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname,
- &u32)) {
- NM_SET_OUT (out_is_default, TRUE);
- return NULL;
- }
+ nm_assert (nm_ethtool_id_is_feature (ethtool_id));
- return_str = g_strdup_printf ("%"G_GUINT32_FORMAT, u32);
- RETURN_STR_TO_FREE (return_str);
+ if (!nm_setting_option_get_boolean (setting,
+ nm_ethtool_data[ethtool_id]->optname,
+ &b)) {
+ NM_SET_OUT (out_is_default, TRUE);
+ return NULL;
}
- nm_assert_not_reached();
- return NULL;
+
+ s = b
+ ? N_("on")
+ : N_("off");
+ if (get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
+ s = gettext (s);
+ return s;
}
static gboolean
_set_fcn_ethtool (ARGS_SET_FCN)
{
- gint64 i64;
NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
- NMEthtoolType ethtool_type = nm_ethtool_id_to_type (ethtool_id);
-
- if (NM_IN_SET (ethtool_type,
- NM_ETHTOOL_TYPE_COALESCE,
- NM_ETHTOOL_TYPE_RING)) {
- if (_SET_FCN_DO_RESET_DEFAULT (property_info, modifier, value)) {
- if (ethtool_type == NM_ETHTOOL_TYPE_COALESCE)
- nm_setting_ethtool_clear_coalesce (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname);
- else
- nm_setting_ethtool_clear_ring (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname);
- return TRUE;
- }
+ gs_free char *value_to_free = NULL;
+ gint64 i64;
+ gboolean b;
- i64 = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
+ if (_SET_FCN_DO_RESET_DEFAULT (property_info, modifier, value))
+ goto do_unset;
+
+ if ( nm_ethtool_id_is_coalesce (ethtool_id)
+ || nm_ethtool_id_is_ring (ethtool_id)) {
+ i64 = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
if (i64 == -1) {
g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
_("'%s' is out of range [%"G_GUINT32_FORMAT", %"G_GUINT32_FORMAT"]"),
@@ -4176,53 +4155,38 @@ _set_fcn_ethtool (ARGS_SET_FCN)
return FALSE;
}
- if (ethtool_type == NM_ETHTOOL_TYPE_COALESCE)
- nm_setting_ethtool_set_coalesce (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname,
- (guint32) i64);
- else
- nm_setting_ethtool_set_ring (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname,
- (guint32) i64);
+ nm_setting_option_set_uint32 (setting,
+ nm_ethtool_data[ethtool_id]->optname,
+ i64);
return TRUE;
}
- if (ethtool_type == NM_ETHTOOL_TYPE_FEATURE) {
- gs_free char *value_to_free = NULL;
- NMTernary val;
-
- if (_SET_FCN_DO_RESET_DEFAULT (property_info, modifier, value)) {
- val = NM_TERNARY_DEFAULT;
- goto set;
- }
-
- value = nm_strstrip_avoid_copy_a (300, value, &value_to_free);
-
- if (NM_IN_STRSET (value, "1", "yes", "true", "on"))
- val = NM_TERNARY_TRUE;
- else if (NM_IN_STRSET (value, "0", "no", "false", "off"))
- val = NM_TERNARY_FALSE;
- else if (NM_IN_STRSET (value, "", "ignore", "default"))
- val = NM_TERNARY_DEFAULT;
- else {
- g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
- _("'%s' is not valid; use 'on', 'off', or 'ignore'"),
- value);
- return FALSE;
- }
+ nm_assert (nm_ethtool_id_is_feature (ethtool_id));
-set:
- nm_setting_ethtool_set_feature (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname,
- val);
- return TRUE;
+ value = nm_strstrip_avoid_copy_a (300, value, &value_to_free);
+ if (NM_IN_STRSET (value, "1", "yes", "true", "on"))
+ b = TRUE;
+ else if (NM_IN_STRSET (value, "0", "no", "false", "off"))
+ b = FALSE;
+ else if (NM_IN_STRSET (value, "", "ignore", "default"))
+ goto do_unset;
+ else {
+ g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
+ _("'%s' is not valid; use 'on', 'off', or 'ignore'"),
+ value);
+ return FALSE;
}
- nm_assert_not_reached();
+ nm_setting_option_set_boolean (setting,
+ nm_ethtool_data[ethtool_id]->optname,
+ b);
+ return TRUE;
- g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING,
- _("ethtool property not supported"));
- return FALSE;
+do_unset:
+ nm_setting_option_set (setting,
+ nm_ethtool_data[ethtool_id]->optname,
+ NULL);
+ return TRUE;
}
static const char *const*
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index cc37e68df0..6d7661b916 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -310,46 +310,19 @@ gboolean _nm_setting_get_property (NMSetting *setting, const char *name, GValue
/*****************************************************************************/
-typedef gboolean (*nm_setting_gendata_filter_fcn)(const char *name);
+GHashTable *_nm_setting_option_hash (NMSetting *setting,
+ gboolean create_if_necessary);
-GHashTable *_nm_setting_gendata_hash (NMSetting *setting,
- gboolean create_if_necessary);
+void _nm_setting_option_notify (NMSetting *setting,
+ gboolean keys_changed);
-void _nm_setting_gendata_notify (NMSetting *setting,
- gboolean keys_changed);
+guint _nm_setting_option_get_all (NMSetting *setting,
+ const char *const**out_names,
+ GVariant *const**out_values);
-guint _nm_setting_gendata_get_all (NMSetting *setting,
- const char *const**out_names,
- GVariant *const**out_values);
-
-gboolean _nm_setting_gendata_reset_from_hash (NMSetting *setting,
- GHashTable *new);
-
-void _nm_setting_gendata_to_gvalue (NMSetting *setting,
- GValue *value);
-
-GVariant *nm_setting_gendata_get (NMSetting *setting,
- const char *name);
-
-const char *const*nm_setting_gendata_get_all_names (NMSetting *setting,
- guint *out_len);
-
-GVariant *const*nm_setting_gendata_get_all_values (NMSetting *setting);
-
-gboolean nm_setting_gendata_clear (NMSetting *setting,
+gboolean _nm_setting_option_clear (NMSetting *setting,
const char *optname);
-gboolean nm_setting_gendata_clear_all (NMSetting *setting,
- nm_setting_gendata_filter_fcn filter);
-
-gboolean nm_setting_gendata_get_uint32 (NMSetting *setting,
- const char *optname,
- guint32 *out_value);
-
-void nm_setting_gendata_set_uint32 (NMSetting *setting,
- const char *optname,
- guint32 value);
-
/*****************************************************************************/
guint nm_setting_ethtool_init_features (NMSettingEthtool *setting,
diff --git a/libnm-core/nm-core-types.h b/libnm-core/nm-core-types.h
index d1ce6310cd..ce59ec036e 100644
--- a/libnm-core/nm-core-types.h
+++ b/libnm-core/nm-core-types.h
@@ -65,4 +65,7 @@ typedef struct _NMSettingWirelessSecurity NMSettingWirelessSecurity;
typedef struct _NMSettingWpan NMSettingWpan;
typedef struct _NMSimpleConnection NMSimpleConnection;
+NM_AVAILABLE_IN_1_26
+typedef gboolean (*NMUtilsPredicateStr) (const char *str);
+
#endif /* __NM_CORE_TYPES_H__ */
diff --git a/libnm-core/nm-setting-ethtool.c b/libnm-core/nm-setting-ethtool.c
index deb1d96cca..17fbdc62a1 100644
--- a/libnm-core/nm-setting-ethtool.c
+++ b/libnm-core/nm-setting-ethtool.c
@@ -22,6 +22,21 @@
/*****************************************************************************/
+static const GVariantType *
+get_variant_type_from_ethtool_id (NMEthtoolID ethtool_id)
+{
+ if (nm_ethtool_id_is_feature (ethtool_id))
+ return G_VARIANT_TYPE_BOOLEAN;
+
+ if ( nm_ethtool_id_is_coalesce (ethtool_id)
+ || nm_ethtool_id_is_ring (ethtool_id))
+ return G_VARIANT_TYPE_UINT32;
+
+ return NULL;
+}
+
+/*****************************************************************************/
+
/**
* nm_ethtool_optname_is_feature:
* @optname: (allow-none): the option name to check
@@ -97,14 +112,6 @@ G_DEFINE_TYPE (NMSettingEthtool, nm_setting_ethtool, NM_TYPE_SETTING)
/*****************************************************************************/
-static void
-_notify_attributes (NMSettingEthtool *self)
-{
- _nm_setting_gendata_notify (NM_SETTING (self), TRUE);
-}
-
-/*****************************************************************************/
-
/**
* nm_setting_ethtool_get_feature:
* @setting: the #NMSettingEthtool
@@ -120,24 +127,23 @@ _notify_attributes (NMSettingEthtool *self)
* is enabled, disabled, or left untouched.
*
* Since: 1.14
+ *
+ * Deprecated: 1.26: use nm_setting_option_get_boolean() instead.
*/
NMTernary
nm_setting_ethtool_get_feature (NMSettingEthtool *setting,
const char *optname)
{
- GVariant *v;
+ gboolean v;
g_return_val_if_fail (NM_IS_SETTING_ETHTOOL (setting), NM_TERNARY_DEFAULT);
g_return_val_if_fail (optname && nm_ethtool_optname_is_feature (optname), NM_TERNARY_DEFAULT);
- v = nm_setting_gendata_get (NM_SETTING (setting), optname);
- if ( v
- && g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) {
- return g_variant_get_boolean (v)
- ? NM_TERNARY_TRUE
- : NM_TERNARY_FALSE;
- }
- return NM_TERNARY_DEFAULT;
+ if (!nm_setting_option_get_boolean (NM_SETTING (setting), optname, &v))
+ return NM_TERNARY_DEFAULT;
+ return v
+ ? NM_TERNARY_TRUE
+ : NM_TERNARY_FALSE;
}
/**
@@ -153,49 +159,24 @@ nm_setting_ethtool_get_feature (NMSettingEthtool *setting,
* nm_ethtool_optname_is_feature().
*
* Since: 1.14
+ *
+ * Deprecated: 1.26: use nm_setting_option_set() or nm_setting_option_set_boolean() instead.
*/
void
nm_setting_ethtool_set_feature (NMSettingEthtool *setting,
const char *optname,
NMTernary value)
{
- GHashTable *hash;
- GVariant *v;
-
g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
g_return_if_fail (optname && nm_ethtool_optname_is_feature (optname));
g_return_if_fail (NM_IN_SET (value, NM_TERNARY_DEFAULT,
NM_TERNARY_FALSE,
NM_TERNARY_TRUE));
- hash = _nm_setting_gendata_hash (NM_SETTING (setting),
- value != NM_TERNARY_DEFAULT);
-
- if (value == NM_TERNARY_DEFAULT) {
- if (hash) {
- if (g_hash_table_remove (hash, optname))
- _notify_attributes (setting);
- }
- return;
- }
-
- v = g_hash_table_lookup (hash, optname);
- if ( v
- && g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) {
- if (g_variant_get_boolean (v)) {
- if (value == NM_TERNARY_TRUE)
- return;
- } else {
- if (value == NM_TERNARY_FALSE)
- return;
- }
- }
-
- v = g_variant_ref_sink (g_variant_new_boolean (value != NM_TERNARY_FALSE));
- g_hash_table_insert (hash,
- g_strdup (optname),
- v);
- _notify_attributes (setting);
+ if (value == NM_TERNARY_DEFAULT)
+ nm_setting_option_set (NM_SETTING (setting), optname, NULL);
+ else
+ nm_setting_option_set_boolean (NM_SETTING (setting), optname, (value != NM_TERNARY_FALSE));
}
/**
@@ -205,17 +186,20 @@ nm_setting_ethtool_set_feature (NMSettingEthtool *setting,
* Clears all offload features settings
*
* Since: 1.14
+ *
+ * Deprecated: 1.26: use nm_setting_option_clear_by_name() with nm_ethtool_optname_is_feature() predicate instead.
*/
void
nm_setting_ethtool_clear_features (NMSettingEthtool *setting)
{
g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
- if (nm_setting_gendata_clear_all (NM_SETTING (setting),
- &nm_ethtool_optname_is_feature))
- _notify_attributes (setting);
+ nm_setting_option_clear_by_name (NM_SETTING (setting),
+ nm_ethtool_optname_is_feature);
}
+/*****************************************************************************/
+
guint
nm_setting_ethtool_init_features (NMSettingEthtool *setting,
NMTernary *requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */)
@@ -233,7 +217,7 @@ nm_setting_ethtool_init_features (NMSettingEthtool *setting,
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++)
requested[i] = NM_TERNARY_DEFAULT;
- hash = _nm_setting_gendata_hash (NM_SETTING (setting), FALSE);
+ hash = _nm_setting_option_hash (NM_SETTING (setting), FALSE);
if (!hash)
return 0;
@@ -246,218 +230,15 @@ nm_setting_ethtool_init_features (NMSettingEthtool *setting,
if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN))
continue;
- requested[ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST] = g_variant_get_boolean (variant)
- ? NM_TERNARY_TRUE
- : NM_TERNARY_FALSE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (ethtool_id)] = g_variant_get_boolean (variant)
+ ? NM_TERNARY_TRUE
+ : NM_TERNARY_FALSE;
n_req++;
}
return n_req;
}
-/**
- * nm_setting_ethtool_get_coalesce:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the coalescing setting to get
- * @out_value (out) (allow-none): value of the coalescing setting
- *
- * Gets the value of coalescing setting.
- *
- * Note that @optname must be a valid name for a setting, according to
- * nm_ethtool_optname_is_coalesce().
- *
- *
- * Returns: %TRUE and places the coalesce setting value in @out_value or %FALSE if unset.
- *
- * Since: 1.26
- */
-gboolean
-nm_setting_ethtool_get_coalesce (NMSettingEthtool *setting,
- const char *optname,
- guint32 *out_value)
-{
- g_return_val_if_fail (NM_IS_SETTING_ETHTOOL (setting), FALSE);
- g_return_val_if_fail (nm_ethtool_optname_is_coalesce (optname), FALSE);
-
- return nm_setting_gendata_get_uint32 (NM_SETTING (setting),
- optname,
- out_value);
-}
-
-/**
- * nm_setting_ethtool_set_coalesce:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the coalesce setting
- * @value: the new value to set.
- *
- * Sets a coalesce setting.
- *
- * Note that @optname must be a valid name for a coalesce setting, according to
- * nm_ethtool_optname_is_coalesce().
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_set_coalesce (NMSettingEthtool *setting,
- const char *optname,
- guint32 value)
-{
- NMEthtoolID ethtool_id;
-
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
-
- ethtool_id = nm_ethtool_id_get_by_name (optname);
-
- g_return_if_fail (nm_ethtool_id_is_coalesce (ethtool_id));
-
- if (NM_IN_SET (ethtool_id,
- NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX,
- NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX))
- value = !!value;
-
- nm_setting_gendata_set_uint32 (NM_SETTING (setting),
- optname,
- value);
- _notify_attributes (setting);
-}
-
-/**
- * nm_setting_ethtool_clear_coalesce:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the coalesce setting
- *
- * Clear a coalesce setting
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_clear_coalesce (NMSettingEthtool *setting,
- const char *optname)
-{
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
- g_return_if_fail (nm_str_not_empty (optname));
-
- if (nm_setting_gendata_clear (NM_SETTING (setting), optname))
- _notify_attributes (setting);
-}
-
-/**
- * nm_setting_ethtool_clear_coalesce_all:
- * @setting: the #NMSettingEthtool
- *
- * Clears all coalesce settings
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_clear_coalesce_all (NMSettingEthtool *setting)
-{
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
-
- if (nm_setting_gendata_clear_all (NM_SETTING (setting),
- &nm_ethtool_optname_is_coalesce))
- _notify_attributes (setting);
-}
-
-/**
- * nm_setting_ethtool_get_ring:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the ring setting to get
- * @out_value (out) (allow-none): value of the ring setting
- *
- * Gets the value of ring setting.
- *
- * Note that @optname must be a valid name for a setting, according to
- * nm_ethtool_optname_is_ring().
- *
- *
- * Returns: %TRUE and places the ring setting value in @out_value or %FALSE if unset.
- *
- * Since: 1.26
- */
-gboolean
-nm_setting_ethtool_get_ring (NMSettingEthtool *setting,
- const char *optname,
- guint32 *out_value)
-{
- g_return_val_if_fail (NM_IS_SETTING_ETHTOOL (setting), FALSE);
- g_return_val_if_fail (nm_ethtool_optname_is_ring (optname), FALSE);
-
- return nm_setting_gendata_get_uint32 (NM_SETTING (setting),
- optname,
- out_value);
-}
-
-/**
- * nm_setting_ethtool_set_ring:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the ring setting
- * @value: the new value to set.
- *
- * Sets a ring setting.
- *
- * Note that @optname must be a valid name for a ring setting, according to
- * nm_ethtool_optname_is_ring().
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_set_ring (NMSettingEthtool *setting,
- const char *optname,
- guint32 value)
-{
- NMEthtoolID ethtool_id;
-
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
-
- ethtool_id = nm_ethtool_id_get_by_name (optname);
-
- g_return_if_fail (nm_ethtool_id_is_ring (ethtool_id));
-
- nm_setting_gendata_set_uint32 (NM_SETTING (setting),
- optname,
- value);
- _notify_attributes (setting);
-}
-
-/**
- * nm_setting_ethtool_clear_ring:
- * @setting: the #NMSettingEthtool
- * @optname: option name of the ring setting
- *
- * Clear a ring setting
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_clear_ring (NMSettingEthtool *setting,
- const char *optname)
-{
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
- g_return_if_fail (nm_str_not_empty (optname));
-
- if (nm_setting_gendata_clear (NM_SETTING (setting), optname))
- _notify_attributes (setting);
-}
-
-/**
- * nm_setting_ethtool_clear_ring_all:
- * @setting: the #NMSettingEthtool
- *
- * Clears all ring settings
- *
- * Since: 1.26
- */
-void
-nm_setting_ethtool_clear_ring_all (NMSettingEthtool *setting)
-{
- g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
-
- if (nm_setting_gendata_clear_all (NM_SETTING (setting),
- &nm_ethtool_optname_is_ring))
- _notify_attributes (setting);
-}
-
/*****************************************************************************/
/**
@@ -474,16 +255,23 @@ nm_setting_ethtool_clear_ring_all (NMSettingEthtool *setting)
* @setting and may get invalidated when @setting gets modified.
*
* Since: 1.20
+ *
+ * Deprecated: 1.26: use nm_setting_option_get_all_names() instead.
*/
const char **
nm_setting_ethtool_get_optnames (NMSettingEthtool *setting,
guint *out_length)
{
+ const char *const*names;
+ guint len;
+
g_return_val_if_fail (NM_IS_SETTING_ETHTOOL (setting), NULL);
- return nm_utils_strdict_get_keys (_nm_setting_gendata_hash (NM_SETTING (setting), FALSE),
- TRUE,
- out_length);
+ names = nm_setting_option_get_all_names (NM_SETTING (setting), &len);
+ NM_SET_OUT (out_length, len);
+ return len > 0
+ ? nm_memdup (names, sizeof (names[0]) * (((gsize) len) + 1u))
+ : NULL;
}
/*****************************************************************************/
@@ -491,38 +279,23 @@ nm_setting_ethtool_get_optnames (NMSettingEthtool *setting,
static gboolean
verify (NMSetting *setting, NMConnection *connection, GError **error)
{
- GHashTable *hash;
- GHashTableIter iter;
- const char *optname;
- GVariant *variant;
+ const char *const*optnames;
+ GVariant *const*variants;
+ guint len;
+ guint i;
- hash = _nm_setting_gendata_hash (setting, FALSE);
+ len = _nm_setting_option_get_all (setting, &optnames, &variants);
- if (!hash)
- goto out;
+ for (i = 0; i < len; i++) {
+ const char *optname = optnames[i];
+ GVariant *variant = variants[i];
+ const GVariantType *variant_type;
+ NMEthtoolID ethtool_id;
- g_hash_table_iter_init (&iter, hash);
- while (g_hash_table_iter_next (&iter, (gpointer *) &optname, (gpointer *) &variant)) {
- if (nm_ethtool_optname_is_feature (optname)) {
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) {
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("offload feature has invalid variant type"));
- g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
- return FALSE;
- }
- } else if ( nm_ethtool_optname_is_coalesce (optname)
- || nm_ethtool_optname_is_ring (optname)) {
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)) {
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("setting has invalid variant type"));
- g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
- return FALSE;
- }
- } else {
+ ethtool_id = nm_ethtool_id_get_by_name (optname);
+ variant_type = get_variant_type_from_ethtool_id (ethtool_id);
+
+ if (!variant_type) {
g_set_error_literal (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
@@ -530,9 +303,30 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
return FALSE;
}
+
+ if (!g_variant_is_of_type (variant, variant_type)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("setting has invalid variant type"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
+ return FALSE;
+ }
+
+ if (NM_IN_SET (ethtool_id,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)) {
+ if (!NM_IN_SET (g_variant_get_uint32 (variant), 0, 1)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("coalesce option must be either 0 or 1"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
+ return FALSE;
+ }
+ }
}
-out:
return TRUE;
}
@@ -543,21 +337,20 @@ get_variant_type (const NMSettInfoSetting *sett_info,
const char *name,
GError **error)
{
- NMEthtoolID ethtool_id = nm_ethtool_id_get_by_name (name);
+ const GVariantType *variant_type;
- if (nm_ethtool_id_is_feature (ethtool_id))
- return G_VARIANT_TYPE_BOOLEAN;
+ variant_type = get_variant_type_from_ethtool_id (nm_ethtool_id_get_by_name (name));
- if ( nm_ethtool_id_is_coalesce (ethtool_id)
- || nm_ethtool_id_is_ring (ethtool_id))
- return G_VARIANT_TYPE_UINT32;
+ if (!variant_type) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("unknown ethtool option '%s'"),
+ name);
+ return NULL;
+ }
- g_set_error (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("unknown ethtool option '%s'"),
- name);
- return NULL;
+ return variant_type;
}
/*****************************************************************************/
diff --git a/libnm-core/nm-setting-ethtool.h b/libnm-core/nm-setting-ethtool.h
index 795b3a38dc..27cb965826 100644
--- a/libnm-core/nm-setting-ethtool.h
+++ b/libnm-core/nm-setting-ethtool.h
@@ -129,54 +129,24 @@ NMSetting *nm_setting_ethtool_new (void);
/*****************************************************************************/
+NM_AVAILABLE_IN_1_20
+NM_DEPRECATED_IN_1_26
+const char ** nm_setting_ethtool_get_optnames (NMSettingEthtool *setting,
+ guint *out_length);
+
NM_AVAILABLE_IN_1_14
+NM_DEPRECATED_IN_1_26
NMTernary nm_setting_ethtool_get_feature (NMSettingEthtool *setting,
const char *optname);
NM_AVAILABLE_IN_1_14
+NM_DEPRECATED_IN_1_26
void nm_setting_ethtool_set_feature (NMSettingEthtool *setting,
const char *optname,
NMTernary value);
NM_AVAILABLE_IN_1_14
+NM_DEPRECATED_IN_1_26
void nm_setting_ethtool_clear_features (NMSettingEthtool *setting);
-NM_AVAILABLE_IN_1_20
-const char ** nm_setting_ethtool_get_optnames (NMSettingEthtool *setting,
- guint *out_length);
-
-NM_AVAILABLE_IN_1_26
-gboolean nm_setting_ethtool_get_coalesce (NMSettingEthtool *setting,
- const char *optname,
- guint32 *out_value);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_set_coalesce (NMSettingEthtool *setting,
- const char *optname,
- guint32 value);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_clear_coalesce (NMSettingEthtool *setting,
- const char *optname);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_clear_coalesce_all (NMSettingEthtool *setting);
-
-NM_AVAILABLE_IN_1_26
-gboolean nm_setting_ethtool_get_ring (NMSettingEthtool *setting,
- const char *optname,
- guint32 *out_value);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_set_ring (NMSettingEthtool *setting,
- const char *optname,
- guint32 value);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_clear_ring (NMSettingEthtool *setting,
- const char *optname);
-
-NM_AVAILABLE_IN_1_26
-void nm_setting_ethtool_clear_ring_all (NMSettingEthtool *setting);
-
G_END_DECLS
#endif /* __NM_SETTING_ETHTOOL_H__ */
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c
index 50a277d8b8..dfb2bed958 100644
--- a/libnm-core/nm-setting.c
+++ b/libnm-core/nm-setting.c
@@ -715,7 +715,7 @@ _nm_setting_to_dbus (NMSetting *setting,
g_variant_builder_init (&builder, NM_VARIANT_TYPE_SETTING);
- n_properties = _nm_setting_gendata_get_all (setting, &gendata_keys, NULL);
+ n_properties = _nm_setting_option_get_all (setting, &gendata_keys, NULL);
for (i = 0; i < n_properties; i++) {
g_variant_builder_add (&builder,
"{sv}",
@@ -873,7 +873,7 @@ init_from_dbus (NMSetting *setting,
g_hash_table_remove (keys, key);
}
- _nm_setting_gendata_notify (setting, TRUE);
+ _nm_setting_option_notify (setting, TRUE);
/* Currently, only NMSettingEthtool supports gendata based options, and
* that one has no other properties (except "name"). That means, we
@@ -1792,7 +1792,7 @@ nm_setting_enumerate_values (NMSetting *setting,
/* the properties of this setting are not real GObject properties.
* Hence, this API makes little sense (or does it?). Still, call
* @func with each value. */
- n_properties = _nm_setting_gendata_get_all (setting, &names, NULL);
+ n_properties = _nm_setting_option_get_all (setting, &names, NULL);
if (n_properties > 0) {
gs_strfreev char **keys = g_strdupv ((char **) names);
GHashTable *h = _gendata_hash (setting, FALSE)->hash;
@@ -2389,7 +2389,7 @@ _gendata_hash (NMSetting *setting, gboolean create_if_necessary)
}
GHashTable *
-_nm_setting_gendata_hash (NMSetting *setting, gboolean create_if_necessary)
+_nm_setting_option_hash (NMSetting *setting, gboolean create_if_necessary)
{
GenData *gendata;
@@ -2398,8 +2398,8 @@ _nm_setting_gendata_hash (NMSetting *setting, gboolean create_if_necessary)
}
void
-_nm_setting_gendata_notify (NMSetting *setting,
- gboolean names_changed)
+_nm_setting_option_notify (NMSetting *setting,
+ gboolean names_changed)
{
GenData *gendata;
@@ -2433,23 +2433,10 @@ out:
_nm_setting_emit_property_changed (setting);
}
-GVariant *
-nm_setting_gendata_get (NMSetting *setting,
- const char *name)
-{
- GenData *gendata;
-
- g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
- g_return_val_if_fail (name, NULL);
-
- gendata = _gendata_hash (setting, FALSE);
- return gendata ? g_hash_table_lookup (gendata->hash, name) : NULL;
-}
-
guint
-_nm_setting_gendata_get_all (NMSetting *setting,
- const char *const**out_names,
- GVariant *const**out_values)
+_nm_setting_option_get_all (NMSetting *setting,
+ const char *const**out_names,
+ GVariant *const**out_values)
{
GenData *gendata;
GHashTable *hash;
@@ -2495,138 +2482,164 @@ out_zero:
}
/**
- * nm_setting_gendata_get_all_names:
+ * nm_setting_option_get_all_names:
* @setting: the #NMSetting
* @out_len: (allow-none) (out):
*
- * Gives the number of generic data elements and optionally returns all their
- * key names and values. This API is low level access and unless you know what you
- * are doing, it might not be what you want.
+ * Gives the name of all set options.
*
* Returns: (array length=out_len zero-terminated=1) (transfer none):
* A %NULL terminated array of key names. If no names are present, this returns
* %NULL. The returned array and the names are owned by %NMSetting and might be invalidated
- * soon.
+ * by the next operation.
*
- * Since: 1.14
+ * Since: 1.26
**/
const char *const*
-nm_setting_gendata_get_all_names (NMSetting *setting,
- guint *out_len)
+nm_setting_option_get_all_names (NMSetting *setting,
+ guint *out_len)
{
const char *const*names;
guint len;
g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
- len = _nm_setting_gendata_get_all (setting, &names, NULL);
+ len = _nm_setting_option_get_all (setting, &names, NULL);
NM_SET_OUT (out_len, len);
return names;
}
-/**
- * nm_setting_gendata_get_all_values:
- * @setting: the #NMSetting
- *
- * Gives the number of generic data elements and optionally returns all their
- * key names and values. This API is low level access and unless you know what you
- * are doing, it might not be what you want.
- *
- * Returns: (array zero-terminated=1) (transfer none):
- * A %NULL terminated array of #GVariant. If no data is present, this returns
- * %NULL. The returned array and the variants are owned by %NMSetting and might be invalidated
- * soon. The sort order of nm_setting_gendata_get_all_names() and nm_setting_gendata_get_all_values()
- * is consistent. That means, the nth value has the nth name returned by nm_setting_gendata_get_all_names().
- *
- * Since: 1.14
- **/
-GVariant *const*
-nm_setting_gendata_get_all_values (NMSetting *setting)
+gboolean
+_nm_setting_option_clear (NMSetting *setting,
+ const char *optname)
{
- GVariant *const*values;
+ GHashTable *ht;
- g_return_val_if_fail (NM_IS_SETTING (setting), NULL);
+ nm_assert (NM_IS_SETTING (setting));
+ nm_assert (nm_str_not_empty (optname));
- _nm_setting_gendata_get_all (setting, NULL, &values);
- return values;
+ ht = _nm_setting_option_hash (setting, FALSE);
+ if (!ht)
+ return FALSE;
+
+ return g_hash_table_remove (ht, optname);
}
+/**
+ * nm_setting_option_clear_by_name:
+ * @setting: the #NMSetting
+ * @predicate: (allow-none) (scope call): the predicate for which names
+ * should be clear.
+ * If the predicate returns %TRUE for an option name, the option
+ * gets removed. If %NULL, all options will be removed.
+ *
+ * Since: 1.26
+ */
void
-_nm_setting_gendata_to_gvalue (NMSetting *setting,
- GValue *value)
+nm_setting_option_clear_by_name (NMSetting *setting,
+ NMUtilsPredicateStr predicate)
{
- GenData *gendata;
- GHashTable *new;
- const char *key;
- GVariant *val;
+ GHashTable *hash;
GHashTableIter iter;
+ const char *name;
+ gboolean changed = FALSE;
- nm_assert (NM_IS_SETTING (setting));
- nm_assert (value);
- nm_assert (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_HASH_TABLE));
+ g_return_if_fail (NM_IS_SETTING (setting));
- new = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref);
+ hash = _nm_setting_option_hash (NM_SETTING (setting), FALSE);
+ if (!hash)
+ return;
- gendata = _gendata_hash (setting, FALSE);
- if (gendata) {
- g_hash_table_iter_init (&iter, gendata->hash);
- while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &val))
- g_hash_table_insert (new, g_strdup (key), g_variant_ref (val));
+ if (!predicate) {
+ changed = (g_hash_table_size (hash) > 0);
+ if (changed)
+ g_hash_table_remove_all (hash);
+ } else {
+ g_hash_table_iter_init (&iter, hash);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) {
+ if (predicate (name)) {
+ g_hash_table_iter_remove (&iter);
+ changed = TRUE;
+ }
+ }
}
- g_value_take_boxed (value, new);
+ if (changed)
+ _nm_setting_option_notify (setting, TRUE);
}
-gboolean
-_nm_setting_gendata_reset_from_hash (NMSetting *setting,
- GHashTable *new)
+/*****************************************************************************/
+
+/**
+ * nm_setting_option_get:
+ * @setting: the #NMSetting
+ * @opt_name: the option name to request.
+ *
+ * Returns: (transfer none): the #GVariant or %NULL if the option
+ * is not set.
+ *
+ * Since: 1.26.
+ */
+GVariant *
+nm_setting_option_get (NMSetting *setting,
+ const char *opt_name)
{
GenData *gendata;
- GHashTableIter iter;
- const char *key;
- GVariant *val;
- guint num;
- nm_assert (NM_IS_SETTING (setting));
- nm_assert (new);
-
- num = new ? g_hash_table_size (new) : 0;
+ g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
+ g_return_val_if_fail (opt_name, FALSE);
- gendata = _gendata_hash (setting, num > 0);
+ gendata = _gendata_hash (setting, FALSE);
+ return gendata ? g_hash_table_lookup (gendata->hash, opt_name) : NULL;
+}
- if (num == 0) {
- if ( !gendata
- || g_hash_table_size (gendata->hash) == 0)
- return FALSE;
+/**
+ * nm_setting_option_get_boolean:
+ * @setting: the #NMSetting
+ * @opt_name: the option to get
+ * @out_value: (allow-none) (out): the optional output value.
+ * If the option is unset, %FALSE will be returned.
+ *
+ * Returns: %TRUE if @opt_name is set to a boolean variant.
+ *
+ * Since: 1.26
+ */
+gboolean
+nm_setting_option_get_boolean (NMSetting *setting,
+ const char *opt_name,
+ gboolean *out_value)
+{
+ GVariant *v;
- g_hash_table_remove_all (gendata->hash);
- _nm_setting_gendata_notify (setting, TRUE);
+ v = nm_setting_option_get (NM_SETTING (setting), opt_name);
+ if ( v
+ && g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN)) {
+ NM_SET_OUT (out_value, g_variant_get_boolean (v));
return TRUE;
}
-
- /* let's not bother to find out whether the new hash has any different
- * content the current gendata. Just replace it. */
- g_hash_table_remove_all (gendata->hash);
- if (num > 0) {
- g_hash_table_iter_init (&iter, new);
- while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &val))
- g_hash_table_insert (gendata->hash, g_strdup (key), g_variant_ref (val));
- }
- _nm_setting_gendata_notify (setting, TRUE);
- return TRUE;
+ NM_SET_OUT (out_value, FALSE);
+ return FALSE;
}
+/**
+ * nm_setting_option_get_uint32:
+ * @setting: the #NMSetting
+ * @opt_name: the option to get
+ * @out_value: (allow-none) (out): the optional output value.
+ * If the option is unset, 0 will be returned.
+ *
+ * Returns: %TRUE if @opt_name is set to a uint32 variant.
+ *
+ * Since: 1.26
+ */
gboolean
-nm_setting_gendata_get_uint32 (NMSetting *setting,
- const char *optname,
- guint32 *out_value)
+nm_setting_option_get_uint32 (NMSetting *setting,
+ const char *opt_name,
+ guint32 *out_value)
{
GVariant *v;
- nm_assert (NM_IS_SETTING (setting));
- nm_assert (nm_str_not_empty (optname));
-
- v = nm_setting_gendata_get (setting, optname);
+ v = nm_setting_option_get (NM_SETTING (setting), opt_name);
if ( v
&& g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) {
NM_SET_OUT (out_value, g_variant_get_uint32 (v));
@@ -2636,59 +2649,155 @@ nm_setting_gendata_get_uint32 (NMSetting *setting,
return FALSE;
}
+/**
+ * nm_setting_option_set:
+ * @setting: the #NMSetting
+ * @opt_name: the option name to set
+ * @variant: (allow-none): the variant to set.
+ *
+ * If @variant is %NULL, this clears the option if it is set.
+ * Otherwise, @variant is set as the option. If @variant is
+ * a floating reference, it will be consumed.
+ *
+ * Note that not all setting types support options. It is a bug
+ * setting a variant to a setting that doesn't support it.
+ * Currently only #NMSettingEthtool supports it.
+ *
+ * Since: 1.26
+ */
void
-nm_setting_gendata_set_uint32 (NMSetting *setting,
- const char *optname,
- guint32 value)
+nm_setting_option_set (NMSetting *setting,
+ const char *opt_name,
+ GVariant *variant)
{
- nm_assert (NM_IS_SETTING (setting));
- nm_assert (nm_str_not_empty (optname));
+ GVariant *old_variant;
+ gboolean changed_name;
+ gboolean changed_value;
+ GHashTable *hash;
- g_hash_table_insert (_nm_setting_gendata_hash (setting, TRUE),
- g_strdup (optname),
- g_variant_ref_sink (g_variant_new_uint32 (value)));
+ g_return_if_fail (NM_IS_SETTING (setting));
+ g_return_if_fail (opt_name);
+
+ hash = _nm_setting_option_hash (setting, variant != NULL);
+
+ if (!variant) {
+ if (hash) {
+ if (g_hash_table_remove (hash, opt_name))
+ _nm_setting_option_notify (setting, TRUE);
+ }
+ return;
+ }
+
+ /* Currently, it is a bug setting any option, unless the setting type supports it.
+ * And currently, only NMSettingEthtool supports it.
+ *
+ * In the future, more setting types may support it. Or we may relax this so
+ * that options can be attached to all setting types (to indicate "unsupported"
+ * settings for forward compatibility).
+ *
+ * As it is today, internal code will only add gendata options to NMSettingEthtool,
+ * and there exists not public API to add such options. Still, it is permissible
+ * to call get(), clear() and set(variant=NULL) also on settings that don't support
+ * it, as these operations don't add options.
+ */
+ g_return_if_fail (_nm_setting_class_get_sett_info (NM_SETTING_GET_CLASS (setting))->detail.gendata_info);
+
+ old_variant = g_hash_table_lookup (hash, opt_name);
+
+ changed_name = (old_variant == NULL);
+ changed_value = changed_name
+ || !g_variant_equal (old_variant, variant);
+
+ /* We always want to replace the variant, even if it has
+ * the same value according to g_variant_equal(). The reason
+ * is that we want to take a reference on @variant, because
+ * that is what the user might expect. */
+ g_hash_table_insert (hash,
+ g_strdup (opt_name),
+ g_variant_ref_sink (variant));
+
+ if (changed_value)
+ _nm_setting_option_notify (setting, !changed_name);
}
-gboolean
-nm_setting_gendata_clear (NMSetting *setting,
- const char *optname)
+/**
+ * nm_setting_option_set_boolean:
+ * @setting: the #NMSetting
+ * @value: the value to set.
+ *
+ * Like nm_setting_option_set() to set a boolean GVariant.
+ *
+ * Since: 1.26
+ */
+void
+nm_setting_option_set_boolean (NMSetting *setting,
+ const char *opt_name,
+ gboolean value)
{
- GHashTable *ht;
+ GVariant *old_variant;
+ gboolean changed_name;
+ gboolean changed_value;
+ GHashTable *hash;
- nm_assert (NM_IS_SETTING (setting));
- nm_assert (nm_str_not_empty (optname));
+ g_return_if_fail (NM_IS_SETTING (setting));
+ g_return_if_fail (opt_name);
- ht = _nm_setting_gendata_hash (setting, FALSE);
- if (!ht)
- return FALSE;
+ value = (!!value);
- return g_hash_table_remove (ht, optname);
+ hash = _nm_setting_option_hash (setting, TRUE);
+
+ old_variant = g_hash_table_lookup (hash, opt_name);
+
+ changed_name = (old_variant == NULL);
+ changed_value = changed_name
+ || ( !g_variant_is_of_type (old_variant, G_VARIANT_TYPE_BOOLEAN)
+ || g_variant_get_boolean (old_variant) != value);
+
+ g_hash_table_insert (hash,
+ g_strdup (opt_name),
+ g_variant_ref_sink (g_variant_new_boolean (value)));
+
+ if (changed_value)
+ _nm_setting_option_notify (setting, !changed_name);
}
-gboolean
-nm_setting_gendata_clear_all (NMSetting *setting,
- nm_setting_gendata_filter_fcn filter)
+/**
+ * nm_setting_option_set_uint32:
+ * @setting: the #NMSetting
+ * @value: the value to set.
+ *
+ * Like nm_setting_option_set() to set a uint32 GVariant.
+ *
+ * Since: 1.26
+ */
+void
+nm_setting_option_set_uint32 (NMSetting *setting,
+ const char *opt_name,
+ guint32 value)
{
- GHashTable *ht;
- const char *name;
- GHashTableIter iter;
- gboolean changed = FALSE;
+ GVariant *old_variant;
+ gboolean changed_name;
+ gboolean changed_value;
+ GHashTable *hash;
- nm_assert (NM_IS_SETTING (setting));
+ g_return_if_fail (NM_IS_SETTING (setting));
+ g_return_if_fail (opt_name);
- ht = _nm_setting_gendata_hash (setting, FALSE);
- if (!ht)
- return FALSE;
+ hash = _nm_setting_option_hash (setting, TRUE);
- g_hash_table_iter_init (&iter, ht);
- while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) {
- if (!filter || filter (name)) {
- g_hash_table_iter_remove (&iter);
- changed = TRUE;
- }
- }
+ old_variant = g_hash_table_lookup (hash, opt_name);
- return changed;
+ changed_name = (old_variant == NULL);
+ changed_value = changed_name
+ || ( !g_variant_is_of_type (old_variant, G_VARIANT_TYPE_UINT32)
+ || g_variant_get_uint32 (old_variant) != value);
+
+ g_hash_table_insert (hash,
+ g_strdup (opt_name),
+ g_variant_ref_sink (g_variant_new_uint32 (value)));
+
+ if (changed_value)
+ _nm_setting_option_notify (setting, !changed_name);
}
/*****************************************************************************/
diff --git a/libnm-core/nm-setting.h b/libnm-core/nm-setting.h
index 26c1b1ee8d..01cd1503e8 100644
--- a/libnm-core/nm-setting.h
+++ b/libnm-core/nm-setting.h
@@ -333,6 +333,46 @@ gboolean nm_setting_set_secret_flags (NMSetting *setting,
/*****************************************************************************/
+NM_AVAILABLE_IN_1_26
+GVariant *nm_setting_option_get (NMSetting *setting,
+ const char *opt_name);
+
+NM_AVAILABLE_IN_1_26
+gboolean nm_setting_option_get_boolean (NMSetting *setting,
+ const char *opt_name,
+ gboolean *out_value);
+
+NM_AVAILABLE_IN_1_26
+gboolean nm_setting_option_get_uint32 (NMSetting *setting,
+ const char *opt_name,
+ guint32 *out_value);
+
+NM_AVAILABLE_IN_1_26
+void nm_setting_option_set (NMSetting *setting,
+ const char *opt_name,
+ GVariant *variant);
+
+NM_AVAILABLE_IN_1_26
+void nm_setting_option_set_uint32 (NMSetting *setting,
+ const char *opt_name,
+ guint32 value);
+
+NM_AVAILABLE_IN_1_26
+void nm_setting_option_set_boolean (NMSetting *setting,
+ const char *opt_name,
+ gboolean value);
+
+NM_AVAILABLE_IN_1_26
+const char *const*nm_setting_option_get_all_names (NMSetting *setting,
+ guint *out_len);
+
+
+NM_AVAILABLE_IN_1_26
+void nm_setting_option_clear_by_name (NMSetting *setting,
+ NMUtilsPredicateStr predicate);
+
+/*****************************************************************************/
+
const GVariantType *nm_setting_get_dbus_property_type (NMSetting *setting,
const char *property_name);
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index be76ead592..bc00516821 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -48,6 +48,20 @@
/*****************************************************************************/
+/**
+ * NMUtilsPredicateStr:
+ * @str: the name to check.
+ *
+ * This function takes a string argument and returns either %TRUE or %FALSE.
+ * It is a general purpose predicate, for example used by nm_setting_option_clear_by_name().
+ *
+ * Returns: %TRUE if the predicate function matches.
+ *
+ * Since: 1.26
+ */
+
+/*****************************************************************************/
+
struct _NMSockAddrEndpoint {
const char *host;
guint16 port;
diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c
index d861fbcb33..c7d54cbbcf 100644
--- a/libnm-core/tests/test-setting.c
+++ b/libnm-core/tests/test-setting.c
@@ -1499,6 +1499,52 @@ test_team_setting (void)
/*****************************************************************************/
static void
+_setting_ethtool_set_feature (NMSettingEthtool *s_ethtool,
+ const char *opt_name,
+ NMTernary value)
+{
+ g_assert (NM_IS_SETTING_ETHTOOL (s_ethtool));
+
+ if (nmtst_get_rand_bool ()) {
+ nm_setting_ethtool_set_feature (s_ethtool, opt_name, value);
+ return;
+ }
+
+ if (value == NM_TERNARY_DEFAULT) {
+ nm_setting_option_set (NM_SETTING (s_ethtool), opt_name, NULL);
+ return;
+ }
+
+ if (nmtst_get_rand_bool ())
+ nm_setting_option_set_boolean (NM_SETTING (s_ethtool), opt_name, value);
+ else
+ nm_setting_option_set (NM_SETTING (s_ethtool), opt_name, g_variant_new_boolean (value));
+}
+
+static NMTernary
+_setting_ethtool_get_feature (NMSettingEthtool *s_ethtool,
+ const char *opt_name)
+{
+ GVariant *v;
+ gboolean b;
+
+ switch (nmtst_get_rand_uint32 () % 3) {
+ case 0:
+ return nm_setting_ethtool_get_feature (s_ethtool, opt_name);
+ case 1:
+ if (!nm_setting_option_get_boolean (NM_SETTING (s_ethtool), opt_name, &b))
+ return NM_TERNARY_DEFAULT;
+ return b;
+ default:
+ v = nm_setting_option_get (NM_SETTING (s_ethtool), opt_name);
+ if ( !v
+ || !g_variant_is_of_type (v, G_VARIANT_TYPE_BOOLEAN))
+ return NM_TERNARY_DEFAULT;
+ return g_variant_get_boolean (v);
+ }
+}
+
+static void
test_ethtool_features (void)
{
gs_unref_object NMConnection *con = NULL;
@@ -1519,16 +1565,16 @@ test_ethtool_features (void)
s_ethtool = NM_SETTING_ETHTOOL (nm_setting_ethtool_new ());
nm_connection_add_setting (con, NM_SETTING (s_ethtool));
- nm_setting_ethtool_set_feature (s_ethtool,
- NM_ETHTOOL_OPTNAME_FEATURE_RX,
- NM_TERNARY_TRUE);
- nm_setting_ethtool_set_feature (s_ethtool,
- NM_ETHTOOL_OPTNAME_FEATURE_LRO,
- NM_TERNARY_FALSE);
+ _setting_ethtool_set_feature (s_ethtool,
+ NM_ETHTOOL_OPTNAME_FEATURE_RX,
+ NM_TERNARY_TRUE);
+ _setting_ethtool_set_feature (s_ethtool,
+ NM_ETHTOOL_OPTNAME_FEATURE_LRO,
+ NM_TERNARY_FALSE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
nmtst_connection_normalize (con);
@@ -1539,9 +1585,9 @@ test_ethtool_features (void)
s_ethtool2 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con2, NM_TYPE_SETTING_ETHTOOL));
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool2, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
nmtst_assert_connection_verifies_without_normalization (con2);
@@ -1566,9 +1612,9 @@ test_ethtool_features (void)
s_ethtool3 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con3, NM_TYPE_SETTING_ETHTOOL));
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
- g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_RX), ==, NM_TERNARY_TRUE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_LRO), ==, NM_TERNARY_FALSE);
+ g_assert_cmpint (_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
}
static void
@@ -1584,7 +1630,7 @@ test_ethtool_coalesce (void)
NMSettingEthtool *s_ethtool;
NMSettingEthtool *s_ethtool2;
NMSettingEthtool *s_ethtool3;
- guint32 out_value;
+ guint32 u32;
con = nmtst_create_minimal_connection ("ethtool-coalesce",
NULL,
@@ -1593,12 +1639,12 @@ test_ethtool_coalesce (void)
s_ethtool = NM_SETTING_ETHTOOL (nm_setting_ethtool_new ());
nm_connection_add_setting (con, NM_SETTING (s_ethtool));
- nm_setting_ethtool_set_coalesce (s_ethtool,
- NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES,
- 4);
+ nm_setting_option_set_uint32 (NM_SETTING (s_ethtool),
+ NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES,
+ 4);
- g_assert_true (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &out_value));
- g_assert_cmpuint (out_value, ==, 4);
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &u32));
+ g_assert_cmpuint (u32, ==, 4);
nmtst_connection_normalize (con);
@@ -1609,8 +1655,8 @@ test_ethtool_coalesce (void)
s_ethtool2 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con2, NM_TYPE_SETTING_ETHTOOL));
- g_assert_true (nm_setting_ethtool_get_coalesce (s_ethtool2, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &out_value));
- g_assert_cmpuint (out_value, ==, 4);
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool2), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &u32));
+ g_assert_cmpuint (u32, ==, 4);
nmtst_assert_connection_verifies_without_normalization (con2);
@@ -1635,24 +1681,24 @@ test_ethtool_coalesce (void)
s_ethtool3 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con3, NM_TYPE_SETTING_ETHTOOL));
- g_assert_true (nm_setting_ethtool_get_coalesce (s_ethtool3, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &out_value));
- g_assert_cmpuint (out_value, ==, 4);
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool3), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &u32));
+ g_assert_cmpuint (u32, ==, 4);
- nm_setting_ethtool_clear_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES);
- g_assert_false (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, NULL));
+ nm_setting_option_set (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, NULL);
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, NULL));
- nm_setting_ethtool_set_coalesce (s_ethtool,
- NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES,
- 8);
+ nm_setting_option_set_uint32 (NM_SETTING (s_ethtool),
+ NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES,
+ 8);
- g_assert_true (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES, &out_value));
- g_assert_cmpuint (out_value, ==, 8);
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES, &u32));
+ g_assert_cmpuint (u32, ==, 8);
- nm_setting_ethtool_clear_coalesce_all (s_ethtool);
- g_assert_false (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, NULL));
- g_assert_false (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES, NULL));
- g_assert_false (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS, NULL));
+ nm_setting_option_clear_by_name (NM_SETTING (s_ethtool), nm_ethtool_optname_is_coalesce);
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, NULL));
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES, NULL));
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS, NULL));
}
static void
@@ -1677,11 +1723,11 @@ test_ethtool_ring (void)
s_ethtool = NM_SETTING_ETHTOOL (nm_setting_ethtool_new ());
nm_connection_add_setting (con, NM_SETTING (s_ethtool));
- nm_setting_ethtool_set_ring (s_ethtool,
- NM_ETHTOOL_OPTNAME_RING_RX_JUMBO,
- 4);
+ nm_setting_option_set_uint32 (NM_SETTING (s_ethtool),
+ NM_ETHTOOL_OPTNAME_RING_RX_JUMBO,
+ 4);
- g_assert_true (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
g_assert_cmpuint (out_value, ==, 4);
nmtst_connection_normalize (con);
@@ -1693,7 +1739,7 @@ test_ethtool_ring (void)
s_ethtool2 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con2, NM_TYPE_SETTING_ETHTOOL));
- g_assert_true (nm_setting_ethtool_get_ring (s_ethtool2, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool2), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
g_assert_cmpuint (out_value, ==, 4);
nmtst_assert_connection_verifies_without_normalization (con2);
@@ -1719,24 +1765,24 @@ test_ethtool_ring (void)
s_ethtool3 = NM_SETTING_ETHTOOL (nm_connection_get_setting (con3, NM_TYPE_SETTING_ETHTOOL));
- g_assert_true (nm_setting_ethtool_get_ring (s_ethtool3, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool3), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
g_assert_cmpuint (out_value, ==, 4);
- nm_setting_ethtool_clear_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO);
- g_assert_false (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, NULL));
+ nm_setting_option_set (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, NULL);
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, NULL));
- nm_setting_ethtool_set_ring (s_ethtool,
- NM_ETHTOOL_OPTNAME_RING_RX_JUMBO,
- 8);
+ nm_setting_option_set_uint32 (NM_SETTING (s_ethtool),
+ NM_ETHTOOL_OPTNAME_RING_RX_JUMBO,
+ 8);
- g_assert_true (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
+ g_assert_true (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, &out_value));
g_assert_cmpuint (out_value, ==, 8);
- nm_setting_ethtool_clear_ring_all (s_ethtool);
- g_assert_false (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, NULL));
- g_assert_false (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_RX, NULL));
- g_assert_false (nm_setting_ethtool_get_ring (s_ethtool, NM_ETHTOOL_OPTNAME_RING_TX, NULL));
+ nm_setting_option_clear_by_name (NM_SETTING (s_ethtool), nm_ethtool_optname_is_ring);
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX_JUMBO, NULL));
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_RX, NULL));
+ g_assert_false (nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), NM_ETHTOOL_OPTNAME_RING_TX, NULL));
}
/*****************************************************************************/
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index effa41d162..dac75f2f91 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1710,14 +1710,6 @@ global:
nm_setting_bridge_get_multicast_startup_query_count;
nm_setting_bridge_get_multicast_startup_query_interval;
nm_setting_connection_get_mud_url;
- nm_setting_ethtool_clear_coalesce;
- nm_setting_ethtool_clear_coalesce_all;
- nm_setting_ethtool_clear_ring;
- nm_setting_ethtool_clear_ring_all;
- nm_setting_ethtool_get_coalesce;
- nm_setting_ethtool_get_ring;
- nm_setting_ethtool_set_coalesce;
- nm_setting_ethtool_set_ring;
nm_setting_match_add_driver;
nm_setting_match_add_kernel_command_line;
nm_setting_match_clear_drivers;
@@ -1732,4 +1724,12 @@ global:
nm_setting_match_remove_driver_by_value;
nm_setting_match_remove_kernel_command_line;
nm_setting_match_remove_kernel_command_line_by_value;
+ nm_setting_option_clear_by_name;
+ nm_setting_option_get;
+ nm_setting_option_get_all_names;
+ nm_setting_option_get_boolean;
+ nm_setting_option_get_uint32;
+ nm_setting_option_set;
+ nm_setting_option_set_boolean;
+ nm_setting_option_set_uint32;
} libnm_1_24_0;
diff --git a/shared/nm-keyfile/nm-keyfile.c b/shared/nm-keyfile/nm-keyfile.c
index 372ae202e3..35de1a727f 100644
--- a/shared/nm-keyfile/nm-keyfile.c
+++ b/shared/nm-keyfile/nm-keyfile.c
@@ -3195,7 +3195,7 @@ _read_setting (KeyfileReaderInfo *info)
if (!keys)
n_keys = 0;
if (n_keys > 0) {
- GHashTable *h = _nm_setting_gendata_hash (setting, TRUE);
+ GHashTable *h = _nm_setting_option_hash (setting, TRUE);
nm_utils_strv_sort (keys, n_keys);
for (k = 0; k < n_keys; k++) {
@@ -3851,10 +3851,10 @@ nm_keyfile_write (NMConnection *connection,
nm_assert (!nm_keyfile_plugin_get_alias_for_setting_name (sett_info->setting_class->setting_info->setting_name));
- n_keys = _nm_setting_gendata_get_all (setting, &keys, NULL);
+ n_keys = _nm_setting_option_get_all (setting, &keys, NULL);
if (n_keys > 0) {
- GHashTable *h = _nm_setting_gendata_hash (setting, FALSE);
+ GHashTable *h = _nm_setting_option_hash (setting, FALSE);
for (k = 0; k < n_keys; k++) {
const char *key = keys[k];
diff --git a/shared/nm-libnm-core-intern/nm-ethtool-utils.h b/shared/nm-libnm-core-intern/nm-ethtool-utils.h
index 0df3d3d00c..cf971edbd2 100644
--- a/shared/nm-libnm-core-intern/nm-ethtool-utils.h
+++ b/shared/nm-libnm-core-intern/nm-ethtool-utils.h
@@ -108,6 +108,9 @@ typedef enum {
_NM_ETHTOOL_ID_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1),
} NMEthtoolID;
+#define _NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id) ((ethtool_id) - _NM_ETHTOOL_ID_FEATURE_FIRST)
+#define _NM_ETHTOOL_ID_COALESCE_AS_IDX(ethtool_id) ((ethtool_id) - _NM_ETHTOOL_ID_COALESCE_FIRST)
+
typedef enum {
NM_ETHTOOL_TYPE_UNKNOWN,
NM_ETHTOOL_TYPE_COALESCE,
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 418641358d..e6fe97493a 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -866,48 +866,6 @@ _ethtool_features_set (NMDevice *self,
ethtool_state->features = g_steal_pointer (&features);
}
-static gboolean
-_ethtool_init_coalesce (NMDevice *self,
- NMPlatform *platform,
- NMSettingEthtool *s_ethtool,
- NMEthtoolCoalesceState *coalesce)
-{
- GHashTable *hash;
- GHashTableIter iter;
- const char *name;
- GVariant *variant;
- gsize n_coalesce_set = 0;
-
- nm_assert (self);
- nm_assert (platform);
- nm_assert (coalesce);
- nm_assert (NM_IS_SETTING_ETHTOOL (s_ethtool));
-
- hash = _nm_setting_gendata_hash (NM_SETTING (s_ethtool), FALSE);
- if (!hash)
- return FALSE;
-
- g_hash_table_iter_init (&iter, hash);
- while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &variant)) {
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32))
- continue;
- if (!nm_ethtool_optname_is_coalesce (name))
- continue;
-
- if (!nm_platform_ethtool_init_coalesce (platform,
- coalesce,
- name,
- g_variant_get_uint32(variant))) {
- _LOGW (LOGD_DEVICE, "ethtool: invalid coalesce setting %s", name);
- return FALSE;
- }
- ++n_coalesce_set;
-
- }
-
- return !!n_coalesce_set;
-}
-
static void
_ethtool_coalesce_reset (NMDevice *self,
NMPlatform *platform,
@@ -939,25 +897,45 @@ _ethtool_coalesce_set (NMDevice *self,
{
NMEthtoolCoalesceState coalesce_old;
NMEthtoolCoalesceState coalesce_new;
+ gboolean has_old = FALSE;
+ GHashTable *hash;
+ GHashTableIter iter;
+ const char *name;
+ GVariant *variant;
- nm_assert (ethtool_state);
nm_assert (NM_IS_DEVICE (self));
nm_assert (NM_IS_PLATFORM (platform));
nm_assert (NM_IS_SETTING_ETHTOOL (s_ethtool));
+ nm_assert (ethtool_state);
+ nm_assert (!ethtool_state->coalesce);
- if (!nm_platform_ethtool_get_link_coalesce (platform,
- ethtool_state->ifindex,
- &coalesce_old)) {
- _LOGW (LOGD_DEVICE, "ethtool: failure getting coalesce settings (cannot read)");
+ hash = _nm_setting_option_hash (NM_SETTING (s_ethtool), FALSE);
+ if (!hash)
return;
- }
- coalesce_new = coalesce_old;
+ g_hash_table_iter_init (&iter, hash);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &name, (gpointer *) &variant)) {
+ NMEthtoolID ethtool_id = nm_ethtool_id_get_by_name (name);
+
+ if (!nm_ethtool_id_is_coalesce (ethtool_id))
+ continue;
+
+ if (!has_old) {
+ if (!nm_platform_ethtool_get_link_coalesce (platform,
+ ethtool_state->ifindex,
+ &coalesce_old)) {
+ _LOGW (LOGD_DEVICE, "ethtool: failure getting coalesce settings (cannot read)");
+ return;
+ }
+ has_old = TRUE;
+ coalesce_new = coalesce_old;
+ }
+
+ nm_assert (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32));
+ coalesce_new.s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (ethtool_id)] = g_variant_get_uint32 (variant);
+ }
- if (!_ethtool_init_coalesce (self,
- platform,
- s_ethtool,
- &coalesce_new))
+ if (!has_old)
return;
ethtool_state->coalesce = nm_memdup (&coalesce_old, sizeof (coalesce_old));
@@ -989,7 +967,7 @@ _ethtool_init_ring (NMDevice *self,
nm_assert (ring);
nm_assert (NM_IS_SETTING_ETHTOOL (s_ethtool));
- hash = _nm_setting_gendata_hash (NM_SETTING (s_ethtool), FALSE);
+ hash = _nm_setting_option_hash (NM_SETTING (s_ethtool), FALSE);
if (!hash)
return FALSE;
diff --git a/src/platform/nm-platform-utils.c b/src/platform/nm-platform-utils.c
index 3b799e2f11..6c14bc5c16 100644
--- a/src/platform/nm-platform-utils.c
+++ b/src/platform/nm-platform-utils.c
@@ -520,8 +520,8 @@ _ASSERT_ethtool_feature_infos (void)
for (k = 0; k < i; k++)
g_assert (inf->ethtool_id != _ethtool_feature_infos[k].ethtool_id);
- g_assert (!found[inf->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST]);
- found[inf->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST] = TRUE;
+ g_assert (!found[_NM_ETHTOOL_ID_FEATURE_AS_IDX (inf->ethtool_id)]);
+ found[_NM_ETHTOOL_ID_FEATURE_AS_IDX (inf->ethtool_id)] = TRUE;
kstate.idx_kernel_name = inf->n_kernel_names - 1;
g_assert ((guint) kstate.idx_kernel_name == (guint) (inf->n_kernel_names - 1));
@@ -611,13 +611,13 @@ ethtool_get_features (SocketHandle *shandle)
nm_assert (states_plist_n < N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS (_ethtool_feature_infos));
- if (!states->states_indexed[info->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST])
- states->states_indexed[info->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST] = &states_plist0[states_plist_n];
+ if (!states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX (info->ethtool_id)])
+ states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX (info->ethtool_id)] = &states_plist0[states_plist_n];
((const NMEthtoolFeatureState **) states_plist0)[states_plist_n] = kstate;
states_plist_n++;
}
- if (states && states->states_indexed[info->ethtool_id - _NM_ETHTOOL_ID_FEATURE_FIRST]) {
+ if (states && states->states_indexed[_NM_ETHTOOL_ID_FEATURE_AS_IDX (info->ethtool_id)]) {
nm_assert (states_plist_n < N_ETHTOOL_KERNEL_FEATURES + G_N_ELEMENTS (_ethtool_feature_infos));
nm_assert (!states_plist0[states_plist_n]);
states_plist_n++;
@@ -810,7 +810,7 @@ nmp_utils_ethtool_set_features (int ifindex,
static gboolean
ethtool_get_coalesce (SocketHandle *shandle,
- NMEthtoolCoalesceState *out_state)
+ NMEthtoolCoalesceState *coalesce)
{
struct ethtool_coalesce eth_data;
@@ -821,32 +821,36 @@ ethtool_get_coalesce (SocketHandle *shandle,
sizeof (struct ethtool_coalesce)) != 0)
return FALSE;
- out_state->rx_coalesce_usecs = eth_data.rx_coalesce_usecs;
- out_state->rx_max_coalesced_frames = eth_data.rx_max_coalesced_frames;
- out_state->rx_coalesce_usecs_irq = eth_data.rx_coalesce_usecs_irq;
- out_state->rx_max_coalesced_frames_irq = eth_data.rx_max_coalesced_frames_irq;
- out_state->tx_coalesce_usecs = eth_data.tx_coalesce_usecs;
- out_state->tx_max_coalesced_frames = eth_data.tx_max_coalesced_frames;
- out_state->tx_coalesce_usecs_irq = eth_data.tx_coalesce_usecs_irq;
- out_state->tx_max_coalesced_frames_irq = eth_data.tx_max_coalesced_frames_irq;
- out_state->stats_block_coalesce_usecs = eth_data.stats_block_coalesce_usecs;
- out_state->use_adaptive_rx_coalesce = eth_data.use_adaptive_rx_coalesce;
- out_state->use_adaptive_tx_coalesce = eth_data.use_adaptive_tx_coalesce;
- out_state->pkt_rate_low = eth_data.pkt_rate_low;
- out_state->rx_coalesce_usecs_low = eth_data.rx_coalesce_usecs_low;
- out_state->rx_max_coalesced_frames_low = eth_data.rx_max_coalesced_frames_low;
- out_state->tx_coalesce_usecs_low = eth_data.tx_coalesce_usecs_low;
- out_state->tx_max_coalesced_frames_low = eth_data.tx_max_coalesced_frames_low;
- out_state->pkt_rate_high = eth_data.pkt_rate_high;
- out_state->rx_coalesce_usecs_high = eth_data.rx_coalesce_usecs_high;
- out_state->rx_max_coalesced_frames_high = eth_data.rx_max_coalesced_frames_high;
- out_state->tx_coalesce_usecs_high = eth_data.tx_coalesce_usecs_high;
- out_state->tx_max_coalesced_frames_high = eth_data.tx_max_coalesced_frames_high;
- out_state->rate_sample_interval = eth_data.rate_sample_interval;
-
+ *coalesce = (NMEthtoolCoalesceState) {
+ .s = {
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS)] = eth_data.rx_coalesce_usecs,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES)] = eth_data.rx_max_coalesced_frames,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ)] = eth_data.rx_coalesce_usecs_irq,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ)] = eth_data.rx_max_coalesced_frames_irq,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS)] = eth_data.tx_coalesce_usecs,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES)] = eth_data.tx_max_coalesced_frames,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ)] = eth_data.tx_coalesce_usecs_irq,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ)] = eth_data.tx_max_coalesced_frames_irq,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS)] = eth_data.stats_block_coalesce_usecs,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX)] = eth_data.use_adaptive_rx_coalesce,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)] = eth_data.use_adaptive_tx_coalesce,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW)] = eth_data.pkt_rate_low,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW)] = eth_data.rx_coalesce_usecs_low,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW)] = eth_data.rx_max_coalesced_frames_low,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW)] = eth_data.tx_coalesce_usecs_low,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW)] = eth_data.tx_max_coalesced_frames_low,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH)] = eth_data.pkt_rate_high,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH)] = eth_data.rx_coalesce_usecs_high,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH)] = eth_data.rx_max_coalesced_frames_high,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH)] = eth_data.tx_coalesce_usecs_high,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH)] = eth_data.tx_max_coalesced_frames_high,
+ [_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL)] = eth_data.rate_sample_interval,
+ }
+ };
return TRUE;
}
+
gboolean
nmp_utils_ethtool_get_coalesce (int ifindex,
NMEthtoolCoalesceState *coalesce)
@@ -871,38 +875,38 @@ nmp_utils_ethtool_get_coalesce (int ifindex,
static gboolean
ethtool_set_coalesce (SocketHandle *shandle,
- const NMEthtoolCoalesceState *state)
+ const NMEthtoolCoalesceState *coalesce)
{
- gboolean success;
struct ethtool_coalesce eth_data;
+ gboolean success;
- g_return_val_if_fail (shandle, FALSE);
- g_return_val_if_fail (state, FALSE);
+ nm_assert (shandle);
+ nm_assert (coalesce);
eth_data = (struct ethtool_coalesce) {
.cmd = ETHTOOL_SCOALESCE,
- .rx_coalesce_usecs = state->rx_coalesce_usecs,
- .rx_max_coalesced_frames = state->rx_max_coalesced_frames,
- .rx_coalesce_usecs_irq = state->rx_coalesce_usecs_irq,
- .rx_max_coalesced_frames_irq = state->rx_max_coalesced_frames_irq,
- .tx_coalesce_usecs = state->tx_coalesce_usecs,
- .tx_max_coalesced_frames = state->tx_max_coalesced_frames,
- .tx_coalesce_usecs_irq = state->tx_coalesce_usecs_irq,
- .tx_max_coalesced_frames_irq = state->tx_max_coalesced_frames_irq,
- .stats_block_coalesce_usecs = state->stats_block_coalesce_usecs,
- .use_adaptive_rx_coalesce = state->use_adaptive_rx_coalesce,
- .use_adaptive_tx_coalesce = state->use_adaptive_tx_coalesce,
- .pkt_rate_low = state->pkt_rate_low,
- .rx_coalesce_usecs_low = state->rx_coalesce_usecs_low,
- .rx_max_coalesced_frames_low = state->rx_max_coalesced_frames_low,
- .tx_coalesce_usecs_low = state->tx_coalesce_usecs_low,
- .tx_max_coalesced_frames_low = state->tx_max_coalesced_frames_low,
- .pkt_rate_high = state->pkt_rate_high,
- .rx_coalesce_usecs_high = state->rx_coalesce_usecs_high,
- .rx_max_coalesced_frames_high = state->rx_max_coalesced_frames_high,
- .tx_coalesce_usecs_high = state->tx_coalesce_usecs_high,
- .tx_max_coalesced_frames_high = state->tx_max_coalesced_frames_high,
- .rate_sample_interval = state->rate_sample_interval,
+ .rx_coalesce_usecs = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS)],
+ .rx_max_coalesced_frames = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES)],
+ .rx_coalesce_usecs_irq = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ)],
+ .rx_max_coalesced_frames_irq = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ)],
+ .tx_coalesce_usecs = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS)],
+ .tx_max_coalesced_frames = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES)],
+ .tx_coalesce_usecs_irq = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ)],
+ .tx_max_coalesced_frames_irq = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ)],
+ .stats_block_coalesce_usecs = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS)],
+ .use_adaptive_rx_coalesce = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX)],
+ .use_adaptive_tx_coalesce = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)],
+ .pkt_rate_low = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW)],
+ .rx_coalesce_usecs_low = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW)],
+ .rx_max_coalesced_frames_low = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW)],
+ .tx_coalesce_usecs_low = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW)],
+ .tx_max_coalesced_frames_low = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW)],
+ .pkt_rate_high = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH)],
+ .rx_coalesce_usecs_high = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH)],
+ .rx_max_coalesced_frames_high = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH)],
+ .tx_coalesce_usecs_high = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH)],
+ .tx_max_coalesced_frames_high = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH)],
+ .rate_sample_interval = coalesce->s[_NM_ETHTOOL_ID_COALESCE_AS_IDX (NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL)],
};
success = (_ethtool_call_handle (shandle,
diff --git a/src/platform/nm-platform-utils.h b/src/platform/nm-platform-utils.h
index 242b97f168..062c859756 100644
--- a/src/platform/nm-platform-utils.h
+++ b/src/platform/nm-platform-utils.h
@@ -93,28 +93,7 @@ gboolean nmp_utils_ethtool_set_features (int ifindex,
gboolean do_set /* or reset */);
struct _NMEthtoolCoalesceState {
- guint32 rx_coalesce_usecs;
- guint32 rx_max_coalesced_frames;
- guint32 rx_coalesce_usecs_irq;
- guint32 rx_max_coalesced_frames_irq;
- guint32 tx_coalesce_usecs;
- guint32 tx_max_coalesced_frames;
- guint32 tx_coalesce_usecs_irq;
- guint32 tx_max_coalesced_frames_irq;
- guint32 stats_block_coalesce_usecs;
- guint32 use_adaptive_rx_coalesce;
- guint32 use_adaptive_tx_coalesce;
- guint32 pkt_rate_low;
- guint32 rx_coalesce_usecs_low;
- guint32 rx_max_coalesced_frames_low;
- guint32 tx_coalesce_usecs_low;
- guint32 tx_max_coalesced_frames_low;
- guint32 pkt_rate_high;
- guint32 rx_coalesce_usecs_high;
- guint32 rx_max_coalesced_frames_high;
- guint32 tx_coalesce_usecs_high;
- guint32 tx_max_coalesced_frames_high;
- guint32 rate_sample_interval;
+ guint32 s[_NM_ETHTOOL_ID_COALESCE_NUM /* indexed by (NMEthtoolID - _NM_ETHTOOL_ID_COALESCE_FIRST) */];
};
gboolean nmp_utils_ethtool_get_coalesce (int ifindex,
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index 596f08542e..8d826a109f 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -3228,95 +3228,6 @@ nm_platform_ethtool_get_link_coalesce (NMPlatform *self,
}
gboolean
-nm_platform_ethtool_init_coalesce (NMPlatform *self,
- NMEthtoolCoalesceState *coalesce,
- const char *option_name,
- guint32 value)
-{
- NMEthtoolID ethtool_id;
-
- g_return_val_if_fail (coalesce, FALSE);
- g_return_val_if_fail (option_name, FALSE);
-
- ethtool_id = nm_ethtool_id_get_by_name (option_name);
-
- g_return_val_if_fail (nm_ethtool_id_is_coalesce (ethtool_id), FALSE);
-
- switch (ethtool_id) {
- case NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX:
- coalesce->use_adaptive_rx_coalesce = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX:
- coalesce->use_adaptive_tx_coalesce = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH:
- coalesce->pkt_rate_high = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW:
- coalesce->pkt_rate_low = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_FRAMES:
- coalesce->rx_max_coalesced_frames = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH:
- coalesce->rx_max_coalesced_frames_high = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ:
- coalesce->rx_max_coalesced_frames_irq = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW:
- coalesce->rx_max_coalesced_frames_low = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_USECS:
- coalesce->rx_coalesce_usecs = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH:
- coalesce->rx_coalesce_usecs_high = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ:
- coalesce->rx_coalesce_usecs_irq = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW:
- coalesce->rx_coalesce_usecs_low = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL:
- coalesce->rate_sample_interval = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS:
- coalesce->stats_block_coalesce_usecs = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_FRAMES:
- coalesce->tx_max_coalesced_frames = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH:
- coalesce->tx_max_coalesced_frames_high = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ:
- coalesce->tx_max_coalesced_frames_irq = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW:
- coalesce->tx_max_coalesced_frames_low = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_USECS:
- coalesce->tx_coalesce_usecs = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH:
- coalesce->tx_coalesce_usecs_high = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ:
- coalesce->tx_coalesce_usecs_irq = value;
- break;
- case NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW:
- coalesce->tx_coalesce_usecs_low = value;
- break;
- default:
- g_return_val_if_reached (FALSE);
- }
-
- return TRUE;
-}
-
-gboolean
nm_platform_ethtool_set_coalesce (NMPlatform *self,
int ifindex,
const NMEthtoolCoalesceState *coalesce)
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 8957de429c..c21190e803 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -1960,11 +1960,6 @@ gboolean nm_platform_ethtool_get_link_coalesce (NMPlatform *self,
int ifindex,
NMEthtoolCoalesceState *coalesce);
-gboolean nm_platform_ethtool_init_coalesce (NMPlatform *self,
- NMEthtoolCoalesceState *coalesce,
- const char *option_name,
- guint32 value);
-
gboolean nm_platform_ethtool_set_coalesce (NMPlatform *self,
int ifindex,
const NMEthtoolCoalesceState *coalesce);
diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
index 7398d2ee27..d7285c836a 100644
--- a/src/platform/tests/test-link.c
+++ b/src/platform/tests/test-link.c
@@ -3290,14 +3290,14 @@ test_ethtool_features_get (void)
g_ptr_array_add (gfree_keeper, requested);
if (i_run == 0) {
- requested[NM_ETHTOOL_ID_FEATURE_RX - _NM_ETHTOOL_ID_FEATURE_FIRST] = NM_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TSO - _NM_ETHTOOL_ID_FEATURE_FIRST] = NM_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION - _NM_ETHTOOL_ID_FEATURE_FIRST] = NM_TERNARY_FALSE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (NM_ETHTOOL_ID_FEATURE_RX)] = NM_TERNARY_FALSE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (NM_ETHTOOL_ID_FEATURE_TSO)] = NM_TERNARY_FALSE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION)] = NM_TERNARY_FALSE;
} else if (i_run == 1)
do_set = FALSE;
else if (i_run == 2) {
- requested[NM_ETHTOOL_ID_FEATURE_TSO - _NM_ETHTOOL_ID_FEATURE_FIRST] = NM_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION - _NM_ETHTOOL_ID_FEATURE_FIRST] = NM_TERNARY_TRUE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (NM_ETHTOOL_ID_FEATURE_TSO)] = NM_TERNARY_FALSE;
+ requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX (NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION)] = NM_TERNARY_TRUE;
} else if (i_run == 3)
do_set = FALSE;
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index b0befd88da..80be40e785 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -4406,42 +4406,34 @@ parse_ethtool_option (const char *value,
/* skip ethtool type && interface name */
w_iter = &words[2];
- if (ethtool_type == NM_ETHTOOL_TYPE_FEATURE) {
- while (w_iter && *w_iter) {
+ while (w_iter && *w_iter) {
+ if (ethtool_type == NM_ETHTOOL_TYPE_FEATURE) {
w_iter = _next_ethtool_options_nmternary (w_iter,
ethtool_type,
&ifcfg_option);
- if (ifcfg_option.has_value)
- nm_setting_ethtool_set_feature (*out_s_ethtool,
- ifcfg_option.optname,
- ifcfg_option.v.nmternary);
+ if (ifcfg_option.has_value) {
+ nm_setting_option_set_boolean (NM_SETTING (*out_s_ethtool),
+ ifcfg_option.optname,
+ ifcfg_option.v.nmternary != NM_TERNARY_FALSE);
+ }
}
- return;
- }
- if (NM_IN_SET (ethtool_type,
- NM_ETHTOOL_TYPE_COALESCE,
- NM_ETHTOOL_TYPE_RING)) {
- while (w_iter && *w_iter) {
+ if (NM_IN_SET (ethtool_type,
+ NM_ETHTOOL_TYPE_COALESCE,
+ NM_ETHTOOL_TYPE_RING)) {
w_iter = _next_ethtool_options_uint32 (w_iter,
ethtool_type,
&ifcfg_option);
if (ifcfg_option.has_value) {
- if (ethtool_type == NM_ETHTOOL_TYPE_COALESCE)
- nm_setting_ethtool_set_coalesce (*out_s_ethtool,
- ifcfg_option.optname,
- ifcfg_option.v.u32);
- else
- nm_setting_ethtool_set_ring (*out_s_ethtool,
- ifcfg_option.optname,
- ifcfg_option.v.u32);
+ nm_setting_option_set_uint32 (NM_SETTING (*out_s_ethtool),
+ ifcfg_option.optname,
+ ifcfg_option.v.u32);
}
}
- return;
}
- /* unsupported ethtool type */
- nm_assert_not_reached();
+
+ return;
}
/* /sbin/ethtool -s ${REALDEVICE} $opts */
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
index aaa330685d..f116ace7b4 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
@@ -1079,6 +1079,27 @@ write_wired_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
return TRUE;
}
+static void
+_ethtool_gstring_prepare (GString **str,
+ gboolean *is_first,
+ char cmdline_flag,
+ const char *iface)
+{
+ if (!*is_first) {
+ nm_assert (*str && (*str)->len > 0);
+ return;
+ }
+
+ if (!*str)
+ *str = g_string_sized_new (30);
+ else {
+ nm_assert ((*str)->len > 0);
+ g_string_append (*str, " ; ");
+ }
+ g_string_append_printf (*str, "-%c %s", cmdline_flag, iface);
+ *is_first = FALSE;
+}
+
static gboolean
write_ethtool_setting (NMConnection *connection, shvarFile *ifcfg, GError **error)
{
@@ -1160,7 +1181,10 @@ write_ethtool_setting (NMConnection *connection, shvarFile *ifcfg, GError **erro
if (s_ethtool) {
NMEthtoolID ethtool_id;
NMSettingConnection *s_con;
- const char *iface = NULL;
+ const char *iface;
+ gboolean is_first;
+ guint32 u32;
+ gboolean b;
s_con = nm_connection_get_setting_connection (connection);
if (s_con) {
@@ -1172,62 +1196,45 @@ write_ethtool_setting (NMConnection *connection, shvarFile *ifcfg, GError **erro
|| (ch >= '0' && ch <= '9')
|| NM_IN_SET (ch, '_'))))
iface = NULL;
- }
-
- if (!str)
- str = g_string_sized_new (30);
- else
- g_string_append (str, " ; ");
- g_string_append (str, "-K ");
- g_string_append (str, iface ?: "net0");
+ } else
+ iface = NULL;
+ if (!iface)
+ iface = "net0";
+ is_first = TRUE;
for (ethtool_id = _NM_ETHTOOL_ID_FEATURE_FIRST; ethtool_id <= _NM_ETHTOOL_ID_FEATURE_LAST; ethtool_id++) {
- const NMEthtoolData *ed = nm_ethtool_data[ethtool_id];
- NMTernary val;
-
nm_assert (nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
-
- val = nm_setting_ethtool_get_feature (s_ethtool, ed->optname);
- if (val == NM_TERNARY_DEFAULT)
+ if (!nm_setting_option_get_boolean (NM_SETTING (s_ethtool), nm_ethtool_data[ethtool_id]->optname, &b))
continue;
+ _ethtool_gstring_prepare (&str, &is_first, 'K', iface);
g_string_append_c (str, ' ');
g_string_append (str, nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
- g_string_append (str, val == NM_TERNARY_TRUE ? " on" : " off");
+ g_string_append (str, b ? " on" : " off");
}
- g_string_append (str, " ; -C ");
- g_string_append (str, iface ?: "net0");
-
+ is_first = TRUE;
for (ethtool_id = _NM_ETHTOOL_ID_COALESCE_FIRST; ethtool_id <= _NM_ETHTOOL_ID_COALESCE_LAST; ethtool_id++) {
- const NMEthtoolData *ed = nm_ethtool_data[ethtool_id];
- guint32 val;
-
nm_assert (nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
-
- if (!nm_setting_ethtool_get_coalesce (s_ethtool, ed->optname, &val))
+ if (!nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), nm_ethtool_data[ethtool_id]->optname, &u32))
continue;
+ _ethtool_gstring_prepare (&str, &is_first, 'C', iface);
g_string_append_c (str, ' ');
g_string_append (str, nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
- g_string_append_printf (str, " %"G_GUINT32_FORMAT, val);
+ g_string_append_printf (str, " %"G_GUINT32_FORMAT, u32);
}
- g_string_append (str, " ; -G ");
- g_string_append (str, iface ?: "net0");
-
+ is_first = TRUE;
for (ethtool_id = _NM_ETHTOOL_ID_RING_FIRST; ethtool_id <= _NM_ETHTOOL_ID_RING_LAST; ethtool_id++) {
- const NMEthtoolData *ed = nm_ethtool_data[ethtool_id];
- guint32 val;
-
nm_assert (nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
-
- if (!nm_setting_ethtool_get_ring (s_ethtool, ed->optname, &val))
+ if (!nm_setting_option_get_uint32 (NM_SETTING (s_ethtool), nm_ethtool_data[ethtool_id]->optname, &u32))
continue;
+ _ethtool_gstring_prepare (&str, &is_first, 'G', iface);
g_string_append_c (str, ' ');
g_string_append (str, nms_ifcfg_rh_utils_get_ethtool_name (ethtool_id));
- g_string_append_printf (str, " %"G_GUINT32_FORMAT, val);
+ g_string_append_printf (str, " %"G_GUINT32_FORMAT, u32);
}
}
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
index 644fa06754..426085765c 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test_write_wired_auto_negotiate_on.cexpected
@@ -1,7 +1,7 @@
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
-ETHTOOL_OPTS="autoneg on ; -K net0 rxvlan off tx on ; -C net0 ; -G net0"
+ETHTOOL_OPTS="autoneg on ; -K net0 rxvlan off tx on"
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no