summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cardace <acardace@redhat.com>2020-05-07 16:58:32 +0200
committerAntonio Cardace <acardace@redhat.com>2020-05-13 10:15:23 +0200
commitb0240db06883157636c0efb364c9fad0066dafa4 (patch)
treeaa8a7cd36f8289b1480ee21895613fe52a375821
parent858fb211ad11bd9a7e89f63fe62d4fa7f8cee7b1 (diff)
downloadNetworkManager-b0240db06883157636c0efb364c9fad0066dafa4.tar.gz
ethtool: add coalesce settings
This is the initial support for coalesce settings and only allows getting/setting, nothing is yet implemented in nm-device. Also add unit test. https://bugzilla.redhat.com/show_bug.cgi?id=1614700
-rw-r--r--libnm-core/nm-setting-ethtool.c186
-rw-r--r--libnm-core/nm-setting-ethtool.h43
-rw-r--r--libnm-core/tests/test-setting.c85
-rw-r--r--libnm/libnm.ver5
-rw-r--r--shared/nm-libnm-core-intern/nm-ethtool-utils.c44
-rw-r--r--shared/nm-libnm-core-intern/nm-ethtool-utils.h36
-rw-r--r--src/platform/tests/test-link.c10
7 files changed, 392 insertions, 17 deletions
diff --git a/libnm-core/nm-setting-ethtool.c b/libnm-core/nm-setting-ethtool.c
index a8976b69f5..6dc6d5d75a 100644
--- a/libnm-core/nm-setting-ethtool.c
+++ b/libnm-core/nm-setting-ethtool.c
@@ -42,6 +42,22 @@ nm_ethtool_optname_is_feature (const char *optname)
return optname && nm_ethtool_id_is_feature (nm_ethtool_id_get_by_name (optname));
}
+/**
+ * nm_ethtool_optname_is_coalesce:
+ * @optname: (allow-none): the option name to check
+ *
+ * Checks whether @optname is a valid option name for a coalesce setting.
+ *
+ * %Returns: %TRUE, if @optname is valid
+ *
+ * Since: 1.26
+ */
+gboolean
+nm_ethtool_optname_is_coalesce (const char *optname)
+{
+ return optname && nm_ethtool_id_is_coalesce (nm_ethtool_id_get_by_name (optname));
+}
+
/*****************************************************************************/
/**
@@ -239,6 +255,143 @@ nm_setting_ethtool_init_features (NMSettingEthtool *setting,
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)
+{
+ GVariant *v;
+
+ g_return_val_if_fail (NM_IS_SETTING_ETHTOOL (setting), FALSE);
+ g_return_val_if_fail (nm_ethtool_optname_is_coalesce (optname), FALSE);
+
+ v = nm_setting_gendata_get (NM_SETTING (setting), optname);
+ if ( v
+ && g_variant_is_of_type (v, G_VARIANT_TYPE_UINT32)) {
+ NM_SET_OUT (out_value, g_variant_get_uint32 (v));
+ return TRUE;
+ }
+ NM_SET_OUT (out_value, 0);
+ return FALSE;
+}
+
+/**
+ * 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)
+{
+ GHashTable *ht;
+ 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));
+
+ ht = _nm_setting_gendata_hash (NM_SETTING (setting),
+ TRUE);
+
+ if (NM_IN_SET (ethtool_id,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX))
+ value = !!value;
+
+ g_hash_table_insert (ht,
+ g_strdup (optname),
+ g_variant_ref_sink (g_variant_new_uint32 (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)
+{
+ GHashTable *hash;
+
+ g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
+ g_return_if_fail (nm_str_not_empty (optname));
+
+ hash = _nm_setting_gendata_hash (NM_SETTING (setting), FALSE);
+ if (!hash)
+ return;
+
+ if (g_hash_table_remove (hash, 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)
+{
+ GHashTable *hash;
+ GHashTableIter iter;
+ const char *name;
+ gboolean changed = FALSE;
+
+ g_return_if_fail (NM_IS_SETTING_ETHTOOL (setting));
+
+ hash = _nm_setting_gendata_hash (NM_SETTING (setting), FALSE);
+ if (!hash)
+ return;
+
+ g_hash_table_iter_init (&iter, hash);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL)) {
+ if (nm_ethtool_optname_is_coalesce (name)) {
+ g_hash_table_iter_remove (&iter);
+ changed = TRUE;
+ }
+ }
+
+ if (changed)
+ _notify_attributes (setting);
+}
+
/*****************************************************************************/
/**
@@ -284,19 +437,29 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
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)) {
- g_set_error_literal (error,
- NM_CONNECTION_ERROR,
- NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("unsupported offload feature"));
- g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
- return FALSE;
- }
- if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN)) {
+ 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)) {
+ if (!g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32)) {
+ g_set_error_literal (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("coalesce setting has invalid variant type"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
+ return FALSE;
+ }
+ } else {
g_set_error_literal (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
- _("offload feature has invalid variant type"));
+ _("unsupported ethtool setting"));
g_prefix_error (error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
return FALSE;
}
@@ -316,6 +479,9 @@ get_variant_type (const NMSettInfoSetting *sett_info,
if (nm_ethtool_optname_is_feature (name))
return G_VARIANT_TYPE_BOOLEAN;
+ if (nm_ethtool_optname_is_coalesce (name))
+ return G_VARIANT_TYPE_UINT32;
+
g_set_error (error,
NM_CONNECTION_ERROR,
NM_CONNECTION_ERROR_INVALID_PROPERTY,
diff --git a/libnm-core/nm-setting-ethtool.h b/libnm-core/nm-setting-ethtool.h
index ba8c6a6e7e..a62a33159c 100644
--- a/libnm-core/nm-setting-ethtool.h
+++ b/libnm-core/nm-setting-ethtool.h
@@ -69,9 +69,35 @@ G_BEGIN_DECLS
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_UDP_TNL_SEGMENTATION "feature-tx-udp_tnl-segmentation"
#define NM_ETHTOOL_OPTNAME_FEATURE_TX_VLAN_STAG_HW_INSERT "feature-tx-vlan-stag-hw-insert"
+#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_RX "coalesce-adaptive-rx"
+#define NM_ETHTOOL_OPTNAME_COALESCE_ADAPTIVE_TX "coalesce-adaptive-tx"
+#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_HIGH "coalesce-pkt-rate-high"
+#define NM_ETHTOOL_OPTNAME_COALESCE_PKT_RATE_LOW "coalesce-pkt-rate-low"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES "coalesce-rx-frames"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_HIGH "coalesce-rx-frames-high"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_IRQ "coalesce-rx-frames-irq"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES_LOW "coalesce-rx-frames-low"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS "coalesce-rx-usecs"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_HIGH "coalesce-rx-usecs-high"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_IRQ "coalesce-rx-usecs-irq"
+#define NM_ETHTOOL_OPTNAME_COALESCE_RX_USECS_LOW "coalesce-rx-usecs-low"
+#define NM_ETHTOOL_OPTNAME_COALESCE_SAMPLE_INTERVAL "coalesce-sample-interval"
+#define NM_ETHTOOL_OPTNAME_COALESCE_STATS_BLOCK_USECS "coalesce-stats-block-usecs"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES "coalesce-tx-frames"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_HIGH "coalesce-tx-frames-high"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_IRQ "coalesce-tx-frames-irq"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_FRAMES_LOW "coalesce-tx-frames-low"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS "coalesce-tx-usecs"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_HIGH "coalesce-tx-usecs-high"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_IRQ "coalesce-tx-usecs-irq"
+#define NM_ETHTOOL_OPTNAME_COALESCE_TX_USECS_LOW "coalesce-tx-usecs-low"
+
NM_AVAILABLE_IN_1_20
gboolean nm_ethtool_optname_is_feature (const char *optname);
+NM_AVAILABLE_IN_1_26
+gboolean nm_ethtool_optname_is_coalesce (const char *optname);
+
/*****************************************************************************/
#define NM_TYPE_SETTING_ETHTOOL (nm_setting_ethtool_get_type ())
@@ -109,6 +135,23 @@ 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);
+
G_END_DECLS
#endif /* __NM_SETTING_ETHTOOL_H__ */
diff --git a/libnm-core/tests/test-setting.c b/libnm-core/tests/test-setting.c
index f77ba9fd17..1e82e245f9 100644
--- a/libnm-core/tests/test-setting.c
+++ b/libnm-core/tests/test-setting.c
@@ -1571,6 +1571,90 @@ test_ethtool_1 (void)
g_assert_cmpint (nm_setting_ethtool_get_feature (s_ethtool3, NM_ETHTOOL_OPTNAME_FEATURE_SG), ==, NM_TERNARY_DEFAULT);
}
+static void
+test_ethtool_coalesce (void)
+{
+ gs_unref_object NMConnection *con = NULL;
+ gs_unref_object NMConnection *con2 = NULL;
+ gs_unref_object NMConnection *con3 = NULL;
+ gs_unref_variant GVariant *variant = NULL;
+ gs_free_error GError *error = NULL;
+ gs_unref_keyfile GKeyFile *keyfile = NULL;
+ NMSettingConnection *s_con;
+ NMSettingEthtool *s_ethtool;
+ NMSettingEthtool *s_ethtool2;
+ NMSettingEthtool *s_ethtool3;
+ guint32 out_value;
+
+ con = nmtst_create_minimal_connection ("ethtool-coalesce",
+ NULL,
+ NM_SETTING_WIRED_SETTING_NAME,
+ &s_con);
+ 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);
+
+ g_assert_true (nm_setting_ethtool_get_coalesce (s_ethtool, NM_ETHTOOL_OPTNAME_COALESCE_RX_FRAMES, &out_value));
+ g_assert_cmpuint (out_value, ==, 4);
+
+ nmtst_connection_normalize (con);
+
+ variant = nm_connection_to_dbus (con, NM_CONNECTION_SERIALIZE_ALL);
+
+ con2 = nm_simple_connection_new_from_dbus (variant, &error);
+ nmtst_assert_success (con2, error);
+
+ 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);
+
+ nmtst_assert_connection_verifies_without_normalization (con2);
+
+ nmtst_assert_connection_equals (con, FALSE, con2, FALSE);
+
+ keyfile = nm_keyfile_write (con, NULL, NULL, &error);
+ nmtst_assert_success (keyfile, error);
+
+ con3 = nm_keyfile_read (keyfile,
+ "/ignored/current/working/directory/for/loading/relative/paths",
+ NULL,
+ NULL,
+ &error);
+ nmtst_assert_success (con3, error);
+
+ nm_keyfile_read_ensure_id (con3, "unused-because-already-has-id");
+ nm_keyfile_read_ensure_uuid (con3, "unused-because-already-has-uuid");
+
+ nmtst_connection_normalize (con3);
+
+ nmtst_assert_connection_equals (con, FALSE, con3, FALSE);
+
+ 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);
+
+
+ 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_ethtool_set_coalesce (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);
+
+ 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));
+}
+
/*****************************************************************************/
static void
@@ -3771,6 +3855,7 @@ main (int argc, char **argv)
g_test_add_func ("/libnm/settings/dcb/bandwidth-sums", test_dcb_bandwidth_sums);
g_test_add_func ("/libnm/settings/ethtool/1", test_ethtool_1);
+ g_test_add_func ("/libnm/settings/ethtool/coalesce", test_ethtool_coalesce);
g_test_add_func ("/libnm/settings/sriov/vf", test_sriov_vf);
g_test_add_func ("/libnm/settings/sriov/vf-dup", test_sriov_vf_dup);
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index 59e7db4ff1..e8203f5b6e 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1698,6 +1698,7 @@ global:
libnm_1_26_0 {
global:
+ nm_ethtool_optname_is_coalesce;
nm_setting_bridge_get_multicast_hash_max;
nm_setting_bridge_get_multicast_last_member_count;
nm_setting_bridge_get_multicast_last_member_interval;
@@ -1708,6 +1709,10 @@ 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_get_coalesce;
+ nm_setting_ethtool_set_coalesce;
nm_setting_match_add_driver;
nm_setting_match_add_kernel_command_line;
nm_setting_match_clear_drivers;
diff --git a/shared/nm-libnm-core-intern/nm-ethtool-utils.c b/shared/nm-libnm-core-intern/nm-ethtool-utils.c
index ace47680f5..3842e3122e 100644
--- a/shared/nm-libnm-core-intern/nm-ethtool-utils.c
+++ b/shared/nm-libnm-core-intern/nm-ethtool-utils.c
@@ -19,6 +19,28 @@
const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1] = {
/* indexed by NMEthtoolID */
+ ETHT_DATA (COALESCE_ADAPTIVE_RX),
+ ETHT_DATA (COALESCE_ADAPTIVE_TX),
+ ETHT_DATA (COALESCE_PKT_RATE_HIGH),
+ ETHT_DATA (COALESCE_PKT_RATE_LOW),
+ ETHT_DATA (COALESCE_RX_FRAMES),
+ ETHT_DATA (COALESCE_RX_FRAMES_HIGH),
+ ETHT_DATA (COALESCE_RX_FRAMES_IRQ),
+ ETHT_DATA (COALESCE_RX_FRAMES_LOW),
+ ETHT_DATA (COALESCE_RX_USECS),
+ ETHT_DATA (COALESCE_RX_USECS_HIGH),
+ ETHT_DATA (COALESCE_RX_USECS_IRQ),
+ ETHT_DATA (COALESCE_RX_USECS_LOW),
+ ETHT_DATA (COALESCE_SAMPLE_INTERVAL),
+ ETHT_DATA (COALESCE_STATS_BLOCK_USECS),
+ ETHT_DATA (COALESCE_TX_FRAMES),
+ ETHT_DATA (COALESCE_TX_FRAMES_HIGH),
+ ETHT_DATA (COALESCE_TX_FRAMES_IRQ),
+ ETHT_DATA (COALESCE_TX_FRAMES_LOW),
+ ETHT_DATA (COALESCE_TX_USECS),
+ ETHT_DATA (COALESCE_TX_USECS_HIGH),
+ ETHT_DATA (COALESCE_TX_USECS_IRQ),
+ ETHT_DATA (COALESCE_TX_USECS_LOW),
ETHT_DATA (FEATURE_ESP_HW_OFFLOAD),
ETHT_DATA (FEATURE_ESP_TX_CSUM_HW_OFFLOAD),
ETHT_DATA (FEATURE_FCOE_MTU),
@@ -76,6 +98,28 @@ const NMEthtoolData *const nm_ethtool_data[_NM_ETHTOOL_ID_NUM + 1] = {
static const guint8 _by_name[_NM_ETHTOOL_ID_NUM] = {
/* sorted by optname. */
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX,
+ NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH,
+ NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW,
+ NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL,
+ NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW,
NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_FCOE_MTU,
diff --git a/shared/nm-libnm-core-intern/nm-ethtool-utils.h b/shared/nm-libnm-core-intern/nm-ethtool-utils.h
index b3413de2b7..0505328364 100644
--- a/shared/nm-libnm-core-intern/nm-ethtool-utils.h
+++ b/shared/nm-libnm-core-intern/nm-ethtool-utils.h
@@ -13,7 +13,32 @@ typedef enum {
_NM_ETHTOOL_ID_FIRST = 0,
- _NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_FIRST,
+ _NM_ETHTOOL_ID_COALESCE_FIRST = _NM_ETHTOOL_ID_FIRST,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX = _NM_ETHTOOL_ID_COALESCE_FIRST,
+ NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX,
+ NM_ETHTOOL_ID_COALESCE_PKT_RATE_HIGH,
+ NM_ETHTOOL_ID_COALESCE_PKT_RATE_LOW,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_HIGH,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_IRQ,
+ NM_ETHTOOL_ID_COALESCE_RX_FRAMES_LOW,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_HIGH,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_IRQ,
+ NM_ETHTOOL_ID_COALESCE_RX_USECS_LOW,
+ NM_ETHTOOL_ID_COALESCE_SAMPLE_INTERVAL,
+ NM_ETHTOOL_ID_COALESCE_STATS_BLOCK_USECS,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_HIGH,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_IRQ,
+ NM_ETHTOOL_ID_COALESCE_TX_FRAMES_LOW,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_HIGH,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_IRQ,
+ NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW,
+ _NM_ETHTOOL_ID_COALESCE_LAST = NM_ETHTOOL_ID_COALESCE_TX_USECS_LOW,
+
+ _NM_ETHTOOL_ID_FEATURE_FIRST = _NM_ETHTOOL_ID_COALESCE_LAST + 1,
NM_ETHTOOL_ID_FEATURE_ESP_HW_OFFLOAD = _NM_ETHTOOL_ID_FEATURE_FIRST,
NM_ETHTOOL_ID_FEATURE_ESP_TX_CSUM_HW_OFFLOAD,
NM_ETHTOOL_ID_FEATURE_FCOE_MTU,
@@ -67,10 +92,11 @@ typedef enum {
NM_ETHTOOL_ID_FEATURE_TX_UDP_TNL_SEGMENTATION,
NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT,
_NM_ETHTOOL_ID_FEATURE_LAST = NM_ETHTOOL_ID_FEATURE_TX_VLAN_STAG_HW_INSERT,
- _NM_ETHTOOL_ID_FEATURE_NUM = (_NM_ETHTOOL_ID_FEATURE_LAST - _NM_ETHTOOL_ID_FEATURE_FIRST + 1),
_NM_ETHTOOL_ID_LAST = _NM_ETHTOOL_ID_FEATURE_LAST,
+ _NM_ETHTOOL_ID_COALESCE_NUM = (_NM_ETHTOOL_ID_COALESCE_LAST - _NM_ETHTOOL_ID_COALESCE_FIRST + 1),
+ _NM_ETHTOOL_ID_FEATURE_NUM = (_NM_ETHTOOL_ID_FEATURE_LAST - _NM_ETHTOOL_ID_FEATURE_FIRST + 1),
_NM_ETHTOOL_ID_NUM = (_NM_ETHTOOL_ID_LAST - _NM_ETHTOOL_ID_FIRST + 1),
} NMEthtoolID;
@@ -100,6 +126,12 @@ nm_ethtool_id_is_feature (NMEthtoolID id)
return id >= _NM_ETHTOOL_ID_FEATURE_FIRST && id <= _NM_ETHTOOL_ID_FEATURE_LAST;
}
+static inline gboolean
+nm_ethtool_id_is_coalesce (NMEthtoolID id)
+{
+ return id >= _NM_ETHTOOL_ID_COALESCE_FIRST && id <= _NM_ETHTOOL_ID_COALESCE_LAST;
+}
+
/****************************************************************************/
#endif /* __NM_ETHTOOL_UTILS_H__ */
diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
index ea4a2c5ab9..7398d2ee27 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_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TSO] = NM_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION] = NM_TERNARY_FALSE;
+ 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;
} else if (i_run == 1)
do_set = FALSE;
else if (i_run == 2) {
- requested[NM_ETHTOOL_ID_FEATURE_TSO] = NM_TERNARY_FALSE;
- requested[NM_ETHTOOL_ID_FEATURE_TX_TCP6_SEGMENTATION] = NM_TERNARY_TRUE;
+ 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;
} else if (i_run == 3)
do_set = FALSE;