summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cardace <acardace@redhat.com>2020-05-07 17:04:56 +0200
committerAntonio Cardace <acardace@redhat.com>2020-05-13 10:15:23 +0200
commit56c48b162bf72cf478922f82ed3796a9826f6b1e (patch)
tree2aac656c3a996e6a9a33ebfcfd523dce09204f20
parent4fce8b3efbd633d6fd99f96e468818f7a7ddd02f (diff)
downloadNetworkManager-56c48b162bf72cf478922f82ed3796a9826f6b1e.tar.gz
clients: add support for ethtool coalesce settings
https://bugzilla.redhat.com/show_bug.cgi?id=1614700
-rw-r--r--clients/common/nm-meta-setting-desc.c145
1 files changed, 107 insertions, 38 deletions
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 2df48493de..272c089d98 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -4097,61 +4097,104 @@ _gobject_enum_pre_set_notify_fcn_wireless_security_wep_key_type (const NMMetaPro
static gconstpointer
_get_fcn_ethtool (ARGS_GET_FCN)
{
- const char *s;
- NMTernary val;
+ char *return_str;
+ guint32 u32;
NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
RETURN_UNSUPPORTED_GET_TYPE ();
- val = nm_setting_ethtool_get_feature (NM_SETTING_ETHTOOL (setting),
- nm_ethtool_data[ethtool_id]->optname);
+ 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)) {
+ NM_SET_OUT (out_is_default, TRUE);
+ return NULL;
+ }
- 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 = 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;
- if (s && get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
- s = gettext (s);
- return s;
+ 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);
+ }
+
+ if (s && get_type == NM_META_ACCESSOR_GET_TYPE_PRETTY)
+ s = gettext (s);
+ return s;
+ }
+ nm_assert_not_reached();
+ return NULL;
}
static gboolean
_set_fcn_ethtool (ARGS_SET_FCN)
{
- gs_free char *value_to_free = NULL;
- NMTernary val;
+ gint64 i64;
NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
- if (_SET_FCN_DO_RESET_DEFAULT (property_info, modifier, value)) {
- val = NM_TERNARY_DEFAULT;
- goto set;
- }
+ if (nm_ethtool_id_is_coalesce (ethtool_id)) {
+ i64 = _nm_utils_ascii_str_to_int64 (value, 10, 0, G_MAXUINT32, -1);
- value = nm_strstrip_avoid_copy_a (300, value, &value_to_free);
+ 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"]"),
+ value, 0, G_MAXUINT32);
+ return FALSE;
+ }
- 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_setting_ethtool_set_coalesce (NM_SETTING_ETHTOOL (setting),
+ nm_ethtool_data[ethtool_id]->optname,
+ (guint32) i64);
+ return TRUE;
}
+ if (nm_ethtool_id_is_feature (ethtool_id)) {
+ 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;
+ }
+
set:
- nm_setting_ethtool_set_feature (NM_SETTING_ETHTOOL (setting),
+ nm_setting_ethtool_set_feature (NM_SETTING_ETHTOOL (setting),
nm_ethtool_data[ethtool_id]->optname,
val);
- return TRUE;
+ return TRUE;
+ }
+
+ nm_assert_not_reached();
+
+ g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_SETTING_MISSING,
+ _("ethtool property not supported"));
+ return FALSE;
}
static const char *const*
@@ -4170,10 +4213,14 @@ _complete_fcn_ethtool (ARGS_COMPLETE_FCN)
"ignore",
NULL,
};
+ NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
- if (!text || !text[0])
- return &v[7];
- return v;
+ if (nm_ethtool_id_is_feature (ethtool_id)) {
+ if (!text || !text[0])
+ return &v[7];
+ return v;
+ }
+ return NULL;
}
/*****************************************************************************/
@@ -5431,6 +5478,28 @@ static const NMMetaPropertyInfo *const property_infos_ETHTOOL[] = {
PROPERTY_INFO_ETHTOOL (FEATURE_TX_UDP_TNL_CSUM_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_UDP_TNL_SEGMENTATION),
PROPERTY_INFO_ETHTOOL (FEATURE_TX_VLAN_STAG_HW_INSERT),
+ PROPERTY_INFO_ETHTOOL (COALESCE_ADAPTIVE_RX),
+ PROPERTY_INFO_ETHTOOL (COALESCE_ADAPTIVE_TX),
+ PROPERTY_INFO_ETHTOOL (COALESCE_PKT_RATE_HIGH),
+ PROPERTY_INFO_ETHTOOL (COALESCE_PKT_RATE_LOW),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_FRAMES),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_FRAMES_IRQ),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_FRAMES_HIGH),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_FRAMES_LOW),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_USECS),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_USECS_IRQ),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_USECS_HIGH),
+ PROPERTY_INFO_ETHTOOL (COALESCE_RX_USECS_LOW),
+ PROPERTY_INFO_ETHTOOL (COALESCE_SAMPLE_INTERVAL),
+ PROPERTY_INFO_ETHTOOL (COALESCE_STATS_BLOCK_USECS),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_FRAMES),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_FRAMES_IRQ),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_FRAMES_HIGH),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_FRAMES_LOW),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_USECS),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_USECS_IRQ),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_USECS_HIGH),
+ PROPERTY_INFO_ETHTOOL (COALESCE_TX_USECS_LOW),
NULL,
};