|
Packit Service |
dff8e4 |
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
Packit Service |
dff8e4 |
/*
|
|
Packit Service |
dff8e4 |
* Copyright (C) 2018 Red Hat, Inc.
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
#include "libnm-core-impl/nm-default-libnm-core.h"
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
#include "nm-setting-ethtool.h"
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
#include "nm-setting-private.h"
|
|
Packit Service |
dff8e4 |
#include "libnm-base/nm-ethtool-base.h"
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* SECTION:nm-setting-ethtool
|
|
Packit Service |
dff8e4 |
* @short_description: Describes connection properties for ethtool related options
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* The #NMSettingEthtool object is a #NMSetting subclass that describes properties
|
|
Packit Service |
dff8e4 |
* to control network driver and hardware settings.
|
|
Packit Service |
dff8e4 |
**/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
static const GVariantType *
|
|
Packit Service |
dff8e4 |
get_variant_type_from_ethtool_id(NMEthtoolID ethtool_id)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
if (nm_ethtool_id_is_feature(ethtool_id))
|
|
Packit Service |
dff8e4 |
return G_VARIANT_TYPE_BOOLEAN;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (nm_ethtool_id_is_coalesce(ethtool_id) || nm_ethtool_id_is_ring(ethtool_id))
|
|
Packit Service |
dff8e4 |
return G_VARIANT_TYPE_UINT32;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
return NULL;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_ethtool_optname_is_feature:
|
|
Packit Service |
dff8e4 |
* @optname: (allow-none): the option name to check
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Checks whether @optname is a valid option name for an offload feature.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* %Returns: %TRUE, if @optname is valid
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.20
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Note that nm_ethtool_optname_is_feature() was first added to the libnm header files
|
|
Packit Service |
dff8e4 |
* in 1.14.0 but forgot to actually add to the library. This happened belatedly in 1.20.0 and
|
|
Packit Service |
dff8e4 |
* the stable versions 1.18.2, 1.16.4 and 1.14.8 (with linker version "libnm_1_14_8").
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
gboolean
|
|
Packit Service |
dff8e4 |
nm_ethtool_optname_is_feature(const char *optname)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
return optname && nm_ethtool_id_is_feature(nm_ethtool_id_get_by_name(optname));
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_ethtool_optname_is_coalesce:
|
|
Packit Service |
dff8e4 |
* @optname: (allow-none): the option name to check
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Checks whether @optname is a valid option name for a coalesce setting.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* %Returns: %TRUE, if @optname is valid
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.26
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
gboolean
|
|
Packit Service |
dff8e4 |
nm_ethtool_optname_is_coalesce(const char *optname)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
return optname && nm_ethtool_id_is_coalesce(nm_ethtool_id_get_by_name(optname));
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_ethtool_optname_is_ring:
|
|
Packit Service |
dff8e4 |
* @optname: (allow-none): the option name to check
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Checks whether @optname is a valid option name for a ring setting.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* %Returns: %TRUE, if @optname is valid
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.26
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
gboolean
|
|
Packit Service |
dff8e4 |
nm_ethtool_optname_is_ring(const char *optname)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
return optname && nm_ethtool_id_is_ring(nm_ethtool_id_get_by_name(optname));
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* NMSettingEthtool:
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Ethtool Ethernet Settings
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.14
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
struct _NMSettingEthtool {
|
|
Packit Service |
dff8e4 |
NMSetting parent;
|
|
Packit Service |
dff8e4 |
};
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
struct _NMSettingEthtoolClass {
|
|
Packit Service |
dff8e4 |
NMSettingClass parent;
|
|
Packit Service |
dff8e4 |
};
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
G_DEFINE_TYPE(NMSettingEthtool, nm_setting_ethtool, NM_TYPE_SETTING)
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
#define NM_SETTING_ETHTOOL_GET_PRIVATE(self) \
|
|
Packit Service |
dff8e4 |
_NM_GET_PRIVATE(self, NMSettingEthtool, NM_IS_SETTING_ETHTOOL, NMSetting)
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_setting_ethtool_get_feature:
|
|
Packit Service |
dff8e4 |
* @setting: the #NMSettingEthtool
|
|
Packit Service |
dff8e4 |
* @optname: option name of the offload feature to get
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Gets and offload feature setting. Returns %NM_TERNARY_DEFAULT if the
|
|
Packit Service |
dff8e4 |
* feature is not set.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Note that @optname must be a valid name for a feature, according to
|
|
Packit Service |
dff8e4 |
* nm_ethtool_optname_is_feature().
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Returns: a #NMTernary value indicating whether the offload feature
|
|
Packit Service |
dff8e4 |
* is enabled, disabled, or left untouched.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.14
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Deprecated: 1.26: use nm_setting_option_get_boolean() instead.
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
NMTernary
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_get_feature(NMSettingEthtool *setting, const char *optname)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
gboolean v;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
g_return_val_if_fail(NM_IS_SETTING_ETHTOOL(setting), NM_TERNARY_DEFAULT);
|
|
Packit Service |
dff8e4 |
g_return_val_if_fail(optname && nm_ethtool_optname_is_feature(optname), NM_TERNARY_DEFAULT);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (!nm_setting_option_get_boolean(NM_SETTING(setting), optname, &v))
|
|
Packit Service |
dff8e4 |
return NM_TERNARY_DEFAULT;
|
|
Packit Service |
dff8e4 |
return v ? NM_TERNARY_TRUE : NM_TERNARY_FALSE;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_setting_ethtool_set_feature:
|
|
Packit Service |
dff8e4 |
* @setting: the #NMSettingEthtool
|
|
Packit Service |
dff8e4 |
* @optname: option name of the offload feature to get
|
|
Packit Service |
dff8e4 |
* @value: the new value to set. The special value %NM_TERNARY_DEFAULT
|
|
Packit Service |
dff8e4 |
* means to clear the offload feature setting.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Sets and offload feature setting.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Note that @optname must be a valid name for a feature, according to
|
|
Packit Service |
dff8e4 |
* nm_ethtool_optname_is_feature().
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.14
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Deprecated: 1.26: use nm_setting_option_set() or nm_setting_option_set_boolean() instead.
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
void
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_set_feature(NMSettingEthtool *setting, const char *optname, NMTernary value)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
g_return_if_fail(NM_IS_SETTING_ETHTOOL(setting));
|
|
Packit Service |
dff8e4 |
g_return_if_fail(optname && nm_ethtool_optname_is_feature(optname));
|
|
Packit Service |
dff8e4 |
g_return_if_fail(NM_IN_SET(value, NM_TERNARY_DEFAULT, NM_TERNARY_FALSE, NM_TERNARY_TRUE));
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (value == NM_TERNARY_DEFAULT)
|
|
Packit Service |
dff8e4 |
nm_setting_option_set(NM_SETTING(setting), optname, NULL);
|
|
Packit Service |
dff8e4 |
else
|
|
Packit Service |
dff8e4 |
nm_setting_option_set_boolean(NM_SETTING(setting), optname, (value != NM_TERNARY_FALSE));
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_setting_ethtool_clear_features:
|
|
Packit Service |
dff8e4 |
* @setting: the #NMSettingEthtool
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Clears all offload features settings
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.14
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Deprecated: 1.26: use nm_setting_option_clear_by_name() with nm_ethtool_optname_is_feature() predicate instead.
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
void
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_clear_features(NMSettingEthtool *setting)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
g_return_if_fail(NM_IS_SETTING_ETHTOOL(setting));
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
nm_setting_option_clear_by_name(NM_SETTING(setting), nm_ethtool_optname_is_feature);
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
guint
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_init_features(
|
|
Packit Service |
dff8e4 |
NMSettingEthtool *setting,
|
|
Packit Service |
dff8e4 |
NMOptionBool * requested /* indexed by NMEthtoolID - _NM_ETHTOOL_ID_FEATURE_FIRST */)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
GHashTable * hash;
|
|
Packit Service |
dff8e4 |
GHashTableIter iter;
|
|
Packit Service |
dff8e4 |
guint i;
|
|
Packit Service |
dff8e4 |
guint n_req = 0;
|
|
Packit Service |
dff8e4 |
const char * name;
|
|
Packit Service |
dff8e4 |
GVariant * variant;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
nm_assert(NM_IS_SETTING_ETHTOOL(setting));
|
|
Packit Service |
dff8e4 |
nm_assert(requested);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
for (i = 0; i < _NM_ETHTOOL_ID_FEATURE_NUM; i++)
|
|
Packit Service |
dff8e4 |
requested[i] = NM_OPTION_BOOL_DEFAULT;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
hash = _nm_setting_option_hash(NM_SETTING(setting), FALSE);
|
|
Packit Service |
dff8e4 |
if (!hash)
|
|
Packit Service |
dff8e4 |
return 0;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
g_hash_table_iter_init(&iter, hash);
|
|
Packit Service |
dff8e4 |
while (g_hash_table_iter_next(&iter, (gpointer *) &name, (gpointer *) &variant)) {
|
|
Packit Service |
dff8e4 |
NMEthtoolID ethtool_id = nm_ethtool_id_get_by_name(name);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (!nm_ethtool_id_is_feature(ethtool_id))
|
|
Packit Service |
dff8e4 |
continue;
|
|
Packit Service |
dff8e4 |
if (!g_variant_is_of_type(variant, G_VARIANT_TYPE_BOOLEAN))
|
|
Packit Service |
dff8e4 |
continue;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
requested[_NM_ETHTOOL_ID_FEATURE_AS_IDX(ethtool_id)] =
|
|
Packit Service |
dff8e4 |
g_variant_get_boolean(variant) ? NM_OPTION_BOOL_TRUE : NM_OPTION_BOOL_FALSE;
|
|
Packit Service |
dff8e4 |
n_req++;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
return n_req;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_setting_ethtool_get_optnames:
|
|
Packit Service |
dff8e4 |
* @setting: the #NMSettingEthtool instance.
|
|
Packit Service |
dff8e4 |
* @out_length: (out) (optional): return location for the number of keys returned, or %NULL
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* This returns all options names that are set. This includes the feature names
|
|
Packit Service |
dff8e4 |
* like %NM_ETHTOOL_OPTNAME_FEATURE_GRO. See nm_ethtool_optname_is_feature() to
|
|
Packit Service |
dff8e4 |
* check whether the option name is valid for offload features.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Returns: (array zero-terminated=1) (transfer container): list of set option
|
|
Packit Service |
dff8e4 |
* names or %NULL if no options are set. The option names are still owned by
|
|
Packit Service |
dff8e4 |
* @setting and may get invalidated when @setting gets modified.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.20
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Deprecated: 1.26: use nm_setting_option_get_all_names() instead.
|
|
Packit Service |
dff8e4 |
*/
|
|
Packit Service |
dff8e4 |
const char **
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_get_optnames(NMSettingEthtool *setting, guint *out_length)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
const char *const *names;
|
|
Packit Service |
dff8e4 |
guint len = 0;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
g_return_val_if_fail(NM_IS_SETTING_ETHTOOL(setting), NULL);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
names = nm_setting_option_get_all_names(NM_SETTING(setting), &len;;
|
|
Packit Service |
dff8e4 |
NM_SET_OUT(out_length, len);
|
|
Packit Service |
dff8e4 |
return len > 0 ? nm_memdup(names, sizeof(names[0]) * (((gsize) len) + 1u)) : NULL;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
static gboolean
|
|
Packit Service |
dff8e4 |
verify(NMSetting *setting, NMConnection *connection, GError **error)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
const char *const *optnames;
|
|
Packit Service |
dff8e4 |
GVariant *const * variants;
|
|
Packit Service |
dff8e4 |
guint len;
|
|
Packit Service |
dff8e4 |
guint i;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
len = _nm_setting_option_get_all(setting, &optnames, &variants);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
for (i = 0; i < len; i++) {
|
|
Packit Service |
dff8e4 |
const char * optname = optnames[i];
|
|
Packit Service |
dff8e4 |
GVariant * variant = variants[i];
|
|
Packit Service |
dff8e4 |
const GVariantType *variant_type;
|
|
Packit Service |
dff8e4 |
NMEthtoolID ethtool_id;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
ethtool_id = nm_ethtool_id_get_by_name(optname);
|
|
Packit Service |
dff8e4 |
variant_type = get_variant_type_from_ethtool_id(ethtool_id);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (!variant_type) {
|
|
Packit Service |
dff8e4 |
g_set_error_literal(error,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
Packit Service |
dff8e4 |
_("unsupported ethtool setting"));
|
|
Packit Service |
dff8e4 |
g_prefix_error(error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
|
|
Packit Service |
dff8e4 |
return FALSE;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (!g_variant_is_of_type(variant, variant_type)) {
|
|
Packit Service |
dff8e4 |
g_set_error_literal(error,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
Packit Service |
dff8e4 |
_("setting has invalid variant type"));
|
|
Packit Service |
dff8e4 |
g_prefix_error(error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
|
|
Packit Service |
dff8e4 |
return FALSE;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (NM_IN_SET(ethtool_id,
|
|
Packit Service |
dff8e4 |
NM_ETHTOOL_ID_COALESCE_ADAPTIVE_RX,
|
|
Packit Service |
dff8e4 |
NM_ETHTOOL_ID_COALESCE_ADAPTIVE_TX)) {
|
|
Packit Service |
dff8e4 |
if (!NM_IN_SET(g_variant_get_uint32(variant), 0, 1)) {
|
|
Packit Service |
dff8e4 |
g_set_error_literal(error,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
Packit Service |
dff8e4 |
_("coalesce option must be either 0 or 1"));
|
|
Packit Service |
dff8e4 |
g_prefix_error(error, "%s.%s: ", NM_SETTING_ETHTOOL_SETTING_NAME, optname);
|
|
Packit Service |
dff8e4 |
return FALSE;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
return TRUE;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
static const GVariantType *
|
|
Packit Service |
dff8e4 |
get_variant_type(const NMSettInfoSetting *sett_info, const char *name, GError **error)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
const GVariantType *variant_type;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
variant_type = get_variant_type_from_ethtool_id(nm_ethtool_id_get_by_name(name));
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
if (!variant_type) {
|
|
Packit Service |
dff8e4 |
g_set_error(error,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR,
|
|
Packit Service |
dff8e4 |
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
|
Packit Service |
dff8e4 |
_("unknown ethtool option '%s'"),
|
|
Packit Service |
dff8e4 |
name);
|
|
Packit Service |
dff8e4 |
return NULL;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
return variant_type;
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/*****************************************************************************/
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
static void
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_init(NMSettingEthtool *setting)
|
|
Packit Service |
dff8e4 |
{}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
/**
|
|
Packit Service |
dff8e4 |
* nm_setting_ethtool_new:
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Creates a new #NMSettingEthtool object with default values.
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Returns: (transfer full): the new empty #NMSettingEthtool object
|
|
Packit Service |
dff8e4 |
*
|
|
Packit Service |
dff8e4 |
* Since: 1.14
|
|
Packit Service |
dff8e4 |
**/
|
|
Packit Service |
dff8e4 |
NMSetting *
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_new(void)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
return g_object_new(NM_TYPE_SETTING_ETHTOOL, NULL);
|
|
Packit Service |
dff8e4 |
}
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
static void
|
|
Packit Service |
dff8e4 |
nm_setting_ethtool_class_init(NMSettingEthtoolClass *klass)
|
|
Packit Service |
dff8e4 |
{
|
|
Packit Service |
dff8e4 |
NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
setting_class->verify = verify;
|
|
Packit Service |
dff8e4 |
|
|
Packit Service |
dff8e4 |
_nm_setting_class_commit_full(
|
|
Packit Service |
dff8e4 |
setting_class,
|
|
Packit Service |
dff8e4 |
NM_META_SETTING_TYPE_ETHTOOL,
|
|
Packit Service |
dff8e4 |
NM_SETT_INFO_SETT_DETAIL(.gendata_info =
|
|
Packit Service |
dff8e4 |
NM_SETT_INFO_SETT_GENDATA(.get_variant_type =
|
|
Packit Service |
dff8e4 |
get_variant_type, ), ),
|
|
Packit Service |
dff8e4 |
NULL);
|
|
Packit Service |
dff8e4 |
}
|